react-native-quick-crypto 1.0.9 → 1.0.11

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 (292) hide show
  1. package/QuickCrypto.podspec +9 -2
  2. package/README.md +13 -9
  3. package/android/CMakeLists.txt +13 -0
  4. package/cpp/argon2/HybridArgon2.cpp +103 -0
  5. package/cpp/argon2/HybridArgon2.hpp +32 -0
  6. package/cpp/certificate/HybridCertificate.cpp +42 -0
  7. package/cpp/certificate/HybridCertificate.hpp +16 -0
  8. package/cpp/cipher/HybridCipher.cpp +58 -0
  9. package/cpp/cipher/HybridCipher.hpp +4 -0
  10. package/cpp/cipher/HybridCipherFactory.hpp +15 -1
  11. package/cpp/cipher/OCBCipher.cpp +4 -4
  12. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
  13. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
  14. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
  15. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
  16. package/cpp/dh/HybridDhKeyPair.cpp +179 -0
  17. package/cpp/dh/HybridDhKeyPair.hpp +37 -0
  18. package/cpp/dh/HybridDiffieHellman.cpp +10 -0
  19. package/cpp/dh/HybridDiffieHellman.hpp +1 -0
  20. package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
  21. package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
  22. package/cpp/ec/HybridEcKeyPair.cpp +21 -0
  23. package/cpp/ec/HybridEcKeyPair.hpp +1 -0
  24. package/cpp/ecdh/HybridECDH.cpp +35 -0
  25. package/cpp/ecdh/HybridECDH.hpp +1 -0
  26. package/cpp/hash/HybridHash.cpp +1 -1
  27. package/cpp/hash/HybridHash.hpp +1 -1
  28. package/cpp/hmac/HybridHmac.cpp +1 -1
  29. package/cpp/hmac/HybridHmac.hpp +1 -1
  30. package/cpp/keys/HybridKeyObjectHandle.cpp +131 -1
  31. package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
  32. package/cpp/prime/HybridPrime.cpp +81 -0
  33. package/cpp/prime/HybridPrime.hpp +20 -0
  34. package/deps/ncrypto/.bazelrc +0 -1
  35. package/deps/ncrypto/.bazelversion +1 -1
  36. package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
  37. package/deps/ncrypto/.github/workflows/linter.yml +2 -2
  38. package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
  39. package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
  40. package/deps/ncrypto/.release-please-manifest.json +3 -0
  41. package/deps/ncrypto/BUILD.bazel +9 -1
  42. package/deps/ncrypto/CHANGELOG.md +37 -0
  43. package/deps/ncrypto/CMakeLists.txt +35 -11
  44. package/deps/ncrypto/MODULE.bazel +16 -1
  45. package/deps/ncrypto/MODULE.bazel.lock +299 -118
  46. package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
  47. package/deps/ncrypto/include/ncrypto/aead.h +137 -0
  48. package/deps/ncrypto/include/ncrypto/version.h +14 -0
  49. package/deps/ncrypto/include/ncrypto.h +85 -230
  50. package/deps/ncrypto/ncrypto.pc.in +10 -0
  51. package/deps/ncrypto/release-please-config.json +11 -0
  52. package/deps/ncrypto/src/CMakeLists.txt +31 -6
  53. package/deps/ncrypto/src/aead.cpp +302 -0
  54. package/deps/ncrypto/src/ncrypto.cpp +274 -556
  55. package/deps/ncrypto/tests/BUILD.bazel +2 -0
  56. package/deps/ncrypto/tests/basic.cpp +772 -2
  57. package/deps/ncrypto/tools/run-clang-format.sh +5 -5
  58. package/lib/commonjs/argon2.js +39 -0
  59. package/lib/commonjs/argon2.js.map +1 -0
  60. package/lib/commonjs/certificate.js +35 -0
  61. package/lib/commonjs/certificate.js.map +1 -0
  62. package/lib/commonjs/cipher.js +8 -0
  63. package/lib/commonjs/cipher.js.map +1 -1
  64. package/lib/commonjs/dhKeyPair.js +109 -0
  65. package/lib/commonjs/dhKeyPair.js.map +1 -0
  66. package/lib/commonjs/diffie-hellman.js +4 -1
  67. package/lib/commonjs/diffie-hellman.js.map +1 -1
  68. package/lib/commonjs/dsa.js +92 -0
  69. package/lib/commonjs/dsa.js.map +1 -0
  70. package/lib/commonjs/ec.js +20 -25
  71. package/lib/commonjs/ec.js.map +1 -1
  72. package/lib/commonjs/ecdh.js +37 -0
  73. package/lib/commonjs/ecdh.js.map +1 -1
  74. package/lib/commonjs/ed.js +1 -2
  75. package/lib/commonjs/ed.js.map +1 -1
  76. package/lib/commonjs/hash.js +7 -0
  77. package/lib/commonjs/hash.js.map +1 -1
  78. package/lib/commonjs/index.js +46 -1
  79. package/lib/commonjs/index.js.map +1 -1
  80. package/lib/commonjs/keys/classes.js +18 -12
  81. package/lib/commonjs/keys/classes.js.map +1 -1
  82. package/lib/commonjs/keys/generateKeyPair.js +11 -0
  83. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  84. package/lib/commonjs/prime.js +84 -0
  85. package/lib/commonjs/prime.js.map +1 -0
  86. package/lib/commonjs/specs/argon2.nitro.js +6 -0
  87. package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
  88. package/lib/commonjs/specs/certificate.nitro.js +6 -0
  89. package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
  90. package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
  91. package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
  92. package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
  93. package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
  94. package/lib/commonjs/specs/prime.nitro.js +6 -0
  95. package/lib/commonjs/specs/prime.nitro.js.map +1 -0
  96. package/lib/commonjs/subtle.js +181 -39
  97. package/lib/commonjs/subtle.js.map +1 -1
  98. package/lib/commonjs/utils/types.js.map +1 -1
  99. package/lib/module/argon2.js +34 -0
  100. package/lib/module/argon2.js.map +1 -0
  101. package/lib/module/certificate.js +30 -0
  102. package/lib/module/certificate.js.map +1 -0
  103. package/lib/module/cipher.js +7 -0
  104. package/lib/module/cipher.js.map +1 -1
  105. package/lib/module/dhKeyPair.js +102 -0
  106. package/lib/module/dhKeyPair.js.map +1 -0
  107. package/lib/module/diffie-hellman.js +4 -0
  108. package/lib/module/diffie-hellman.js.map +1 -1
  109. package/lib/module/dsa.js +85 -0
  110. package/lib/module/dsa.js.map +1 -0
  111. package/lib/module/ec.js +19 -25
  112. package/lib/module/ec.js.map +1 -1
  113. package/lib/module/ecdh.js +37 -0
  114. package/lib/module/ecdh.js.map +1 -1
  115. package/lib/module/ed.js +1 -2
  116. package/lib/module/ed.js.map +1 -1
  117. package/lib/module/hash.js +6 -0
  118. package/lib/module/hash.js.map +1 -1
  119. package/lib/module/index.js +12 -0
  120. package/lib/module/index.js.map +1 -1
  121. package/lib/module/keys/classes.js +18 -12
  122. package/lib/module/keys/classes.js.map +1 -1
  123. package/lib/module/keys/generateKeyPair.js +11 -0
  124. package/lib/module/keys/generateKeyPair.js.map +1 -1
  125. package/lib/module/prime.js +77 -0
  126. package/lib/module/prime.js.map +1 -0
  127. package/lib/module/specs/argon2.nitro.js +4 -0
  128. package/lib/module/specs/argon2.nitro.js.map +1 -0
  129. package/lib/module/specs/certificate.nitro.js +4 -0
  130. package/lib/module/specs/certificate.nitro.js.map +1 -0
  131. package/lib/module/specs/dhKeyPair.nitro.js +4 -0
  132. package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
  133. package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
  134. package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
  135. package/lib/module/specs/prime.nitro.js +4 -0
  136. package/lib/module/specs/prime.nitro.js.map +1 -0
  137. package/lib/module/subtle.js +183 -42
  138. package/lib/module/subtle.js.map +1 -1
  139. package/lib/module/utils/types.js.map +1 -1
  140. package/lib/tsconfig.tsbuildinfo +1 -1
  141. package/lib/typescript/argon2.d.ts +16 -0
  142. package/lib/typescript/argon2.d.ts.map +1 -0
  143. package/lib/typescript/certificate.d.ts +8 -0
  144. package/lib/typescript/certificate.d.ts.map +1 -0
  145. package/lib/typescript/cipher.d.ts +12 -0
  146. package/lib/typescript/cipher.d.ts.map +1 -1
  147. package/lib/typescript/dhKeyPair.d.ts +19 -0
  148. package/lib/typescript/dhKeyPair.d.ts.map +1 -0
  149. package/lib/typescript/diffie-hellman.d.ts +2 -0
  150. package/lib/typescript/diffie-hellman.d.ts.map +1 -1
  151. package/lib/typescript/dsa.d.ts +19 -0
  152. package/lib/typescript/dsa.d.ts.map +1 -0
  153. package/lib/typescript/ec.d.ts +1 -0
  154. package/lib/typescript/ec.d.ts.map +1 -1
  155. package/lib/typescript/ecdh.d.ts +3 -0
  156. package/lib/typescript/ecdh.d.ts.map +1 -1
  157. package/lib/typescript/ed.d.ts.map +1 -1
  158. package/lib/typescript/hash.d.ts +2 -0
  159. package/lib/typescript/hash.d.ts.map +1 -1
  160. package/lib/typescript/index.d.ts +22 -0
  161. package/lib/typescript/index.d.ts.map +1 -1
  162. package/lib/typescript/keys/classes.d.ts +4 -0
  163. package/lib/typescript/keys/classes.d.ts.map +1 -1
  164. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  165. package/lib/typescript/prime.d.ts +19 -0
  166. package/lib/typescript/prime.d.ts.map +1 -0
  167. package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
  168. package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
  169. package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
  170. package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
  171. package/lib/typescript/specs/cipher.nitro.d.ts +9 -0
  172. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -1
  173. package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
  174. package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
  175. package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
  176. package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
  177. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
  178. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
  179. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
  180. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
  181. package/lib/typescript/specs/ecdh.nitro.d.ts +1 -0
  182. package/lib/typescript/specs/ecdh.nitro.d.ts.map +1 -1
  183. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
  184. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  185. package/lib/typescript/specs/prime.nitro.d.ts +11 -0
  186. package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
  187. package/lib/typescript/subtle.d.ts +2 -0
  188. package/lib/typescript/subtle.d.ts.map +1 -1
  189. package/lib/typescript/utils/types.d.ts +24 -7
  190. package/lib/typescript/utils/types.d.ts.map +1 -1
  191. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +13 -5
  192. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  193. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +104 -54
  194. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  195. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
  196. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
  197. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  198. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  199. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
  200. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +104 -54
  201. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
  202. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
  203. package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
  204. package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
  205. package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
  206. package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
  207. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
  208. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
  209. package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
  210. package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
  211. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
  212. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
  213. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +2 -1
  214. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +5 -3
  215. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
  216. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
  217. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
  218. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
  219. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
  220. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
  221. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +2 -1
  222. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +3 -3
  223. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
  224. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
  225. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
  226. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
  227. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
  228. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
  229. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
  230. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
  231. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
  232. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
  233. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
  234. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
  235. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
  236. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
  237. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  238. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
  239. package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
  240. package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
  241. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  242. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
  243. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
  244. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
  245. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
  246. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
  247. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
  248. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
  249. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
  250. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
  251. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
  252. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
  253. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
  254. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
  255. package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
  256. package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
  257. package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
  258. package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
  259. package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
  260. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
  261. package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
  262. package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
  263. package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
  264. package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
  265. package/package.json +1 -1
  266. package/src/argon2.ts +83 -0
  267. package/src/certificate.ts +41 -0
  268. package/src/cipher.ts +24 -0
  269. package/src/dhKeyPair.ts +156 -0
  270. package/src/diffie-hellman.ts +6 -0
  271. package/src/dsa.ts +129 -0
  272. package/src/ec.ts +23 -19
  273. package/src/ecdh.ts +59 -0
  274. package/src/ed.ts +1 -2
  275. package/src/hash.ts +11 -0
  276. package/src/index.ts +12 -0
  277. package/src/keys/classes.ts +26 -8
  278. package/src/keys/generateKeyPair.ts +14 -0
  279. package/src/prime.ts +134 -0
  280. package/src/specs/argon2.nitro.ts +29 -0
  281. package/src/specs/certificate.nitro.ts +8 -0
  282. package/src/specs/cipher.nitro.ts +14 -0
  283. package/src/specs/dhKeyPair.nitro.ts +14 -0
  284. package/src/specs/diffie-hellman.nitro.ts +1 -0
  285. package/src/specs/dsaKeyPair.nitro.ts +13 -0
  286. package/src/specs/ecKeyPair.nitro.ts +2 -0
  287. package/src/specs/ecdh.nitro.ts +1 -0
  288. package/src/specs/keyObjectHandle.nitro.ts +2 -0
  289. package/src/specs/prime.nitro.ts +18 -0
  290. package/src/subtle.ts +400 -42
  291. package/src/utils/types.ts +39 -5
  292. package/deps/ncrypto/WORKSPACE +0 -15
