react-native-quick-crypto 0.6.0 → 0.7.0-rc.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/README.md +70 -18
- package/android/CMakeLists.txt +58 -61
- package/android/build.gradle +105 -53
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/android/gradle.properties +5 -5
- package/android/src/main/{AndroidManifest.xml → AndroidManifestNew.xml} +1 -2
- package/cpp/Cipher/MGLCipherHostObject.cpp +31 -5
- package/cpp/Cipher/MGLGenerateKeyPairInstaller.cpp +21 -31
- package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp +4 -17
- package/cpp/Cipher/MGLPublicCipher.h +1 -1
- package/cpp/Cipher/MGLPublicCipherInstaller.h +6 -6
- package/cpp/Cipher/MGLRsa.cpp +224 -11
- package/cpp/Cipher/MGLRsa.h +13 -3
- package/cpp/Hash/MGLHashHostObject.cpp +1 -1
- package/cpp/Hash/MGLHashInstaller.cpp +2 -4
- package/cpp/JSIUtils/MGLJSIMacros.h +10 -0
- package/cpp/JSIUtils/MGLThreadAwareHostObject.h +1 -1
- package/cpp/MGLKeys.cpp +415 -471
- package/cpp/MGLKeys.h +70 -2
- package/cpp/MGLQuickCryptoHostObject.cpp +9 -0
- package/cpp/Random/MGLRandomHostObject.cpp +9 -2
- package/cpp/Sig/MGLSignHostObjects.cpp +1 -1
- package/cpp/Utils/MGLUtils.cpp +104 -32
- package/cpp/Utils/MGLUtils.h +172 -143
- package/cpp/Utils/node.h +13 -0
- package/cpp/webcrypto/MGLWebCrypto.cpp +63 -0
- package/cpp/webcrypto/MGLWebCrypto.h +34 -0
- package/cpp/webcrypto/crypto_ec.cpp +334 -0
- package/cpp/webcrypto/crypto_ec.h +65 -0
- package/ios/QuickCrypto.xcodeproj/project.pbxproj +4 -4
- package/lib/commonjs/@types/crypto-browserify.d.js.map +1 -1
- package/lib/commonjs/Cipher.js +53 -194
- package/lib/commonjs/Cipher.js.map +1 -1
- package/lib/commonjs/Hash.js +29 -29
- package/lib/commonjs/Hash.js.map +1 -1
- package/lib/commonjs/Hashnames.js +75 -0
- package/lib/commonjs/Hashnames.js.map +1 -0
- package/lib/commonjs/Hmac.js +6 -29
- package/lib/commonjs/Hmac.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/Cipher.js +3 -5
- package/lib/commonjs/NativeQuickCrypto/Cipher.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js +11 -20
- package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/hash.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/hmac.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/pbkdf2.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/random.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/sig.js.map +1 -1
- package/lib/commonjs/NativeQuickCrypto/webcrypto.js +6 -0
- package/lib/commonjs/NativeQuickCrypto/webcrypto.js.map +1 -0
- package/lib/commonjs/QuickCrypto.js +5 -14
- package/lib/commonjs/QuickCrypto.js.map +1 -1
- package/lib/commonjs/Utils.js +360 -48
- package/lib/commonjs/Utils.js.map +1 -1
- package/lib/commonjs/aes.js +324 -0
- package/lib/commonjs/aes.js.map +1 -0
- package/lib/commonjs/constants.js +1 -2
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/ec.js +288 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/index.js +6 -10
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys.js +280 -48
- package/lib/commonjs/keys.js.map +1 -1
- package/lib/commonjs/pbkdf2.js +44 -18
- package/lib/commonjs/pbkdf2.js.map +1 -1
- package/lib/commonjs/random.js +49 -68
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +329 -0
- package/lib/commonjs/rsa.js.map +1 -0
- package/lib/commonjs/sig.js +13 -54
- package/lib/commonjs/sig.js.map +1 -1
- package/lib/commonjs/subtle.js +271 -0
- package/lib/commonjs/subtle.js.map +1 -0
- package/lib/module/@types/crypto-browserify.d.js.map +1 -1
- package/lib/module/Cipher.js +53 -188
- package/lib/module/Cipher.js.map +1 -1
- package/lib/module/Hash.js +27 -21
- package/lib/module/Hash.js.map +1 -1
- package/lib/module/Hashnames.js +71 -0
- package/lib/module/Hashnames.js.map +1 -0
- package/lib/module/Hmac.js +4 -21
- package/lib/module/Hmac.js.map +1 -1
- package/lib/module/NativeQuickCrypto/Cipher.js +3 -4
- package/lib/module/NativeQuickCrypto/Cipher.js.map +1 -1
- package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js +11 -17
- package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +1 -1
- package/lib/module/NativeQuickCrypto/hash.js.map +1 -1
- package/lib/module/NativeQuickCrypto/hmac.js.map +1 -1
- package/lib/module/NativeQuickCrypto/pbkdf2.js.map +1 -1
- package/lib/module/NativeQuickCrypto/random.js.map +1 -1
- package/lib/module/NativeQuickCrypto/sig.js.map +1 -1
- package/lib/module/NativeQuickCrypto/webcrypto.js +2 -0
- package/lib/module/NativeQuickCrypto/webcrypto.js.map +1 -0
- package/lib/module/QuickCrypto.js +2 -0
- package/lib/module/QuickCrypto.js.map +1 -1
- package/lib/module/Utils.js +319 -33
- package/lib/module/Utils.js.map +1 -1
- package/lib/module/aes.js +317 -0
- package/lib/module/aes.js.map +1 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/ec.js +282 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/index.js +7 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys.js +279 -43
- package/lib/module/keys.js.map +1 -1
- package/lib/module/pbkdf2.js +44 -13
- package/lib/module/pbkdf2.js.map +1 -1
- package/lib/module/random.js +46 -54
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +323 -0
- package/lib/module/rsa.js.map +1 -0
- package/lib/module/sig.js +13 -46
- package/lib/module/sig.js.map +1 -1
- package/lib/module/subtle.js +265 -0
- package/lib/module/subtle.js.map +1 -0
- package/lib/typescript/src/Cipher.d.ts +72 -0
- package/lib/typescript/src/Cipher.d.ts.map +1 -0
- package/lib/typescript/{Hash.d.ts → src/Hash.d.ts} +8 -7
- package/lib/typescript/src/Hash.d.ts.map +1 -0
- package/lib/typescript/src/Hashnames.d.ts +11 -0
- package/lib/typescript/src/Hashnames.d.ts.map +1 -0
- package/lib/typescript/{Hmac.d.ts → src/Hmac.d.ts} +3 -3
- package/lib/typescript/src/Hmac.d.ts.map +1 -0
- package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts +34 -0
- package/lib/typescript/src/NativeQuickCrypto/Cipher.d.ts.map +1 -0
- package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/NativeQuickCrypto.d.ts +3 -0
- package/lib/typescript/src/NativeQuickCrypto/NativeQuickCrypto.d.ts.map +1 -0
- package/lib/typescript/src/NativeQuickCrypto/hash.d.ts +7 -0
- package/lib/typescript/src/NativeQuickCrypto/hash.d.ts.map +1 -0
- package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts +6 -0
- package/lib/typescript/src/NativeQuickCrypto/hmac.d.ts.map +1 -0
- package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/pbkdf2.d.ts +2 -1
- package/lib/typescript/src/NativeQuickCrypto/pbkdf2.d.ts.map +1 -0
- package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/random.d.ts +2 -1
- package/lib/typescript/src/NativeQuickCrypto/random.d.ts.map +1 -0
- package/lib/typescript/{NativeQuickCrypto → src/NativeQuickCrypto}/sig.d.ts +5 -4
- package/lib/typescript/src/NativeQuickCrypto/sig.d.ts.map +1 -0
- package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts +27 -0
- package/lib/typescript/src/NativeQuickCrypto/webcrypto.d.ts.map +1 -0
- package/lib/typescript/{QuickCrypto.d.ts → src/QuickCrypto.d.ts} +16 -8
- package/lib/typescript/src/QuickCrypto.d.ts.map +1 -0
- package/lib/typescript/src/Utils.d.ts +44 -0
- package/lib/typescript/src/Utils.d.ts.map +1 -0
- package/lib/typescript/src/aes.d.ts +5 -0
- package/lib/typescript/src/aes.d.ts.map +1 -0
- package/lib/typescript/{constants.d.ts → src/constants.d.ts} +1 -0
- package/lib/typescript/src/constants.d.ts.map +1 -0
- package/lib/typescript/src/ec.d.ts +5 -0
- package/lib/typescript/src/ec.d.ts.map +1 -0
- package/lib/typescript/{index.d.ts → src/index.d.ts} +33 -27
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/keys.d.ts +154 -0
- package/lib/typescript/src/keys.d.ts.map +1 -0
- package/lib/typescript/src/pbkdf2.d.ts +12 -0
- package/lib/typescript/src/pbkdf2.d.ts.map +1 -0
- package/lib/typescript/{random.d.ts → src/random.d.ts} +7 -6
- package/lib/typescript/src/random.d.ts.map +1 -0
- package/lib/typescript/src/rsa.d.ts +4 -0
- package/lib/typescript/src/rsa.d.ts.map +1 -0
- package/lib/typescript/{sig.d.ts → src/sig.d.ts} +3 -3
- package/lib/typescript/src/sig.d.ts.map +1 -0
- package/lib/typescript/src/subtle.d.ts +11 -0
- package/lib/typescript/src/subtle.d.ts.map +1 -0
- package/package.json +35 -30
- package/react-native-quick-crypto.podspec +5 -4
- package/src/Cipher.ts +103 -100
- package/src/Hash.ts +42 -6
- package/src/Hashnames.ts +91 -0
- package/src/Hmac.ts +3 -3
- package/src/NativeQuickCrypto/Cipher.ts +1 -0
- package/src/NativeQuickCrypto/NativeQuickCrypto.ts +2 -0
- package/src/NativeQuickCrypto/webcrypto.ts +46 -0
- package/src/QuickCrypto.ts +2 -0
- package/src/Utils.ts +409 -5
- package/src/aes.ts +365 -0
- package/src/ec.ts +351 -0
- package/src/keys.ts +428 -54
- package/src/pbkdf2.ts +84 -11
- package/src/random.ts +37 -24
- package/src/rsa.ts +396 -0
- package/src/sig.ts +3 -2
- package/src/subtle.ts +358 -0
- package/lib/commonjs/@types/stream-browserify.d.js +0 -2
- package/lib/commonjs/@types/stream-browserify.d.js.map +0 -1
- package/lib/module/@types/stream-browserify.d.js +0 -2
- package/lib/module/@types/stream-browserify.d.js.map +0 -1
- package/lib/typescript/Cipher.d.ts +0 -87
- package/lib/typescript/NativeQuickCrypto/Cipher.d.ts +0 -32
- package/lib/typescript/NativeQuickCrypto/hash.d.ts +0 -6
- package/lib/typescript/NativeQuickCrypto/hmac.d.ts +0 -5
- package/lib/typescript/Utils.d.ts +0 -23
- package/lib/typescript/keys.d.ts +0 -60
- package/lib/typescript/pbkdf2.d.ts +0 -9
- package/src/@types/stream-browserify.d.ts +0 -4
package/lib/module/pbkdf2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"names":["NativeQuickCrypto","Buffer","binaryLikeToArrayBuffer","lazyDOMException","bufferLikeToArrayBuffer","normalizeHashName","HashContext","promisify","WRONG_PASS","WRONG_SALT","sanitizeInput","input","errorMsg","e","nativePbkdf2","pbkdf2","password","salt","iterations","keylen","arg0","arg1","digest","callback","undefined","Error","sanitizedPassword","sanitizedSalt","normalizedDigest","Node","then","res","from","pbkdf2Sync","algo","result","pbkdf2WithDigest","pbkdf2Promise","pbkdf2DeriveBits","algorithm","baseKey","length","hash","normalizedHash","raw","keyObject","export"],"sourceRoot":"../../src","sources":["pbkdf2.ts"],"mappings":"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"}
|
package/lib/module/random.js
CHANGED
|
@@ -1,51 +1,40 @@
|
|
|
1
1
|
import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';
|
|
2
2
|
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
3
3
|
const random = NativeQuickCrypto.random;
|
|
4
|
-
export function randomFill(buffer) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
if (typeof (_ref = (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1, _ref < 1 || arguments.length <= _ref ? undefined : arguments[_ref]) !== 'function') {
|
|
8
|
-
throw new Error('No callback provided to randomDill');
|
|
4
|
+
export function randomFill(buffer, ...rest) {
|
|
5
|
+
if (typeof rest[rest.length - 1] !== 'function') {
|
|
6
|
+
throw new Error('No callback provided to randomFill');
|
|
9
7
|
}
|
|
10
|
-
|
|
11
|
-
const callback = (_ref2 = (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1, _ref2 < 1 || arguments.length <= _ref2 ? undefined : arguments[_ref2]);
|
|
8
|
+
const callback = rest[rest.length - 1];
|
|
12
9
|
let offset = 0;
|
|
13
10
|
let size = buffer.byteLength;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
size = arguments.length <= 2 ? undefined : arguments[2];
|
|
11
|
+
if (typeof rest[2] === 'function') {
|
|
12
|
+
offset = rest[0];
|
|
13
|
+
size = rest[1];
|
|
18
14
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
offset = arguments.length <= 1 ? undefined : arguments[1];
|
|
15
|
+
if (typeof rest[1] === 'function') {
|
|
16
|
+
offset = rest[0];
|
|
22
17
|
}
|
|
23
|
-
|
|
24
|
-
random.randomFill(Buffer.isBuffer(buffer) ? buffer.buffer : buffer, offset, size).then(() => {
|
|
18
|
+
random.randomFill(Buffer.isBuffer(buffer) ? buffer.buffer : ArrayBuffer.isView(buffer) ? buffer.buffer : buffer, offset, size).then(() => {
|
|
25
19
|
callback(null, buffer);
|
|
26
20
|
}, e => {
|
|
27
21
|
callback(e);
|
|
28
22
|
});
|
|
29
23
|
}
|
|
30
|
-
export function randomFillSync(buffer) {
|
|
31
|
-
|
|
32
|
-
let size = arguments.length > 2 ? arguments[2] : undefined;
|
|
33
|
-
random.randomFillSync(buffer.buffer ? buffer.buffer : buffer, offset, size !== null && size !== void 0 ? size : buffer.byteLength);
|
|
24
|
+
export function randomFillSync(buffer, offset = 0, size) {
|
|
25
|
+
random.randomFillSync(buffer.buffer ? buffer.buffer : buffer, offset, size ?? buffer.byteLength);
|
|
34
26
|
return buffer;
|
|
35
27
|
}
|
|
36
28
|
export function randomBytes(size, callback) {
|
|
37
29
|
const buf = new Buffer(size);
|
|
38
|
-
|
|
39
30
|
if (callback === undefined) {
|
|
40
31
|
randomFillSync(buf.buffer, 0, size);
|
|
41
32
|
return buf;
|
|
42
33
|
}
|
|
43
|
-
|
|
44
34
|
randomFill(buf.buffer, 0, size, error => {
|
|
45
35
|
if (error) {
|
|
46
36
|
callback(error);
|
|
47
37
|
}
|
|
48
|
-
|
|
49
38
|
callback(null, buf);
|
|
50
39
|
});
|
|
51
40
|
}
|
|
@@ -53,15 +42,19 @@ export const rng = randomBytes;
|
|
|
53
42
|
export const pseudoRandomBytes = randomBytes;
|
|
54
43
|
export const prng = randomBytes;
|
|
55
44
|
// The rest of the file is taken from https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js
|
|
45
|
+
|
|
56
46
|
// Largest integer we can read from a buffer.
|
|
57
47
|
// e.g.: Buffer.from("ff".repeat(6), "hex").readUIntBE(0, 6);
|
|
58
|
-
const RAND_MAX = 0xffffffffffff;
|
|
59
|
-
// divisible by 6 because each attempt to obtain a random int uses 6 bytes.
|
|
48
|
+
const RAND_MAX = 0xffffffffffff;
|
|
60
49
|
|
|
50
|
+
// Cache random data to use in randomInt. The cache size must be evenly
|
|
51
|
+
// divisible by 6 because each attempt to obtain a random int uses 6 bytes.
|
|
61
52
|
const randomCache = new Buffer(6 * 1024);
|
|
62
53
|
let randomCacheOffset = randomCache.length;
|
|
63
54
|
let asyncCacheFillInProgress = false;
|
|
64
|
-
const asyncCachePendingTasks = [];
|
|
55
|
+
const asyncCachePendingTasks = [];
|
|
56
|
+
|
|
57
|
+
// Generates an integer in [min, max) range where min is inclusive and max is
|
|
65
58
|
// exclusive.
|
|
66
59
|
|
|
67
60
|
export function randomInt(arg1, arg2, callback) {
|
|
@@ -71,7 +64,6 @@ export function randomInt(arg1, arg2, callback) {
|
|
|
71
64
|
let max;
|
|
72
65
|
let min;
|
|
73
66
|
const minNotSpecified = typeof arg2 === 'undefined' || typeof arg2 === 'function';
|
|
74
|
-
|
|
75
67
|
if (minNotSpecified) {
|
|
76
68
|
callback = arg2;
|
|
77
69
|
max = arg1;
|
|
@@ -80,19 +72,18 @@ export function randomInt(arg1, arg2, callback) {
|
|
|
80
72
|
min = arg1;
|
|
81
73
|
max = arg2;
|
|
82
74
|
}
|
|
83
|
-
|
|
75
|
+
if (typeof callback !== 'undefined' && typeof callback !== 'function') {
|
|
76
|
+
throw new TypeError('callback must be a function or undefined');
|
|
77
|
+
}
|
|
84
78
|
const isSync = typeof callback === 'undefined';
|
|
85
|
-
|
|
86
79
|
if (!Number.isSafeInteger(min)) {
|
|
87
80
|
// todo throw new ERR_INVALID_ARG_TYPE('min', 'a safe integer', min);
|
|
88
81
|
throw 'ERR_INVALID_ARG_TYPE';
|
|
89
82
|
}
|
|
90
|
-
|
|
91
83
|
if (!Number.isSafeInteger(max)) {
|
|
92
84
|
// todo throw new ERR_INVALID_ARG_TYPE('max', 'a safe integer', max);
|
|
93
85
|
throw 'ERR_INVALID_ARG_TYPE';
|
|
94
86
|
}
|
|
95
|
-
|
|
96
87
|
if (max <= min) {
|
|
97
88
|
/* todo throw new ERR_OUT_OF_RANGE(
|
|
98
89
|
'max',
|
|
@@ -100,11 +91,10 @@ export function randomInt(arg1, arg2, callback) {
|
|
|
100
91
|
max
|
|
101
92
|
);*/
|
|
102
93
|
throw 'ERR_OUT_OF_RANGE';
|
|
103
|
-
}
|
|
104
|
-
|
|
94
|
+
}
|
|
105
95
|
|
|
96
|
+
// First we generate a random int between [0..range)
|
|
106
97
|
const range = max - min;
|
|
107
|
-
|
|
108
98
|
if (!(range <= RAND_MAX)) {
|
|
109
99
|
/* todo throw new ERR_OUT_OF_RANGE(
|
|
110
100
|
`max${minNotSpecified ? '' : ' - min'}`,
|
|
@@ -112,36 +102,35 @@ export function randomInt(arg1, arg2, callback) {
|
|
|
112
102
|
range
|
|
113
103
|
);*/
|
|
114
104
|
throw 'ERR_OUT_OF_RANGE';
|
|
115
|
-
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// For (x % range) to produce an unbiased value greater than or equal to 0 and
|
|
116
108
|
// less than range, x must be drawn randomly from the set of integers greater
|
|
117
109
|
// than or equal to 0 and less than randLimit.
|
|
110
|
+
const randLimit = RAND_MAX - RAND_MAX % range;
|
|
118
111
|
|
|
119
|
-
|
|
120
|
-
const randLimit = RAND_MAX - RAND_MAX % range; // If we don't have a callback, or if there is still data in the cache, we can
|
|
112
|
+
// If we don't have a callback, or if there is still data in the cache, we can
|
|
121
113
|
// do this synchronously, which is super fast.
|
|
122
|
-
|
|
123
114
|
while (isSync || randomCacheOffset < randomCache.length) {
|
|
124
115
|
if (randomCacheOffset === randomCache.length) {
|
|
125
116
|
// This might block the thread for a bit, but we are in sync mode.
|
|
126
117
|
randomFillSync(randomCache);
|
|
127
118
|
randomCacheOffset = 0;
|
|
128
119
|
}
|
|
129
|
-
|
|
130
120
|
const x = randomCache.readUIntBE(randomCacheOffset, 6);
|
|
131
121
|
randomCacheOffset += 6;
|
|
132
|
-
|
|
133
122
|
if (x < randLimit) {
|
|
134
123
|
const n = x % range + min;
|
|
135
124
|
if (isSync) return n;
|
|
136
125
|
process.nextTick(callback, undefined, n);
|
|
137
126
|
return;
|
|
138
127
|
}
|
|
139
|
-
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// At this point, we are in async mode with no data in the cache. We cannot
|
|
140
131
|
// simply refill the cache, because another async call to randomInt might
|
|
141
132
|
// already be doing that. Instead, queue this call for when the cache has
|
|
142
133
|
// been refilled.
|
|
143
|
-
|
|
144
|
-
|
|
145
134
|
if (callback !== undefined) {
|
|
146
135
|
// it is (typescript doesn't know it)
|
|
147
136
|
asyncCachePendingTasks.push({
|
|
@@ -152,7 +141,6 @@ export function randomInt(arg1, arg2, callback) {
|
|
|
152
141
|
asyncRefillRandomIntCache();
|
|
153
142
|
}
|
|
154
143
|
}
|
|
155
|
-
|
|
156
144
|
function asyncRefillRandomIntCache() {
|
|
157
145
|
if (asyncCacheFillInProgress) return;
|
|
158
146
|
asyncCacheFillInProgress = true;
|
|
@@ -160,45 +148,49 @@ function asyncRefillRandomIntCache() {
|
|
|
160
148
|
asyncCacheFillInProgress = false;
|
|
161
149
|
const tasks = asyncCachePendingTasks;
|
|
162
150
|
const errorReceiver = err && tasks.shift();
|
|
163
|
-
if (!err) randomCacheOffset = 0;
|
|
151
|
+
if (!err) randomCacheOffset = 0;
|
|
152
|
+
|
|
153
|
+
// Restart all pending tasks. If an error occurred, we only notify a single
|
|
164
154
|
// callback (errorReceiver) about it. This way, every async call to
|
|
165
155
|
// randomInt has a chance of being successful, and it avoids complex
|
|
166
156
|
// exception handling here.
|
|
167
|
-
|
|
168
157
|
tasks.splice(0).forEach(task => {
|
|
169
158
|
randomInt(task.min, task.max, task.callback);
|
|
170
|
-
});
|
|
159
|
+
});
|
|
171
160
|
|
|
161
|
+
// This is the only call that might throw, and is therefore done at the end.
|
|
172
162
|
if (errorReceiver) errorReceiver.callback(err, 0);
|
|
173
163
|
});
|
|
174
|
-
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Really just the Web Crypto API alternative
|
|
175
167
|
// to require('crypto').randomFillSync() with an
|
|
176
168
|
// additional limitation that the input buffer is
|
|
177
169
|
// not allowed to exceed 65536 bytes, and can only
|
|
178
170
|
// be an integer-type TypedArray.
|
|
179
171
|
|
|
180
|
-
|
|
181
172
|
export function getRandomValues(data) {
|
|
182
173
|
if (data.byteLength > 65536) {
|
|
183
174
|
throw new Error('The requested length exceeds 65,536 bytes');
|
|
184
175
|
}
|
|
185
|
-
|
|
186
176
|
randomFillSync(data, 0);
|
|
187
177
|
return data;
|
|
188
178
|
}
|
|
189
179
|
const byteToHex = [];
|
|
190
|
-
|
|
191
180
|
for (let i = 0; i < 256; ++i) {
|
|
192
181
|
byteToHex.push((i + 0x100).toString(16).slice(1));
|
|
193
|
-
}
|
|
194
|
-
|
|
182
|
+
}
|
|
195
183
|
|
|
184
|
+
// Based on https://github.com/uuidjs/uuid/blob/main/src/v4.js
|
|
196
185
|
export function randomUUID() {
|
|
197
186
|
const size = 16;
|
|
198
187
|
const buffer = new Buffer(size);
|
|
199
|
-
randomFillSync(buffer, 0, size);
|
|
188
|
+
randomFillSync(buffer, 0, size);
|
|
200
189
|
|
|
190
|
+
// Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
|
|
191
|
+
// eslint-disable-next-line no-bitwise
|
|
201
192
|
buffer[6] = buffer[6] & 0x0f | 0x40;
|
|
193
|
+
// eslint-disable-next-line no-bitwise
|
|
202
194
|
buffer[8] = buffer[8] & 0x3f | 0x80;
|
|
203
195
|
return (byteToHex[buffer[0]] + byteToHex[buffer[1]] + byteToHex[buffer[2]] + byteToHex[buffer[3]] + '-' + byteToHex[buffer[4]] + byteToHex[buffer[5]] + '-' + byteToHex[buffer[6]] + byteToHex[buffer[7]] + '-' + byteToHex[buffer[8]] + byteToHex[buffer[9]] + '-' + byteToHex[buffer[10]] + byteToHex[buffer[11]] + byteToHex[buffer[12]] + byteToHex[buffer[13]] + byteToHex[buffer[14]] + byteToHex[buffer[15]]).toLowerCase();
|
|
204
196
|
}
|
package/lib/module/random.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["random.ts"],"names":["NativeQuickCrypto","Buffer","random","randomFill","buffer","Error","callback","offset","size","byteLength","isBuffer","then","e","randomFillSync","randomBytes","buf","undefined","error","rng","pseudoRandomBytes","prng","RAND_MAX","randomCache","randomCacheOffset","length","asyncCacheFillInProgress","asyncCachePendingTasks","randomInt","arg1","arg2","max","min","minNotSpecified","isSync","Number","isSafeInteger","range","randLimit","x","readUIntBE","n","process","nextTick","push","asyncRefillRandomIntCache","err","tasks","errorReceiver","shift","splice","forEach","task","getRandomValues","data","byteToHex","i","toString","slice","randomUUID","toLowerCase"],"mappings":"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","sourcesContent":["import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';\nimport { Buffer } from '@craftzdog/react-native-buffer';\n\nconst random = NativeQuickCrypto.random;\n\ntype TypedArray =\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | Float32Array\n | Float64Array;\ntype ArrayBufferView = TypedArray | DataView | ArrayBufferLike | Buffer;\n\nexport function randomFill<T extends ArrayBufferView>(\n buffer: T,\n callback: (err: Error | null, buf: T) => void\n): void;\n\nexport function randomFill<T extends ArrayBufferView>(\n buffer: T,\n offset: number,\n callback: (err: Error | null, buf: T) => void\n): void;\n\nexport function randomFill<T extends ArrayBufferView>(\n buffer: T,\n offset: number,\n size: number,\n callback: (err: Error | null, buf: T) => void\n): void;\n\nexport function randomFill(buffer: any, ...rest: any[]): void {\n if (typeof rest[rest.length - 1] !== 'function') {\n throw new Error('No callback provided to randomDill');\n }\n\n const callback = rest[rest.length - 1] as any as (\n err: Error | null,\n buf?: ArrayBuffer\n ) => void;\n\n let offset: number = 0;\n let size: number = buffer.byteLength;\n\n if (typeof rest[2] === 'function') {\n offset = rest[0];\n size = rest[1];\n }\n\n if (typeof rest[1] === 'function') {\n offset = rest[0];\n }\n\n random\n .randomFill(Buffer.isBuffer(buffer) ? buffer.buffer : buffer, offset, size)\n .then(\n () => {\n callback(null, buffer);\n },\n (e: Error) => {\n callback(e);\n }\n );\n}\n\nexport function randomFillSync<T extends ArrayBufferView>(\n buffer: T,\n offset?: number,\n size?: number\n): T;\n\nexport function randomFillSync(buffer: any, offset: number = 0, size?: number) {\n random.randomFillSync(\n buffer.buffer ? buffer.buffer : buffer,\n offset,\n size ?? buffer.byteLength\n );\n return buffer;\n}\n\nexport function randomBytes(size: number): ArrayBuffer;\n\nexport function randomBytes(\n size: number,\n callback: (err: Error | null, buf?: ArrayBuffer) => void\n): void;\n\nexport function randomBytes(\n size: number,\n callback?: (err: Error | null, buf?: ArrayBuffer) => void\n): void | ArrayBuffer {\n const buf = new Buffer(size);\n\n if (callback === undefined) {\n randomFillSync(buf.buffer, 0, size);\n return buf;\n }\n\n randomFill(buf.buffer, 0, size, (error: Error | null) => {\n if (error) {\n callback(error);\n }\n callback(null, buf);\n });\n}\n\nexport const rng = randomBytes;\nexport const pseudoRandomBytes = randomBytes;\nexport const prng = randomBytes;\n\ntype RandomIntCallback = (err: Error | null, value: number) => void;\ntype Task = {\n min: number;\n max: number;\n callback: RandomIntCallback;\n};\n\n// The rest of the file is taken from https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js\n\n// Largest integer we can read from a buffer.\n// e.g.: Buffer.from(\"ff\".repeat(6), \"hex\").readUIntBE(0, 6);\nconst RAND_MAX = 0xffffffffffff;\n\n// Cache random data to use in randomInt. The cache size must be evenly\n// divisible by 6 because each attempt to obtain a random int uses 6 bytes.\nconst randomCache = new Buffer(6 * 1024);\nlet randomCacheOffset = randomCache.length;\nlet asyncCacheFillInProgress = false;\nconst asyncCachePendingTasks: Task[] = [];\n\n// Generates an integer in [min, max) range where min is inclusive and max is\n// exclusive.\n\nexport function randomInt(max: number, callback: RandomIntCallback): void;\nexport function randomInt(max: number): number;\nexport function randomInt(\n min: number,\n max: number,\n callback: RandomIntCallback\n): void;\nexport function randomInt(min: number, max: number): number;\nexport function randomInt(\n arg1: number,\n arg2?: number | RandomIntCallback,\n callback?: RandomIntCallback\n): void | number {\n // Detect optional min syntax\n // randomInt(max)\n // randomInt(max, callback)\n let max: number;\n let min: number;\n const minNotSpecified =\n typeof arg2 === 'undefined' || typeof arg2 === 'function';\n\n if (minNotSpecified) {\n callback = arg2 as any as undefined | RandomIntCallback;\n max = arg1;\n min = 0;\n } else {\n min = arg1;\n max = arg2 as any as number;\n }\n\n const isSync = typeof callback === 'undefined';\n if (!Number.isSafeInteger(min)) {\n // todo throw new ERR_INVALID_ARG_TYPE('min', 'a safe integer', min);\n throw 'ERR_INVALID_ARG_TYPE';\n }\n if (!Number.isSafeInteger(max)) {\n // todo throw new ERR_INVALID_ARG_TYPE('max', 'a safe integer', max);\n throw 'ERR_INVALID_ARG_TYPE';\n }\n if (max <= min) {\n /* todo throw new ERR_OUT_OF_RANGE(\n 'max',\n `greater than the value of \"min\" (${min})`,\n max\n );*/\n throw 'ERR_OUT_OF_RANGE';\n }\n\n // First we generate a random int between [0..range)\n const range = max - min;\n\n if (!(range <= RAND_MAX)) {\n /* todo throw new ERR_OUT_OF_RANGE(\n `max${minNotSpecified ? '' : ' - min'}`,\n `<= ${RAND_MAX}`,\n range\n );*/\n throw 'ERR_OUT_OF_RANGE';\n }\n\n // For (x % range) to produce an unbiased value greater than or equal to 0 and\n // less than range, x must be drawn randomly from the set of integers greater\n // than or equal to 0 and less than randLimit.\n const randLimit = RAND_MAX - (RAND_MAX % range);\n\n // If we don't have a callback, or if there is still data in the cache, we can\n // do this synchronously, which is super fast.\n while (isSync || randomCacheOffset < randomCache.length) {\n if (randomCacheOffset === randomCache.length) {\n // This might block the thread for a bit, but we are in sync mode.\n randomFillSync(randomCache);\n randomCacheOffset = 0;\n }\n\n const x = randomCache.readUIntBE(randomCacheOffset, 6);\n randomCacheOffset += 6;\n\n if (x < randLimit) {\n const n = (x % range) + min;\n if (isSync) return n;\n process.nextTick(callback as Function, undefined, n);\n return;\n }\n }\n\n // At this point, we are in async mode with no data in the cache. We cannot\n // simply refill the cache, because another async call to randomInt might\n // already be doing that. Instead, queue this call for when the cache has\n // been refilled.\n if (callback !== undefined) {\n // it is (typescript doesn't know it)\n asyncCachePendingTasks.push({ min, max, callback });\n asyncRefillRandomIntCache();\n }\n}\n\nfunction asyncRefillRandomIntCache() {\n if (asyncCacheFillInProgress) return;\n\n asyncCacheFillInProgress = true;\n randomFill(randomCache, (err) => {\n asyncCacheFillInProgress = false;\n\n const tasks = asyncCachePendingTasks;\n const errorReceiver = err && tasks.shift();\n if (!err) randomCacheOffset = 0;\n\n // Restart all pending tasks. If an error occurred, we only notify a single\n // callback (errorReceiver) about it. This way, every async call to\n // randomInt has a chance of being successful, and it avoids complex\n // exception handling here.\n tasks.splice(0).forEach((task) => {\n randomInt(task.min, task.max, task.callback);\n });\n\n // This is the only call that might throw, and is therefore done at the end.\n if (errorReceiver) errorReceiver.callback(err, 0);\n });\n}\n\n// Really just the Web Crypto API alternative\n// to require('crypto').randomFillSync() with an\n// additional limitation that the input buffer is\n// not allowed to exceed 65536 bytes, and can only\n// be an integer-type TypedArray.\ntype DataType =\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint16Array\n | Uint32Array;\nexport function getRandomValues(data: DataType) {\n if (data.byteLength > 65536) {\n throw new Error('The requested length exceeds 65,536 bytes');\n }\n randomFillSync(data, 0);\n return data;\n}\n\nconst byteToHex: string[] = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\n// Based on https://github.com/uuidjs/uuid/blob/main/src/v4.js\nexport function randomUUID() {\n const size = 16;\n const buffer = new Buffer(size);\n randomFillSync(buffer, 0, size);\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n buffer[6] = (buffer[6] & 0x0f) | 0x40;\n buffer[8] = (buffer[8] & 0x3f) | 0x80;\n\n return (\n byteToHex[buffer[0]] +\n byteToHex[buffer[1]] +\n byteToHex[buffer[2]] +\n byteToHex[buffer[3]] +\n '-' +\n byteToHex[buffer[4]] +\n byteToHex[buffer[5]] +\n '-' +\n byteToHex[buffer[6]] +\n byteToHex[buffer[7]] +\n '-' +\n byteToHex[buffer[8]] +\n byteToHex[buffer[9]] +\n '-' +\n byteToHex[buffer[10]] +\n byteToHex[buffer[11]] +\n byteToHex[buffer[12]] +\n byteToHex[buffer[13]] +\n byteToHex[buffer[14]] +\n byteToHex[buffer[15]]\n ).toLowerCase();\n}\n"]}
|
|
1
|
+
{"version":3,"names":["NativeQuickCrypto","Buffer","random","randomFill","buffer","rest","length","Error","callback","offset","size","byteLength","isBuffer","ArrayBuffer","isView","then","e","randomFillSync","randomBytes","buf","undefined","error","rng","pseudoRandomBytes","prng","RAND_MAX","randomCache","randomCacheOffset","asyncCacheFillInProgress","asyncCachePendingTasks","randomInt","arg1","arg2","max","min","minNotSpecified","TypeError","isSync","Number","isSafeInteger","range","randLimit","x","readUIntBE","n","process","nextTick","push","asyncRefillRandomIntCache","err","tasks","errorReceiver","shift","splice","forEach","task","getRandomValues","data","byteToHex","i","toString","slice","randomUUID","toLowerCase"],"sourceRoot":"../../src","sources":["random.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
// 'use strict';
|
|
2
|
+
|
|
3
|
+
import { NativeQuickCrypto } from './NativeQuickCrypto/NativeQuickCrypto';
|
|
4
|
+
import { lazyDOMException, validateKeyOps, normalizeHashName, HashContext, hasAnyNotIn } from './Utils';
|
|
5
|
+
import { CryptoKey, PrivateKeyObject, PublicKeyObject, KeyType } from './keys';
|
|
6
|
+
|
|
7
|
+
// const {
|
|
8
|
+
// SafeSet,
|
|
9
|
+
// Uint8Array,
|
|
10
|
+
// } = primordials;
|
|
11
|
+
|
|
12
|
+
// const {
|
|
13
|
+
// KeyObjectHandle,
|
|
14
|
+
// RSACipherJob,
|
|
15
|
+
// RSAKeyExportJob,
|
|
16
|
+
// SignJob,
|
|
17
|
+
// kCryptoJobAsync,
|
|
18
|
+
// kSignJobModeSign,
|
|
19
|
+
// kSignJobModeVerify,
|
|
20
|
+
// kKeyVariantRSA_SSA_PKCS1_v1_5,
|
|
21
|
+
// kKeyVariantRSA_PSS,
|
|
22
|
+
// kKeyVariantRSA_OAEP,
|
|
23
|
+
// kKeyTypePrivate,
|
|
24
|
+
// kWebCryptoCipherEncrypt,
|
|
25
|
+
// RSA_PKCS1_PSS_PADDING,
|
|
26
|
+
// } = internalBinding('crypto');
|
|
27
|
+
|
|
28
|
+
// const {
|
|
29
|
+
// validateInt32,
|
|
30
|
+
// } = require('internal/validators');
|
|
31
|
+
|
|
32
|
+
// const {
|
|
33
|
+
// bigIntArrayToUnsignedInt,
|
|
34
|
+
// getUsagesUnion,
|
|
35
|
+
// hasAnyNotIn,
|
|
36
|
+
// jobPromise,
|
|
37
|
+
// normalizeHashName,
|
|
38
|
+
// validateKeyOps,
|
|
39
|
+
// validateMaxBufferLength,
|
|
40
|
+
// kHandle,
|
|
41
|
+
// kKeyObject,
|
|
42
|
+
// } = require('internal/crypto/util');
|
|
43
|
+
|
|
44
|
+
// const {
|
|
45
|
+
// lazyDOMException,
|
|
46
|
+
// promisify,
|
|
47
|
+
// } = require('internal/util');
|
|
48
|
+
|
|
49
|
+
// const {
|
|
50
|
+
// InternalCryptoKey,
|
|
51
|
+
// PrivateKeyObject,
|
|
52
|
+
// PublicKeyObject,
|
|
53
|
+
// createPublicKey,
|
|
54
|
+
// createPrivateKey,
|
|
55
|
+
// } = require('internal/crypto/keys');
|
|
56
|
+
|
|
57
|
+
// const {
|
|
58
|
+
// generateKeyPair: _generateKeyPair,
|
|
59
|
+
// } = require('internal/crypto/keygen');
|
|
60
|
+
|
|
61
|
+
// const kRsaVariants = {
|
|
62
|
+
// 'RSASSA-PKCS1-v1_5': kKeyVariantRSA_SSA_PKCS1_v1_5,
|
|
63
|
+
// 'RSA-PSS': kKeyVariantRSA_PSS,
|
|
64
|
+
// 'RSA-OAEP': kKeyVariantRSA_OAEP,
|
|
65
|
+
// };
|
|
66
|
+
// const generateKeyPair = promisify(_generateKeyPair);
|
|
67
|
+
|
|
68
|
+
function verifyAcceptableRsaKeyUse(name, isPublic, usages) {
|
|
69
|
+
let checkSet;
|
|
70
|
+
switch (name) {
|
|
71
|
+
case 'RSA-OAEP':
|
|
72
|
+
checkSet = isPublic ? ['encrypt', 'wrapKey'] : ['decrypt', 'unwrapKey'];
|
|
73
|
+
break;
|
|
74
|
+
case 'RSA-PSS':
|
|
75
|
+
// Fall through
|
|
76
|
+
case 'RSASSA-PKCS1-v1_5':
|
|
77
|
+
checkSet = isPublic ? ['verify'] : ['sign'];
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
throw lazyDOMException('The algorithm is not supported', 'NotSupportedError');
|
|
81
|
+
}
|
|
82
|
+
if (hasAnyNotIn(usages, checkSet)) {
|
|
83
|
+
throw lazyDOMException(`Unsupported key usage for an ${name} key`, 'SyntaxError');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// function rsaOaepCipher(mode, key, data, { label }) {
|
|
88
|
+
// const type = mode === kWebCryptoCipherEncrypt ? 'public' : 'private';
|
|
89
|
+
// if (key.type !== type) {
|
|
90
|
+
// throw lazyDOMException(
|
|
91
|
+
// 'The requested operation is not valid for the provided key',
|
|
92
|
+
// 'InvalidAccessError');
|
|
93
|
+
// }
|
|
94
|
+
// if (label !== undefined) {
|
|
95
|
+
// validateMaxBufferLength(label, 'algorithm.label');
|
|
96
|
+
// }
|
|
97
|
+
|
|
98
|
+
// return jobPromise(() => new RSACipherJob(
|
|
99
|
+
// kCryptoJobAsync,
|
|
100
|
+
// mode,
|
|
101
|
+
// key[kKeyObject][kHandle],
|
|
102
|
+
// data,
|
|
103
|
+
// kKeyVariantRSA_OAEP,
|
|
104
|
+
// normalizeHashName(key.algorithm.hash.name),
|
|
105
|
+
// label));
|
|
106
|
+
// }
|
|
107
|
+
|
|
108
|
+
// async function rsaKeyGenerate(
|
|
109
|
+
// algorithm,
|
|
110
|
+
// extractable,
|
|
111
|
+
// keyUsages) {
|
|
112
|
+
|
|
113
|
+
// const {
|
|
114
|
+
// name,
|
|
115
|
+
// modulusLength,
|
|
116
|
+
// publicExponent,
|
|
117
|
+
// hash,
|
|
118
|
+
// } = algorithm;
|
|
119
|
+
|
|
120
|
+
// const usageSet = new SafeSet(keyUsages);
|
|
121
|
+
|
|
122
|
+
// const publicExponentConverted = bigIntArrayToUnsignedInt(publicExponent);
|
|
123
|
+
// if (publicExponentConverted === undefined) {
|
|
124
|
+
// throw lazyDOMException(
|
|
125
|
+
// 'The publicExponent must be equivalent to an unsigned 32-bit value',
|
|
126
|
+
// 'OperationError');
|
|
127
|
+
// }
|
|
128
|
+
|
|
129
|
+
// switch (name) {
|
|
130
|
+
// case 'RSA-OAEP':
|
|
131
|
+
// if (hasAnyNotIn(usageSet,
|
|
132
|
+
// ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'])) {
|
|
133
|
+
// throw lazyDOMException(
|
|
134
|
+
// 'Unsupported key usage for a RSA key',
|
|
135
|
+
// 'SyntaxError');
|
|
136
|
+
// }
|
|
137
|
+
// break;
|
|
138
|
+
// default:
|
|
139
|
+
// if (hasAnyNotIn(usageSet, ['sign', 'verify'])) {
|
|
140
|
+
// throw lazyDOMException(
|
|
141
|
+
// 'Unsupported key usage for a RSA key',
|
|
142
|
+
// 'SyntaxError');
|
|
143
|
+
// }
|
|
144
|
+
// }
|
|
145
|
+
|
|
146
|
+
// const keypair = await generateKeyPair('rsa', {
|
|
147
|
+
// modulusLength,
|
|
148
|
+
// publicExponent: publicExponentConverted,
|
|
149
|
+
// }).catch((err) => {
|
|
150
|
+
// throw lazyDOMException(
|
|
151
|
+
// 'The operation failed for an operation-specific reason',
|
|
152
|
+
// { name: 'OperationError', cause: err });
|
|
153
|
+
// });
|
|
154
|
+
|
|
155
|
+
// const keyAlgorithm = {
|
|
156
|
+
// name,
|
|
157
|
+
// modulusLength,
|
|
158
|
+
// publicExponent,
|
|
159
|
+
// hash: { name: hash.name },
|
|
160
|
+
// };
|
|
161
|
+
|
|
162
|
+
// let publicUsages;
|
|
163
|
+
// let privateUsages;
|
|
164
|
+
// switch (name) {
|
|
165
|
+
// case 'RSA-OAEP': {
|
|
166
|
+
// publicUsages = getUsagesUnion(usageSet, 'encrypt', 'wrapKey');
|
|
167
|
+
// privateUsages = getUsagesUnion(usageSet, 'decrypt', 'unwrapKey');
|
|
168
|
+
// break;
|
|
169
|
+
// }
|
|
170
|
+
// default: {
|
|
171
|
+
// publicUsages = getUsagesUnion(usageSet, 'verify');
|
|
172
|
+
// privateUsages = getUsagesUnion(usageSet, 'sign');
|
|
173
|
+
// break;
|
|
174
|
+
// }
|
|
175
|
+
// }
|
|
176
|
+
|
|
177
|
+
// const publicKey =
|
|
178
|
+
// new InternalCryptoKey(
|
|
179
|
+
// keypair.publicKey,
|
|
180
|
+
// keyAlgorithm,
|
|
181
|
+
// publicUsages,
|
|
182
|
+
// true);
|
|
183
|
+
|
|
184
|
+
// const privateKey =
|
|
185
|
+
// new InternalCryptoKey(
|
|
186
|
+
// keypair.privateKey,
|
|
187
|
+
// keyAlgorithm,
|
|
188
|
+
// privateUsages,
|
|
189
|
+
// extractable);
|
|
190
|
+
|
|
191
|
+
// return { __proto__: null, publicKey, privateKey };
|
|
192
|
+
// }
|
|
193
|
+
|
|
194
|
+
// function rsaExportKey(key, format) {
|
|
195
|
+
// return jobPromise(() => new RSAKeyExportJob(
|
|
196
|
+
// kCryptoJobAsync,
|
|
197
|
+
// format,
|
|
198
|
+
// key[kKeyObject][kHandle],
|
|
199
|
+
// kRsaVariants[key.algorithm.name]));
|
|
200
|
+
// }
|
|
201
|
+
|
|
202
|
+
export const rsaImportKey = (format, keyData, algorithm, extractable, keyUsages) => {
|
|
203
|
+
// const usagesSet = new SafeSet(keyUsages);
|
|
204
|
+
let keyObject;
|
|
205
|
+
switch (format) {
|
|
206
|
+
// case 'spki': {
|
|
207
|
+
// verifyAcceptableRsaKeyUse(algorithm.name, true, keyUsages);
|
|
208
|
+
// try {
|
|
209
|
+
// keyObject = createPublicKey({
|
|
210
|
+
// key: keyData,
|
|
211
|
+
// format: 'der',
|
|
212
|
+
// type: 'spki',
|
|
213
|
+
// });
|
|
214
|
+
// } catch (err) {
|
|
215
|
+
// throw lazyDOMException('Invalid keyData', {
|
|
216
|
+
// name: 'DataError',
|
|
217
|
+
// cause: err,
|
|
218
|
+
// });
|
|
219
|
+
// }
|
|
220
|
+
// break;
|
|
221
|
+
// }
|
|
222
|
+
// case 'pkcs8': {
|
|
223
|
+
// verifyAcceptableRsaKeyUse(algorithm.name, false, keyUsages);
|
|
224
|
+
// try {
|
|
225
|
+
// keyObject = createPrivateKey({
|
|
226
|
+
// key: keyData,
|
|
227
|
+
// format: 'der',
|
|
228
|
+
// type: 'pkcs8',
|
|
229
|
+
// });
|
|
230
|
+
// } catch (err) {
|
|
231
|
+
// throw lazyDOMException('Invalid keyData', {
|
|
232
|
+
// name: 'DataError',
|
|
233
|
+
// cause: err,
|
|
234
|
+
// });
|
|
235
|
+
// }
|
|
236
|
+
// break;
|
|
237
|
+
// }
|
|
238
|
+
case 'jwk':
|
|
239
|
+
{
|
|
240
|
+
const data = keyData;
|
|
241
|
+
if (!data.kty) {
|
|
242
|
+
throw lazyDOMException('Invalid keyData', 'DataError');
|
|
243
|
+
}
|
|
244
|
+
if (data.kty !== 'RSA') throw lazyDOMException('Invalid JWK "kty" Parameter', 'DataError');
|
|
245
|
+
verifyAcceptableRsaKeyUse(algorithm.name, data.d === undefined, keyUsages);
|
|
246
|
+
if (keyUsages.length > 0 && data.use !== undefined) {
|
|
247
|
+
const checkUse = algorithm.name === 'RSA-OAEP' ? 'enc' : 'sig';
|
|
248
|
+
if (data.use !== checkUse) throw lazyDOMException('Invalid JWK "use" Parameter', 'DataError');
|
|
249
|
+
}
|
|
250
|
+
validateKeyOps(data.key_ops, keyUsages);
|
|
251
|
+
if (data.ext !== undefined && data.ext === false && extractable === true) {
|
|
252
|
+
throw lazyDOMException('JWK "ext" Parameter and extractable mismatch', 'DataError');
|
|
253
|
+
}
|
|
254
|
+
if (data.alg !== undefined) {
|
|
255
|
+
const hash = normalizeHashName(data.alg, HashContext.WebCrypto);
|
|
256
|
+
if (hash !== algorithm.hash) throw lazyDOMException('JWK "alg" does not match the requested algorithm', 'DataError');
|
|
257
|
+
}
|
|
258
|
+
const handle = NativeQuickCrypto.webcrypto.createKeyObjectHandle();
|
|
259
|
+
const type = handle.initJwk(data);
|
|
260
|
+
if (type === undefined) throw lazyDOMException('Invalid JWK', 'DataError');
|
|
261
|
+
keyObject = type === KeyType.Private ? new PrivateKeyObject(handle) : new PublicKeyObject(handle);
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
default:
|
|
265
|
+
throw lazyDOMException(`Unable to import RSA key with format ${format}`, 'NotSupportedError');
|
|
266
|
+
}
|
|
267
|
+
if (keyObject.asymmetricKeyType !== 'rsa') {
|
|
268
|
+
throw lazyDOMException('Invalid key type', 'DataError');
|
|
269
|
+
}
|
|
270
|
+
const {
|
|
271
|
+
modulusLength,
|
|
272
|
+
publicExponent
|
|
273
|
+
} = keyObject.handle.keyDetail();
|
|
274
|
+
if (publicExponent === undefined) {
|
|
275
|
+
throw lazyDOMException('publicExponent is undefined', 'DataError');
|
|
276
|
+
}
|
|
277
|
+
return new CryptoKey(keyObject, {
|
|
278
|
+
name: algorithm.name,
|
|
279
|
+
modulusLength,
|
|
280
|
+
publicExponent: new Uint8Array(publicExponent),
|
|
281
|
+
hash: algorithm.hash
|
|
282
|
+
}, keyUsages, extractable);
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
// function rsaSignVerify(key, data, { saltLength }, signature) {
|
|
286
|
+
// let padding;
|
|
287
|
+
// if (key.algorithm.name === 'RSA-PSS') {
|
|
288
|
+
// padding = RSA_PKCS1_PSS_PADDING;
|
|
289
|
+
// // TODO(@jasnell): Validate maximum size of saltLength
|
|
290
|
+
// // based on the key size:
|
|
291
|
+
// // Math.ceil((keySizeInBits - 1)/8) - digestSizeInBytes - 2
|
|
292
|
+
// validateInt32(saltLength, 'algorithm.saltLength', -2);
|
|
293
|
+
// }
|
|
294
|
+
|
|
295
|
+
// const mode = signature === undefined ? kSignJobModeSign : kSignJobModeVerify;
|
|
296
|
+
// const type = mode === kSignJobModeSign ? 'private' : 'public';
|
|
297
|
+
|
|
298
|
+
// if (key.type !== type)
|
|
299
|
+
// throw lazyDOMException(`Key must be a ${type} key`, 'InvalidAccessError');
|
|
300
|
+
|
|
301
|
+
// return jobPromise(() => new SignJob(
|
|
302
|
+
// kCryptoJobAsync,
|
|
303
|
+
// signature === undefined ? kSignJobModeSign : kSignJobModeVerify,
|
|
304
|
+
// key[kKeyObject][kHandle],
|
|
305
|
+
// undefined,
|
|
306
|
+
// undefined,
|
|
307
|
+
// undefined,
|
|
308
|
+
// data,
|
|
309
|
+
// normalizeHashName(key.algorithm.hash.name),
|
|
310
|
+
// saltLength,
|
|
311
|
+
// padding,
|
|
312
|
+
// undefined,
|
|
313
|
+
// signature));
|
|
314
|
+
// }
|
|
315
|
+
|
|
316
|
+
// module.exports = {
|
|
317
|
+
// rsaCipher: rsaOaepCipher,
|
|
318
|
+
// rsaExportKey,
|
|
319
|
+
// rsaImportKey,
|
|
320
|
+
// rsaKeyGenerate,
|
|
321
|
+
// rsaSignVerify,
|
|
322
|
+
// };
|
|
323
|
+
//# sourceMappingURL=rsa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeQuickCrypto","lazyDOMException","validateKeyOps","normalizeHashName","HashContext","hasAnyNotIn","CryptoKey","PrivateKeyObject","PublicKeyObject","KeyType","verifyAcceptableRsaKeyUse","name","isPublic","usages","checkSet","rsaImportKey","format","keyData","algorithm","extractable","keyUsages","keyObject","data","kty","d","undefined","length","use","checkUse","key_ops","ext","alg","hash","WebCrypto","handle","webcrypto","createKeyObjectHandle","type","initJwk","Private","asymmetricKeyType","modulusLength","publicExponent","keyDetail","Uint8Array"],"sourceRoot":"../../src","sources":["rsa.ts"],"mappings":"AAAA;;AAEA,SAASA,iBAAiB,QAAQ,uCAAuC;AACzE,SACEC,gBAAgB,EAEhBC,cAAc,EACdC,iBAAiB,EACjBC,WAAW,EACXC,WAAW,QACN,SAAS;AAChB,SACEC,SAAS,EACTC,gBAAgB,EAMhBC,eAAe,EAEfC,OAAO,QACF,QAAQ;;AAEf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASC,yBAAyBA,CAChCC,IAAkB,EAClBC,QAAiB,EACjBC,MAAkB,EACZ;EACN,IAAIC,QAAQ;EACZ,QAAQH,IAAI;IACV,KAAK,UAAU;MACbG,QAAQ,GAAGF,QAAQ,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC;MACvE;IACF,KAAK,SAAS;IACd;IACA,KAAK,mBAAmB;MACtBE,QAAQ,GAAGF,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;MAC3C;IACF;MACE,MAAMX,gBAAgB,CACpB,gCAAgC,EAChC,mBACF,CAAC;EACL;EACA,IAAII,WAAW,CAACQ,MAAM,EAAEC,QAAQ,CAAC,EAAE;IACjC,MAAMb,gBAAgB,CACnB,gCAA+BU,IAAK,MAAK,EAC1C,aACF,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAE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"}
|