@noble/post-quantum 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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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"}
|