nx_p384_field_mul_test.nx source
↩ module page · 80 lines · 2106 B
1// nx_p384_field_mul_test.nx -- KAT for P-384 field mul.
2//
3// Verifies:
4// - 0 * x = 0
5// - 1 * x = x
6// - (p-1) * (p-1) = 1 mod p
7// - x * y = y * x (commutativity)
8// - 2 * 2 = 4
9// - sq(x) = x * x
10//
11// expect_exit: 0
12// license_tier: ORIGINAL
13
14import "nx_syscalls.nx"
15import "nx_u384.nx"
16import "nx_p384_field.nx"
17import "nx_p384_field_mul.nx"
18
19func main() -> i64 {
20 let p: *i64 = u384_alloc()
21 p384_field_load_p(p)
22
23 let zero_v: *i64 = u384_alloc()
24 let one_v: *i64 = u384_alloc()
25 u384_one(one_v)
26 let two_v: *i64 = u384_alloc()
27 two_v[0] = 2
28 let four_v: *i64 = u384_alloc()
29 four_v[0] = 4
30
31 // Pick a "random" x = some non-trivial value (use the prime
32 // sub a small constant so it's distinct from anything else).
33 let x: *i64 = u384_alloc()
34 u384_sub_with_borrow(x, p, two_v) // x = p - 2
35
36 let p_minus_1: *i64 = u384_alloc()
37 u384_sub_with_borrow(p_minus_1, p, one_v)
38
39 let r: *i64 = u384_alloc()
40
41 // ---- Test A: 0 * x = 0 ----
42 p384_field_mul(r, zero_v, x)
43 if u384_is_zero(r) != 1 { return 1 }
44 p384_field_mul(r, x, zero_v)
45 if u384_is_zero(r) != 1 { return 2 }
46
47 // ---- Test B: 1 * x = x ----
48 p384_field_mul(r, one_v, x)
49 if u384_eq(r, x) != 1 { return 3 }
50 p384_field_mul(r, x, one_v)
51 if u384_eq(r, x) != 1 { return 4 }
52
53 // ---- Test C: 2 * 2 = 4 ----
54 p384_field_mul(r, two_v, two_v)
55 if u384_eq(r, four_v) != 1 { return 5 }
56
57 // ---- Test D: (p-1) * (p-1) = 1 mod p ----
58 // (-1) * (-1) = 1
59 p384_field_mul(r, p_minus_1, p_minus_1)
60 if u384_eq(r, one_v) != 1 { return 6 }
61
62 // ---- Test E: commutativity x * y = y * x ----
63 let y: *i64 = u384_alloc()
64 y[0] = 0x12345678
65 y[1] = 0x9ABCDEF0
66 y[5] = 0xCAFEBABE
67 let r1: *i64 = u384_alloc()
68 let r2: *i64 = u384_alloc()
69 p384_field_mul(r1, x, y)
70 p384_field_mul(r2, y, x)
71 if u384_eq(r1, r2) != 1 { return 7 }
72
73 // ---- Test F: sq(x) = x * x ----
74 let r3: *i64 = u384_alloc()
75 p384_field_sq(r3, x)
76 p384_field_mul(r2, x, x)
77 if u384_eq(r3, r2) != 1 { return 8 }
78
79 return 0
80}