react-native-quick-crypto 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/QuickCrypto.podspec +1 -0
  2. package/README.md +1 -1
  3. package/android/CMakeLists.txt +4 -0
  4. package/cpp/hkdf/HybridHkdf.cpp +96 -0
  5. package/cpp/hkdf/HybridHkdf.hpp +28 -0
  6. package/cpp/scrypt/HybridScrypt.cpp +62 -0
  7. package/cpp/scrypt/HybridScrypt.hpp +28 -0
  8. package/lib/commonjs/hkdf.js +81 -0
  9. package/lib/commonjs/hkdf.js.map +1 -0
  10. package/lib/commonjs/index.js +33 -1
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/scrypt.js +98 -0
  13. package/lib/commonjs/scrypt.js.map +1 -0
  14. package/lib/commonjs/specs/hkdf.nitro.js +6 -0
  15. package/lib/commonjs/specs/hkdf.nitro.js.map +1 -0
  16. package/lib/commonjs/specs/scrypt.nitro.js +6 -0
  17. package/lib/commonjs/specs/scrypt.nitro.js.map +1 -0
  18. package/lib/commonjs/subtle.js +28 -0
  19. package/lib/commonjs/subtle.js.map +1 -1
  20. package/lib/module/hkdf.js +75 -0
  21. package/lib/module/hkdf.js.map +1 -0
  22. package/lib/module/index.js +13 -1
  23. package/lib/module/index.js.map +1 -1
  24. package/lib/module/scrypt.js +93 -0
  25. package/lib/module/scrypt.js.map +1 -0
  26. package/lib/module/specs/hkdf.nitro.js +4 -0
  27. package/lib/module/specs/hkdf.nitro.js.map +1 -0
  28. package/lib/module/specs/scrypt.nitro.js +4 -0
  29. package/lib/module/specs/scrypt.nitro.js.map +1 -0
  30. package/lib/module/subtle.js +28 -0
  31. package/lib/module/subtle.js.map +1 -1
  32. package/lib/tsconfig.tsbuildinfo +1 -1
  33. package/lib/typescript/hkdf.d.ts +26 -0
  34. package/lib/typescript/hkdf.d.ts.map +1 -0
  35. package/lib/typescript/index.d.ts +9 -0
  36. package/lib/typescript/index.d.ts.map +1 -1
  37. package/lib/typescript/scrypt.d.ts +18 -0
  38. package/lib/typescript/scrypt.d.ts.map +1 -0
  39. package/lib/typescript/specs/hkdf.nitro.d.ts +9 -0
  40. package/lib/typescript/specs/hkdf.nitro.d.ts.map +1 -0
  41. package/lib/typescript/specs/scrypt.nitro.d.ts +9 -0
  42. package/lib/typescript/specs/scrypt.nitro.d.ts.map +1 -0
  43. package/lib/typescript/subtle.d.ts.map +1 -1
  44. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +2 -0
  45. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +20 -0
  46. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +20 -0
  47. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +22 -0
  48. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +66 -0
  49. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +22 -0
  50. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +65 -0
  51. package/package.json +1 -1
  52. package/react-native.config.js +19 -0
  53. package/src/hkdf.ts +152 -0
  54. package/src/index.ts +13 -1
  55. package/src/scrypt.ts +134 -0
  56. package/src/specs/hkdf.nitro.ts +19 -0
  57. package/src/specs/scrypt.nitro.ts +23 -0
  58. 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;AAI3B,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;;;;;;;;;;;;;;;;;;;;;;;;;;uBAHmB,cAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAkCrC,yCACM,EAAC,YACX;qBAWuC,0BAC7B,EAAE,2BACT;qBAE6d,oCAAiC,EAAC,2BAAwB;;;;;;;;;;;+DAAtN,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CApCvU,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,YAMnB,CAAC;AAMF,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,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"}
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;AA0sCnD,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;IAuBjB,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;IA6Cf,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;IA6Gf,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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-quick-crypto",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "A fast implementation of Node's `crypto` module written in C/C++ JSI",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -0,0 +1,19 @@
1
+ module.exports = {
2
+ dependency: {
3
+ platforms: {
4
+ ios: {
5
+ scriptPhases: [
6
+ {
7
+ name: '[CP-User] Embed OpenSSL Framework',
8
+ path: './scripts/embed_openssl_framework.sh',
9
+ execution_position: 'after_compile',
10
+ input_files: ['${BUILT_PRODUCTS_DIR}/OpenSSL.framework'],
11
+ output_files: [
12
+ '${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OpenSSL.framework',
13
+ ],
14
+ },
15
+ ],
16
+ },
17
+ },
18
+ },
19
+ };
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.nextTick = setImmediate;
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';