react-native-quick-crypto 1.1.5 → 1.1.6

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.
@@ -12,23 +12,22 @@
12
12
 
13
13
  namespace margelo::nitro::crypto {
14
14
 
15
- std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> HybridHkdf::deriveKey(const std::string& algorithm,
16
- const std::shared_ptr<ArrayBuffer>& key,
17
- const std::shared_ptr<ArrayBuffer>& salt,
18
- const std::shared_ptr<ArrayBuffer>& info, double length) {
15
+ std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
16
+ HybridHkdf::deriveKey(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& salt,
17
+ const std::shared_ptr<ArrayBuffer>& info, double length, HkdfMode mode) {
19
18
  // get owned NativeArrayBuffers before passing to sync function
20
19
  auto nativeKey = ToNativeArrayBuffer(key);
21
20
  auto nativeSalt = ToNativeArrayBuffer(salt);
22
21
  auto nativeInfo = ToNativeArrayBuffer(info);
23
22
 
24
- return Promise<std::shared_ptr<ArrayBuffer>>::async([this, algorithm, nativeKey, nativeSalt, nativeInfo, length]() {
25
- return this->deriveKeySync(algorithm, nativeKey, nativeSalt, nativeInfo, length);
23
+ return Promise<std::shared_ptr<ArrayBuffer>>::async([this, algorithm, nativeKey, nativeSalt, nativeInfo, length, mode]() {
24
+ return this->deriveKeySync(algorithm, nativeKey, nativeSalt, nativeInfo, length, mode);
26
25
  });
27
26
  }
28
27
 
29
28
  std::shared_ptr<ArrayBuffer> HybridHkdf::deriveKeySync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& baseKey,
30
29
  const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info,
31
- double length) {
30
+ double length, HkdfMode mode) {
32
31
  EVP_KDF* kdf = EVP_KDF_fetch(nullptr, "HKDF", nullptr);
33
32
  if (kdf == nullptr) {
34
33
  throw std::runtime_error("Failed to fetch HKDF implementation: " + std::to_string(ERR_get_error()));
@@ -41,9 +40,27 @@ std::shared_ptr<ArrayBuffer> HybridHkdf::deriveKeySync(const std::string& algori
41
40
  }
42
41
 
43
42
  // Set up parameters
44
- OSSL_PARAM params[5];
43
+ OSSL_PARAM params[6];
45
44
  size_t paramIndex = 0;
46
45
 
46
+ // HKDF mode (RFC 5869): full extract+expand, extract-only (PRK), or expand-only.
47
+ int hkdfMode;
48
+ switch (mode) {
49
+ case HkdfMode::EXTRACT:
50
+ hkdfMode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY;
51
+ break;
52
+ case HkdfMode::EXPAND:
53
+ hkdfMode = EVP_KDF_HKDF_MODE_EXPAND_ONLY;
54
+ break;
55
+ case HkdfMode::FULL:
56
+ hkdfMode = EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND;
57
+ break;
58
+ default:
59
+ EVP_KDF_CTX_free(ctx);
60
+ throw std::runtime_error("Unknown HKDF mode");
61
+ }
62
+ params[paramIndex++] = OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &hkdfMode);
63
+
47
64
  params[paramIndex++] = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, const_cast<char*>(algorithm.c_str()), 0);
48
65
 
49
66
  // Key (Input Keying Material)
@@ -19,10 +19,11 @@ class HybridHkdf : public HybridHkdfSpec {
19
19
  // Methods
20
20
  std::shared_ptr<ArrayBuffer> deriveKeySync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key,
21
21
  const std::shared_ptr<ArrayBuffer>& salt, const std::shared_ptr<ArrayBuffer>& info,
22
- double length) override;
22
+ double length, HkdfMode mode) override;
23
23
  std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> deriveKey(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& key,
24
24
  const std::shared_ptr<ArrayBuffer>& salt,
25
- const std::shared_ptr<ArrayBuffer>& info, double length) override;
25
+ const std::shared_ptr<ArrayBuffer>& info, double length,
26
+ HkdfMode mode) override;
26
27
  };
27
28
 
28
29
  } // namespace margelo::nitro::crypto
@@ -5,6 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.hkdf = hkdf;
7
7
  exports.hkdfDeriveBits = hkdfDeriveBits;
8
+ exports.hkdfExpand = hkdfExpand;
9
+ exports.hkdfExpandSync = hkdfExpandSync;
10
+ exports.hkdfExtract = hkdfExtract;
11
+ exports.hkdfExtractSync = hkdfExtractSync;
8
12
  exports.hkdfSync = hkdfSync;
9
13
  var _reactNativeBuffer = require("@craftzdog/react-native-buffer");
10
14
  var _reactNativeNitroModules = require("react-native-nitro-modules");
@@ -46,6 +50,13 @@ const HKDF_HASH_BYTES = {
46
50
  'sha3-512': 64,
47
51
  ripemd160: 20
48
52
  };
