nx_ml_kem_768_wasm.nx
buildroot/runtime/nx_ml_kem_768_wasm.nx
about
nx_ml_kem_768_wasm.nx -- Provides cryptographic operations for secure key exchange and messaging in the Nishi sovereign ecosystem.
dependencies 0 imports · 3 importers
imports: none
imported by: nx_mlkem_kat_gate.nxnx_mlkem_verify.nxnx_x25519mlkem768.nx
structs
| none |
consts
| 2 | const KYBER_MAGIC_32768: i64 = 32768 |
| 3 | const KYBER_MAGIC_65536: i64 = 65536 |
| 4 | const KYBER_MAGIC_20159: i64 = 20159 |
| 5 | const KYBER_MAGIC_33554432: i64 = 33554432 |
| 6 | const KYBER_MAGIC_1044: i64 = 1044 |
| 7 | const KYBER_MAGIC_1517: i64 = 1517 |
| 8 | const KYBER_MAGIC_1493: i64 = 1493 |
| 9 | const KYBER_MAGIC_1422: i64 = 1422 |
| 10 | const KYBER_MAGIC_1577: i64 = 1577 |
| 11 | const KYBER_MAGIC_1202: i64 = 1202 |
| 12 | const KYBER_MAGIC_1474: i64 = 1474 |
| 13 | const KYBER_MAGIC_1468: i64 = 1468 |
| 14 | const KYBER_MAGIC_1325: i64 = 1325 |
| 15 | const KYBER_MAGIC_1458: i64 = 1458 |
| 16 | const KYBER_MAGIC_1602: i64 = 1602 |
| 17 | const KYBER_MAGIC_1542: i64 = 1542 |
| 18 | const KYBER_MAGIC_1571: i64 = 1571 |
| 19 | const KYBER_MAGIC_1223: i64 = 1223 |
| 20 | const KYBER_MAGIC_1293: i64 = 1293 |
| 21 | const KYBER_MAGIC_1491: i64 = 1491 |
| 22 | const KYBER_MAGIC_1544: i64 = 1544 |
| 23 | const KYBER_MAGIC_1618: i64 = 1618 |
| 24 | const KYBER_MAGIC_1162: i64 = 1162 |
| 25 | const KYBER_MAGIC_1469: i64 = 1469 |
| 26 | const KYBER_MAGIC_1421: i64 = 1421 |
| 27 | const KYBER_MAGIC_1508: i64 = 1508 |
| 28 | const KYBER_MAGIC_1065: i64 = 1065 |
| 29 | const KYBER_MAGIC_1275: i64 = 1275 |
| 30 | const KYBER_MAGIC_1103: i64 = 1103 |
| 31 | const KYBER_MAGIC_1251: i64 = 1251 |
| 32 | const KYBER_MAGIC_1550: i64 = 1550 |
| 33 | const KYBER_MAGIC_1574: i64 = 1574 |
| 34 | const KYBER_MAGIC_1653: i64 = 1653 |
| 35 | const KYBER_MAGIC_1159: i64 = 1159 |
| 36 | const KYBER_MAGIC_1483: i64 = 1483 |
| 37 | const KYBER_MAGIC_1119: i64 = 1119 |
| 38 | const KYBER_MAGIC_1590: i64 = 1590 |
| 39 | const KYBER_MAGIC_1097: i64 = 1097 |
| 40 | const KYBER_MAGIC_1322: i64 = 1322 |
| 41 | const KYBER_MAGIC_1285: i64 = 1285 |
| 42 | const KYBER_MAGIC_1465: i64 = 1465 |
| 43 | const KYBER_MAGIC_1215: i64 = 1215 |
| 44 | const KYBER_MAGIC_1218: i64 = 1218 |
| 45 | const KYBER_MAGIC_1335: i64 = 1335 |
| 46 | const KYBER_MAGIC_1187: i64 = 1187 |
| 47 | const KYBER_MAGIC_1659: i64 = 1659 |
| 48 | const KYBER_MAGIC_1185: i64 = 1185 |
| 49 | const KYBER_MAGIC_1530: i64 = 1530 |
| 50 | const KYBER_MAGIC_1278: i64 = 1278 |
| 51 | const KYBER_MAGIC_1510: i64 = 1510 |
| 52 | const KYBER_MAGIC_1460: i64 = 1460 |
| 53 | const KYBER_MAGIC_1522: i64 = 1522 |
| 54 | const KYBER_MAGIC_1628: i64 = 1628 |
| 55 | const KYBER_MAGIC_1441: i64 = 1441 |
| 56 | const KYBER_MAGIC_1535: i64 = 1535 |
| 57 | const KYBER_MAGIC_1536: i64 = 1536 |
| 58 | const KYBER_MAGIC_1567: i64 = 1567 |
| 59 | const KYBER_MAGIC_1568: i64 = 1568 |
| 60 | const KYBER_MAGIC_1599: i64 = 1599 |
| 61 | const KYBER_MAGIC_1600: i64 = 1600 |
| 62 | const KYBER_MAGIC_1663: i64 = 1663 |
| 63 | const KYBER_MAGIC_1664: i64 = 1664 |
| 64 | const KYBER_MAGIC_2175: i64 = 2175 |
| 65 | const KYBER_MAGIC_2176: i64 = 2176 |
| 66 | const KYBER_MAGIC_3711: i64 = 3711 |
| 67 | const KYBER_MAGIC_3712: i64 = 3712 |
| 68 | const KYBER_MAGIC_5247: i64 = 5247 |
| 69 | const KYBER_MAGIC_5248: i64 = 5248 |
| 70 | const KYBER_MAGIC_6783: i64 = 6783 |
| 71 | const KYBER_MAGIC_6784: i64 = 6784 |
| 72 | const KYBER_MAGIC_7295: i64 = 7295 |
| 73 | const KYBER_MAGIC_7296: i64 = 7296 |
| 74 | const KYBER_MAGIC_8831: i64 = 8831 |
| 75 | const KYBER_MAGIC_8832: i64 = 8832 |
| 76 | const KYBER_MAGIC_10367: i64 = 10367 |
| 77 | const KYBER_MAGIC_10368: i64 = 10368 |
| 78 | const KYBER_MAGIC_10879: i64 = 10879 |
| 79 | const KYBER_MAGIC_10880: i64 = 10880 |
| 80 | const KYBER_MAGIC_11391: i64 = 11391 |
| 81 | const KYBER_MAGIC_11392: i64 = 11392 |
| 82 | const KYBER_MAGIC_11903: i64 = 11903 |
| 83 | const KYBER_MAGIC_11904: i64 = 11904 |
| 84 | const KYBER_MAGIC_13439: i64 = 13439 |
| 85 | const KYBER_MAGIC_13440: i64 = 13440 |
| 86 | const KYBER_MAGIC_14975: i64 = 14975 |
| 87 | const KYBER_MAGIC_14976: i64 = 14976 |
| 88 | const KYBER_MAGIC_16511: i64 = 16511 |
| 89 | const KYBER_MAGIC_16512: i64 = 16512 |
| 90 | const KYBER_MAGIC_18047: i64 = 18047 |
| 91 | const KYBER_MAGIC_18048: i64 = 18048 |
| 92 | const KYBER_MAGIC_18559: i64 = 18559 |
| 93 | const KYBER_MAGIC_18560: i64 = 18560 |
| 94 | const KYBER_MAGIC_19071: i64 = 19071 |
| 95 | const KYBER_MAGIC_19072: i64 = 19072 |
| 96 | const KYBER_MAGIC_1152: i64 = 1152 |
| 97 | const KYBER_MAGIC_1184: i64 = 1184 |
| 98 | const KYBER_MAGIC_20224: i64 = 20224 |
| 99 | const KYBER_MAGIC_20096: i64 = 20096 |
| 100 | const KYBER_MAGIC_20160: i64 = 20160 |
| 101 | const KYBER_MAGIC_19103: i64 = 19103 |
| 102 | const KYBER_MAGIC_19104: i64 = 19104 |
| 103 | const KYBER_MAGIC_20191: i64 = 20191 |
| 104 | const KYBER_MAGIC_20192: i64 = 20192 |
| 105 | const KYBER_MAGIC_20255: i64 = 20255 |
| 106 | const KYBER_MAGIC_20256: i64 = 20256 |
| 107 | const KYBER_MAGIC_20319: i64 = 20319 |
| 108 | const KYBER_MAGIC_20320: i64 = 20320 |
| 109 | const KYBER_MAGIC_20351: i64 = 20351 |
| 110 | const KYBER_MAGIC_22000: i64 = 22000 |
| 111 | const KYBER_MAGIC_23119: i64 = 23119 |
| 112 | const KYBER_MAGIC_28000: i64 = 28000 |
| 113 | const KYBER_MAGIC_30000: i64 = 30000 |
| 114 | const KYBER_MAGIC_2400: i64 = 2400 |
| 115 | const KYBER_MAGIC_32400: i64 = 32400 |
| 116 | const KYBER_MAGIC_33000: i64 = 33000 |
| 117 | const KYBER_MAGIC_1088: i64 = 1088 |
| 118 | const KYBER_MAGIC_34088: i64 = 34088 |
| 119 | const KYBER_MAGIC_34200: i64 = 34200 |
| 120 | const KYBER_MAGIC_34300: i64 = 34300 |
| 173 | const KYBER_Q: i64 = 3329 |
| 174 | const KYBER_QINV: i64 = 62209 |
| 175 | const KYBER_N: i64 = 256 |
| 176 | const KYBER_K: i64 = 3 |
| 177 | const KYBER_ETA: i64 = 2 |
| 178 | const KYBER_F: i64 = 1353 // R^2 mod q (for tomont) |
| 179 | const KYBER_HALF: i64 = 1665 // (q+1)/2 (for msg codec) |
| 181 | const MLKEM_PK_BYTES: i64 = 1184 |
| 182 | const MLKEM_SK_BYTES: i64 = 2400 |
| 183 | const MLKEM_CT_BYTES: i64 = 1088 |
| 184 | const MLKEM_SS_BYTES: i64 = 32 |
| 187 | const POLY_BUF: i64 = 512 |
| 188 | const POLY_BYTES_12: i64 = 384 // 12-bit canonical encode |
| 189 | const POLY_COMPR_U: i64 = 320 // d_u = 10 |
| 190 | const POLY_COMPR_V: i64 = 128 // d_v = 4 |
functions
| 196 | func _u16_load_le(p: *u8, i: i64) -> i64 { |
| 204 | func _u16_store_le(p: *u8, i: i64, v: i64) -> i64 { |
| 212 | func _canon_q(v: i64) -> i64 { |
| 219 | func _rotl64(x: i64, n: i64) -> i64 {
called by 1: _keccak_f1600 |
| 231 | func _lane_load(p: *u8) -> i64 {
called by 1: _keccak_f1600 |
| 244 | func _lane_store(p: *u8, v: i64) -> i64 {
called by 1: _keccak_f1600 |
| 256 | func _keccak_rc(i: i64) -> i64 {
called by 1: _keccak_f1600 |
| 272 | func _rho_off(lane_idx: i64) -> i64 {
called by 1: _keccak_f1600 |
| 289 | func _keccak_f1600(state_ptr: *u8) -> i64 { |
| 373 | func _sponge_one_shot(msg: *u8, msg_len: i64, |
| 416 | func _sha3_256(msg: *u8, msg_len: i64, state: *u8, out: *u8) -> i64 { |
| 419 | func _sha3_512(msg: *u8, msg_len: i64, state: *u8, out: *u8) -> i64 { |
| 422 | func _shake128(msg: *u8, msg_len: i64, state: *u8, out: *u8, out_len: i64) -> i64 { |
| 425 | func _shake256(msg: *u8, msg_len: i64, state: *u8, out: *u8, out_len: i64) -> i64 { |
| 433 | func _mont(a: i64) -> i64 { |
| 439 | func _barrett(a: i64) -> i64 {
called by 1: _invntt |
| 445 | func _fqmul(a: i64, b: i64) -> i64 { return _mont(a * b) } |
| 451 | func _zeta(i: i64) -> i64 { |
| 487 | func _ntt(poly: *u8) -> i64 { |
| 511 | func _invntt(poly: *u8) -> i64 { |
| 546 | func _basemul_pair_acc(acc: *u8, off: i64, a: *u8, b: *u8, zeta: i64) -> i64 { |
| 558 | func _poly_basemul_acc(acc: *u8, a: *u8, b: *u8) -> i64 { |
| 569 | func _poly_zero(p: *u8) -> i64 { |
| 575 | func _poly_tomont(poly: *u8) -> i64 { |
| 585 | func _poly_add(out: *u8, a: *u8, b: *u8) -> i64 { |
| 594 | func _poly_sub(out: *u8, a: *u8, b: *u8) -> i64 { |
| 607 | func _compress10_one(v: i64) -> i64 { |
| 611 | func _decompress10_one(x: i64) -> i64 { return (KYBER_Q * x + 512) >> 10 }
called by 1: _poly_decompress10 |
| 613 | func _poly_compress10(bytes_out: *u8, poly: *u8) -> i64 { |
| 631 | func _poly_decompress10(poly: *u8, bytes_in: *u8) -> i64 { |
| 653 | func _compress4_one(v: i64) -> i64 { |
| 657 | func _decompress4_one(x: i64) -> i64 { return (KYBER_Q * x + 8) >> 4 }
called by 1: _poly_decompress4 |
| 659 | func _poly_compress4(bytes_out: *u8, poly: *u8) -> i64 { |
| 670 | func _poly_decompress4(poly: *u8, bytes_in: *u8) -> i64 { |
| 681 | func _poly_tobytes12(bytes_out: *u8, poly: *u8) -> i64 { |
| 695 | func _poly_frombytes12(poly: *u8, bytes_in: *u8) -> i64 { |
| 715 | func _poly_cbd_eta2(out: *u8, buf: *u8) -> i64 { |
| 733 | func _sample_ntt(poly: *u8, buf: *u8, buf_len: i64) -> i64 { |
| 758 | func _msg_to_poly(poly: *u8, msg: *u8) -> i64 { |
| 773 | func _msg_from_poly(msg: *u8, poly: *u8) -> i64 { |
| 798 | func _gen_matrix_entry(poly: *u8, rho: *u8, x: i64, y: i64, |
| 819 | func _gen_noise_eta2(poly: *u8, sigma: *u8, nonce: i64, |
| 831 | func _cmov(out: *u8, src1: *u8, len: i64, mask: i64) -> i64 { |
| 887 | func _kpke_keygen(d_seed_32: *u8, scratch: *u8, ek_out: *u8, dk_pke_out: *u8) -> i64 {
called by 1: nx_mlkem_keygen calls 9: _sha3_512_gen_noise_eta2_ntt_poly_zero_gen_matrix_entry_poly_basemul_acc+3 |
| 967 | func _kpke_encrypt(ek: *u8, msg_32: *u8, coins_32: *u8, |
| 1056 | func _kpke_decrypt(dk_pke: *u8, ct: *u8, scratch: *u8, msg_out: *u8) -> i64 {
called by 1: nx_mlkem_decaps calls 9: _poly_decompress10_poly_decompress4_poly_frombytes12_ntt_poly_zero_poly_basemul_acc+3 |
| 1107 | func nx_mlkem_keygen(seed_64: *u8, scratch: *u8, ek_out: *u8, dk_out: *u8) -> i64 {
called by 3: nx_mlkem_round_trip_testmainx25519mlkem768_client_keygen calls 2: _kpke_keygen_sha3_256 |
| 1134 | func nx_mlkem_encaps(ek: *u8, msg_32: *u8, scratch: *u8, |
| 1156 | func nx_mlkem_decaps(dk: *u8, ct: *u8, scratch: *u8, ss_out: *u8) -> i64 { |
| 1233 | func nx_mlkem_round_trip_test(seed_64: *u8, msg_32: *u8, scratch: *u8) -> i64 { |