quarkdash 1.0.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/.idea/modules.xml +8 -0
- package/.idea/quarkdash.iml +12 -0
- package/.idea/vcs.xml +6 -0
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/coverage/clover.xml +470 -0
- package/coverage/coverage-final.json +8 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/cipher.ts.html +862 -0
- package/coverage/lcov-report/crypto.ts.html +1000 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +206 -0
- package/coverage/lcov-report/index.ts.html +151 -0
- package/coverage/lcov-report/kdf.ts.html +274 -0
- package/coverage/lcov-report/mac.ts.html +277 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/ringlwe.ts.html +895 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/utils.ts.html +1111 -0
- package/coverage/lcov.info +740 -0
- package/dist/cjs/cipher.js +265 -0
- package/dist/cjs/cipher.js.map +1 -0
- package/dist/cjs/crypto.js +284 -0
- package/dist/cjs/crypto.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kdf.js +56 -0
- package/dist/cjs/kdf.js.map +1 -0
- package/dist/cjs/mac.js +55 -0
- package/dist/cjs/mac.js.map +1 -0
- package/dist/cjs/ringlwe.js +267 -0
- package/dist/cjs/ringlwe.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.js +320 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/cipher.js +259 -0
- package/dist/esm/cipher.js.map +1 -0
- package/dist/esm/crypto.js +280 -0
- package/dist/esm/crypto.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kdf.js +52 -0
- package/dist/esm/kdf.js.map +1 -0
- package/dist/esm/mac.js +51 -0
- package/dist/esm/mac.js.map +1 -0
- package/dist/esm/ringlwe.js +263 -0
- package/dist/esm/ringlwe.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.js +313 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/cipher.d.ts +153 -0
- package/dist/types/crypto.d.ts +155 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/types/kdf.d.ts +34 -0
- package/dist/types/mac.d.ts +47 -0
- package/dist/types/ringlwe.d.ts +127 -0
- package/dist/types/types.d.ts +69 -0
- package/dist/types/utils.d.ts +132 -0
- package/img/cover.png +0 -0
- package/package.json +63 -0
- package/src/cipher.ts +260 -0
- package/src/crypto.ts +306 -0
- package/src/index.ts +23 -0
- package/src/kdf.ts +64 -0
- package/src/mac.ts +65 -0
- package/src/ringlwe.ts +271 -0
- package/src/types.ts +75 -0
- package/src/utils.ts +343 -0
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuarkDashGimli = exports.QuarkDashChaCha = exports.CipherFactory = exports.CipherType = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
/**
|
|
6
|
+
* Cipher Type
|
|
7
|
+
*/
|
|
8
|
+
var CipherType;
|
|
9
|
+
(function (CipherType) {
|
|
10
|
+
CipherType[CipherType["ChaCha20"] = 0] = "ChaCha20";
|
|
11
|
+
CipherType[CipherType["Gimli"] = 1] = "Gimli";
|
|
12
|
+
})(CipherType || (exports.CipherType = CipherType = {}));
|
|
13
|
+
/**
|
|
14
|
+
* Cipher Factory
|
|
15
|
+
*/
|
|
16
|
+
class CipherFactory {
|
|
17
|
+
/**
|
|
18
|
+
* Create Cipher
|
|
19
|
+
* @param algorithm {CipherType} Current cipher type
|
|
20
|
+
* @param key {Uint8Array} Key buffer
|
|
21
|
+
* @param nonce {Uint8Array} Nonce buffer
|
|
22
|
+
* @returns {ICipher} Cipher class instance
|
|
23
|
+
*/
|
|
24
|
+
static create(algorithm, key, nonce) {
|
|
25
|
+
switch (algorithm) {
|
|
26
|
+
case CipherType.ChaCha20: return new QuarkDashChaCha(key, nonce);
|
|
27
|
+
case CipherType.Gimli: return new QuarkDashGimli(key, nonce);
|
|
28
|
+
default: throw new Error('Unsupported cipher type');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.CipherFactory = CipherFactory;
|
|
33
|
+
/**
|
|
34
|
+
* ChaCha20 Based Cipher Implementation
|
|
35
|
+
*/
|
|
36
|
+
class QuarkDashChaCha {
|
|
37
|
+
/**
|
|
38
|
+
* Create ChaCha20 Cipher
|
|
39
|
+
* @param key {Uint8Array} Key buffer
|
|
40
|
+
* @param nonce {Uint8Array} Nonce buffer
|
|
41
|
+
*/
|
|
42
|
+
constructor(key, nonce) {
|
|
43
|
+
if (key.length !== 32)
|
|
44
|
+
throw new Error('Key must be 32 bytes');
|
|
45
|
+
if (nonce.length !== 12)
|
|
46
|
+
throw new Error('Nonce must be 12 bytes');
|
|
47
|
+
this.key = key;
|
|
48
|
+
this.nonce = nonce;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Encrypt data async using ChaCha20
|
|
52
|
+
* @param data {Uint8Array} Raw data buffer
|
|
53
|
+
* @returns {Promise<Uint8Array>} Result buffer
|
|
54
|
+
* TODO: GPU Calculations
|
|
55
|
+
*/
|
|
56
|
+
async encrypt(data) { return this.process(data); }
|
|
57
|
+
/**
|
|
58
|
+
* Decrypt data async using ChaCha20
|
|
59
|
+
* @param data {Uint8Array} Encrypted raw data buffer
|
|
60
|
+
* @returns {Promise<Uint8Array>} Result buffer
|
|
61
|
+
* TODO: GPU Calculations
|
|
62
|
+
*/
|
|
63
|
+
async decrypt(data) { return this.process(data); }
|
|
64
|
+
/**
|
|
65
|
+
* Encrypt data sync using ChaCha20
|
|
66
|
+
* @param data {Uint8Array} Raw data buffer
|
|
67
|
+
* @returns {Uint8Array} Result buffer
|
|
68
|
+
*/
|
|
69
|
+
encryptSync(data) { return this.process(data); }
|
|
70
|
+
/**
|
|
71
|
+
* Decrypt data sync using ChaCha20
|
|
72
|
+
* @param data {Uint8Array} Encrypted raw data buffer
|
|
73
|
+
* @returns {Uint8Array} Result buffer
|
|
74
|
+
*/
|
|
75
|
+
decryptSync(data) { return this.process(data); }
|
|
76
|
+
/**
|
|
77
|
+
* Process ChaCha20 Cipher
|
|
78
|
+
* @param data {Uint8Array} Data for processing
|
|
79
|
+
* @returns {Uint8Array} Processing result
|
|
80
|
+
* @private
|
|
81
|
+
*/
|
|
82
|
+
process(data) {
|
|
83
|
+
const out = new Uint8Array(data.length);
|
|
84
|
+
let block = 0;
|
|
85
|
+
let pos = 0;
|
|
86
|
+
while (pos < data.length) {
|
|
87
|
+
const ks = this.keystreamBlock(block);
|
|
88
|
+
const len = Math.min(64, data.length - pos);
|
|
89
|
+
for (let i = 0; i < len; i++)
|
|
90
|
+
out[pos + i] = data[pos + i] ^ ks[i];
|
|
91
|
+
pos += len;
|
|
92
|
+
block++;
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get keystream block
|
|
98
|
+
* @param counter {number} counter
|
|
99
|
+
* @returns {Uint8Array} result buffer
|
|
100
|
+
* @private
|
|
101
|
+
*/
|
|
102
|
+
keystreamBlock(counter) {
|
|
103
|
+
const state = new Uint32Array(16);
|
|
104
|
+
state[0] = 0x61707865;
|
|
105
|
+
state[1] = 0x3320646e;
|
|
106
|
+
state[2] = 0x79622d32;
|
|
107
|
+
state[3] = 0x6b206574;
|
|
108
|
+
for (let i = 0; i < 8; i++)
|
|
109
|
+
state[4 + i] = utils_1.QuarkDashUtils.readU32(this.key, i * 4);
|
|
110
|
+
state[12] = counter;
|
|
111
|
+
for (let i = 0; i < 3; i++)
|
|
112
|
+
state[13 + i] = utils_1.QuarkDashUtils.readU32(this.nonce, i * 4);
|
|
113
|
+
const working = new Uint32Array(state);
|
|
114
|
+
for (let r = 0; r < 10; r++) {
|
|
115
|
+
this.quarterRound(working, 0, 4, 8, 12);
|
|
116
|
+
this.quarterRound(working, 1, 5, 9, 13);
|
|
117
|
+
this.quarterRound(working, 2, 6, 10, 14);
|
|
118
|
+
this.quarterRound(working, 3, 7, 11, 15);
|
|
119
|
+
this.quarterRound(working, 0, 5, 10, 15);
|
|
120
|
+
this.quarterRound(working, 1, 6, 11, 12);
|
|
121
|
+
this.quarterRound(working, 2, 7, 8, 13);
|
|
122
|
+
this.quarterRound(working, 3, 4, 9, 14);
|
|
123
|
+
}
|
|
124
|
+
for (let i = 0; i < 16; i++)
|
|
125
|
+
working[i] += state[i];
|
|
126
|
+
const out = new Uint8Array(64);
|
|
127
|
+
for (let i = 0; i < 16; i++)
|
|
128
|
+
utils_1.QuarkDashUtils.writeU32(working[i], out, i * 4);
|
|
129
|
+
return out;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Quarter Round
|
|
133
|
+
* @param s {Uint8Array} Buffer
|
|
134
|
+
* @param a {number}
|
|
135
|
+
* @param b {number}
|
|
136
|
+
* @param c {number}
|
|
137
|
+
* @param d {number}
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
quarterRound(s, a, b, c, d) {
|
|
141
|
+
s[a] += s[b];
|
|
142
|
+
s[d] ^= s[a];
|
|
143
|
+
s[d] = (s[d] << 16) | (s[d] >>> 16);
|
|
144
|
+
s[c] += s[d];
|
|
145
|
+
s[b] ^= s[c];
|
|
146
|
+
s[b] = (s[b] << 12) | (s[b] >>> 20);
|
|
147
|
+
s[a] += s[b];
|
|
148
|
+
s[d] ^= s[a];
|
|
149
|
+
s[d] = (s[d] << 8) | (s[d] >>> 24);
|
|
150
|
+
s[c] += s[d];
|
|
151
|
+
s[b] ^= s[c];
|
|
152
|
+
s[b] = (s[b] << 7) | (s[b] >>> 25);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.QuarkDashChaCha = QuarkDashChaCha;
|
|
156
|
+
/**
|
|
157
|
+
* Gimli Cipher
|
|
158
|
+
*/
|
|
159
|
+
class QuarkDashGimli {
|
|
160
|
+
/**
|
|
161
|
+
* Create Gimli Cipher
|
|
162
|
+
* @param key {Uint8Array} Key buffer
|
|
163
|
+
* @param nonce {Uint8Array} Nonce buffer
|
|
164
|
+
*/
|
|
165
|
+
constructor(key, nonce) {
|
|
166
|
+
if (key.length !== 32)
|
|
167
|
+
throw new Error('Key must be 32 bytes');
|
|
168
|
+
if (nonce.length !== 12)
|
|
169
|
+
throw new Error('Nonce must be 12 bytes');
|
|
170
|
+
this.key = key;
|
|
171
|
+
this.nonce = nonce;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Encrypt data async using Gimli
|
|
175
|
+
* @param data {Uint8Array} Raw data buffer
|
|
176
|
+
* @returns {Promise<Uint8Array>} Result buffer
|
|
177
|
+
* TODO: GPU Calculations
|
|
178
|
+
*/
|
|
179
|
+
async encrypt(data) { return this.process(data); }
|
|
180
|
+
/**
|
|
181
|
+
* Decrypt data async using Gimli
|
|
182
|
+
* @param data {Uint8Array} Encrypted raw data buffer
|
|
183
|
+
* @returns {Promise<Uint8Array>} Result buffer
|
|
184
|
+
* TODO: GPU Calculations
|
|
185
|
+
*/
|
|
186
|
+
async decrypt(data) { return this.process(data); }
|
|
187
|
+
/**
|
|
188
|
+
* Encrypt data sync using Gimli
|
|
189
|
+
* @param data {Uint8Array} Raw data buffer
|
|
190
|
+
* @returns {Uint8Array} Result buffer
|
|
191
|
+
*/
|
|
192
|
+
encryptSync(data) { return this.process(data); }
|
|
193
|
+
/**
|
|
194
|
+
* Decrypt data sync using Gimli
|
|
195
|
+
* @param data {Uint8Array} Encrypted raw data buffer
|
|
196
|
+
* @returns {Uint8Array} Result buffer
|
|
197
|
+
*/
|
|
198
|
+
decryptSync(data) { return this.process(data); }
|
|
199
|
+
/**
|
|
200
|
+
* Process Gimli Cipher
|
|
201
|
+
* @param data {Uint8Array} Input buffer
|
|
202
|
+
* @returns {Uint8Array} Output buffer
|
|
203
|
+
* @private
|
|
204
|
+
*/
|
|
205
|
+
process(data) {
|
|
206
|
+
const out = new Uint8Array(data.length);
|
|
207
|
+
let block = 0;
|
|
208
|
+
let pos = 0;
|
|
209
|
+
while (pos < data.length) {
|
|
210
|
+
const ks = this.keystreamBlock(block);
|
|
211
|
+
const len = Math.min(48, data.length - pos);
|
|
212
|
+
for (let i = 0; i < len; i++)
|
|
213
|
+
out[pos + i] = data[pos + i] ^ ks[i];
|
|
214
|
+
pos += len;
|
|
215
|
+
block++;
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get keystream block
|
|
221
|
+
* @param counter {number} Counter
|
|
222
|
+
* @returns {Uint8Array} Result buffer
|
|
223
|
+
* @private
|
|
224
|
+
*/
|
|
225
|
+
keystreamBlock(counter) {
|
|
226
|
+
const state = new Uint32Array(12);
|
|
227
|
+
for (let i = 0; i < 8; i++)
|
|
228
|
+
state[i] = utils_1.QuarkDashUtils.readU32(this.key, i * 4);
|
|
229
|
+
state[8] = utils_1.QuarkDashUtils.readU32(this.nonce, 0);
|
|
230
|
+
state[9] = utils_1.QuarkDashUtils.readU32(this.nonce, 4);
|
|
231
|
+
state[10] = utils_1.QuarkDashUtils.readU32(this.nonce, 8);
|
|
232
|
+
state[11] = counter;
|
|
233
|
+
for (let r = 0; r < 24; r++)
|
|
234
|
+
this.gimliRound(state, r);
|
|
235
|
+
const out = new Uint8Array(48);
|
|
236
|
+
for (let i = 0; i < 12; i++)
|
|
237
|
+
utils_1.QuarkDashUtils.writeU32(state[i], out, i * 4);
|
|
238
|
+
return out;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Gimli Round
|
|
242
|
+
* @param state {Uint32Array} State buffer
|
|
243
|
+
* @param round {number} Round number
|
|
244
|
+
* @private
|
|
245
|
+
*/
|
|
246
|
+
gimliRound(state, round) {
|
|
247
|
+
for (let i = 0; i < 4; i++) {
|
|
248
|
+
const x = state[i], y = state[i + 4], z = state[i + 8];
|
|
249
|
+
const newX = x ^ (z << 1) ^ ((y & z) << 2);
|
|
250
|
+
const newY = y ^ x ^ ((x | z) << 1);
|
|
251
|
+
const newZ = z ^ y ^ ((x & y) << 3);
|
|
252
|
+
state[i] = newX;
|
|
253
|
+
state[i + 4] = newY;
|
|
254
|
+
state[i + 8] = newZ;
|
|
255
|
+
}
|
|
256
|
+
const t = state[1];
|
|
257
|
+
state[1] = state[2];
|
|
258
|
+
state[2] = state[3];
|
|
259
|
+
state[3] = t;
|
|
260
|
+
if ((round & 3) === 0)
|
|
261
|
+
state[0] ^= (0x9e377900 | round);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
exports.QuarkDashGimli = QuarkDashGimli;
|
|
265
|
+
//# sourceMappingURL=cipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cipher.js","sourceRoot":"","sources":["../../src/cipher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuarkDash = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* QuarkDash Crypto Algorithm Implementation
|
|
6
|
+
*
|
|
7
|
+
* @git https://github.com/devsdaddy/quarkdash
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @author Elijah Rastorguev
|
|
10
|
+
* @build 1000
|
|
11
|
+
* @website https://dev.to/devsdaddy
|
|
12
|
+
*/
|
|
13
|
+
/* Import Required Modules */
|
|
14
|
+
const cipher_1 = require("./cipher");
|
|
15
|
+
const kdf_1 = require("./kdf");
|
|
16
|
+
const mac_1 = require("./mac");
|
|
17
|
+
const ringlwe_1 = require("./ringlwe");
|
|
18
|
+
const utils_1 = require("./utils");
|
|
19
|
+
/**
|
|
20
|
+
* Default QuarkDash options
|
|
21
|
+
*/
|
|
22
|
+
const DEFAULT_OPTIONS = {
|
|
23
|
+
cipher: cipher_1.CipherType.ChaCha20,
|
|
24
|
+
kdf: new kdf_1.QuarkDashKDF(),
|
|
25
|
+
mac: new mac_1.QuarkDashMAC(),
|
|
26
|
+
keyExchange: new ringlwe_1.QuarkDashKeyExchange(),
|
|
27
|
+
maxPacketWindow: 1000,
|
|
28
|
+
timestampToleranceMs: 300000,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* QuarkDash Crypto Algorithm Implementation
|
|
32
|
+
*/
|
|
33
|
+
class QuarkDash {
|
|
34
|
+
/**
|
|
35
|
+
* Create QuarkDash Crypto
|
|
36
|
+
* @param config {QuarkDashOptions} Crypto Options
|
|
37
|
+
*/
|
|
38
|
+
constructor(config) {
|
|
39
|
+
this.sessionKey = null;
|
|
40
|
+
this.cipher = null;
|
|
41
|
+
this.macKey = null;
|
|
42
|
+
this.sendSeq = 0;
|
|
43
|
+
this.recvSeq = 0;
|
|
44
|
+
this.receivedPackets = new Set();
|
|
45
|
+
this.config = { ...DEFAULT_OPTIONS, ...config };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate key pair async
|
|
49
|
+
* @returns {Promise<Uint8Array>} Key pair buffer
|
|
50
|
+
* TODO: GPU Computing
|
|
51
|
+
*/
|
|
52
|
+
async generateKeyPair() {
|
|
53
|
+
this.myKeyPair = await this.config.keyExchange.generateKeyPair();
|
|
54
|
+
return this.myKeyPair.publicKey;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generate key pair sync
|
|
58
|
+
* @returns {Uint8Array} Key pair buffer
|
|
59
|
+
*/
|
|
60
|
+
generateKeyPairSync() {
|
|
61
|
+
this.myKeyPair = this.config.keyExchange.generateKeyPairSync();
|
|
62
|
+
return this.myKeyPair.publicKey;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Initialize session async
|
|
66
|
+
* @param peerPublicKey {Uint8Array} Peer public key buffer
|
|
67
|
+
* @param isInitiator {boolean} Is session initiator
|
|
68
|
+
* @returns {Promise<Uint8Array|number>} Returns derived session key or null
|
|
69
|
+
* TODO: GPU Computing
|
|
70
|
+
*/
|
|
71
|
+
async initializeSession(peerPublicKey, isInitiator) {
|
|
72
|
+
this.peerPublicKey = peerPublicKey;
|
|
73
|
+
if (!this.myKeyPair)
|
|
74
|
+
await this.generateKeyPair();
|
|
75
|
+
if (isInitiator) {
|
|
76
|
+
const { ciphertext, sharedSecret } = await this.config.keyExchange.encapsulate(peerPublicKey);
|
|
77
|
+
await this.deriveSessionKeys(sharedSecret);
|
|
78
|
+
return ciphertext;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Initialize session sync
|
|
86
|
+
* @param peerPublicKey {Uint8Array} Peer public key buffer
|
|
87
|
+
* @param isInitiator {boolean} Is session initiator
|
|
88
|
+
* @returns {Uint8Array|number} Returns derived session key or null
|
|
89
|
+
*/
|
|
90
|
+
initializeSessionSync(peerPublicKey, isInitiator) {
|
|
91
|
+
this.peerPublicKey = peerPublicKey;
|
|
92
|
+
if (!this.myKeyPair)
|
|
93
|
+
this.generateKeyPairSync();
|
|
94
|
+
if (isInitiator) {
|
|
95
|
+
const { ciphertext, sharedSecret } = this.config.keyExchange.encapsulateSync(peerPublicKey);
|
|
96
|
+
this.deriveSessionKeysSync(sharedSecret);
|
|
97
|
+
return ciphertext;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Finalize session async
|
|
105
|
+
* @param ciphertext {Uint8Array} Cipher text buffer
|
|
106
|
+
* TODO: GPU Computing
|
|
107
|
+
*/
|
|
108
|
+
async finalizeSession(ciphertext) {
|
|
109
|
+
if (!this.myKeyPair || !this.peerPublicKey)
|
|
110
|
+
throw new Error('Session not initialized');
|
|
111
|
+
const sharedSecret = await this.config.keyExchange.decapsulate(this.myKeyPair.privateKey, ciphertext);
|
|
112
|
+
await this.deriveSessionKeys(sharedSecret);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Finalize session sync
|
|
116
|
+
* @param ciphertext {Uint8Array} Cipher text buffer
|
|
117
|
+
*/
|
|
118
|
+
finalizeSessionSync(ciphertext) {
|
|
119
|
+
if (!this.myKeyPair || !this.peerPublicKey)
|
|
120
|
+
throw new Error('Session not initialized');
|
|
121
|
+
const sharedSecret = this.config.keyExchange.decapsulateSync(this.myKeyPair.privateKey, ciphertext);
|
|
122
|
+
this.deriveSessionKeysSync(sharedSecret);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Derive session keys async
|
|
126
|
+
* @param sharedSecret {Uint8Array} Shared secret buffer
|
|
127
|
+
* @private
|
|
128
|
+
* TODO: GPU Computing
|
|
129
|
+
*/
|
|
130
|
+
async deriveSessionKeys(sharedSecret) {
|
|
131
|
+
const salt = utils_1.QuarkDashUtils.randomBytes(32);
|
|
132
|
+
const info = utils_1.QuarkDashUtils.textToBytes('session-key');
|
|
133
|
+
const keyMaterial = await this.config.kdf.derive(sharedSecret, salt, info, 64);
|
|
134
|
+
this.processDeriveSessionKeys(keyMaterial, sharedSecret);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Derive session keys sync
|
|
138
|
+
* @param sharedSecret {Uint8Array} Shared secret buffer
|
|
139
|
+
* @private
|
|
140
|
+
*/
|
|
141
|
+
deriveSessionKeysSync(sharedSecret) {
|
|
142
|
+
const salt = utils_1.QuarkDashUtils.randomBytes(32);
|
|
143
|
+
const info = utils_1.QuarkDashUtils.textToBytes('session-key');
|
|
144
|
+
const keyMaterial = this.config.kdf.deriveSync(sharedSecret, salt, info, 64);
|
|
145
|
+
this.processDeriveSessionKeys(keyMaterial, sharedSecret);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Process derive session keys
|
|
149
|
+
* @param keyMaterial {Uint8Array} Key material buffer
|
|
150
|
+
* @param sharedSecret {Uint8Array} Shared secret buffer
|
|
151
|
+
* @private
|
|
152
|
+
*/
|
|
153
|
+
processDeriveSessionKeys(keyMaterial, sharedSecret) {
|
|
154
|
+
this.sessionKey = keyMaterial.slice(0, 32);
|
|
155
|
+
this.macKey = keyMaterial.slice(32, 64);
|
|
156
|
+
const nonce = new Uint8Array(12);
|
|
157
|
+
this.cipher = cipher_1.CipherFactory.create(this.config.cipher, this.sessionKey, nonce);
|
|
158
|
+
utils_1.QuarkDashUtils.secureZero(sharedSecret);
|
|
159
|
+
utils_1.QuarkDashUtils.secureZero(keyMaterial);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Encrypt sync
|
|
163
|
+
* @param decryptedData {Uint8Array} Decrypted buffer
|
|
164
|
+
* @returns {Promise<Uint8Array>} Encrypted buffer
|
|
165
|
+
* TODO: GPU Computing
|
|
166
|
+
*/
|
|
167
|
+
async encrypt(decryptedData) {
|
|
168
|
+
if (!this.cipher || !this.macKey)
|
|
169
|
+
throw new Error('Session not established');
|
|
170
|
+
const metadata = this.buildMetadata();
|
|
171
|
+
const encrypted = await this.cipher.encrypt(decryptedData);
|
|
172
|
+
const mac = await this.config.mac.sign(utils_1.QuarkDashUtils.concatBytes(metadata, encrypted), this.macKey);
|
|
173
|
+
return utils_1.QuarkDashUtils.concatBytes(metadata, encrypted, mac);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Encrypt sync
|
|
177
|
+
* @param decryptedData {Uint8Array} Decrypted buffer
|
|
178
|
+
* @returns {Uint8Array} Encrypted buffer
|
|
179
|
+
*/
|
|
180
|
+
encryptSync(decryptedData) {
|
|
181
|
+
if (!this.cipher || !this.macKey)
|
|
182
|
+
throw new Error('Session not established');
|
|
183
|
+
const metadata = this.buildMetadata();
|
|
184
|
+
const encrypted = this.cipher.encryptSync(decryptedData);
|
|
185
|
+
const mac = this.config.mac.signSync(utils_1.QuarkDashUtils.concatBytes(metadata, encrypted), this.macKey);
|
|
186
|
+
return utils_1.QuarkDashUtils.concatBytes(metadata, encrypted, mac);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Decrypt async
|
|
190
|
+
* @param encryptedData {Uint8Array} Encrypted buffer
|
|
191
|
+
* @returns {Promise<Uint8Array>} Decrypted buffer
|
|
192
|
+
* TODO: GPU Computing
|
|
193
|
+
*/
|
|
194
|
+
async decrypt(encryptedData) {
|
|
195
|
+
if (!this.cipher || !this.macKey)
|
|
196
|
+
throw new Error('Session not established');
|
|
197
|
+
const packet = this.processDecrypt(encryptedData);
|
|
198
|
+
const valid = await this.config.mac.verify(utils_1.QuarkDashUtils.concatBytes(packet.metadata, packet.encrypted), this.macKey, packet.mac);
|
|
199
|
+
if (!valid)
|
|
200
|
+
throw new Error('MAC verification failed');
|
|
201
|
+
this.checkMetadata(packet.metadata);
|
|
202
|
+
return await this.cipher.decrypt(packet.encrypted);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Decrypt sync
|
|
206
|
+
* @param encryptedData {Uint8Array} Encrypted buffer
|
|
207
|
+
* @returns {Uint8Array} Decrypted buffer
|
|
208
|
+
*/
|
|
209
|
+
decryptSync(encryptedData) {
|
|
210
|
+
if (!this.cipher || !this.macKey)
|
|
211
|
+
throw new Error('Session not established');
|
|
212
|
+
const packet = this.processDecrypt(encryptedData);
|
|
213
|
+
const valid = this.config.mac.verifySync(utils_1.QuarkDashUtils.concatBytes(packet.metadata, packet.encrypted), this.macKey, packet.mac);
|
|
214
|
+
if (!valid)
|
|
215
|
+
throw new Error('MAC verification failed');
|
|
216
|
+
this.checkMetadata(packet.metadata);
|
|
217
|
+
return this.cipher.decryptSync(packet.encrypted);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Process decrypt
|
|
221
|
+
* @param encryptedData {Uint8Array} encrypted buffer
|
|
222
|
+
* @returns {QDEncryptedPacket} Parsed encrypted packet
|
|
223
|
+
* @private
|
|
224
|
+
*/
|
|
225
|
+
processDecrypt(encryptedData) {
|
|
226
|
+
if (encryptedData.length < 44)
|
|
227
|
+
throw new Error('Invalid ciphertext');
|
|
228
|
+
return {
|
|
229
|
+
metadata: encryptedData.slice(0, 12),
|
|
230
|
+
encrypted: encryptedData.slice(12, encryptedData.length - 32),
|
|
231
|
+
mac: encryptedData.slice(encryptedData.length - 32)
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Build meta-data
|
|
236
|
+
* @returns {Uint8Array} Meta-data buffer
|
|
237
|
+
* @private
|
|
238
|
+
*/
|
|
239
|
+
buildMetadata() {
|
|
240
|
+
const metadata = new Uint8Array(12);
|
|
241
|
+
const timestamp = BigInt(Date.now());
|
|
242
|
+
for (let i = 0; i < 8; i++)
|
|
243
|
+
metadata[i] = Number((timestamp >> BigInt(i * 8)) & 0xffn);
|
|
244
|
+
const seq = this.sendSeq++;
|
|
245
|
+
for (let i = 0; i < 4; i++)
|
|
246
|
+
metadata[8 + i] = (seq >> (i * 8)) & 0xFF;
|
|
247
|
+
return metadata;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Check Meta-Data
|
|
251
|
+
* @param metadata {Uint8Array} Meta-data buffer
|
|
252
|
+
* @private
|
|
253
|
+
*/
|
|
254
|
+
checkMetadata(metadata) {
|
|
255
|
+
const timestamp = utils_1.QuarkDashUtils.readUint64(metadata, 0);
|
|
256
|
+
const now = Date.now();
|
|
257
|
+
if (Math.abs(now - Number(timestamp)) > this.config.timestampToleranceMs) {
|
|
258
|
+
throw new Error('Timestamp out of window');
|
|
259
|
+
}
|
|
260
|
+
const seq = utils_1.QuarkDashUtils.readUint32(metadata, 8);
|
|
261
|
+
if (this.receivedPackets.has(seq))
|
|
262
|
+
throw new Error('Replay detected');
|
|
263
|
+
this.receivedPackets.add(seq);
|
|
264
|
+
if (this.receivedPackets.size > this.config.maxPacketWindow) {
|
|
265
|
+
const oldest = Math.min(...this.receivedPackets);
|
|
266
|
+
this.receivedPackets.delete(oldest);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Dispose QuarkDash Crypto
|
|
271
|
+
*/
|
|
272
|
+
dispose() {
|
|
273
|
+
if (this.sessionKey)
|
|
274
|
+
utils_1.QuarkDashUtils.secureZero(this.sessionKey);
|
|
275
|
+
if (this.macKey)
|
|
276
|
+
utils_1.QuarkDashUtils.secureZero(this.macKey);
|
|
277
|
+
this.sessionKey = null;
|
|
278
|
+
this.macKey = null;
|
|
279
|
+
this.cipher = null;
|
|
280
|
+
this.receivedPackets.clear();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
exports.QuarkDash = QuarkDash;
|
|
284
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
/**
|
|
18
|
+
* QuarkDash Crypto Library
|
|
19
|
+
*
|
|
20
|
+
* @git https://github.com/devsdaddy/quarkdash
|
|
21
|
+
* @version 1.0.0
|
|
22
|
+
* @author Elijah Rastorguev
|
|
23
|
+
* @build 1000
|
|
24
|
+
* @website https://dev.to/devsdaddy
|
|
25
|
+
*/
|
|
26
|
+
/* Export Types and Utils */
|
|
27
|
+
__exportStar(require("./types"), exports);
|
|
28
|
+
__exportStar(require("./utils"), exports);
|
|
29
|
+
/* Export KDF and MAC */
|
|
30
|
+
__exportStar(require("./kdf"), exports);
|
|
31
|
+
__exportStar(require("./mac"), exports);
|
|
32
|
+
/* Export Cipher and Ring-LWE */
|
|
33
|
+
__exportStar(require("./cipher"), exports);
|
|
34
|
+
__exportStar(require("./ringlwe"), exports);
|
|
35
|
+
/* Export Main Algorithm */
|
|
36
|
+
__exportStar(require("./crypto"), exports);
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;GAQG;AACH,4BAA4B;AAC5B,0CAAwB;AACxB,0CAAwB;AAExB,wBAAwB;AACxB,wCAAsB;AACtB,wCAAsB;AAEtB,gCAAgC;AAChC,2CAAyB;AACzB,4CAA0B;AAE1B,2BAA2B;AAC3B,2CAAyB"}
|
package/dist/cjs/kdf.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuarkDashKDF = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
/**
|
|
6
|
+
* KDF implementation using Shake-256
|
|
7
|
+
*/
|
|
8
|
+
class QuarkDashKDF {
|
|
9
|
+
/**
|
|
10
|
+
* Derive KDF async
|
|
11
|
+
* @param ikm {Uint8Array} IKM buffer
|
|
12
|
+
* @param salt {Uint8Array} Salt buffer
|
|
13
|
+
* @param info {Uint8Array} Meta buffer
|
|
14
|
+
* @param length {number} Buffer length
|
|
15
|
+
* @returns {Promise<Uint8Array>} Result
|
|
16
|
+
* TODO: GPU Calculations
|
|
17
|
+
*/
|
|
18
|
+
async derive(ikm, salt, info, length) {
|
|
19
|
+
const prk = await utils_1.QuarkDashUtils.shake256(utils_1.QuarkDashUtils.concatBytes(salt, ikm), 64);
|
|
20
|
+
const result = new Uint8Array(length);
|
|
21
|
+
let t = new Uint8Array(0);
|
|
22
|
+
let i = 1;
|
|
23
|
+
while (result.length < length) {
|
|
24
|
+
const input = utils_1.QuarkDashUtils.concatBytes(t, info, new Uint8Array([i]));
|
|
25
|
+
t = await utils_1.QuarkDashUtils.shake256(utils_1.QuarkDashUtils.concatBytes(prk, input), 64);
|
|
26
|
+
const take = Math.min(t.length, length - result.length);
|
|
27
|
+
result.set(t.slice(0, take), result.length);
|
|
28
|
+
i++;
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Derive KDF sync
|
|
34
|
+
* @param ikm {Uint8Array} IKM buffer
|
|
35
|
+
* @param salt {Uint8Array} Salt buffer
|
|
36
|
+
* @param info {Uint8Array} Meta buffer
|
|
37
|
+
* @param length {number} Buffer length
|
|
38
|
+
* @returns {Uint8Array} Result
|
|
39
|
+
*/
|
|
40
|
+
deriveSync(ikm, salt, info, length) {
|
|
41
|
+
const prk = utils_1.QuarkDashUtils.shake256Sync(utils_1.QuarkDashUtils.concatBytes(salt, ikm), 64);
|
|
42
|
+
const result = new Uint8Array(length);
|
|
43
|
+
let t = new Uint8Array(0);
|
|
44
|
+
let i = 1;
|
|
45
|
+
while (result.length < length) {
|
|
46
|
+
const input = utils_1.QuarkDashUtils.concatBytes(t, info, new Uint8Array([i]));
|
|
47
|
+
t = utils_1.QuarkDashUtils.shake256Sync(utils_1.QuarkDashUtils.concatBytes(prk, input), 64);
|
|
48
|
+
const take = Math.min(t.length, length - result.length);
|
|
49
|
+
result.set(t.slice(0, take), result.length);
|
|
50
|
+
i++;
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.QuarkDashKDF = QuarkDashKDF;
|
|
56
|
+
//# sourceMappingURL=kdf.js.map
|