@cloudpss/crypto 0.5.25 → 0.5.26
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 +2 -2
- package/dist/encryption/browser.js +1 -2
- package/dist/encryption/browser.js.map +1 -1
- package/dist/encryption/common.js +4 -2
- package/dist/encryption/common.js.map +1 -1
- package/dist/encryption/module.d.ts +1 -1
- package/dist/encryption/module.js.map +1 -1
- package/dist/encryption/{pure-js.d.ts → wasm.d.ts} +2 -2
- package/dist/encryption/wasm.js +21 -0
- package/dist/encryption/wasm.js.map +1 -0
- package/lib/wasm.d.ts +26 -0
- package/lib/wasm.js +149 -0
- package/package.json +10 -12
- package/src/encryption/browser.ts +1 -2
- package/src/encryption/common.ts +6 -2
- package/src/encryption/module.ts +1 -1
- package/src/encryption/wasm.ts +46 -0
- package/tests/encryption.js +48 -29
- package/tsconfig.json +2 -1
- package/wasm-build.js +30 -0
- package/dist/encryption/js/aes.d.ts +0 -20
- package/dist/encryption/js/aes.js +0 -151
- package/dist/encryption/js/aes.js.map +0 -1
- package/dist/encryption/js/gcm.d.ts +0 -26
- package/dist/encryption/js/gcm.js +0 -226
- package/dist/encryption/js/gcm.js.map +0 -1
- package/dist/encryption/pure-js.js +0 -82
- package/dist/encryption/pure-js.js.map +0 -1
- package/src/encryption/js/aes.ts +0 -191
- package/src/encryption/js/gcm.ts +0 -258
- package/src/encryption/pure-js.ts +0 -105
package/tests/encryption.js
CHANGED
|
@@ -5,7 +5,7 @@ import { createModule } from '../dist/encryption/module.js';
|
|
|
5
5
|
import * as nodeImpl from '../dist/encryption/node.js';
|
|
6
6
|
import * as browserImpl from '../dist/encryption/browser.js';
|
|
7
7
|
import * as webImpl from '../dist/encryption/web.js';
|
|
8
|
-
import * as
|
|
8
|
+
import * as wasmImpl from '../dist/encryption/wasm.js';
|
|
9
9
|
|
|
10
10
|
const data = [
|
|
11
11
|
Buffer.from(''),
|
|
@@ -23,13 +23,26 @@ describe('Encryption root export', () => {
|
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
it('check is encrypted', () => {
|
|
26
|
+
const nonce = Buffer.alloc(12);
|
|
27
|
+
const tag = Buffer.alloc(16);
|
|
28
|
+
const aadLength = Buffer.alloc(4);
|
|
29
|
+
|
|
26
30
|
// @ts-expect-error bad type
|
|
27
31
|
expect(() => isEncrypted({})).toThrow('Invalid data');
|
|
28
|
-
expect(isEncrypted(Buffer.from(MAGIC_NUMBER))).toBe(false);
|
|
29
|
-
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, Buffer.alloc(31)]))).toBe(false);
|
|
30
|
-
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, Buffer.alloc(32)]))).toBe(true);
|
|
31
32
|
expect(isEncrypted(Buffer.alloc(40))).toBe(false);
|
|
32
33
|
expect(isEncrypted(Buffer.alloc(41))).toBe(false);
|
|
34
|
+
|
|
35
|
+
expect(isEncrypted(Buffer.from(MAGIC_NUMBER))).toBe(false);
|
|
36
|
+
|
|
37
|
+
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, nonce, aadLength, tag]))).toBe(true);
|
|
38
|
+
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, nonce, aadLength, tag.subarray(1)]))).toBe(false);
|
|
39
|
+
|
|
40
|
+
aadLength.writeUInt32BE(100);
|
|
41
|
+
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, nonce, aadLength, Buffer.alloc(111), tag]))).toBe(false);
|
|
42
|
+
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, nonce, aadLength, Buffer.alloc(112), tag]))).toBe(true);
|
|
43
|
+
|
|
44
|
+
aadLength.writeUInt32BE(0xffff_fffe);
|
|
45
|
+
expect(isEncrypted(Buffer.concat([MAGIC_NUMBER, nonce, aadLength, Buffer.alloc(112), tag]))).toBe(false);
|
|
33
46
|
});
|
|
34
47
|
|
|
35
48
|
it('encrypt check', async () => {
|
|
@@ -50,25 +63,32 @@ describe('Encryption root export', () => {
|
|
|
50
63
|
await expect(() => decrypt(Buffer.alloc(100), 'xx')).rejects.toThrow('Invalid encrypted data');
|
|
51
64
|
});
|
|
52
65
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
describe('aad', () => {
|
|
67
|
+
it('accepts empty aad', async () => {
|
|
68
|
+
const encrypted = await encryptAad(Buffer.alloc(0), Buffer.alloc(0), passphrase);
|
|
69
|
+
expect(encrypted).toBeInstanceOf(Uint8Array);
|
|
70
|
+
const extractedAad = extractAad(encrypted);
|
|
71
|
+
expect(extractedAad).toBeUndefined();
|
|
72
|
+
});
|
|
59
73
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
74
|
+
it('accepts undefined aad', async () => {
|
|
75
|
+
const encrypted = await encryptAad(Buffer.alloc(0), undefined, passphrase);
|
|
76
|
+
expect(encrypted).toBeInstanceOf(Uint8Array);
|
|
77
|
+
const extractedAad = extractAad(encrypted);
|
|
78
|
+
expect(extractedAad).toBeUndefined();
|
|
79
|
+
});
|
|
66
80
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
81
|
+
it('rejects invalid aad size', async () => {
|
|
82
|
+
const aad2 = Buffer.alloc(1024 * 1024 * 1024 + 1);
|
|
83
|
+
await expect(async () => {
|
|
84
|
+
await encryptAad(Buffer.alloc(0), aad2, passphrase);
|
|
85
|
+
}).rejects.toThrow('Invalid AAD size');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('rejects invalid data', () => {
|
|
89
|
+
const data = Buffer.alloc(10);
|
|
90
|
+
expect(() => extractAad(data)).toThrow('Invalid encrypted data');
|
|
91
|
+
});
|
|
72
92
|
});
|
|
73
93
|
|
|
74
94
|
checkModule({ encrypt, decrypt, encryptAad });
|
|
@@ -128,8 +148,8 @@ function checkModule(module) {
|
|
|
128
148
|
|
|
129
149
|
/**
|
|
130
150
|
* 检查实现
|
|
131
|
-
* @param {
|
|
132
|
-
* @param {
|
|
151
|
+
* @param {Function} encrypt encrypt
|
|
152
|
+
* @param {Function} decrypt decrypt
|
|
133
153
|
*/
|
|
134
154
|
function checkImplEncryption(encrypt, decrypt) {
|
|
135
155
|
it.each(data)(
|
|
@@ -191,7 +211,7 @@ describe('Encryption impl', () => {
|
|
|
191
211
|
node: nodeImpl,
|
|
192
212
|
browser: browserImpl,
|
|
193
213
|
web: webImpl,
|
|
194
|
-
|
|
214
|
+
wasm: wasmImpl,
|
|
195
215
|
});
|
|
196
216
|
describe.each(impls)('impl %s', (name, impl) => {
|
|
197
217
|
const module = createModule(impl);
|
|
@@ -208,14 +228,13 @@ describe('Encryption impl', () => {
|
|
|
208
228
|
});
|
|
209
229
|
|
|
210
230
|
describe('Encryption impl browser', () => {
|
|
211
|
-
describe('should work without crypto', () => {
|
|
212
|
-
const {
|
|
231
|
+
describe('should work without crypto subtle', () => {
|
|
232
|
+
const { subtle } = crypto;
|
|
213
233
|
beforeAll(() => {
|
|
214
|
-
|
|
215
|
-
globalThis.crypto = undefined;
|
|
234
|
+
Object.defineProperty(crypto, 'subtle', { value: undefined, configurable: true });
|
|
216
235
|
});
|
|
217
236
|
afterAll(() => {
|
|
218
|
-
|
|
237
|
+
Object.defineProperty(crypto, 'subtle', { value: subtle, configurable: true });
|
|
219
238
|
});
|
|
220
239
|
checkModule(createModule(browserImpl));
|
|
221
240
|
});
|
package/tsconfig.json
CHANGED
package/wasm-build.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import esbuild from 'esbuild';
|
|
6
|
+
import { wasmLoader } from 'esbuild-plugin-wasm';
|
|
7
|
+
import { once } from 'node:events';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
|
|
12
|
+
const wasmPack = spawn('wasm-pack', ['build', '--target', 'bundler', '--release'], {
|
|
13
|
+
stdio: 'inherit',
|
|
14
|
+
cwd: path.resolve(__dirname, './wasm'),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
await once(wasmPack, 'exit');
|
|
18
|
+
|
|
19
|
+
await esbuild.build({
|
|
20
|
+
entryPoints: [path.resolve(__dirname, './wasm/pkg/wasm.js')],
|
|
21
|
+
outdir: path.resolve(__dirname, './lib'),
|
|
22
|
+
charset: 'utf8',
|
|
23
|
+
target: 'es2022',
|
|
24
|
+
format: 'esm',
|
|
25
|
+
bundle: true,
|
|
26
|
+
minify: false,
|
|
27
|
+
plugins: [wasmLoader({ mode: 'embedded' })],
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
await fs.copyFile(path.resolve(__dirname, './wasm/pkg/wasm.d.ts'), path.resolve(__dirname, './lib/wasm.d.ts'));
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/** AES 算法 */
|
|
2
|
-
export declare class AES {
|
|
3
|
-
/** 加密密钥 */
|
|
4
|
-
private readonly encKey;
|
|
5
|
-
/** 解密密钥 */
|
|
6
|
-
private readonly decKey;
|
|
7
|
-
constructor(key: Uint32Array);
|
|
8
|
-
/**
|
|
9
|
-
* Encryption and decryption core.
|
|
10
|
-
*/
|
|
11
|
-
private crypt;
|
|
12
|
-
/**
|
|
13
|
-
* Encrypt a block of plain text.
|
|
14
|
-
*/
|
|
15
|
-
encrypt(input: Uint32Array, inputOffset: number, output: Uint32Array, outputOffset: number): void;
|
|
16
|
-
/**
|
|
17
|
-
* Decrypt a block of cipher text.
|
|
18
|
-
*/
|
|
19
|
-
decrypt(input: Uint32Array, inputOffset: number, output: Uint32Array, outputOffset: number): void;
|
|
20
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/** Compute AES S-box Tables */
|
|
2
|
-
function createSBox() {
|
|
3
|
-
const encTable = [
|
|
4
|
-
new Uint32Array(256),
|
|
5
|
-
new Uint32Array(256),
|
|
6
|
-
new Uint32Array(256),
|
|
7
|
-
new Uint32Array(256),
|
|
8
|
-
new Uint8Array(256),
|
|
9
|
-
];
|
|
10
|
-
const decTable = [
|
|
11
|
-
new Uint32Array(256),
|
|
12
|
-
new Uint32Array(256),
|
|
13
|
-
new Uint32Array(256),
|
|
14
|
-
new Uint32Array(256),
|
|
15
|
-
new Uint8Array(256),
|
|
16
|
-
];
|
|
17
|
-
const sbox = encTable[4];
|
|
18
|
-
const sboxInv = decTable[4];
|
|
19
|
-
const d = new Uint8Array(256);
|
|
20
|
-
const th = new Uint8Array(256);
|
|
21
|
-
// Compute double and third tables
|
|
22
|
-
for (let i = 0; i < 256; i++) {
|
|
23
|
-
d[i] = (i << 1) ^ ((i >> 7) * 283);
|
|
24
|
-
th[d[i] ^ i] = i;
|
|
25
|
-
}
|
|
26
|
-
let x = 0, xInv = 0, x2 = 0, x4 = 0, x8 = 0;
|
|
27
|
-
for (; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
28
|
-
// Compute sbox
|
|
29
|
-
let s = xInv ^ (xInv << 1) ^ (xInv << 2) ^ (xInv << 3) ^ (xInv << 4);
|
|
30
|
-
s = (s >> 8) ^ (s & 255) ^ 99;
|
|
31
|
-
sbox[x] = s;
|
|
32
|
-
sboxInv[s] = x;
|
|
33
|
-
// Compute MixColumns
|
|
34
|
-
x8 = d[(x4 = d[(x2 = d[x])])];
|
|
35
|
-
let tDec = (x8 * 0x101_0101) ^ (x4 * 0x1_0001) ^ (x2 * 0x101) ^ (x * 0x101_0100);
|
|
36
|
-
let tEnc = (d[s] * 0x101) ^ (s * 0x101_0100);
|
|
37
|
-
for (let i = 0; i < 4; i++) {
|
|
38
|
-
encTable[i][x] = tEnc = (tEnc << 24) ^ (tEnc >>> 8);
|
|
39
|
-
decTable[i][s] = tDec = (tDec << 24) ^ (tDec >>> 8);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return [encTable, decTable];
|
|
43
|
-
}
|
|
44
|
-
let encryptTable;
|
|
45
|
-
let decryptTable;
|
|
46
|
-
/** 初始化 */
|
|
47
|
-
function init() {
|
|
48
|
-
if (!encryptTable) {
|
|
49
|
-
[encryptTable, decryptTable] = createSBox();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** AES 算法 */
|
|
53
|
-
export class AES {
|
|
54
|
-
/** 加密密钥 */
|
|
55
|
-
encKey;
|
|
56
|
-
/** 解密密钥 */
|
|
57
|
-
decKey;
|
|
58
|
-
constructor(key) {
|
|
59
|
-
if (key.length !== 4 && key.length !== 6 && key.length !== 8) {
|
|
60
|
-
throw new TypeError('Invalid aes key length');
|
|
61
|
-
}
|
|
62
|
-
init();
|
|
63
|
-
const sbox = encryptTable[4], decTable = decryptTable, keyLen = key.length, rKeyLen = 4 * key.length + 28;
|
|
64
|
-
this.encKey = new Uint32Array(rKeyLen);
|
|
65
|
-
this.decKey = new Uint32Array(rKeyLen);
|
|
66
|
-
const { encKey, decKey } = this;
|
|
67
|
-
encKey.set(key);
|
|
68
|
-
// schedule encryption keys
|
|
69
|
-
let rcon = 1;
|
|
70
|
-
for (let i = keyLen; i < rKeyLen; i++) {
|
|
71
|
-
let tmp = this.encKey[i - 1];
|
|
72
|
-
// apply sbox
|
|
73
|
-
if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
|
|
74
|
-
tmp =
|
|
75
|
-
(sbox[tmp >>> 24] << 24) ^
|
|
76
|
-
(sbox[(tmp >> 16) & 255] << 16) ^
|
|
77
|
-
(sbox[(tmp >> 8) & 255] << 8) ^
|
|
78
|
-
sbox[tmp & 255];
|
|
79
|
-
// shift rows and add rcon
|
|
80
|
-
if (i % keyLen === 0) {
|
|
81
|
-
tmp = (tmp << 8) ^ (tmp >>> 24) ^ (rcon << 24);
|
|
82
|
-
rcon = (rcon << 1) ^ ((rcon >> 7) * 283);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
encKey[i] = encKey[i - keyLen] ^ tmp;
|
|
86
|
-
}
|
|
87
|
-
// schedule decryption keys
|
|
88
|
-
for (let i = rKeyLen, j = 0; i; j++, i--) {
|
|
89
|
-
const tmp = encKey[j & 3 ? i : i - 4];
|
|
90
|
-
if (i <= 4 || j < 4) {
|
|
91
|
-
decKey[j] = tmp;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
decKey[j] =
|
|
95
|
-
decTable[0][sbox[tmp >>> 24]] ^
|
|
96
|
-
decTable[1][sbox[(tmp >> 16) & 255]] ^
|
|
97
|
-
decTable[2][sbox[(tmp >> 8) & 255]] ^
|
|
98
|
-
decTable[3][sbox[tmp & 255]];
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Encryption and decryption core.
|
|
104
|
-
*/
|
|
105
|
-
crypt(input, inputOffset, output, outputOffset, decrypt) {
|
|
106
|
-
const key = decrypt ? this.decKey : this.encKey;
|
|
107
|
-
const [t0, t1, t2, t3, sbox] = decrypt ? decryptTable : encryptTable;
|
|
108
|
-
// state variables a,b,c,d are loaded with pre-whitened data
|
|
109
|
-
let a = input[inputOffset] ^ key[0], b = input[inputOffset + (decrypt ? 3 : 1)] ^ key[1], c = input[inputOffset + 2] ^ key[2], d = input[inputOffset + (decrypt ? 1 : 3)] ^ key[3];
|
|
110
|
-
let kIndex = 4;
|
|
111
|
-
// Inner rounds. Cribbed from OpenSSL.
|
|
112
|
-
const nInnerRounds = key.length / 4 - 2;
|
|
113
|
-
for (let i = 0; i < nInnerRounds; i++) {
|
|
114
|
-
const a2 = t0[a >>> 24] ^ t1[(b >> 16) & 255] ^ t2[(c >> 8) & 255] ^ t3[d & 255] ^ key[kIndex];
|
|
115
|
-
const b2 = t0[b >>> 24] ^ t1[(c >> 16) & 255] ^ t2[(d >> 8) & 255] ^ t3[a & 255] ^ key[kIndex + 1];
|
|
116
|
-
const c2 = t0[c >>> 24] ^ t1[(d >> 16) & 255] ^ t2[(a >> 8) & 255] ^ t3[b & 255] ^ key[kIndex + 2];
|
|
117
|
-
d = t0[d >>> 24] ^ t1[(a >> 16) & 255] ^ t2[(b >> 8) & 255] ^ t3[c & 255] ^ key[kIndex + 3];
|
|
118
|
-
a = a2;
|
|
119
|
-
b = b2;
|
|
120
|
-
c = c2;
|
|
121
|
-
kIndex += 4;
|
|
122
|
-
}
|
|
123
|
-
// Last round.
|
|
124
|
-
for (let i = 0; i < 4; i++) {
|
|
125
|
-
output[outputOffset + (decrypt ? 3 & -i : i)] =
|
|
126
|
-
(sbox[a >>> 24] << 24) ^
|
|
127
|
-
(sbox[(b >> 16) & 255] << 16) ^
|
|
128
|
-
(sbox[(c >> 8) & 255] << 8) ^
|
|
129
|
-
sbox[d & 255] ^
|
|
130
|
-
key[kIndex++];
|
|
131
|
-
const a2 = a;
|
|
132
|
-
a = b;
|
|
133
|
-
b = c;
|
|
134
|
-
c = d;
|
|
135
|
-
d = a2;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Encrypt a block of plain text.
|
|
140
|
-
*/
|
|
141
|
-
encrypt(input, inputOffset, output, outputOffset) {
|
|
142
|
-
return this.crypt(input, inputOffset, output, outputOffset, false);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Decrypt a block of cipher text.
|
|
146
|
-
*/
|
|
147
|
-
decrypt(input, inputOffset, output, outputOffset) {
|
|
148
|
-
return this.crypt(input, inputOffset, output, outputOffset, true);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=aes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aes.js","sourceRoot":"","sources":["../../../src/encryption/js/aes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { AES } from './aes.js';
|
|
2
|
-
/** GCM (Galois/Counter Mode) */
|
|
3
|
-
export declare class GCM {
|
|
4
|
-
readonly cipher: AES;
|
|
5
|
-
readonly iv: Uint8Array;
|
|
6
|
-
readonly tagLength: number;
|
|
7
|
-
readonly aad: Uint8Array;
|
|
8
|
-
constructor(cipher: AES, iv: Uint8Array, tagLength?: number, aad?: Uint8Array);
|
|
9
|
-
/** Convert a Uint8Array to a Uint32Array */
|
|
10
|
-
private toUint32Array;
|
|
11
|
-
/** Convert a Uint32Array to a Uint8Array */
|
|
12
|
-
private toUint8Array;
|
|
13
|
-
/** Set out of range bytes to 0 */
|
|
14
|
-
private clamp;
|
|
15
|
-
private readonly H;
|
|
16
|
-
/** Compute the galois multiplication of X and Y */
|
|
17
|
-
private galoisMultiply;
|
|
18
|
-
/** Ghash */
|
|
19
|
-
private ghash;
|
|
20
|
-
/** GCM CTR mode. */
|
|
21
|
-
private ctr;
|
|
22
|
-
/** 加密 */
|
|
23
|
-
encrypt(data: Uint8Array): Uint8Array;
|
|
24
|
-
/** 解密 */
|
|
25
|
-
decrypt(data: Uint8Array): Uint8Array;
|
|
26
|
-
}
|
|
@@ -1,226 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcm.js","sourceRoot":"","sources":["../../../src/encryption/js/gcm.ts"],"names":[],"mappings":"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"}
|