nx_rsa_pkcs1_v1_5_sha256_real_test.nx source
↩ module page · 100 lines · 3057 B
1// nx_rsa_pkcs1_v1_5_sha256_real_test.nx -- KAT for RSA-PKCS#1 v1.5
2// SHA-256 verify against the REAL cert4 (SSL.com TLS ECC Root CA
3// 2022) signed by Comodo AAA Certificate Services (RSA-2048, e=65537).
4//
5// Inputs (raw binary fixtures dropped by dump_rsa_fixtures.py):
6// /tmp/comodo_aaa_n.bin 256-byte BE modulus
7// /tmp/cert4_sig.bin 256-byte BE signature
8// /tmp/cert4_tbs.bin 810-byte TBS
9//
10// expect_exit: 0 (verifies successfully).
11// license_tier: ORIGINAL
12
13import "nx_syscalls.nx"
14import "nx_u2048.nx"
15import "nx_rsa_pkcs1_v1_5_sha256.nx"
16
17func read_to(path: *u8, out_buf: *u8, max: i64) -> i64 {
18 let len_p: *i64 = sys_mmap(16) as *i64
19 let p: *u8 = sys_read_file(path, len_p)
20 let n: i64 = *len_p
21 if n <= 0 { return 0 - 1 }
22 if n > max { return 0 - 2 }
23 var i: i64 = 0
24 while i < n { out_buf[i] = p[i]; i = i + 1 }
25 return n
26}
27
28func mkpath(out: *u8, c: i64) -> i64 {
29 // /tmp/<c>
30 // c is a label index: 1 -> comodo_aaa_n.bin, 2 -> cert4_sig.bin, 3 -> cert4_tbs.bin
31 if c == 1 {
32 let s: *u8 = "/tmp/comodo_aaa_n.bin\x00"
33 var i: i64 = 0
34 while i < 22 { out[i] = s[i]; i = i + 1 }
35 return 21
36 }
37 if c == 2 {
38 let s: *u8 = "/tmp/cert4_sig.bin\x00"
39 var i: i64 = 0
40 while i < 19 { out[i] = s[i]; i = i + 1 }
41 return 18
42 }
43 // c == 3
44 let s: *u8 = "/tmp/cert4_tbs.bin\x00"
45 var i: i64 = 0
46 while i < 19 { out[i] = s[i]; i = i + 1 }
47 return 18
48}
49
50func dump_dec(l0: i64, l1: i64, v: i64) -> i64 {
51 let lab: *u8 = sys_mmap(8)
52 lab[0]=l0 as u8; lab[1]=l1 as u8; lab[2]=0x3D
53 sys_write(2, lab, 3)
54 var av: i64 = v
55 if av < 0 {
56 let neg: *u8 = sys_mmap(8); neg[0]=0x2D; sys_write(2, neg, 1)
57 av = 0 - av
58 }
59 let buf: *u8 = sys_mmap(16)
60 var pos: i64 = 0
61 if av == 0 { buf[0]=0x30; pos = 1 }
62 var x: i64 = av
63 while x > 0 {
64 buf[pos] = (0x30 + (x % 10)) as u8
65 x = x / 10; pos = pos + 1
66 }
67 let out: *u8 = sys_mmap(16); var oi: i64 = 0
68 while oi < pos { out[oi] = buf[pos - 1 - oi]; oi = oi + 1 }
69 sys_write(2, out, pos)
70 let nl: *u8 = sys_mmap(8); nl[0]=0x0A; sys_write(2, nl, 1)
71 return 0
72}
73
74func main() -> i64 {
75 let p1: *u8 = sys_mmap(64); mkpath(p1, 1)
76 let p2: *u8 = sys_mmap(64); mkpath(p2, 2)
77 let p3: *u8 = sys_mmap(64); mkpath(p3, 3)
78
79 let n_bytes: *u8 = sys_mmap(256)
80 let nn: i64 = read_to(p1, n_bytes, 256)
81 if nn != 256 { return 1 }
82
83 let sig: *u8 = sys_mmap(256)
84 let ns: i64 = read_to(p2, sig, 256)
85 if ns != 256 { return 2 }
86
87 let tbs: *u8 = sys_mmap(2048)
88 let nt: i64 = read_to(p3, tbs, 2048)
89 if nt <= 0 { return 3 }
90 dump_dec(0x54, 0x4C, nt) // "TL=" tbs len
91
92 let n_int: *i64 = u2048_alloc()
93 u2048_load_be(n_int, n_bytes)
94
95 let v: i64 = rsa_pkcs1_v1_5_sha256_verify(tbs, nt, sig, n_int, 65537)
96 dump_dec(0x56, 0x52, v) // "VR=" verdict
97
98 if v != NX_RSA_PKCS1_V15_OK { return 100 + v }
99 return 0
100}