@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.
- package/dist/component.d.ts +1 -0
- package/dist/component.d.ts.map +1 -1
- package/dist/index.cjs +104 -58
- package/dist/index.cjs.map +2 -2
- package/dist/index.mjs +106 -58
- package/dist/index.mjs.map +2 -2
- package/dist/jscrypto-core.iife.js +104 -58
- package/dist/jscrypto-core.iife.js.map +2 -2
- package/dist/jscrypto-core.iife.min.js +2 -2
- package/dist/jscrypto-core.iife.min.js.map +3 -3
- package/dist/jscrypto-core.umd.js +104 -58
- package/dist/jscrypto-core.umd.js.map +2 -2
- package/dist/jscrypto-core.umd.min.js +2 -2
- package/dist/jscrypto-core.umd.min.js.map +3 -3
- package/dist/passphrase.js +39 -32
- package/dist/passphrase.js.map +1 -1
- package/dist/transform.d.ts.map +1 -1
- package/dist/transform.js +32 -23
- package/dist/transform.js.map +1 -1
- package/package.json +10 -1
package/dist/component.d.ts
CHANGED
|
@@ -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;
|
package/dist/component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,SAAS,CACxB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,IAAI,SAAS,MAAM,GAAG,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IACpD,oBAAoB,CAAC,IAAI,CAAC,GAC1B,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAEhC,MAAM,WAAW,oBAAoB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IACnG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IACpG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,eAAe,CAAC,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAChE,eAAe,CAAC,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAC;CACjE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAC5C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;IAC1F,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7D,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,CAAC,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,SAAS,CACxB,IAAI,SAAS,aAAa,GAAG,aAAa,EAC1C,IAAI,SAAS,MAAM,GAAG,MAAM;IAE5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IACpD,oBAAoB,CAAC,IAAI,CAAC,GAC1B,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAEhC,MAAM,WAAW,oBAAoB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IACnG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,WAAW,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IACpG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,eAAe,CAAC,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAChE,eAAe,CAAC,MAAM,EAAE,2BAA2B,GAAG,SAAS,CAAC;CACjE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IAC5C,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;IAC1F,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7D,eAAe,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC;IAChG,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;IACtD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;CACzD;AAED,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;IACxF,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC9F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CAAC;IACrD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,iBAAiB,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,eAAe,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC9F,UAAU,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,YAAY,GACZ,eAAe,GACf,eAAe,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,13 +1,42 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @jscrypto/core v0.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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,
|
|
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
|
|
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 =
|
|
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
|
-
|
|
448
|
+
blockPadding.unpad(pending, blockCipher.blockSize);
|
|
408
449
|
}
|
|
409
|
-
const finalPlaintext =
|
|
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
|
-
|
|
455
|
-
|
|
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
|
|
460
|
-
padding
|
|
505
|
+
mode,
|
|
506
|
+
padding
|
|
461
507
|
};
|
|
462
508
|
}
|
|
463
509
|
function assertNotFinalized(finalized) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
}
|