@noble/post-quantum 0.5.4 → 0.6.1

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/utils.js CHANGED
@@ -3,11 +3,59 @@
3
3
  * @module
4
4
  */
5
5
  /*! noble-post-quantum - MIT License (c) 2024 Paul Miller (paulmillr.com) */
6
- import { abytes, abytes as abytes_, concatBytes, isBytes, randomBytes as randb, } from '@noble/hashes/utils.js';
7
- export { abytes } from '@noble/hashes/utils.js';
8
- export { concatBytes };
6
+ import { abytes, abytes as abytes_, concatBytes, isLE, randomBytes as randb, } from '@noble/hashes/utils.js';
7
+ /**
8
+ * Asserts that a value is a byte array and optionally checks its length.
9
+ * Returns the original reference unchanged on success, and currently also accepts Node `Buffer`
10
+ * values through the upstream validator.
11
+ * This helper throws on malformed input, so APIs that must return `false` need to guard lengths
12
+ * before decoding or before calling it.
13
+ * @example
14
+ * Validate that a value is a byte array with the expected length.
15
+ * ```ts
16
+ * abytes(new Uint8Array([1]), 1);
17
+ * ```
18
+ */
19
+ const abytesDoc = abytes;
20
+ export { abytesDoc as abytes };
21
+ /**
22
+ * Concatenates byte arrays into a new `Uint8Array`.
23
+ * Zero arguments return an empty `Uint8Array`.
24
+ * Invalid segments throw before allocation because each argument is validated first.
25
+ * @example
26
+ * Concatenate two byte arrays into one result.
27
+ * ```ts
28
+ * concatBytes(new Uint8Array([1]), new Uint8Array([2]));
29
+ * ```
30
+ */
31
+ const concatBytesDoc = concatBytes;
32
+ export { concatBytesDoc as concatBytes };
33
+ /**
34
+ * Returns cryptographically secure random bytes.
35
+ * Requires `globalThis.crypto.getRandomValues` and throws if that API is unavailable.
36
+ * `bytesLength` is validated by the upstream helper as a non-negative integer before allocation,
37
+ * so negative and fractional values both throw instead of truncating through JS `ToIndex`.
38
+ * @param bytesLength - Number of random bytes to generate.
39
+ * @returns Fresh random bytes.
40
+ * @example
41
+ * Generate a fresh random seed.
42
+ * ```ts
43
+ * const seed = randomBytes(4);
44
+ * ```
45
+ */
9
46
  export const randomBytes = randb;
