@blamejs/blamejs-shop 0.5.19 → 0.5.21
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/CHANGELOG.md +4 -0
- package/README.md +1 -0
- package/SECURITY.md +17 -0
- package/lib/addresses.js +2 -2
- package/lib/admin.js +49 -45
- package/lib/affiliates.js +7 -23
- package/lib/announcement-bar.js +5 -22
- package/lib/api-keys.js +4 -13
- package/lib/asset-manifest.json +1 -1
- package/lib/banner-ab-tests.js +5 -9
- package/lib/blog-articles.js +8 -26
- package/lib/captcha-gate.js +7 -17
- package/lib/carrier-accounts.js +3 -10
- package/lib/catalog-drafts.js +5 -12
- package/lib/category-navigation.js +4 -20
- package/lib/cms-blocks.js +4 -7
- package/lib/compliance-export.js +4 -11
- package/lib/consent-ledger.js +2 -4
- package/lib/cost-layers.js +56 -21
- package/lib/customer-import.js +2 -2
- package/lib/customer-notes.js +7 -23
- package/lib/customer-roles.js +3 -5
- package/lib/customer-segments.js +17 -14
- package/lib/customer-surveys.js +7 -14
- package/lib/customers.js +2 -4
- package/lib/dispute-resolution.js +5 -13
- package/lib/dropship-forwarding.js +3 -5
- package/lib/dunning.js +2 -7
- package/lib/email-ab-tests.js +4 -8
- package/lib/email-campaigns.js +25 -14
- package/lib/email-warmup.js +2 -7
- package/lib/experiments.js +6 -10
- package/lib/externaldb-d1.js +78 -44
- package/lib/geolocation.js +18 -28
- package/lib/gift-options.js +5 -23
- package/lib/knowledge-base.js +7 -22
- package/lib/line-gift-wrap.js +3 -17
- package/lib/live-chat.js +5 -18
- package/lib/metered-usage.js +3 -8
- package/lib/notifications.js +3 -7
- package/lib/operator-accounts.js +3 -5
- package/lib/operator-approvals.js +6 -8
- package/lib/operator-audit-log.js +2 -7
- package/lib/operator-help-center.js +5 -21
- package/lib/operator-inbox.js +4 -11
- package/lib/operator-roles.js +5 -7
- package/lib/order-escalation.js +2 -2
- package/lib/order-export.js +24 -20
- package/lib/order-notes.js +4 -14
- package/lib/order-ratings.js +4 -10
- package/lib/payment-methods.js +5 -13
- package/lib/payment-retries.js +2 -7
- package/lib/payment.js +103 -58
- package/lib/pixel-events.js +8 -23
- package/lib/plan-changes.js +2 -7
- package/lib/product-qa.js +4 -8
- package/lib/promo-banners.js +7 -15
- package/lib/purchase-orders.js +3 -6
- package/lib/push-notifications.js +7 -32
- package/lib/pwa-manifest.js +6 -11
- package/lib/quotes.js +5 -9
- package/lib/referrals.js +10 -6
- package/lib/reviews.js +4 -10
- package/lib/robots-config.js +6 -14
- package/lib/sales-tax-filings.js +2 -2
- package/lib/search-facets.js +5 -5
- package/lib/search-ranking.js +4 -7
- package/lib/search-synonyms.js +7 -21
- package/lib/security-middleware.js +125 -70
- package/lib/seller-signup.js +10 -26
- package/lib/sidebar-widgets.js +6 -15
- package/lib/site-redirects.js +49 -137
- package/lib/sitemap-generator.js +3 -7
- package/lib/sms-dispatcher.js +7 -23
- package/lib/stock-receipts.js +4 -10
- package/lib/storefront-dashboards.js +2 -10
- package/lib/storefront-forms.js +9 -22
- package/lib/storefront-pages.js +6 -20
- package/lib/storefront.js +21 -23
- package/lib/subscription-billing.js +3 -8
- package/lib/subscription-controls.js +2 -7
- package/lib/suggestion-box.js +9 -26
- package/lib/support-tickets.js +6 -24
- package/lib/tax-remittance.js +2 -2
- package/lib/tenants.js +2 -7
- package/lib/text-guard.js +137 -35
- package/lib/theme-assets.js +4 -16
- package/lib/translations.js +3 -6
- package/lib/trust-badges.js +4 -7
- package/lib/vendor/MANIFEST.json +107 -97
- package/lib/vendor/blamejs/CHANGELOG.md +180 -0
- package/lib/vendor/blamejs/NOTICE +14 -10
- package/lib/vendor/blamejs/README.md +17 -5
- package/lib/vendor/blamejs/index.js +2 -0
- package/lib/vendor/blamejs/lib/acme.js +9 -9
- package/lib/vendor/blamejs/lib/api-snapshot.js +35 -16
- package/lib/vendor/blamejs/lib/app-shutdown.js +1 -1
- package/lib/vendor/blamejs/lib/archive-adapters.js +1 -1
- package/lib/vendor/blamejs/lib/archive.js +13 -24
- package/lib/vendor/blamejs/lib/auth/access-lock.js +2 -1
- package/lib/vendor/blamejs/lib/auth/bot-challenge.js +3 -6
- package/lib/vendor/blamejs/lib/auth/ciba.js +32 -3
- package/lib/vendor/blamejs/lib/auth/oauth.js +65 -8
- package/lib/vendor/blamejs/lib/auth/password.js +1 -1
- package/lib/vendor/blamejs/lib/auth/saml.js +21 -3
- package/lib/vendor/blamejs/lib/auth-bot-challenge.js +3 -3
- package/lib/vendor/blamejs/lib/backup/index.js +5 -5
- package/lib/vendor/blamejs/lib/case-fold-classes.js +491 -0
- package/lib/vendor/blamejs/lib/codepoint-class.js +131 -0
- package/lib/vendor/blamejs/lib/constants.js +79 -0
- package/lib/vendor/blamejs/lib/db-declare-view.js +8 -2
- package/lib/vendor/blamejs/lib/error-page.js +20 -1
- package/lib/vendor/blamejs/lib/external-db.js +5 -1
- package/lib/vendor/blamejs/lib/flag-evaluation-context.js +24 -6
- package/lib/vendor/blamejs/lib/flag.js +28 -2
- package/lib/vendor/blamejs/lib/framework-schema.js +14 -3
- package/lib/vendor/blamejs/lib/guard-regex.js +2345 -89
- package/lib/vendor/blamejs/lib/http-client.js +217 -40
- package/lib/vendor/blamejs/lib/mail-bimi.js +1 -1
- package/lib/vendor/blamejs/lib/mail-crypto-pgp.js +3 -2
- package/lib/vendor/blamejs/lib/mail-dav.js +26 -26
- package/lib/vendor/blamejs/lib/mail-deploy.js +10 -10
- package/lib/vendor/blamejs/lib/mail-scan.js +3 -0
- package/lib/vendor/blamejs/lib/mail-store.js +7 -1
- package/lib/vendor/blamejs/lib/mail.js +5 -1
- package/lib/vendor/blamejs/lib/middleware/age-gate.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/api-encrypt.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/assetlinks.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/asyncapi-serve.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/bearer-auth.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/compression.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/cors.js +1 -1
- package/lib/vendor/blamejs/lib/middleware/csp-report.js +5 -5
- package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/daily-byte-quota.js +2 -2
- package/lib/vendor/blamejs/lib/middleware/deny-response.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/dpop.js +2 -2
- package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/flag-context.js +17 -0
- package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +10 -8
- package/lib/vendor/blamejs/lib/middleware/openapi-serve.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/require-aal.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/require-auth.js +4 -3
- package/lib/vendor/blamejs/lib/middleware/require-bound-key.js +4 -3
- package/lib/vendor/blamejs/lib/middleware/require-content-type.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/require-methods.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/require-mtls.js +3 -2
- package/lib/vendor/blamejs/lib/middleware/security-txt.js +2 -1
- package/lib/vendor/blamejs/lib/middleware/web-app-manifest.js +2 -1
- package/lib/vendor/blamejs/lib/network-dns-resolver.js +1 -1
- package/lib/vendor/blamejs/lib/network-dns.js +3 -3
- package/lib/vendor/blamejs/lib/network-nts.js +35 -14
- package/lib/vendor/blamejs/lib/network-proxy.js +42 -4
- package/lib/vendor/blamejs/lib/network-smtp-policy.js +1 -1
- package/lib/vendor/blamejs/lib/network-tls.js +341 -11
- package/lib/vendor/blamejs/lib/nist-crosswalk.js +2 -2
- package/lib/vendor/blamejs/lib/ntp-check.js +30 -19
- package/lib/vendor/blamejs/lib/object-store/azure-blob.js +1 -1
- package/lib/vendor/blamejs/lib/object-store/gcs.js +1 -1
- package/lib/vendor/blamejs/lib/object-store/http-put.js +2 -1
- package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +5 -5
- package/lib/vendor/blamejs/lib/object-store/sigv4.js +2 -2
- package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +4 -2
- package/lib/vendor/blamejs/lib/openapi.js +1 -1
- package/lib/vendor/blamejs/lib/pqc-agent.js +4 -7
- package/lib/vendor/blamejs/lib/problem-details.js +2 -1
- package/lib/vendor/blamejs/lib/redis-client.js +12 -1
- package/lib/vendor/blamejs/lib/regex-linear.js +1349 -0
- package/lib/vendor/blamejs/lib/render.js +531 -7
- package/lib/vendor/blamejs/lib/request-helpers.js +181 -5
- package/lib/vendor/blamejs/lib/router.js +37 -13
- package/lib/vendor/blamejs/lib/safe-async.js +142 -0
- package/lib/vendor/blamejs/lib/safe-icap.js +3 -0
- package/lib/vendor/blamejs/lib/safe-sql.js +15 -3
- package/lib/vendor/blamejs/lib/self-update.js +2 -2
- package/lib/vendor/blamejs/lib/testing.js +54 -7
- package/lib/vendor/blamejs/lib/validate-opts.js +56 -0
- package/lib/vendor/blamejs/lib/vendor/MANIFEST.json +62 -25
- package/lib/vendor/blamejs/lib/vendor/blamejs-pki.cjs +2004 -142
- package/lib/vendor/blamejs/lib/vendor/browser/noble-ciphers.mjs +727 -0
- package/lib/vendor/blamejs/lib/vendor/browser/noble-hashes.mjs +1070 -0
- package/lib/vendor/blamejs/lib/vendor/browser/noble-post-quantum.mjs +1090 -0
- package/lib/vendor/blamejs/lib/vendor/noble-post-quantum.cjs +510 -227
- package/lib/vendor/blamejs/lib/webhook-hmac.js +19 -2
- package/lib/vendor/blamejs/lib/webhook.js +1 -1
- package/lib/vendor/blamejs/lib/ws-client.js +24 -2
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/sbom.cdx.json +6 -6
- package/lib/vendor-invoices.js +3 -6
- package/lib/vendors.js +5 -19
- package/lib/webhook-receiver.js +46 -83
- package/lib/webhook-subscriptions.js +3 -13
- package/lib/wishlist-sharing.js +5 -10
- package/package.json +1 -1
|
@@ -0,0 +1,1090 @@
|
|
|
1
|
+
// @noble/post-quantum v0.7.0 — vendored from Paul Miller
|
|
2
|
+
// License: MIT — https://github.com/paulmillr/noble-post-quantum
|
|
3
|
+
// Browser build (ESM), bundled with esbuild from the same install as the
|
|
4
|
+
// server bundle beside it. The KEM suites only — a client half encapsulates
|
|
5
|
+
// and does not sign.
|
|
6
|
+
// Exports: ml_kem512 / ml_kem768 / ml_kem1024 (FIPS 203).
|
|
7
|
+
// node_modules/@noble/hashes/_u64.js
|
|
8
|
+
var U32_MASK64 = /* @__PURE__ */ (() => BigInt(2 ** 32 - 1))();
|
|
9
|
+
var _32n = /* @__PURE__ */ BigInt(32);
|
|
10
|
+
function fromBig(n, le = false) {
|
|
11
|
+
if (le)
|
|
12
|
+
return { h: Number(n & U32_MASK64), l: Number(n >> _32n & U32_MASK64) };
|
|
13
|
+
return { h: Number(n >> _32n & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
14
|
+
}
|
|
15
|
+
function split(lst, le = false) {
|
|
16
|
+
const len = lst.length;
|
|
17
|
+
let Ah = new Uint32Array(len);
|
|
18
|
+
let Al = new Uint32Array(len);
|
|
19
|
+
for (let i = 0; i < len; i++) {
|
|
20
|
+
const { h, l } = fromBig(lst[i], le);
|
|
21
|
+
[Ah[i], Al[i]] = [h, l];
|
|
22
|
+
}
|
|
23
|
+
return [Ah, Al];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// node_modules/@noble/hashes/utils.js
|
|
27
|
+
function isBytes(a) {
|
|
28
|
+
return a instanceof Uint8Array || ArrayBuffer.isView(a) && a.constructor.name === "Uint8Array" && "BYTES_PER_ELEMENT" in a && a.BYTES_PER_ELEMENT === 1;
|
|
29
|
+
}
|
|
30
|
+
var atitle = (title) => title ? `"${title}" ` : "";
|
|
31
|
+
function anumber(n, title = "") {
|
|
32
|
+
if (typeof n !== "number")
|
|
33
|
+
throw new TypeError(atitle(title) + "expected number, got " + typeof n);
|
|
34
|
+
if (!Number.isSafeInteger(n) || n < 0)
|
|
35
|
+
throw new RangeError(atitle(title) + "expected integer >= 0, got " + n);
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
function abool(value, title = "") {
|
|
39
|
+
if (typeof value !== "boolean")
|
|
40
|
+
throw new TypeError(atitle(title) + "expected boolean, got type=" + typeof value);
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
function abytes(value, length, title = "") {
|
|
44
|
+
if (isBytes(value) && (length === void 0 || value.length === length))
|
|
45
|
+
return value;
|
|
46
|
+
if (length !== void 0)
|
|
47
|
+
anumber(length, "length");
|
|
48
|
+
const bytes = isBytes(value);
|
|
49
|
+
const ofLen = length !== void 0 ? ` of length ${length}` : "";
|
|
50
|
+
const got = bytes ? `length=${value.length}` : `type=${typeof value}`;
|
|
51
|
+
const message = atitle(title) + "expected Uint8Array" + ofLen + ", got " + got;
|
|
52
|
+
if (!bytes)
|
|
53
|
+
throw new TypeError(message);
|
|
54
|
+
throw new RangeError(message);
|
|
55
|
+
}
|
|
56
|
+
var aobject = (value, label) => {
|
|
57
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
58
|
+
throw new TypeError((label === "object" ? "" : `"${label}" `) + "expected object, got type=" + typeof value);
|
|
59
|
+
};
|
|
60
|
+
function aexists(instance, checkFinished = true) {
|
|
61
|
+
if (instance.destroyed)
|
|
62
|
+
throw new Error("hash was destroyed");
|
|
63
|
+
if (checkFinished && instance.finished)
|
|
64
|
+
throw new Error("digest() was already called");
|
|
65
|
+
}
|
|
66
|
+
function aoutput(out, instance) {
|
|
67
|
+
abytes(out, void 0, "output");
|
|
68
|
+
const min = instance.outputLen;
|
|
69
|
+
if (!(out.length >= min)) {
|
|
70
|
+
throw new RangeError('"output" expected length >= ' + min);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function u32(arr) {
|
|
74
|
+
return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
|
|
75
|
+
}
|
|
76
|
+
function clean(...arrays) {
|
|
77
|
+
for (let i = 0; i < arrays.length; i++) {
|
|
78
|
+
arrays[i].fill(0);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
var isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([287454020]).buffer)[0] === 68)();
|
|
82
|
+
function byteSwap(word) {
|
|
83
|
+
return word << 24 & 4278190080 | word << 8 & 16711680 | word >>> 8 & 65280 | word >>> 24 & 255;
|
|
84
|
+
}
|
|
85
|
+
function byteSwap32(arr) {
|
|
86
|
+
for (let i = 0; i < arr.length; i++) {
|
|
87
|
+
arr[i] = byteSwap(arr[i]);
|
|
88
|
+
}
|
|
89
|
+
return arr;
|
|
90
|
+
}
|
|
91
|
+
var swap32IfBE = isLE ? (u) => u : byteSwap32;
|
|
92
|
+
function checkOpts(defaults, opts2, title = "opts") {
|
|
93
|
+
aobject(defaults, "defaults");
|
|
94
|
+
if (opts2 !== void 0)
|
|
95
|
+
aobject(opts2, title);
|
|
96
|
+
const merged = Object.assign(defaults, opts2);
|
|
97
|
+
return merged;
|
|
98
|
+
}
|
|
99
|
+
function createHasher(hashCons, info = {}) {
|
|
100
|
+
if (typeof hashCons !== "function")
|
|
101
|
+
throw new TypeError('"hashCons" expected function, got type=' + typeof hashCons);
|
|
102
|
+
info = checkOpts({}, info, "info");
|
|
103
|
+
const hashC = (msg, opts2) => hashCons(opts2).update(msg).digest();
|
|
104
|
+
const tmp = hashCons(void 0);
|
|
105
|
+
hashC.outputLen = tmp.outputLen;
|
|
106
|
+
hashC.blockLen = tmp.blockLen;
|
|
107
|
+
hashC.canXOF = tmp.canXOF;
|
|
108
|
+
hashC.create = (opts2) => hashCons(opts2);
|
|
109
|
+
Object.assign(hashC, info);
|
|
110
|
+
return Object.freeze(hashC);
|
|
111
|
+
}
|
|
112
|
+
function randomBytes(bytesLength = 32) {
|
|
113
|
+
anumber(bytesLength, "bytesLength");
|
|
114
|
+
const cr = typeof globalThis === "object" ? globalThis.crypto : null;
|
|
115
|
+
if (typeof cr?.getRandomValues !== "function")
|
|
116
|
+
throw new Error("crypto.getRandomValues must be defined");
|
|
117
|
+
if (bytesLength > 65536)
|
|
118
|
+
throw new RangeError(`"bytesLength" expected <= 65536, got ${bytesLength}`);
|
|
119
|
+
return cr.getRandomValues(new Uint8Array(bytesLength));
|
|
120
|
+
}
|
|
121
|
+
var oidNist = (suffix) => ({
|
|
122
|
+
// Current NIST hashAlgs suffixes used here fit in one DER subidentifier octet.
|
|
123
|
+
// Larger suffix values would need base-128 OID encoding and a different length byte.
|
|
124
|
+
oid: Uint8Array.from([6, 9, 96, 134, 72, 1, 101, 3, 4, 2, suffix])
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// node_modules/@noble/hashes/sha3.js
|
|
128
|
+
var _0n = BigInt(0);
|
|
129
|
+
var _1n = BigInt(1);
|
|
130
|
+
var _2n = BigInt(2);
|
|
131
|
+
var _7n = BigInt(7);
|
|
132
|
+
var _256n = BigInt(256);
|
|
133
|
+
var _0x71n = BigInt(113);
|
|
134
|
+
var SHA3_PI = [];
|
|
135
|
+
var SHA3_ROTL = [];
|
|
136
|
+
var _SHA3_IOTA = [];
|
|
137
|
+
for (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {
|
|
138
|
+
[x, y] = [y, (2 * x + 3 * y) % 5];
|
|
139
|
+
SHA3_PI.push(2 * (5 * y + x));
|
|
140
|
+
SHA3_ROTL.push((round + 1) * (round + 2) / 2 % 64);
|
|
141
|
+
let t = _0n;
|
|
142
|
+
for (let j = 0; j < 7; j++) {
|
|
143
|
+
R = (R << _1n ^ (R >> _7n) * _0x71n) % _256n;
|
|
144
|
+
if (R & _2n)
|
|
145
|
+
t ^= _1n << (_1n << BigInt(j)) - _1n;
|
|
146
|
+
}
|
|
147
|
+
_SHA3_IOTA.push(t);
|
|
148
|
+
}
|
|
149
|
+
var IOTAS = split(_SHA3_IOTA, true);
|
|
150
|
+
var SHA3_IOTA_H = IOTAS[0];
|
|
151
|
+
var SHA3_IOTA_L = IOTAS[1];
|
|
152
|
+
var rotlSH = (h, l, s) => h << s | l >>> 32 - s;
|
|
153
|
+
var rotlSL = (h, l, s) => l << s | h >>> 32 - s;
|
|
154
|
+
var rotlBH = (h, l, s) => l << s - 32 | h >>> 64 - s;
|
|
155
|
+
var rotlBL = (h, l, s) => h << s - 32 | l >>> 64 - s;
|
|
156
|
+
var rotlH = (h, l, s) => s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s);
|
|
157
|
+
var rotlL = (h, l, s) => s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s);
|
|
158
|
+
var B = new Uint32Array(5 * 2);
|
|
159
|
+
function keccakP(s, rounds = 24) {
|
|
160
|
+
if (!(s instanceof Uint32Array))
|
|
161
|
+
throw new TypeError('"s" expected Uint32Array(50), got type=' + typeof s);
|
|
162
|
+
if (s.length !== 50)
|
|
163
|
+
throw new RangeError('"s" expected Uint32Array(50), got length=' + s.length);
|
|
164
|
+
anumber(rounds, "rounds");
|
|
165
|
+
if (rounds < 1 || rounds > 24)
|
|
166
|
+
throw new Error('"rounds" expected integer 1..24');
|
|
167
|
+
for (let round = 24 - rounds; round < 24; round++) {
|
|
168
|
+
for (let x = 0; x < 10; x++)
|
|
169
|
+
B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
|
|
170
|
+
for (let x = 0; x < 10; x += 2) {
|
|
171
|
+
const idx1 = (x + 8) % 10;
|
|
172
|
+
const idx0 = (x + 2) % 10;
|
|
173
|
+
const B0 = B[idx0];
|
|
174
|
+
const B1 = B[idx0 + 1];
|
|
175
|
+
const Th = rotlH(B0, B1, 1) ^ B[idx1];
|
|
176
|
+
const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
|
|
177
|
+
for (let y = 0; y < 50; y += 10) {
|
|
178
|
+
s[x + y] ^= Th;
|
|
179
|
+
s[x + y + 1] ^= Tl;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
let curH = s[2];
|
|
183
|
+
let curL = s[3];
|
|
184
|
+
for (let t = 0; t < 24; t++) {
|
|
185
|
+
const shift = SHA3_ROTL[t];
|
|
186
|
+
const Th = rotlH(curH, curL, shift);
|
|
187
|
+
const Tl = rotlL(curH, curL, shift);
|
|
188
|
+
const PI = SHA3_PI[t];
|
|
189
|
+
curH = s[PI];
|
|
190
|
+
curL = s[PI + 1];
|
|
191
|
+
s[PI] = Th;
|
|
192
|
+
s[PI + 1] = Tl;
|
|
193
|
+
}
|
|
194
|
+
for (let y = 0; y < 50; y += 10) {
|
|
195
|
+
const b0 = s[y], b1 = s[y + 1], b2 = s[y + 2], b3 = s[y + 3];
|
|
196
|
+
s[y] ^= ~s[y + 2] & s[y + 4];
|
|
197
|
+
s[y + 1] ^= ~s[y + 3] & s[y + 5];
|
|
198
|
+
s[y + 2] ^= ~s[y + 4] & s[y + 6];
|
|
199
|
+
s[y + 3] ^= ~s[y + 5] & s[y + 7];
|
|
200
|
+
s[y + 4] ^= ~s[y + 6] & s[y + 8];
|
|
201
|
+
s[y + 5] ^= ~s[y + 7] & s[y + 9];
|
|
202
|
+
s[y + 6] ^= ~s[y + 8] & b0;
|
|
203
|
+
s[y + 7] ^= ~s[y + 9] & b1;
|
|
204
|
+
s[y + 8] ^= ~b0 & b2;
|
|
205
|
+
s[y + 9] ^= ~b1 & b3;
|
|
206
|
+
}
|
|
207
|
+
s[0] ^= SHA3_IOTA_H[round];
|
|
208
|
+
s[1] ^= SHA3_IOTA_L[round];
|
|
209
|
+
}
|
|
210
|
+
clean(B);
|
|
211
|
+
}
|
|
212
|
+
var Keccak = class _Keccak {
|
|
213
|
+
state;
|
|
214
|
+
pos = 0;
|
|
215
|
+
posOut = 0;
|
|
216
|
+
finished = false;
|
|
217
|
+
state32;
|
|
218
|
+
destroyed = false;
|
|
219
|
+
blockLen;
|
|
220
|
+
suffix;
|
|
221
|
+
outputLen;
|
|
222
|
+
canXOF;
|
|
223
|
+
enableXOF = false;
|
|
224
|
+
rounds;
|
|
225
|
+
// NOTE: we accept arguments in bytes instead of bits here.
|
|
226
|
+
constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
|
|
227
|
+
anumber(blockLen, "blockLen");
|
|
228
|
+
anumber(suffix, "suffix");
|
|
229
|
+
anumber(rounds, "rounds");
|
|
230
|
+
abool(enableXOF, "enableXOF");
|
|
231
|
+
this.blockLen = blockLen;
|
|
232
|
+
this.suffix = suffix;
|
|
233
|
+
this.outputLen = outputLen;
|
|
234
|
+
this.enableXOF = enableXOF;
|
|
235
|
+
this.canXOF = enableXOF;
|
|
236
|
+
this.rounds = rounds;
|
|
237
|
+
anumber(outputLen, "outputLen");
|
|
238
|
+
if (!(0 < blockLen && blockLen < 200))
|
|
239
|
+
throw new Error('"blockLen" must be 1..199');
|
|
240
|
+
this.state = new Uint8Array(200);
|
|
241
|
+
this.state32 = u32(this.state);
|
|
242
|
+
}
|
|
243
|
+
clone() {
|
|
244
|
+
return this._cloneInto();
|
|
245
|
+
}
|
|
246
|
+
keccak() {
|
|
247
|
+
swap32IfBE(this.state32);
|
|
248
|
+
keccakP(this.state32, this.rounds);
|
|
249
|
+
swap32IfBE(this.state32);
|
|
250
|
+
this.posOut = 0;
|
|
251
|
+
this.pos = 0;
|
|
252
|
+
}
|
|
253
|
+
update(data) {
|
|
254
|
+
aexists(this);
|
|
255
|
+
abytes(data);
|
|
256
|
+
const { blockLen, state, state32 } = this;
|
|
257
|
+
const len = data.length;
|
|
258
|
+
const canUseU32 = blockLen % 4 === 0 && data.byteOffset % 4 === 0;
|
|
259
|
+
const blockLen32 = blockLen / 4;
|
|
260
|
+
const data32 = canUseU32 && len >= blockLen ? u32(data) : void 0;
|
|
261
|
+
for (let pos = 0; pos < len; ) {
|
|
262
|
+
if (data32 !== void 0 && this.pos === 0 && pos % 4 === 0 && len - pos >= blockLen) {
|
|
263
|
+
for (let i = 0, o = pos / 4; i < blockLen32; i++)
|
|
264
|
+
state32[i] ^= data32[o + i];
|
|
265
|
+
pos += blockLen;
|
|
266
|
+
this.pos = blockLen;
|
|
267
|
+
this.keccak();
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const take = Math.min(blockLen - this.pos, len - pos);
|
|
271
|
+
for (let i = 0; i < take; i++)
|
|
272
|
+
state[this.pos++] ^= data[pos++];
|
|
273
|
+
if (this.pos === blockLen)
|
|
274
|
+
this.keccak();
|
|
275
|
+
}
|
|
276
|
+
return this;
|
|
277
|
+
}
|
|
278
|
+
finish() {
|
|
279
|
+
if (this.finished)
|
|
280
|
+
return;
|
|
281
|
+
this.finished = true;
|
|
282
|
+
const { state, suffix, pos, blockLen } = this;
|
|
283
|
+
state[pos] ^= suffix;
|
|
284
|
+
if ((suffix & 128) !== 0 && pos === blockLen - 1)
|
|
285
|
+
this.keccak();
|
|
286
|
+
state[blockLen - 1] ^= 128;
|
|
287
|
+
this.keccak();
|
|
288
|
+
}
|
|
289
|
+
writeInto(out) {
|
|
290
|
+
aexists(this, false);
|
|
291
|
+
abytes(out);
|
|
292
|
+
this.finish();
|
|
293
|
+
const bufferOut = this.state;
|
|
294
|
+
const { blockLen } = this;
|
|
295
|
+
for (let pos = 0, len = out.length; pos < len; ) {
|
|
296
|
+
if (this.posOut >= blockLen)
|
|
297
|
+
this.keccak();
|
|
298
|
+
const take = Math.min(blockLen - this.posOut, len - pos);
|
|
299
|
+
out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
|
|
300
|
+
this.posOut += take;
|
|
301
|
+
pos += take;
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
xofInto(out) {
|
|
306
|
+
if (!this.enableXOF)
|
|
307
|
+
throw new Error("XOF is not enabled");
|
|
308
|
+
return this.writeInto(out);
|
|
309
|
+
}
|
|
310
|
+
xof(bytes) {
|
|
311
|
+
anumber(bytes);
|
|
312
|
+
return this.xofInto(new Uint8Array(bytes));
|
|
313
|
+
}
|
|
314
|
+
digestInto(out) {
|
|
315
|
+
aoutput(out, this);
|
|
316
|
+
if (this.finished)
|
|
317
|
+
throw new Error("digest() was already called");
|
|
318
|
+
this.writeInto(out.length === this.outputLen ? out : out.subarray(0, this.outputLen));
|
|
319
|
+
this.destroy();
|
|
320
|
+
}
|
|
321
|
+
digest() {
|
|
322
|
+
const out = new Uint8Array(this.outputLen);
|
|
323
|
+
this.digestInto(out);
|
|
324
|
+
return out;
|
|
325
|
+
}
|
|
326
|
+
destroy() {
|
|
327
|
+
this.destroyed = true;
|
|
328
|
+
clean(this.state);
|
|
329
|
+
}
|
|
330
|
+
_cloneInto(to) {
|
|
331
|
+
const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
|
|
332
|
+
to ||= new _Keccak(blockLen, suffix, outputLen, enableXOF, rounds);
|
|
333
|
+
to.blockLen = blockLen;
|
|
334
|
+
to.state32.set(this.state32);
|
|
335
|
+
to.pos = this.pos;
|
|
336
|
+
to.posOut = this.posOut;
|
|
337
|
+
to.finished = this.finished;
|
|
338
|
+
to.rounds = rounds;
|
|
339
|
+
to.suffix = suffix;
|
|
340
|
+
to.outputLen = outputLen;
|
|
341
|
+
to.enableXOF = enableXOF;
|
|
342
|
+
to.canXOF = this.canXOF;
|
|
343
|
+
to.destroyed = this.destroyed;
|
|
344
|
+
return to;
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
var genKeccak = (suffix, blockLen, outputLen, info = {}) => createHasher(() => new Keccak(blockLen, suffix, outputLen), info);
|
|
348
|
+
var sha3_256 = /* @__PURE__ */ genKeccak(
|
|
349
|
+
6,
|
|
350
|
+
136,
|
|
351
|
+
32,
|
|
352
|
+
/* @__PURE__ */ oidNist(8)
|
|
353
|
+
);
|
|
354
|
+
var sha3_512 = /* @__PURE__ */ genKeccak(
|
|
355
|
+
6,
|
|
356
|
+
72,
|
|
357
|
+
64,
|
|
358
|
+
/* @__PURE__ */ oidNist(10)
|
|
359
|
+
);
|
|
360
|
+
var genShake = (suffix, blockLen, outputLen, info = {}) => createHasher((opts2 = {}) => {
|
|
361
|
+
opts2 = checkOpts({}, opts2);
|
|
362
|
+
return new Keccak(blockLen, suffix, opts2.dkLen === void 0 ? outputLen : opts2.dkLen, true);
|
|
363
|
+
}, info);
|
|
364
|
+
var shake128 = /* @__PURE__ */ genShake(31, 168, 16, /* @__PURE__ */ oidNist(11));
|
|
365
|
+
var shake256 = /* @__PURE__ */ genShake(31, 136, 32, /* @__PURE__ */ oidNist(12));
|
|
366
|
+
|
|
367
|
+
// node_modules/@noble/curves/utils.js
|
|
368
|
+
function aobject2(value, title = "object") {
|
|
369
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
370
|
+
throw new TypeError(title === "object" ? "expected valid options object" : `"${title}" expected object, got type=${typeof value}`);
|
|
371
|
+
return value;
|
|
372
|
+
}
|
|
373
|
+
function validateObject(object, fields = {}, optFields = {}, title = "object") {
|
|
374
|
+
aobject2(object, title);
|
|
375
|
+
aobject2(fields, "fields");
|
|
376
|
+
aobject2(optFields, "optFields");
|
|
377
|
+
function checkField(fieldName, expectedType, isOpt) {
|
|
378
|
+
const label = title === "object" ? `param "${String(fieldName)}"` : `"${title}.${String(fieldName)}"`;
|
|
379
|
+
const val = object[fieldName];
|
|
380
|
+
if (!Object.hasOwn(object, fieldName) && (isOpt ? val !== void 0 : expectedType !== "function")) {
|
|
381
|
+
throw new TypeError(`${label} is invalid: expected own property`);
|
|
382
|
+
}
|
|
383
|
+
if (isOpt && val === void 0)
|
|
384
|
+
return;
|
|
385
|
+
const current = typeof val;
|
|
386
|
+
if (current !== expectedType || val === null)
|
|
387
|
+
throw new TypeError(`${label} is invalid: expected ${expectedType}, got ${current}`);
|
|
388
|
+
}
|
|
389
|
+
const iter = (f, isOpt) => Object.entries(f).forEach(([k, v]) => checkField(k, v, isOpt));
|
|
390
|
+
iter(fields, false);
|
|
391
|
+
iter(optFields, true);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// node_modules/@noble/curves/abstract/fft.js
|
|
395
|
+
function checkU32(n, title = "n") {
|
|
396
|
+
if (typeof n !== "number")
|
|
397
|
+
throw new TypeError(`wrong u32 integer "${title}": expected number, got type=${typeof n}`);
|
|
398
|
+
if (!Number.isSafeInteger(n) || n < 0 || n > 4294967295)
|
|
399
|
+
throw new RangeError(`wrong u32 integer "${title}": expected 0..4294967295, got ${n}`);
|
|
400
|
+
return n;
|
|
401
|
+
}
|
|
402
|
+
function isPowerOfTwo(x) {
|
|
403
|
+
checkU32(x, "x");
|
|
404
|
+
return (x & x - 1) === 0 && x !== 0;
|
|
405
|
+
}
|
|
406
|
+
function reverseBits(n, bits) {
|
|
407
|
+
checkU32(n);
|
|
408
|
+
if (typeof bits !== "number")
|
|
409
|
+
throw new TypeError('"bits" expected number, got type=' + typeof bits);
|
|
410
|
+
if (!Number.isSafeInteger(bits) || bits < 0 || bits > 32)
|
|
411
|
+
throw new Error(`expected integer 0 <= bits <= 32, got ${bits}`);
|
|
412
|
+
let reversed = 0;
|
|
413
|
+
for (let i = 0; i < bits; i++, n >>>= 1)
|
|
414
|
+
reversed = reversed << 1 | n & 1;
|
|
415
|
+
return reversed >>> 0;
|
|
416
|
+
}
|
|
417
|
+
function log2(n) {
|
|
418
|
+
checkU32(n);
|
|
419
|
+
return 31 - Math.clz32(n);
|
|
420
|
+
}
|
|
421
|
+
function bitReversalInplace(values) {
|
|
422
|
+
if (!values || typeof values !== "object" || typeof values.length !== "number")
|
|
423
|
+
throw new TypeError('"values" expected array-like, got type=' + typeof values);
|
|
424
|
+
const n = values.length;
|
|
425
|
+
if (!isPowerOfTwo(n))
|
|
426
|
+
throw new Error("expected positive power-of-two length, got " + n);
|
|
427
|
+
const bits = log2(n);
|
|
428
|
+
for (let i = 0; i < n; i++) {
|
|
429
|
+
const j = reverseBits(i, bits);
|
|
430
|
+
if (i < j) {
|
|
431
|
+
const tmp = values[i];
|
|
432
|
+
values[i] = values[j];
|
|
433
|
+
values[j] = tmp;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
return values;
|
|
437
|
+
}
|
|
438
|
+
var FFTCore = (F2, coreOpts) => {
|
|
439
|
+
validateObject(coreOpts, { N: "number", roots: "object", dit: "boolean" }, { invertButterflies: "boolean", skipStages: "number", brp: "boolean" }, "coreOpts");
|
|
440
|
+
const { N: N2, roots, dit, invertButterflies = false, skipStages = 0, brp = true } = coreOpts;
|
|
441
|
+
checkU32(N2, "coreOpts.N");
|
|
442
|
+
const bits = log2(N2);
|
|
443
|
+
if (!isPowerOfTwo(N2))
|
|
444
|
+
throw new Error("FFT: Polynomial size should be power of two");
|
|
445
|
+
checkU32(skipStages, "coreOpts.skipStages");
|
|
446
|
+
const maxSkipStages = bits === 0 ? 0 : bits - 1;
|
|
447
|
+
if (skipStages > maxSkipStages)
|
|
448
|
+
throw new Error(`FFT: wrong skipStages: expected 0 <= skipStages <= ${maxSkipStages}`);
|
|
449
|
+
if (roots.length !== N2)
|
|
450
|
+
throw new Error(`FFT: wrong roots length: expected ${N2}, got ${roots.length}`);
|
|
451
|
+
const isDit = dit !== invertButterflies;
|
|
452
|
+
return (values) => {
|
|
453
|
+
if (values.length !== N2)
|
|
454
|
+
throw new Error("FFT: wrong Polynomial length");
|
|
455
|
+
if (dit && brp)
|
|
456
|
+
bitReversalInplace(values);
|
|
457
|
+
for (let i = 0, g = 1; i < bits - skipStages; i++) {
|
|
458
|
+
const s = dit ? i + 1 + skipStages : bits - i;
|
|
459
|
+
const m = 1 << s;
|
|
460
|
+
const m2 = m >> 1;
|
|
461
|
+
const stride = N2 >> s;
|
|
462
|
+
for (let k = 0; k < N2; k += m) {
|
|
463
|
+
for (let j = 0, grp = g++; j < m2; j++) {
|
|
464
|
+
const rootPos = invertButterflies ? dit ? N2 - grp : grp : j * stride;
|
|
465
|
+
const i0 = k + j;
|
|
466
|
+
const i1 = k + j + m2;
|
|
467
|
+
const omega = roots[rootPos];
|
|
468
|
+
const b = values[i1];
|
|
469
|
+
const a = values[i0];
|
|
470
|
+
if (isDit) {
|
|
471
|
+
const t = F2.mul(b, omega);
|
|
472
|
+
values[i0] = F2.add(a, t);
|
|
473
|
+
values[i1] = F2.sub(a, t);
|
|
474
|
+
} else if (invertButterflies) {
|
|
475
|
+
values[i0] = F2.add(b, a);
|
|
476
|
+
values[i1] = F2.mul(F2.sub(b, a), omega);
|
|
477
|
+
} else {
|
|
478
|
+
values[i0] = F2.add(a, b);
|
|
479
|
+
values[i1] = F2.mul(F2.sub(a, b), omega);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (!dit && brp)
|
|
485
|
+
bitReversalInplace(values);
|
|
486
|
+
return values;
|
|
487
|
+
};
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
// node_modules/@noble/post-quantum/utils.js
|
|
491
|
+
var abytesDoc = abytes;
|
|
492
|
+
var randomBytes2 = randomBytes;
|
|
493
|
+
function aarray2(item, title, inner = () => {
|
|
494
|
+
}) {
|
|
495
|
+
if (!Array.isArray(item))
|
|
496
|
+
throw new TypeError(`"${title}" expected array, got type=${typeof item}`);
|
|
497
|
+
for (let i = 0; i < item.length; i++)
|
|
498
|
+
inner(item[i], `${title}[${i}]`);
|
|
499
|
+
return item;
|
|
500
|
+
}
|
|
501
|
+
function equalBytes(a, b) {
|
|
502
|
+
a = abytes(a);
|
|
503
|
+
b = abytes(b);
|
|
504
|
+
if (a.length !== b.length)
|
|
505
|
+
return false;
|
|
506
|
+
let diff = 0;
|
|
507
|
+
for (let i = 0; i < a.length; i++)
|
|
508
|
+
diff |= a[i] ^ b[i];
|
|
509
|
+
return diff === 0;
|
|
510
|
+
}
|
|
511
|
+
function copyBytes(bytes) {
|
|
512
|
+
return Uint8Array.from(abytes(bytes));
|
|
513
|
+
}
|
|
514
|
+
function splitCoder(label, ...lengths) {
|
|
515
|
+
const getLength = (c) => typeof c === "number" ? c : c.bytesLen;
|
|
516
|
+
const bytesLen = lengths.reduce((sum, a) => sum + getLength(a), 0);
|
|
517
|
+
return {
|
|
518
|
+
bytesLen,
|
|
519
|
+
encode: (bufs) => {
|
|
520
|
+
const res = new Uint8Array(bytesLen);
|
|
521
|
+
for (let i = 0, pos = 0; i < lengths.length; i++) {
|
|
522
|
+
const c = lengths[i];
|
|
523
|
+
const l = getLength(c);
|
|
524
|
+
const b = typeof c === "number" ? bufs[i] : c.encode(bufs[i]);
|
|
525
|
+
abytes(b, l, label);
|
|
526
|
+
res.set(b, pos);
|
|
527
|
+
if (typeof c !== "number")
|
|
528
|
+
b.fill(0);
|
|
529
|
+
pos += l;
|
|
530
|
+
}
|
|
531
|
+
return res;
|
|
532
|
+
},
|
|
533
|
+
decode: (buf) => {
|
|
534
|
+
abytes(buf, bytesLen, label);
|
|
535
|
+
const res = [];
|
|
536
|
+
for (const c of lengths) {
|
|
537
|
+
const l = getLength(c);
|
|
538
|
+
const b = buf.subarray(0, l);
|
|
539
|
+
res.push(typeof c === "number" ? b : c.decode(b));
|
|
540
|
+
buf = buf.subarray(l);
|
|
541
|
+
}
|
|
542
|
+
return res;
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
function vecCoder(c, vecLen) {
|
|
547
|
+
const coder = c;
|
|
548
|
+
const bytesLen = vecLen * coder.bytesLen;
|
|
549
|
+
return {
|
|
550
|
+
bytesLen,
|
|
551
|
+
encode: (u) => {
|
|
552
|
+
const uArr = aarray2(u, "u");
|
|
553
|
+
if (uArr.length !== vecLen)
|
|
554
|
+
throw new RangeError(`vecCoder.encode: wrong length=${uArr.length}. Expected: ${vecLen}`);
|
|
555
|
+
const res = new Uint8Array(bytesLen);
|
|
556
|
+
for (let i = 0, pos = 0; i < uArr.length; i++) {
|
|
557
|
+
const b = coder.encode(uArr[i]);
|
|
558
|
+
res.set(b, pos);
|
|
559
|
+
b.fill(0);
|
|
560
|
+
pos += b.length;
|
|
561
|
+
}
|
|
562
|
+
return res;
|
|
563
|
+
},
|
|
564
|
+
decode: (a) => {
|
|
565
|
+
abytes(a, bytesLen);
|
|
566
|
+
const r = [];
|
|
567
|
+
for (let i = 0; i < a.length; i += coder.bytesLen)
|
|
568
|
+
r.push(coder.decode(a.subarray(i, i + coder.bytesLen)));
|
|
569
|
+
return r;
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
function cleanBytes(...list) {
|
|
574
|
+
for (const t of list) {
|
|
575
|
+
if (Array.isArray(t))
|
|
576
|
+
for (const b of t)
|
|
577
|
+
b.fill(0);
|
|
578
|
+
else
|
|
579
|
+
t.fill(0);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
function getMask(bits) {
|
|
583
|
+
anumber(bits, "bits");
|
|
584
|
+
if (bits > 32)
|
|
585
|
+
throw new RangeError('"bits" expected <= 32, got ' + bits);
|
|
586
|
+
return bits === 32 ? 4294967295 : ~(-1 << bits) >>> 0;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
// node_modules/@noble/post-quantum/_crystals.js
|
|
590
|
+
var genCrystals = (opts2) => {
|
|
591
|
+
const { newPoly, N: N2, Q: Q2, F: F2, ROOT_OF_UNITY: ROOT_OF_UNITY2, brvBits, isKyber } = opts2;
|
|
592
|
+
const mod = (a, modulo = Q2) => {
|
|
593
|
+
const result = a % modulo | 0;
|
|
594
|
+
return (result >= 0 ? result | 0 : modulo + result | 0) | 0;
|
|
595
|
+
};
|
|
596
|
+
const smod = (a, modulo = Q2) => {
|
|
597
|
+
const r = mod(a, modulo) | 0;
|
|
598
|
+
return (r > modulo >> 1 ? r - modulo | 0 : r) | 0;
|
|
599
|
+
};
|
|
600
|
+
function getZettas() {
|
|
601
|
+
const out = newPoly(N2);
|
|
602
|
+
for (let i = 0; i < N2; i++) {
|
|
603
|
+
const b = reverseBits(i, brvBits);
|
|
604
|
+
const p = BigInt(ROOT_OF_UNITY2) ** BigInt(b) % BigInt(Q2);
|
|
605
|
+
out[i] = Number(p) | 0;
|
|
606
|
+
}
|
|
607
|
+
return out;
|
|
608
|
+
}
|
|
609
|
+
const nttZetas = getZettas();
|
|
610
|
+
const inv = (_a) => {
|
|
611
|
+
throw new Error("not implemented");
|
|
612
|
+
};
|
|
613
|
+
const field = isKyber ? {
|
|
614
|
+
add: (a, b) => {
|
|
615
|
+
const r = a + b | 0;
|
|
616
|
+
return r >= Q2 ? r - Q2 | 0 : r;
|
|
617
|
+
},
|
|
618
|
+
sub: (a, b) => {
|
|
619
|
+
const r = a - b | 0;
|
|
620
|
+
return r < 0 ? r + Q2 | 0 : r;
|
|
621
|
+
},
|
|
622
|
+
mul: (a, b) => mod((a | 0) * (b | 0)) | 0,
|
|
623
|
+
inv
|
|
624
|
+
} : {
|
|
625
|
+
add: (a, b) => mod((a | 0) + (b | 0)) | 0,
|
|
626
|
+
sub: (a, b) => mod((a | 0) - (b | 0)) | 0,
|
|
627
|
+
mul: (a, b) => mod((a | 0) * (b | 0)) | 0,
|
|
628
|
+
inv
|
|
629
|
+
};
|
|
630
|
+
const nttOpts = {
|
|
631
|
+
N: N2,
|
|
632
|
+
roots: nttZetas,
|
|
633
|
+
invertButterflies: true,
|
|
634
|
+
skipStages: isKyber ? 1 : 0,
|
|
635
|
+
brp: false
|
|
636
|
+
};
|
|
637
|
+
const dif = FFTCore(field, { dit: false, ...nttOpts });
|
|
638
|
+
const dit = FFTCore(field, { dit: true, ...nttOpts });
|
|
639
|
+
const NTT = {
|
|
640
|
+
encode: (r) => {
|
|
641
|
+
return dif(r);
|
|
642
|
+
},
|
|
643
|
+
decode: (r) => {
|
|
644
|
+
dit(r);
|
|
645
|
+
for (let i = 0; i < r.length; i++)
|
|
646
|
+
r[i] = mod(F2 * r[i]);
|
|
647
|
+
return r;
|
|
648
|
+
}
|
|
649
|
+
};
|
|
650
|
+
const bitsCoder = (d, c) => {
|
|
651
|
+
for (let i = 0, bufLen = 0; i < N2; i++) {
|
|
652
|
+
bufLen += d;
|
|
653
|
+
if (bufLen > 32)
|
|
654
|
+
getMask(bufLen);
|
|
655
|
+
bufLen %= 8;
|
|
656
|
+
}
|
|
657
|
+
const mask = getMask(d);
|
|
658
|
+
const bytesLen = d * (N2 / 8);
|
|
659
|
+
return {
|
|
660
|
+
bytesLen,
|
|
661
|
+
encode: (poly_) => {
|
|
662
|
+
const poly = poly_;
|
|
663
|
+
const r = new Uint8Array(bytesLen);
|
|
664
|
+
for (let i = 0, buf = 0, bufLen = 0, pos = 0; i < poly.length; i++) {
|
|
665
|
+
buf |= (c.encode(poly[i]) & mask) << bufLen;
|
|
666
|
+
bufLen += d;
|
|
667
|
+
for (; bufLen >= 8; bufLen -= 8, buf >>= 8)
|
|
668
|
+
r[pos++] = buf & 255;
|
|
669
|
+
}
|
|
670
|
+
return r;
|
|
671
|
+
},
|
|
672
|
+
decode: (bytes) => {
|
|
673
|
+
const r = newPoly(N2);
|
|
674
|
+
for (let i = 0, buf = 0, bufLen = 0, pos = 0; i < bytes.length; i++) {
|
|
675
|
+
buf |= bytes[i] << bufLen;
|
|
676
|
+
bufLen += 8;
|
|
677
|
+
for (; bufLen >= d; bufLen -= d, buf >>= d)
|
|
678
|
+
r[pos++] = c.decode(buf & mask);
|
|
679
|
+
}
|
|
680
|
+
return r;
|
|
681
|
+
}
|
|
682
|
+
};
|
|
683
|
+
};
|
|
684
|
+
return {
|
|
685
|
+
mod,
|
|
686
|
+
smod,
|
|
687
|
+
nttZetas,
|
|
688
|
+
NTT: {
|
|
689
|
+
encode: (r) => NTT.encode(r),
|
|
690
|
+
decode: (r) => NTT.decode(r)
|
|
691
|
+
},
|
|
692
|
+
bitsCoder
|
|
693
|
+
};
|
|
694
|
+
};
|
|
695
|
+
var createXofShake = (shake) => (seed, blockLen) => {
|
|
696
|
+
if (!blockLen)
|
|
697
|
+
blockLen = shake.blockLen;
|
|
698
|
+
const _seed = new Uint8Array(seed.length + 2);
|
|
699
|
+
_seed.set(seed);
|
|
700
|
+
const seedLen = seed.length;
|
|
701
|
+
const buf = new Uint8Array(blockLen);
|
|
702
|
+
let h = shake.create({});
|
|
703
|
+
let calls = 0;
|
|
704
|
+
let xofs = 0;
|
|
705
|
+
return {
|
|
706
|
+
stats: () => ({ calls, xofs }),
|
|
707
|
+
get: (x, y) => {
|
|
708
|
+
_seed[seedLen + 0] = x;
|
|
709
|
+
_seed[seedLen + 1] = y;
|
|
710
|
+
h.destroy();
|
|
711
|
+
h = shake.create({}).update(_seed);
|
|
712
|
+
calls++;
|
|
713
|
+
return () => {
|
|
714
|
+
xofs++;
|
|
715
|
+
return h.xofInto(buf);
|
|
716
|
+
};
|
|
717
|
+
},
|
|
718
|
+
clean: () => {
|
|
719
|
+
h.destroy();
|
|
720
|
+
cleanBytes(buf, _seed);
|
|
721
|
+
}
|
|
722
|
+
};
|
|
723
|
+
};
|
|
724
|
+
var XOF128 = /* @__PURE__ */ createXofShake(shake128);
|
|
725
|
+
|
|
726
|
+
// node_modules/@noble/post-quantum/ml-kem.js
|
|
727
|
+
var N = 256;
|
|
728
|
+
var Q = 3329;
|
|
729
|
+
var F = 3303;
|
|
730
|
+
var ROOT_OF_UNITY = 17;
|
|
731
|
+
var crystals = /* @__PURE__ */ genCrystals({
|
|
732
|
+
N,
|
|
733
|
+
Q,
|
|
734
|
+
F,
|
|
735
|
+
ROOT_OF_UNITY,
|
|
736
|
+
newPoly: (n) => new Uint16Array(n),
|
|
737
|
+
brvBits: 7,
|
|
738
|
+
isKyber: true
|
|
739
|
+
});
|
|
740
|
+
var PARAMS = /* @__PURE__ */ (() => Object.freeze({
|
|
741
|
+
512: Object.freeze({ N, Q, K: 2, ETA1: 3, ETA2: 2, du: 10, dv: 4, RBGstrength: 128 }),
|
|
742
|
+
768: Object.freeze({ N, Q, K: 3, ETA1: 2, ETA2: 2, du: 10, dv: 4, RBGstrength: 192 }),
|
|
743
|
+
1024: Object.freeze({ N, Q, K: 4, ETA1: 2, ETA2: 2, du: 11, dv: 5, RBGstrength: 256 })
|
|
744
|
+
}))();
|
|
745
|
+
var compress = (d) => {
|
|
746
|
+
if (d >= 12)
|
|
747
|
+
return { encode: (i) => i, decode: (i) => i >= Q ? i - Q : i };
|
|
748
|
+
const a = 2 ** (d - 1);
|
|
749
|
+
return {
|
|
750
|
+
// This only matches standalone Compress_d after bitsCoder masks the result into Z_(2^d).
|
|
751
|
+
encode: (i) => ((i << d) + Q / 2) / Q,
|
|
752
|
+
// const decompress = (i: number) => round((Q / 2 ** d) * i);
|
|
753
|
+
decode: (i) => i * Q + a >>> d
|
|
754
|
+
};
|
|
755
|
+
};
|
|
756
|
+
var byteCoder = (d) => crystals.bitsCoder(d, d === 12 ? { encode: (i) => i, decode: (i) => i >= Q ? i - Q : i } : { encode: (i) => i, decode: (i) => i });
|
|
757
|
+
var polyCoder = (d) => d === 12 ? byteCoder(12) : crystals.bitsCoder(d, compress(d));
|
|
758
|
+
function polyAdd(a_, b_) {
|
|
759
|
+
const a = a_;
|
|
760
|
+
const b = b_;
|
|
761
|
+
for (let i = 0; i < N; i++) {
|
|
762
|
+
const r = a[i] + b[i];
|
|
763
|
+
a[i] = r >= Q ? r - Q : r;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
function polySub(a_, b_) {
|
|
767
|
+
const a = a_;
|
|
768
|
+
const b = b_;
|
|
769
|
+
for (let i = 0; i < N; i++) {
|
|
770
|
+
const r = a[i] - b[i];
|
|
771
|
+
a[i] = r < 0 ? r + Q : r;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
function BaseCaseMultiply(a0, a1, b0, b1, zeta) {
|
|
775
|
+
const c0 = crystals.mod(crystals.mod(a1 * b1) * zeta + a0 * b0);
|
|
776
|
+
const c1 = crystals.mod(a0 * b1 + a1 * b0);
|
|
777
|
+
return { c0, c1 };
|
|
778
|
+
}
|
|
779
|
+
function MultiplyNTTs(f_, g_) {
|
|
780
|
+
const f = f_;
|
|
781
|
+
const g = g_;
|
|
782
|
+
for (let i = 0; i < N / 2; i++) {
|
|
783
|
+
let z = crystals.nttZetas[64 + (i >> 1)];
|
|
784
|
+
if (i & 1)
|
|
785
|
+
z = -z;
|
|
786
|
+
const { c0, c1 } = BaseCaseMultiply(f[2 * i + 0], f[2 * i + 1], g[2 * i + 0], g[2 * i + 1], z);
|
|
787
|
+
f[2 * i + 0] = c0;
|
|
788
|
+
f[2 * i + 1] = c1;
|
|
789
|
+
}
|
|
790
|
+
return f;
|
|
791
|
+
}
|
|
792
|
+
function SampleNTT(xof_) {
|
|
793
|
+
const xof = xof_;
|
|
794
|
+
const r = new Uint16Array(N);
|
|
795
|
+
for (let j = 0; j < N; ) {
|
|
796
|
+
const b = xof();
|
|
797
|
+
if (b.length % 3)
|
|
798
|
+
throw new Error("SampleNTT: unaligned block");
|
|
799
|
+
for (let i = 0; j < N && i + 3 <= b.length; i += 3) {
|
|
800
|
+
const d1 = (b[i + 0] >> 0 | b[i + 1] << 8) & 4095;
|
|
801
|
+
const d2 = (b[i + 1] >> 4 | b[i + 2] << 4) & 4095;
|
|
802
|
+
if (d1 < Q)
|
|
803
|
+
r[j++] = d1;
|
|
804
|
+
if (j < N && d2 < Q)
|
|
805
|
+
r[j++] = d2;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
return r;
|
|
809
|
+
}
|
|
810
|
+
var sampleCBDBytes = (buf, eta) => {
|
|
811
|
+
const r = new Uint16Array(N);
|
|
812
|
+
const b32 = u32(buf);
|
|
813
|
+
swap32IfBE(b32);
|
|
814
|
+
let len = 0;
|
|
815
|
+
for (let i = 0, p = 0, bb = 0, t0 = 0; i < b32.length; i++) {
|
|
816
|
+
let b = b32[i];
|
|
817
|
+
for (let j = 0; j < 32; j++) {
|
|
818
|
+
bb += b & 1;
|
|
819
|
+
b >>= 1;
|
|
820
|
+
len += 1;
|
|
821
|
+
if (len === eta) {
|
|
822
|
+
t0 = bb;
|
|
823
|
+
bb = 0;
|
|
824
|
+
} else if (len === 2 * eta) {
|
|
825
|
+
r[p++] = crystals.mod(t0 - bb);
|
|
826
|
+
bb = 0;
|
|
827
|
+
len = 0;
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
swap32IfBE(b32);
|
|
832
|
+
if (len)
|
|
833
|
+
throw new Error(`sampleCBD: leftover bits: ${len}`);
|
|
834
|
+
return r;
|
|
835
|
+
};
|
|
836
|
+
function sampleCBD(PRF_, seed, nonce, eta) {
|
|
837
|
+
const PRF = PRF_;
|
|
838
|
+
return sampleCBDBytes(PRF(eta * N / 4, seed, nonce), eta);
|
|
839
|
+
}
|
|
840
|
+
var genKPKE = (opts_) => {
|
|
841
|
+
const opts2 = opts_;
|
|
842
|
+
const { K, PRF, XOF, HASH512, ETA1, ETA2, du, dv } = opts2;
|
|
843
|
+
const poly1 = polyCoder(1);
|
|
844
|
+
const polyV = polyCoder(dv);
|
|
845
|
+
const polyU = polyCoder(du);
|
|
846
|
+
const publicCoder = splitCoder("publicKey", vecCoder(polyCoder(12), K), 32);
|
|
847
|
+
const secretCoder = vecCoder(polyCoder(12), K);
|
|
848
|
+
const cipherCoder = splitCoder("ciphertext", vecCoder(polyU, K), polyV);
|
|
849
|
+
const seedCoder = splitCoder("seed", 32, 32);
|
|
850
|
+
const encryptCore = (tHat, getA, msg, seed) => {
|
|
851
|
+
const rHat = [];
|
|
852
|
+
for (let i = 0; i < K; i++)
|
|
853
|
+
rHat.push(crystals.NTT.encode(sampleCBD(PRF, seed, i, ETA1)));
|
|
854
|
+
const tmp2 = new Uint16Array(N);
|
|
855
|
+
const u = [];
|
|
856
|
+
for (let i = 0; i < K; i++) {
|
|
857
|
+
const e1 = sampleCBD(PRF, seed, K + i, ETA2);
|
|
858
|
+
const tmp = new Uint16Array(N);
|
|
859
|
+
for (let j = 0; j < K; j++) {
|
|
860
|
+
const aij = getA(i, j);
|
|
861
|
+
polyAdd(tmp, MultiplyNTTs(aij, rHat[j]));
|
|
862
|
+
}
|
|
863
|
+
polyAdd(e1, crystals.NTT.decode(tmp));
|
|
864
|
+
u.push(e1);
|
|
865
|
+
polyAdd(tmp2, MultiplyNTTs(tHat[i], rHat[i]));
|
|
866
|
+
cleanBytes(tmp);
|
|
867
|
+
}
|
|
868
|
+
const e2 = sampleCBD(PRF, seed, 2 * K, ETA2);
|
|
869
|
+
polyAdd(e2, crystals.NTT.decode(tmp2));
|
|
870
|
+
const v = poly1.decode(msg);
|
|
871
|
+
polyAdd(v, e2);
|
|
872
|
+
cleanBytes(tHat, rHat, tmp2, e2);
|
|
873
|
+
return cipherCoder.encode([u, v]);
|
|
874
|
+
};
|
|
875
|
+
return {
|
|
876
|
+
secretCoder,
|
|
877
|
+
lengths: {
|
|
878
|
+
secretKey: secretCoder.bytesLen,
|
|
879
|
+
publicKey: publicCoder.bytesLen,
|
|
880
|
+
cipherText: cipherCoder.bytesLen
|
|
881
|
+
},
|
|
882
|
+
keygen: (seed) => {
|
|
883
|
+
abytesDoc(seed, 32, "seed");
|
|
884
|
+
const seedDst = new Uint8Array(33);
|
|
885
|
+
seedDst.set(seed);
|
|
886
|
+
seedDst[32] = K;
|
|
887
|
+
const seedHash = HASH512(seedDst);
|
|
888
|
+
const [rho, sigma] = seedCoder.decode(seedHash);
|
|
889
|
+
const sHat = [];
|
|
890
|
+
const tHat = [];
|
|
891
|
+
for (let i = 0; i < K; i++)
|
|
892
|
+
sHat.push(crystals.NTT.encode(sampleCBD(PRF, sigma, i, ETA1)));
|
|
893
|
+
const x = XOF(rho);
|
|
894
|
+
for (let i = 0; i < K; i++) {
|
|
895
|
+
const e = crystals.NTT.encode(sampleCBD(PRF, sigma, K + i, ETA1));
|
|
896
|
+
for (let j = 0; j < K; j++) {
|
|
897
|
+
const aji = SampleNTT(x.get(j, i));
|
|
898
|
+
polyAdd(e, MultiplyNTTs(aji, sHat[j]));
|
|
899
|
+
}
|
|
900
|
+
tHat.push(e);
|
|
901
|
+
}
|
|
902
|
+
x.clean();
|
|
903
|
+
const res = {
|
|
904
|
+
publicKey: publicCoder.encode([tHat, rho]),
|
|
905
|
+
secretKey: secretCoder.encode(sHat)
|
|
906
|
+
};
|
|
907
|
+
cleanBytes(rho, sigma, sHat, tHat, seedDst, seedHash);
|
|
908
|
+
return res;
|
|
909
|
+
},
|
|
910
|
+
encrypt: (publicKey, msg, seed) => {
|
|
911
|
+
const [tHat, rho] = publicCoder.decode(publicKey);
|
|
912
|
+
const x = XOF(rho);
|
|
913
|
+
const res = encryptCore(tHat, (i, j) => SampleNTT(x.get(i, j)), msg, seed);
|
|
914
|
+
x.clean();
|
|
915
|
+
return res;
|
|
916
|
+
},
|
|
917
|
+
// Expands the full  matrix (public data derived from rho) once, so repeated encryptions
|
|
918
|
+
// against the same ek skip the K² SampleNTT XOF expansions. Cached polys are copied per
|
|
919
|
+
// call because encryptCore mutates its inputs in place.
|
|
920
|
+
prepare: (publicKey) => {
|
|
921
|
+
const [tHat, rho] = publicCoder.decode(publicKey);
|
|
922
|
+
const x = XOF(rho);
|
|
923
|
+
const A = [];
|
|
924
|
+
for (let i = 0; i < K; i++)
|
|
925
|
+
for (let j = 0; j < K; j++)
|
|
926
|
+
A.push(SampleNTT(x.get(i, j)));
|
|
927
|
+
x.clean();
|
|
928
|
+
return {
|
|
929
|
+
encrypt: (msg, seed) => encryptCore(tHat.map((p) => p.slice()), (i, j) => A[i * K + j].slice(), msg, seed),
|
|
930
|
+
clean: () => cleanBytes(tHat, A)
|
|
931
|
+
};
|
|
932
|
+
},
|
|
933
|
+
decrypt: (cipherText, privateKey) => {
|
|
934
|
+
const [u, v] = cipherCoder.decode(cipherText);
|
|
935
|
+
const sk = secretCoder.decode(privateKey);
|
|
936
|
+
const tmp = new Uint16Array(N);
|
|
937
|
+
for (let i = 0; i < K; i++)
|
|
938
|
+
polyAdd(tmp, MultiplyNTTs(sk[i], crystals.NTT.encode(u[i])));
|
|
939
|
+
polySub(v, crystals.NTT.decode(tmp));
|
|
940
|
+
cleanBytes(tmp, sk, u);
|
|
941
|
+
return poly1.encode(v);
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
};
|
|
945
|
+
function createKyber(opts2) {
|
|
946
|
+
const rawOpts = opts2;
|
|
947
|
+
const KPKE = genKPKE(rawOpts);
|
|
948
|
+
const { HASH256, HASH512, KDF } = rawOpts;
|
|
949
|
+
const { secretCoder: KPKESecretCoder, lengths } = KPKE;
|
|
950
|
+
const secretCoder = splitCoder("secretKey", lengths.secretKey, lengths.publicKey, 32, 32);
|
|
951
|
+
const msgLen = 32;
|
|
952
|
+
const seedLen = 64;
|
|
953
|
+
const validateModulus = (publicKey, fn) => {
|
|
954
|
+
const eke = publicKey.subarray(0, 384 * rawOpts.K);
|
|
955
|
+
const ek = KPKESecretCoder.encode(KPKESecretCoder.decode(copyBytes(eke)));
|
|
956
|
+
const ok = equalBytes(ek, eke);
|
|
957
|
+
cleanBytes(ek);
|
|
958
|
+
if (!ok)
|
|
959
|
+
throw new Error(`ML-KEM.${fn}: wrong publicKey modulus`);
|
|
960
|
+
};
|
|
961
|
+
const kemLengths = Object.freeze({
|
|
962
|
+
...lengths,
|
|
963
|
+
seed: 64,
|
|
964
|
+
msg: msgLen,
|
|
965
|
+
msgRand: msgLen,
|
|
966
|
+
secretKey: secretCoder.bytesLen
|
|
967
|
+
});
|
|
968
|
+
return Object.freeze({
|
|
969
|
+
info: Object.freeze({ type: "ml-kem" }),
|
|
970
|
+
lengths: kemLengths,
|
|
971
|
+
keygen: (seed = randomBytes2(seedLen)) => {
|
|
972
|
+
abytesDoc(seed, seedLen, "seed");
|
|
973
|
+
const { publicKey, secretKey: sk } = KPKE.keygen(seed.subarray(0, 32));
|
|
974
|
+
const publicKeyHash = HASH256(publicKey);
|
|
975
|
+
const secretKey = secretCoder.encode([sk, publicKey, publicKeyHash, seed.subarray(32)]);
|
|
976
|
+
cleanBytes(sk, publicKeyHash);
|
|
977
|
+
return {
|
|
978
|
+
publicKey,
|
|
979
|
+
secretKey
|
|
980
|
+
};
|
|
981
|
+
},
|
|
982
|
+
getPublicKey: (secretKey) => {
|
|
983
|
+
const [_sk, publicKey, _publicKeyHash, _z] = secretCoder.decode(secretKey);
|
|
984
|
+
return Uint8Array.from(publicKey);
|
|
985
|
+
},
|
|
986
|
+
encapsulate: (publicKey, msg = randomBytes2(msgLen)) => {
|
|
987
|
+
abytesDoc(publicKey, lengths.publicKey, "publicKey");
|
|
988
|
+
abytesDoc(msg, msgLen, "message");
|
|
989
|
+
validateModulus(publicKey, "encapsulate");
|
|
990
|
+
const kr = HASH512.create().update(msg).update(HASH256(publicKey)).digest();
|
|
991
|
+
const cipherText = KPKE.encrypt(publicKey, msg, kr.subarray(32, 64));
|
|
992
|
+
cleanBytes(kr.subarray(32));
|
|
993
|
+
return {
|
|
994
|
+
cipherText,
|
|
995
|
+
sharedSecret: kr.subarray(0, 32)
|
|
996
|
+
};
|
|
997
|
+
},
|
|
998
|
+
decapsulate: (cipherText, secretKey) => {
|
|
999
|
+
abytesDoc(secretKey, secretCoder.bytesLen, "secretKey");
|
|
1000
|
+
abytesDoc(cipherText, lengths.cipherText, "cipherText");
|
|
1001
|
+
const k768 = secretCoder.bytesLen - 96;
|
|
1002
|
+
const start = k768 + 32;
|
|
1003
|
+
const test = HASH256(secretKey.subarray(k768 / 2, start));
|
|
1004
|
+
if (!equalBytes(test, secretKey.subarray(start, start + 32)))
|
|
1005
|
+
throw new Error("invalid secretKey: hash check failed");
|
|
1006
|
+
const [sk, publicKey, publicKeyHash, z] = secretCoder.decode(secretKey);
|
|
1007
|
+
const msg = KPKE.decrypt(cipherText, sk);
|
|
1008
|
+
const kr = HASH512.create().update(msg).update(publicKeyHash).digest();
|
|
1009
|
+
const Khat = kr.subarray(0, 32);
|
|
1010
|
+
const cipherText2 = KPKE.encrypt(publicKey, msg, kr.subarray(32, 64));
|
|
1011
|
+
const isValid = equalBytes(cipherText, cipherText2);
|
|
1012
|
+
const Kbar = KDF.create({ dkLen: 32 }).update(z).update(cipherText).digest();
|
|
1013
|
+
cleanBytes(msg, cipherText2, kr.subarray(32), !isValid ? Khat : Kbar);
|
|
1014
|
+
return isValid ? Khat : Kbar;
|
|
1015
|
+
},
|
|
1016
|
+
/**
|
|
1017
|
+
* Experimental prototype: pre-expand a public key so repeated encapsulate/decapsulate
|
|
1018
|
+
* against the same key skip re-validation, H(ek), t̂ decoding and the K² SampleNTT
|
|
1019
|
+
* XOF expansions of Â. Only public data is cached; see {@link KEMPrepared}.
|
|
1020
|
+
*/
|
|
1021
|
+
prepare: (publicKey) => {
|
|
1022
|
+
abytesDoc(publicKey, lengths.publicKey, "publicKey");
|
|
1023
|
+
validateModulus(publicKey, "prepare");
|
|
1024
|
+
const ek = copyBytes(publicKey);
|
|
1025
|
+
const publicKeyHash = HASH256(ek);
|
|
1026
|
+
const cached = KPKE.prepare(ek);
|
|
1027
|
+
return Object.freeze({
|
|
1028
|
+
publicKey: ek,
|
|
1029
|
+
encapsulate: (msg = randomBytes2(msgLen)) => {
|
|
1030
|
+
abytesDoc(msg, msgLen, "message");
|
|
1031
|
+
const kr = HASH512.create().update(msg).update(publicKeyHash).digest();
|
|
1032
|
+
const cipherText = cached.encrypt(msg, kr.subarray(32, 64));
|
|
1033
|
+
cleanBytes(kr.subarray(32));
|
|
1034
|
+
return {
|
|
1035
|
+
cipherText,
|
|
1036
|
+
sharedSecret: kr.subarray(0, 32)
|
|
1037
|
+
};
|
|
1038
|
+
},
|
|
1039
|
+
decapsulate: (cipherText, secretKey) => {
|
|
1040
|
+
abytesDoc(secretKey, secretCoder.bytesLen, "secretKey");
|
|
1041
|
+
abytesDoc(cipherText, lengths.cipherText, "cipherText");
|
|
1042
|
+
const [sk, ekEmbedded, storedHash, z] = secretCoder.decode(secretKey);
|
|
1043
|
+
if (!equalBytes(ekEmbedded, ek) || !equalBytes(storedHash, publicKeyHash))
|
|
1044
|
+
throw new Error("ML-KEM.decapsulate: secretKey does not match prepared publicKey");
|
|
1045
|
+
const msg = KPKE.decrypt(cipherText, sk);
|
|
1046
|
+
const kr = HASH512.create().update(msg).update(publicKeyHash).digest();
|
|
1047
|
+
const Khat = kr.subarray(0, 32);
|
|
1048
|
+
const cipherText2 = cached.encrypt(msg, kr.subarray(32, 64));
|
|
1049
|
+
const isValid = equalBytes(cipherText, cipherText2);
|
|
1050
|
+
const Kbar = KDF.create({ dkLen: 32 }).update(z).update(cipherText).digest();
|
|
1051
|
+
cleanBytes(msg, cipherText2, kr.subarray(32), !isValid ? Khat : Kbar);
|
|
1052
|
+
return isValid ? Khat : Kbar;
|
|
1053
|
+
},
|
|
1054
|
+
clean: cached.clean
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
function shakePRF(dkLen, key, nonce) {
|
|
1060
|
+
return shake256.create({ dkLen }).update(key).update(new Uint8Array([nonce])).digest();
|
|
1061
|
+
}
|
|
1062
|
+
var opts = /* @__PURE__ */ (() => ({
|
|
1063
|
+
HASH256: sha3_256,
|
|
1064
|
+
HASH512: sha3_512,
|
|
1065
|
+
KDF: shake256,
|
|
1066
|
+
XOF: XOF128,
|
|
1067
|
+
PRF: shakePRF
|
|
1068
|
+
}))();
|
|
1069
|
+
var mk = (params) => createKyber({
|
|
1070
|
+
...opts,
|
|
1071
|
+
...params
|
|
1072
|
+
});
|
|
1073
|
+
var ml_kem512 = /* @__PURE__ */ (() => mk(PARAMS[512]))();
|
|
1074
|
+
var ml_kem768 = /* @__PURE__ */ (() => mk(PARAMS[768]))();
|
|
1075
|
+
var ml_kem1024 = /* @__PURE__ */ (() => mk(PARAMS[1024]))();
|
|
1076
|
+
export {
|
|
1077
|
+
ml_kem1024,
|
|
1078
|
+
ml_kem512,
|
|
1079
|
+
ml_kem768
|
|
1080
|
+
};
|
|
1081
|
+
/*! Bundled license information:
|
|
1082
|
+
|
|
1083
|
+
@noble/curves/utils.js:
|
|
1084
|
+
(*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) *)
|
|
1085
|
+
|
|
1086
|
+
@noble/post-quantum/utils.js:
|
|
1087
|
+
@noble/post-quantum/_crystals.js:
|
|
1088
|
+
@noble/post-quantum/ml-kem.js:
|
|
1089
|
+
(*! noble-post-quantum - MIT License (c) 2024 Paul Miller (paulmillr.com) *)
|
|
1090
|
+
*/
|