react-native-quick-crypto 1.0.10 → 1.0.12

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 (293) hide show
  1. package/android/CMakeLists.txt +16 -0
  2. package/cpp/argon2/HybridArgon2.cpp +103 -0
  3. package/cpp/argon2/HybridArgon2.hpp +32 -0
  4. package/cpp/certificate/HybridCertificate.cpp +42 -0
  5. package/cpp/certificate/HybridCertificate.hpp +16 -0
  6. package/cpp/cipher/CCMCipher.cpp +4 -1
  7. package/cpp/cipher/ChaCha20Cipher.cpp +3 -1
  8. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +5 -5
  9. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +1 -2
  10. package/cpp/cipher/HybridCipher.cpp +68 -1
  11. package/cpp/cipher/HybridCipher.hpp +6 -0
  12. package/cpp/cipher/HybridRsaCipher.cpp +0 -13
  13. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +7 -5
  14. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +1 -2
  15. package/cpp/cipher/XSalsa20Cipher.cpp +4 -0
  16. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +7 -5
  17. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +1 -2
  18. package/cpp/dh/HybridDhKeyPair.cpp +179 -0
  19. package/cpp/dh/HybridDhKeyPair.hpp +37 -0
  20. package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
  21. package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
  22. package/cpp/ecdh/HybridECDH.cpp +42 -120
  23. package/cpp/ecdh/HybridECDH.hpp +1 -0
  24. package/cpp/keys/HybridKeyObjectHandle.cpp +150 -128
  25. package/cpp/keys/HybridKeyObjectHandle.hpp +6 -3
  26. package/cpp/keys/KeyObjectData.hpp +2 -0
  27. package/cpp/kmac/HybridKmac.cpp +83 -0
  28. package/cpp/kmac/HybridKmac.hpp +31 -0
  29. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +11 -20
  30. package/cpp/mldsa/HybridMlDsaKeyPair.hpp +4 -2
  31. package/cpp/mlkem/HybridMlKemKeyPair.cpp +319 -0
  32. package/cpp/mlkem/HybridMlKemKeyPair.hpp +48 -0
  33. package/cpp/prime/HybridPrime.cpp +81 -0
  34. package/cpp/prime/HybridPrime.hpp +20 -0
  35. package/cpp/sign/SignUtils.hpp +9 -26
  36. package/cpp/utils/QuickCryptoUtils.cpp +44 -0
  37. package/cpp/utils/QuickCryptoUtils.hpp +39 -0
  38. package/cpp/x509/HybridX509Certificate.cpp +174 -0
  39. package/cpp/x509/HybridX509Certificate.hpp +51 -0
  40. package/lib/commonjs/argon2.js +39 -0
  41. package/lib/commonjs/argon2.js.map +1 -0
  42. package/lib/commonjs/certificate.js +35 -0
  43. package/lib/commonjs/certificate.js.map +1 -0
  44. package/lib/commonjs/cipher.js +23 -2
  45. package/lib/commonjs/cipher.js.map +1 -1
  46. package/lib/commonjs/dhKeyPair.js +109 -0
  47. package/lib/commonjs/dhKeyPair.js.map +1 -0
  48. package/lib/commonjs/dsa.js +92 -0
  49. package/lib/commonjs/dsa.js.map +1 -0
  50. package/lib/commonjs/ec.js +18 -18
  51. package/lib/commonjs/ec.js.map +1 -1
  52. package/lib/commonjs/ecdh.js +37 -0
  53. package/lib/commonjs/ecdh.js.map +1 -1
  54. package/lib/commonjs/ed.js +9 -9
  55. package/lib/commonjs/ed.js.map +1 -1
  56. package/lib/commonjs/hash.js +17 -12
  57. package/lib/commonjs/hash.js.map +1 -1
  58. package/lib/commonjs/hkdf.js.map +1 -1
  59. package/lib/commonjs/index.js +57 -0
  60. package/lib/commonjs/index.js.map +1 -1
  61. package/lib/commonjs/keys/classes.js +11 -9
  62. package/lib/commonjs/keys/classes.js.map +1 -1
  63. package/lib/commonjs/keys/generateKeyPair.js +11 -0
  64. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  65. package/lib/commonjs/keys/index.js +24 -0
  66. package/lib/commonjs/keys/index.js.map +1 -1
  67. package/lib/commonjs/keys/signVerify.js +0 -2
  68. package/lib/commonjs/keys/signVerify.js.map +1 -1
  69. package/lib/commonjs/mlkem.js +219 -0
  70. package/lib/commonjs/mlkem.js.map +1 -0
  71. package/lib/commonjs/pbkdf2.js +18 -1
  72. package/lib/commonjs/pbkdf2.js.map +1 -1
  73. package/lib/commonjs/prime.js +84 -0
  74. package/lib/commonjs/prime.js.map +1 -0
  75. package/lib/commonjs/rsa.js +7 -7
  76. package/lib/commonjs/rsa.js.map +1 -1
  77. package/lib/commonjs/specs/argon2.nitro.js +6 -0
  78. package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
  79. package/lib/commonjs/specs/certificate.nitro.js +6 -0
  80. package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
  81. package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
  82. package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
  83. package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
  84. package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
  85. package/lib/commonjs/specs/kmac.nitro.js +6 -0
  86. package/lib/commonjs/specs/kmac.nitro.js.map +1 -0
  87. package/lib/commonjs/specs/mlKemKeyPair.nitro.js +6 -0
  88. package/lib/commonjs/specs/mlKemKeyPair.nitro.js.map +1 -0
  89. package/lib/commonjs/specs/prime.nitro.js +6 -0
  90. package/lib/commonjs/specs/prime.nitro.js.map +1 -0
  91. package/lib/commonjs/specs/x509certificate.nitro.js +6 -0
  92. package/lib/commonjs/specs/x509certificate.nitro.js.map +1 -0
  93. package/lib/commonjs/subtle.js +385 -114
  94. package/lib/commonjs/subtle.js.map +1 -1
  95. package/lib/commonjs/utils/conversion.js +3 -3
  96. package/lib/commonjs/utils/conversion.js.map +1 -1
  97. package/lib/commonjs/utils/hashnames.js +31 -0
  98. package/lib/commonjs/utils/hashnames.js.map +1 -1
  99. package/lib/commonjs/utils/types.js.map +1 -1
  100. package/lib/commonjs/x509certificate.js +189 -0
  101. package/lib/commonjs/x509certificate.js.map +1 -0
  102. package/lib/module/argon2.js +34 -0
  103. package/lib/module/argon2.js.map +1 -0
  104. package/lib/module/certificate.js +30 -0
  105. package/lib/module/certificate.js.map +1 -0
  106. package/lib/module/cipher.js +23 -3
  107. package/lib/module/cipher.js.map +1 -1
  108. package/lib/module/dhKeyPair.js +102 -0
  109. package/lib/module/dhKeyPair.js.map +1 -0
  110. package/lib/module/dsa.js +85 -0
  111. package/lib/module/dsa.js.map +1 -0
  112. package/lib/module/ec.js +6 -6
  113. package/lib/module/ec.js.map +1 -1
  114. package/lib/module/ecdh.js +37 -0
  115. package/lib/module/ecdh.js.map +1 -1
  116. package/lib/module/ed.js +1 -1
  117. package/lib/module/ed.js.map +1 -1
  118. package/lib/module/hash.js +17 -12
  119. package/lib/module/hash.js.map +1 -1
  120. package/lib/module/hkdf.js.map +1 -1
  121. package/lib/module/index.js +15 -0
  122. package/lib/module/index.js.map +1 -1
  123. package/lib/module/keys/classes.js +11 -9
  124. package/lib/module/keys/classes.js.map +1 -1
  125. package/lib/module/keys/generateKeyPair.js +11 -0
  126. package/lib/module/keys/generateKeyPair.js.map +1 -1
  127. package/lib/module/keys/index.js +25 -1
  128. package/lib/module/keys/index.js.map +1 -1
  129. package/lib/module/keys/signVerify.js +0 -2
  130. package/lib/module/keys/signVerify.js.map +1 -1
  131. package/lib/module/mlkem.js +211 -0
  132. package/lib/module/mlkem.js.map +1 -0
  133. package/lib/module/pbkdf2.js +18 -1
  134. package/lib/module/pbkdf2.js.map +1 -1
  135. package/lib/module/prime.js +77 -0
  136. package/lib/module/prime.js.map +1 -0
  137. package/lib/module/rsa.js +1 -1
  138. package/lib/module/rsa.js.map +1 -1
  139. package/lib/module/specs/argon2.nitro.js +4 -0
  140. package/lib/module/specs/argon2.nitro.js.map +1 -0
  141. package/lib/module/specs/certificate.nitro.js +4 -0
  142. package/lib/module/specs/certificate.nitro.js.map +1 -0
  143. package/lib/module/specs/dhKeyPair.nitro.js +4 -0
  144. package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
  145. package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
  146. package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
  147. package/lib/module/specs/kmac.nitro.js +4 -0
  148. package/lib/module/specs/kmac.nitro.js.map +1 -0
  149. package/lib/module/specs/mlKemKeyPair.nitro.js +4 -0
  150. package/lib/module/specs/mlKemKeyPair.nitro.js.map +1 -0
  151. package/lib/module/specs/prime.nitro.js +4 -0
  152. package/lib/module/specs/prime.nitro.js.map +1 -0
  153. package/lib/module/specs/x509certificate.nitro.js +4 -0
  154. package/lib/module/specs/x509certificate.nitro.js.map +1 -0
  155. package/lib/module/subtle.js +386 -116
  156. package/lib/module/subtle.js.map +1 -1
  157. package/lib/module/utils/conversion.js +3 -4
  158. package/lib/module/utils/conversion.js.map +1 -1
  159. package/lib/module/utils/hashnames.js +31 -0
  160. package/lib/module/utils/hashnames.js.map +1 -1
  161. package/lib/module/utils/types.js.map +1 -1
  162. package/lib/module/x509certificate.js +184 -0
  163. package/lib/module/x509certificate.js.map +1 -0
  164. package/lib/tsconfig.tsbuildinfo +1 -1
  165. package/lib/typescript/argon2.d.ts +16 -0
  166. package/lib/typescript/argon2.d.ts.map +1 -0
  167. package/lib/typescript/certificate.d.ts +8 -0
  168. package/lib/typescript/certificate.d.ts.map +1 -0
  169. package/lib/typescript/cipher.d.ts +15 -0
  170. package/lib/typescript/cipher.d.ts.map +1 -1
  171. package/lib/typescript/dhKeyPair.d.ts +19 -0
  172. package/lib/typescript/dhKeyPair.d.ts.map +1 -0
  173. package/lib/typescript/dsa.d.ts +19 -0
  174. package/lib/typescript/dsa.d.ts.map +1 -0
  175. package/lib/typescript/ec.d.ts +1 -1
  176. package/lib/typescript/ec.d.ts.map +1 -1
  177. package/lib/typescript/ecdh.d.ts +3 -0
  178. package/lib/typescript/ecdh.d.ts.map +1 -1
  179. package/lib/typescript/ed.d.ts +1 -1
  180. package/lib/typescript/ed.d.ts.map +1 -1
  181. package/lib/typescript/hash.d.ts.map +1 -1
  182. package/lib/typescript/hkdf.d.ts +2 -6
  183. package/lib/typescript/hkdf.d.ts.map +1 -1
  184. package/lib/typescript/index.d.ts +32 -4
  185. package/lib/typescript/index.d.ts.map +1 -1
  186. package/lib/typescript/keys/classes.d.ts +7 -5
  187. package/lib/typescript/keys/classes.d.ts.map +1 -1
  188. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  189. package/lib/typescript/keys/index.d.ts +2 -2
  190. package/lib/typescript/keys/index.d.ts.map +1 -1
  191. package/lib/typescript/keys/signVerify.d.ts.map +1 -1
  192. package/lib/typescript/mlkem.d.ts +30 -0
  193. package/lib/typescript/mlkem.d.ts.map +1 -0
  194. package/lib/typescript/pbkdf2.d.ts +2 -2
  195. package/lib/typescript/pbkdf2.d.ts.map +1 -1
  196. package/lib/typescript/prime.d.ts +19 -0
  197. package/lib/typescript/prime.d.ts.map +1 -0
  198. package/lib/typescript/rsa.d.ts +1 -1
  199. package/lib/typescript/rsa.d.ts.map +1 -1
  200. package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
  201. package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
  202. package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
  203. package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
  204. package/lib/typescript/specs/cipher.nitro.d.ts +9 -0
  205. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -1
  206. package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
  207. package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
  208. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
  209. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
  210. package/lib/typescript/specs/ecdh.nitro.d.ts +1 -0
  211. package/lib/typescript/specs/ecdh.nitro.d.ts.map +1 -1
  212. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -0
  213. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  214. package/lib/typescript/specs/kmac.nitro.d.ts +10 -0
  215. package/lib/typescript/specs/kmac.nitro.d.ts.map +1 -0
  216. package/lib/typescript/specs/mlKemKeyPair.nitro.d.ts +18 -0
  217. package/lib/typescript/specs/mlKemKeyPair.nitro.d.ts.map +1 -0
  218. package/lib/typescript/specs/prime.nitro.d.ts +11 -0
  219. package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
  220. package/lib/typescript/specs/x509certificate.nitro.d.ts +34 -0
  221. package/lib/typescript/specs/x509certificate.nitro.d.ts.map +1 -0
  222. package/lib/typescript/subtle.d.ts +12 -0
  223. package/lib/typescript/subtle.d.ts.map +1 -1
  224. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  225. package/lib/typescript/utils/hashnames.d.ts +1 -1
  226. package/lib/typescript/utils/hashnames.d.ts.map +1 -1
  227. package/lib/typescript/utils/types.d.ts +25 -9
  228. package/lib/typescript/utils/types.d.ts.map +1 -1
  229. package/lib/typescript/x509certificate.d.ts +64 -0
  230. package/lib/typescript/x509certificate.d.ts.map +1 -0
  231. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +8 -0
  232. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +80 -0
  233. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +80 -0
  234. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +12 -0
  235. package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
  236. package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
  237. package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
  238. package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
  239. package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
  240. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +1 -0
  241. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +4 -0
  242. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
  243. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
  244. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
  245. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
  246. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +1 -0
  247. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +1 -0
  248. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -0
  249. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +1 -0
  250. package/nitrogen/generated/shared/c++/HybridKmacSpec.cpp +23 -0
  251. package/nitrogen/generated/shared/c++/HybridKmacSpec.hpp +66 -0
  252. package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.cpp +31 -0
  253. package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.hpp +74 -0
  254. package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
  255. package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
  256. package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.cpp +46 -0
  257. package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.hpp +96 -0
  258. package/package.json +4 -1
  259. package/src/argon2.ts +83 -0
  260. package/src/certificate.ts +41 -0
  261. package/src/cipher.ts +41 -3
  262. package/src/dhKeyPair.ts +156 -0
  263. package/src/dsa.ts +129 -0
  264. package/src/ec.ts +9 -9
  265. package/src/ecdh.ts +59 -0
  266. package/src/ed.ts +2 -2
  267. package/src/hash.ts +34 -11
  268. package/src/hkdf.ts +2 -7
  269. package/src/index.ts +16 -0
  270. package/src/keys/classes.ts +26 -14
  271. package/src/keys/generateKeyPair.ts +14 -0
  272. package/src/keys/index.ts +37 -2
  273. package/src/keys/signVerify.ts +0 -5
  274. package/src/mlkem.ts +350 -0
  275. package/src/pbkdf2.ts +34 -5
  276. package/src/prime.ts +134 -0
  277. package/src/rsa.ts +1 -1
  278. package/src/specs/argon2.nitro.ts +29 -0
  279. package/src/specs/certificate.nitro.ts +8 -0
  280. package/src/specs/cipher.nitro.ts +14 -0
  281. package/src/specs/dhKeyPair.nitro.ts +14 -0
  282. package/src/specs/dsaKeyPair.nitro.ts +13 -0
  283. package/src/specs/ecdh.nitro.ts +1 -0
  284. package/src/specs/keyObjectHandle.nitro.ts +5 -0
  285. package/src/specs/kmac.nitro.ts +12 -0
  286. package/src/specs/mlKemKeyPair.nitro.ts +32 -0
  287. package/src/specs/prime.nitro.ts +18 -0
  288. package/src/specs/x509certificate.nitro.ts +38 -0
  289. package/src/subtle.ts +821 -136
  290. package/src/utils/conversion.ts +10 -4
  291. package/src/utils/hashnames.ts +33 -2
  292. package/src/utils/types.ts +64 -8
  293. package/src/x509certificate.ts +277 -0