10
- // Compares 2 u8a-s in kinda constant time
47
+ /**
48
+ * Compares two byte arrays in a length-constant way for equal lengths.
49
+ * Unequal lengths return `false` immediately, and there is no runtime type validation.
50
+ * @param a - First byte array.
51
+ * @param b - Second byte array.
52
+ * @returns Whether both arrays contain the same bytes.
53
+ * @example
54
+ * Compare two byte arrays for equality.
55
+ * ```ts
56
+ * equalBytes(new Uint8Array([1]), new Uint8Array([1]));
57
+ * ```
58
+ */
11
59
  export function equalBytes(a, b) {
12
60
  if (a.length !== b.length)
13
61
  return false;
@@ -16,27 +64,133 @@ export function equalBytes(a, b) {
16
64
  diff |= a[i] ^ b[i];
17
65
  return diff === 0;
18
66
  }
19
- // copy bytes to new u8a (aligned). Because Buffer.slice is broken.
67
+ /**
68
+ * Copies bytes into a fresh `Uint8Array`.
69
+ * Returns a detached plain `Uint8Array` after validating that the input is real bytes.
70
+ * @param bytes - Source bytes.
71
+ * @returns Copy of the input bytes.
72
+ * @example
73
+ * Copy bytes into a fresh array.
74
+ * ```ts
75
+ * copyBytes(new Uint8Array([1, 2]));
76
+ * ```
77
+ */
20
78
  export function copyBytes(bytes) {
21
- return Uint8Array.from(bytes);
79
+ // `Uint8Array.from(...)` would also accept arrays / other typed arrays. Keep this helper strict
80
+ // because callers use it at byte-validation boundaries before mutating the detached copy.
81
+ return Uint8Array.from(abytes(bytes));
82
+ }
83
+ /**
84
+ * Byte-swaps each 64-bit lane in place.
85
+ * Falcon's exact binary64 tables are stored as little-endian byte payloads, so BE runtimes need
86
+ * this boundary helper before aliasing them as host `Float64Array` lanes.
87
+ * @param arr - Byte buffer whose length is a multiple of 8.
88
+ * @returns The same buffer after in-place 64-bit lane byte swaps.
89
+ * @example
90
+ * Byte-swap one 64-bit lane in place.
91
+ * ```ts
92
+ * byteSwap64(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]));
93
+ * ```
94
+ */
95
+ export function byteSwap64(arr) {
96
+ const bytes = new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);
97
+ for (let i = 0; i < bytes.length; i += 8) {
98
+ const a0 = bytes[i + 0];
99
+ const a1 = bytes[i + 1];
100
+ const a2 = bytes[i + 2];
101
+ const a3 = bytes[i + 3];
102
+ bytes[i + 0] = bytes[i + 7];
103
+ bytes[i + 1] = bytes[i + 6];
104
+ bytes[i + 2] = bytes[i + 5];
105
+ bytes[i + 3] = bytes[i + 4];
106
+ bytes[i + 4] = a3;
107
+ bytes[i + 5] = a2;
108
+ bytes[i + 6] = a1;
109
+ bytes[i + 7] = a0;
110
+ }
111
+ return arr;
22
112
  }
113
+ /**
114
+ * Byte-swaps 64-bit lanes on big-endian runtimes and returns the input unchanged on little-endian.
115
+ * This keeps Falcon's binary64 tables in canonical little-endian order before aliasing them as
116
+ * `Float64Array` lanes on the current host.
117
+ * @param arr - Buffer to pass through or swap in place.
118
+ * @returns The same buffer, normalized for Falcon's little-endian table layout.
119
+ * @example
120
+ * Normalize one host-endian buffer for Falcon's float tables.
121
+ * ```ts
122
+ * baswap64If(new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]));
123
+ * ```
124
+ */
125
+ export const baswap64If = isLE
126
+ ? (arr) => arr
127
+ : byteSwap64;
128
+ /**
129
+ * Validates that an options bag is a plain object.
130
+ * @param opts - Options object to validate.
131
+ * @throws On wrong argument types. {@link TypeError}
132
+ * @example
133
+ * Validate that an options bag is a plain object.
134
+ * ```ts
135
+ * validateOpts({});
136
+ * ```
137
+ */
23
138
  export function validateOpts(opts) {
24
- // We try to catch u8a, since it was previously valid argument at this position
25
- if (typeof opts !== 'object' || opts === null || isBytes(opts))
26
- throw new Error('expected opts to be an object');
139
+ // Arrays silently passed here before, but these call sites expect named option-bag fields.
140
+ if (Object.prototype.toString.call(opts) !== '[object Object]')
141
+ throw new TypeError('expected valid options object');
27
142
  }
143
+ /**
144
+ * Validates common verification options.
145
+ * `context` itself is validated with `abytes(...)`, and individual algorithms may narrow support
146
+ * further after this shared plain-object gate.
147
+ * @param opts - Verification options. See {@link VerOpts}.
148
+ * @throws On wrong argument types. {@link TypeError}
149
+ * @example
150
+ * Validate common verification options.
151
+ * ```ts
152
+ * validateVerOpts({ context: new Uint8Array([1]) });
153
+ * ```
154
+ */
28
155
  export function validateVerOpts(opts) {
29
156
  validateOpts(opts);
30
157
  if (opts.context !== undefined)
31
158
  abytes(opts.context, undefined, 'opts.context');
32
159
  }
