nx_p384_field_inv_test.nx source
↩ module page · 54 lines · 1501 B
1// nx_p384_field_inv_test.nx -- KAT for P-384 field inverse.
2//
3// Verifies via the defining property: a * a^(-1) = 1 mod p.
4//
5// expect_exit: 0
6// license_tier: ORIGINAL
7
8import "nx_syscalls.nx"
9import "nx_u384.nx"
10import "nx_p384_field.nx"
11import "nx_p384_field_mul.nx"
12import "nx_p384_field_inv.nx"
13
14func main() -> i64 {
15 let p: *i64 = u384_alloc()
16 p384_field_load_p(p)
17
18 let one_v: *i64 = u384_alloc()
19 u384_one(one_v)
20 let p_minus_1: *i64 = u384_alloc()
21 u384_sub_with_borrow(p_minus_1, p, one_v)
22
23 // ---- Test A: 1^-1 = 1 ----
24 let r: *i64 = u384_alloc()
25 p384_field_inv(r, one_v)
26 if u384_eq(r, one_v) != 1 { return 1 }
27
28 // ---- Test B: (p-1)^-1 = p-1 (since (p-1)^2 = 1 mod p, so
29 // (p-1) is its own inverse) ----
30 p384_field_inv(r, p_minus_1)
31 if u384_eq(r, p_minus_1) != 1 { return 2 }
32
33 // ---- Test C: 2^-1 mod p, then 2 * 2^-1 = 1 ----
34 let two_v: *i64 = u384_alloc()
35 two_v[0] = 2
36 let inv2: *i64 = u384_alloc()
37 p384_field_inv(inv2, two_v)
38 let check: *i64 = u384_alloc()
39 p384_field_mul(check, two_v, inv2)
40 if u384_eq(check, one_v) != 1 { return 3 }
41
42 // ---- Test D: pick an arbitrary x, verify x * x^-1 = 1 ----
43 let x: *i64 = u384_alloc()
44 x[0] = 0x12345678
45 x[1] = 0x9ABCDEF0
46 x[3] = 0xCAFEBABE
47 x[7] = 0xDEADBEEF
48 let inv_x: *i64 = u384_alloc()
49 p384_field_inv(inv_x, x)
50 p384_field_mul(check, x, inv_x)
51 if u384_eq(check, one_v) != 1 { return 4 }
52
53 return 0
54}