@cloudpss/crypto 0.5.25 → 0.5.28

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.
Files changed (46) hide show
  1. package/benchmark.js +2 -2
  2. package/dist/encryption/browser.js +1 -2
  3. package/dist/encryption/browser.js.map +1 -1
  4. package/dist/encryption/common.d.ts +2 -2
  5. package/dist/encryption/common.js +6 -4
  6. package/dist/encryption/common.js.map +1 -1
  7. package/dist/encryption/index.js +4 -1
  8. package/dist/encryption/index.js.map +1 -1
  9. package/dist/encryption/module.d.ts +1 -1
  10. package/dist/encryption/module.js +2 -2
  11. package/dist/encryption/module.js.map +1 -1
  12. package/dist/encryption/node.js +4 -3
  13. package/dist/encryption/node.js.map +1 -1
  14. package/dist/encryption/{pure-js.d.ts → wasm.d.ts} +2 -2
  15. package/dist/encryption/wasm.js +22 -0
  16. package/dist/encryption/wasm.js.map +1 -0
  17. package/dist/encryption/web.js +5 -1
  18. package/dist/encryption/web.js.map +1 -1
  19. package/dist/utils.d.ts +2 -0
  20. package/dist/utils.js +2 -0
  21. package/dist/utils.js.map +1 -1
  22. package/lib/wasm.d.ts +26 -0
  23. package/lib/wasm.js +149 -0
  24. package/package.json +10 -12
  25. package/src/encryption/browser.ts +1 -2
  26. package/src/encryption/common.ts +10 -6
  27. package/src/encryption/index.ts +3 -1
  28. package/src/encryption/module.ts +4 -4
  29. package/src/encryption/node.ts +4 -3
  30. package/src/encryption/wasm.ts +47 -0
  31. package/src/encryption/web.ts +5 -1
  32. package/src/utils.ts +3 -0
  33. package/tests/encryption.js +53 -32
  34. package/tsconfig.json +2 -1
  35. package/wasm-build.js +30 -0
  36. package/dist/encryption/js/aes.d.ts +0 -20
  37. package/dist/encryption/js/aes.js +0 -151
  38. package/dist/encryption/js/aes.js.map +0 -1
  39. package/dist/encryption/js/gcm.d.ts +0 -26
  40. package/dist/encryption/js/gcm.js +0 -226
  41. package/dist/encryption/js/gcm.js.map +0 -1
  42. package/dist/encryption/pure-js.js +0 -82
  43. package/dist/encryption/pure-js.js.map +0 -1
  44. package/src/encryption/js/aes.ts +0 -191
  45. package/src/encryption/js/gcm.ts +0 -258
  46. package/src/encryption/pure-js.ts +0 -105
