nx_p384_field_test.nx source
↩ module page · 77 lines · 2128 B
1// nx_p384_field_test.nx -- KAT for P-384 field add/sub/neg.
2//
3// Verifies:
4// - p loads correctly (12 limbs as documented)
5// - 0 + 0 = 0
6// - 1 + (p - 1) = 0 (mod p)
7// - (p - 1) + (p - 1) = p - 2 (mod p)
8// - (p - 1) - 1 = p - 2
9// - 0 - 1 = p - 1
10// - -0 = 0
11// - -1 = p - 1
12//
13// expect_exit: 0
14// license_tier: ORIGINAL
15
16import "nx_syscalls.nx"
17import "nx_u384.nx"
18import "nx_p384_field.nx"
19
20func main() -> i64 {
21 let p: *i64 = u384_alloc()
22 p384_field_load_p(p)
23
24 // Verify each limb of p
25 if p[0] != 0xFFFFFFFF { return 1 }
26 if p[1] != 0 { return 2 }
27 if p[2] != 0 { return 3 }
28 if p[3] != 0xFFFFFFFF { return 4 }
29 if p[4] != 0xFFFFFFFE { return 5 }
30 if p[5] != 0xFFFFFFFF { return 6 }
31 if p[11] != 0xFFFFFFFF { return 7 }
32
33 let one_v: *i64 = u384_alloc()
34 u384_one(one_v)
35 let zero_v: *i64 = u384_alloc()
36 let p_minus_1: *i64 = u384_alloc()
37 u384_sub_with_borrow(p_minus_1, p, one_v)
38
39 // ---- Test: 0 + 0 = 0 ----
40 let r: *i64 = u384_alloc()
41 p384_field_add(r, zero_v, zero_v)
42 if u384_is_zero(r) != 1 { return 10 }
43
44 // ---- Test: 1 + (p-1) = 0 (mod p) ----
45 p384_field_add(r, one_v, p_minus_1)
46 if u384_is_zero(r) != 1 { return 11 }
47
48 // ---- Test: (p-1) + (p-1) = p - 2 (mod p) ----
49 let p_minus_2: *i64 = u384_alloc()
50 let two: *i64 = u384_alloc()
51 two[0] = 2
52 u384_sub_with_borrow(p_minus_2, p, two)
53 p384_field_add(r, p_minus_1, p_minus_1)
54 if u384_eq(r, p_minus_2) != 1 { return 12 }
55
56 // ---- Test: (p-1) - 1 = p - 2 ----
57 p384_field_sub(r, p_minus_1, one_v)
58 if u384_eq(r, p_minus_2) != 1 { return 20 }
59
60 // ---- Test: 0 - 1 = p - 1 ----
61 p384_field_sub(r, zero_v, one_v)
62 if u384_eq(r, p_minus_1) != 1 { return 21 }
63
64 // ---- Test: -0 = 0 ----
65 p384_field_neg(r, zero_v)
66 if u384_is_zero(r) != 1 { return 30 }
67
68 // ---- Test: -1 = p - 1 ----
69 p384_field_neg(r, one_v)
70 if u384_eq(r, p_minus_1) != 1 { return 31 }
71
72 // ---- Test: -(p-1) = 1 ----
73 p384_field_neg(r, p_minus_1)
74 if u384_eq(r, one_v) != 1 { return 32 }
75
76 return 0
77}