code wiki / (root) / nx_p384_field_inv_test.nx

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}