code wiki / (root) / nx_rsa_pkcs1_v1_5_sha256_real_test.nx

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}