code wiki / (root) / nx_p384_modn_test.nx

nx_p384_modn_test.nx source

↩ module page · 68 lines · 1947 B

1// nx_p384_modn_test.nx -- KAT for P-384 scalar arithmetic mod n. 2// 3// expect_exit: 0 4// license_tier: ORIGINAL 5 6import "nx_syscalls.nx" 7import "nx_u384.nx" 8import "nx_p384_modn.nx" 9 10func main() -> i64 { 11 let n: *i64 = u384_alloc() 12 p384_modn_load_n(n) 13 14 // Verify n limbs byte-exact against FIPS 186-5 §D.1.2.4. 15 if n[0] != 0xCCC52973 { return 1 } 16 if n[1] != 0xECEC196A { return 2 } 17 if n[2] != 0x48B0A77A { return 3 } 18 if n[3] != 0x581A0DB2 { return 4 } 19 if n[4] != 0xF4372DDF { return 5 } 20 if n[5] != 0xC7634D81 { return 6 } 21 if n[6] != 0xFFFFFFFF { return 7 } 22 if n[11] != 0xFFFFFFFF { return 8 } 23 24 let one_v: *i64 = u384_alloc() 25 u384_one(one_v) 26 let zero_v: *i64 = u384_alloc() 27 let n_minus_1: *i64 = u384_alloc() 28 u384_sub_with_borrow(n_minus_1, n, one_v) 29 30 let r: *i64 = u384_alloc() 31 32 // ---- add: 1 + (n-1) = 0 mod n ---- 33 p384_modn_add(r, one_v, n_minus_1) 34 if u384_is_zero(r) != 1 { return 10 } 35 36 // ---- sub: 0 - 1 = n-1 ---- 37 p384_modn_sub(r, zero_v, one_v) 38 if u384_eq(r, n_minus_1) != 1 { return 11 } 39 40 // ---- neg: -0 = 0, -1 = n-1 ---- 41 p384_modn_neg(r, zero_v) 42 if u384_is_zero(r) != 1 { return 12 } 43 p384_modn_neg(r, one_v) 44 if u384_eq(r, n_minus_1) != 1 { return 13 } 45 46 // ---- mul: 1 * x = x; (n-1) * (n-1) = 1 mod n ---- 47 let x: *i64 = u384_alloc() 48 x[0] = 0x12345678 49 x[1] = 0x9ABCDEF0 50 x[6] = 0xCAFEBABE 51 p384_modn_mul(r, one_v, x) 52 if u384_eq(r, x) != 1 { return 20 } 53 p384_modn_mul(r, n_minus_1, n_minus_1) 54 if u384_eq(r, one_v) != 1 { return 21 } 55 56 // ---- inv: x * x^(-1) = 1 mod n ---- 57 let inv_x: *i64 = u384_alloc() 58 p384_modn_inv(inv_x, x) 59 let check: *i64 = u384_alloc() 60 p384_modn_mul(check, x, inv_x) 61 if u384_eq(check, one_v) != 1 { return 22 } 62 63 // ---- reduce: n reduces to 0 ---- 64 p384_modn_reduce(r, n) 65 if u384_is_zero(r) != 1 { return 30 } 66 67 return 0 68}