package/src/hash.ts CHANGED
@@ -241,19 +241,38 @@ export const asyncDigest = async (
241
241
  ): Promise<ArrayBuffer> => {
242
242
  validateMaxBufferLength(data, 'data');
243
243
 
244
- switch (algorithm.name) {
245
- case 'SHA-1':
246
- // Fall through
247
- case 'SHA-256':
248
- // Fall through
249
- case 'SHA-384':
250
- // Fall through
251
- case 'SHA-512':
252
- return internalDigest(algorithm, data);
244
+ const name = algorithm.name;
245
+
246
+ if (
247
+ name === 'SHA-1' ||
248
+ name === 'SHA-256' ||
249
+ name === 'SHA-384' ||
250
+ name === 'SHA-512' ||
251
+ name === 'SHA3-256' ||
252
+ name === 'SHA3-384' ||
253
+ name === 'SHA3-512'
254
+ ) {
255
+ return internalDigest(algorithm, data);
256
+ }
257
+
258
+ if (name === 'cSHAKE128' || name === 'cSHAKE256') {
259
+ if (typeof algorithm.length !== 'number' || algorithm.length <= 0) {
260
+ throw lazyDOMException(
261
+ 'cSHAKE requires a length parameter',
262
+ 'OperationError',
263
+ );
264
+ }
265
+ if (algorithm.length % 8) {
266
+ throw lazyDOMException(
267
+ 'Unsupported CShakeParams length',
268
+ 'NotSupportedError',
269
+ );
270
+ }
271
+ return internalDigest(algorithm, data, algorithm.length);
253
272
  }
254
273
 
255
274
  throw lazyDOMException(
256
- `Unrecognized algorithm name: ${algorithm.name}`,
275
+ `Unrecognized algorithm name: ${name}`,
257
276
  'NotSupportedError',
258
277
  );
259
278
  };
@@ -261,9 +280,13 @@ export const asyncDigest = async (
261
280
  const internalDigest = (
262
281
  algorithm: SubtleAlgorithm,
263
282
  data: BufferLike,
283
+ outputLength?: number,
264
284
  ): ArrayBuffer => {
265
285
  const normalizedHashName = normalizeHashName(algorithm.name);
266
- const hash = createHash(normalizedHashName);
286
+ const hash = createHash(
287
+ normalizedHashName,
288
+ outputLength ? { outputLength } : undefined,
289
+ );
267
290
  hash.update(bufferLikeToArrayBuffer(data));
268
291
  const result = hash.digest();
269
292
  const arrayBuffer = new ArrayBuffer(result.length);
package/src/hkdf.ts CHANGED
@@ -3,6 +3,7 @@ import { NitroModules } from 'react-native-nitro-modules';
3
3
  import type { Hkdf as HkdfNative } from './specs/hkdf.nitro';
4
4
  import { binaryLikeToArrayBuffer, normalizeHashName } from './utils';
5
5
  import type { BinaryLike } from './utils';
6
+ import type { CryptoKey } from './keys';
6
7
 
7
8
  type KeyMaterial = BinaryLike;
8
9
  type Salt = BinaryLike;
@@ -15,12 +16,6 @@ export interface HkdfAlgorithm {
15
16
  info: BinaryLike;
16
17
  }
17
18
 
18
- export interface CryptoKeyInternal {
19
- keyObject: {
20
- export: () => Buffer;
21
- };
22
- }
23
-
24
19
  export interface HkdfCallback {
25
20
  (err: Error | null, derivedKey?: Buffer): void;
26
21
  }
@@ -122,7 +117,7 @@ export function hkdfSync(
122
117
 
123
118
  export function hkdfDeriveBits(
124
119
  algorithm: HkdfAlgorithm,
125
- baseKey: CryptoKeyInternal,
120
+ baseKey: CryptoKey,
126
121
  length: number,
127
122
  ): ArrayBuffer {
128
123
  const hash = algorithm.hash;
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Buffer } from '@craftzdog/react-native-buffer';
3
3
 
4
4
  // API imports
5
+ import * as argon2Module from './argon2';
5
6
  import * as keys from './keys';
6
7
  import * as blake3 from './blake3';
7
8
  import * as cipher from './cipher';
@@ -10,10 +11,14 @@ import { hashExports as hash } from './hash';
10
11
  import { hmacExports as hmac } from './hmac';
11
12
  import * as hkdf from './hkdf';
12
13
  import * as pbkdf2 from './pbkdf2';
14
+ import * as prime from './prime';
13
15
  import * as scrypt from './scrypt';
14
16
  import * as random from './random';
15
17
  import * as ecdh from './ecdh';
16
18
  import * as dh from './diffie-hellman';
19
+ import * as mlkem from './mlkem';
20
+ import { Certificate } from './certificate';
21
+ import { X509Certificate } from './x509certificate';
17
22
  import { getCurves } from './ec';
18
23
  import { constants } from './constants';
19
24
 
@@ -26,6 +31,7 @@ import * as subtle from './subtle';
26
31
  * See `docs/implementation-coverage.md` for status.
27
32
  */
28
33
  const QuickCrypto = {
34
+ ...argon2Module,
29
35
  ...keys,
30
36
  ...blake3,
31
37
  ...cipher,
@@ -34,12 +40,16 @@ const QuickCrypto = {
34
40
  ...hmac,
35
41
  ...hkdf,
36
42
  ...pbkdf2,
43
+ ...prime,
37
44
  ...scrypt,
38
45
  ...random,
39
46
  ...ecdh,
40
47
  ...dh,
48
+ ...mlkem,
41
49
  ...utils,
42
50
  ...subtle,
51
+ Certificate,
52
+ X509Certificate,
43
53
  getCurves,
44
54
  constants,
45
55
  Buffer,
@@ -72,7 +82,11 @@ if (global.process.nextTick == null) {
72
82
 
73
83
  // exports
74
84
  export default QuickCrypto;
85
+ export * from './argon2';
75
86
  export * from './blake3';
87
+ export { Certificate } from './certificate';
88
+ export { X509Certificate } from './x509certificate';
89
+ export type { CheckOptions, X509LegacyObject } from './x509certificate';
76
90
  export * from './cipher';
77
91
  export * from './ed';
78
92
  export * from './keys';
@@ -80,11 +94,13 @@ export * from './hash';
80
94
  export * from './hmac';
81
95
  export * from './hkdf';
82
96
  export * from './pbkdf2';
97
+ export * from './prime';
83
98
  export * from './scrypt';
84
99
  export * from './random';
85
100
  export * from './ecdh';
86
101
  export { getCurves } from './ec';
87
102
  export * from './diffie-hellman';
103
+ export * from './mlkem';
88
104
  export * from './utils';
89
105
  export * from './subtle';
90
106
  export { subtle, isCryptoKeyPair } from './subtle';
@@ -3,6 +3,7 @@ import { NitroModules } from 'react-native-nitro-modules';
3
3
  import type {
4
4
  AsymmetricKeyType,
5
5
  EncodingOptions,
6
+ JWK,
6
7
  KeyDetail,
7
8
  KeyObjectHandle,
8
9
  KeyUsage,
@@ -81,10 +82,10 @@ export class KeyObject {
81
82
 
82
83
  export(options: { format: 'pem' } & EncodingOptions): string | Buffer;
83
84
  export(options?: { format: 'der' } & EncodingOptions): Buffer;
84
- export(options?: { format: 'jwk' } & EncodingOptions): never;
85
- export(options?: EncodingOptions): string | Buffer;
85
+ export(options?: { format: 'jwk' } & EncodingOptions): JWK;
86
+ export(options?: EncodingOptions): string | Buffer | JWK;
86
87
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
87
- export(_options?: EncodingOptions): string | Buffer {
88
+ export(_options?: EncodingOptions): string | Buffer | JWK {
88
89
  // This is a placeholder and should be overridden by subclasses.
89
90
  throw new Error('export() must be implemented by subclasses');
90
91
  }
@@ -126,11 +127,22 @@ export class KeyObject {
126
127
  this.type = type as 'public' | 'secret' | 'private';
127
128
  }
128
129
 
129
- // static from(key) {
130
- // if (!isCryptoKey(key))
131
- // throw new ERR_INVALID_ARG_TYPE('key', 'CryptoKey', key);
132
- // return key[kKeyObject];
133
- // }
130
+ static from(key: CryptoKey): KeyObject {
131
+ if (!(key instanceof CryptoKey)) {
132
+ throw new TypeError(
133
+ `The "key" argument must be an instance of CryptoKey. Received ${typeof key}`,
134
+ );
135
+ }
136
+ return key.keyObject;
137
+ }
138
+
139
+ toCryptoKey(
140
+ algorithm: SubtleAlgorithm,
141
+ extractable: boolean,
142
+ keyUsages: KeyUsage[],
143
+ ): CryptoKey {
144
+ return new CryptoKey(this, algorithm, keyUsages, extractable);
145
+ }
134
146
 
135
147
  static createKeyObject(
136
148
  type: string,
@@ -273,10 +285,10 @@ export class PublicKeyObject extends AsymmetricKeyObject {
273
285
 
274
286
  export(options: { format: 'pem' } & EncodingOptions): string;
275
287
  export(options: { format: 'der' } & EncodingOptions): Buffer;
276
- export(options: { format: 'jwk' } & EncodingOptions): never;
277
- export(options: EncodingOptions): string | Buffer {
288
+ export(options: { format: 'jwk' } & EncodingOptions): JWK;
289
+ export(options: EncodingOptions): string | Buffer | JWK {
278
290
  if (options?.format === 'jwk') {
279
- throw new Error('PublicKey export for jwk is not implemented');
291
+ return this.handle.exportJwk({}, false);
280
292
  }
281
293
  const { format, type } = parsePublicKeyEncoding(
282
294
  options,
@@ -298,13 +310,13 @@ export class PrivateKeyObject extends AsymmetricKeyObject {
298
310
 
299
311
  export(options: { format: 'pem' } & EncodingOptions): string;
300
312
  export(options: { format: 'der' } & EncodingOptions): Buffer;
301
- export(options: { format: 'jwk' } & EncodingOptions): never;
302
- export(options: EncodingOptions): string | Buffer {
313
+ export(options: { format: 'jwk' } & EncodingOptions): JWK;
314
+ export(options: EncodingOptions): string | Buffer | JWK {
303
315
  if (options?.format === 'jwk') {
304
316
  if (options.passphrase !== undefined) {
305
317
  throw new Error('jwk does not support encryption');
306
318
  }
307
- throw new Error('PrivateKey export for jwk is not implemented');
319
+ return this.handle.exportJwk({}, false);
308
320
  }
309
321
  const { format, type, cipher, passphrase } = parsePrivateKeyEncoding(
310
322
  options,
@@ -1,6 +1,11 @@
1
1
  import { ed_generateKeyPair } from '../ed';
2
2
  import { rsa_generateKeyPairNode, rsa_generateKeyPairNodeSync } from '../rsa';
3
3
  import { ec_generateKeyPairNode, ec_generateKeyPairNodeSync } from '../ec';
4
+ import { dsa_generateKeyPairNode, dsa_generateKeyPairNodeSync } from '../dsa';
5
+ import {
6
+ dh_generateKeyPairNode,
7
+ dh_generateKeyPairNodeSync,
8
+ } from '../dhKeyPair';
4
9
  import {
5
10
  kEmptyObject,
6
11
  validateFunction,
@@ -139,6 +144,7 @@ function internalGenerateKeyPair(
139
144
  case 'rsa-pss':
140
145
  case 'dsa':
141
146
  case 'ec':
147
+ case 'dh':
142
148
  break;
143
149
  default: {
144
150
  const err = new Error(`
@@ -158,6 +164,10 @@ function internalGenerateKeyPair(
158
164
  result = await rsa_generateKeyPairNode(type, options, encoding);
159
165
  } else if (type === 'ec') {
160
166
  result = await ec_generateKeyPairNode(options, encoding);
167
+ } else if (type === 'dsa') {
168
+ result = await dsa_generateKeyPairNode(options, encoding);
169
+ } else if (type === 'dh') {
170
+ result = await dh_generateKeyPairNode(options, encoding);
161
171
  } else {
162
172
  throw new Error(`Unsupported key type: ${type}`);
163
173
  }
@@ -184,6 +194,10 @@ function internalGenerateKeyPair(
184
194
  result = rsa_generateKeyPairNodeSync(type, options, encoding);
185
195
  } else if (type === 'ec') {
186
196
  result = ec_generateKeyPairNodeSync(options, encoding);
197
+ } else if (type === 'dsa') {
198
+ result = dsa_generateKeyPairNodeSync(options, encoding);
199
+ } else if (type === 'dh') {
200
+ result = dh_generateKeyPairNodeSync(options, encoding);
187
201
  } else {
188
202
  throw new Error(`Unsupported key type: ${type}`);
189
203
  }
package/src/keys/index.ts CHANGED
@@ -27,17 +27,19 @@ import {
27
27
  parsePrivateKeyEncoding,
28
28
  parsePublicKeyEncoding,
29
29
  } from './utils';
30
- import type { BinaryLike } from '../utils';
30
+ import { NitroModules } from 'react-native-nitro-modules';
31
+ import type { BinaryLike, JWK, KeyObjectHandle } from '../utils';
31
32
  import {
32
33
  binaryLikeToArrayBuffer as toAB,
33
34
  isStringOrBuffer,
34
35
  KFormatType,
35
36
  KeyEncoding,
37
+ KeyType,
36
38
  } from '../utils';
37
39
  import { randomBytes } from '../random';
38
40
 
39
41
  interface KeyInputObject {
40
- key: BinaryLike | KeyObject | CryptoKey;
42
+ key: BinaryLike | KeyObject | CryptoKey | JWK;
41
43
  format?: 'pem' | 'der' | 'jwk';
42
44
  type?: 'pkcs1' | 'pkcs8' | 'spki' | 'sec1';
43
45
  passphrase?: BinaryLike;
@@ -123,6 +125,29 @@ function prepareAsymmetricKey(
123
125
  }
124
126
 
125
127
  function createPublicKey(key: KeyInput): PublicKeyObject {
128
+ if (typeof key === 'object' && 'key' in key && key.format === 'jwk') {
129
+ const handle =
130
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
131
+ const keyType = handle.initJwk(key.key as JWK);
132
+ if (keyType === undefined) {
133
+ throw new Error('Failed to import JWK');
134
+ }
135
+ if (keyType === KeyType.PRIVATE) {
136
+ // Extract public from private
137
+ const exported = handle.exportKey(KFormatType.DER, KeyEncoding.SPKI);
138
+ const pubHandle =
139
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
140
+ pubHandle.init(
141
+ KeyType.PUBLIC,
142
+ exported,
143
+ KFormatType.DER,
144
+ KeyEncoding.SPKI,
145
+ );
146
+ return new PublicKeyObject(pubHandle);
147
+ }
148
+ return new PublicKeyObject(handle);
149
+ }
150
+
126
151
  const { data, format, type } = prepareAsymmetricKey(key, true);
127
152
 
128
153
  // Map format string to KFormatType enum
@@ -144,6 +169,16 @@ function createPublicKey(key: KeyInput): PublicKeyObject {
144
169
  }
145
170
 
146
171
  function createPrivateKey(key: KeyInput): PrivateKeyObject {
172
+ if (typeof key === 'object' && 'key' in key && key.format === 'jwk') {
173
+ const handle =
174
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
175
+ const keyType = handle.initJwk(key.key as JWK);
176
+ if (keyType === undefined || keyType !== KeyType.PRIVATE) {
177
+ throw new Error('Failed to import private key from JWK');
178
+ }
179
+ return new PrivateKeyObject(handle);
180
+ }
181
+
147
182
  const { data, format, type } = prepareAsymmetricKey(key, false);
148
183
 
149
184
  // Map format string to KFormatType enum
@@ -119,12 +119,7 @@ function prepareKey(key: KeyInput, isPublic: boolean): PreparedKey {
119
119
 
120
120
  const keyType = isPublic ? 'public' : 'private';
121
121
  // Always convert to ArrayBuffer to avoid Nitro bridge string truncation bug
122
- const originalLength =
123
- typeof data === 'string' ? data.length : data.byteLength;
124
122
  const keyData = toAB(data);
125
- console.log(
126
- `[prepareKey KeyInputObject] ${keyType} key, original length: ${originalLength}, ArrayBuffer size: ${keyData.byteLength}`,
127
- );
128
123
  const keyObject = KeyObject.createKeyObject(
129
124
  keyType,
130
125
  keyData,