react-native-quick-crypto 1.0.2 → 1.0.3
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/QuickCrypto.podspec +1 -0
- package/README.md +1 -1
- package/android/CMakeLists.txt +4 -0
- package/cpp/hkdf/HybridHkdf.cpp +96 -0
- package/cpp/hkdf/HybridHkdf.hpp +28 -0
- package/cpp/scrypt/HybridScrypt.cpp +62 -0
- package/cpp/scrypt/HybridScrypt.hpp +28 -0
- package/lib/commonjs/hkdf.js +81 -0
- package/lib/commonjs/hkdf.js.map +1 -0
- package/lib/commonjs/index.js +33 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/scrypt.js +98 -0
- package/lib/commonjs/scrypt.js.map +1 -0
- package/lib/commonjs/specs/hkdf.nitro.js +6 -0
- package/lib/commonjs/specs/hkdf.nitro.js.map +1 -0
- package/lib/commonjs/specs/scrypt.nitro.js +6 -0
- package/lib/commonjs/specs/scrypt.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +28 -0
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/module/hkdf.js +75 -0
- package/lib/module/hkdf.js.map +1 -0
- package/lib/module/index.js +13 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/scrypt.js +93 -0
- package/lib/module/scrypt.js.map +1 -0
- package/lib/module/specs/hkdf.nitro.js +4 -0
- package/lib/module/specs/hkdf.nitro.js.map +1 -0
- package/lib/module/specs/scrypt.nitro.js +4 -0
- package/lib/module/specs/scrypt.nitro.js.map +1 -0
- package/lib/module/subtle.js +28 -0
- package/lib/module/subtle.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/hkdf.d.ts +26 -0
- package/lib/typescript/hkdf.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +9 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/scrypt.d.ts +18 -0
- package/lib/typescript/scrypt.d.ts.map +1 -0
- package/lib/typescript/specs/hkdf.nitro.d.ts +9 -0
- package/lib/typescript/specs/hkdf.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/scrypt.nitro.d.ts +9 -0
- package/lib/typescript/specs/scrypt.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +2 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +20 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +20 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +65 -0
- package/package.json +1 -1
- package/src/hkdf.ts +152 -0
- package/src/index.ts +13 -1
- package/src/scrypt.ts +134 -0
- package/src/specs/hkdf.nitro.ts +19 -0
- package/src/specs/scrypt.nitro.ts +23 -0
- package/src/subtle.ts +45 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
|
+
import type { BinaryLike } from './utils';
|
|
3
|
+
type KeyMaterial = BinaryLike;
|
|
4
|
+
type Salt = BinaryLike;
|
|
5
|
+
type Info = BinaryLike;
|
|
6
|
+
export interface HkdfAlgorithm {
|
|
7
|
+
name: string;
|
|
8
|
+
hash: string | {
|
|
9
|
+
name: string;
|
|
10
|
+
};
|
|
11
|
+
salt: BinaryLike;
|
|
12
|
+
info: BinaryLike;
|
|
13
|
+
}
|
|
14
|
+
export interface CryptoKeyInternal {
|
|
15
|
+
keyObject: {
|
|
16
|
+
export: () => Buffer;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface HkdfCallback {
|
|
20
|
+
(err: Error | null, derivedKey?: Buffer): void;
|
|
21
|
+
}
|
|
22
|
+
export declare function hkdf(digest: string, key: KeyMaterial, salt: Salt, info: Info, keylen: number, callback: HkdfCallback): void;
|
|
23
|
+
export declare function hkdfSync(digest: string, key: KeyMaterial, salt: Salt, info: Info, keylen: number): Buffer;
|
|
24
|
+
export declare function hkdfDeriveBits(algorithm: HkdfAlgorithm, baseKey: CryptoKeyInternal, length: number): ArrayBuffer;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=hkdf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hkdf.d.ts","sourceRoot":"","sources":["../../src/hkdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAIxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,WAAW,GAAG,UAAU,CAAC;AAC9B,KAAK,IAAI,GAAG,UAAU,CAAC;AACvB,KAAK,IAAI,GAAG,UAAU,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AA2BD,wBAAgB,IAAI,CAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,GACrB,IAAI,CAiCN;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,MAAM,CAoBR;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,WAAW,CAyBb"}
|
|
@@ -3,6 +3,8 @@ import * as keys from './keys';
|
|
|
3
3
|
import * as blake3 from './blake3';
|
|
4
4
|
import * as cipher from './cipher';
|
|
5
5
|
import * as ed from './ed';
|
|
6
|
+
import * as hkdf from './hkdf';
|
|
7
|
+
import * as scrypt from './scrypt';
|
|
6
8
|
import * as random from './random';
|
|
7
9
|
import * as utils from './utils';
|
|
8
10
|
import * as subtle from './subtle';
|
|
@@ -90,9 +92,14 @@ declare const QuickCrypto: {
|
|
|
90
92
|
rng: typeof random.randomBytes;
|
|
91
93
|
pseudoRandomBytes: typeof random.randomBytes;
|
|
92
94
|
prng: typeof random.randomBytes;
|
|
95
|
+
scrypt(password: utils.BinaryLike, salt: utils.BinaryLike, keylen: number, options?: scrypt.ScryptOptions | ((err: Error | null, derivedKey?: Buffer) => void), callback?: (err: Error | null, derivedKey?: Buffer) => void): void;
|
|
96
|
+
scryptSync(password: utils.BinaryLike, salt: utils.BinaryLike, keylen: number, options?: scrypt.ScryptOptions): Buffer;
|
|
93
97
|
pbkdf2(password: utils.BinaryLike, salt: utils.BinaryLike, iterations: number, keylen: number, digest: string, callback: (err: Error | null, derivedKey?: Buffer) => void): void;
|
|
94
98
|
pbkdf2Sync(password: utils.BinaryLike, salt: utils.BinaryLike, iterations: number, keylen: number, digest?: utils.HashAlgorithm): Buffer;
|
|
95
99
|
pbkdf2DeriveBits(algorithm: utils.SubtleAlgorithm, baseKey: keys.CryptoKey, length: number): Promise<ArrayBuffer>;
|
|
100
|
+
hkdf(digest: string, key: utils.BinaryLike, salt: utils.BinaryLike, info: utils.BinaryLike, keylen: number, callback: hkdf.HkdfCallback): void;
|
|
101
|
+
hkdfSync(digest: string, key: utils.BinaryLike, salt: utils.BinaryLike, info: utils.BinaryLike, keylen: number): Buffer;
|
|
102
|
+
hkdfDeriveBits(algorithm: hkdf.HkdfAlgorithm, baseKey: hkdf.CryptoKeyInternal, length: number): ArrayBuffer;
|
|
96
103
|
createHmac: typeof import("./hmac").createHmac;
|
|
97
104
|
createHash: typeof import("./hash").createHash;
|
|
98
105
|
getHashes: typeof import("./hash").getHashes;
|
|
@@ -159,7 +166,9 @@ export * from './ed';
|
|
|
159
166
|
export * from './keys';
|
|
160
167
|
export * from './hash';
|
|
161
168
|
export * from './hmac';
|
|
169
|
+
export * from './hkdf';
|
|
162
170
|
export * from './pbkdf2';
|
|
171
|
+
export * from './scrypt';
|
|
163
172
|
export * from './random';
|
|
164
173
|
export * from './utils';
|
|
165
174
|
export * from './subtle';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAGxD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAGxD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAG3B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAInC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC;;;GAGG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;uBANR,cAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAkCe,yCACL,EAAC,YACf;qBAeX,0BAAoB,EACtB,2BAAqB;qBAY+K,oCAAiC,EAAC,2BAAwB;;;;;;;;;;;+DAAtN,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA5CxC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,YAMnB,CAAC;AAYF,eAAe,WAAW,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
|
+
import type { BinaryLike } from './utils';
|
|
3
|
+
type Password = BinaryLike;
|
|
4
|
+
type Salt = BinaryLike;
|
|
5
|
+
export interface ScryptOptions {
|
|
6
|
+
N?: number;
|
|
7
|
+
r?: number;
|
|
8
|
+
p?: number;
|
|
9
|
+
cost?: number;
|
|
10
|
+
blockSize?: number;
|
|
11
|
+
parallelization?: number;
|
|
12
|
+
maxmem?: number;
|
|
13
|
+
}
|
|
14
|
+
type ScryptCallback = (err: Error | null, derivedKey?: Buffer) => void;
|
|
15
|
+
export declare function scrypt(password: Password, salt: Salt, keylen: number, options?: ScryptOptions | ScryptCallback, callback?: ScryptCallback): void;
|
|
16
|
+
export declare function scryptSync(password: Password, salt: Salt, keylen: number, options?: ScryptOptions): Buffer;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=scrypt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrypt.d.ts","sourceRoot":"","sources":["../../src/scrypt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAIxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,QAAQ,GAAG,UAAU,CAAC;AAC3B,KAAK,IAAI,GAAG,UAAU,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,cAAc,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AA2CvE,wBAAgB,MAAM,CACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc,EACxC,QAAQ,CAAC,EAAE,cAAc,GACxB,IAAI,CAqCN;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAqBR"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
export interface Hkdf extends HybridObject<{
|
|
3
|
+
ios: 'c++';
|
|
4
|
+
android: 'c++';
|
|
5
|
+
}> {
|
|
6
|
+
deriveKeySync(algorithm: string, key: ArrayBuffer, salt: ArrayBuffer, info: ArrayBuffer, length: number): ArrayBuffer;
|
|
7
|
+
deriveKey(algorithm: string, key: ArrayBuffer, salt: ArrayBuffer, info: ArrayBuffer, length: number): Promise<ArrayBuffer>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=hkdf.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hkdf.nitro.d.ts","sourceRoot":"","sources":["../../../src/specs/hkdf.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,IAAK,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;IACxE,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,GACb,WAAW,CAAC;IAEf,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
export interface Scrypt extends HybridObject<{
|
|
3
|
+
ios: 'c++';
|
|
4
|
+
android: 'c++';
|
|
5
|
+
}> {
|
|
6
|
+
deriveKey(password: ArrayBuffer, salt: ArrayBuffer, N: number, r: number, p: number, maxmem: number, keylen: number): Promise<ArrayBuffer>;
|
|
7
|
+
deriveKeySync(password: ArrayBuffer, salt: ArrayBuffer, N: number, r: number, p: number, maxmem: number, keylen: number): ArrayBuffer;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=scrypt.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrypt.nitro.d.ts","sourceRoot":"","sources":["../../../src/specs/scrypt.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,MAAO,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;IAC1E,SAAS,CACP,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,aAAa,CACX,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,WAAW,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subtle.d.ts","sourceRoot":"","sources":["../../src/subtle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,UAAU,EACV,GAAG,EACH,YAAY,EACZ,YAAY,EAEZ,oBAAoB,EAOrB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,SAAS,EAKV,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"subtle.d.ts","sourceRoot":"","sources":["../../src/subtle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,UAAU,EACV,GAAG,EACH,YAAY,EACZ,YAAY,EAEZ,oBAAoB,EAOrB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,SAAS,EAKV,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAiuCnD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,GAAG,aAAa,GAChC,MAAM,IAAI,aAAa,CAEzB;AAyOD,qBAAa,MAAM;IACX,OAAO,CACX,SAAS,EAAE,oBAAoB,EAC/B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,CAAC;IAWjB,MAAM,CACV,SAAS,EAAE,eAAe,GAAG,YAAY,EACzC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,CAAC;IAQjB,UAAU,CACd,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC;IA6BjB,SAAS,CACb,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,SAAS,EAClB,mBAAmB,EAAE,eAAe,EACpC,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,CAAC;IAoDf,OAAO,CACX,SAAS,EAAE,oBAAoB,EAC/B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,CAAC;IAWjB,SAAS,CACb,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;IAevB,OAAO,CACX,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,SAAS,EACtB,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,WAAW,CAAC;IA6CjB,SAAS,CACb,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,SAAS,EACxB,eAAe,EAAE,oBAAoB,EACrC,qBAAqB,EAAE,eAAe,GAAG,YAAY,EACrD,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,CAAC;IAmDf,WAAW,CACf,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC;IAoG/B,SAAS,CACb,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,GAAG,EACnC,SAAS,EAAE,eAAe,GAAG,YAAY,EACzC,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,CAAC;IAsHf,IAAI,CACR,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,WAAW,CAAC;IAwCjB,MAAM,CACV,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,CAAC;CAsDpB;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -33,6 +33,7 @@ target_sources(
|
|
|
33
33
|
../nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp
|
|
34
34
|
../nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp
|
|
35
35
|
../nitrogen/generated/shared/c++/HybridHashSpec.cpp
|
|
36
|
+
../nitrogen/generated/shared/c++/HybridHkdfSpec.cpp
|
|
36
37
|
../nitrogen/generated/shared/c++/HybridHmacSpec.cpp
|
|
37
38
|
../nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp
|
|
38
39
|
../nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp
|
|
@@ -40,6 +41,7 @@ target_sources(
|
|
|
40
41
|
../nitrogen/generated/shared/c++/HybridRandomSpec.cpp
|
|
41
42
|
../nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp
|
|
42
43
|
../nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp
|
|
44
|
+
../nitrogen/generated/shared/c++/HybridScryptSpec.cpp
|
|
43
45
|
../nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp
|
|
44
46
|
../nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp
|
|
45
47
|
# Android-specific Nitrogen C++ sources
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
#include "HybridEdKeyPair.hpp"
|
|
23
23
|
#include "HybridHash.hpp"
|
|
24
24
|
#include "HybridHmac.hpp"
|
|
25
|
+
#include "HybridHkdf.hpp"
|
|
25
26
|
#include "HybridKeyObjectHandle.hpp"
|
|
26
27
|
#include "HybridPbkdf2.hpp"
|
|
27
28
|
#include "HybridRandom.hpp"
|
|
@@ -30,6 +31,7 @@
|
|
|
30
31
|
#include "HybridSignHandle.hpp"
|
|
31
32
|
#include "HybridVerifyHandle.hpp"
|
|
32
33
|
#include "HybridMlDsaKeyPair.hpp"
|
|
34
|
+
#include "HybridScrypt.hpp"
|
|
33
35
|
|
|
34
36
|
namespace margelo::nitro::crypto {
|
|
35
37
|
|
|
@@ -106,6 +108,15 @@ int initialize(JavaVM* vm) {
|
|
|
106
108
|
return std::make_shared<HybridHmac>();
|
|
107
109
|
}
|
|
108
110
|
);
|
|
111
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
112
|
+
"Hkdf",
|
|
113
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
114
|
+
static_assert(std::is_default_constructible_v<HybridHkdf>,
|
|
115
|
+
"The HybridObject \"HybridHkdf\" is not default-constructible! "
|
|
116
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
117
|
+
return std::make_shared<HybridHkdf>();
|
|
118
|
+
}
|
|
119
|
+
);
|
|
109
120
|
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
110
121
|
"KeyObjectHandle",
|
|
111
122
|
[]() -> std::shared_ptr<HybridObject> {
|
|
@@ -178,6 +189,15 @@ int initialize(JavaVM* vm) {
|
|
|
178
189
|
return std::make_shared<HybridMlDsaKeyPair>();
|
|
179
190
|
}
|
|
180
191
|
);
|
|
192
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
193
|
+
"Scrypt",
|
|
194
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
195
|
+
static_assert(std::is_default_constructible_v<HybridScrypt>,
|
|
196
|
+
"The HybridObject \"HybridScrypt\" is not default-constructible! "
|
|
197
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
198
|
+
return std::make_shared<HybridScrypt>();
|
|
199
|
+
}
|
|
200
|
+
);
|
|
181
201
|
});
|
|
182
202
|
}
|
|
183
203
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#include "HybridEdKeyPair.hpp"
|
|
18
18
|
#include "HybridHash.hpp"
|
|
19
19
|
#include "HybridHmac.hpp"
|
|
20
|
+
#include "HybridHkdf.hpp"
|
|
20
21
|
#include "HybridKeyObjectHandle.hpp"
|
|
21
22
|
#include "HybridPbkdf2.hpp"
|
|
22
23
|
#include "HybridRandom.hpp"
|
|
@@ -25,6 +26,7 @@
|
|
|
25
26
|
#include "HybridSignHandle.hpp"
|
|
26
27
|
#include "HybridVerifyHandle.hpp"
|
|
27
28
|
#include "HybridMlDsaKeyPair.hpp"
|
|
29
|
+
#include "HybridScrypt.hpp"
|
|
28
30
|
|
|
29
31
|
@interface QuickCryptoAutolinking : NSObject
|
|
30
32
|
@end
|
|
@@ -98,6 +100,15 @@
|
|
|
98
100
|
return std::make_shared<HybridHmac>();
|
|
99
101
|
}
|
|
100
102
|
);
|
|
103
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
104
|
+
"Hkdf",
|
|
105
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
106
|
+
static_assert(std::is_default_constructible_v<HybridHkdf>,
|
|
107
|
+
"The HybridObject \"HybridHkdf\" is not default-constructible! "
|
|
108
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
109
|
+
return std::make_shared<HybridHkdf>();
|
|
110
|
+
}
|
|
111
|
+
);
|
|
101
112
|
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
102
113
|
"KeyObjectHandle",
|
|
103
114
|
[]() -> std::shared_ptr<HybridObject> {
|
|
@@ -170,6 +181,15 @@
|
|
|
170
181
|
return std::make_shared<HybridMlDsaKeyPair>();
|
|
171
182
|
}
|
|
172
183
|
);
|
|
184
|
+
HybridObjectRegistry::registerHybridObjectConstructor(
|
|
185
|
+
"Scrypt",
|
|
186
|
+
[]() -> std::shared_ptr<HybridObject> {
|
|
187
|
+
static_assert(std::is_default_constructible_v<HybridScrypt>,
|
|
188
|
+
"The HybridObject \"HybridScrypt\" is not default-constructible! "
|
|
189
|
+
"Create a public constructor that takes zero arguments to be able to autolink this HybridObject.");
|
|
190
|
+
return std::make_shared<HybridScrypt>();
|
|
191
|
+
}
|
|
192
|
+
);
|
|
173
193
|
}
|
|
174
194
|
|
|
175
195
|
@end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridHkdfSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2025 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "HybridHkdfSpec.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
void HybridHkdfSpec::loadHybridMethods() {
|
|
13
|
+
// load base methods/properties
|
|
14
|
+
HybridObject::loadHybridMethods();
|
|
15
|
+
// load custom methods/properties
|
|
16
|
+
registerHybrids(this, [](Prototype& prototype) {
|
|
17
|
+
prototype.registerHybridMethod("deriveKeySync", &HybridHkdfSpec::deriveKeySync);
|
|
18
|
+
prototype.registerHybridMethod("deriveKey", &HybridHkdfSpec::deriveKey);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridHkdfSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2025 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/HybridObject.hpp>)
|
|
11
|
+
#include <NitroModules/HybridObject.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
// Forward declaration of `ArrayBuffer` to properly resolve imports.
|
|
17
|
+
namespace NitroModules { class ArrayBuffer; }
|
|
18
|
+
|
|
19
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
20
|
+
#include <string>
|
|
21
|
+
#include <NitroModules/Promise.hpp>
|
|
22
|
+
|
|
23
|
+
namespace margelo::nitro::crypto {
|
|
24
|
+
|
|
25
|
+
using namespace margelo::nitro;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* An abstract base class for `Hkdf`
|
|
29
|
+
* Inherit this class to create instances of `HybridHkdfSpec` in C++.
|
|
30
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
31
|
+
* @example
|
|
32
|
+
* ```cpp
|
|
33
|
+
* class HybridHkdf: public HybridHkdfSpec {
|
|
34
|
+
* public:
|
|
35
|
+
* HybridHkdf(...): HybridObject(TAG) { ... }
|
|
36
|
+
* // ...
|
|
37
|
+
* };
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
class HybridHkdfSpec: public virtual HybridObject {
|
|
41
|
+
public:
|
|
42
|
+
// Constructor
|
|
43
|
+
explicit HybridHkdfSpec(): HybridObject(TAG) { }
|
|
44
|
+
|
|
45
|
+
// Destructor
|
|
46
|
+
~HybridHkdfSpec() override = default;
|
|
47
|
+
|
|
48
|
+
public:
|
|
49
|
+
// Properties
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
public:
|
|
53
|
+
// Methods
|
|
54
|
+
virtual std::shared_ptr<ArrayBuffer> deriveKeySync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info, double length) = 0;
|
|
55
|
+
virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> deriveKey(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info, double length) = 0;
|
|
56
|
+
|
|
57
|
+
protected:
|
|
58
|
+
// Hybrid Setup
|
|
59
|
+
void loadHybridMethods() override;
|
|
60
|
+
|
|
61
|
+
protected:
|
|
62
|
+
// Tag for logging
|
|
63
|
+
static constexpr auto TAG = "Hkdf";
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridScryptSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2025 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "HybridScryptSpec.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
void HybridScryptSpec::loadHybridMethods() {
|
|
13
|
+
// load base methods/properties
|
|
14
|
+
HybridObject::loadHybridMethods();
|
|
15
|
+
// load custom methods/properties
|
|
16
|
+
registerHybrids(this, [](Prototype& prototype) {
|
|
17
|
+
prototype.registerHybridMethod("deriveKey", &HybridScryptSpec::deriveKey);
|
|
18
|
+
prototype.registerHybridMethod("deriveKeySync", &HybridScryptSpec::deriveKeySync);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridScryptSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © 2025 Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#if __has_include(<NitroModules/HybridObject.hpp>)
|
|
11
|
+
#include <NitroModules/HybridObject.hpp>
|
|
12
|
+
#else
|
|
13
|
+
#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
// Forward declaration of `ArrayBuffer` to properly resolve imports.
|
|
17
|
+
namespace NitroModules { class ArrayBuffer; }
|
|
18
|
+
|
|
19
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
20
|
+
#include <NitroModules/Promise.hpp>
|
|
21
|
+
|
|
22
|
+
namespace margelo::nitro::crypto {
|
|
23
|
+
|
|
24
|
+
using namespace margelo::nitro;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* An abstract base class for `Scrypt`
|
|
28
|
+
* Inherit this class to create instances of `HybridScryptSpec` in C++.
|
|
29
|
+
* You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
|
|
30
|
+
* @example
|
|
31
|
+
* ```cpp
|
|
32
|
+
* class HybridScrypt: public HybridScryptSpec {
|
|
33
|
+
* public:
|
|
34
|
+
* HybridScrypt(...): HybridObject(TAG) { ... }
|
|
35
|
+
* // ...
|
|
36
|
+
* };
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
class HybridScryptSpec: public virtual HybridObject {
|
|
40
|
+
public:
|
|
41
|
+
// Constructor
|
|
42
|
+
explicit HybridScryptSpec(): HybridObject(TAG) { }
|
|
43
|
+
|
|
44
|
+
// Destructor
|
|
45
|
+
~HybridScryptSpec() override = default;
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
// Properties
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
// Methods
|
|
53
|
+
virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> deriveKey(const std::shared_ptr<ArrayBuffer>& password, const std::shared_ptr<ArrayBuffer>& salt, double N, double r, double p, double maxmem, double keylen) = 0;
|
|
54
|
+
virtual std::shared_ptr<ArrayBuffer> deriveKeySync(const std::shared_ptr<ArrayBuffer>& password, const std::shared_ptr<ArrayBuffer>& salt, double N, double r, double p, double maxmem, double keylen) = 0;
|
|
55
|
+
|
|
56
|
+
protected:
|
|
57
|
+
// Hybrid Setup
|
|
58
|
+
void loadHybridMethods() override;
|
|
59
|
+
|
|
60
|
+
protected:
|
|
61
|
+
// Tag for logging
|
|
62
|
+
static constexpr auto TAG = "Scrypt";
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
} // namespace margelo::nitro::crypto
|
package/package.json
CHANGED
package/src/hkdf.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Buffer } from '@craftzdog/react-native-buffer';
|
|
2
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
3
|
+
import type { Hkdf as HkdfNative } from './specs/hkdf.nitro';
|
|
4
|
+
import { binaryLikeToArrayBuffer, normalizeHashName } from './utils';
|
|
5
|
+
import type { BinaryLike } from './utils';
|
|
6
|
+
|
|
7
|
+
type KeyMaterial = BinaryLike;
|
|
8
|
+
type Salt = BinaryLike;
|
|
9
|
+
type Info = BinaryLike;
|
|
10
|
+
|
|
11
|
+
export interface HkdfAlgorithm {
|
|
12
|
+
name: string;
|
|
13
|
+
hash: string | { name: string };
|
|
14
|
+
salt: BinaryLike;
|
|
15
|
+
info: BinaryLike;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface CryptoKeyInternal {
|
|
19
|
+
keyObject: {
|
|
20
|
+
export: () => Buffer;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface HkdfCallback {
|
|
25
|
+
(err: Error | null, derivedKey?: Buffer): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Lazy load native module
|
|
29
|
+
let native: HkdfNative;
|
|
30
|
+
function getNative(): HkdfNative {
|
|
31
|
+
if (native == null) {
|
|
32
|
+
native = NitroModules.createHybridObject<HkdfNative>('Hkdf');
|
|
33
|
+
}
|
|
34
|
+
return native;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function validateCallback(callback: HkdfCallback) {
|
|
38
|
+
if (callback === undefined || typeof callback !== 'function') {
|
|
39
|
+
throw new Error('No callback provided to hkdf');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function sanitizeInput(input: BinaryLike, name: string): ArrayBuffer {
|
|
44
|
+
try {
|
|
45
|
+
return binaryLikeToArrayBuffer(input);
|
|
46
|
+
} catch {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`${name} must be a string, a Buffer, a typed array, or a DataView`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function hkdf(
|
|
54
|
+
digest: string,
|
|
55
|
+
key: KeyMaterial,
|
|
56
|
+
salt: Salt,
|
|
57
|
+
info: Info,
|
|
58
|
+
keylen: number,
|
|
59
|
+
callback: HkdfCallback,
|
|
60
|
+
): void {
|
|
61
|
+
validateCallback(callback);
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const normalizedDigest = normalizeHashName(digest);
|
|
65
|
+
const sanitizedKey = sanitizeInput(key, 'Key');
|
|
66
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
67
|
+
const sanitizedInfo = sanitizeInput(info, 'Info');
|
|
68
|
+
|
|
69
|
+
if (keylen < 0) {
|
|
70
|
+
throw new TypeError('Bad key length');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const nativeMod = getNative();
|
|
74
|
+
nativeMod
|
|
75
|
+
.deriveKey(
|
|
76
|
+
normalizedDigest,
|
|
77
|
+
sanitizedKey,
|
|
78
|
+
sanitizedSalt,
|
|
79
|
+
sanitizedInfo,
|
|
80
|
+
keylen,
|
|
81
|
+
)
|
|
82
|
+
.then(
|
|
83
|
+
res => {
|
|
84
|
+
callback(null, Buffer.from(res));
|
|
85
|
+
},
|
|
86
|
+
err => {
|
|
87
|
+
callback(err);
|
|
88
|
+
},
|
|
89
|
+
);
|
|
90
|
+
} catch (err) {
|
|
91
|
+
callback(err as Error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function hkdfSync(
|
|
96
|
+
digest: string,
|
|
97
|
+
key: KeyMaterial,
|
|
98
|
+
salt: Salt,
|
|
99
|
+
info: Info,
|
|
100
|
+
keylen: number,
|
|
101
|
+
): Buffer {
|
|
102
|
+
const normalizedDigest = normalizeHashName(digest);
|
|
103
|
+
const sanitizedKey = sanitizeInput(key, 'Key');
|
|
104
|
+
const sanitizedSalt = sanitizeInput(salt, 'Salt');
|
|
105
|
+
const sanitizedInfo = sanitizeInput(info, 'Info');
|
|
106
|
+
|
|
107
|
+
if (keylen < 0) {
|
|
108
|
+
throw new TypeError('Bad key length');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const nativeMod = getNative();
|
|
112
|
+
const result = nativeMod.deriveKeySync(
|
|
113
|
+
normalizedDigest,
|
|
114
|
+
sanitizedKey,
|
|
115
|
+
sanitizedSalt,
|
|
116
|
+
sanitizedInfo,
|
|
117
|
+
keylen,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
return Buffer.from(result);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function hkdfDeriveBits(
|
|
124
|
+
algorithm: HkdfAlgorithm,
|
|
125
|
+
baseKey: CryptoKeyInternal,
|
|
126
|
+
length: number,
|
|
127
|
+
): ArrayBuffer {
|
|
128
|
+
const hash = algorithm.hash;
|
|
129
|
+
const salt = algorithm.salt;
|
|
130
|
+
const info = algorithm.info;
|
|
131
|
+
|
|
132
|
+
// Check if key is extractable or we can access its handle/buffer
|
|
133
|
+
// For raw keys, we can export.
|
|
134
|
+
const keyBuffer = baseKey.keyObject.export();
|
|
135
|
+
|
|
136
|
+
// length is in bits, native expects bytes
|
|
137
|
+
const keylen = Math.ceil(length / 8);
|
|
138
|
+
|
|
139
|
+
const hashName = typeof hash === 'string' ? hash : hash.name;
|
|
140
|
+
const normalizedDigest = normalizeHashName(hashName);
|
|
141
|
+
|
|
142
|
+
const nativeMod = getNative();
|
|
143
|
+
const result = nativeMod.deriveKeySync(
|
|
144
|
+
normalizedDigest,
|
|
145
|
+
binaryLikeToArrayBuffer(keyBuffer),
|
|
146
|
+
binaryLikeToArrayBuffer(salt),
|
|
147
|
+
binaryLikeToArrayBuffer(info),
|
|
148
|
+
keylen,
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
return result;
|
|
152
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -8,7 +8,9 @@ import * as cipher from './cipher';
|
|
|
8
8
|
import * as ed from './ed';
|
|
9
9
|
import { hashExports as hash } from './hash';
|
|
10
10
|
import { hmacExports as hmac } from './hmac';
|
|
11
|
+
import * as hkdf from './hkdf';
|
|
11
12
|
import * as pbkdf2 from './pbkdf2';
|
|
13
|
+
import * as scrypt from './scrypt';
|
|
12
14
|
import * as random from './random';
|
|
13
15
|
import { constants } from './constants';
|
|
14
16
|
|
|
@@ -27,7 +29,9 @@ const QuickCrypto = {
|
|
|
27
29
|
...ed,
|
|
28
30
|
...hash,
|
|
29
31
|
...hmac,
|
|
32
|
+
...hkdf,
|
|
30
33
|
...pbkdf2,
|
|
34
|
+
...scrypt,
|
|
31
35
|
...random,
|
|
32
36
|
...utils,
|
|
33
37
|
...subtle,
|
|
@@ -47,7 +51,13 @@ export const install = () => {
|
|
|
47
51
|
};
|
|
48
52
|
|
|
49
53
|
// random, cipher, hash use nextTick
|
|
50
|
-
global.process
|
|
54
|
+
if (global.process == null) {
|
|
55
|
+
// @ts-expect-error - process is not defined
|
|
56
|
+
global.process = {};
|
|
57
|
+
}
|
|
58
|
+
if (global.process.nextTick == null) {
|
|
59
|
+
global.process.nextTick = setImmediate;
|
|
60
|
+
}
|
|
51
61
|
|
|
52
62
|
// exports
|
|
53
63
|
export default QuickCrypto;
|
|
@@ -57,7 +67,9 @@ export * from './ed';
|
|
|
57
67
|
export * from './keys';
|
|
58
68
|
export * from './hash';
|
|
59
69
|
export * from './hmac';
|
|
70
|
+
export * from './hkdf';
|
|
60
71
|
export * from './pbkdf2';
|
|
72
|
+
export * from './scrypt';
|
|
61
73
|
export * from './random';
|
|
62
74
|
export * from './utils';
|
|
63
75
|
export * from './subtle';
|