@noble/post-quantum 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +154 -179
- package/_crystals.d.ts +0 -1
- package/_crystals.d.ts.map +1 -1
- package/_crystals.js +1 -31
- package/_crystals.js.map +1 -1
- package/esm/_crystals.d.ts +33 -0
- package/esm/_crystals.d.ts.map +1 -0
- package/esm/_crystals.js +0 -30
- package/esm/_crystals.js.map +1 -1
- package/esm/index.d.ts +2 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/ml-dsa.d.ts +17 -0
- package/esm/ml-dsa.d.ts.map +1 -0
- package/esm/ml-dsa.js +35 -84
- package/esm/ml-dsa.js.map +1 -1
- package/esm/ml-kem.d.ts +55 -0
- package/esm/ml-kem.d.ts.map +1 -0
- package/esm/ml-kem.js +26 -83
- package/esm/ml-kem.js.map +1 -1
- package/esm/slh-dsa.d.ts +46 -0
- package/esm/slh-dsa.d.ts.map +1 -0
- package/esm/slh-dsa.js +26 -109
- package/esm/slh-dsa.js.map +1 -1
- package/esm/utils.d.ts +38 -0
- package/esm/utils.d.ts.map +1 -0
- package/ml-dsa.d.ts +0 -20
- package/ml-dsa.d.ts.map +1 -1
- package/ml-dsa.js +35 -84
- package/ml-dsa.js.map +1 -1
- package/ml-kem.d.ts +1 -80
- package/ml-kem.d.ts.map +1 -1
- package/ml-kem.js +26 -83
- package/ml-kem.js.map +1 -1
- package/package.json +13 -21
- package/slh-dsa.d.ts +0 -24
- package/slh-dsa.d.ts.map +1 -1
- package/slh-dsa.js +26 -109
- package/slh-dsa.js.map +1 -1
- package/src/_crystals.ts +0 -33
- package/src/ml-dsa.ts +36 -88
- package/src/ml-kem.ts +28 -87
- package/src/slh-dsa.ts +26 -119
- package/utils.js +6 -6
- package/utils.js.map +1 -1
package/src/slh-dsa.ts
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
import { HMAC } from '@noble/hashes/hmac';
|
3
3
|
import { sha256, sha512 } from '@noble/hashes/sha2';
|
4
4
|
import { shake256 } from '@noble/hashes/sha3';
|
5
|
-
import { bytesToHex, hexToBytes, createView, concatBytes
|
5
|
+
import { bytesToHex, hexToBytes, createView, concatBytes } from '@noble/hashes/utils';
|
6
6
|
import {
|
7
7
|
Signer,
|
8
8
|
cleanBytes,
|
@@ -19,11 +19,6 @@ Hash-based digital signature algorithm. See [official site](https://sphincs.org)
|
|
19
19
|
We implement spec v3.1 with latest FIPS-205 changes.
|
20
20
|
It's compatible with the latest version in the [official repo](https://github.com/sphincs/sphincsplus).
|
21
21
|
|
22
|
-
Three versions are provided:
|
23
|
-
|
24
|
-
1. SHAKE256-based
|
25
|
-
2. SHA2-based
|
26
|
-
3. SLH-DSA aka [FIPS-205](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.ipd.pdf)
|
27
22
|
*/
|
28
23
|
|
29
24
|
/*
|
@@ -115,32 +110,20 @@ function numberToBytesBE(n: number | bigint, len: number): Uint8Array {
|
|
115
110
|
return hexToBytes(n.toString(16).padStart(len * 2, '0'));
|
116
111
|
}
|
117
112
|
|
118
|
-
// Same as bitsCoder.decode, but bits are BE instead of LE (so we cannot re-use it).
|
119
|
-
// NOTE: difference happens only if d < 8.
|
120
|
-
const base_2bBE = (N: number, d: number) => {
|
121
|
-
const mask = getMask(d);
|
122
|
-
return (bytes: Uint8Array) => {
|
123
|
-
const r = new Uint32Array(N);
|
124
|
-
for (let i = 0, buf = 0, bufLen = 0, pos = 0; i < bytes.length; i++) {
|
125
|
-
buf |= bytes[i] << bufLen;
|
126
|
-
bufLen += 8;
|
127
|
-
for (; bufLen >= d; bufLen -= d) r[pos++] = (buf >>> (bufLen - d)) & mask;
|
128
|
-
buf &= getMask(bufLen);
|
129
|
-
}
|
130
|
-
return r;
|
131
|
-
};
|
132
|
-
};
|
133
113
|
// Same as bitsCoder.decode, but maybe spec will change and unify with base2bBE.
|
134
|
-
const
|
135
|
-
const mask = getMask(
|
114
|
+
const base2b = (outLen: number, b: number) => {
|
115
|
+
const mask = getMask(b);
|
136
116
|
return (bytes: Uint8Array) => {
|
137
|
-
const
|
138
|
-
for (let
|
139
|
-
|
140
|
-
|
141
|
-
|
117
|
+
const baseB = new Uint32Array(outLen);
|
118
|
+
for (let out = 0, pos = 0, bits = 0, total = 0; out < outLen; out++) {
|
119
|
+
while (bits < b) {
|
120
|
+
total = (total << 8) | bytes[pos++];
|
121
|
+
bits += 8;
|
122
|
+
}
|
123
|
+
bits -= b;
|
124
|
+
baseB[out] = (total >>> bits) & mask;
|
142
125
|
}
|
143
|
-
return
|
126
|
+
return baseB;
|
144
127
|
};
|
145
128
|
};
|
146
129
|
|
@@ -220,9 +203,9 @@ function gen(opts: SphincsOpts, hashOpts: SphincsHashOpts): SphincsSigner {
|
|
220
203
|
return addr;
|
221
204
|
};
|
222
205
|
|
223
|
-
const chainCoder =
|
206
|
+
const chainCoder = base2b(WOTS_LEN2, WOTS_LOGW);
|
224
207
|
const chainLengths = (msg: Uint8Array) => {
|
225
|
-
const W1 =
|
208
|
+
const W1 = base2b(WOTS_LEN1, WOTS_LOGW)(msg);
|
226
209
|
let csum = 0;
|
227
210
|
for (let i = 0; i < W1.length; i++) csum += W - 1 - W1[i]; // ▷ Compute checksum
|
228
211
|
csum <<= (8 - ((WOTS_LEN2 * WOTS_LOGW) % 8)) % 8; // csum ← csum ≪ ((8 − ((len2 · lg(w)) mod 8)) mod 8
|
@@ -234,9 +217,7 @@ function gen(opts: SphincsOpts, hashOpts: SphincsHashOpts): SphincsSigner {
|
|
234
217
|
lengths.set(W2, W1.length);
|
235
218
|
return lengths;
|
236
219
|
};
|
237
|
-
|
238
|
-
const msgCoder = base_2bLE(K, A);
|
239
|
-
const messageToIndices = (msg: Uint8Array) => msgCoder(msg);
|
220
|
+
const messageToIndices = base2b(K, A);
|
240
221
|
|
241
222
|
const TREE_BITS = TREE_HEIGHT * (D - 1);
|
242
223
|
const LEAF_BITS = TREE_HEIGHT;
|
@@ -542,15 +523,12 @@ function gen(opts: SphincsOpts, hashOpts: SphincsHashOpts): SphincsSigner {
|
|
542
523
|
}
|
543
524
|
|
544
525
|
const genShake =
|
545
|
-
(
|
546
|
-
(opts: SphincsOpts) =>
|
547
|
-
(pubSeed: Uint8Array, skSeed?: Uint8Array) => {
|
548
|
-
const ADDR_BYTES = 32;
|
526
|
+
(): GetContext => (opts: SphincsOpts) => (pubSeed: Uint8Array, skSeed?: Uint8Array) => {
|
549
527
|
const { N } = opts;
|
550
528
|
const stats = { prf: 0, thash: 0, hmsg: 0, gen_message_random: 0 };
|
551
529
|
const h0 = shake256.create({}).update(pubSeed);
|
552
530
|
const h0tmp = h0.clone();
|
553
|
-
const
|
531
|
+
const thash = (blocks: number, input: Uint8Array, addr: ADRS) => {
|
554
532
|
stats.thash++;
|
555
533
|
return h0
|
556
534
|
._cloneInto(h0tmp)
|
@@ -558,24 +536,12 @@ const genShake =
|
|
558
536
|
.update(input.subarray(0, blocks * N))
|
559
537
|
.xof(N);
|
560
538
|
};
|
561
|
-
const thash_robust = (blocks: number, input: Uint8Array, addr: ADRS) => {
|
562
|
-
stats.thash++;
|
563
|
-
const buf = new Uint8Array(ADDR_BYTES + (blocks + 1) * N);
|
564
|
-
buf.subarray(0, N).set(pubSeed);
|
565
|
-
buf.subarray(N, N + ADDR_BYTES).set(addr);
|
566
|
-
shake256
|
567
|
-
.create({})
|
568
|
-
.update(buf.subarray(0, N + ADDR_BYTES))
|
569
|
-
.xofInto(buf.subarray(N + ADDR_BYTES));
|
570
|
-
for (let i = 0; i < blocks * N; i++) buf[N + ADDR_BYTES + i] ^= input[i];
|
571
|
-
return shake256.create({}).update(buf).xof(N);
|
572
|
-
};
|
573
|
-
const thash = robust ? thash_robust : thash_simple;
|
574
539
|
return {
|
575
540
|
PRFaddr: (addr: ADRS) => {
|
576
541
|
if (!skSeed) throw new Error('no sk seed');
|
577
542
|
stats.prf++;
|
578
|
-
|
543
|
+
const res = h0._cloneInto(h0tmp).update(addr).update(skSeed).xof(N);
|
544
|
+
return res;
|
579
545
|
},
|
580
546
|
PRFmsg: (skPRF: Uint8Array, random: Uint8Array, msg: Uint8Array) => {
|
581
547
|
stats.gen_message_random++;
|
@@ -595,21 +561,7 @@ const genShake =
|
|
595
561
|
};
|
596
562
|
};
|
597
563
|
|
598
|
-
const SHAKE_SIMPLE = { getContext: genShake(
|
599
|
-
const SHAKE_ROBUST = { getContext: genShake(true) };
|
600
|
-
|
601
|
-
export const sphincs_shake_128f_simple = /* @__PURE__ */ gen(PARAMS['128f'], SHAKE_SIMPLE);
|
602
|
-
export const sphincs_shake_128f_robust = /* @__PURE__ */ gen(PARAMS['128f'], SHAKE_ROBUST);
|
603
|
-
export const sphincs_shake_128s_simple = /* @__PURE__ */ gen(PARAMS['128s'], SHAKE_SIMPLE);
|
604
|
-
export const sphincs_shake_128s_robust = /* @__PURE__ */ gen(PARAMS['128s'], SHAKE_ROBUST);
|
605
|
-
export const sphincs_shake_192f_simple = /* @__PURE__ */ gen(PARAMS['192f'], SHAKE_SIMPLE);
|
606
|
-
export const sphincs_shake_192f_robust = /* @__PURE__ */ gen(PARAMS['192f'], SHAKE_ROBUST);
|
607
|
-
export const sphincs_shake_192s_simple = /* @__PURE__ */ gen(PARAMS['192s'], SHAKE_SIMPLE);
|
608
|
-
export const sphincs_shake_192s_robust = /* @__PURE__ */ gen(PARAMS['192s'], SHAKE_ROBUST);
|
609
|
-
export const sphincs_shake_256f_simple = /* @__PURE__ */ gen(PARAMS['256f'], SHAKE_SIMPLE);
|
610
|
-
export const sphincs_shake_256f_robust = /* @__PURE__ */ gen(PARAMS['256f'], SHAKE_ROBUST);
|
611
|
-
export const sphincs_shake_256s_simple = /* @__PURE__ */ gen(PARAMS['256s'], SHAKE_SIMPLE);
|
612
|
-
export const sphincs_shake_256s_robust = /* @__PURE__ */ gen(PARAMS['256s'], SHAKE_ROBUST);
|
564
|
+
const SHAKE_SIMPLE = { getContext: genShake() };
|
613
565
|
|
614
566
|
// Only simple mode in SLH-DSA
|
615
567
|
export const slh_dsa_shake_128f = /* @__PURE__ */ gen(PARAMS['128f'], SHAKE_SIMPLE);
|
@@ -621,7 +573,7 @@ export const slh_dsa_shake_256s = /* @__PURE__ */ gen(PARAMS['256s'], SHAKE_SIMP
|
|
621
573
|
|
622
574
|
type ShaType = typeof sha256 | typeof sha512;
|
623
575
|
const genSha =
|
624
|
-
(h0: ShaType, h1: ShaType
|
576
|
+
(h0: ShaType, h1: ShaType): GetContext =>
|
625
577
|
(opts) =>
|
626
578
|
(pub_seed, sk_seed?) => {
|
627
579
|
const { N } = opts;
|
@@ -660,7 +612,7 @@ const genSha =
|
|
660
612
|
return out.subarray(0, length);
|
661
613
|
}
|
662
614
|
|
663
|
-
const
|
615
|
+
const thash =
|
664
616
|
(_: ShaType, h: typeof h0ps, hTmp: typeof h0ps) =>
|
665
617
|
(blocks: number, input: Uint8Array, addr: ADRS) => {
|
666
618
|
stats.thash++;
|
@@ -671,40 +623,17 @@ const genSha =
|
|
671
623
|
.digest();
|
672
624
|
return d.subarray(0, N);
|
673
625
|
};
|
674
|
-
|
675
|
-
const thash_robust =
|
676
|
-
(sha: ShaType, h: typeof h0ps, _: typeof h0ps) =>
|
677
|
-
(blocks: number, input: Uint8Array, addr: ADRS) => {
|
678
|
-
stats.thash++;
|
679
|
-
stats.mgf1++;
|
680
|
-
// inlined mgf1
|
681
|
-
const addr8 = addr;
|
682
|
-
const hh = sha.create().update(pub_seed).update(addr8);
|
683
|
-
let bitmask = new Uint8Array(Math.ceil((blocks * N) / sha.outputLen) * sha.outputLen);
|
684
|
-
for (let counter = 0, o = bitmask; o.length; counter++) {
|
685
|
-
counterV.setUint32(0, counter, false);
|
686
|
-
hh.clone().update(counterB).digestInto(o);
|
687
|
-
o = o.subarray(sha.outputLen);
|
688
|
-
}
|
689
|
-
bitmask = bitmask.subarray(0, blocks * N);
|
690
|
-
const ou32 = u32(input);
|
691
|
-
const bm32 = u32(bitmask);
|
692
|
-
for (let i = 0; i < bm32.length; i++) bm32[i] ^= ou32[i];
|
693
|
-
const d = h.clone().update(addr8).update(bitmask).digest();
|
694
|
-
return d.subarray(0, N);
|
695
|
-
};
|
696
|
-
|
697
|
-
const thash = robust ? thash_robust : thash_simple;
|
698
626
|
return {
|
699
627
|
PRFaddr: (addr: ADRS) => {
|
700
628
|
if (!sk_seed) throw new Error('No sk seed');
|
701
629
|
stats.prf++;
|
702
|
-
|
630
|
+
const res = h0ps
|
703
631
|
._cloneInto(h0tmp as any)
|
704
632
|
.update(addr)
|
705
633
|
.update(sk_seed)
|
706
634
|
.digest()
|
707
635
|
.subarray(0, N);
|
636
|
+
return res;
|
708
637
|
},
|
709
638
|
PRFmsg: (skPRF: Uint8Array, random: Uint8Array, msg: Uint8Array) => {
|
710
639
|
stats.gen_message_random++;
|
@@ -733,34 +662,12 @@ const genSha =
|
|
733
662
|
|
734
663
|
const SHA256_SIMPLE = {
|
735
664
|
isCompressed: true,
|
736
|
-
getContext: genSha(sha256, sha256
|
737
|
-
};
|
738
|
-
const SHA256_ROBUST = {
|
739
|
-
isCompressed: true,
|
740
|
-
getContext: genSha(sha256, sha256, true),
|
665
|
+
getContext: genSha(sha256, sha256),
|
741
666
|
};
|
742
667
|
const SHA512_SIMPLE = {
|
743
668
|
isCompressed: true,
|
744
|
-
getContext: genSha(sha256, sha512
|
669
|
+
getContext: genSha(sha256, sha512),
|
745
670
|
};
|
746
|
-
const SHA512_ROBUST = {
|
747
|
-
isCompressed: true,
|
748
|
-
getContext: genSha(sha256, sha512, true),
|
749
|
-
};
|
750
|
-
|
751
|
-
export const sphincs_sha2_128f_simple = /* @__PURE__ */ gen(PARAMS['128f'], SHA256_SIMPLE);
|
752
|
-
export const sphincs_sha2_128f_robust = /* @__PURE__ */ gen(PARAMS['128f'], SHA256_ROBUST);
|
753
|
-
export const sphincs_sha2_128s_simple = /* @__PURE__ */ gen(PARAMS['128s'], SHA256_SIMPLE);
|
754
|
-
export const sphincs_sha2_128s_robust = /* @__PURE__ */ gen(PARAMS['128s'], SHA256_ROBUST);
|
755
|
-
|
756
|
-
export const sphincs_sha2_192f_simple = /* @__PURE__ */ gen(PARAMS['192f'], SHA512_SIMPLE);
|
757
|
-
export const sphincs_sha2_192f_robust = /* @__PURE__ */ gen(PARAMS['192f'], SHA512_ROBUST);
|
758
|
-
export const sphincs_sha2_192s_simple = /* @__PURE__ */ gen(PARAMS['192s'], SHA512_SIMPLE);
|
759
|
-
export const sphincs_sha2_192s_robust = /* @__PURE__ */ gen(PARAMS['192s'], SHA512_ROBUST);
|
760
|
-
export const sphincs_sha2_256f_simple = /* @__PURE__ */ gen(PARAMS['256f'], SHA512_SIMPLE);
|
761
|
-
export const sphincs_sha2_256f_robust = /* @__PURE__ */ gen(PARAMS['256f'], SHA512_ROBUST);
|
762
|
-
export const sphincs_sha2_256s_simple = /* @__PURE__ */ gen(PARAMS['256s'], SHA512_SIMPLE);
|
763
|
-
export const sphincs_sha2_256s_robust = /* @__PURE__ */ gen(PARAMS['256s'], SHA512_ROBUST);
|
764
671
|
|
765
672
|
// Only simple mode in SLH-DSA
|
766
673
|
export const slh_dsa_sha2_128f = /* @__PURE__ */ gen(PARAMS['128f'], SHA256_SIMPLE);
|
package/utils.js
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.randomBytes = exports.ensureBytes = void 0;
|
4
|
+
exports.equalBytes = equalBytes;
|
5
|
+
exports.splitCoder = splitCoder;
|
6
|
+
exports.vecCoder = vecCoder;
|
7
|
+
exports.cleanBytes = cleanBytes;
|
8
|
+
exports.getMask = getMask;
|
4
9
|
/*! noble-post-quantum - MIT License (c) 2024 Paul Miller (paulmillr.com) */
|
5
10
|
const _assert_1 = require("@noble/hashes/_assert");
|
6
11
|
const utils_1 = require("@noble/hashes/utils");
|
@@ -15,7 +20,6 @@ function equalBytes(a, b) {
|
|
15
20
|
diff |= a[i] ^ b[i];
|
16
21
|
return diff === 0;
|
17
22
|
}
|
18
|
-
exports.equalBytes = equalBytes;
|
19
23
|
function splitCoder(...lengths) {
|
20
24
|
const getLength = (c) => (typeof c === 'number' ? c : c.bytesLen);
|
21
25
|
const bytesLen = lengths.reduce((sum, a) => sum + getLength(a), 0);
|
@@ -48,7 +52,6 @@ function splitCoder(...lengths) {
|
|
48
52
|
},
|
49
53
|
};
|
50
54
|
}
|
51
|
-
exports.splitCoder = splitCoder;
|
52
55
|
// nano-packed.array (fixed size)
|
53
56
|
function vecCoder(c, vecLen) {
|
54
57
|
const bytesLen = vecLen * c.bytesLen;
|
@@ -75,7 +78,6 @@ function vecCoder(c, vecLen) {
|
|
75
78
|
},
|
76
79
|
};
|
77
80
|
}
|
78
|
-
exports.vecCoder = vecCoder;
|
79
81
|
// cleanBytes(new Uint8Array(), [new Uint16Array(), new Uint32Array()])
|
80
82
|
function cleanBytes(...list) {
|
81
83
|
for (const t of list) {
|
@@ -86,9 +88,7 @@ function cleanBytes(...list) {
|
|
86
88
|
t.fill(0);
|
87
89
|
}
|
88
90
|
}
|
89
|
-
exports.cleanBytes = cleanBytes;
|
90
91
|
function getMask(bits) {
|
91
92
|
return (1 << bits) - 1; // 4 -> 0b1111
|
92
93
|
}
|
93
|
-
exports.getMask = getMask;
|
94
94
|
//# sourceMappingURL=utils.js.map
|
package/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["src/utils.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["src/utils.ts"],"names":[],"mappings":"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"}
|