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}