53
+ function hkdfHashLen(digest) {
54
+ const hashLen = HKDF_HASH_BYTES[digest.toLowerCase()];
55
+ if (hashLen === undefined) {
56
+ throw new TypeError(`Unsupported HKDF digest: ${digest}`);
57
+ }
58
+ return hashLen;
59
+ }
49
60
  function validateHkdfKeylen(digest, keylen) {
50
61
  if (typeof keylen !== 'number' || !Number.isFinite(keylen) || !Number.isInteger(keylen) || keylen < 0 || keylen > 0x7fff_ffff) {
51
62
  throw new TypeError('Bad key length');
@@ -68,7 +79,7 @@ function hkdf(digest, key, salt, info, keylen, callback) {
68
79
  const sanitizedInfo = sanitizeInput(info, 'Info');
69
80
  validateHkdfKeylen(normalizedDigest, keylen);
70
81
  const nativeMod = getNative();
71
- nativeMod.deriveKey(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen).then(res => {
82
+ nativeMod.deriveKey(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen, 'full').then(res => {
72
83
  callback(null, _reactNativeBuffer.Buffer.from(res));
73
84
  }, err => {
74
85
  callback(err);
@@ -84,9 +95,68 @@ function hkdfSync(digest, key, salt, info, keylen) {
84
95
  const sanitizedInfo = sanitizeInput(info, 'Info');
85
96
  validateHkdfKeylen(normalizedDigest, keylen);
86
97
  const nativeMod = getNative();
87
- const result = nativeMod.deriveKeySync(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen);
98
+ const result = nativeMod.deriveKeySync(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen, 'full');
99
+ return _reactNativeBuffer.Buffer.from(result);
100
+ }
101
+
102
+ // RFC 5869 §2.2 HKDF-Extract (sync): PRK = HMAC(salt, IKM). Salt defaults to
103
+ // a string of HashLen zeros when omitted. Returns a PRK of HashLen bytes.
104
+ function hkdfExtractSync(digest, ikm, salt = new Uint8Array(0)) {
105
+ const normalizedDigest = (0, _utils.normalizeHashName)(digest);
106
+ const hashLen = hkdfHashLen(normalizedDigest);
107
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
108
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
109
+ const result = getNative().deriveKeySync(normalizedDigest, sanitizedIkm, sanitizedSalt, new ArrayBuffer(0), hashLen, 'extract');
110
+ return _reactNativeBuffer.Buffer.from(result);
111
+ }
112
+
113
+ // Async HKDF-Extract, mirroring `hkdf`. Unlike the sync form, `salt` is
114
+ // required here because the callback occupies the trailing argument.
115
+ function hkdfExtract(digest, ikm, salt, callback) {
116
+ validateCallback(callback);
117
+ try {
118
+ const normalizedDigest = (0, _utils.normalizeHashName)(digest);
119
+ const hashLen = hkdfHashLen(normalizedDigest);
120
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
121
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
122
+ getNative().deriveKey(normalizedDigest, sanitizedIkm, sanitizedSalt, new ArrayBuffer(0), hashLen, 'extract').then(res => callback(null, _reactNativeBuffer.Buffer.from(res)), err => callback(err));
123
+ } catch (err) {
124
+ callback(err);
125
+ }
126
+ }
127
+
128
+ // RFC 5869 §2.3 HKDF-Expand (sync): OKM = expand(PRK, info, L). `prk` must be
129
+ // at least HashLen bytes (a pseudorandom key, e.g. from hkdfExtract).
130
+ function hkdfExpandSync(digest, prk, info, keylen) {
131
+ const normalizedDigest = (0, _utils.normalizeHashName)(digest);
132
+ const hashLen = hkdfHashLen(normalizedDigest);
133
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
134
+ if (sanitizedPrk.byteLength < hashLen) {
135
+ throw new RangeError(`HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`);
136
+ }
137
+ const sanitizedInfo = sanitizeInput(info, 'Info');
138
+ validateHkdfKeylen(normalizedDigest, keylen);
139
+ const result = getNative().deriveKeySync(normalizedDigest, sanitizedPrk, new ArrayBuffer(0), sanitizedInfo, keylen, 'expand');
88
140
  return _reactNativeBuffer.Buffer.from(result);
89
141
  }
142
+
143
+ // Async HKDF-Expand, mirroring `hkdf`.
144
+ function hkdfExpand(digest, prk, info, keylen, callback) {
145
+ validateCallback(callback);
146
+ try {
147
+ const normalizedDigest = (0, _utils.normalizeHashName)(digest);
148
+ const hashLen = hkdfHashLen(normalizedDigest);
149
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
150
+ if (sanitizedPrk.byteLength < hashLen) {
151
+ throw new RangeError(`HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`);
152
+ }
153
+ const sanitizedInfo = sanitizeInput(info, 'Info');
154
+ validateHkdfKeylen(normalizedDigest, keylen);
155
+ getNative().deriveKey(normalizedDigest, sanitizedPrk, new ArrayBuffer(0), sanitizedInfo, keylen, 'expand').then(res => callback(null, _reactNativeBuffer.Buffer.from(res)), err => callback(err));
156
+ } catch (err) {
157
+ callback(err);
158
+ }
159
+ }
90
160
  function hkdfDeriveBits(algorithm, baseKey, length) {
91
161
  const hash = algorithm.hash;
92
162
  const salt = algorithm.salt;
@@ -102,7 +172,7 @@ function hkdfDeriveBits(algorithm, baseKey, length) {
102
172
  const normalizedDigest = (0, _utils.normalizeHashName)(hashName);
103
173
  validateHkdfKeylen(normalizedDigest, keylen);
104
174
  const nativeMod = getNative();
105
- const result = nativeMod.deriveKeySync(normalizedDigest, (0, _utils.binaryLikeToArrayBuffer)(keyBuffer), (0, _utils.binaryLikeToArrayBuffer)(salt), (0, _utils.binaryLikeToArrayBuffer)(info), keylen);
175
+ const result = nativeMod.deriveKeySync(normalizedDigest, (0, _utils.binaryLikeToArrayBuffer)(keyBuffer), (0, _utils.binaryLikeToArrayBuffer)(salt), (0, _utils.binaryLikeToArrayBuffer)(info), keylen, 'full');
106
176
  return result;
107
177
  }
108
178
  //# sourceMappingURL=hkdf.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNativeBuffer","require","_reactNativeNitroModules","_utils","native","getNative","NitroModules","createHybridObject","validateCallback","callback","undefined","Error","sanitizeInput","input","name","binaryLikeToArrayBuffer","HKDF_HASH_BYTES","sha1","sha224","sha256","sha384","sha512","ripemd160","validateHkdfKeylen","digest","keylen","Number","isFinite","isInteger","TypeError","hashLen","toLowerCase","RangeError","hkdf","key","salt","info","normalizedDigest","normalizeHashName","sanitizedKey","sanitizedSalt","sanitizedInfo","nativeMod","deriveKey","then","res","Buffer","from","err","hkdfSync","result","deriveKeySync","hkdfDeriveBits","algorithm","baseKey","length","hash","keyBuffer","keyObject","export","Math","ceil","hashName"],"sourceRoot":"../../src","sources":["hkdf.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNativeBuffer","require","_reactNativeNitroModules","_utils","native","getNative","NitroModules","createHybridObject","validateCallback","callback","undefined","Error","sanitizeInput","input","name","binaryLikeToArrayBuffer","HKDF_HASH_BYTES","sha1","sha224","sha256","sha384","sha512","ripemd160","hkdfHashLen","digest","hashLen","toLowerCase","TypeError","validateHkdfKeylen","keylen","Number","isFinite","isInteger","RangeError","hkdf","key","salt","info","normalizedDigest","normalizeHashName","sanitizedKey","sanitizedSalt","sanitizedInfo","nativeMod","deriveKey","then","res","Buffer","from","err","hkdfSync","result","deriveKeySync","hkdfExtractSync","ikm","Uint8Array","sanitizedIkm","ArrayBuffer","hkdfExtract","hkdfExpandSync","prk","sanitizedPrk","byteLength","hkdfExpand","hkdfDeriveBits","algorithm","baseKey","length","hash","keyBuffer","keyObject","export","Math","ceil","hashName"],"sourceRoot":"../../src","sources":["hkdf.ts"],"mappings":"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","ignoreList":[]}
@@ -40,6 +40,13 @@ const HKDF_HASH_BYTES = {
40
40
  'sha3-512': 64,
41
41
  ripemd160: 20
42
42
  };
43
+ function hkdfHashLen(digest) {
44
+ const hashLen = HKDF_HASH_BYTES[digest.toLowerCase()];
45
+ if (hashLen === undefined) {
46
+ throw new TypeError(`Unsupported HKDF digest: ${digest}`);
47
+ }
48
+ return hashLen;
49
+ }
43
50
  function validateHkdfKeylen(digest, keylen) {
44
51
  if (typeof keylen !== 'number' || !Number.isFinite(keylen) || !Number.isInteger(keylen) || keylen < 0 || keylen > 0x7fff_ffff) {
45
52
  throw new TypeError('Bad key length');
@@ -62,7 +69,7 @@ export function hkdf(digest, key, salt, info, keylen, callback) {
62
69
  const sanitizedInfo = sanitizeInput(info, 'Info');
63
70
  validateHkdfKeylen(normalizedDigest, keylen);
64
71
  const nativeMod = getNative();
65
- nativeMod.deriveKey(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen).then(res => {
72
+ nativeMod.deriveKey(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen, 'full').then(res => {
66
73
  callback(null, Buffer.from(res));
67
74
  }, err => {
68
75
  callback(err);
@@ -78,9 +85,68 @@ export function hkdfSync(digest, key, salt, info, keylen) {
78
85
  const sanitizedInfo = sanitizeInput(info, 'Info');
79
86
  validateHkdfKeylen(normalizedDigest, keylen);
80
87
  const nativeMod = getNative();
81
- const result = nativeMod.deriveKeySync(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen);
88
+ const result = nativeMod.deriveKeySync(normalizedDigest, sanitizedKey, sanitizedSalt, sanitizedInfo, keylen, 'full');
89
+ return Buffer.from(result);
90
+ }
91
+
92
+ // RFC 5869 §2.2 HKDF-Extract (sync): PRK = HMAC(salt, IKM). Salt defaults to
93
+ // a string of HashLen zeros when omitted. Returns a PRK of HashLen bytes.
94
+ export function hkdfExtractSync(digest, ikm, salt = new Uint8Array(0)) {
95
+ const normalizedDigest = normalizeHashName(digest);
96
+ const hashLen = hkdfHashLen(normalizedDigest);
97
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
98
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
99
+ const result = getNative().deriveKeySync(normalizedDigest, sanitizedIkm, sanitizedSalt, new ArrayBuffer(0), hashLen, 'extract');
100
+ return Buffer.from(result);
101
+ }
102
+
103
+ // Async HKDF-Extract, mirroring `hkdf`. Unlike the sync form, `salt` is
104
+ // required here because the callback occupies the trailing argument.
105
+ export function hkdfExtract(digest, ikm, salt, callback) {
106
+ validateCallback(callback);
107
+ try {
108
+ const normalizedDigest = normalizeHashName(digest);
109
+ const hashLen = hkdfHashLen(normalizedDigest);
110
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
111
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
112
+ getNative().deriveKey(normalizedDigest, sanitizedIkm, sanitizedSalt, new ArrayBuffer(0), hashLen, 'extract').then(res => callback(null, Buffer.from(res)), err => callback(err));
113
+ } catch (err) {
114
+ callback(err);
115
+ }
116
+ }
117
+
118
+ // RFC 5869 §2.3 HKDF-Expand (sync): OKM = expand(PRK, info, L). `prk` must be
119
+ // at least HashLen bytes (a pseudorandom key, e.g. from hkdfExtract).
120
+ export function hkdfExpandSync(digest, prk, info, keylen) {
121
+ const normalizedDigest = normalizeHashName(digest);
122
+ const hashLen = hkdfHashLen(normalizedDigest);
123
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
124
+ if (sanitizedPrk.byteLength < hashLen) {
125
+ throw new RangeError(`HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`);
126
+ }
127
+ const sanitizedInfo = sanitizeInput(info, 'Info');
128
+ validateHkdfKeylen(normalizedDigest, keylen);
129
+ const result = getNative().deriveKeySync(normalizedDigest, sanitizedPrk, new ArrayBuffer(0), sanitizedInfo, keylen, 'expand');
82
130
  return Buffer.from(result);
83
131
  }
132
+
133
+ // Async HKDF-Expand, mirroring `hkdf`.
134
+ export function hkdfExpand(digest, prk, info, keylen, callback) {
135
+ validateCallback(callback);
136
+ try {
137
+ const normalizedDigest = normalizeHashName(digest);
138
+ const hashLen = hkdfHashLen(normalizedDigest);
139
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
140
+ if (sanitizedPrk.byteLength < hashLen) {
141
+ throw new RangeError(`HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`);
142
+ }
143
+ const sanitizedInfo = sanitizeInput(info, 'Info');
144
+ validateHkdfKeylen(normalizedDigest, keylen);
145
+ getNative().deriveKey(normalizedDigest, sanitizedPrk, new ArrayBuffer(0), sanitizedInfo, keylen, 'expand').then(res => callback(null, Buffer.from(res)), err => callback(err));
146
+ } catch (err) {
147
+ callback(err);
148
+ }
149
+ }
84
150
  export function hkdfDeriveBits(algorithm, baseKey, length) {
85
151
  const hash = algorithm.hash;
86
152
  const salt = algorithm.salt;
@@ -96,7 +162,7 @@ export function hkdfDeriveBits(algorithm, baseKey, length) {
96
162
  const normalizedDigest = normalizeHashName(hashName);
97
163
  validateHkdfKeylen(normalizedDigest, keylen);
98
164
  const nativeMod = getNative();
99
- const result = nativeMod.deriveKeySync(normalizedDigest, binaryLikeToArrayBuffer(keyBuffer), binaryLikeToArrayBuffer(salt), binaryLikeToArrayBuffer(info), keylen);
165
+ const result = nativeMod.deriveKeySync(normalizedDigest, binaryLikeToArrayBuffer(keyBuffer), binaryLikeToArrayBuffer(salt), binaryLikeToArrayBuffer(info), keylen, 'full');
100
166
  return result;
101
167
  }
102
168
  //# sourceMappingURL=hkdf.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Buffer","NitroModules","binaryLikeToArrayBuffer","normalizeHashName","native","getNative","createHybridObject","validateCallback","callback","undefined","Error","sanitizeInput","input","name","HKDF_HASH_BYTES","sha1","sha224","sha256","sha384","sha512","ripemd160","validateHkdfKeylen","digest","keylen","Number","isFinite","isInteger","TypeError","hashLen","toLowerCase","RangeError","hkdf","key","salt","info","normalizedDigest","sanitizedKey","sanitizedSalt","sanitizedInfo","nativeMod","deriveKey","then","res","from","err","hkdfSync","result","deriveKeySync","hkdfDeriveBits","algorithm","baseKey","length","hash","keyBuffer","keyObject","export","Math","ceil","hashName"],"sourceRoot":"../../src","sources":["hkdf.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Buffer","NitroModules","binaryLikeToArrayBuffer","normalizeHashName","native","getNative","createHybridObject","validateCallback","callback","undefined","Error","sanitizeInput","input","name","HKDF_HASH_BYTES","sha1","sha224","sha256","sha384","sha512","ripemd160","hkdfHashLen","digest","hashLen","toLowerCase","TypeError","validateHkdfKeylen","keylen","Number","isFinite","isInteger","RangeError","hkdf","key","salt","info","normalizedDigest","sanitizedKey","sanitizedSalt","sanitizedInfo","nativeMod","deriveKey","then","res","from","err","hkdfSync","result","deriveKeySync","hkdfExtractSync","ikm","Uint8Array","sanitizedIkm","ArrayBuffer","hkdfExtract","hkdfExpandSync","prk","sanitizedPrk","byteLength","hkdfExpand","hkdfDeriveBits","algorithm","baseKey","length","hash","keyBuffer","keyObject","export","Math","ceil","hashName"],"sourceRoot":"../../src","sources":["hkdf.ts"],"mappings":"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","ignoreList":[]}
@@ -17,6 +17,10 @@ export interface HkdfCallback {
17
17
  }
18
18
  export declare function hkdf(digest: string, key: KeyMaterial, salt: Salt, info: Info, keylen: number, callback: HkdfCallback): void;
19
19
  export declare function hkdfSync(digest: string, key: KeyMaterial, salt: Salt, info: Info, keylen: number): Buffer;
20
+ export declare function hkdfExtractSync(digest: string, ikm: KeyMaterial, salt?: Salt): Buffer;
21
+ export declare function hkdfExtract(digest: string, ikm: KeyMaterial, salt: Salt, callback: HkdfCallback): void;
22
+ export declare function hkdfExpandSync(digest: string, prk: KeyMaterial, info: Info, keylen: number): Buffer;
23
+ export declare function hkdfExpand(digest: string, prk: KeyMaterial, info: Info, keylen: number, callback: HkdfCallback): void;
20
24
  export declare function hkdfDeriveBits(algorithm: HkdfAlgorithm, baseKey: CryptoKey, length: number): ArrayBuffer;
21
25
  export {};
22
26
  //# sourceMappingURL=hkdf.d.ts.map
@@ -1 +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;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,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,YAAY;IAC3B,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAmED,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,CA+BN;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,CAkBR;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,MAAM,GACb,WAAW,CA2Bb"}
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;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,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,YAAY;IAC3B,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AA2ED,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,CAgCN;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,CAmBR;AAID,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,GAAE,IAAwB,GAC7B,MAAM,CAgBR;AAID,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,YAAY,GACrB,IAAI,CAyBN;AAID,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GACb,MAAM,CAuBR;AAGD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,GACrB,IAAI,CAgCN;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,MAAM,GACb,WAAW,CA4Bb"}
@@ -139,6 +139,10 @@ declare const QuickCrypto: {
139
139
  pbkdf2DeriveBits(algorithm: utils.SubtleAlgorithm, baseKey: keys.CryptoKey, length: number): Promise<ArrayBuffer>;
140
140
  hkdf(digest: string, key: utils.BinaryLike, salt: utils.BinaryLike, info: utils.BinaryLike, keylen: number, callback: hkdf.HkdfCallback): void;
141
141
  hkdfSync(digest: string, key: utils.BinaryLike, salt: utils.BinaryLike, info: utils.BinaryLike, keylen: number): Buffer;
142
+ hkdfExtractSync(digest: string, ikm: utils.BinaryLike, salt?: utils.BinaryLike): Buffer;
143
+ hkdfExtract(digest: string, ikm: utils.BinaryLike, salt: utils.BinaryLike, callback: hkdf.HkdfCallback): void;
144
+ hkdfExpandSync(digest: string, prk: utils.BinaryLike, info: utils.BinaryLike, keylen: number): Buffer;
145
+ hkdfExpand(digest: string, prk: utils.BinaryLike, info: utils.BinaryLike, keylen: number, callback: hkdf.HkdfCallback): void;
142
146
  hkdfDeriveBits(algorithm: hkdf.HkdfAlgorithm, baseKey: keys.CryptoKey, length: number): ArrayBuffer;
143
147
  createHmac: typeof import("./hmac").createHmac;
144
148
  createHash: typeof import("./hash").createHash;
@@ -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,CAAC,MAAM,CAAC;IAEb,IAAI,mBAAmB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,gBAAgB,CAAC,EAAE,OAAO,KACvB,WAAW,CAAC;IAEjB,IAAI,qBAAqB,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CAC1E;AAGD,OAAO,KAAK,YAAY,MAAM,UAAU,CAAC;AACzC,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,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC;;;GAGG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmFqK,cAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BArF3L,yCAA+B,EAAC,YAAe;qBAiC5C,0BACN,EACE,2EAA2E;IAC3E,2BADoB;qBA8BlB,oCACS,EAAC,2BACA;;;;;;qIAkBkhE,CAAC;mKAA85B,CAAC;;;;;;;;;;;;;;+DApB97F,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAlDD,CAAD;gBAEC,CAAF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,YAYnB,CAAC;AAYF,eAAe,WAAW,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,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,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,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;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,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,CAAC,MAAM,CAAC;IAEb,IAAI,mBAAmB,EAAE,CACvB,CAAC,EAAE,MAAM,EACT,gBAAgB,CAAC,EAAE,OAAO,KACvB,WAAW,CAAC;IAEjB,IAAI,qBAAqB,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;CAC1E;AAGD,OAAO,KAAK,YAAY,MAAM,UAAU,CAAC;AACzC,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,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC;;;GAGG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAmFqK,cAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BArF3L,yCAA+B,EAAC,YAAe;qBAiC5C,0BACN,EACE,2EAA2E;IAC3E,2BADoB;qBA8BlB,oCACS,EAAC,2BACA;;;;;;qIAkBkhE,CAAC;mKAA85B,CAAC;;;;;;;;;;;;;;+DApB97F,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAlDD,CAAD;gBAEC,CAAF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,YAYnB,CAAC;AAYF,eAAe,WAAW,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACxE,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,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,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;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import type { HybridObject } from 'react-native-nitro-modules';
2
+ export type HkdfMode = 'full' | 'extract' | 'expand';
2
3
  export interface Hkdf extends HybridObject<{
3
4
  ios: 'c++';
4
5
  android: 'c++';
5
6
  }> {
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>;
7
+ deriveKeySync(algorithm: string, key: ArrayBuffer, salt: ArrayBuffer, info: ArrayBuffer, length: number, mode: HkdfMode): ArrayBuffer;
8
+ deriveKey(algorithm: string, key: ArrayBuffer, salt: ArrayBuffer, info: ArrayBuffer, length: number, mode: HkdfMode): Promise<ArrayBuffer>;
8
9
  }
9
10
  //# sourceMappingURL=hkdf.nitro.d.ts.map
@@ -1 +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"}
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;AAI/D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,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,EACd,IAAI,EAAE,QAAQ,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,EACd,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,WAAW,CAAC,CAAC;CACzB"}
@@ -0,0 +1,80 @@
1
+ ///
2
+ /// HkdfMode.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #if __has_include(<NitroModules/NitroHash.hpp>)
11
+ #include <NitroModules/NitroHash.hpp>
12
+ #else
13
+ #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
14
+ #endif
15
+ #if __has_include(<NitroModules/JSIConverter.hpp>)
16
+ #include <NitroModules/JSIConverter.hpp>
17
+ #else
18
+ #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
19
+ #endif
20
+ #if __has_include(<NitroModules/NitroDefines.hpp>)
21
+ #include <NitroModules/NitroDefines.hpp>
22
+ #else
23
+ #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
24
+ #endif
25
+
26
+ namespace margelo::nitro::crypto {
27
+
28
+ /**
29
+ * An enum which can be represented as a JavaScript union (HkdfMode).
30
+ */
31
+ enum class HkdfMode {
32
+ FULL SWIFT_NAME(full) = 0,
33
+ EXTRACT SWIFT_NAME(extract) = 1,
34
+ EXPAND SWIFT_NAME(expand) = 2,
35
+ } CLOSED_ENUM;
36
+
37
+ } // namespace margelo::nitro::crypto
38
+
39
+ namespace margelo::nitro {
40
+
41
+ // C++ HkdfMode <> JS HkdfMode (union)
42
+ template <>
43
+ struct JSIConverter<margelo::nitro::crypto::HkdfMode> final {
44
+ static inline margelo::nitro::crypto::HkdfMode fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
45
+ std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, arg);
46
+ switch (hashString(unionValue.c_str(), unionValue.size())) {
47
+ case hashString("full"): return margelo::nitro::crypto::HkdfMode::FULL;
48
+ case hashString("extract"): return margelo::nitro::crypto::HkdfMode::EXTRACT;
49
+ case hashString("expand"): return margelo::nitro::crypto::HkdfMode::EXPAND;
50
+ default: [[unlikely]]
51
+ throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum HkdfMode - invalid value!");
52
+ }
53
+ }
54
+ static inline jsi::Value toJSI(jsi::Runtime& runtime, margelo::nitro::crypto::HkdfMode arg) {
55
+ switch (arg) {
56
+ case margelo::nitro::crypto::HkdfMode::FULL: return JSIConverter<std::string>::toJSI(runtime, "full");
57
+ case margelo::nitro::crypto::HkdfMode::EXTRACT: return JSIConverter<std::string>::toJSI(runtime, "extract");
58
+ case margelo::nitro::crypto::HkdfMode::EXPAND: return JSIConverter<std::string>::toJSI(runtime, "expand");
59
+ default: [[unlikely]]
60
+ throw std::invalid_argument("Cannot convert HkdfMode to JS - invalid value: "
61
+ + std::to_string(static_cast<int>(arg)) + "!");
62
+ }
63
+ }
64
+ static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
65
+ if (!value.isString()) {
66
+ return false;
67
+ }
68
+ std::string unionValue = JSIConverter<std::string>::fromJSI(runtime, value);
69
+ switch (hashString(unionValue.c_str(), unionValue.size())) {
70
+ case hashString("full"):
71
+ case hashString("extract"):
72
+ case hashString("expand"):
73
+ return true;
74
+ default:
75
+ return false;
76
+ }
77
+ }
78
+ };
79
+
80
+ } // namespace margelo::nitro
@@ -13,10 +13,12 @@
13
13
  #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
14
14
  #endif
15
15
 
16
-
16
+ // Forward declaration of `HkdfMode` to properly resolve imports.
17
+ namespace margelo::nitro::crypto { enum class HkdfMode; }
17
18
 
18
19
  #include <NitroModules/ArrayBuffer.hpp>
19
20
  #include <string>
21
+ #include "HkdfMode.hpp"
20
22
  #include <NitroModules/Promise.hpp>
21
23
 
22
24
  namespace margelo::nitro::crypto {
@@ -50,8 +52,8 @@ namespace margelo::nitro::crypto {
50
52
 
51
53
  public:
52
54
  // Methods
53
- 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;
54
- 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;
55
+ 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, HkdfMode mode) = 0;
56
+ 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, HkdfMode mode) = 0;
55
57
 
56
58
  protected:
57
59
  // Hybrid Setup
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-quick-crypto",
3
- "version": "1.1.5",
3
+ "version": "1.1.6",
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",
package/src/hkdf.ts CHANGED
@@ -62,6 +62,14 @@ const HKDF_HASH_BYTES: Readonly<Record<string, number>> = {
62
62
  ripemd160: 20,
63
63
  };
64
64
 
65
+ function hkdfHashLen(digest: string): number {
66
+ const hashLen = HKDF_HASH_BYTES[digest.toLowerCase()];
67
+ if (hashLen === undefined) {
68
+ throw new TypeError(`Unsupported HKDF digest: ${digest}`);
69
+ }
70
+ return hashLen;
71
+ }
72
+
65
73
  function validateHkdfKeylen(digest: string, keylen: number): void {
66
74
  if (
67
75
  typeof keylen !== 'number' ||
@@ -111,6 +119,7 @@ export function hkdf(
111
119
  sanitizedSalt,
112
120
  sanitizedInfo,
113
121
  keylen,
122
+ 'full',
114
123
  )
115
124
  .then(
116
125
  res => {
@@ -146,11 +155,143 @@ export function hkdfSync(
146
155
  sanitizedSalt,
147
156
  sanitizedInfo,
148
157
  keylen,
158
+ 'full',
159
+ );
160
+
161
+ return Buffer.from(result);
162
+ }
163
+
164
+ // RFC 5869 §2.2 HKDF-Extract (sync): PRK = HMAC(salt, IKM). Salt defaults to
165
+ // a string of HashLen zeros when omitted. Returns a PRK of HashLen bytes.
166
+ export function hkdfExtractSync(
167
+ digest: string,
168
+ ikm: KeyMaterial,
169
+ salt: Salt = new Uint8Array(0),
170
+ ): Buffer {
171
+ const normalizedDigest = normalizeHashName(digest);
172
+ const hashLen = hkdfHashLen(normalizedDigest);
173
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
174
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
175
+
176
+ const result = getNative().deriveKeySync(
177
+ normalizedDigest,
178
+ sanitizedIkm,
179
+ sanitizedSalt,
180
+ new ArrayBuffer(0),
181
+ hashLen,
182
+ 'extract',
149
183
  );
150
184
 
151
185
  return Buffer.from(result);
152
186
  }
153
187
 
188
+ // Async HKDF-Extract, mirroring `hkdf`. Unlike the sync form, `salt` is
189
+ // required here because the callback occupies the trailing argument.
190
+ export function hkdfExtract(
191
+ digest: string,
192
+ ikm: KeyMaterial,
193
+ salt: Salt,
194
+ callback: HkdfCallback,
195
+ ): void {
196
+ validateCallback(callback);
197
+
198
+ try {
199
+ const normalizedDigest = normalizeHashName(digest);
200
+ const hashLen = hkdfHashLen(normalizedDigest);
201
+ const sanitizedIkm = sanitizeInput(ikm, 'IKM');
202
+ const sanitizedSalt = sanitizeInput(salt, 'Salt');
203
+
204
+ getNative()
205
+ .deriveKey(
206
+ normalizedDigest,
207
+ sanitizedIkm,
208
+ sanitizedSalt,
209
+ new ArrayBuffer(0),
210
+ hashLen,
211
+ 'extract',
212
+ )
213
+ .then(
214
+ res => callback(null, Buffer.from(res)),
215
+ err => callback(err),
216
+ );
217
+ } catch (err) {
218
+ callback(err as Error);
219
+ }
220
+ }
221
+
222
+ // RFC 5869 §2.3 HKDF-Expand (sync): OKM = expand(PRK, info, L). `prk` must be
223
+ // at least HashLen bytes (a pseudorandom key, e.g. from hkdfExtract).
224
+ export function hkdfExpandSync(
225
+ digest: string,
226
+ prk: KeyMaterial,
227
+ info: Info,
228
+ keylen: number,
229
+ ): Buffer {
230
+ const normalizedDigest = normalizeHashName(digest);
231
+ const hashLen = hkdfHashLen(normalizedDigest);
232
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
233
+ if (sanitizedPrk.byteLength < hashLen) {
234
+ throw new RangeError(
235
+ `HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`,
236
+ );
237
+ }
238
+ const sanitizedInfo = sanitizeInput(info, 'Info');
239
+
240
+ validateHkdfKeylen(normalizedDigest, keylen);
241
+
242
+ const result = getNative().deriveKeySync(
243
+ normalizedDigest,
244
+ sanitizedPrk,
245
+ new ArrayBuffer(0),
246
+ sanitizedInfo,
247
+ keylen,
248
+ 'expand',
249
+ );
250
+
251
+ return Buffer.from(result);
252
+ }
253
+
254
+ // Async HKDF-Expand, mirroring `hkdf`.
255
+ export function hkdfExpand(
256
+ digest: string,
257
+ prk: KeyMaterial,
258
+ info: Info,
259
+ keylen: number,
260
+ callback: HkdfCallback,
261
+ ): void {
262
+ validateCallback(callback);
263
+
264
+ try {
265
+ const normalizedDigest = normalizeHashName(digest);
266
+ const hashLen = hkdfHashLen(normalizedDigest);
267
+ const sanitizedPrk = sanitizeInput(prk, 'PRK');
268
+ if (sanitizedPrk.byteLength < hashLen) {
269
+ throw new RangeError(
270
+ `HKDF-Expand PRK must be at least HashLen (${hashLen}) bytes for ${digest}`,
271
+ );
272
+ }
273
+ const sanitizedInfo = sanitizeInput(info, 'Info');
274
+
275
+ validateHkdfKeylen(normalizedDigest, keylen);
276
+
277
+ getNative()
278
+ .deriveKey(
279
+ normalizedDigest,
280
+ sanitizedPrk,
281
+ new ArrayBuffer(0),
282
+ sanitizedInfo,
283
+ keylen,
284
+ 'expand',
285
+ )
286
+ .then(
287
+ res => callback(null, Buffer.from(res)),
288
+ err => callback(err),
289
+ );
290
+ } catch (err) {
291
+ callback(err as Error);
292
+ }
293
+ }
294
+
154
295
  export function hkdfDeriveBits(
155
296
  algorithm: HkdfAlgorithm,
156
297
  baseKey: CryptoKey,
@@ -179,6 +320,7 @@ export function hkdfDeriveBits(
179
320
  binaryLikeToArrayBuffer(salt),
180
321
  binaryLikeToArrayBuffer(info),
181
322
  keylen,
323
+ 'full',
182
324
  );
183
325
 
184
326
  return result;
@@ -1,5 +1,9 @@
1
1
  import type { HybridObject } from 'react-native-nitro-modules';
2
2
 
3
+ // RFC 5869 stage: 'full' (extract+expand), 'extract' (PRK only), or
4
+ // 'expand' (from an existing PRK).
5
+ export type HkdfMode = 'full' | 'extract' | 'expand';
6
+
3
7
  export interface Hkdf extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
4
8
  deriveKeySync(
5
9
  algorithm: string,
@@ -7,6 +11,7 @@ export interface Hkdf extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
7
11
  salt: ArrayBuffer,
8
12
  info: ArrayBuffer,
9
13
  length: number,
14
+ mode: HkdfMode,
10
15
  ): ArrayBuffer;
11
16
 
12
17
  deriveKey(
@@ -15,5 +20,6 @@ export interface Hkdf extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
15
20
  salt: ArrayBuffer,
16
21
  info: ArrayBuffer,
17
22
  length: number,
23
+ mode: HkdfMode,
18
24
  ): Promise<ArrayBuffer>;
19
25
  }