nx_p384_modn_test.nx source
↩ module page · 68 lines · 1947 B
1// nx_p384_modn_test.nx -- KAT for P-384 scalar arithmetic mod n.
2//
3// expect_exit: 0
4// license_tier: ORIGINAL
5
6import "nx_syscalls.nx"
7import "nx_u384.nx"
8import "nx_p384_modn.nx"
9
10func main() -> i64 {
11 let n: *i64 = u384_alloc()
12 p384_modn_load_n(n)
13
14 // Verify n limbs byte-exact against FIPS 186-5 §D.1.2.4.
15 if n[0] != 0xCCC52973 { return 1 }
16 if n[1] != 0xECEC196A { return 2 }
17 if n[2] != 0x48B0A77A { return 3 }
18 if n[3] != 0x581A0DB2 { return 4 }
19 if n[4] != 0xF4372DDF { return 5 }
20 if n[5] != 0xC7634D81 { return 6 }
21 if n[6] != 0xFFFFFFFF { return 7 }
22 if n[11] != 0xFFFFFFFF { return 8 }
23
24 let one_v: *i64 = u384_alloc()
25 u384_one(one_v)
26 let zero_v: *i64 = u384_alloc()
27 let n_minus_1: *i64 = u384_alloc()
28 u384_sub_with_borrow(n_minus_1, n, one_v)
29
30 let r: *i64 = u384_alloc()
31
32 // ---- add: 1 + (n-1) = 0 mod n ----
33 p384_modn_add(r, one_v, n_minus_1)
34 if u384_is_zero(r) != 1 { return 10 }
35
36 // ---- sub: 0 - 1 = n-1 ----
37 p384_modn_sub(r, zero_v, one_v)
38 if u384_eq(r, n_minus_1) != 1 { return 11 }
39
40 // ---- neg: -0 = 0, -1 = n-1 ----
41 p384_modn_neg(r, zero_v)
42 if u384_is_zero(r) != 1 { return 12 }
43 p384_modn_neg(r, one_v)
44 if u384_eq(r, n_minus_1) != 1 { return 13 }
45
46 // ---- mul: 1 * x = x; (n-1) * (n-1) = 1 mod n ----
47 let x: *i64 = u384_alloc()
48 x[0] = 0x12345678
49 x[1] = 0x9ABCDEF0
50 x[6] = 0xCAFEBABE
51 p384_modn_mul(r, one_v, x)
52 if u384_eq(r, x) != 1 { return 20 }
53 p384_modn_mul(r, n_minus_1, n_minus_1)
54 if u384_eq(r, one_v) != 1 { return 21 }
55
56 // ---- inv: x * x^(-1) = 1 mod n ----
57 let inv_x: *i64 = u384_alloc()
58 p384_modn_inv(inv_x, x)
59 let check: *i64 = u384_alloc()
60 p384_modn_mul(check, x, inv_x)
61 if u384_eq(check, one_v) != 1 { return 22 }
62
63 // ---- reduce: n reduces to 0 ----
64 p384_modn_reduce(r, n)
65 if u384_is_zero(r) != 1 { return 30 }
66
67 return 0
68}