code wiki / (root) / nx_rsa4096_mod_test.nx

nx_rsa4096_mod_test.nx source

↩ module page · 131 lines · 3826 B

1// nx_rsa4096_mod_test.nx -- KAT for rsa4096_mod + rsa4096_mod_exp. 2// 3// Small-value KAT: numbers fit in low limb but exercise the full 4// 8191-bit reduction loop (every iteration runs whether values are 5// large or small). Correctness is hand-verifiable. 6// 7// expect_exit: 0 8// license_tier: ORIGINAL 9 10import "nx_syscalls.nx" 11import "nx_u4096.nx" 12import "nx_u4096_mul.nx" 13import "nx_rsa4096_mod.nx" 14import "nx_rsa4096_mod_exp.nx" 15 16func main() -> i64 { 17 let dividend: *i64 = u4096_wide_alloc() 18 let n: *i64 = u4096_alloc() 19 let out: *i64 = u4096_alloc() 20 21 // ---- T1: 100 mod 7 = 2 ---- 22 var i: i64 = 0 23 while i < NX_U4096_WIDE_LIMBS { 24 dividend[i] = 0 25 i = i + 1 26 } 27 dividend[0] = 100 28 u4096_zero(n); n[0] = 7 29 rsa4096_mod(out, dividend, n) 30 if out[0] != 2 { return 1 } 31 i = 1 32 while i < NX_U4096_LIMBS { 33 if out[i] != 0 { return 2 } 34 i = i + 1 35 } 36 37 // ---- T2: 0 mod 7 = 0 ---- 38 i = 0 39 while i < NX_U4096_WIDE_LIMBS { 40 dividend[i] = 0 41 i = i + 1 42 } 43 u4096_zero(n); n[0] = 7 44 rsa4096_mod(out, dividend, n) 45 if u4096_is_zero(out) != 1 { return 3 } 46 47 // ---- T3: 99 mod 99 = 0 ---- 48 i = 0 49 while i < NX_U4096_WIDE_LIMBS { 50 dividend[i] = 0 51 i = i + 1 52 } 53 dividend[0] = 99 54 u4096_zero(n); n[0] = 99 55 rsa4096_mod(out, dividend, n) 56 if u4096_is_zero(out) != 1 { return 4 } 57 58 // ---- T4: 98 mod 99 = 98 ---- 59 i = 0 60 while i < NX_U4096_WIDE_LIMBS { 61 dividend[i] = 0 62 i = i + 1 63 } 64 dividend[0] = 98 65 u4096_zero(n); n[0] = 99 66 rsa4096_mod(out, dividend, n) 67 if out[0] != 98 { return 5 } 68 69 // ---- T5: rsa4096_mod_exp -- 4^3 mod 37 = 64 mod 37 = 27 ---- 70 let s: *i64 = u4096_alloc() 71 u4096_zero(s); s[0] = 4 72 u4096_zero(n); n[0] = 37 73 let rv: i64 = rsa4096_mod_exp(out, s, 3, n) 74 if rv != NX_RSA4096_MOD_EXP_OK { return 10 } 75 if out[0] != 27 { return 11 } 76 i = 1 77 while i < NX_U4096_LIMBS { 78 if out[i] != 0 { return 12 } 79 i = i + 1 80 } 81 82 // ---- T6: rsa4096_mod_exp -- 2^10 mod 37 = 1024 mod 37 ---- 83 // 1024 / 37 = 27 (27*37 = 999), 1024 - 999 = 25 84 u4096_zero(s); s[0] = 2 85 u4096_zero(n); n[0] = 37 86 let rv2: i64 = rsa4096_mod_exp(out, s, 10, n) 87 if rv2 != NX_RSA4096_MOD_EXP_OK { return 20 } 88 if out[0] != 25 { return 21 } 89 90 // ---- T7: rsa4096_mod_exp -- 5^4 mod 23 = 625 mod 23 ---- 91 // 625 / 23 = 27 (27*23 = 621), 625 - 621 = 4 92 u4096_zero(s); s[0] = 5 93 u4096_zero(n); n[0] = 23 94 let rv3: i64 = rsa4096_mod_exp(out, s, 4, n) 95 if rv3 != NX_RSA4096_MOD_EXP_OK { return 30 } 96 if out[0] != 4 { return 31 } 97 98 // ---- T8: rsa4096_mod_exp -- s^0 = 1 (s < n required) ---- 99 u4096_zero(s); s[0] = 5 100 u4096_zero(n); n[0] = 11 101 let rv4: i64 = rsa4096_mod_exp(out, s, 0, n) 102 if rv4 != NX_RSA4096_MOD_EXP_OK { return 40 } 103 if out[0] != 1 { return 41 } 104 i = 1 105 while i < NX_U4096_LIMBS { 106 if out[i] != 0 { return 42 } 107 i = i + 1 108 } 109 110 // ---- T9: range check -- s >= n returns S_OUT_OF_RANGE ---- 111 u4096_zero(s); s[0] = 100 112 u4096_zero(n); n[0] = 7 113 let rv5: i64 = rsa4096_mod_exp(out, s, 3, n) 114 if rv5 != NX_RSA4096_MOD_EXP_S_OUT_OF_RANGE { return 50 } 115 116 // ---- T10: rsa4096_mod_exp with e = 65537 (Web PKI exponent) ---- 117 // 2^65537 mod 7: ord_7(2) = 3 (since 2^3=8≡1 mod 7). 118 // 65537 mod 3 = 21845*3 + 2 = 65535 + 2; so 65537 mod 3 = 2. 119 // 2^65537 ≡ 2^2 = 4 mod 7. 120 u4096_zero(s); s[0] = 2 121 u4096_zero(n); n[0] = 7 122 let rv6: i64 = rsa4096_mod_exp(out, s, 65537, n) 123 if rv6 != NX_RSA4096_MOD_EXP_OK { return 60 } 124 if out[0] != 4 { return 61 } 125 126 // "PASS\n" 127 let ok: *u8 = sys_mmap(8) 128 ok[0]=80; ok[1]=65; ok[2]=83; ok[3]=83; ok[4]=10 129 sys_write(1, ok, 5) 130 return 0 131}