package/src/subtle.ts CHANGED
@@ -14,10 +14,11 @@ import type {
14
14
  AesCtrParams,
15
15
  AesCbcParams,
16
16
  AesGcmParams,
17
+ AesOcbParams,
17
18
  RsaOaepParams,
18
19
  ChaCha20Poly1305Params,
19
20
  } from './utils';
20
- import { KFormatType, KeyEncoding } from './utils';
21
+ import { KFormatType, KeyEncoding, KeyType } from './utils';
21
22
  import {
22
23
  CryptoKey,
23
24
  KeyObject,
@@ -27,11 +28,12 @@ import {
27
28
  } from './keys';
28
29
  import type { CryptoKeyPair } from './utils/types';
29
30
  import { bufferLikeToArrayBuffer } from './utils/conversion';
31
+ import { argon2Sync } from './argon2';
30
32
  import { lazyDOMException } from './utils/errors';
31
33
  import { normalizeHashName, HashContext } from './utils/hashnames';
32
34
  import { validateMaxBufferLength } from './utils/validation';
33
35
  import { asyncDigest } from './hash';
34
- import { createSecretKey } from './keys';
36
+ import { createSecretKey, createPublicKey } from './keys';
35
37
  import { NitroModules } from 'react-native-nitro-modules';
36
38
  import type { KeyObjectHandle } from './specs/keyObjectHandle.nitro';
37
39
  import type { RsaCipher } from './specs/rsaCipher.nitro';
@@ -55,12 +57,6 @@ import {
55
57
  } from './ed';
56
58
  import { mldsa_generateKeyPairWebCrypto, type MlDsaVariant } from './mldsa';
57
59
  import { hkdfDeriveBits, type HkdfAlgorithm } from './hkdf';
58
- // import { pbkdf2DeriveBits } from './pbkdf2';
59
- // import { aesCipher, aesGenerateKey, aesImportKey, getAlgorithmName } from './aes';
60
- // import { rsaCipher, rsaExportKey, rsaImportKey, rsaKeyGenerate } from './rsa';
61
- // import { normalizeAlgorithm, type Operation } from './algorithms';
62
- // import { hmacImportKey } from './mac';
63
-
64
60
  // Temporary enums that need to be defined
65
61
 
66
62
  enum KWebCryptoKeyFormat {
@@ -90,19 +86,34 @@ function normalizeAlgorithm(
90
86
  }
91
87
 
92
88
  function getAlgorithmName(name: string, length: number): string {
93
- return `${name}${length}`;
89
+ switch (name) {
90
+ case 'AES-CBC':
91
+ return `A${length}CBC`;
92
+ case 'AES-CTR':
93
+ return `A${length}CTR`;
94
+ case 'AES-GCM':
95
+ return `A${length}GCM`;
96
+ case 'AES-KW':
97
+ return `A${length}KW`;
98
+ case 'AES-OCB':
99
+ return `A${length}OCB`;
100
+ case 'ChaCha20-Poly1305':
101
+ return 'C20P';
102
+ default:
103
+ return `${name}${length}`;
104
+ }
94
105
  }
95
106
 
96
107
  // Placeholder implementations for missing functions
97
108
  function ecExportKey(key: CryptoKey, format: KWebCryptoKeyFormat): ArrayBuffer {
98
109
  const keyObject = key.keyObject;
99
110
 
100
- if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI) {
101
- // Export public key in SPKI format
111
+ if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatRaw) {
112
+ return bufferLikeToArrayBuffer(keyObject.handle.exportKey());
113
+ } else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI) {
102
114
  const exported = keyObject.export({ format: 'der', type: 'spki' });
103
115
  return bufferLikeToArrayBuffer(exported);
104
116
  } else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8) {
105
- // Export private key in PKCS8 format
106
117
  const exported = keyObject.export({ format: 'der', type: 'pkcs8' });
107
118
  return bufferLikeToArrayBuffer(exported);
108
119
  } else {
@@ -198,6 +209,8 @@ async function aesCipher(
198
209
  return aesCbcCipher(mode, key, data, algorithm as AesCbcParams);
199
210
  case 'AES-GCM':
200
211
  return aesGcmCipher(mode, key, data, algorithm as AesGcmParams);
212
+ case 'AES-OCB':
213
+ return aesOcbCipher(mode, key, data, algorithm as AesOcbParams);
201
214
  default:
202
215
  throw lazyDOMException(
203
216
  `Unsupported AES algorithm: ${name}`,
@@ -294,45 +307,45 @@ async function aesCbcCipher(
294
307
  return result.buffer;
295
308
  }
296
309
 
297
- async function aesGcmCipher(
310
+ interface AeadCipherConfig {
311
+ algorithmName: string;
312
+ validTagLengths: number[];
313
+ cipherSuffix: string;
314
+ iv: ArrayBuffer;
315
+ }
316
+
317
+ async function aesAeadCipher(
298
318
  mode: CipherOrWrapMode,
299
319
  key: CryptoKey,
300
320
  data: ArrayBuffer,
301
- algorithm: AesGcmParams,
321
+ config: AeadCipherConfig,
322
+ additionalData?: BufferLike,
323
+ tagLength: number = 128,
302
324
  ): Promise<ArrayBuffer> {
303
- const { tagLength = 128 } = algorithm;
304
-
305
- // Validate tag length
306
- const validTagLengths = [32, 64, 96, 104, 112, 120, 128];
307
- if (!validTagLengths.includes(tagLength)) {
325
+ if (!config.validTagLengths.includes(tagLength)) {
308
326
  throw lazyDOMException(
309
- `${tagLength} is not a valid AES-GCM tag length`,
327
+ `${tagLength} is not a valid ${config.algorithmName} tag length`,
310
328
  'OperationError',
311
329
  );
312
330
  }
313
331
 
314
332
  const tagByteLength = tagLength / 8;
315
-
316
- // Get cipher type based on key length
317
333
  const keyLength = (key.algorithm as { length: number }).length;
318
- const cipherType = `aes-${keyLength}-gcm`;
334
+ const cipherType = `aes-${keyLength}-${config.cipherSuffix}`;
319
335
 
320
- // Create cipher
321
336
  const factory =
322
337
  NitroModules.createHybridObject<CipherFactory>('CipherFactory');
323
338
  const cipher = factory.createCipher({
324
339
  isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
325
340
  cipherType,
326
341
  cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
327
- iv: bufferLikeToArrayBuffer(algorithm.iv),
342
+ iv: config.iv,
328
343
  authTagLen: tagByteLength,
329
344
  });
330
345
 
331
346
  let processData: ArrayBuffer;
332
- let authTag: ArrayBuffer | undefined;
333
347
 
334
348
  if (mode === CipherOrWrapMode.kWebCryptoCipherDecrypt) {
335
- // For decryption, extract auth tag from end of data
336
349
  const dataView = new Uint8Array(data);
337
350
 
338
351
  if (dataView.byteLength < tagByteLength) {
@@ -342,28 +355,22 @@ async function aesGcmCipher(
342
355
  );
343
356
  }
344
357
 
345
- // Split data and tag
346
358
  const ciphertextLength = dataView.byteLength - tagByteLength;
347
359
  processData = dataView.slice(0, ciphertextLength).buffer;
348
- authTag = dataView.slice(ciphertextLength).buffer;
349
-
350
- // Set auth tag for verification
360
+ const authTag = dataView.slice(ciphertextLength).buffer;
351
361
  cipher.setAuthTag(authTag);
352
362
  } else {
353
363
  processData = data;
354
364
  }
355
365
 
356
- // Set additional authenticated data if provided
357
- if (algorithm.additionalData) {
358
- cipher.setAAD(bufferLikeToArrayBuffer(algorithm.additionalData));
366
+ if (additionalData) {
367
+ cipher.setAAD(bufferLikeToArrayBuffer(additionalData));
359
368
  }
360
369
 
361
- // Process data
362
370
  const updated = cipher.update(processData);
363
371
  const final = cipher.final();
364
372
 
365
373
  if (mode === CipherOrWrapMode.kWebCryptoCipherEncrypt) {
366
- // For encryption, append auth tag to result
367
374
  const tag = cipher.getAuthTag();
368
375
  const result = new Uint8Array(
369
376
  updated.byteLength + final.byteLength + tag.byteLength,
@@ -373,7 +380,6 @@ async function aesGcmCipher(
373
380
  result.set(new Uint8Array(tag), updated.byteLength + final.byteLength);
374
381
  return result.buffer;
375
382
  } else {
376
- // For decryption, just concatenate plaintext
377
383
  const result = new Uint8Array(updated.byteLength + final.byteLength);
378
384
  result.set(new Uint8Array(updated), 0);
379
385
  result.set(new Uint8Array(final), updated.byteLength);
@@ -381,6 +387,56 @@ async function aesGcmCipher(
381
387
  }
382
388
  }
383
389
 
390
+ async function aesGcmCipher(
391
+ mode: CipherOrWrapMode,
392
+ key: CryptoKey,
393
+ data: ArrayBuffer,
394
+ algorithm: AesGcmParams,
395
+ ): Promise<ArrayBuffer> {
396
+ return aesAeadCipher(
397
+ mode,
398
+ key,
399
+ data,
400
+ {
401
+ algorithmName: 'AES-GCM',
402
+ validTagLengths: [32, 64, 96, 104, 112, 120, 128],
403
+ cipherSuffix: 'gcm',
404
+ iv: bufferLikeToArrayBuffer(algorithm.iv),
405
+ },
406
+ algorithm.additionalData,
407
+ algorithm.tagLength,
408
+ );
409
+ }
410
+
411
+ async function aesOcbCipher(
412
+ mode: CipherOrWrapMode,
413
+ key: CryptoKey,
414
+ data: ArrayBuffer,
415
+ algorithm: AesOcbParams,
416
+ ): Promise<ArrayBuffer> {
417
+ const ivBuffer = bufferLikeToArrayBuffer(algorithm.iv);
418
+ if (ivBuffer.byteLength < 1 || ivBuffer.byteLength > 15) {
419
+ throw lazyDOMException(
420
+ 'AES-OCB algorithm.iv must be between 1 and 15 bytes',
421
+ 'OperationError',
422
+ );
423
+ }
424
+
425
+ return aesAeadCipher(
426
+ mode,
427
+ key,
428
+ data,
429
+ {
430
+ algorithmName: 'AES-OCB',
431
+ validTagLengths: [64, 96, 128],
432
+ cipherSuffix: 'ocb',
433
+ iv: ivBuffer,
434
+ },
435
+ algorithm.additionalData,
436
+ algorithm.tagLength,
437
+ );
438
+ }
439
+
384
440
  async function aesKwCipher(
385
441
  mode: CipherOrWrapMode,
386
442
  key: CryptoKey,
@@ -891,7 +947,7 @@ async function aesImportKey(
891
947
 
892
948
  function edImportKey(
893
949
  format: ImportFormat,
894
- data: BufferLike,
950
+ data: BufferLike | JWK,
895
951
  algorithm: SubtleAlgorithm,
896
952
  extractable: boolean,
897
953
  keyUsages: KeyUsage[],
@@ -915,7 +971,7 @@ function edImportKey(
915
971
 
916
972
  if (format === 'spki') {
917
973
  // Import public key
918
- const keyData = bufferLikeToArrayBuffer(data);
974
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
919
975
  keyObject = KeyObject.createKeyObject(
920
976
  'public',
921
977
  keyData,
@@ -924,7 +980,7 @@ function edImportKey(
924
980
  );
925
981
  } else if (format === 'pkcs8') {
926
982
  // Import private key
927
- const keyData = bufferLikeToArrayBuffer(data);
983
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
928
984
  keyObject = KeyObject.createKeyObject(
929
985
  'private',
930
986
  keyData,
@@ -933,13 +989,26 @@ function edImportKey(
933
989
  );
934
990
  } else if (format === 'raw') {
935
991
  // Raw format - public key only for Ed keys
936
- const keyData = bufferLikeToArrayBuffer(data);
992
+ const keyData = bufferLikeToArrayBuffer(data as BufferLike);
937
993
  const handle =
938
994
  NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
939
995
  // For raw Ed keys, we need to create them differently
940
996
  // Raw public keys are just the key bytes
941
997
  handle.init(1, keyData); // 1 = public key type
942
998
  keyObject = new PublicKeyObject(handle);
999
+ } else if (format === 'jwk') {
1000
+ const jwkData = data as JWK;
1001
+ const handle =
1002
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
1003
+ const keyType = handle.initJwk(jwkData);
1004
+ if (keyType === undefined) {
1005
+ throw lazyDOMException('Invalid JWK data', 'DataError');
1006
+ }
1007
+ if (keyType === KeyType.PRIVATE) {
1008
+ keyObject = new PrivateKeyObject(handle);
1009
+ } else {
1010
+ keyObject = new PublicKeyObject(handle);
1011
+ }
943
1012
  } else {
944
1013
  throw lazyDOMException(
945
1014
  `Unsupported format for ${name} import: ${format}`,
@@ -1133,6 +1202,8 @@ const exportKeyRaw = (key: CryptoKey): ArrayBuffer | unknown => {
1133
1202
  // Fall through
1134
1203
  case 'AES-KW':
1135
1204
  // Fall through
1205
+ case 'AES-OCB':
1206
+ // Fall through
1136
1207
  case 'ChaCha20-Poly1305':
1137
1208
  // Fall through
1138
1209
  case 'HMAC': {
@@ -1177,6 +1248,14 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
1177
1248
  case 'ECDH':
1178
1249
  jwk.crv ||= key.algorithm.namedCurve;
1179
1250
  return jwk;
1251
+ case 'Ed25519':
1252
+ // Fall through
1253
+ case 'Ed448':
1254
+ // Fall through
1255
+ case 'X25519':
1256
+ // Fall through
1257
+ case 'X448':
1258
+ return jwk;
1180
1259
  case 'AES-CTR':
1181
1260
  // Fall through
1182
1261
  case 'AES-CBC':
@@ -1185,6 +1264,8 @@ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
1185
1264
  // Fall through
1186
1265
  case 'AES-KW':
1187
1266
  // Fall through
1267
+ case 'AES-OCB':
1268
+ // Fall through
1188
1269
  case 'ChaCha20-Poly1305':
1189
1270
  if (key.algorithm.length === undefined) {
1190
1271
  throw lazyDOMException(
@@ -1278,6 +1359,45 @@ const checkCryptoKeyPairUsages = (pair: CryptoKeyPair) => {
1278
1359
  );
1279
1360
  };
1280
1361
 
1362
+ function argon2DeriveBits(
1363
+ algorithm: SubtleAlgorithm,
1364
+ baseKey: CryptoKey,
1365
+ length: number,
1366
+ ): ArrayBuffer {
1367
+ if (length === 0 || length % 8 !== 0) {
1368
+ throw lazyDOMException(
1369
+ 'Invalid Argon2 derived key length',
1370
+ 'OperationError',
1371
+ );
1372
+ }
1373
+ if (length < 32) {
1374
+ throw lazyDOMException(
1375
+ 'Argon2 derived key length must be at least 32 bits',
1376
+ 'OperationError',
1377
+ );
1378
+ }
1379
+
1380
+ const { nonce, parallelism, memory, passes, secretValue, associatedData } =
1381
+ algorithm;
1382
+ const tagLength = length / 8;
1383
+ const message = baseKey.keyObject.export();
1384
+ const algName = algorithm.name.toLowerCase();
1385
+
1386
+ const result = argon2Sync(algName, {
1387
+ message,
1388
+ nonce: nonce ?? new Uint8Array(0),
1389
+ parallelism: parallelism ?? 1,
1390
+ tagLength,
1391
+ memory: memory ?? 65536,
1392
+ passes: passes ?? 3,
1393
+ secret: secretValue,
1394
+ associatedData,
1395
+ version: algorithm.version,
1396
+ });
1397
+
1398
+ return bufferLikeToArrayBuffer(result);
1399
+ }
1400
+
1281
1401
  // Type guard to check if result is CryptoKeyPair
1282
1402
  export function isCryptoKeyPair(
1283
1403
  result: CryptoKey | CryptoKeyPair,
@@ -1503,6 +1623,8 @@ const cipherOrWrap = async (
1503
1623
  case 'AES-CBC':
1504
1624
  // Fall through
1505
1625
  case 'AES-GCM':
1626
+ // Fall through
1627
+ case 'AES-OCB':
1506
1628
  return aesCipher(mode, key, data, algorithm);
1507
1629
  case 'AES-KW':
1508
1630
  return aesKwCipher(mode, key, data);
@@ -1516,7 +1638,205 @@ const cipherOrWrap = async (
1516
1638
  }
1517
1639
  };
1518
1640
 
1641
+ const SUPPORTED_ALGORITHMS: Record<string, Set<string>> = {
1642
+ encrypt: new Set([
1643
+ 'RSA-OAEP',
1644
+ 'AES-CTR',
1645
+ 'AES-CBC',
1646
+ 'AES-GCM',
1647
+ 'AES-OCB',
1648
+ 'ChaCha20-Poly1305',
1649
+ ]),
1650
+ decrypt: new Set([
1651
+ 'RSA-OAEP',
1652
+ 'AES-CTR',
1653
+ 'AES-CBC',
1654
+ 'AES-GCM',
1655
+ 'AES-OCB',
1656
+ 'ChaCha20-Poly1305',
1657
+ ]),
1658
+ sign: new Set([
1659
+ 'RSASSA-PKCS1-v1_5',
1660
+ 'RSA-PSS',
1661
+ 'ECDSA',
1662
+ 'HMAC',
1663
+ 'Ed25519',
1664
+ 'Ed448',
1665
+ 'ML-DSA-44',
1666
+ 'ML-DSA-65',
1667
+ 'ML-DSA-87',
1668
+ ]),
1669
+ verify: new Set([
1670
+ 'RSASSA-PKCS1-v1_5',
1671
+ 'RSA-PSS',
1672
+ 'ECDSA',
1673
+ 'HMAC',
1674
+ 'Ed25519',
1675
+ 'Ed448',
1676
+ 'ML-DSA-44',
1677
+ 'ML-DSA-65',
1678
+ 'ML-DSA-87',
1679
+ ]),
1680
+ digest: new Set(['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512']),
1681
+ generateKey: new Set([
1682
+ 'RSASSA-PKCS1-v1_5',
1683
+ 'RSA-PSS',
1684
+ 'RSA-OAEP',
1685
+ 'ECDSA',
1686
+ 'ECDH',
1687
+ 'Ed25519',
1688
+ 'Ed448',
1689
+ 'X25519',
1690
+ 'X448',
1691
+ 'AES-CTR',
1692
+ 'AES-CBC',
1693
+ 'AES-GCM',
1694
+ 'AES-KW',
1695
+ 'AES-OCB',
1696
+ 'ChaCha20-Poly1305',
1697
+ 'HMAC',
1698
+ 'ML-DSA-44',
1699
+ 'ML-DSA-65',
1700
+ 'ML-DSA-87',
1701
+ ]),
1702
+ importKey: new Set([
1703
+ 'RSASSA-PKCS1-v1_5',
1704
+ 'RSA-PSS',
1705
+ 'RSA-OAEP',
1706
+ 'ECDSA',
1707
+ 'ECDH',
1708
+ 'Ed25519',
1709
+ 'Ed448',
1710
+ 'X25519',
1711
+ 'X448',
1712
+ 'AES-CTR',
1713
+ 'AES-CBC',
1714
+ 'AES-GCM',
1715
+ 'AES-KW',
1716
+ 'AES-OCB',
1717
+ 'ChaCha20-Poly1305',
1718
+ 'HMAC',
1719
+ 'HKDF',
1720
+ 'PBKDF2',
1721
+ 'Argon2d',
1722
+ 'Argon2i',
1723
+ 'Argon2id',
1724
+ 'ML-DSA-44',
1725
+ 'ML-DSA-65',
1726
+ 'ML-DSA-87',
1727
+ ]),
1728
+ exportKey: new Set([
1729
+ 'RSASSA-PKCS1-v1_5',
1730
+ 'RSA-PSS',
1731
+ 'RSA-OAEP',
1732
+ 'ECDSA',
1733
+ 'ECDH',
1734
+ 'Ed25519',
1735
+ 'Ed448',
1736
+ 'X25519',
1737
+ 'X448',
1738
+ 'AES-CTR',
1739
+ 'AES-CBC',
1740
+ 'AES-GCM',
1741
+ 'AES-KW',
1742
+ 'AES-OCB',
1743
+ 'ChaCha20-Poly1305',
1744
+ 'HMAC',
1745
+ 'ML-DSA-44',
1746
+ 'ML-DSA-65',
1747
+ 'ML-DSA-87',
1748
+ ]),
1749
+ deriveBits: new Set([
1750
+ 'PBKDF2',
1751
+ 'HKDF',
1752
+ 'ECDH',
1753
+ 'X25519',
1754
+ 'X448',
1755
+ 'Argon2d',
1756
+ 'Argon2i',
1757
+ 'Argon2id',
1758
+ ]),
1759
+ wrapKey: new Set([
1760
+ 'AES-CTR',
1761
+ 'AES-CBC',
1762
+ 'AES-GCM',
1763
+ 'AES-KW',
1764
+ 'AES-OCB',
1765
+ 'ChaCha20-Poly1305',
1766
+ 'RSA-OAEP',
1767
+ ]),
1768
+ unwrapKey: new Set([
1769
+ 'AES-CTR',
1770
+ 'AES-CBC',
1771
+ 'AES-GCM',
1772
+ 'AES-KW',
1773
+ 'AES-OCB',
1774
+ 'ChaCha20-Poly1305',
1775
+ 'RSA-OAEP',
1776
+ ]),
1777
+ };
1778
+
1779
+ const ASYMMETRIC_ALGORITHMS = new Set([
1780
+ 'RSASSA-PKCS1-v1_5',
1781
+ 'RSA-PSS',
1782
+ 'RSA-OAEP',
1783
+ 'ECDSA',
1784
+ 'ECDH',
1785
+ 'Ed25519',
1786
+ 'Ed448',
1787
+ 'X25519',
1788
+ 'X448',
1789
+ 'ML-DSA-44',
1790
+ 'ML-DSA-65',
1791
+ 'ML-DSA-87',
1792
+ ]);
1793
+
1519
1794
  export class Subtle {
1795
+ static supports(
1796
+ operation: string,
1797
+ algorithm: SubtleAlgorithm | AnyAlgorithm,
1798
+ _lengthOrAdditionalAlgorithm?: unknown,
1799
+ ): boolean {
1800
+ let normalizedAlgorithm: SubtleAlgorithm;
1801
+ try {
1802
+ normalizedAlgorithm = normalizeAlgorithm(
1803
+ algorithm,
1804
+ (operation === 'getPublicKey' ? 'exportKey' : operation) as Operation,
1805
+ );
1806
+ } catch {
1807
+ return false;
1808
+ }
1809
+
1810
+ const name = normalizedAlgorithm.name;
1811
+
1812
+ if (operation === 'getPublicKey') {
1813
+ return ASYMMETRIC_ALGORITHMS.has(name);
1814
+ }
1815
+
1816
+ if (operation === 'deriveKey') {
1817
+ // deriveKey decomposes to deriveBits + importKey of additional algorithm
1818
+ if (!SUPPORTED_ALGORITHMS.deriveBits?.has(name)) return false;
1819
+ if (_lengthOrAdditionalAlgorithm != null) {
1820
+ try {
1821
+ const additionalAlg = normalizeAlgorithm(
1822
+ _lengthOrAdditionalAlgorithm as SubtleAlgorithm | AnyAlgorithm,
1823
+ 'importKey',
1824
+ );
1825
+ return (
1826
+ SUPPORTED_ALGORITHMS.importKey?.has(additionalAlg.name) ?? false
1827
+ );
1828
+ } catch {
1829
+ return false;
1830
+ }
1831
+ }
1832
+ return true;
1833
+ }
1834
+
1835
+ const supported = SUPPORTED_ALGORITHMS[operation];
1836
+ if (!supported) return false;
1837
+ return supported.has(name);
1838
+ }
1839
+
1520
1840
  async decrypt(
1521
1841
  algorithm: EncryptDecryptParams,
1522
1842
  key: CryptoKey,
@@ -1572,6 +1892,10 @@ export class Subtle {
1572
1892
  baseKey,
1573
1893
  length,
1574
1894
  );
1895
+ case 'Argon2d':
1896
+ case 'Argon2i':
1897
+ case 'Argon2id':
1898
+ return argon2DeriveBits(algorithm, baseKey, length);
1575
1899
  }
1576
1900
  throw new Error(
1577
1901
  `'subtle.deriveBits()' for ${algorithm.name} is not implemented.`,
@@ -1613,6 +1937,9 @@ export class Subtle {
1613
1937
  case 'X448':
1614
1938
  derivedBits = await xDeriveBits(algorithm, baseKey, length);
1615
1939
  break;
1940
+ case 'ECDH':
1941
+ derivedBits = await ecDeriveBits(algorithm, baseKey, length);
1942
+ break;
1616
1943
  case 'HKDF':
1617
1944
  derivedBits = hkdfDeriveBits(
1618
1945
  algorithm as unknown as HkdfAlgorithm,
@@ -1620,6 +1947,11 @@ export class Subtle {
1620
1947
  length,
1621
1948
  );
1622
1949
  break;
1950
+ case 'Argon2d':
1951
+ case 'Argon2i':
1952
+ case 'Argon2id':
1953
+ derivedBits = argon2DeriveBits(algorithm, baseKey, length);
1954
+ break;
1623
1955
  default:
1624
1956
  throw new Error(
1625
1957
  `'subtle.deriveKey()' for ${algorithm.name} is not implemented.`,
@@ -1657,6 +1989,8 @@ export class Subtle {
1657
1989
  ): Promise<ArrayBuffer | JWK> {
1658
1990
  if (!key.extractable) throw new Error('key is not extractable');
1659
1991
 
1992
+ if (format === 'raw-secret' || format === 'raw-public') format = 'raw';
1993
+
1660
1994
  switch (format) {
1661
1995
  case 'spki':
1662
1996
  return (await exportKeySpki(key)) as ArrayBuffer;
@@ -1811,6 +2145,8 @@ export class Subtle {
1811
2145
  case 'AES-GCM':
1812
2146
  // Fall through
1813
2147
  case 'AES-KW':
2148
+ // Fall through
2149
+ case 'AES-OCB':
1814
2150
  result = await aesGenerateKey(
1815
2151
  algorithm as AesKeyGenParams,
1816
2152
  extractable,
@@ -1882,6 +2218,21 @@ export class Subtle {
1882
2218
  return result;
1883
2219
  }
1884
2220
 
2221
+ async getPublicKey(
2222
+ key: CryptoKey,
2223
+ keyUsages: KeyUsage[],
2224
+ ): Promise<CryptoKey> {
2225
+ if (key.type === 'secret') {
2226
+ throw lazyDOMException('key must be a private key', 'NotSupportedError');
2227
+ }
2228
+ if (key.type !== 'private') {
2229
+ throw lazyDOMException('key must be a private key', 'InvalidAccessError');
2230
+ }
2231
+
2232
+ const publicKeyObject = createPublicKey(key.keyObject);
2233
+ return publicKeyObject.toCryptoKey(key.algorithm, true, keyUsages);
2234
+ }
2235
+
1885
2236
  async importKey(
1886
2237
  format: ImportFormat,
1887
2238
  data: BufferLike | BinaryLike | JWK,
@@ -1889,6 +2240,7 @@ export class Subtle {
1889
2240
  extractable: boolean,
1890
2241
  keyUsages: KeyUsage[],
1891
2242
  ): Promise<CryptoKey> {
2243
+ if (format === 'raw-secret' || format === 'raw-public') format = 'raw';
1892
2244
  const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'importKey');
1893
2245
  let result: CryptoKey;
1894
2246
  switch (normalizedAlgorithm.name) {
@@ -1933,6 +2285,8 @@ export class Subtle {
1933
2285
  // Fall through
1934
2286
  case 'AES-KW':
1935
2287
  // Fall through
2288
+ case 'AES-OCB':
2289
+ // Fall through
1936
2290
  case 'ChaCha20-Poly1305':
1937
2291
  result = await aesImportKey(
1938
2292
  normalizedAlgorithm,
@@ -1943,6 +2297,9 @@ export class Subtle {
1943
2297
  );
1944
2298
  break;
1945
2299
  case 'PBKDF2':
2300
+ case 'Argon2d':
2301
+ case 'Argon2i':
2302
+ case 'Argon2id':
1946
2303
  result = await importGenericSecretKey(
1947
2304
  normalizedAlgorithm,
1948
2305
  format,
@@ -1969,7 +2326,7 @@ export class Subtle {
1969
2326
  case 'Ed448':
1970
2327
  result = edImportKey(
1971
2328
  format,
1972
- data as BufferLike,
2329
+ data as BufferLike | JWK,
1973
2330
  normalizedAlgorithm,
1974
2331
  extractable,
1975
2332
  keyUsages,
@@ -2121,6 +2478,7 @@ function getKeyLength(algorithm: SubtleAlgorithm): number {
2121
2478
  case 'AES-CBC':
2122
2479
  case 'AES-GCM':
2123
2480
  case 'AES-KW':
2481
+ case 'AES-OCB':
2124
2482
  case 'ChaCha20-Poly1305':
2125
2483
  return (algorithm as AesKeyGenParams).length || 256;
2126
2484