@@ -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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"}
@@ -1,82 +0,0 @@
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');
17
- /** Convert word array to buffer data */
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;
29
- }
30
- /** Convert buffer data to word array */
31
- function bufferToWordArray(buffer) {
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;
41
- }
42
- /** Create aes params */
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 });
52
- }
53
- /** crypto-js encrypt */
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
- }
67
- }
68
- /** crypto-js decrypt */
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
- }
81
- }
82
- //# sourceMappingURL=pure-js.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pure-js.js","sourceRoot":"","sources":["../../src/encryption/pure-js.ts"],"names":[],"mappings":"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"}
@@ -1,191 +0,0 @@
1
- /** AES S-box Tables */
2
- type SBoxTable = [t0: Uint32Array, t1: Uint32Array, t2: Uint32Array, t3: Uint32Array, t4: Uint8Array];
3
-
4
- /** Compute AES S-box Tables */
5
- function createSBox(): [SBoxTable, SBoxTable] {
6
- const encTable: SBoxTable = [
7
- new Uint32Array(256),
8
- new Uint32Array(256),
9
- new Uint32Array(256),
10
- new Uint32Array(256),
11
- new Uint8Array(256),
12
- ];
13
- const decTable: SBoxTable = [
14
- new Uint32Array(256),
15
- new Uint32Array(256),
16
- new Uint32Array(256),
17
- new Uint32Array(256),
18
- new Uint8Array(256),
19
- ];
20
-
21
- const sbox = encTable[4];
22
- const sboxInv = decTable[4];
23
-
24
- const d = new Uint8Array(256);
25
- const th = new Uint8Array(256);
26
-
27
- // Compute double and third tables
28
- for (let i = 0; i < 256; i++) {
29
- d[i] = (i << 1) ^ ((i >> 7) * 283);
30
- th[d[i] ^ i] = i;
31
- }
32
-
33
- let x = 0,
34
- xInv = 0,
35
- x2 = 0,
36
- x4 = 0,
37
- x8 = 0;
38
- for (; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
39
- // Compute sbox
40
- let s = xInv ^ (xInv << 1) ^ (xInv << 2) ^ (xInv << 3) ^ (xInv << 4);
41
- s = (s >> 8) ^ (s & 255) ^ 99;
42
- sbox[x] = s;
43
- sboxInv[s] = x;
44
-
45
- // Compute MixColumns
46
- x8 = d[(x4 = d[(x2 = d[x])])];
47
- let tDec = (x8 * 0x101_0101) ^ (x4 * 0x1_0001) ^ (x2 * 0x101) ^ (x * 0x101_0100);
48
- let tEnc = (d[s] * 0x101) ^ (s * 0x101_0100);
49
-
50
- for (let i = 0; i < 4; i++) {
51
- encTable[i][x] = tEnc = (tEnc << 24) ^ (tEnc >>> 8);
52
- decTable[i][s] = tDec = (tDec << 24) ^ (tDec >>> 8);
53
- }
54
- }
55
-
56
- return [encTable, decTable];
57
- }
58
-
59
- let encryptTable: SBoxTable;
60
- let decryptTable: SBoxTable;
61
- /** 初始化 */
62
- function init(): void {
63
- if (!encryptTable) {
64
- [encryptTable, decryptTable] = createSBox();
65
- }
66
- }
67
- /** AES 算法 */
68
- export class AES {
69
- /** 加密密钥 */
70
- private readonly encKey: Uint32Array;
71
- /** 解密密钥 */
72
- private readonly decKey: Uint32Array;
73
- constructor(key: Uint32Array) {
74
- if (key.length !== 4 && key.length !== 6 && key.length !== 8) {
75
- throw new TypeError('Invalid aes key length');
76
- }
77
- init();
78
-
79
- const sbox = encryptTable[4],
80
- decTable = decryptTable,
81
- keyLen = key.length,
82
- rKeyLen = 4 * key.length + 28;
83
-
84
- this.encKey = new Uint32Array(rKeyLen);
85
- this.decKey = new Uint32Array(rKeyLen);
86
- const { encKey, decKey } = this;
87
-
88
- encKey.set(key);
89
-
90
- // schedule encryption keys
91
- let rcon = 1;
92
- for (let i = keyLen; i < rKeyLen; i++) {
93
- let tmp = this.encKey[i - 1];
94
-
95
- // apply sbox
96
- if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
97
- tmp =
98
- (sbox[tmp >>> 24] << 24) ^
99
- (sbox[(tmp >> 16) & 255] << 16) ^
100
- (sbox[(tmp >> 8) & 255] << 8) ^
101
- sbox[tmp & 255];
102
-
103
- // shift rows and add rcon
104
- if (i % keyLen === 0) {
105
- tmp = (tmp << 8) ^ (tmp >>> 24) ^ (rcon << 24);
106
- rcon = (rcon << 1) ^ ((rcon >> 7) * 283);
107
- }
108
- }
109
-
110
- encKey[i] = encKey[i - keyLen] ^ tmp;
111
- }
112
-
113
- // schedule decryption keys
114
- for (let i = rKeyLen, j = 0; i; j++, i--) {
115
- const tmp = encKey[j & 3 ? i : i - 4];
116
- if (i <= 4 || j < 4) {
117
- decKey[j] = tmp;
118
- } else {
119
- decKey[j] =
120
- decTable[0][sbox[tmp >>> 24]] ^
121
- decTable[1][sbox[(tmp >> 16) & 255]] ^
122
- decTable[2][sbox[(tmp >> 8) & 255]] ^
123
- decTable[3][sbox[tmp & 255]];
124
- }
125
- }
126
- }
127
-
128
- /**
129
- * Encryption and decryption core.
130
- */
131
- private crypt(
132
- input: Uint32Array,
133
- inputOffset: number,
134
- output: Uint32Array,
135
- outputOffset: number,
136
- decrypt: boolean,
137
- ): void {
138
- const key = decrypt ? this.decKey : this.encKey;
139
- const [t0, t1, t2, t3, sbox] = decrypt ? decryptTable : encryptTable;
140
-
141
- // state variables a,b,c,d are loaded with pre-whitened data
142
- let a = input[inputOffset] ^ key[0],
143
- b = input[inputOffset + (decrypt ? 3 : 1)] ^ key[1],
144
- c = input[inputOffset + 2] ^ key[2],
145
- d = input[inputOffset + (decrypt ? 1 : 3)] ^ key[3];
146
-
147
- let kIndex = 4;
148
-
149
- // Inner rounds. Cribbed from OpenSSL.
150
- const nInnerRounds = key.length / 4 - 2;
151
- for (let i = 0; i < nInnerRounds; i++) {
152
- const a2 = t0[a >>> 24] ^ t1[(b >> 16) & 255] ^ t2[(c >> 8) & 255] ^ t3[d & 255] ^ key[kIndex];
153
- const b2 = t0[b >>> 24] ^ t1[(c >> 16) & 255] ^ t2[(d >> 8) & 255] ^ t3[a & 255] ^ key[kIndex + 1];
154
- const c2 = t0[c >>> 24] ^ t1[(d >> 16) & 255] ^ t2[(a >> 8) & 255] ^ t3[b & 255] ^ key[kIndex + 2];
155
- d = t0[d >>> 24] ^ t1[(a >> 16) & 255] ^ t2[(b >> 8) & 255] ^ t3[c & 255] ^ key[kIndex + 3];
156
- a = a2;
157
- b = b2;
158
- c = c2;
159
- kIndex += 4;
160
- }
161
-
162
- // Last round.
163
- for (let i = 0; i < 4; i++) {
164
- output[outputOffset + (decrypt ? 3 & -i : i)] =
165
- (sbox[a >>> 24] << 24) ^
166
- (sbox[(b >> 16) & 255] << 16) ^
167
- (sbox[(c >> 8) & 255] << 8) ^
168
- sbox[d & 255] ^
169
- key[kIndex++];
170
- const a2 = a;
171
- a = b;
172
- b = c;
173
- c = d;
174
- d = a2;
175
- }
176
- }
177
-
178
- /**
179
- * Encrypt a block of plain text.
180
- */
181
- encrypt(input: Uint32Array, inputOffset: number, output: Uint32Array, outputOffset: number): void {
182
- return this.crypt(input, inputOffset, output, outputOffset, false);
183
- }
184
-
185
- /**
186
- * Decrypt a block of cipher text.
187
- */
188
- decrypt(input: Uint32Array, inputOffset: number, output: Uint32Array, outputOffset: number): void {
189
- return this.crypt(input, inputOffset, output, outputOffset, true);
190
- }
191
- }