@jscrypto/core 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.
@@ -31,6 +31,7 @@ export interface ModeComponent<Name extends string = string> extends Component<'
31
31
  export interface BlockModeTransformParams {
32
32
  cipher: BlockCipher;
33
33
  iv?: Uint8Array;
34
+ options?: unknown;
34
35
  }
35
36
  export interface StreamCipherTransformParams {
36
37
  key: Uint8Array;
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,13 +1,42 @@
1
1
  /*!
2
- * @jscrypto/core v0.1.0
2
+ * @jscrypto/core v0.2.0
3
3
  * Copyright 2026 Chen, Yi-Cyuan
4
4
  * Released under the MIT license
5
5
  */
6
6
  "use strict";
7
7
  var __defProp = Object.defineProperty;
8
+ var __defProps = Object.defineProperties;
8
9
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
9
11
  var __getOwnPropNames = Object.getOwnPropertyNames;
12
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
13
  var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
15
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
16
+ var __spreadValues = (a, b) => {
17
+ for (var prop in b || (b = {}))
18
+ if (__hasOwnProp.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ if (__getOwnPropSymbols)
21
+ for (var prop of __getOwnPropSymbols(b)) {
22
+ if (__propIsEnum.call(b, prop))
23
+ __defNormalProp(a, prop, b[prop]);
24
+ }
25
+ return a;
26
+ };
27
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
28
+ var __objRest = (source, exclude) => {
29
+ var target = {};
30
+ for (var prop in source)
31
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
32
+ target[prop] = source[prop];
33
+ if (source != null && __getOwnPropSymbols)
34
+ for (var prop of __getOwnPropSymbols(source)) {
35
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
36
+ target[prop] = source[prop];
37
+ }
38
+ return target;
39
+ };
11
40
  var __export = (target, all) => {
12
41
  for (var name in all)
13
42
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -114,8 +143,9 @@ function createPassphraseCipher(registry, options) {
114
143
  };
115
144
  }
116
145
  function createPassphraseEncryptor(registry, options) {
146
+ var _a;
117
147
  const format = resolveFormat(registry, options);
118
- const salt = options.salt ? options.salt.slice() : randomBytes(options.saltSize ?? 8);
148
+ const salt = options.salt ? options.salt.slice() : randomBytes((_a = options.saltSize) != null ? _a : 8);
119
149
  const { key, iv } = deriveKeyIv(registry, options, salt);
120
150
  const encryptor = registry.createCipher(toTransformOptions(options, key, iv)).createEncryptor();
121
151
  if (!format) {
@@ -127,16 +157,16 @@ function createPassphraseEncryptor(registry, options) {
127
157
  let emittedHeader = false;
128
158
  const emitHeader = () => {
129
159
  if (emittedHeader) {
130
- return new Uint8Array();
160
+ return new Uint8Array(0);
131
161
  }
132
162
  emittedHeader = true;
133
- return format.stringify({ ciphertext: new Uint8Array(), salt });
163
+ return format.stringify({ ciphertext: new Uint8Array(0), salt });
134
164
  };
135
165
  return {
136
166
  process(input) {
137
167
  return concatBytes(emitHeader(), encryptor.process(input));
138
168
  },
139
- finalize(input = new Uint8Array()) {
169
+ finalize(input = new Uint8Array(0)) {
140
170
  return concatBytes(emitHeader(), encryptor.finalize(input));
141
171
  }
142
172
  };
@@ -144,43 +174,44 @@ function createPassphraseEncryptor(registry, options) {
144
174
  function createPassphraseDecryptor(registry, options) {
145
175
  const format = resolveFormat(registry, options);
146
176
  if (!format) {
147
- const { key, iv } = deriveKeyIv(registry, options, new Uint8Array());
177
+ const { key, iv } = deriveKeyIv(registry, options, new Uint8Array(0));
148
178
  return registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();
149
179
  }
150
180
  if (!isStreamingOpenSslFormat(format)) {
151
181
  return createBufferedFormatDecryptor(registry, options, format);
152
182
  }
153
- let header = new Uint8Array();
183
+ let header = new Uint8Array(0);
154
184
  let decryptor;
155
185
  const initDecryptor = (input) => {
186
+ var _a;
156
187
  if (decryptor) {
157
188
  return input;
158
189
  }
159
190
  header = new Uint8Array(concatBytes(header, input));
160
191
  if (header.length < 16) {
161
- return new Uint8Array();
192
+ return new Uint8Array(0);
162
193
  }
163
194
  const parsed = format.parse(header.slice(0, 16));
164
195
  const hasSalt = parsed.salt !== void 0;
165
- const salt = parsed.salt ?? new Uint8Array();
196
+ const salt = (_a = parsed.salt) != null ? _a : new Uint8Array(0);
166
197
  const ciphertext = hasSalt ? concatBytes(parsed.ciphertext, header.slice(16)) : header;
167
198
  const { key, iv } = deriveKeyIv(registry, options, salt);
168
199
  decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();
169
- header = new Uint8Array();
200
+ header = new Uint8Array(0);
170
201
  return ciphertext;
171
202
  };
172
203
  return {
173
204
  process(input) {
174
205
  const ciphertext = initDecryptor(input);
175
- return decryptor ? decryptor.process(ciphertext) : new Uint8Array();
206
+ return decryptor ? decryptor.process(ciphertext) : new Uint8Array(0);
176
207
  },
177
- finalize(input = new Uint8Array()) {
208
+ finalize(input = new Uint8Array(0)) {
178
209
  const ciphertext = initDecryptor(input);
179
210
  if (!decryptor) {
180
- const { key, iv } = deriveKeyIv(registry, options, new Uint8Array());
211
+ const { key, iv } = deriveKeyIv(registry, options, new Uint8Array(0));
181
212
  decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();
182
213
  const buffered = header;
183
- header = new Uint8Array();
214
+ header = new Uint8Array(0);
184
215
  return decryptor.finalize(buffered);
185
216
  }
186
217
  return decryptor.finalize(ciphertext);
@@ -195,9 +226,9 @@ function createBufferedFormatEncryptor(format, salt, encryptor) {
195
226
  if (output.length !== 0) {
196
227
  chunks.push(output);
197
228
  }
198
- return new Uint8Array();
229
+ return new Uint8Array(0);
199
230
  },
200
- finalize(input = new Uint8Array()) {
231
+ finalize(input = new Uint8Array(0)) {
201
232
  const output = encryptor.finalize(input);
202
233
  if (output.length !== 0) {
203
234
  chunks.push(output);
@@ -213,14 +244,15 @@ function createBufferedFormatDecryptor(registry, options, format) {
213
244
  if (input.length !== 0) {
214
245
  chunks.push(input);
215
246
  }
216
- return new Uint8Array();
247
+ return new Uint8Array(0);
217
248
  },
218
- finalize(input = new Uint8Array()) {
249
+ finalize(input = new Uint8Array(0)) {
250
+ var _a;
219
251
  if (input.length !== 0) {
220
252
  chunks.push(input);
221
253
  }
222
254
  const parsed = format.parse(concatBytes(...chunks));
223
- const { key, iv } = deriveKeyIv(registry, options, parsed.salt ?? new Uint8Array());
255
+ const { key, iv } = deriveKeyIv(registry, options, (_a = parsed.salt) != null ? _a : new Uint8Array(0));
224
256
  return registry.createCipher(toTransformOptions(options, key, iv)).decrypt(parsed.ciphertext);
225
257
  }
226
258
  };
@@ -237,33 +269,37 @@ function deriveKeyIv(registry, options, salt) {
237
269
  function deriveSync(registry, options, salt, length) {
238
270
  const kdfOptions = normalizeNamedOptions(options.kdf);
239
271
  const kdf = registry.get("kdf", kdfOptions.name);
240
- const result = kdf.derive({
241
- ...withoutName(kdfOptions),
272
+ const result = kdf.derive(__spreadProps(__spreadValues({}, withoutName(kdfOptions)), {
242
273
  passphrase: options.passphrase,
243
274
  salt,
244
275
  length
245
- });
276
+ }));
246
277
  if (result instanceof Promise) {
247
278
  throw new Error(`KDF ${kdfOptions.name} is asynchronous; use an async passphrase cipher API.`);
248
279
  }
249
280
  return result;
250
281
  }
251
282
  function toTransformOptions(options, key, iv) {
252
- const {
283
+ const _a = options, {
253
284
  passphrase,
254
285
  kdf,
255
286
  format,
256
287
  salt,
257
288
  saltSize,
258
289
  keySize,
259
- ivSize,
260
- ...transformOptions
261
- } = options;
262
- return {
263
- ...transformOptions,
264
- key,
265
- ...iv ? { iv } : {}
266
- };
290
+ ivSize
291
+ } = _a, transformOptions = __objRest(_a, [
292
+ "passphrase",
293
+ "kdf",
294
+ "format",
295
+ "salt",
296
+ "saltSize",
297
+ "keySize",
298
+ "ivSize"
299
+ ]);
300
+ return __spreadValues(__spreadProps(__spreadValues({}, transformOptions), {
301
+ key
302
+ }), iv ? { iv } : {});
267
303
  }
268
304
  function resolveKeySize(registry, options) {
269
305
  if (options.keySize !== void 0) {
@@ -297,17 +333,18 @@ function normalizeNamedOptions(options) {
297
333
  return typeof options === "string" ? { name: options } : options;
298
334
  }
299
335
  function withoutName(options) {
300
- const { name, ...rest } = options;
336
+ const _a = options, { name } = _a, rest = __objRest(_a, ["name"]);
301
337
  return rest;
302
338
  }
303
339
  function randomBytes(length) {
340
+ var _a;
304
341
  assertNonNegativeInteger(length, "saltSize");
305
342
  const bytes = new Uint8Array(length);
306
343
  if (bytes.length === 0) {
307
344
  return bytes;
308
345
  }
309
346
  const crypto = globalThis;
310
- crypto.crypto?.getRandomValues(bytes);
347
+ (_a = crypto.crypto) == null ? void 0 : _a.getRandomValues(bytes);
311
348
  if (bytes.some((byte) => byte !== 0)) {
312
349
  return bytes;
313
350
  }
@@ -340,27 +377,29 @@ function createEncryptor(registry, options) {
340
377
  const blockCipher = cipher.create(options.key);
341
378
  const modeEncryptor = mode.createEncryptor({
342
379
  cipher: blockCipher,
343
- iv: options.iv
380
+ iv: options.iv,
381
+ options
344
382
  });
345
383
  if (mode.requiresPadding === false) {
346
384
  return createStreamEncryptor(modeEncryptor);
347
385
  }
386
+ const blockPadding = padding;
348
387
  let finalized = false;
349
- let pending = new Uint8Array();
388
+ let pending = new Uint8Array(0);
350
389
  return {
351
390
  process(input) {
352
391
  assertNotFinalized(finalized);
353
392
  const data = concatBytes(pending, input);
354
393
  const processLength = data.length - data.length % blockCipher.blockSize;
355
394
  pending = data.slice(processLength);
356
- return processLength === 0 ? new Uint8Array() : modeEncryptor.process(data.subarray(0, processLength));
395
+ return processLength === 0 ? new Uint8Array(0) : modeEncryptor.process(data.subarray(0, processLength));
357
396
  },
358
- finalize(input = new Uint8Array()) {
397
+ finalize(input = new Uint8Array(0)) {
359
398
  assertNotFinalized(finalized);
360
- const processed = input.length === 0 ? new Uint8Array() : this.process(input);
399
+ const processed = input.length === 0 ? new Uint8Array(0) : this.process(input);
361
400
  finalized = true;
362
- const finalBlock = padding.pad(pending, blockCipher.blockSize);
363
- pending = new Uint8Array();
401
+ const finalBlock = blockPadding.pad(pending, blockCipher.blockSize);
402
+ pending = new Uint8Array(0);
364
403
  return concatBytes(processed, modeEncryptor.finalize(finalBlock));
365
404
  }
366
405
  };
@@ -377,14 +416,16 @@ function createDecryptor(registry, options) {
377
416
  const blockCipher = cipher.create(options.key);
378
417
  const modeDecryptor = mode.createDecryptor({
379
418
  cipher: blockCipher,
380
- iv: options.iv
419
+ iv: options.iv,
420
+ options
381
421
  });
382
422
  if (mode.requiresPadding === false) {
383
423
  return createStreamDecryptor(modeDecryptor);
384
424
  }
425
+ const blockPadding = padding;
385
426
  let finalized = false;
386
- let pending = new Uint8Array();
387
- let plaintextPending = new Uint8Array();
427
+ let pending = new Uint8Array(0);
428
+ let plaintextPending = new Uint8Array(0);
388
429
  return {
389
430
  process(input) {
390
431
  assertNotFinalized(finalized);
@@ -392,23 +433,23 @@ function createDecryptor(registry, options) {
392
433
  const processLength = data.length - data.length % blockCipher.blockSize;
393
434
  pending = data.slice(processLength);
394
435
  if (processLength === 0) {
395
- return new Uint8Array();
436
+ return new Uint8Array(0);
396
437
  }
397
438
  const decrypted = modeDecryptor.process(data.subarray(0, processLength));
398
439
  const output = plaintextPending;
399
440
  plaintextPending = decrypted;
400
441
  return output;
401
442
  },
402
- finalize(input = new Uint8Array()) {
443
+ finalize(input = new Uint8Array(0)) {
403
444
  assertNotFinalized(finalized);
404
- const processed = input.length === 0 ? new Uint8Array() : this.process(input);
445
+ const processed = input.length === 0 ? new Uint8Array(0) : this.process(input);
405
446
  finalized = true;
406
447
  if (pending.length !== 0) {
407
- padding.unpad(pending, blockCipher.blockSize);
448
+ blockPadding.unpad(pending, blockCipher.blockSize);
408
449
  }
409
- const finalPlaintext = padding.unpad(plaintextPending, blockCipher.blockSize);
410
- pending = new Uint8Array();
411
- plaintextPending = new Uint8Array();
450
+ const finalPlaintext = blockPadding.unpad(plaintextPending, blockCipher.blockSize);
451
+ pending = new Uint8Array(0);
452
+ plaintextPending = new Uint8Array(0);
412
453
  return concatBytes(processed, finalPlaintext, modeDecryptor.finalize());
413
454
  }
414
455
  };
@@ -420,11 +461,11 @@ function createStreamEncryptor(modeEncryptor) {
420
461
  assertNotFinalized(finalized);
421
462
  return modeEncryptor.process(input);
422
463
  },
423
- finalize(input = new Uint8Array()) {
464
+ finalize(input = new Uint8Array(0)) {
424
465
  assertNotFinalized(finalized);
425
466
  finalized = true;
426
467
  return concatBytes(
427
- input.length === 0 ? new Uint8Array() : modeEncryptor.process(input),
468
+ input.length === 0 ? new Uint8Array(0) : modeEncryptor.process(input),
428
469
  modeEncryptor.finalize()
429
470
  );
430
471
  }
@@ -437,11 +478,11 @@ function createStreamDecryptor(modeDecryptor) {
437
478
  assertNotFinalized(finalized);
438
479
  return modeDecryptor.process(input);
439
480
  },
440
- finalize(input = new Uint8Array()) {
481
+ finalize(input = new Uint8Array(0)) {
441
482
  assertNotFinalized(finalized);
442
483
  finalized = true;
443
484
  return concatBytes(
444
- input.length === 0 ? new Uint8Array() : modeDecryptor.process(input),
485
+ input.length === 0 ? new Uint8Array(0) : modeDecryptor.process(input),
445
486
  modeDecryptor.finalize()
446
487
  );
447
488
  }
@@ -451,13 +492,18 @@ function resolveBlockOptions(registry, options) {
451
492
  if (!options.mode) {
452
493
  throw new Error(`${options.cipher} block cipher requires a mode.`);
453
494
  }
454
- if (!options.padding) {
455
- throw new Error(`${options.cipher} block cipher requires padding.`);
495
+ const mode = registry.get("mode", options.mode);
496
+ let padding;
497
+ if (mode.requiresPadding !== false) {
498
+ if (!options.padding) {
499
+ throw new Error(`${options.cipher} block cipher requires padding.`);
500
+ }
501
+ padding = registry.get("padding", options.padding);
456
502
  }
457
503
  return {
458
504
  cipher: registry.get("cipher", options.cipher),
459
- mode: registry.get("mode", options.mode),
460
- padding: registry.get("padding", options.padding)
505
+ mode,
506
+ padding
461
507
  };
462
508
  }
463
509
  function assertNotFinalized(finalized) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/errors.ts", "../src/bytes.ts", "../src/passphrase.ts", "../src/transform.ts", "../src/registry.ts", "../src/blocks.ts"],
4
- "sourcesContent": ["export type {\n AnyComponent,\n BlockCipher,\n BlockCipherComponent,\n BlockModeTransformParams,\n CipherComponent,\n Component,\n ComponentKind,\n FormatComponent,\n FormatParseResult,\n FormatStringifyParams,\n KdfComponent,\n ModeComponent,\n PaddingComponent,\n PresetComponent,\n StreamCipherComponent,\n StreamCipherTransformParams,\n Transform,\n} from './component.js';\nexport { CryptoError, DuplicateComponentError, MissingComponentError } from './errors.js';\nexport type {\n CreatePassphraseCipherOptions,\n FormatOptions,\n KdfOptions,\n PassphraseCipherFacade,\n} from './passphrase.js';\nexport type { CipherFacade, Registry } from './registry.js';\nexport { createRegistry } from './registry.js';\nexport type { CreateTransformOptions } from './transform.js';\nexport { assertBlockMultiple, assertBlockSize, assertIv, assertPaddedInput, getBlockPaddingLength } from './blocks.js';\nexport { assertBytes, concatBytes, equalBytes, xorBytes } from './bytes.js';\n", "export class CryptoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class DuplicateComponentError extends CryptoError {\n constructor(kind: string, name: string) {\n super(`Component already registered: ${kind}:${name}`);\n }\n}\n\nexport class MissingComponentError extends CryptoError {\n constructor(kind: string, name: string) {\n super(`Component not found: ${kind}:${name}`);\n }\n}\n\n", "export function concatBytes(...chunks: readonly Uint8Array[]): Uint8Array {\n const length = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const output = new Uint8Array(length);\n let offset = 0;\n\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.length;\n }\n\n return output;\n}\n\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a[i] ^ b[i];\n }\n return diff === 0;\n}\n\nexport function xorBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n if (a.length !== b.length) {\n throw new Error('XOR inputs must have the same length.');\n }\n\n const output = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n output[i] = a[i] ^ b[i];\n }\n return output;\n}\n\nexport function assertBytes(value: unknown, name: string): asserts value is Uint8Array {\n if (!(value instanceof Uint8Array)) {\n throw new TypeError(`${name} must be a Uint8Array.`);\n }\n}\n", "import type { CipherComponent, FormatComponent, KdfComponent, Transform } from './component.js';\nimport type { Registry } from './registry.js';\nimport type { CreateTransformOptions } from './transform.js';\nimport { concatBytes } from './bytes.js';\n\nexport interface CreatePassphraseCipherOptions {\n cipher: string;\n mode?: string;\n padding?: string;\n passphrase: Uint8Array | string;\n kdf: string | KdfOptions;\n format?: string | FormatOptions;\n salt?: Uint8Array;\n saltSize?: number;\n keySize?: number;\n ivSize?: number;\n [option: string]: unknown;\n}\n\nexport interface KdfOptions {\n name: string;\n [option: string]: unknown;\n}\n\nexport interface FormatOptions {\n name: string;\n [option: string]: unknown;\n}\n\nexport interface PassphraseCipherFacade {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(input: Uint8Array): Uint8Array;\n createEncryptor(): Transform;\n createDecryptor(): Transform;\n}\n\nexport function createPassphraseCipher(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): PassphraseCipherFacade {\n return {\n encrypt(plaintext) {\n return concatBytes(this.createEncryptor().finalize(plaintext));\n },\n\n decrypt(input) {\n return concatBytes(this.createDecryptor().finalize(input));\n },\n\n createEncryptor() {\n return createPassphraseEncryptor(registry, options);\n },\n\n createDecryptor() {\n return createPassphraseDecryptor(registry, options);\n },\n };\n}\n\nfunction createPassphraseEncryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): Transform {\n const format = resolveFormat(registry, options);\n const salt = options.salt ? options.salt.slice() : randomBytes(options.saltSize ?? 8);\n const { key, iv } = deriveKeyIv(registry, options, salt);\n const encryptor = registry.createCipher(toTransformOptions(options, key, iv)).createEncryptor();\n\n if (!format) {\n return encryptor;\n }\n\n if (!isStreamingOpenSslFormat(format)) {\n return createBufferedFormatEncryptor(format, salt, encryptor);\n }\n\n let emittedHeader = false;\n const emitHeader = (): Uint8Array => {\n if (emittedHeader) {\n return new Uint8Array();\n }\n emittedHeader = true;\n return format.stringify({ ciphertext: new Uint8Array(), salt });\n };\n\n return {\n process(input) {\n return concatBytes(emitHeader(), encryptor.process(input));\n },\n\n finalize(input = new Uint8Array()) {\n return concatBytes(emitHeader(), encryptor.finalize(input));\n },\n };\n}\n\nfunction createPassphraseDecryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): Transform {\n const format = resolveFormat(registry, options);\n\n if (!format) {\n const { key, iv } = deriveKeyIv(registry, options, new Uint8Array());\n return registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n }\n\n if (!isStreamingOpenSslFormat(format)) {\n return createBufferedFormatDecryptor(registry, options, format);\n }\n\n let header = new Uint8Array();\n let decryptor: Transform | undefined;\n\n const initDecryptor = (input: Uint8Array): Uint8Array => {\n if (decryptor) {\n return input;\n }\n\n header = new Uint8Array(concatBytes(header, input));\n if (header.length < 16) {\n return new Uint8Array();\n }\n\n const parsed = format.parse(header.slice(0, 16));\n const hasSalt = parsed.salt !== undefined;\n const salt = parsed.salt ?? new Uint8Array();\n const ciphertext = hasSalt ? concatBytes(parsed.ciphertext, header.slice(16)) : header;\n const { key, iv } = deriveKeyIv(registry, options, salt);\n decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n header = new Uint8Array();\n return ciphertext;\n };\n\n return {\n process(input) {\n const ciphertext = initDecryptor(input);\n return decryptor ? decryptor.process(ciphertext) : new Uint8Array();\n },\n\n finalize(input = new Uint8Array()) {\n const ciphertext = initDecryptor(input);\n if (!decryptor) {\n const { key, iv } = deriveKeyIv(registry, options, new Uint8Array());\n decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n const buffered = header;\n header = new Uint8Array();\n return decryptor.finalize(buffered);\n }\n return decryptor.finalize(ciphertext);\n },\n };\n}\n\nfunction createBufferedFormatEncryptor(\n format: FormatComponent,\n salt: Uint8Array,\n encryptor: Transform,\n): Transform {\n const chunks: Uint8Array[] = [];\n\n return {\n process(input) {\n const output = encryptor.process(input);\n if (output.length !== 0) {\n chunks.push(output);\n }\n return new Uint8Array();\n },\n\n finalize(input = new Uint8Array()) {\n const output = encryptor.finalize(input);\n if (output.length !== 0) {\n chunks.push(output);\n }\n return format.stringify({ ciphertext: concatBytes(...chunks), salt });\n },\n };\n}\n\nfunction createBufferedFormatDecryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n format: FormatComponent,\n): Transform {\n const chunks: Uint8Array[] = [];\n\n return {\n process(input) {\n if (input.length !== 0) {\n chunks.push(input);\n }\n return new Uint8Array();\n },\n\n finalize(input = new Uint8Array()) {\n if (input.length !== 0) {\n chunks.push(input);\n }\n const parsed = format.parse(concatBytes(...chunks));\n const { key, iv } = deriveKeyIv(registry, options, parsed.salt ?? new Uint8Array());\n return registry.createCipher(toTransformOptions(options, key, iv)).decrypt(parsed.ciphertext);\n },\n };\n}\n\nfunction deriveKeyIv(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n salt: Uint8Array,\n): { key: Uint8Array; iv?: Uint8Array } {\n const keySize = resolveKeySize(registry, options);\n const ivSize = resolveIvSize(registry, options);\n const derived = deriveSync(registry, options, salt, keySize + ivSize);\n return {\n key: derived.slice(0, keySize),\n iv: ivSize === 0 ? undefined : derived.slice(keySize, keySize + ivSize),\n };\n}\n\nfunction deriveSync(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n salt: Uint8Array,\n length: number,\n): Uint8Array {\n const kdfOptions = normalizeNamedOptions(options.kdf);\n const kdf = registry.get<'kdf', KdfComponent>('kdf', kdfOptions.name);\n const result = kdf.derive({\n ...withoutName(kdfOptions),\n passphrase: options.passphrase,\n salt,\n length,\n });\n if (result instanceof Promise) {\n throw new Error(`KDF ${kdfOptions.name} is asynchronous; use an async passphrase cipher API.`);\n }\n return result;\n}\n\nfunction toTransformOptions(\n options: CreatePassphraseCipherOptions,\n key: Uint8Array,\n iv: Uint8Array | undefined,\n): CreateTransformOptions {\n const {\n passphrase,\n kdf,\n format,\n salt,\n saltSize,\n keySize,\n ivSize,\n ...transformOptions\n } = options;\n\n return {\n ...transformOptions,\n key,\n ...(iv ? { iv } : {}),\n };\n}\n\nfunction resolveKeySize(registry: Registry, options: CreatePassphraseCipherOptions): number {\n if (options.keySize !== undefined) {\n assertPositiveInteger(options.keySize, 'keySize');\n return options.keySize;\n }\n\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (!cipher.keySizes || cipher.keySizes.length === 0) {\n throw new Error(`${options.cipher} passphrase cipher requires keySize.`);\n }\n return Math.max(...cipher.keySizes);\n}\n\nfunction resolveIvSize(registry: Registry, options: CreatePassphraseCipherOptions): number {\n if (options.ivSize !== undefined) {\n assertNonNegativeInteger(options.ivSize, 'ivSize');\n return options.ivSize;\n }\n\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n return cipher.type === 'block' ? cipher.blockSize : 0;\n}\n\nfunction resolveFormat(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): FormatComponent | undefined {\n if (!options.format) {\n return undefined;\n }\n return registry.get<'format', FormatComponent>('format', normalizeNamedOptions(options.format).name);\n}\n\nfunction isStreamingOpenSslFormat(format: FormatComponent): boolean {\n return format.name === 'OpenSSL';\n}\n\nfunction normalizeNamedOptions(options: string | { name: string }): { name: string; [option: string]: unknown } {\n return typeof options === 'string' ? { name: options } : options;\n}\n\nfunction withoutName(options: { name: string; [option: string]: unknown }): Record<string, unknown> {\n const { name, ...rest } = options;\n return rest;\n}\n\nfunction randomBytes(length: number): Uint8Array {\n assertNonNegativeInteger(length, 'saltSize');\n const bytes = new Uint8Array(length);\n if (bytes.length === 0) {\n return bytes;\n }\n\n const crypto = globalThis as typeof globalThis & {\n crypto?: {\n getRandomValues<T extends Uint8Array>(array: T): T;\n };\n };\n crypto.crypto?.getRandomValues(bytes);\n if (bytes.some((byte) => byte !== 0)) {\n return bytes;\n }\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\nfunction assertPositiveInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new RangeError(`${label} must be a positive integer.`);\n }\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${label} must be a non-negative integer.`);\n }\n}\n", "import type { BlockCipherComponent, CipherComponent, ModeComponent, PaddingComponent, Transform } from './component.js';\nimport type { Registry } from './registry.js';\nimport { concatBytes } from './bytes.js';\n\nexport interface CreateTransformOptions {\n cipher: string;\n mode?: string;\n padding?: string;\n key: Uint8Array;\n iv?: Uint8Array;\n [option: string]: unknown;\n}\n\nexport function createEncryptor(registry: Registry, options: CreateTransformOptions): Transform {\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (cipher.type === 'stream') {\n return createStreamEncryptor(cipher.createEncryptor({\n key: options.key,\n options,\n }));\n }\n\n const { mode, padding } = resolveBlockOptions(registry, options);\n const blockCipher = cipher.create(options.key);\n\n const modeEncryptor = mode.createEncryptor({\n cipher: blockCipher,\n iv: options.iv,\n });\n\n if (mode.requiresPadding === false) {\n return createStreamEncryptor(modeEncryptor);\n }\n\n let finalized = false;\n let pending: Uint8Array = new Uint8Array();\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n const data = concatBytes(pending, input);\n const processLength = data.length - (data.length % blockCipher.blockSize);\n pending = data.slice(processLength);\n return processLength === 0 ? new Uint8Array() : modeEncryptor.process(data.subarray(0, processLength));\n },\n\n finalize(input = new Uint8Array()) {\n assertNotFinalized(finalized);\n const processed = input.length === 0 ? new Uint8Array() : this.process(input);\n finalized = true;\n const finalBlock = padding.pad(pending, blockCipher.blockSize);\n pending = new Uint8Array();\n return concatBytes(processed, modeEncryptor.finalize(finalBlock));\n },\n };\n}\n\nexport function createDecryptor(registry: Registry, options: CreateTransformOptions): Transform {\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (cipher.type === 'stream') {\n return createStreamDecryptor(cipher.createDecryptor({\n key: options.key,\n options,\n }));\n }\n\n const { mode, padding } = resolveBlockOptions(registry, options);\n const blockCipher = cipher.create(options.key);\n\n const modeDecryptor = mode.createDecryptor({\n cipher: blockCipher,\n iv: options.iv,\n });\n\n if (mode.requiresPadding === false) {\n return createStreamDecryptor(modeDecryptor);\n }\n\n let finalized = false;\n let pending: Uint8Array = new Uint8Array();\n let plaintextPending: Uint8Array = new Uint8Array();\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n const data = concatBytes(pending, input);\n const processLength = data.length - (data.length % blockCipher.blockSize);\n pending = data.slice(processLength);\n\n if (processLength === 0) {\n return new Uint8Array();\n }\n\n const decrypted = modeDecryptor.process(data.subarray(0, processLength));\n const output = plaintextPending;\n plaintextPending = decrypted;\n return output;\n },\n\n finalize(input = new Uint8Array()) {\n assertNotFinalized(finalized);\n const processed = input.length === 0 ? new Uint8Array() : this.process(input);\n finalized = true;\n if (pending.length !== 0) {\n padding.unpad(pending, blockCipher.blockSize);\n }\n const finalPlaintext = padding.unpad(plaintextPending, blockCipher.blockSize);\n pending = new Uint8Array();\n plaintextPending = new Uint8Array();\n return concatBytes(processed, finalPlaintext, modeDecryptor.finalize());\n },\n };\n}\n\nfunction createStreamEncryptor(modeEncryptor: Transform): Transform {\n let finalized = false;\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n return modeEncryptor.process(input);\n },\n\n finalize(input = new Uint8Array()) {\n assertNotFinalized(finalized);\n finalized = true;\n return concatBytes(\n input.length === 0 ? new Uint8Array() : modeEncryptor.process(input),\n modeEncryptor.finalize(),\n );\n },\n };\n}\n\nfunction createStreamDecryptor(modeDecryptor: Transform): Transform {\n let finalized = false;\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n return modeDecryptor.process(input);\n },\n\n finalize(input = new Uint8Array()) {\n assertNotFinalized(finalized);\n finalized = true;\n return concatBytes(\n input.length === 0 ? new Uint8Array() : modeDecryptor.process(input),\n modeDecryptor.finalize(),\n );\n },\n };\n}\n\nfunction resolveBlockOptions(registry: Registry, options: CreateTransformOptions): {\n cipher: BlockCipherComponent;\n mode: ModeComponent;\n padding: PaddingComponent;\n} {\n if (!options.mode) {\n throw new Error(`${options.cipher} block cipher requires a mode.`);\n }\n if (!options.padding) {\n throw new Error(`${options.cipher} block cipher requires padding.`);\n }\n\n return {\n cipher: registry.get<'cipher', BlockCipherComponent>('cipher', options.cipher),\n mode: registry.get('mode', options.mode),\n padding: registry.get('padding', options.padding),\n };\n}\n\nfunction assertNotFinalized(finalized: boolean): void {\n if (finalized) {\n throw new Error('Transform is already finalized.');\n }\n}\n", "import type { AnyComponent, Component, ComponentKind, PresetComponent } from './component.js';\nimport { DuplicateComponentError, MissingComponentError } from './errors.js';\nimport type { CreatePassphraseCipherOptions, PassphraseCipherFacade } from './passphrase.js';\nimport { createPassphraseCipher } from './passphrase.js';\nimport type { CreateTransformOptions } from './transform.js';\nimport { createDecryptor, createEncryptor } from './transform.js';\nimport type { Transform } from './component.js';\n\nexport interface Registry {\n use(component: AnyComponent): Registry;\n has(kind: ComponentKind, name: string): boolean;\n get<Kind extends ComponentKind, T extends Component<Kind>>(kind: Kind, name: string): T;\n list(kind?: ComponentKind): AnyComponent[];\n createCipher(options: CreateTransformOptions): CipherFacade;\n createPassphraseCipher(options: CreatePassphraseCipherOptions): PassphraseCipherFacade;\n encrypt(options: CreateTransformOptions & { plaintext: Uint8Array }): Uint8Array;\n decrypt(options: CreateTransformOptions & { ciphertext: Uint8Array }): Uint8Array;\n createEncryptor(options: CreateTransformOptions): Transform;\n createDecryptor(options: CreateTransformOptions): Transform;\n}\n\nexport interface CipherFacade {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array): Uint8Array;\n createEncryptor(): Transform;\n createDecryptor(): Transform;\n}\n\nexport function createRegistry(components: Iterable<AnyComponent> = []): Registry {\n const entries = new Map<string, AnyComponent>();\n\n const key = (kind: ComponentKind, name: string) => `${kind}:${name}`;\n\n const registry: Registry = {\n use(component) {\n if (component.kind === 'preset') {\n for (const item of (component as PresetComponent).components()) {\n registry.use(item);\n }\n return registry;\n }\n\n const entryKey = key(component.kind, component.name);\n if (entries.has(entryKey)) {\n throw new DuplicateComponentError(component.kind, component.name);\n }\n entries.set(entryKey, component);\n return registry;\n },\n\n has(kind, name) {\n return entries.has(key(kind, name));\n },\n\n get(kind, name) {\n const component = entries.get(key(kind, name));\n if (!component) {\n throw new MissingComponentError(kind, name);\n }\n return component as never;\n },\n\n list(kind) {\n const components = [...entries.values()];\n return kind ? components.filter((component) => component.kind === kind) : components;\n },\n\n createCipher(options) {\n return {\n encrypt(plaintext) {\n return createEncryptor(registry, options).finalize(plaintext);\n },\n\n decrypt(ciphertext) {\n return createDecryptor(registry, options).finalize(ciphertext);\n },\n\n createEncryptor() {\n return createEncryptor(registry, options);\n },\n\n createDecryptor() {\n return createDecryptor(registry, options);\n },\n };\n },\n\n createPassphraseCipher(options) {\n return createPassphraseCipher(registry, options);\n },\n\n encrypt(options) {\n return createEncryptor(registry, options).finalize(options.plaintext);\n },\n\n decrypt(options) {\n return createDecryptor(registry, options).finalize(options.ciphertext);\n },\n\n createEncryptor(options) {\n return createEncryptor(registry, options);\n },\n\n createDecryptor(options) {\n return createDecryptor(registry, options);\n },\n };\n\n for (const component of components) {\n registry.use(component);\n }\n\n return registry;\n}\n", "export interface BlockSizeOptions {\n readonly max?: number;\n}\n\nexport function assertBlockSize(blockSize: number, options: BlockSizeOptions = {}): void {\n const { max } = options;\n if (!Number.isInteger(blockSize) || blockSize <= 0) {\n throw new RangeError('blockSize must be a positive integer.');\n }\n if (max !== undefined && blockSize > max) {\n throw new RangeError(`blockSize must be an integer between 1 and ${max}.`);\n }\n}\n\nexport function assertBlockMultiple(input: Uint8Array, blockSize: number, label: string): void {\n assertBlockSize(blockSize);\n if (input.length % blockSize !== 0) {\n throw new Error(`${label} input length must be a multiple of the block size.`);\n }\n}\n\nexport function assertPaddedInput(input: Uint8Array, blockSize: number, label: string, options: BlockSizeOptions = {}): void {\n assertBlockSize(blockSize, options);\n if (input.length === 0 || input.length % blockSize !== 0) {\n throw new Error(`Invalid ${label} padded data.`);\n }\n}\n\nexport function assertIv(blockSize: number, iv: Uint8Array | undefined, modeName: string): asserts iv is Uint8Array {\n if (!iv) {\n throw new Error(`${modeName} mode requires an IV.`);\n }\n if (iv.length !== blockSize) {\n throw new Error(`${modeName} IV length must match the cipher block size.`);\n }\n}\n\nexport function getBlockPaddingLength(inputLength: number, blockSize: number): number {\n const remainder = inputLength % blockSize;\n return remainder === 0 ? blockSize : blockSize - remainder;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export type {\n AnyComponent,\n BlockCipher,\n BlockCipherComponent,\n BlockModeTransformParams,\n CipherComponent,\n Component,\n ComponentKind,\n FormatComponent,\n FormatParseResult,\n FormatStringifyParams,\n KdfComponent,\n ModeComponent,\n PaddingComponent,\n PresetComponent,\n StreamCipherComponent,\n StreamCipherTransformParams,\n Transform,\n} from './component.js';\nexport { CryptoError, DuplicateComponentError, MissingComponentError } from './errors.js';\nexport type {\n CreatePassphraseCipherOptions,\n FormatOptions,\n KdfOptions,\n PassphraseCipherFacade,\n} from './passphrase.js';\nexport type { CipherFacade, Registry } from './registry.js';\nexport { createRegistry } from './registry.js';\nexport type { CreateTransformOptions } from './transform.js';\nexport { assertBlockMultiple, assertBlockSize, assertIv, assertPaddedInput, getBlockPaddingLength } from './blocks.js';\nexport { assertBytes, concatBytes, equalBytes, xorBytes } from './bytes.js';\n", "export class CryptoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n }\n}\n\nexport class DuplicateComponentError extends CryptoError {\n constructor(kind: string, name: string) {\n super(`Component already registered: ${kind}:${name}`);\n }\n}\n\nexport class MissingComponentError extends CryptoError {\n constructor(kind: string, name: string) {\n super(`Component not found: ${kind}:${name}`);\n }\n}\n\n", "export function concatBytes(...chunks: readonly Uint8Array[]): Uint8Array {\n const length = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const output = new Uint8Array(length);\n let offset = 0;\n\n for (const chunk of chunks) {\n output.set(chunk, offset);\n offset += chunk.length;\n }\n\n return output;\n}\n\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let diff = 0;\n for (let i = 0; i < a.length; i++) {\n diff |= a[i] ^ b[i];\n }\n return diff === 0;\n}\n\nexport function xorBytes(a: Uint8Array, b: Uint8Array): Uint8Array {\n if (a.length !== b.length) {\n throw new Error('XOR inputs must have the same length.');\n }\n\n const output = new Uint8Array(a.length);\n for (let i = 0; i < a.length; i++) {\n output[i] = a[i] ^ b[i];\n }\n return output;\n}\n\nexport function assertBytes(value: unknown, name: string): asserts value is Uint8Array {\n if (!(value instanceof Uint8Array)) {\n throw new TypeError(`${name} must be a Uint8Array.`);\n }\n}\n", "import type { CipherComponent, FormatComponent, KdfComponent, Transform } from './component.js';\nimport type { Registry } from './registry.js';\nimport type { CreateTransformOptions } from './transform.js';\nimport { concatBytes } from './bytes.js';\n\nexport interface CreatePassphraseCipherOptions {\n cipher: string;\n mode?: string;\n padding?: string;\n passphrase: Uint8Array | string;\n kdf: string | KdfOptions;\n format?: string | FormatOptions;\n salt?: Uint8Array;\n saltSize?: number;\n keySize?: number;\n ivSize?: number;\n [option: string]: unknown;\n}\n\nexport interface KdfOptions {\n name: string;\n [option: string]: unknown;\n}\n\nexport interface FormatOptions {\n name: string;\n [option: string]: unknown;\n}\n\nexport interface PassphraseCipherFacade {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(input: Uint8Array): Uint8Array;\n createEncryptor(): Transform;\n createDecryptor(): Transform;\n}\n\nexport function createPassphraseCipher(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): PassphraseCipherFacade {\n return {\n encrypt(plaintext) {\n return concatBytes(this.createEncryptor().finalize(plaintext));\n },\n\n decrypt(input) {\n return concatBytes(this.createDecryptor().finalize(input));\n },\n\n createEncryptor() {\n return createPassphraseEncryptor(registry, options);\n },\n\n createDecryptor() {\n return createPassphraseDecryptor(registry, options);\n },\n };\n}\n\nfunction createPassphraseEncryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): Transform {\n const format = resolveFormat(registry, options);\n const salt = options.salt ? options.salt.slice() : randomBytes(options.saltSize ?? 8);\n const { key, iv } = deriveKeyIv(registry, options, salt);\n const encryptor = registry.createCipher(toTransformOptions(options, key, iv)).createEncryptor();\n\n if (!format) {\n return encryptor;\n }\n\n if (!isStreamingOpenSslFormat(format)) {\n return createBufferedFormatEncryptor(format, salt, encryptor);\n }\n\n let emittedHeader = false;\n const emitHeader = (): Uint8Array => {\n if (emittedHeader) {\n return new Uint8Array(0);\n }\n emittedHeader = true;\n return format.stringify({ ciphertext: new Uint8Array(0), salt });\n };\n\n return {\n process(input) {\n return concatBytes(emitHeader(), encryptor.process(input));\n },\n\n finalize(input = new Uint8Array(0)) {\n return concatBytes(emitHeader(), encryptor.finalize(input));\n },\n };\n}\n\nfunction createPassphraseDecryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): Transform {\n const format = resolveFormat(registry, options);\n\n if (!format) {\n const { key, iv } = deriveKeyIv(registry, options, new Uint8Array(0));\n return registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n }\n\n if (!isStreamingOpenSslFormat(format)) {\n return createBufferedFormatDecryptor(registry, options, format);\n }\n\n let header = new Uint8Array(0);\n let decryptor: Transform | undefined;\n\n const initDecryptor = (input: Uint8Array): Uint8Array => {\n if (decryptor) {\n return input;\n }\n\n header = new Uint8Array(concatBytes(header, input));\n if (header.length < 16) {\n return new Uint8Array(0);\n }\n\n const parsed = format.parse(header.slice(0, 16));\n const hasSalt = parsed.salt !== undefined;\n const salt = parsed.salt ?? new Uint8Array(0);\n const ciphertext = hasSalt ? concatBytes(parsed.ciphertext, header.slice(16)) : header;\n const { key, iv } = deriveKeyIv(registry, options, salt);\n decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n header = new Uint8Array(0);\n return ciphertext;\n };\n\n return {\n process(input) {\n const ciphertext = initDecryptor(input);\n return decryptor ? decryptor.process(ciphertext) : new Uint8Array(0);\n },\n\n finalize(input = new Uint8Array(0)) {\n const ciphertext = initDecryptor(input);\n if (!decryptor) {\n const { key, iv } = deriveKeyIv(registry, options, new Uint8Array(0));\n decryptor = registry.createCipher(toTransformOptions(options, key, iv)).createDecryptor();\n const buffered = header;\n header = new Uint8Array(0);\n return decryptor.finalize(buffered);\n }\n return decryptor.finalize(ciphertext);\n },\n };\n}\n\nfunction createBufferedFormatEncryptor(\n format: FormatComponent,\n salt: Uint8Array,\n encryptor: Transform,\n): Transform {\n const chunks: Uint8Array[] = [];\n\n return {\n process(input) {\n const output = encryptor.process(input);\n if (output.length !== 0) {\n chunks.push(output);\n }\n return new Uint8Array(0);\n },\n\n finalize(input = new Uint8Array(0)) {\n const output = encryptor.finalize(input);\n if (output.length !== 0) {\n chunks.push(output);\n }\n return format.stringify({ ciphertext: concatBytes(...chunks), salt });\n },\n };\n}\n\nfunction createBufferedFormatDecryptor(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n format: FormatComponent,\n): Transform {\n const chunks: Uint8Array[] = [];\n\n return {\n process(input) {\n if (input.length !== 0) {\n chunks.push(input);\n }\n return new Uint8Array(0);\n },\n\n finalize(input = new Uint8Array(0)) {\n if (input.length !== 0) {\n chunks.push(input);\n }\n const parsed = format.parse(concatBytes(...chunks));\n const { key, iv } = deriveKeyIv(registry, options, parsed.salt ?? new Uint8Array(0));\n return registry.createCipher(toTransformOptions(options, key, iv)).decrypt(parsed.ciphertext);\n },\n };\n}\n\nfunction deriveKeyIv(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n salt: Uint8Array,\n): { key: Uint8Array; iv?: Uint8Array } {\n const keySize = resolveKeySize(registry, options);\n const ivSize = resolveIvSize(registry, options);\n const derived = deriveSync(registry, options, salt, keySize + ivSize);\n return {\n key: derived.slice(0, keySize),\n iv: ivSize === 0 ? undefined : derived.slice(keySize, keySize + ivSize),\n };\n}\n\nfunction deriveSync(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n salt: Uint8Array,\n length: number,\n): Uint8Array {\n const kdfOptions = normalizeNamedOptions(options.kdf);\n const kdf = registry.get<'kdf', KdfComponent>('kdf', kdfOptions.name);\n const result = kdf.derive({\n ...withoutName(kdfOptions),\n passphrase: options.passphrase,\n salt,\n length,\n });\n if (result instanceof Promise) {\n throw new Error(`KDF ${kdfOptions.name} is asynchronous; use an async passphrase cipher API.`);\n }\n return result;\n}\n\nfunction toTransformOptions(\n options: CreatePassphraseCipherOptions,\n key: Uint8Array,\n iv: Uint8Array | undefined,\n): CreateTransformOptions {\n const {\n passphrase,\n kdf,\n format,\n salt,\n saltSize,\n keySize,\n ivSize,\n ...transformOptions\n } = options;\n\n return {\n ...transformOptions,\n key,\n ...(iv ? { iv } : {}),\n };\n}\n\nfunction resolveKeySize(registry: Registry, options: CreatePassphraseCipherOptions): number {\n if (options.keySize !== undefined) {\n assertPositiveInteger(options.keySize, 'keySize');\n return options.keySize;\n }\n\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (!cipher.keySizes || cipher.keySizes.length === 0) {\n throw new Error(`${options.cipher} passphrase cipher requires keySize.`);\n }\n return Math.max(...cipher.keySizes);\n}\n\nfunction resolveIvSize(registry: Registry, options: CreatePassphraseCipherOptions): number {\n if (options.ivSize !== undefined) {\n assertNonNegativeInteger(options.ivSize, 'ivSize');\n return options.ivSize;\n }\n\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n return cipher.type === 'block' ? cipher.blockSize : 0;\n}\n\nfunction resolveFormat(\n registry: Registry,\n options: CreatePassphraseCipherOptions,\n): FormatComponent | undefined {\n if (!options.format) {\n return undefined;\n }\n return registry.get<'format', FormatComponent>('format', normalizeNamedOptions(options.format).name);\n}\n\nfunction isStreamingOpenSslFormat(format: FormatComponent): boolean {\n return format.name === 'OpenSSL';\n}\n\nfunction normalizeNamedOptions(options: string | { name: string }): { name: string; [option: string]: unknown } {\n return typeof options === 'string' ? { name: options } : options;\n}\n\nfunction withoutName(options: { name: string; [option: string]: unknown }): Record<string, unknown> {\n const { name, ...rest } = options;\n return rest;\n}\n\nfunction randomBytes(length: number): Uint8Array {\n assertNonNegativeInteger(length, 'saltSize');\n const bytes = new Uint8Array(length);\n if (bytes.length === 0) {\n return bytes;\n }\n\n const crypto = globalThis as typeof globalThis & {\n crypto?: {\n getRandomValues<T extends Uint8Array>(array: T): T;\n };\n };\n crypto.crypto?.getRandomValues(bytes);\n if (bytes.some((byte) => byte !== 0)) {\n return bytes;\n }\n\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n}\n\nfunction assertPositiveInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new RangeError(`${label} must be a positive integer.`);\n }\n}\n\nfunction assertNonNegativeInteger(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${label} must be a non-negative integer.`);\n }\n}\n", "import type { BlockCipherComponent, CipherComponent, ModeComponent, PaddingComponent, Transform } from './component.js';\nimport type { Registry } from './registry.js';\nimport { concatBytes } from './bytes.js';\n\nexport interface CreateTransformOptions {\n cipher: string;\n mode?: string;\n padding?: string;\n key: Uint8Array;\n iv?: Uint8Array;\n [option: string]: unknown;\n}\n\nexport function createEncryptor(registry: Registry, options: CreateTransformOptions): Transform {\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (cipher.type === 'stream') {\n return createStreamEncryptor(cipher.createEncryptor({\n key: options.key,\n options,\n }));\n }\n\n const { mode, padding } = resolveBlockOptions(registry, options);\n const blockCipher = cipher.create(options.key);\n\n const modeEncryptor = mode.createEncryptor({\n cipher: blockCipher,\n iv: options.iv,\n options,\n });\n\n if (mode.requiresPadding === false) {\n return createStreamEncryptor(modeEncryptor);\n }\n const blockPadding = padding as PaddingComponent;\n\n let finalized = false;\n let pending: Uint8Array = new Uint8Array(0);\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n const data = concatBytes(pending, input);\n const processLength = data.length - (data.length % blockCipher.blockSize);\n pending = data.slice(processLength);\n return processLength === 0 ? new Uint8Array(0) : modeEncryptor.process(data.subarray(0, processLength));\n },\n\n finalize(input = new Uint8Array(0)) {\n assertNotFinalized(finalized);\n const processed = input.length === 0 ? new Uint8Array(0) : this.process(input);\n finalized = true;\n const finalBlock = blockPadding.pad(pending, blockCipher.blockSize);\n pending = new Uint8Array(0);\n return concatBytes(processed, modeEncryptor.finalize(finalBlock));\n },\n };\n}\n\nexport function createDecryptor(registry: Registry, options: CreateTransformOptions): Transform {\n const cipher = registry.get<'cipher', CipherComponent>('cipher', options.cipher);\n if (cipher.type === 'stream') {\n return createStreamDecryptor(cipher.createDecryptor({\n key: options.key,\n options,\n }));\n }\n\n const { mode, padding } = resolveBlockOptions(registry, options);\n const blockCipher = cipher.create(options.key);\n\n const modeDecryptor = mode.createDecryptor({\n cipher: blockCipher,\n iv: options.iv,\n options,\n });\n\n if (mode.requiresPadding === false) {\n return createStreamDecryptor(modeDecryptor);\n }\n const blockPadding = padding as PaddingComponent;\n\n let finalized = false;\n let pending: Uint8Array = new Uint8Array(0);\n let plaintextPending: Uint8Array = new Uint8Array(0);\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n const data = concatBytes(pending, input);\n const processLength = data.length - (data.length % blockCipher.blockSize);\n pending = data.slice(processLength);\n\n if (processLength === 0) {\n return new Uint8Array(0);\n }\n\n const decrypted = modeDecryptor.process(data.subarray(0, processLength));\n const output = plaintextPending;\n plaintextPending = decrypted;\n return output;\n },\n\n finalize(input = new Uint8Array(0)) {\n assertNotFinalized(finalized);\n const processed = input.length === 0 ? new Uint8Array(0) : this.process(input);\n finalized = true;\n if (pending.length !== 0) {\n blockPadding.unpad(pending, blockCipher.blockSize);\n }\n const finalPlaintext = blockPadding.unpad(plaintextPending, blockCipher.blockSize);\n pending = new Uint8Array(0);\n plaintextPending = new Uint8Array(0);\n return concatBytes(processed, finalPlaintext, modeDecryptor.finalize());\n },\n };\n}\n\nfunction createStreamEncryptor(modeEncryptor: Transform): Transform {\n let finalized = false;\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n return modeEncryptor.process(input);\n },\n\n finalize(input = new Uint8Array(0)) {\n assertNotFinalized(finalized);\n finalized = true;\n return concatBytes(\n input.length === 0 ? new Uint8Array(0) : modeEncryptor.process(input),\n modeEncryptor.finalize(),\n );\n },\n };\n}\n\nfunction createStreamDecryptor(modeDecryptor: Transform): Transform {\n let finalized = false;\n\n return {\n process(input) {\n assertNotFinalized(finalized);\n return modeDecryptor.process(input);\n },\n\n finalize(input = new Uint8Array(0)) {\n assertNotFinalized(finalized);\n finalized = true;\n return concatBytes(\n input.length === 0 ? new Uint8Array(0) : modeDecryptor.process(input),\n modeDecryptor.finalize(),\n );\n },\n };\n}\n\nfunction resolveBlockOptions(registry: Registry, options: CreateTransformOptions): {\n cipher: BlockCipherComponent;\n mode: ModeComponent;\n padding?: PaddingComponent;\n} {\n if (!options.mode) {\n throw new Error(`${options.cipher} block cipher requires a mode.`);\n }\n\n const mode = registry.get<'mode', ModeComponent>('mode', options.mode);\n let padding: PaddingComponent | undefined;\n if (mode.requiresPadding !== false) {\n if (!options.padding) {\n throw new Error(`${options.cipher} block cipher requires padding.`);\n }\n padding = registry.get<'padding', PaddingComponent>('padding', options.padding);\n }\n\n return {\n cipher: registry.get<'cipher', BlockCipherComponent>('cipher', options.cipher),\n mode,\n padding,\n };\n}\n\nfunction assertNotFinalized(finalized: boolean): void {\n if (finalized) {\n throw new Error('Transform is already finalized.');\n }\n}\n", "import type { AnyComponent, Component, ComponentKind, PresetComponent } from './component.js';\nimport { DuplicateComponentError, MissingComponentError } from './errors.js';\nimport type { CreatePassphraseCipherOptions, PassphraseCipherFacade } from './passphrase.js';\nimport { createPassphraseCipher } from './passphrase.js';\nimport type { CreateTransformOptions } from './transform.js';\nimport { createDecryptor, createEncryptor } from './transform.js';\nimport type { Transform } from './component.js';\n\nexport interface Registry {\n use(component: AnyComponent): Registry;\n has(kind: ComponentKind, name: string): boolean;\n get<Kind extends ComponentKind, T extends Component<Kind>>(kind: Kind, name: string): T;\n list(kind?: ComponentKind): AnyComponent[];\n createCipher(options: CreateTransformOptions): CipherFacade;\n createPassphraseCipher(options: CreatePassphraseCipherOptions): PassphraseCipherFacade;\n encrypt(options: CreateTransformOptions & { plaintext: Uint8Array }): Uint8Array;\n decrypt(options: CreateTransformOptions & { ciphertext: Uint8Array }): Uint8Array;\n createEncryptor(options: CreateTransformOptions): Transform;\n createDecryptor(options: CreateTransformOptions): Transform;\n}\n\nexport interface CipherFacade {\n encrypt(plaintext: Uint8Array): Uint8Array;\n decrypt(ciphertext: Uint8Array): Uint8Array;\n createEncryptor(): Transform;\n createDecryptor(): Transform;\n}\n\nexport function createRegistry(components: Iterable<AnyComponent> = []): Registry {\n const entries = new Map<string, AnyComponent>();\n\n const key = (kind: ComponentKind, name: string) => `${kind}:${name}`;\n\n const registry: Registry = {\n use(component) {\n if (component.kind === 'preset') {\n for (const item of (component as PresetComponent).components()) {\n registry.use(item);\n }\n return registry;\n }\n\n const entryKey = key(component.kind, component.name);\n if (entries.has(entryKey)) {\n throw new DuplicateComponentError(component.kind, component.name);\n }\n entries.set(entryKey, component);\n return registry;\n },\n\n has(kind, name) {\n return entries.has(key(kind, name));\n },\n\n get(kind, name) {\n const component = entries.get(key(kind, name));\n if (!component) {\n throw new MissingComponentError(kind, name);\n }\n return component as never;\n },\n\n list(kind) {\n const components = [...entries.values()];\n return kind ? components.filter((component) => component.kind === kind) : components;\n },\n\n createCipher(options) {\n return {\n encrypt(plaintext) {\n return createEncryptor(registry, options).finalize(plaintext);\n },\n\n decrypt(ciphertext) {\n return createDecryptor(registry, options).finalize(ciphertext);\n },\n\n createEncryptor() {\n return createEncryptor(registry, options);\n },\n\n createDecryptor() {\n return createDecryptor(registry, options);\n },\n };\n },\n\n createPassphraseCipher(options) {\n return createPassphraseCipher(registry, options);\n },\n\n encrypt(options) {\n return createEncryptor(registry, options).finalize(options.plaintext);\n },\n\n decrypt(options) {\n return createDecryptor(registry, options).finalize(options.ciphertext);\n },\n\n createEncryptor(options) {\n return createEncryptor(registry, options);\n },\n\n createDecryptor(options) {\n return createDecryptor(registry, options);\n },\n };\n\n for (const component of components) {\n registry.use(component);\n }\n\n return registry;\n}\n", "export interface BlockSizeOptions {\n readonly max?: number;\n}\n\nexport function assertBlockSize(blockSize: number, options: BlockSizeOptions = {}): void {\n const { max } = options;\n if (!Number.isInteger(blockSize) || blockSize <= 0) {\n throw new RangeError('blockSize must be a positive integer.');\n }\n if (max !== undefined && blockSize > max) {\n throw new RangeError(`blockSize must be an integer between 1 and ${max}.`);\n }\n}\n\nexport function assertBlockMultiple(input: Uint8Array, blockSize: number, label: string): void {\n assertBlockSize(blockSize);\n if (input.length % blockSize !== 0) {\n throw new Error(`${label} input length must be a multiple of the block size.`);\n }\n}\n\nexport function assertPaddedInput(input: Uint8Array, blockSize: number, label: string, options: BlockSizeOptions = {}): void {\n assertBlockSize(blockSize, options);\n if (input.length === 0 || input.length % blockSize !== 0) {\n throw new Error(`Invalid ${label} padded data.`);\n }\n}\n\nexport function assertIv(blockSize: number, iv: Uint8Array | undefined, modeName: string): asserts iv is Uint8Array {\n if (!iv) {\n throw new Error(`${modeName} mode requires an IV.`);\n }\n if (iv.length !== blockSize) {\n throw new Error(`${modeName} IV length must match the cipher block size.`);\n }\n}\n\nexport function getBlockPaddingLength(inputLength: number, blockSize: number): number {\n const remainder = inputLength % blockSize;\n return remainder === 0 ? blockSize : blockSize - remainder;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["components"]
7
7
  }