code wiki / (root) / nx_p384_field_mul_test.nx

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}