@cloudpss/crypto 0.5.24 → 0.5.25
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/benchmark.js +44 -0
- package/dist/encryption/browser.d.ts +3 -3
- package/dist/encryption/browser.js.map +1 -1
- package/dist/encryption/common.d.ts +45 -16
- package/dist/encryption/common.js +57 -9
- package/dist/encryption/common.js.map +1 -1
- package/dist/encryption/index.d.ts +4 -21
- package/dist/encryption/index.js +11 -63
- package/dist/encryption/index.js.map +1 -1
- package/dist/encryption/js/aes.d.ts +20 -0
- package/dist/encryption/js/aes.js +151 -0
- package/dist/encryption/js/aes.js.map +1 -0
- package/dist/encryption/js/gcm.d.ts +26 -0
- package/dist/encryption/js/gcm.js +226 -0
- package/dist/encryption/js/gcm.js.map +1 -0
- package/dist/encryption/module.d.ts +22 -0
- package/dist/encryption/module.js +62 -0
- package/dist/encryption/module.js.map +1 -0
- package/dist/encryption/node.d.ts +3 -3
- package/dist/encryption/node.js +19 -15
- package/dist/encryption/node.js.map +1 -1
- package/dist/encryption/pure-js.d.ts +3 -3
- package/dist/encryption/pure-js.js +70 -42
- package/dist/encryption/pure-js.js.map +1 -1
- package/dist/encryption/web.d.ts +3 -3
- package/dist/encryption/web.js +17 -15
- package/dist/encryption/web.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
- package/src/encryption/browser.ts +3 -3
- package/src/encryption/common.ts +79 -16
- package/src/encryption/index.ts +12 -71
- package/src/encryption/js/aes.ts +191 -0
- package/src/encryption/js/gcm.ts +258 -0
- package/src/encryption/module.ts +94 -0
- package/src/encryption/node.ts +24 -15
- package/src/encryption/pure-js.ts +89 -46
- package/src/encryption/web.ts +24 -15
- package/src/index.ts +1 -1
- package/tests/encryption.js +126 -49
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { AES } from './aes.js';
|
|
2
|
+
// const console = { log() {} };
|
|
3
|
+
const EMPTY = new Uint8Array(0);
|
|
4
|
+
/** GCM (Galois/Counter Mode) */
|
|
5
|
+
export class GCM {
|
|
6
|
+
cipher;
|
|
7
|
+
iv;
|
|
8
|
+
tagLength;
|
|
9
|
+
aad;
|
|
10
|
+
constructor(cipher, iv, tagLength = 128, aad = EMPTY) {
|
|
11
|
+
this.cipher = cipher;
|
|
12
|
+
this.iv = iv;
|
|
13
|
+
this.tagLength = tagLength;
|
|
14
|
+
this.aad = aad;
|
|
15
|
+
this.H = new Uint32Array(4);
|
|
16
|
+
this.cipher.encrypt(new Uint32Array(4), 0, this.H, 0);
|
|
17
|
+
}
|
|
18
|
+
/** Convert a Uint8Array to a Uint32Array */
|
|
19
|
+
toUint32Array(data) {
|
|
20
|
+
const out = new Uint32Array(Math.ceil(data.byteLength / 4));
|
|
21
|
+
for (let i = 0; i < out.length; i++) {
|
|
22
|
+
out[i] = (data[i * 4] << 24) | (data[i * 4 + 1] << 16) | (data[i * 4 + 2] << 8) | data[i * 4 + 3];
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
/** Convert a Uint32Array to a Uint8Array */
|
|
27
|
+
toUint8Array(data, byteLength) {
|
|
28
|
+
const out = new Uint8Array(byteLength);
|
|
29
|
+
for (let i = 0; i < byteLength; i++) {
|
|
30
|
+
out[i] = (data[Math.trunc(i / 4)] >>> (24 - (i % 4) * 8)) & 0xff;
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/** Set out of range bytes to 0 */
|
|
35
|
+
clamp(data, byteLength) {
|
|
36
|
+
const mask = 0xffff_ffff << (32 - (byteLength % 4) * 8);
|
|
37
|
+
data[Math.trunc(byteLength / 4)] &= mask;
|
|
38
|
+
}
|
|
39
|
+
H;
|
|
40
|
+
/** Compute the galois multiplication of X and Y */
|
|
41
|
+
galoisMultiply(x_r, y) {
|
|
42
|
+
let Zi0 = 0, Zi1 = 0, Zi2 = 0, Zi3 = 0;
|
|
43
|
+
let Vi0 = y[0], Vi1 = y[1], Vi2 = y[2], Vi3 = y[3];
|
|
44
|
+
// Block size is 128 bits, run 128 times to get Z_128
|
|
45
|
+
for (let i = 0; i < 128; i++) {
|
|
46
|
+
const xi = (x_r[i >> 5] & (1 << (31 - (i % 32)))) !== 0;
|
|
47
|
+
if (xi) {
|
|
48
|
+
// Z_i+1 = Z_i ^ V_i
|
|
49
|
+
Zi0 ^= Vi0;
|
|
50
|
+
Zi1 ^= Vi1;
|
|
51
|
+
Zi2 ^= Vi2;
|
|
52
|
+
Zi3 ^= Vi3;
|
|
53
|
+
}
|
|
54
|
+
// Store the value of LSB(V_i)
|
|
55
|
+
const lsb_Vi = (Vi3 & 1) !== 0;
|
|
56
|
+
// V_i+1 = V_i >> 1
|
|
57
|
+
Vi3 = (Vi3 >>> 1) | ((Vi2 & 1) << 31);
|
|
58
|
+
Vi2 = (Vi2 >>> 1) | ((Vi1 & 1) << 31);
|
|
59
|
+
Vi1 = (Vi1 >>> 1) | ((Vi0 & 1) << 31);
|
|
60
|
+
Vi0 = Vi0 >>> 1;
|
|
61
|
+
// If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R
|
|
62
|
+
if (lsb_Vi) {
|
|
63
|
+
Vi0 = Vi0 ^ (0xe1 << 24);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
x_r[0] = Zi0;
|
|
67
|
+
x_r[1] = Zi1;
|
|
68
|
+
x_r[2] = Zi2;
|
|
69
|
+
x_r[3] = Zi3;
|
|
70
|
+
}
|
|
71
|
+
/** Ghash */
|
|
72
|
+
ghash(Y, data) {
|
|
73
|
+
const l = data.length;
|
|
74
|
+
for (let i = 0; i < l; i += 4) {
|
|
75
|
+
Y[0] ^= 0xffff_ffff & data[i];
|
|
76
|
+
Y[1] ^= 0xffff_ffff & data[i + 1];
|
|
77
|
+
Y[2] ^= 0xffff_ffff & data[i + 2];
|
|
78
|
+
Y[3] ^= 0xffff_ffff & data[i + 3];
|
|
79
|
+
this.galoisMultiply(Y, this.H);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** GCM CTR mode. */
|
|
83
|
+
ctr(encrypt, data, length) {
|
|
84
|
+
// console.log('data inpm', toHex(data));
|
|
85
|
+
// Calculate data lengths
|
|
86
|
+
const l = length / 4;
|
|
87
|
+
const bl = l * 32;
|
|
88
|
+
const abl = this.aad.byteLength * 8;
|
|
89
|
+
const ivbl = this.iv.byteLength * 8;
|
|
90
|
+
// Calculate the parameters
|
|
91
|
+
const J0 = new Uint32Array(4);
|
|
92
|
+
if (ivbl === 96) {
|
|
93
|
+
new Uint8Array(J0.buffer, J0.byteOffset).set(this.iv);
|
|
94
|
+
J0[3] = 1;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.ghash(J0, this.toUint32Array(this.iv));
|
|
98
|
+
this.ghash(J0, new Uint32Array([0, 0, Math.trunc(ivbl / 0x1_0000_0000), ivbl & 0xffff_ffff]));
|
|
99
|
+
}
|
|
100
|
+
const S0 = new Uint32Array(4);
|
|
101
|
+
this.ghash(S0, this.toUint32Array(this.aad));
|
|
102
|
+
// Initialize ctr and tag
|
|
103
|
+
const tag = S0.slice(0);
|
|
104
|
+
// If decrypting, calculate hash
|
|
105
|
+
if (!encrypt) {
|
|
106
|
+
this.ghash(tag, data);
|
|
107
|
+
}
|
|
108
|
+
// Encrypt all the data
|
|
109
|
+
const ctr = J0.slice(0);
|
|
110
|
+
const enc = new Uint32Array(4);
|
|
111
|
+
for (let i = 0; i < l; i += 4) {
|
|
112
|
+
ctr[3]++;
|
|
113
|
+
this.cipher.encrypt(ctr, 0, enc, 0);
|
|
114
|
+
data[i] ^= enc[0];
|
|
115
|
+
data[i + 1] ^= enc[1];
|
|
116
|
+
data[i + 2] ^= enc[2];
|
|
117
|
+
data[i + 3] ^= enc[3];
|
|
118
|
+
}
|
|
119
|
+
this.clamp(data, length);
|
|
120
|
+
// console.log('data inpm', toHex(data));
|
|
121
|
+
// console.log('H impl', toHex(this.H));
|
|
122
|
+
// console.log('tag impl', toHex(tag));
|
|
123
|
+
// If encrypting, calculate hash
|
|
124
|
+
if (encrypt) {
|
|
125
|
+
this.ghash(tag, data);
|
|
126
|
+
}
|
|
127
|
+
// console.log('tag impl', toHex(tag));
|
|
128
|
+
// Calculate last block from bit lengths, ugly because bitwise operations are 32-bit
|
|
129
|
+
// Calculate the final tag block
|
|
130
|
+
this.ghash(tag, new Uint32Array([
|
|
131
|
+
Math.trunc(abl / 0x1_0000_0000),
|
|
132
|
+
abl & 0xffff_ffff,
|
|
133
|
+
Math.trunc(bl / 0x1_0000_0000),
|
|
134
|
+
bl & 0xffff_ffff,
|
|
135
|
+
]));
|
|
136
|
+
this.cipher.encrypt(J0, 0, enc, 0);
|
|
137
|
+
tag[0] ^= enc[0];
|
|
138
|
+
tag[1] ^= enc[1];
|
|
139
|
+
tag[2] ^= enc[2];
|
|
140
|
+
tag[3] ^= enc[3];
|
|
141
|
+
// console.log('tag impl', toHex(tag));
|
|
142
|
+
return {
|
|
143
|
+
tag: new Uint8Array(tag.buffer, tag.byteOffset, this.tagLength / 8),
|
|
144
|
+
data,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** 加密 */
|
|
148
|
+
encrypt(data) {
|
|
149
|
+
const length = data.byteLength;
|
|
150
|
+
const data32 = this.toUint32Array(data);
|
|
151
|
+
const { data: out, tag } = this.ctr(true, data32, length);
|
|
152
|
+
const result = new Uint8Array(length + tag.byteLength);
|
|
153
|
+
result.set(this.toUint8Array(out, length), 0);
|
|
154
|
+
result.set(tag, length);
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/** 解密 */
|
|
158
|
+
decrypt(data) {
|
|
159
|
+
let tag, data32, length;
|
|
160
|
+
if (this.tagLength / 8 > data.byteLength) {
|
|
161
|
+
throw new Error('GCM: invalid data length');
|
|
162
|
+
}
|
|
163
|
+
else if (this.tagLength / 8 === data.byteLength) {
|
|
164
|
+
length = 0;
|
|
165
|
+
tag = data;
|
|
166
|
+
data32 = new Uint32Array(0);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
length = data.byteLength - this.tagLength / 8;
|
|
170
|
+
tag = data.subarray(length);
|
|
171
|
+
data32 = this.toUint32Array(data.subarray(0, length));
|
|
172
|
+
}
|
|
173
|
+
const { data: out, tag: tag2 } = this.ctr(false, data32, length);
|
|
174
|
+
if (tag2.some((v, i) => v !== tag[i])) {
|
|
175
|
+
throw new Error('GCM: tag does not match');
|
|
176
|
+
}
|
|
177
|
+
return this.toUint8Array(out, length);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// import sjcl from 'sjcl';
|
|
181
|
+
// global.sjcl = sjcl;
|
|
182
|
+
// // @ts-expect-error sjcl is not a module
|
|
183
|
+
// await import('sjcl/core/aes.js');
|
|
184
|
+
// // @ts-expect-error sjcl is not a module
|
|
185
|
+
// await import('sjcl/core/gcm.js');
|
|
186
|
+
// // @ts-expect-error sjcl is not a module
|
|
187
|
+
// await import('sjcl/core/bitArray.js');
|
|
188
|
+
// // @ts-expect-error sjcl is not a module
|
|
189
|
+
// await import('sjcl/core/pbkdf2.js');
|
|
190
|
+
// // @ts-expect-error sjcl is not a module
|
|
191
|
+
// await import('sjcl/core/hmac.js');
|
|
192
|
+
// // @ts-expect-error sjcl is not a module
|
|
193
|
+
// await import('sjcl/core/sha256.js');
|
|
194
|
+
// // @ts-expect-error sjcl is not a module
|
|
195
|
+
// await import('sjcl/core/codecBytes.js');
|
|
196
|
+
// function toHex(arr: number[] | Uint32Array | Int32Array | Uint8Array): string[] {
|
|
197
|
+
// if (arr instanceof Uint8Array) {
|
|
198
|
+
// const result = [];
|
|
199
|
+
// for (let i = 0; i < arr.length; i += 4) {
|
|
200
|
+
// const a = arr[i].toString(16).padStart(2, '0');
|
|
201
|
+
// const b = arr[i + 1]?.toString(16).padStart(2, '0') ?? '';
|
|
202
|
+
// const c = arr[i + 2]?.toString(16).padStart(2, '0') ?? '';
|
|
203
|
+
// const d = arr[i + 3]?.toString(16).padStart(2, '0') ?? '';
|
|
204
|
+
// result.push(a + b + c + d);
|
|
205
|
+
// }
|
|
206
|
+
// return result;
|
|
207
|
+
// }
|
|
208
|
+
// return [...arr].map((x) => {
|
|
209
|
+
// if (x < 0) x = 0xffffffff + x + 1;
|
|
210
|
+
// return x.toString(16).padStart(8, '0');
|
|
211
|
+
// });
|
|
212
|
+
// }
|
|
213
|
+
// // @ts-expect-error sjcl is not a module
|
|
214
|
+
// global.toHex = toHex;
|
|
215
|
+
// const data = new Uint8Array([1, 2, 3, 4, 5, 6, 7]);
|
|
216
|
+
// const key = [1, 2, 3, 4];
|
|
217
|
+
// const iv = [9, 8, 7];
|
|
218
|
+
// const aes = new AES(new Uint32Array(key));
|
|
219
|
+
// const gcm = new GCM(aes, new Uint8Array(new Uint32Array(iv).buffer));
|
|
220
|
+
// const e1 = gcm.encrypt(data);
|
|
221
|
+
// const e2 = sjcl.mode.gcm.encrypt(new sjcl.cipher.aes(key), sjcl.codec.bytes.toBits([...data]), iv);
|
|
222
|
+
// console.log({ d: toHex(e1), l: e1.byteLength }, { d: toHex(e2), l: sjcl.bitArray.bitLength(e2) / 8 });
|
|
223
|
+
// const d1 = gcm.decrypt(e1);
|
|
224
|
+
// const d2 = sjcl.mode.gcm.decrypt(new sjcl.cipher.aes(key), e2, iv);
|
|
225
|
+
// console.log({ d: toHex(d1), l: d1.byteLength }, { d: toHex(d2), l: sjcl.bitArray.bitLength(d2) / 8 });
|
|
226
|
+
//# sourceMappingURL=gcm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcm.js","sourceRoot":"","sources":["../../../src/encryption/js/gcm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** 模块 */
|
|
2
|
+
interface Module {
|
|
3
|
+
/**
|
|
4
|
+
* 加密数据
|
|
5
|
+
* @throws {TypeError} 如果密码无效
|
|
6
|
+
*/
|
|
7
|
+
encrypt(data: BinaryData, passphrase: string): Promise<Uint8Array>;
|
|
8
|
+
/**
|
|
9
|
+
* 加密数据,包含不加密的附加数据
|
|
10
|
+
* @throws {TypeError} 如果密码无效
|
|
11
|
+
*/
|
|
12
|
+
encryptAad(data: BinaryData, aad: BinaryData | undefined, passphrase: string): Promise<Uint8Array>;
|
|
13
|
+
/**
|
|
14
|
+
* 解密数据
|
|
15
|
+
* @throws {TypeError} 如果数据不是有效的加密数据
|
|
16
|
+
* @throws {TypeError} 如果密码无效
|
|
17
|
+
*/
|
|
18
|
+
decrypt(data: BinaryData, passphrase: string): Promise<Uint8Array>;
|
|
19
|
+
}
|
|
20
|
+
/** 创建模块 */
|
|
21
|
+
export declare function createModule(impl: typeof import('#encryption')): Module;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { toUint8Array } from '../utils.js';
|
|
2
|
+
import { AAD_LEN_SIZE, AAD_MAX_SIZE, AAD_PADDING, MAGIC_NUMBER, NONCE_SIZE, padding, parseEncrypted, } from './common.js';
|
|
3
|
+
/** 检查密码 */
|
|
4
|
+
function assertPassphrase(passphrase) {
|
|
5
|
+
if (typeof passphrase !== 'string') {
|
|
6
|
+
throw new TypeError('Invalid passphrase, must be a string');
|
|
7
|
+
}
|
|
8
|
+
if (passphrase.length === 0) {
|
|
9
|
+
throw new TypeError('Invalid passphrase, must not be empty');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** 创建模块 */
|
|
13
|
+
export function createModule(impl) {
|
|
14
|
+
const encryptAad = async (data, aad, passphrase) => {
|
|
15
|
+
assertPassphrase(passphrase);
|
|
16
|
+
const aadSize = aad?.byteLength ?? 0;
|
|
17
|
+
if (aadSize > AAD_MAX_SIZE) {
|
|
18
|
+
throw new TypeError('Invalid AAD size');
|
|
19
|
+
}
|
|
20
|
+
const paddedAddSize = padding(aadSize, AAD_PADDING);
|
|
21
|
+
const plain = {
|
|
22
|
+
aad: aadSize ? toUint8Array(aad) : undefined,
|
|
23
|
+
data: toUint8Array(data),
|
|
24
|
+
};
|
|
25
|
+
const encrypted = await impl.encrypt(plain, passphrase);
|
|
26
|
+
const result = new Uint8Array(MAGIC_NUMBER.length + NONCE_SIZE + AAD_LEN_SIZE + paddedAddSize + encrypted.data.length);
|
|
27
|
+
result.set(MAGIC_NUMBER);
|
|
28
|
+
result.set(encrypted.nonce, MAGIC_NUMBER.length);
|
|
29
|
+
if (aadSize) {
|
|
30
|
+
result[MAGIC_NUMBER.length + NONCE_SIZE] = aadSize >>> 24;
|
|
31
|
+
result[MAGIC_NUMBER.length + NONCE_SIZE + 1] = aadSize >>> 16;
|
|
32
|
+
result[MAGIC_NUMBER.length + NONCE_SIZE + 2] = aadSize >>> 8;
|
|
33
|
+
result[MAGIC_NUMBER.length + NONCE_SIZE + 3] = aadSize;
|
|
34
|
+
result.set(plain.aad, MAGIC_NUMBER.length + NONCE_SIZE + AAD_LEN_SIZE);
|
|
35
|
+
}
|
|
36
|
+
result.set(encrypted.data, MAGIC_NUMBER.length + NONCE_SIZE + AAD_LEN_SIZE + paddedAddSize);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
const encrypt = async (data, passphrase) => {
|
|
40
|
+
return await encryptAad(data, undefined, passphrase);
|
|
41
|
+
};
|
|
42
|
+
const decrypt = async (data, passphrase) => {
|
|
43
|
+
assertPassphrase(passphrase);
|
|
44
|
+
const encrypted = parseEncrypted(data);
|
|
45
|
+
if (encrypted == null) {
|
|
46
|
+
throw new TypeError('Invalid encrypted data');
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const result = await impl.decrypt(encrypted, passphrase);
|
|
50
|
+
return result.data;
|
|
51
|
+
}
|
|
52
|
+
catch (ex) {
|
|
53
|
+
throw new Error('Wrong passphrase', { cause: ex });
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
encrypt,
|
|
58
|
+
encryptAad,
|
|
59
|
+
decrypt,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/encryption/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type EncryptedData, type PlainData } from './common.js';
|
|
2
2
|
/** nodejs encrypt */
|
|
3
|
-
export declare function encrypt(data:
|
|
3
|
+
export declare function encrypt({ data, aad }: PlainData, passphrase: string): Promise<EncryptedData>;
|
|
4
4
|
/** nodejs decrypt */
|
|
5
|
-
export declare function decrypt({
|
|
5
|
+
export declare function decrypt({ nonce, aad, data }: EncryptedData, passphrase: string): Promise<PlainData>;
|
package/dist/encryption/node.js
CHANGED
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
import { pbkdf2 as _pbkdf2, createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
|
|
2
|
-
import { PBKDF2_ITERATIONS,
|
|
2
|
+
import { PBKDF2_ITERATIONS, NONCE_SIZE, AES_TAG_SIZE, AES_KEY_SIZE, } from './common.js';
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
import { toUint8Array } from '../utils.js';
|
|
5
|
+
const pbkdf2 = promisify(_pbkdf2);
|
|
5
6
|
const aesKdf = (passphrase, salt) => {
|
|
6
|
-
return
|
|
7
|
+
return pbkdf2(passphrase, salt, PBKDF2_ITERATIONS, AES_KEY_SIZE, 'sha256');
|
|
7
8
|
};
|
|
8
9
|
/** nodejs encrypt */
|
|
9
|
-
export async function encrypt(data, passphrase) {
|
|
10
|
-
const
|
|
11
|
-
const key = await aesKdf(passphrase,
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
export async function encrypt({ data, aad }, passphrase) {
|
|
11
|
+
const nonce = randomBytes(NONCE_SIZE);
|
|
12
|
+
const key = await aesKdf(passphrase, nonce);
|
|
13
|
+
const cipher = createCipheriv('aes-256-gcm', key, nonce, { authTagLength: AES_TAG_SIZE });
|
|
14
|
+
if (aad)
|
|
15
|
+
cipher.setAAD(aad);
|
|
16
|
+
const encrypted = Buffer.concat([cipher.update(data), cipher.final(), cipher.getAuthTag()]);
|
|
15
17
|
return {
|
|
16
|
-
|
|
17
|
-
iv: toUint8Array(iv),
|
|
18
|
+
nonce: toUint8Array(nonce),
|
|
18
19
|
data: toUint8Array(encrypted),
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
/** nodejs decrypt */
|
|
22
|
-
export async function decrypt({
|
|
23
|
-
const key = await aesKdf(passphrase,
|
|
24
|
-
const decipher = createDecipheriv('aes-256-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
export async function decrypt({ nonce, aad, data }, passphrase) {
|
|
24
|
+
const key = await aesKdf(passphrase, nonce);
|
|
25
|
+
const decipher = createDecipheriv('aes-256-gcm', key, nonce, { authTagLength: AES_TAG_SIZE });
|
|
26
|
+
decipher.setAuthTag(data.subarray(data.length - AES_TAG_SIZE));
|
|
27
|
+
if (aad)
|
|
28
|
+
decipher.setAAD(aad);
|
|
29
|
+
const decrypted = Buffer.concat([decipher.update(data.subarray(0, data.length - AES_TAG_SIZE)), decipher.final()]);
|
|
30
|
+
return { data: toUint8Array(decrypted) };
|
|
27
31
|
}
|
|
28
32
|
//# sourceMappingURL=node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/encryption/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/encryption/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EACH,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,YAAY,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAClC,MAAM,MAAM,GAAG,CAAC,UAAkB,EAAE,IAAgB,EAAmB,EAAE;IACrE,OAAO,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,qBAAqB;AACrB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAa,EAAE,UAAkB;IACtE,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1F,IAAI,GAAG;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO;QACH,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;QAC1B,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;KAChC,CAAC;AACN,CAAC;AAED,qBAAqB;AACrB,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAiB,EAAE,UAAkB;IACjF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9F,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC;IAC/D,IAAI,GAAG;QAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnH,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type EncryptedData, type PlainData } from './common.js';
|
|
2
2
|
/** crypto-js encrypt */
|
|
3
|
-
export declare function encrypt(data:
|
|
3
|
+
export declare function encrypt({ data, aad }: PlainData, passphrase: string): Promise<EncryptedData>;
|
|
4
4
|
/** crypto-js decrypt */
|
|
5
|
-
export declare function decrypt({ data,
|
|
5
|
+
export declare function decrypt({ data, aad, nonce }: EncryptedData, passphrase: string): Promise<PlainData>;
|
|
@@ -1,54 +1,82 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import sjcl from 'sjcl';
|
|
2
|
+
import { NONCE_SIZE, AES_KEY_SIZE, AES_TAG_SIZE, PBKDF2_ITERATIONS, } from './common.js';
|
|
3
|
+
// Load unminified version for debugging
|
|
4
|
+
// globalThis.sjcl = sjcl;
|
|
5
|
+
// // @ts-expect-error sjcl is not a module
|
|
6
|
+
// await import('sjcl/core/aes.js');
|
|
7
|
+
// // @ts-expect-error sjcl is not a module
|
|
8
|
+
// await import('sjcl/core/gcm.js');
|
|
9
|
+
// // @ts-expect-error sjcl is not a module
|
|
10
|
+
// await import('sjcl/core/bitArray.js');
|
|
11
|
+
// // @ts-expect-error sjcl is not a module
|
|
12
|
+
// await import('sjcl/core/pbkdf2.js');
|
|
13
|
+
// // @ts-expect-error sjcl is not a module
|
|
14
|
+
// await import('sjcl/core/hmac.js');
|
|
15
|
+
// // @ts-expect-error sjcl is not a module
|
|
16
|
+
// await import('sjcl/core/sha256.js');
|
|
5
17
|
/** Convert word array to buffer data */
|
|
6
|
-
function wordArrayToBuffer(
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
function wordArrayToBuffer(bitArray) {
|
|
19
|
+
const len = sjcl.bitArray.bitLength(bitArray) / 8;
|
|
20
|
+
const out = new Uint8Array(len);
|
|
21
|
+
for (let i = 0; i < len; i += 4) {
|
|
22
|
+
const tmp = bitArray[i / 4];
|
|
23
|
+
out[i] = (tmp >>> 24) & 0xff;
|
|
24
|
+
out[i + 1] = (tmp >>> 16) & 0xff;
|
|
25
|
+
out[i + 2] = (tmp >>> 8) & 0xff;
|
|
26
|
+
out[i + 3] = tmp & 0xff;
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
15
29
|
}
|
|
16
30
|
/** Convert buffer data to word array */
|
|
17
31
|
function bufferToWordArray(buffer) {
|
|
18
|
-
|
|
32
|
+
const out = [];
|
|
33
|
+
const length = buffer.byteLength;
|
|
34
|
+
for (let i = 0; i < length; i += 4) {
|
|
35
|
+
out.push((buffer[i] << 24) | (buffer[i + 1] << 16) | (buffer[i + 2] << 8) | buffer[i + 3]);
|
|
36
|
+
}
|
|
37
|
+
if (length & 3) {
|
|
38
|
+
out[out.length - 1] = sjcl.bitArray.partial(8 * (length & 3), out[out.length - 1], 1);
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
19
41
|
}
|
|
20
42
|
/** Create aes params */
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
});
|
|
30
|
-
return WordArray.create(result);
|
|
43
|
+
function aesKdfJs(passphrase, salt) {
|
|
44
|
+
return sjcl.misc.pbkdf2(passphrase, salt, PBKDF2_ITERATIONS, AES_KEY_SIZE * 8, sjcl.misc.hmac);
|
|
45
|
+
}
|
|
46
|
+
/** wrap non-error thrown */
|
|
47
|
+
function wrapError(error) {
|
|
48
|
+
if (error instanceof Error) {
|
|
49
|
+
return error;
|
|
50
|
+
}
|
|
51
|
+
return new Error(String(error), { cause: error });
|
|
31
52
|
}
|
|
32
53
|
/** crypto-js encrypt */
|
|
33
|
-
export async function encrypt(data, passphrase) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
54
|
+
export async function encrypt({ data, aad }, passphrase) {
|
|
55
|
+
try {
|
|
56
|
+
const nonce = sjcl.random.randomWords(NONCE_SIZE / 4);
|
|
57
|
+
const key = aesKdfJs(passphrase, nonce);
|
|
58
|
+
const encrypted = sjcl.mode.gcm.encrypt(new sjcl.cipher.aes(key), bufferToWordArray(data), nonce, aad ? bufferToWordArray(aad) : undefined, AES_TAG_SIZE * 8);
|
|
59
|
+
return await Promise.resolve({
|
|
60
|
+
nonce: wordArrayToBuffer(nonce),
|
|
61
|
+
data: wordArrayToBuffer(encrypted),
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (ex) {
|
|
65
|
+
throw wrapError(ex);
|
|
66
|
+
}
|
|
43
67
|
}
|
|
44
68
|
/** crypto-js decrypt */
|
|
45
|
-
export async function decrypt({ data,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
69
|
+
export async function decrypt({ data, aad, nonce }, passphrase) {
|
|
70
|
+
try {
|
|
71
|
+
const n = bufferToWordArray(nonce);
|
|
72
|
+
const key = aesKdfJs(passphrase, n);
|
|
73
|
+
const decrypted = sjcl.mode.gcm.decrypt(new sjcl.cipher.aes(key), bufferToWordArray(data), n, aad ? bufferToWordArray(aad) : undefined, AES_TAG_SIZE * 8);
|
|
74
|
+
return await Promise.resolve({
|
|
75
|
+
data: wordArrayToBuffer(decrypted),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (ex) {
|
|
79
|
+
throw wrapError(ex);
|
|
80
|
+
}
|
|
53
81
|
}
|
|
54
82
|
//# sourceMappingURL=pure-js.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pure-js.js","sourceRoot":"","sources":["../../src/encryption/pure-js.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"pure-js.js","sourceRoot":"","sources":["../../src/encryption/pure-js.ts"],"names":[],"mappings":"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"}
|
package/dist/encryption/web.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type EncryptedData, type PlainData } from './common.js';
|
|
2
2
|
/** webcrypto encrypt */
|
|
3
|
-
export declare function encrypt(data:
|
|
3
|
+
export declare function encrypt({ data, aad }: PlainData, passphrase: string): Promise<EncryptedData>;
|
|
4
4
|
/** webcrypto decrypt */
|
|
5
|
-
export declare function decrypt({ data,
|
|
5
|
+
export declare function decrypt({ data, nonce, aad }: EncryptedData, passphrase: string): Promise<PlainData>;
|
package/dist/encryption/web.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NONCE_SIZE, AES_TAG_SIZE, AES_KEY_SIZE, PBKDF2_ITERATIONS, } from './common.js';
|
|
2
2
|
const encoder = new TextEncoder();
|
|
3
3
|
/** Create aes params */
|
|
4
4
|
async function aesKdfWeb(passphrase, salt) {
|
|
@@ -9,33 +9,35 @@ async function aesKdfWeb(passphrase, salt) {
|
|
|
9
9
|
iterations: PBKDF2_ITERATIONS,
|
|
10
10
|
hash: 'SHA-256',
|
|
11
11
|
};
|
|
12
|
-
return await crypto.subtle.deriveKey(pbkdf2Params, pass, { name: 'AES-
|
|
12
|
+
return await crypto.subtle.deriveKey(pbkdf2Params, pass, { name: 'AES-GCM', length: AES_KEY_SIZE * 8 }, false, [
|
|
13
13
|
'encrypt',
|
|
14
14
|
'decrypt',
|
|
15
15
|
]);
|
|
16
16
|
}
|
|
17
17
|
/** webcrypto encrypt */
|
|
18
|
-
export async function encrypt(data, passphrase) {
|
|
19
|
-
const
|
|
20
|
-
const key = await aesKdfWeb(passphrase,
|
|
21
|
-
const iv = crypto.getRandomValues(new Uint8Array(AES_IV_SIZE));
|
|
18
|
+
export async function encrypt({ data, aad }, passphrase) {
|
|
19
|
+
const nonce = crypto.getRandomValues(new Uint8Array(NONCE_SIZE));
|
|
20
|
+
const key = await aesKdfWeb(passphrase, nonce);
|
|
22
21
|
const encrypted = await crypto.subtle.encrypt({
|
|
23
|
-
name: 'AES-
|
|
24
|
-
iv,
|
|
22
|
+
name: 'AES-GCM',
|
|
23
|
+
iv: nonce,
|
|
24
|
+
tagLength: AES_TAG_SIZE * 8,
|
|
25
|
+
additionalData: aad,
|
|
25
26
|
}, key, data);
|
|
26
27
|
return {
|
|
27
|
-
|
|
28
|
-
iv: iv,
|
|
28
|
+
nonce,
|
|
29
29
|
data: new Uint8Array(encrypted),
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
/** webcrypto decrypt */
|
|
33
|
-
export async function decrypt({ data,
|
|
34
|
-
const key = await aesKdfWeb(passphrase,
|
|
33
|
+
export async function decrypt({ data, nonce, aad }, passphrase) {
|
|
34
|
+
const key = await aesKdfWeb(passphrase, nonce);
|
|
35
35
|
const decrypted = await crypto.subtle.decrypt({
|
|
36
|
-
name: 'AES-
|
|
37
|
-
iv,
|
|
36
|
+
name: 'AES-GCM',
|
|
37
|
+
iv: nonce,
|
|
38
|
+
tagLength: AES_TAG_SIZE * 8,
|
|
39
|
+
additionalData: aad,
|
|
38
40
|
}, key, data);
|
|
39
|
-
return new Uint8Array(decrypted);
|
|
41
|
+
return { data: new Uint8Array(decrypted) };
|
|
40
42
|
}
|
|
41
43
|
//# sourceMappingURL=web.js.map
|