160
+ /**
161
+ * Validates common signing options.
162
+ * `extraEntropy` is validated with `abytes(...)`; exact lengths and extra algorithm-specific
163
+ * restrictions are enforced later by callers.
164
+ * @param opts - Signing options. See {@link SigOpts}.
165
+ * @throws On wrong argument types. {@link TypeError}
166
+ * @example
167
+ * Validate common signing options.
168
+ * ```ts
169
+ * validateSigOpts({ extraEntropy: new Uint8Array([1]) });
170
+ * ```
171
+ */
33
172
  export function validateSigOpts(opts) {
34
173
  validateVerOpts(opts);
35
174
  if (opts.extraEntropy !== false && opts.extraEntropy !== undefined)
36
175
  abytes(opts.extraEntropy, undefined, 'opts.extraEntropy');
37
176
  }
177
+ /**
178
+ * Builds a fixed-layout coder from byte lengths and nested coders.
179
+ * Raw-length fields decode as zero-copy `subarray(...)` views, and nested coders may preserve that
180
+ * aliasing too. Nested coder `encode(...)` results are treated as owned scratch: `splitCoder`
181
+ * copies them into the output and then zeroizes them with `fill(0)`. If a nested encoder forwards
182
+ * caller-owned bytes, it must do so only after detaching them into a disposable copy.
183
+ * @param label - Label used in validation errors.
184
+ * @param lengths - Field lengths or nested coders.
185
+ * @returns Composite fixed-length coder.
186
+ * @example
187
+ * Build a fixed-layout coder from byte lengths and nested coders.
188
+ * ```ts
189
+ * splitCoder('demo', 1, 2).encode([new Uint8Array([1]), new Uint8Array([2, 3])]);
190
+ * ```
191
+ */
38
192
  export function splitCoder(label, ...lengths) {
39
- const getLength = (c) => (typeof c === 'number' ? c : c.bytesLen);
193
+ const getLength = (c) => typeof c === 'number' ? c : c.bytesLen;
40
194
  const bytesLen = lengths.reduce((sum, a) => sum + getLength(a), 0);
41
195
  return {
42
196
  bytesLen,
@@ -68,16 +222,36 @@ export function splitCoder(label, ...lengths) {
68
222
  };
69
223
  }
70
224
  // nano-packed.array (fixed size)
225
+ /**
226
+ * Builds a fixed-length vector coder from another fixed-length coder.
227
+ * Element decoding receives `subarray(...)` views, so aliasing depends on the element coder.
228
+ * Element coder `encode(...)` results are treated as owned scratch: `vecCoder` copies them into
229
+ * the output and then zeroizes them with `fill(0)`. If an element encoder forwards caller-owned
230
+ * bytes, it must do so only after detaching them into a disposable copy. `vecCoder` also trusts
231
+ * the `BytesCoderLen` contract: each encoded element must already be exactly `c.bytesLen` bytes.
232
+ * @param c - Element coder.
233
+ * @param vecLen - Number of elements in the vector.
234
+ * @returns Fixed-length vector coder.
235
+ * @example
236
+ * Build a fixed-length vector coder from another fixed-length coder.
237
+ * ```ts
238
+ * vecCoder(
239
+ * { bytesLen: 1, encode: (n: number) => Uint8Array.of(n), decode: (b: Uint8Array) => b[0] || 0 },
240
+ * 2
241
+ * ).encode([1, 2]);
242
+ * ```
243
+ */
71
244
  export function vecCoder(c, vecLen) {
72
- const bytesLen = vecLen * c.bytesLen;
245
+ const coder = c;
246
+ const bytesLen = vecLen * coder.bytesLen;
73
247
  return {
74
248
  bytesLen,
75
249
  encode: (u) => {
76
250
  if (u.length !== vecLen)
77
- throw new Error(`vecCoder.encode: wrong length=${u.length}. Expected: ${vecLen}`);
251
+ throw new RangeError(`vecCoder.encode: wrong length=${u.length}. Expected: ${vecLen}`);
78
252
  const res = new Uint8Array(bytesLen);
79
253
  for (let i = 0, pos = 0; i < u.length; i++) {
80
- const b = c.encode(u[i]);
254
+ const b = coder.encode(u[i]);
81
255
  res.set(b, pos);
82
256
  b.fill(0); // clean
83
257
  pos += b.length;
@@ -87,13 +261,23 @@ export function vecCoder(c, vecLen) {
87
261
  decode: (a) => {
88
262
  abytes_(a, bytesLen);
89
263
  const r = [];
90
- for (let i = 0; i < a.length; i += c.bytesLen)
91
- r.push(c.decode(a.subarray(i, i + c.bytesLen)));
264
+ for (let i = 0; i < a.length; i += coder.bytesLen)
265
+ r.push(coder.decode(a.subarray(i, i + coder.bytesLen)));
92
266
  return r;
93
267
  },
94
268
  };
95
269
  }
96
- // cleanBytes(Uint8Array.of(), [Uint16Array.of(), Uint32Array.of()])
270
+ /**
271
+ * Overwrites supported typed-array inputs with zeroes in place.
272
+ * Accepts direct typed arrays and one-level arrays of them.
273
+ * @param list - Typed arrays or one-level lists of typed arrays to clear.
274
+ * @example
275
+ * Overwrite typed arrays with zeroes.
276
+ * ```ts
277
+ * const buf = Uint8Array.of(1, 2, 3);
278
+ * cleanBytes(buf);
279
+ * ```
280
+ */
97
281
  export function cleanBytes(...list) {
98
282
  for (const t of list) {
99
283
  if (Array.isArray(t))
@@ -103,22 +287,73 @@ export function cleanBytes(...list) {
103
287
  t.fill(0);
104
288
  }
105
289
  }
290
+ /**
291
+ * Creates a 32-bit mask with the lowest `bits` bits set.
292
+ * @param bits - Number of low bits to keep.
293
+ * @returns Bit mask with `bits` ones.
294
+ * @throws On wrong argument ranges or values. {@link RangeError}
295
+ * @example
296
+ * Create a low-bit mask for packed-field operations.
297
+ * ```ts
298
+ * const mask = getMask(4);
299
+ * ```
300
+ */
106
301
  export function getMask(bits) {
107
- return (1 << bits) - 1; // 4 -> 0b1111
302
+ if (!Number.isSafeInteger(bits) || bits < 0 || bits > 32)
303
+ throw new RangeError(`expected bits in [0..32], got ${bits}`);
304
+ // JS shifts are modulo 32, so bit 32 needs an explicit full-width mask.
305
+ return bits === 32 ? 0xffffffff : ~(-1 << bits) >>> 0;
108
306
  }
109
- export const EMPTY = Uint8Array.of();
307
+ /** Shared empty byte array used as the default context. */
308
+ export const EMPTY = /* @__PURE__ */ Uint8Array.of();
309
+ /**
310
+ * Builds the domain-separated message payload for the pure sign/verify paths.
311
+ * Context length `255` is valid; only `ctx.length > 255` is rejected.
312
+ * @param msg - Message bytes.
313
+ * @param ctx - Optional context bytes.
314
+ * @returns Domain-separated message payload.
315
+ * @throws On wrong argument ranges or values. {@link RangeError}
316
+ * @example
317
+ * Build the domain-separated payload before direct signing.
318
+ * ```ts
319
+ * const payload = getMessage(new Uint8Array([1, 2]));
320
+ * ```
321
+ */
110
322
  export function getMessage(msg, ctx = EMPTY) {
111
323
  abytes_(msg);
112
324
  abytes_(ctx);
113
325
  if (ctx.length > 255)
114
- throw new Error('context should be less than 255 bytes');
326
+ throw new RangeError('context should be 255 bytes or less');
115
327
  return concatBytes(new Uint8Array([0, ctx.length]), ctx, msg);
116
328
  }
329
+ // DER tag+length plus the shared NIST hash OID arc 2.16.840.1.101.3.4.2.* used by the
330
+ // FIPS 204 / FIPS 205 pre-hash wrappers; the final byte selects SHA-256, SHA-512, SHAKE128,
331
+ // SHAKE256, or another approved hash/XOF under that subtree.
117
332
  // 06 09 60 86 48 01 65 03 04 02
118
333
  const oidNistP = /* @__PURE__ */ Uint8Array.from([6, 9, 0x60, 0x86, 0x48, 1, 0x65, 3, 4, 2]);
334
+ /**
335
+ * Validates that a hash exposes a NIST hash OID and enough collision resistance.
336
+ * Current accepted surface is broader than the FIPS algorithm tables: any hash/XOF under the NIST
337
+ * `2.16.840.1.101.3.4.2.*` subtree is accepted if its effective `outputLen` is strong enough.
338
+ * XOF callers must pass a callable whose `outputLen` matches the digest length they actually intend
339
+ * to sign; bare `shake128` / `shake256` defaults are too short for the stronger prehash modes.
340
+ * @param hash - Hash function to validate.
341
+ * @param requiredStrength - Minimum required collision-resistance strength in bits.
342
+ * @throws If the hash metadata or collision resistance is insufficient. {@link Error}
343
+ * @example
344
+ * Validate that a hash exposes a NIST hash OID and enough collision resistance.
345
+ * ```ts
346
+ * import { sha256 } from '@noble/hashes/sha2.js';
347
+ * import { checkHash } from '@noble/post-quantum/utils.js';
348
+ * checkHash(sha256, 128);
349
+ * ```
350
+ */
119
351
  export function checkHash(hash, requiredStrength = 0) {
120
352
  if (!hash.oid || !equalBytes(hash.oid.subarray(0, 10), oidNistP))
121
353
  throw new Error('hash.oid is invalid: expected NIST hash');
354
+ // FIPS 204 / FIPS 205 require both collision and second-preimage strength; for approved NIST
355
+ // hashes/XOFs under this OID subtree, the collision bound from the configured digest length is
356
+ // the tighter runtime check, so enforce that lower bound here.
122
357
  const collisionResistance = (hash.outputLen * 8) / 2;
123
358
  if (requiredStrength > collisionResistance) {
124
359
  throw new Error('Pre-hash security strength too low: ' +
@@ -127,11 +362,29 @@ export function checkHash(hash, requiredStrength = 0) {
127
362
  requiredStrength);
128
363
  }
129
364
  }
365
+ /**
366
+ * Builds the domain-separated prehash payload for the prehash sign/verify paths.
367
+ * Callers are expected to vet `hash.oid` first, e.g. via `checkHash(...)`; calling this helper
368
+ * directly with a hash object that lacks `oid` currently throws later inside `concatBytes(...)`.
369
+ * Context length `255` is valid; only `ctx.length > 255` is rejected.
370
+ * @param hash - Prehash function.
371
+ * @param msg - Message bytes.
372
+ * @param ctx - Optional context bytes.
373
+ * @returns Domain-separated prehash payload.
374
+ * @throws On wrong argument ranges or values. {@link RangeError}
375
+ * @example
376
+ * Build the domain-separated prehash payload for external hashing.
377
+ * ```ts
378
+ * import { sha256 } from '@noble/hashes/sha2.js';
379
+ * import { getMessagePrehash } from '@noble/post-quantum/utils.js';
380
+ * getMessagePrehash(sha256, new Uint8Array([1, 2]));
381
+ * ```
382
+ */
130
383
  export function getMessagePrehash(hash, msg, ctx = EMPTY) {
131
384
  abytes_(msg);
132
385
  abytes_(ctx);
133
386
  if (ctx.length > 255)
134
- throw new Error('context should be less than 255 bytes');
387
+ throw new RangeError('context should be 255 bytes or less');
135
388
  const hashed = hash(msg);
136
389
  return concatBytes(new Uint8Array([1, ctx.length]), ctx, hash.oid, hashed);
137
390
  }
package/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["src/utils.ts"],"names":[],"mappings":"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"}