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 @@
|
|
|
1
|
+
{"version":3,"file":"kdf.js","sourceRoot":"","sources":["../../src/kdf.ts"],"names":[],"mappings":";;;AAWA,mCAAyC;AAEzC;;GAEG;AACH,MAAa,YAAY;IACrB;;;;;;;;OAQG;IACI,KAAK,CAAC,MAAM,CAAC,GAAe,EAAE,IAAgB,EAAE,IAAgB,EAAE,MAAc;QACnF,MAAM,GAAG,GAAG,MAAM,sBAAc,CAAC,QAAQ,CAAC,sBAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAe,CAAC;QACnG,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAe,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,sBAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAe,CAAC;YACrF,CAAC,GAAG,MAAM,sBAAc,CAAC,QAAQ,CAAC,sBAAc,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,CAAC,EAAE,CAAC;QACR,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACI,UAAU,CAAC,GAAe,EAAE,IAAgB,EAAE,IAAgB,EAAE,MAAc;QACjF,MAAM,GAAG,GAAG,sBAAc,CAAC,YAAY,CAAC,sBAAc,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAe,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,sBAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC,GAAG,sBAAc,CAAC,YAAY,CAAC,sBAAc,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,CAAC,EAAE,CAAC;QACR,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AA/CD,oCA+CC"}
|
package/dist/cjs/mac.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QuarkDashMAC = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
/**
|
|
6
|
+
* MAC implementation using Shake-256
|
|
7
|
+
*/
|
|
8
|
+
class QuarkDashMAC {
|
|
9
|
+
/**
|
|
10
|
+
* Sign data async
|
|
11
|
+
* @param data {Uint8Array} Data buffer
|
|
12
|
+
* @param key {Uint8Array} Key buffer
|
|
13
|
+
* @returns {Promise<Uint8Array>} Signed result buffer
|
|
14
|
+
* TODO: GPU Calculations
|
|
15
|
+
*/
|
|
16
|
+
async sign(data, key) {
|
|
17
|
+
const full = utils_1.QuarkDashUtils.concatBytes(key, data);
|
|
18
|
+
return await utils_1.QuarkDashUtils.shake256(full, 32);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Verify async
|
|
22
|
+
* @param data {Uint8Array} data buffer
|
|
23
|
+
* @param key {Uint8Array} key buffer
|
|
24
|
+
* @param tag {Uint8Array} tag buffer
|
|
25
|
+
* @returns {Promise<boolean>} Is verified?
|
|
26
|
+
* TODO: GPU Calculations
|
|
27
|
+
*/
|
|
28
|
+
async verify(data, key, tag) {
|
|
29
|
+
const expected = await this.sign(data, key);
|
|
30
|
+
return utils_1.QuarkDashUtils.constantTimeEqual(expected, tag);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Sign data sync
|
|
34
|
+
* @param data {Uint8Array} Data buffer
|
|
35
|
+
* @param key {Uint8Array} Key buffer
|
|
36
|
+
* @returns {Uint8Array} Signed result buffer
|
|
37
|
+
*/
|
|
38
|
+
signSync(data, key) {
|
|
39
|
+
const full = utils_1.QuarkDashUtils.concatBytes(key, data);
|
|
40
|
+
return utils_1.QuarkDashUtils.shake256Sync(full, 32);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Verify sync
|
|
44
|
+
* @param data {Uint8Array} data buffer
|
|
45
|
+
* @param key {Uint8Array} key buffer
|
|
46
|
+
* @param tag {Uint8Array} tag buffer
|
|
47
|
+
* @returns {Promise<boolean>} Is verified?
|
|
48
|
+
*/
|
|
49
|
+
verifySync(data, key, tag) {
|
|
50
|
+
const expected = this.signSync(data, key);
|
|
51
|
+
return utils_1.QuarkDashUtils.constantTimeEqual(expected, tag);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.QuarkDashMAC = QuarkDashMAC;
|
|
55
|
+
//# sourceMappingURL=mac.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mac.js","sourceRoot":"","sources":["../../src/mac.ts"],"names":[],"mappings":";;;AAWA,mCAAuC;AAEvC;;GAEG;AACH,MAAa,YAAY;IACrB;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CAAC,IAAgB,EAAE,GAAe;QAC/C,MAAM,IAAI,GAAG,sBAAc,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,MAAM,sBAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,GAAe,EAAE,GAAe;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,sBAAc,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,IAAI,GAAG,sBAAc,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,sBAAc,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACI,UAAU,CAAC,IAAgB,EAAE,GAAe,EAAE,GAAe;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,OAAO,sBAAc,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;CACJ;AAhDD,oCAgDC"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.QuarkDashKeyExchange = void 0;
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
|
+
/**
|
|
7
|
+
* Ring-LWE based key exchange implementation
|
|
8
|
+
*/
|
|
9
|
+
class QuarkDashKeyExchange {
|
|
10
|
+
/**
|
|
11
|
+
* Get small polygon
|
|
12
|
+
* @returns {bigint[]} Small polygon
|
|
13
|
+
* @private
|
|
14
|
+
*/
|
|
15
|
+
static smallPoly() {
|
|
16
|
+
const poly = new Array(this.N);
|
|
17
|
+
for (let i = 0; i < this.N; i++) {
|
|
18
|
+
const r = Math.random();
|
|
19
|
+
if (r < 0.33)
|
|
20
|
+
poly[i] = -1n;
|
|
21
|
+
else if (r < 0.66)
|
|
22
|
+
poly[i] = 0n;
|
|
23
|
+
else
|
|
24
|
+
poly[i] = 1n;
|
|
25
|
+
}
|
|
26
|
+
return poly;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Uniform polygon
|
|
30
|
+
* @returns {bigint[]}
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
static uniformPoly() {
|
|
34
|
+
const poly = new Array(this.N);
|
|
35
|
+
const bytes = utils_1.QuarkDashUtils.randomBytes(this.N * 2);
|
|
36
|
+
for (let i = 0; i < this.N; i++) {
|
|
37
|
+
const val = (bytes[2 * i] | (bytes[2 * i + 1] << 8)) % Number(this.Q);
|
|
38
|
+
poly[i] = BigInt(val);
|
|
39
|
+
}
|
|
40
|
+
return poly;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* NTT Operation
|
|
44
|
+
* @param poly {bigint[]} Polygon
|
|
45
|
+
* @private
|
|
46
|
+
*/
|
|
47
|
+
static ntt(poly) {
|
|
48
|
+
const res = [...poly];
|
|
49
|
+
let len = 2;
|
|
50
|
+
while (len <= this.N) {
|
|
51
|
+
const wlen = this.powMod(this.ROOT, BigInt(this.N / len), this.Q);
|
|
52
|
+
for (let i = 0; i < this.N; i += len) {
|
|
53
|
+
let w = 1n;
|
|
54
|
+
for (let j = 0; j < len / 2; j++) {
|
|
55
|
+
const u = res[i + j];
|
|
56
|
+
const v = (res[i + j + len / 2] * w) % this.Q;
|
|
57
|
+
res[i + j] = (u + v) % this.Q;
|
|
58
|
+
res[i + j + len / 2] = (u - v + this.Q) % this.Q;
|
|
59
|
+
w = (w * wlen) % this.Q;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
len <<= 1;
|
|
63
|
+
}
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Inverse NTT
|
|
68
|
+
* @param poly {bigint[]} Polygon
|
|
69
|
+
* @private
|
|
70
|
+
*/
|
|
71
|
+
static invNTT(poly) {
|
|
72
|
+
const res = [...poly];
|
|
73
|
+
let len = this.N;
|
|
74
|
+
while (len >= 2) {
|
|
75
|
+
const wlen = this.powMod(this.ROOT, BigInt(this.N / len), this.Q);
|
|
76
|
+
for (let i = 0; i < this.N; i += len) {
|
|
77
|
+
let w = 1n;
|
|
78
|
+
for (let j = 0; j < len / 2; j++) {
|
|
79
|
+
const u = res[i + j];
|
|
80
|
+
const v = res[i + j + len / 2];
|
|
81
|
+
res[i + j] = (u + v) % this.Q;
|
|
82
|
+
res[i + j + len / 2] = ((u - v + this.Q) * w) % this.Q;
|
|
83
|
+
w = (w * wlen) % this.Q;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
len >>= 1;
|
|
87
|
+
}
|
|
88
|
+
for (let i = 0; i < this.N; i++)
|
|
89
|
+
res[i] = (res[i] * this.INV_N) % this.Q;
|
|
90
|
+
return res;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Multiply
|
|
94
|
+
* @param a {bigint[]} Polygon
|
|
95
|
+
* @param b {bigint[]} Polygon
|
|
96
|
+
* @returns {bigint[]} Multiplied polygons
|
|
97
|
+
*/
|
|
98
|
+
static multiply(a, b) {
|
|
99
|
+
const aNTT = this.ntt(a);
|
|
100
|
+
const bNTT = this.ntt(b);
|
|
101
|
+
const prod = new Array(this.N);
|
|
102
|
+
for (let i = 0; i < this.N; i++)
|
|
103
|
+
prod[i] = (aNTT[i] * bNTT[i]) % this.Q;
|
|
104
|
+
return this.invNTT(prod);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Serialize polygon
|
|
108
|
+
* @param poly {bigint[]} Polygon
|
|
109
|
+
* @returns {Uint8Array} Polygon buffer
|
|
110
|
+
* @private
|
|
111
|
+
*/
|
|
112
|
+
static serializePoly(poly) {
|
|
113
|
+
const bytes = new Uint8Array(this.N * 2);
|
|
114
|
+
for (let i = 0; i < this.N; i++) {
|
|
115
|
+
const val = Number(poly[i]);
|
|
116
|
+
bytes[2 * i] = val & 0xFF;
|
|
117
|
+
bytes[2 * i + 1] = (val >> 8) & 0xFF;
|
|
118
|
+
}
|
|
119
|
+
return bytes;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Deserialize Polygon
|
|
123
|
+
* @param bytes {Uint8Array} Polygon buffer
|
|
124
|
+
* @returns {bigint[]} Polygon
|
|
125
|
+
* @private
|
|
126
|
+
*/
|
|
127
|
+
static deserializePoly(bytes) {
|
|
128
|
+
const poly = new Array(this.N);
|
|
129
|
+
for (let i = 0; i < this.N; i++) {
|
|
130
|
+
const val = bytes[2 * i] | (bytes[2 * i + 1] << 8);
|
|
131
|
+
poly[i] = BigInt(val);
|
|
132
|
+
}
|
|
133
|
+
return poly;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Round to bits
|
|
137
|
+
* @param poly {bigint[]} Polygon
|
|
138
|
+
* @returns {Uint8Array} rounded buffer
|
|
139
|
+
* @private
|
|
140
|
+
*/
|
|
141
|
+
static roundToBits(poly) {
|
|
142
|
+
const result = new Uint8Array(32);
|
|
143
|
+
for (let i = 0; i < this.N; i++) {
|
|
144
|
+
const bit = (Number(poly[i]) > Number(this.Q) / 2) ? 1 : 0;
|
|
145
|
+
if (bit)
|
|
146
|
+
result[i >> 3] |= (1 << (i & 7));
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Modular exponentiation
|
|
152
|
+
* @param base {bigint} Base
|
|
153
|
+
* @param exp {bigint} exponential
|
|
154
|
+
* @param mod {bigint} module
|
|
155
|
+
* @returns {bigint} Result of modular exponentiation
|
|
156
|
+
* @private
|
|
157
|
+
*/
|
|
158
|
+
static powMod(base, exp, mod) {
|
|
159
|
+
let result = 1n, b = base % mod, e = exp;
|
|
160
|
+
while (e > 0n) {
|
|
161
|
+
if (e & 1n)
|
|
162
|
+
result = (result * b) % mod;
|
|
163
|
+
b = (b * b) % mod;
|
|
164
|
+
e >>= 1n;
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Modular inverse
|
|
170
|
+
* @param a {bigint}
|
|
171
|
+
* @param m {bigint}
|
|
172
|
+
* @returns {bigint} Inversion result
|
|
173
|
+
* @private
|
|
174
|
+
*/
|
|
175
|
+
static modInverse(a, m) {
|
|
176
|
+
let [old_r, r] = [a, m], [old_s, s] = [1n, 0n];
|
|
177
|
+
while (r !== 0n) {
|
|
178
|
+
const q = old_r / r;
|
|
179
|
+
[old_r, r] = [r, old_r - q * r];
|
|
180
|
+
[old_s, s] = [s, old_s - q * s];
|
|
181
|
+
}
|
|
182
|
+
return (old_s % m + m) % m;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate crypto key pair async
|
|
186
|
+
* @returns {ICryptoKeyPair} Crypto key pair
|
|
187
|
+
* TODO: GPU Calculations
|
|
188
|
+
*/
|
|
189
|
+
async generateKeyPair() {
|
|
190
|
+
return this.generateKeyPairSync();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Generate crypto key pair sync
|
|
194
|
+
* @returns {ICryptoKeyPair} Crypto key pair
|
|
195
|
+
*/
|
|
196
|
+
generateKeyPairSync() {
|
|
197
|
+
const a = _a.uniformPoly();
|
|
198
|
+
const s = _a.smallPoly();
|
|
199
|
+
const e = _a.smallPoly();
|
|
200
|
+
const as = _a.multiply(a, s);
|
|
201
|
+
const b = new Array(_a.N);
|
|
202
|
+
for (let i = 0; i < _a.N; i++)
|
|
203
|
+
b[i] = (as[i] + e[i]) % _a.Q;
|
|
204
|
+
const pub = utils_1.QuarkDashUtils.concatBytes(_a.serializePoly(a), _a.serializePoly(b));
|
|
205
|
+
const priv = _a.serializePoly(s);
|
|
206
|
+
return { publicKey: pub, privateKey: priv };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Encapsulate async
|
|
210
|
+
* @param publicKey {Uint8Array} Public key buffer
|
|
211
|
+
* @returns {Promise<ICryptoEncapsulated>} Encapsulated data
|
|
212
|
+
* TODO: GPU Calculations
|
|
213
|
+
*/
|
|
214
|
+
async encapsulate(publicKey) {
|
|
215
|
+
return this.encapsulateSync(publicKey);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Encapsulate sync
|
|
219
|
+
* @param publicKey {Uint8Array} Public key buffer
|
|
220
|
+
* @returns {ICryptoEncapsulated} Encapsulated data
|
|
221
|
+
*/
|
|
222
|
+
encapsulateSync(publicKey) {
|
|
223
|
+
const aBytes = publicKey.slice(0, _a.N * 2);
|
|
224
|
+
const bBytes = publicKey.slice(_a.N * 2);
|
|
225
|
+
const a = _a.deserializePoly(aBytes);
|
|
226
|
+
const b = _a.deserializePoly(bBytes);
|
|
227
|
+
const sp = _a.smallPoly();
|
|
228
|
+
const ep = _a.smallPoly();
|
|
229
|
+
const uArr = _a.multiply(a, sp);
|
|
230
|
+
for (let i = 0; i < _a.N; i++)
|
|
231
|
+
uArr[i] = (uArr[i] + ep[i]) % _a.Q;
|
|
232
|
+
const w = _a.multiply(b, sp);
|
|
233
|
+
const shared = _a.roundToBits(w);
|
|
234
|
+
const ciphertext = _a.serializePoly(uArr);
|
|
235
|
+
return { ciphertext, sharedSecret: shared };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Decapsulate async
|
|
239
|
+
* @param privateKey {Uint8Array} Private key buffer
|
|
240
|
+
* @param ciphertext {Uint8Array} Cipher text buffer
|
|
241
|
+
* @returns {Promise<Uint8Array>} Buffer data
|
|
242
|
+
* TODO: GPU Calculations
|
|
243
|
+
*/
|
|
244
|
+
async decapsulate(privateKey, ciphertext) {
|
|
245
|
+
return this.decapsulateSync(privateKey, ciphertext);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Decapsulate sync
|
|
249
|
+
* @param privateKey {Uint8Array} Private key buffer
|
|
250
|
+
* @param ciphertext {Uint8Array} Cipher text buffer
|
|
251
|
+
* @returns {Uint8Array} Buffer data
|
|
252
|
+
*/
|
|
253
|
+
decapsulateSync(privateKey, ciphertext) {
|
|
254
|
+
const s = _a.deserializePoly(privateKey);
|
|
255
|
+
const u = _a.deserializePoly(ciphertext);
|
|
256
|
+
const w = _a.multiply(u, s);
|
|
257
|
+
return _a.roundToBits(w);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.QuarkDashKeyExchange = QuarkDashKeyExchange;
|
|
261
|
+
_a = QuarkDashKeyExchange;
|
|
262
|
+
// Ring-LWE Constants
|
|
263
|
+
QuarkDashKeyExchange.N = 256;
|
|
264
|
+
QuarkDashKeyExchange.Q = 7681n;
|
|
265
|
+
QuarkDashKeyExchange.ROOT = 7n;
|
|
266
|
+
QuarkDashKeyExchange.INV_N = _a.modInverse(BigInt(_a.N), _a.Q);
|
|
267
|
+
//# sourceMappingURL=ringlwe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ringlwe.js","sourceRoot":"","sources":["../../src/ringlwe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.QuarkDashUtils = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* QuarkDash Crypto Utils
|
|
9
|
+
*
|
|
10
|
+
* @git https://github.com/devsdaddy/quarkdash
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
* @author Elijah Rastorguev
|
|
13
|
+
* @build 1000
|
|
14
|
+
* @website https://dev.to/devsdaddy
|
|
15
|
+
*/
|
|
16
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
17
|
+
/**
|
|
18
|
+
* Crypto Utils Class
|
|
19
|
+
*/
|
|
20
|
+
class QuarkDashUtils {
|
|
21
|
+
/**
|
|
22
|
+
* Run SHA256 async
|
|
23
|
+
* @param data {Uint8Array} Bytes buffer
|
|
24
|
+
* @return {Promise<Uint8Array>} Result
|
|
25
|
+
*/
|
|
26
|
+
static async sha256(data) {
|
|
27
|
+
const hash = await crypto_1.default.subtle.digest('SHA-256', data);
|
|
28
|
+
return new Uint8Array(hash);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run SHA256 sync
|
|
32
|
+
* @param data {Uint8Array} Bytes buffer
|
|
33
|
+
* @return {Uint8Array} Result
|
|
34
|
+
*/
|
|
35
|
+
static sha256Sync(data) {
|
|
36
|
+
if (typeof require !== 'undefined') {
|
|
37
|
+
const crypto = require('crypto');
|
|
38
|
+
const hash = crypto.createHash('sha256').update(data).digest();
|
|
39
|
+
return new Uint8Array(hash);
|
|
40
|
+
}
|
|
41
|
+
throw new Error('Synchronous SHA256 not available in browser');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get Shake-256 result async
|
|
45
|
+
* @param data {Uint8Array} Bytes buffer
|
|
46
|
+
* @param len {number} Buffer length
|
|
47
|
+
* @return {Promise<Uint8Array>} Result buffer
|
|
48
|
+
*/
|
|
49
|
+
static async shake256(data, len) {
|
|
50
|
+
const result = new Uint8Array(len);
|
|
51
|
+
let counter = 0;
|
|
52
|
+
let offset = 0;
|
|
53
|
+
while (offset < len) {
|
|
54
|
+
const cnt = new Uint8Array(4);
|
|
55
|
+
cnt[0] = (counter >> 24) & 0xFF;
|
|
56
|
+
cnt[1] = (counter >> 16) & 0xFF;
|
|
57
|
+
cnt[2] = (counter >> 8) & 0xFF;
|
|
58
|
+
cnt[3] = counter & 0xFF;
|
|
59
|
+
const hash = await this.sha256(this.concatBytes(data, cnt));
|
|
60
|
+
const take = Math.min(hash.length, len - offset);
|
|
61
|
+
result.set(hash.slice(0, take), offset);
|
|
62
|
+
offset += take;
|
|
63
|
+
counter++;
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get Shake-256 result sync
|
|
69
|
+
* @param data {Uint8Array} Bytes buffer
|
|
70
|
+
* @param len {number} Buffer length
|
|
71
|
+
* @return {Uint8Array} Result buffer
|
|
72
|
+
*/
|
|
73
|
+
static shake256Sync(data, len) {
|
|
74
|
+
const result = new Uint8Array(len);
|
|
75
|
+
let counter = 0;
|
|
76
|
+
let offset = 0;
|
|
77
|
+
while (offset < len) {
|
|
78
|
+
const cnt = new Uint8Array(4);
|
|
79
|
+
cnt[0] = (counter >> 24) & 0xFF;
|
|
80
|
+
cnt[1] = (counter >> 16) & 0xFF;
|
|
81
|
+
cnt[2] = (counter >> 8) & 0xFF;
|
|
82
|
+
cnt[3] = counter & 0xFF;
|
|
83
|
+
const hash = this.sha256Sync(this.concatBytes(data, cnt));
|
|
84
|
+
const take = Math.min(hash.length, len - offset);
|
|
85
|
+
result.set(hash.slice(0, take), offset);
|
|
86
|
+
offset += take;
|
|
87
|
+
counter++;
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Concat bytes
|
|
93
|
+
* @param arrays {Uint8Array|null|undefined} Input arrays for concat
|
|
94
|
+
* @returns {Uint8Array} Result buffer
|
|
95
|
+
*/
|
|
96
|
+
static concatBytes(...arrays) {
|
|
97
|
+
const valid = arrays.filter(a => a != null);
|
|
98
|
+
const total = valid.reduce((s, a) => s + a.length, 0);
|
|
99
|
+
const res = new Uint8Array(total);
|
|
100
|
+
let pos = 0;
|
|
101
|
+
for (const a of valid) {
|
|
102
|
+
res.set(a, pos);
|
|
103
|
+
pos += a.length;
|
|
104
|
+
}
|
|
105
|
+
return res;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Coerce Array
|
|
109
|
+
* @param arg {any} Argument
|
|
110
|
+
* @param copy {any} Copy
|
|
111
|
+
* @protected
|
|
112
|
+
*/
|
|
113
|
+
static coerceArray(arg, copy) {
|
|
114
|
+
let self = this;
|
|
115
|
+
// ArrayBuffer view
|
|
116
|
+
if (arg.buffer && arg.name === 'Uint8Array') {
|
|
117
|
+
if (copy) {
|
|
118
|
+
if (arg.slice) {
|
|
119
|
+
arg = arg.slice();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
arg = Array.prototype.slice.call(arg);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return arg;
|
|
126
|
+
}
|
|
127
|
+
// It's an array; check it is a valid representation of a byte
|
|
128
|
+
if (Array.isArray(arg)) {
|
|
129
|
+
if (!self.checkInts(arg)) {
|
|
130
|
+
throw new Error('Array contains invalid value: ' + arg);
|
|
131
|
+
}
|
|
132
|
+
return new Uint8Array(arg);
|
|
133
|
+
}
|
|
134
|
+
// Something else, but behaves like an array (maybe a Buffer? Arguments?)
|
|
135
|
+
if (self.checkInt(arg.length) && self.checkInts(arg)) {
|
|
136
|
+
return new Uint8Array(arg);
|
|
137
|
+
}
|
|
138
|
+
throw new Error('unsupported array-like object');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Check if value is int
|
|
142
|
+
* @param value {any} Value
|
|
143
|
+
* @returns {boolean}
|
|
144
|
+
* @protected
|
|
145
|
+
*/
|
|
146
|
+
static checkInt(value) {
|
|
147
|
+
return parseInt(value) === value;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check Ints inside array
|
|
151
|
+
* @param arrayish {any} Array
|
|
152
|
+
* @returns {boolean} Any value is integer and between 0 and 255
|
|
153
|
+
* @protected
|
|
154
|
+
*/
|
|
155
|
+
static checkInts(arrayish) {
|
|
156
|
+
let self = this;
|
|
157
|
+
if (!self.checkInt(arrayish.length)) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
for (let i = 0; i < arrayish.length; i++) {
|
|
161
|
+
if (!self.checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get random bytes
|
|
169
|
+
* @param len {number} buffer length
|
|
170
|
+
* @returns {Uint8Array} Random bytes buffer
|
|
171
|
+
*/
|
|
172
|
+
static randomBytes(len) {
|
|
173
|
+
return crypto_1.default.getRandomValues(new Uint8Array(len));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Convert raw text to bytes array
|
|
177
|
+
* @param text {string} raw string
|
|
178
|
+
* @returns {any} bytes array
|
|
179
|
+
*/
|
|
180
|
+
static textToBytes(text) {
|
|
181
|
+
let self = this;
|
|
182
|
+
let result = [], i = 0;
|
|
183
|
+
text = encodeURI(text);
|
|
184
|
+
while (i < text.length) {
|
|
185
|
+
let c = text.charCodeAt(i++);
|
|
186
|
+
// if it is a % sign, encode the following 2 bytes as a hex value
|
|
187
|
+
if (c === 37) {
|
|
188
|
+
result.push(parseInt(text.substr(i, 2), 16));
|
|
189
|
+
i += 2;
|
|
190
|
+
// otherwise, just the actual byte
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
result.push(c);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return self.coerceArray(result);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Convert bytes array to raw string
|
|
200
|
+
* @param bytes {number[]|Uint8Array} Bytes array
|
|
201
|
+
* @returns {string} raw string
|
|
202
|
+
*/
|
|
203
|
+
static bytesToText(bytes) {
|
|
204
|
+
return new TextDecoder().decode(bytes);
|
|
205
|
+
let result = [], i = 0;
|
|
206
|
+
while (i < bytes.length) {
|
|
207
|
+
let c = bytes[i];
|
|
208
|
+
if (c < 128) {
|
|
209
|
+
result.push(String.fromCharCode(c));
|
|
210
|
+
i++;
|
|
211
|
+
}
|
|
212
|
+
else if (c > 191 && c < 224) {
|
|
213
|
+
result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f)));
|
|
214
|
+
i += 2;
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)));
|
|
218
|
+
i += 3;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return result.join('');
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Convert HEX string to bytes array
|
|
225
|
+
* @param text {string} HEX string
|
|
226
|
+
* @returns {number[]} bytes array
|
|
227
|
+
* @constructor
|
|
228
|
+
*/
|
|
229
|
+
static HEXToBytes(text) {
|
|
230
|
+
let result = [];
|
|
231
|
+
for (let i = 0; i < text.length; i += 2) {
|
|
232
|
+
result.push(parseInt(text.substr(i, 2), 16));
|
|
233
|
+
}
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Convert bytes array to HEX string
|
|
238
|
+
* @param bytes {number[]|Uint8Array} Bytes array
|
|
239
|
+
* @returns {string} HEX String
|
|
240
|
+
*/
|
|
241
|
+
static bytesToHEX(bytes) {
|
|
242
|
+
let self = this;
|
|
243
|
+
let result = [];
|
|
244
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
245
|
+
let v = bytes[i];
|
|
246
|
+
result.push(self.HEXChars[(v & 0xf0) >> 4] + self.HEXChars[v & 0x0f]);
|
|
247
|
+
}
|
|
248
|
+
return result.join('');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Constant time equal
|
|
252
|
+
* @param a {Uint8Array} first buffer
|
|
253
|
+
* @param b {Uint8Array} second buffer
|
|
254
|
+
* @returns {boolean} Equal or not
|
|
255
|
+
*/
|
|
256
|
+
static constantTimeEqual(a, b) {
|
|
257
|
+
if (a.length !== b.length)
|
|
258
|
+
return false;
|
|
259
|
+
let diff = 0;
|
|
260
|
+
for (let i = 0; i < a.length; i++)
|
|
261
|
+
diff |= a[i] ^ b[i];
|
|
262
|
+
return diff === 0;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Secure zero
|
|
266
|
+
* @param bytes {Uint8Array} bytes buffer
|
|
267
|
+
*/
|
|
268
|
+
static secureZero(bytes) {
|
|
269
|
+
for (let i = 0; i < bytes.length; i++)
|
|
270
|
+
bytes[i] = 0;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Read U32 from buffer
|
|
274
|
+
* @param arr {Uint8Array} buffer
|
|
275
|
+
* @param off {number} Offset
|
|
276
|
+
* @returns {number} U32
|
|
277
|
+
* @private
|
|
278
|
+
*/
|
|
279
|
+
static readU32(arr, off) {
|
|
280
|
+
return (arr[off] | (arr[off + 1] << 8) | (arr[off + 2] << 16) | (arr[off + 3] << 24)) >>> 0;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Write U32 to buffer
|
|
284
|
+
* @param v {number} U32
|
|
285
|
+
* @param arr {Uint8Array} Target buffer
|
|
286
|
+
* @param off {number} Offset
|
|
287
|
+
* @private
|
|
288
|
+
*/
|
|
289
|
+
static writeU32(v, arr, off) {
|
|
290
|
+
arr[off] = v & 0xFF;
|
|
291
|
+
arr[off + 1] = (v >> 8) & 0xFF;
|
|
292
|
+
arr[off + 2] = (v >> 16) & 0xFF;
|
|
293
|
+
arr[off + 3] = (v >> 24) & 0xFF;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Read Uint32 Value
|
|
297
|
+
* @param arr {Uint8Array} Bytes buffer
|
|
298
|
+
* @param off {number} Offset
|
|
299
|
+
* @returns {number} Uint32 Value
|
|
300
|
+
*/
|
|
301
|
+
static readUint32(arr, off) {
|
|
302
|
+
return (arr[off] | (arr[off + 1] << 8) | (arr[off + 2] << 16) | (arr[off + 3] << 24)) >>> 0;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Read Uint64 Value
|
|
306
|
+
* @param arr {Uint8Array} Bytes buffer
|
|
307
|
+
* @param off {number} offset
|
|
308
|
+
* @returns {bigint} Bigint
|
|
309
|
+
*/
|
|
310
|
+
static readUint64(arr, off) {
|
|
311
|
+
let v = 0n;
|
|
312
|
+
for (let i = 0; i < 8; i++)
|
|
313
|
+
v |= BigInt(arr[off + i]) << BigInt(i * 8);
|
|
314
|
+
return v;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.QuarkDashUtils = QuarkDashUtils;
|
|
318
|
+
// Protected Constants
|
|
319
|
+
QuarkDashUtils.HEXChars = '0123456789abcdef';
|
|
320
|
+
//# sourceMappingURL=utils.js.map
|