react-native-quick-crypto 1.0.0-beta.8 → 1.0.0

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 (480) hide show
  1. package/QuickCrypto.podspec +145 -6
  2. package/README.md +14 -27
  3. package/android/CMakeLists.txt +62 -7
  4. package/android/build.gradle +12 -2
  5. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +0 -2
  6. package/app.plugin.js +3 -0
  7. package/cpp/blake3/HybridBlake3.cpp +118 -0
  8. package/cpp/blake3/HybridBlake3.hpp +35 -0
  9. package/cpp/cipher/CCMCipher.cpp +199 -0
  10. package/cpp/cipher/CCMCipher.hpp +26 -0
  11. package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
  12. package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
  13. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
  14. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
  15. package/cpp/cipher/GCMCipher.cpp +68 -0
  16. package/cpp/cipher/GCMCipher.hpp +14 -0
  17. package/cpp/cipher/HybridCipher.cpp +322 -0
  18. package/cpp/cipher/HybridCipher.hpp +68 -0
  19. package/cpp/cipher/HybridCipherFactory.hpp +105 -0
  20. package/cpp/cipher/HybridRsaCipher.cpp +348 -0
  21. package/cpp/cipher/HybridRsaCipher.hpp +29 -0
  22. package/cpp/cipher/OCBCipher.cpp +55 -0
  23. package/cpp/cipher/OCBCipher.hpp +19 -0
  24. package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
  25. package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
  26. package/cpp/ec/HybridEcKeyPair.cpp +428 -0
  27. package/cpp/ec/HybridEcKeyPair.hpp +48 -0
  28. package/cpp/ed25519/HybridEdKeyPair.cpp +228 -98
  29. package/cpp/ed25519/HybridEdKeyPair.hpp +42 -56
  30. package/cpp/hash/HybridHash.cpp +185 -0
  31. package/cpp/hash/HybridHash.hpp +43 -0
  32. package/cpp/hmac/HybridHmac.cpp +95 -0
  33. package/cpp/hmac/HybridHmac.hpp +31 -0
  34. package/cpp/keys/HybridKeyObjectHandle.cpp +749 -0
  35. package/cpp/keys/HybridKeyObjectHandle.hpp +51 -0
  36. package/cpp/keys/KeyObjectData.cpp +268 -0
  37. package/cpp/keys/KeyObjectData.hpp +71 -0
  38. package/cpp/keys/node.h +5 -0
  39. package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
  40. package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
  41. package/cpp/random/HybridRandom.cpp +6 -17
  42. package/cpp/random/HybridRandom.hpp +5 -6
  43. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  44. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  45. package/cpp/sign/HybridSignHandle.cpp +191 -0
  46. package/cpp/sign/HybridSignHandle.hpp +36 -0
  47. package/cpp/sign/HybridVerifyHandle.cpp +158 -0
  48. package/cpp/sign/HybridVerifyHandle.hpp +36 -0
  49. package/cpp/sign/SignUtils.hpp +108 -0
  50. package/cpp/utils/Macros.hpp +68 -0
  51. package/cpp/utils/Utils.hpp +43 -2
  52. package/cpp/utils/base64.h +309 -0
  53. package/deps/blake3/.cargo/config.toml +2 -0
  54. package/deps/blake3/.git-blame-ignore-revs +2 -0
  55. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  56. package/deps/blake3/.github/workflows/ci.yml +491 -0
  57. package/deps/blake3/.github/workflows/tag.yml +43 -0
  58. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  59. package/deps/blake3/CONTRIBUTING.md +31 -0
  60. package/deps/blake3/Cargo.toml +135 -0
  61. package/deps/blake3/LICENSE_A2 +202 -0
  62. package/deps/blake3/LICENSE_A2LLVM +219 -0
  63. package/deps/blake3/LICENSE_CC0 +121 -0
  64. package/deps/blake3/README.md +229 -0
  65. package/deps/blake3/b3sum/Cargo.lock +513 -0
  66. package/deps/blake3/b3sum/Cargo.toml +26 -0
  67. package/deps/blake3/b3sum/README.md +72 -0
  68. package/deps/blake3/b3sum/src/main.rs +564 -0
  69. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  70. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  71. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  72. package/deps/blake3/benches/bench.rs +623 -0
  73. package/deps/blake3/build.rs +389 -0
  74. package/deps/blake3/c/CMakeLists.txt +383 -0
  75. package/deps/blake3/c/CMakePresets.json +73 -0
  76. package/deps/blake3/c/Makefile.testing +82 -0
  77. package/deps/blake3/c/README.md +403 -0
  78. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  79. package/deps/blake3/c/blake3.c +650 -0
  80. package/deps/blake3/c/blake3.h +86 -0
  81. package/deps/blake3/c/blake3_avx2.c +326 -0
  82. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  83. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  84. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  85. package/deps/blake3/c/blake3_avx512.c +1388 -0
  86. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  87. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  88. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  89. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  90. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  91. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  92. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  93. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  94. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  95. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  96. package/deps/blake3/c/blake3_dispatch.c +332 -0
  97. package/deps/blake3/c/blake3_impl.h +333 -0
  98. package/deps/blake3/c/blake3_neon.c +366 -0
  99. package/deps/blake3/c/blake3_portable.c +160 -0
  100. package/deps/blake3/c/blake3_sse2.c +566 -0
  101. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  102. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  103. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  104. package/deps/blake3/c/blake3_sse41.c +560 -0
  105. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  106. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  107. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  108. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  109. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  110. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  111. package/deps/blake3/c/example.c +36 -0
  112. package/deps/blake3/c/example_tbb.c +57 -0
  113. package/deps/blake3/c/libblake3.pc.in +12 -0
  114. package/deps/blake3/c/main.c +166 -0
  115. package/deps/blake3/c/test.py +97 -0
  116. package/deps/blake3/media/B3.svg +70 -0
  117. package/deps/blake3/media/BLAKE3.svg +85 -0
  118. package/deps/blake3/media/speed.svg +1474 -0
  119. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  120. package/deps/blake3/reference_impl/README.md +14 -0
  121. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  122. package/deps/blake3/src/ffi_avx2.rs +65 -0
  123. package/deps/blake3/src/ffi_avx512.rs +169 -0
  124. package/deps/blake3/src/ffi_neon.rs +82 -0
  125. package/deps/blake3/src/ffi_sse2.rs +126 -0
  126. package/deps/blake3/src/ffi_sse41.rs +126 -0
  127. package/deps/blake3/src/guts.rs +60 -0
  128. package/deps/blake3/src/hazmat.rs +704 -0
  129. package/deps/blake3/src/io.rs +64 -0
  130. package/deps/blake3/src/join.rs +92 -0
  131. package/deps/blake3/src/lib.rs +1835 -0
  132. package/deps/blake3/src/platform.rs +587 -0
  133. package/deps/blake3/src/portable.rs +198 -0
  134. package/deps/blake3/src/rust_avx2.rs +474 -0
  135. package/deps/blake3/src/rust_sse2.rs +775 -0
  136. package/deps/blake3/src/rust_sse41.rs +766 -0
  137. package/deps/blake3/src/test.rs +1049 -0
  138. package/deps/blake3/src/traits.rs +227 -0
  139. package/deps/blake3/src/wasm32_simd.rs +794 -0
  140. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  141. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  142. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  143. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  144. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  145. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  146. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  147. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  148. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  149. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  150. package/deps/blake3/tools/release.md +16 -0
  151. package/deps/fastpbkdf2/fastpbkdf2.c +5 -1
  152. package/deps/ncrypto/ncrypto.cc +4679 -0
  153. package/deps/ncrypto/ncrypto.h +1625 -0
  154. package/lib/commonjs/blake3.js +98 -0
  155. package/lib/commonjs/blake3.js.map +1 -0
  156. package/lib/commonjs/cipher.js +180 -0
  157. package/lib/commonjs/cipher.js.map +1 -0
  158. package/lib/commonjs/constants.js +32 -0
  159. package/lib/commonjs/constants.js.map +1 -0
  160. package/lib/commonjs/ec.js +480 -0
  161. package/lib/commonjs/ec.js.map +1 -0
  162. package/lib/commonjs/ed.js +214 -2
  163. package/lib/commonjs/ed.js.map +1 -1
  164. package/lib/commonjs/expo-plugin/@types.js +2 -0
  165. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  166. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  167. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  168. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  169. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  170. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  171. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  172. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  173. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  174. package/lib/commonjs/hash.js +215 -0
  175. package/lib/commonjs/hash.js.map +1 -0
  176. package/lib/commonjs/hmac.js +109 -0
  177. package/lib/commonjs/hmac.js.map +1 -0
  178. package/lib/commonjs/index.js +102 -24
  179. package/lib/commonjs/index.js.map +1 -1
  180. package/lib/commonjs/keys/classes.js +109 -52
  181. package/lib/commonjs/keys/classes.js.map +1 -1
  182. package/lib/commonjs/keys/generateKeyPair.js +141 -144
  183. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  184. package/lib/commonjs/keys/index.js +229 -0
  185. package/lib/commonjs/keys/index.js.map +1 -1
  186. package/lib/commonjs/keys/publicCipher.js +152 -0
  187. package/lib/commonjs/keys/publicCipher.js.map +1 -0
  188. package/lib/commonjs/keys/signVerify.js +178 -39
  189. package/lib/commonjs/keys/signVerify.js.map +1 -1
  190. package/lib/commonjs/keys/utils.js +18 -13
  191. package/lib/commonjs/keys/utils.js.map +1 -1
  192. package/lib/commonjs/pbkdf2.js.map +1 -1
  193. package/lib/commonjs/random.js +6 -0
  194. package/lib/commonjs/random.js.map +1 -1
  195. package/lib/commonjs/rsa.js +202 -0
  196. package/lib/commonjs/rsa.js.map +1 -0
  197. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  198. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  199. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  200. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  201. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  202. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  203. package/lib/commonjs/specs/hash.nitro.js +6 -0
  204. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  205. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  206. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  207. package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
  208. package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
  209. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  210. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  211. package/lib/commonjs/specs/sign.nitro.js +6 -0
  212. package/lib/commonjs/specs/sign.nitro.js.map +1 -0
  213. package/lib/commonjs/subtle.js +987 -0
  214. package/lib/commonjs/subtle.js.map +1 -0
  215. package/lib/commonjs/utils/cipher.js +64 -0
  216. package/lib/commonjs/utils/cipher.js.map +1 -0
  217. package/lib/commonjs/utils/conversion.js +44 -5
  218. package/lib/commonjs/utils/conversion.js.map +1 -1
  219. package/lib/commonjs/utils/hashnames.js +2 -1
  220. package/lib/commonjs/utils/hashnames.js.map +1 -1
  221. package/lib/commonjs/utils/index.js +11 -0
  222. package/lib/commonjs/utils/index.js.map +1 -1
  223. package/lib/commonjs/utils/noble.js +82 -0
  224. package/lib/commonjs/utils/noble.js.map +1 -0
  225. package/lib/commonjs/utils/types.js +32 -17
  226. package/lib/commonjs/utils/types.js.map +1 -1
  227. package/lib/commonjs/utils/validation.js +74 -1
  228. package/lib/commonjs/utils/validation.js.map +1 -1
  229. package/lib/module/blake3.js +90 -0
  230. package/lib/module/blake3.js.map +1 -0
  231. package/lib/module/cipher.js +173 -0
  232. package/lib/module/cipher.js.map +1 -0
  233. package/lib/module/constants.js +28 -0
  234. package/lib/module/constants.js.map +1 -0
  235. package/lib/module/ec.js +470 -0
  236. package/lib/module/ec.js.map +1 -0
  237. package/lib/module/ed.js +212 -3
  238. package/lib/module/ed.js.map +1 -1
  239. package/lib/module/expo-plugin/@types.js +2 -0
  240. package/lib/module/expo-plugin/@types.js.map +1 -0
  241. package/lib/module/expo-plugin/withRNQC.js +21 -0
  242. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  243. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  244. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  245. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  246. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  247. package/lib/module/expo-plugin/withXCode.js +46 -0
  248. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  249. package/lib/module/hash.js +207 -0
  250. package/lib/module/hash.js.map +1 -0
  251. package/lib/module/hmac.js +104 -0
  252. package/lib/module/hmac.js.map +1 -0
  253. package/lib/module/index.js +21 -21
  254. package/lib/module/index.js.map +1 -1
  255. package/lib/module/keys/classes.js +106 -49
  256. package/lib/module/keys/classes.js.map +1 -1
  257. package/lib/module/keys/generateKeyPair.js +134 -143
  258. package/lib/module/keys/generateKeyPair.js.map +1 -1
  259. package/lib/module/keys/index.js +161 -22
  260. package/lib/module/keys/index.js.map +1 -1
  261. package/lib/module/keys/publicCipher.js +145 -0
  262. package/lib/module/keys/publicCipher.js.map +1 -0
  263. package/lib/module/keys/signVerify.js +170 -39
  264. package/lib/module/keys/signVerify.js.map +1 -1
  265. package/lib/module/keys/utils.js +16 -12
  266. package/lib/module/keys/utils.js.map +1 -1
  267. package/lib/module/pbkdf2.js.map +1 -1
  268. package/lib/module/random.js +6 -0
  269. package/lib/module/random.js.map +1 -1
  270. package/lib/module/rsa.js +194 -0
  271. package/lib/module/rsa.js.map +1 -0
  272. package/lib/module/specs/blake3.nitro.js +4 -0
  273. package/lib/module/specs/blake3.nitro.js.map +1 -0
  274. package/lib/module/specs/cipher.nitro.js +4 -0
  275. package/lib/module/specs/cipher.nitro.js.map +1 -0
  276. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  277. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  278. package/lib/module/specs/hash.nitro.js +4 -0
  279. package/lib/module/specs/hash.nitro.js.map +1 -0
  280. package/lib/module/specs/hmac.nitro.js +4 -0
  281. package/lib/module/specs/hmac.nitro.js.map +1 -0
  282. package/lib/module/specs/rsaCipher.nitro.js +4 -0
  283. package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
  284. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  285. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  286. package/lib/module/specs/sign.nitro.js +4 -0
  287. package/lib/module/specs/sign.nitro.js.map +1 -0
  288. package/lib/module/subtle.js +982 -0
  289. package/lib/module/subtle.js.map +1 -0
  290. package/lib/module/utils/cipher.js +56 -0
  291. package/lib/module/utils/cipher.js.map +1 -0
  292. package/lib/module/utils/conversion.js +26 -5
  293. package/lib/module/utils/conversion.js.map +1 -1
  294. package/lib/module/utils/hashnames.js +2 -1
  295. package/lib/module/utils/hashnames.js.map +1 -1
  296. package/lib/module/utils/index.js +1 -0
  297. package/lib/module/utils/index.js.map +1 -1
  298. package/lib/module/utils/noble.js +76 -0
  299. package/lib/module/utils/noble.js.map +1 -0
  300. package/lib/module/utils/types.js +32 -17
  301. package/lib/module/utils/types.js.map +1 -1
  302. package/lib/module/utils/validation.js +69 -1
  303. package/lib/module/utils/validation.js.map +1 -1
  304. package/lib/tsconfig.tsbuildinfo +1 -1
  305. package/lib/typescript/blake3.d.ts +33 -0
  306. package/lib/typescript/blake3.d.ts.map +1 -0
  307. package/lib/typescript/cipher.d.ts +60 -0
  308. package/lib/typescript/cipher.d.ts.map +1 -0
  309. package/lib/typescript/constants.d.ts +21 -0
  310. package/lib/typescript/constants.d.ts.map +1 -0
  311. package/lib/typescript/ec.d.ts +22 -0
  312. package/lib/typescript/ec.d.ts.map +1 -0
  313. package/lib/typescript/ed.d.ts +28 -1
  314. package/lib/typescript/ed.d.ts.map +1 -1
  315. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  316. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  317. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  318. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  319. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  320. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  321. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  322. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  323. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  324. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  325. package/lib/typescript/hash.d.ts +122 -0
  326. package/lib/typescript/hash.d.ts.map +1 -0
  327. package/lib/typescript/hmac.d.ts +66 -0
  328. package/lib/typescript/hmac.d.ts.map +1 -0
  329. package/lib/typescript/index.d.ts +102 -10
  330. package/lib/typescript/index.d.ts.map +1 -1
  331. package/lib/typescript/keys/classes.d.ts +50 -8
  332. package/lib/typescript/keys/classes.d.ts.map +1 -1
  333. package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
  334. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  335. package/lib/typescript/keys/index.d.ts +22 -2
  336. package/lib/typescript/keys/index.d.ts.map +1 -1
  337. package/lib/typescript/keys/publicCipher.d.ts +20 -0
  338. package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
  339. package/lib/typescript/keys/signVerify.d.ts +28 -0
  340. package/lib/typescript/keys/signVerify.d.ts.map +1 -1
  341. package/lib/typescript/keys/utils.d.ts +3 -1
  342. package/lib/typescript/keys/utils.d.ts.map +1 -1
  343. package/lib/typescript/pbkdf2.d.ts +1 -1
  344. package/lib/typescript/pbkdf2.d.ts.map +1 -1
  345. package/lib/typescript/random.d.ts +6 -0
  346. package/lib/typescript/random.d.ts.map +1 -1
  347. package/lib/typescript/rsa.d.ts +19 -0
  348. package/lib/typescript/rsa.d.ts.map +1 -0
  349. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  350. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  351. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  352. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  353. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  354. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  355. package/lib/typescript/specs/edKeyPair.nitro.d.ts +1 -0
  356. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
  357. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  358. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  359. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  360. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  361. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -1
  362. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  363. package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
  364. package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
  365. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  366. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  367. package/lib/typescript/specs/sign.nitro.d.ts +19 -0
  368. package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
  369. package/lib/typescript/subtle.d.ts +17 -0
  370. package/lib/typescript/subtle.d.ts.map +1 -0
  371. package/lib/typescript/utils/cipher.d.ts +7 -0
  372. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  373. package/lib/typescript/utils/conversion.d.ts +1 -0
  374. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  375. package/lib/typescript/utils/hashnames.d.ts +3 -1
  376. package/lib/typescript/utils/hashnames.d.ts.map +1 -1
  377. package/lib/typescript/utils/index.d.ts +1 -0
  378. package/lib/typescript/utils/index.d.ts.map +1 -1
  379. package/lib/typescript/utils/noble.d.ts +19 -0
  380. package/lib/typescript/utils/noble.d.ts.map +1 -0
  381. package/lib/typescript/utils/types.d.ts +125 -23
  382. package/lib/typescript/utils/types.d.ts.map +1 -1
  383. package/lib/typescript/utils/validation.d.ts +5 -0
  384. package/lib/typescript/utils/validation.d.ts.map +1 -1
  385. package/nitrogen/generated/.gitattributes +1 -0
  386. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +30 -1
  387. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  388. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +115 -1
  389. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  390. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  391. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
  392. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  393. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  394. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +3 -3
  395. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +111 -1
  396. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
  397. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +104 -0
  398. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  399. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  400. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  401. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  402. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  403. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  404. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  405. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  406. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  407. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +2 -1
  408. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
  409. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  410. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  411. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  412. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  413. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -1
  414. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
  415. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  416. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
  417. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  418. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
  419. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
  420. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
  421. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  422. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  423. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
  424. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
  425. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
  426. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
  427. package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
  428. package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
  429. package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
  430. package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
  431. package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
  432. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
  433. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  434. package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
  435. package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
  436. package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
  437. package/package.json +28 -23
  438. package/src/blake3.ts +123 -0
  439. package/src/cipher.ts +335 -0
  440. package/src/constants.ts +32 -0
  441. package/src/ec.ts +657 -0
  442. package/src/ed.ts +297 -13
  443. package/src/expo-plugin/@types.ts +7 -0
  444. package/src/expo-plugin/withRNQC.ts +23 -0
  445. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  446. package/src/expo-plugin/withSodiumIos.ts +30 -0
  447. package/src/expo-plugin/withXCode.ts +55 -0
  448. package/src/hash.ts +274 -0
  449. package/src/hmac.ts +135 -0
  450. package/src/index.ts +20 -20
  451. package/src/keys/classes.ts +148 -55
  452. package/src/keys/generateKeyPair.ts +177 -134
  453. package/src/keys/index.ts +226 -14
  454. package/src/keys/publicCipher.ts +229 -0
  455. package/src/keys/signVerify.ts +239 -39
  456. package/src/keys/utils.ts +24 -18
  457. package/src/pbkdf2.ts +1 -1
  458. package/src/random.ts +7 -0
  459. package/src/rsa.ts +310 -0
  460. package/src/specs/blake3.nitro.ts +12 -0
  461. package/src/specs/cipher.nitro.ts +25 -0
  462. package/src/specs/ecKeyPair.nitro.ts +38 -0
  463. package/src/specs/edKeyPair.nitro.ts +2 -0
  464. package/src/specs/hash.nitro.ts +10 -0
  465. package/src/specs/hmac.nitro.ts +7 -0
  466. package/src/specs/keyObjectHandle.nitro.ts +1 -1
  467. package/src/specs/rsaCipher.nitro.ts +65 -0
  468. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  469. package/src/specs/sign.nitro.ts +31 -0
  470. package/src/subtle.ts +1436 -0
  471. package/src/utils/cipher.ts +60 -0
  472. package/src/utils/conversion.ts +33 -4
  473. package/src/utils/hashnames.ts +4 -2
  474. package/src/utils/index.ts +1 -0
  475. package/src/utils/noble.ts +85 -0
  476. package/src/utils/types.ts +209 -29
  477. package/src/utils/validation.ts +96 -1
  478. package/lib/module/package.json +0 -1
  479. package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
  480. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
package/src/ec.ts ADDED
@@ -0,0 +1,657 @@
1
+ import { NitroModules } from 'react-native-nitro-modules';
2
+ import type { EcKeyPair } from './specs/ecKeyPair.nitro';
3
+ import type { KeyObjectHandle } from './specs/keyObjectHandle.nitro';
4
+ import {
5
+ CryptoKey,
6
+ KeyObject,
7
+ PublicKeyObject,
8
+ PrivateKeyObject,
9
+ } from './keys';
10
+ import type {
11
+ CryptoKeyPair,
12
+ KeyPairOptions,
13
+ KeyUsage,
14
+ SubtleAlgorithm,
15
+ BufferLike,
16
+ BinaryLike,
17
+ JWK,
18
+ ImportFormat,
19
+ NamedCurve,
20
+ GenerateKeyPairOptions,
21
+ KeyPairGenConfig,
22
+ } from './utils/types';
23
+ import {
24
+ bufferLikeToArrayBuffer,
25
+ getUsagesUnion,
26
+ hasAnyNotIn,
27
+ kNamedCurveAliases,
28
+ lazyDOMException,
29
+ normalizeHashName,
30
+ HashContext,
31
+ KeyEncoding,
32
+ KFormatType,
33
+ } from './utils';
34
+ import { Buffer } from 'buffer';
35
+
36
+ export class Ec {
37
+ native: EcKeyPair;
38
+
39
+ constructor(curve: string) {
40
+ this.native = NitroModules.createHybridObject<EcKeyPair>('EcKeyPair');
41
+ this.native.setCurve(curve);
42
+ }
43
+
44
+ async generateKeyPair(): Promise<CryptoKeyPair> {
45
+ await this.native.generateKeyPair();
46
+ return {
47
+ publicKey: this.native.getPublicKey(),
48
+ privateKey: this.native.getPrivateKey(),
49
+ };
50
+ }
51
+
52
+ generateKeyPairSync(): CryptoKeyPair {
53
+ this.native.generateKeyPairSync();
54
+ return {
55
+ publicKey: this.native.getPublicKey(),
56
+ privateKey: this.native.getPrivateKey(),
57
+ };
58
+ }
59
+ }
60
+
61
+ // function verifyAcceptableEcKeyUse(
62
+ // name: AnyAlgorithm,
63
+ // isPublic: boolean,
64
+ // usages: KeyUsage[],
65
+ // ): void {
66
+ // let checkSet;
67
+ // switch (name) {
68
+ // case 'ECDH':
69
+ // checkSet = isPublic ? [] : ['deriveKey', 'deriveBits'];
70
+ // break;
71
+ // case 'ECDSA':
72
+ // checkSet = isPublic ? ['verify'] : ['sign'];
73
+ // break;
74
+ // default:
75
+ // throw lazyDOMException(
76
+ // 'The algorithm is not supported',
77
+ // 'NotSupportedError',
78
+ // );
79
+ // }
80
+ // if (hasAnyNotIn(usages, checkSet)) {
81
+ // throw lazyDOMException(
82
+ // `Unsupported key usage for a ${name} key`,
83
+ // 'SyntaxError',
84
+ // );
85
+ // }
86
+ // }
87
+
88
+ // function createECPublicKeyRaw(
89
+ // namedCurve: NamedCurve | undefined,
90
+ // keyDataBuffer: ArrayBuffer,
91
+ // ): PublicKeyObject {
92
+ // if (!namedCurve) {
93
+ // throw new Error('Invalid namedCurve');
94
+ // }
95
+ // const handle = NitroModules.createHybridObject(
96
+ // 'KeyObjectHandle',
97
+ // ) as KeyObjectHandle;
98
+
99
+ // if (!handle.initECRaw(kNamedCurveAliases[namedCurve], keyDataBuffer)) {
100
+ // console.log('keyData', ab2str(keyDataBuffer));
101
+ // throw new Error('Invalid keyData 1');
102
+ // }
103
+
104
+ // return new PublicKeyObject(handle);
105
+ // }
106
+
107
+ // // Node API
108
+ // export function ec_exportKey(key: CryptoKey, format: KeyFormat): ArrayBuffer {
109
+ // return ec.native.exportKey(format, key.keyObject.handle);
110
+ // }
111
+
112
+ // Node API
113
+ export function ecImportKey(
114
+ format: ImportFormat,
115
+ keyData: BufferLike | BinaryLike | JWK,
116
+ algorithm: SubtleAlgorithm,
117
+ extractable: boolean,
118
+ keyUsages: KeyUsage[],
119
+ ): CryptoKey {
120
+ const { name, namedCurve } = algorithm;
121
+
122
+ if (
123
+ !namedCurve ||
124
+ !kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases]
125
+ ) {
126
+ throw lazyDOMException('Unrecognized namedCurve', 'NotSupportedError');
127
+ }
128
+
129
+ // Handle JWK format
130
+ if (format === 'jwk') {
131
+ const jwk = keyData as JWK;
132
+
133
+ // Validate JWK
134
+ if (jwk.kty !== 'EC') {
135
+ throw lazyDOMException('Invalid JWK "kty" Parameter', 'DataError');
136
+ }
137
+
138
+ if (jwk.crv !== namedCurve) {
139
+ throw lazyDOMException(
140
+ 'JWK "crv" does not match the requested algorithm',
141
+ 'DataError',
142
+ );
143
+ }
144
+
145
+ // Check use parameter if present
146
+ if (jwk.use !== undefined) {
147
+ const expectedUse = name === 'ECDH' ? 'enc' : 'sig';
148
+ if (jwk.use !== expectedUse) {
149
+ throw lazyDOMException('Invalid JWK "use" Parameter', 'DataError');
150
+ }
151
+ }
152
+
153
+ // Check alg parameter if present
154
+ if (jwk.alg !== undefined) {
155
+ let expectedAlg: string | undefined;
156
+
157
+ if (name === 'ECDSA') {
158
+ // Map namedCurve to expected ECDSA algorithm
159
+ expectedAlg =
160
+ namedCurve === 'P-256'
161
+ ? 'ES256'
162
+ : namedCurve === 'P-384'
163
+ ? 'ES384'
164
+ : namedCurve === 'P-521'
165
+ ? 'ES512'
166
+ : undefined;
167
+ } else if (name === 'ECDH') {
168
+ // ECDH uses ECDH-ES algorithm
169
+ expectedAlg = 'ECDH-ES';
170
+ }
171
+
172
+ if (expectedAlg && jwk.alg !== expectedAlg) {
173
+ throw lazyDOMException(
174
+ 'JWK "alg" does not match the requested algorithm',
175
+ 'DataError',
176
+ );
177
+ }
178
+ }
179
+
180
+ // Import using C++ layer
181
+ const handle =
182
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
183
+ const keyType = handle.initJwk(jwk, namedCurve as NamedCurve);
184
+
185
+ if (keyType === undefined) {
186
+ throw lazyDOMException('Invalid JWK', 'DataError');
187
+ }
188
+
189
+ // Create the appropriate KeyObject based on type
190
+ let keyObject: KeyObject;
191
+ if (keyType === 1) {
192
+ keyObject = new PublicKeyObject(handle);
193
+ } else if (keyType === 2) {
194
+ keyObject = new PrivateKeyObject(handle);
195
+ } else {
196
+ throw lazyDOMException(
197
+ 'Unexpected key type from JWK import',
198
+ 'DataError',
199
+ );
200
+ }
201
+
202
+ return new CryptoKey(keyObject, algorithm, keyUsages, extractable);
203
+ }
204
+
205
+ // Handle binary formats (spki, pkcs8, raw)
206
+ if (format !== 'spki' && format !== 'pkcs8' && format !== 'raw') {
207
+ throw lazyDOMException(
208
+ `Unsupported format: ${format}`,
209
+ 'NotSupportedError',
210
+ );
211
+ }
212
+
213
+ // Determine expected key type based on format
214
+ const expectedKeyType =
215
+ format === 'spki' || format === 'raw' ? 'public' : 'private';
216
+
217
+ // Validate usages for the key type
218
+ const isPublicKey = expectedKeyType === 'public';
219
+ let validUsages: KeyUsage[];
220
+
221
+ if (name === 'ECDSA') {
222
+ validUsages = isPublicKey ? ['verify'] : ['sign'];
223
+ } else if (name === 'ECDH') {
224
+ validUsages = isPublicKey ? [] : ['deriveKey', 'deriveBits'];
225
+ } else {
226
+ throw lazyDOMException('Unsupported algorithm', 'NotSupportedError');
227
+ }
228
+
229
+ if (hasAnyNotIn(keyUsages, validUsages)) {
230
+ throw lazyDOMException(
231
+ `Unsupported key usage for a ${name} key`,
232
+ 'SyntaxError',
233
+ );
234
+ }
235
+
236
+ // Convert keyData to ArrayBuffer
237
+ const keyBuffer = bufferLikeToArrayBuffer(keyData as BufferLike);
238
+
239
+ // Create KeyObject directly using the appropriate format
240
+ let keyObject: KeyObject;
241
+
242
+ if (format === 'raw') {
243
+ // Raw format is only for public keys - use specialized EC raw import
244
+ const handle =
245
+ NitroModules.createHybridObject<KeyObjectHandle>('KeyObjectHandle');
246
+ const curveAlias =
247
+ kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases];
248
+ if (!handle.initECRaw(curveAlias, keyBuffer)) {
249
+ throw lazyDOMException('Failed to import EC raw key', 'DataError');
250
+ }
251
+ keyObject = new PublicKeyObject(handle);
252
+ } else {
253
+ // Use standard DER import for spki/pkcs8
254
+ keyObject = KeyObject.createKeyObject(
255
+ expectedKeyType,
256
+ keyBuffer,
257
+ KFormatType.DER,
258
+ format === 'spki' ? KeyEncoding.SPKI : KeyEncoding.PKCS8,
259
+ );
260
+ }
261
+
262
+ return new CryptoKey(keyObject, algorithm, keyUsages, extractable);
263
+ // // // verifyAcceptableEcKeyUse(name, true, usagesSet);
264
+ // // try {
265
+ // // keyObject = createPublicKey({
266
+ // // key: keyData,
267
+ // // format: 'der',
268
+ // // type: 'spki',
269
+ // // });
270
+ // // } catch (err) {
271
+ // // throw new Error(`Invalid keyData 2: ${err}`);
272
+ // // }
273
+ // // break;
274
+ // // }
275
+ // // case 'pkcs8': {
276
+ // // // verifyAcceptableEcKeyUse(name, false, usagesSet);
277
+ // // try {
278
+ // // keyObject = createPrivateKey({
279
+ // // key: keyData,
280
+ // // format: 'der',
281
+ // // type: 'pkcs8',
282
+ // // });
283
+ // // } catch (err) {
284
+ // // throw new Error(`Invalid keyData 3 ${err}`);
285
+ // // }
286
+ // // break;
287
+ // // }
288
+ }
289
+
290
+ // case 'jwk': {
291
+ // const data = keyData as JWK;
292
+
293
+ // if (!data.kty) throw lazyDOMException('Invalid keyData 4', 'DataError');
294
+ // if (data.kty !== 'EC')
295
+ // throw lazyDOMException('Invalid JWK "kty" Parameter', 'DataError');
296
+ // if (data.crv !== namedCurve)
297
+ // throw lazyDOMException(
298
+ // 'JWK "crv" does not match the requested algorithm',
299
+ // 'DataError',
300
+ // );
301
+
302
+ // verifyAcceptableEcKeyUse(name, data.d === undefined, keyUsages);
303
+
304
+ // if (keyUsages.length > 0 && data.use !== undefined) {
305
+ // const checkUse = name === 'ECDH' ? 'enc' : 'sig';
306
+ // if (data.use !== checkUse)
307
+ // throw lazyDOMException('Invalid JWK "use" Parameter', 'DataError');
308
+ // }
309
+
310
+ // validateKeyOps(data.key_ops, keyUsages);
311
+
312
+ // if (
313
+ // data.ext !== undefined &&
314
+ // data.ext === false &&
315
+ // extractable === true
316
+ // ) {
317
+ // throw lazyDOMException(
318
+ // 'JWK "ext" Parameter and extractable mismatch',
319
+ // 'DataError',
320
+ // );
321
+ // }
322
+
323
+ // if (algorithm.name === 'ECDSA' && data.alg !== undefined) {
324
+ // let algNamedCurve;
325
+ // switch (data.alg) {
326
+ // case 'ES256':
327
+ // algNamedCurve = 'P-256';
328
+ // break;
329
+ // case 'ES384':
330
+ // algNamedCurve = 'P-384';
331
+ // break;
332
+ // case 'ES512':
333
+ // algNamedCurve = 'P-521';
334
+ // break;
335
+ // }
336
+ // if (algNamedCurve !== namedCurve)
337
+ // throw lazyDOMException(
338
+ // 'JWK "alg" does not match the requested algorithm',
339
+ // 'DataError',
340
+ // );
341
+ // }
342
+
343
+ // const handle = NativeQuickCrypto.webcrypto.createKeyObjectHandle();
344
+ // const type = handle.initJwk(data, namedCurve);
345
+ // if (type === undefined)
346
+ // throw lazyDOMException('Invalid JWK', 'DataError');
347
+ // keyObject =
348
+ // type === KeyType.PRIVATE
349
+ // ? new PrivateKeyObject(handle)
350
+ // : new PublicKeyObject(handle);
351
+ // break;
352
+ // }
353
+ // case 'raw': {
354
+ // const data = keyData as BufferLike | BinaryLike;
355
+ // verifyAcceptableEcKeyUse(name, true, keyUsages);
356
+ // const buffer =
357
+ // typeof data === 'string'
358
+ // ? binaryLikeToArrayBuffer(data)
359
+ // : bufferLikeToArrayBuffer(data);
360
+ // keyObject = createECPublicKeyRaw(namedCurve, buffer);
361
+ // break;
362
+ // }
363
+ // default: {
364
+ // throw new Error(`Unknown EC import format: ${format}`);
365
+ // }
366
+ // }
367
+
368
+ // switch (algorithm.name) {
369
+ // case 'ECDSA':
370
+ // // Fall through
371
+ // case 'ECDH':
372
+ // if (keyObject.asymmetricKeyType !== ('ec' as AsymmetricKeyType))
373
+ // throw new Error('Invalid key type');
374
+ // break;
375
+ // }
376
+
377
+ // // if (!keyObject[kHandle].checkEcKeyData()) {
378
+ // // throw new Error('Invalid keyData 5');
379
+ // // }
380
+
381
+ // // const { namedCurve: checkNamedCurve } = keyObject[kHandle].keyDetail({});
382
+ // // if (kNamedCurveAliases[namedCurve] !== checkNamedCurve)
383
+ // // throw new Error('Named curve mismatch');
384
+
385
+ // return new CryptoKey(keyObject, { name, namedCurve }, keyUsages, extractable);
386
+ // }
387
+
388
+ // Node API
389
+ export const ecdsaSignVerify = (
390
+ key: CryptoKey,
391
+ data: BufferLike,
392
+ { hash }: SubtleAlgorithm,
393
+ signature?: BufferLike,
394
+ ): ArrayBuffer | boolean => {
395
+ const isSign = signature === undefined;
396
+ const expectedKeyType = isSign ? 'private' : 'public';
397
+
398
+ if (key.type !== expectedKeyType) {
399
+ throw lazyDOMException(
400
+ `Key must be a ${expectedKeyType} key`,
401
+ 'InvalidAccessError',
402
+ );
403
+ }
404
+
405
+ const hashName = typeof hash === 'string' ? hash : hash?.name;
406
+
407
+ if (!hashName) {
408
+ throw lazyDOMException(
409
+ 'Hash algorithm is required for ECDSA',
410
+ 'InvalidAccessError',
411
+ );
412
+ }
413
+
414
+ // Normalize hash algorithm name to WebCrypto format for C++ layer
415
+ const normalizedHashName = normalizeHashName(hashName, HashContext.WebCrypto);
416
+
417
+ // Create EC instance with the curve from the key
418
+ const namedCurve = key.algorithm.namedCurve!;
419
+ const ec = new Ec(namedCurve);
420
+
421
+ // Extract and import the actual key data from the CryptoKey
422
+ // Export in DER format with appropriate encoding
423
+ const encoding =
424
+ key.type === 'private' ? KeyEncoding.PKCS8 : KeyEncoding.SPKI;
425
+ const keyData = key.keyObject.handle.exportKey(KFormatType.DER, encoding);
426
+ const keyBuffer = bufferLikeToArrayBuffer(keyData);
427
+ ec.native.importKey(
428
+ 'der',
429
+ keyBuffer,
430
+ key.algorithm.name!,
431
+ key.extractable,
432
+ key.usages,
433
+ );
434
+
435
+ const dataBuffer = bufferLikeToArrayBuffer(data);
436
+
437
+ if (isSign) {
438
+ // Sign operation
439
+ return ec.native.sign(dataBuffer, normalizedHashName);
440
+ } else {
441
+ // Verify operation
442
+ const signatureBuffer = bufferLikeToArrayBuffer(signature!);
443
+ return ec.native.verify(dataBuffer, signatureBuffer, normalizedHashName);
444
+ }
445
+ };
446
+
447
+ // Node API
448
+
449
+ export async function ec_generateKeyPair(
450
+ name: string,
451
+ namedCurve: string,
452
+ extractable: boolean,
453
+ keyUsages: KeyUsage[],
454
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
455
+ _options?: KeyPairOptions, // TODO: Implement format options support
456
+ ): Promise<CryptoKeyPair> {
457
+ // validation checks
458
+ if (!Object.keys(kNamedCurveAliases).includes(namedCurve || '')) {
459
+ throw lazyDOMException(
460
+ `Unrecognized namedCurve '${namedCurve}'`,
461
+ 'NotSupportedError',
462
+ );
463
+ }
464
+
465
+ // const usageSet = new SafeSet(keyUsages);
466
+ switch (name) {
467
+ case 'ECDSA':
468
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
469
+ throw lazyDOMException(
470
+ 'Unsupported key usage for an ECDSA key',
471
+ 'SyntaxError',
472
+ );
473
+ }
474
+ break;
475
+ case 'ECDH':
476
+ if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
477
+ throw lazyDOMException(
478
+ 'Unsupported key usage for an ECDH key',
479
+ 'SyntaxError',
480
+ );
481
+ }
482
+ // Fall through
483
+ }
484
+
485
+ const ec = new Ec(namedCurve!);
486
+ await ec.generateKeyPair();
487
+
488
+ let publicUsages: KeyUsage[] = [];
489
+ let privateUsages: KeyUsage[] = [];
490
+ switch (name) {
491
+ case 'ECDSA':
492
+ publicUsages = getUsagesUnion(keyUsages, 'verify');
493
+ privateUsages = getUsagesUnion(keyUsages, 'sign');
494
+ break;
495
+ case 'ECDH':
496
+ publicUsages = [];
497
+ privateUsages = getUsagesUnion(keyUsages, 'deriveKey', 'deriveBits');
498
+ break;
499
+ }
500
+
501
+ const keyAlgorithm = { name, namedCurve: namedCurve! };
502
+
503
+ // Export keys directly from the EC key pair using the internal EVP_PKEY
504
+ // These methods export in DER format (SPKI for public, PKCS8 for private)
505
+ const publicKeyData = ec.native.getPublicKey();
506
+ const privateKeyData = ec.native.getPrivateKey();
507
+
508
+ const pub = KeyObject.createKeyObject(
509
+ 'public',
510
+ publicKeyData,
511
+ KFormatType.DER,
512
+ KeyEncoding.SPKI,
513
+ ) as PublicKeyObject;
514
+ const publicKey = new CryptoKey(
515
+ pub,
516
+ keyAlgorithm as SubtleAlgorithm,
517
+ publicUsages,
518
+ true,
519
+ );
520
+
521
+ // All keys are now exported in PKCS8 format for consistency
522
+ const priv = KeyObject.createKeyObject(
523
+ 'private',
524
+ privateKeyData,
525
+ KFormatType.DER,
526
+ KeyEncoding.PKCS8,
527
+ ) as PrivateKeyObject;
528
+ const privateKey = new CryptoKey(
529
+ priv,
530
+ keyAlgorithm as SubtleAlgorithm,
531
+ privateUsages,
532
+ extractable,
533
+ );
534
+
535
+ return { publicKey, privateKey };
536
+ }
537
+
538
+ function ec_prepareKeyGenParams(
539
+ options: GenerateKeyPairOptions | undefined,
540
+ ): Ec {
541
+ if (!options) {
542
+ throw new Error('Options are required for EC key generation');
543
+ }
544
+
545
+ const { namedCurve } = options as { namedCurve?: string };
546
+
547
+ if (
548
+ !namedCurve ||
549
+ !kNamedCurveAliases[namedCurve as keyof typeof kNamedCurveAliases]
550
+ ) {
551
+ throw new Error(`Invalid or unsupported named curve: ${namedCurve}`);
552
+ }
553
+
554
+ return new Ec(namedCurve);
555
+ }
556
+
557
+ function ec_formatKeyPairOutput(
558
+ ec: Ec,
559
+ encoding: KeyPairGenConfig,
560
+ ): {
561
+ publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
562
+ privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
563
+ } {
564
+ const {
565
+ publicFormat,
566
+ publicType,
567
+ privateFormat,
568
+ privateType,
569
+ cipher,
570
+ passphrase,
571
+ } = encoding;
572
+
573
+ const publicKeyData = ec.native.getPublicKey();
574
+ const privateKeyData = ec.native.getPrivateKey();
575
+
576
+ const pub = KeyObject.createKeyObject(
577
+ 'public',
578
+ publicKeyData,
579
+ KFormatType.DER,
580
+ KeyEncoding.SPKI,
581
+ ) as PublicKeyObject;
582
+
583
+ const priv = KeyObject.createKeyObject(
584
+ 'private',
585
+ privateKeyData,
586
+ KFormatType.DER,
587
+ KeyEncoding.PKCS8,
588
+ ) as PrivateKeyObject;
589
+
590
+ let publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
591
+ let privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
592
+
593
+ if (publicFormat === -1) {
594
+ publicKey = pub;
595
+ } else {
596
+ const format =
597
+ publicFormat === KFormatType.PEM ? KFormatType.PEM : KFormatType.DER;
598
+ const keyEncoding =
599
+ publicType === KeyEncoding.SPKI ? KeyEncoding.SPKI : KeyEncoding.SPKI;
600
+ const exported = pub.handle.exportKey(format, keyEncoding);
601
+ if (format === KFormatType.PEM) {
602
+ publicKey = Buffer.from(new Uint8Array(exported)).toString('utf-8');
603
+ } else {
604
+ publicKey = exported;
605
+ }
606
+ }
607
+
608
+ if (privateFormat === -1) {
609
+ privateKey = priv;
610
+ } else {
611
+ const format =
612
+ privateFormat === KFormatType.PEM ? KFormatType.PEM : KFormatType.DER;
613
+ const keyEncoding =
614
+ privateType === KeyEncoding.PKCS8
615
+ ? KeyEncoding.PKCS8
616
+ : privateType === KeyEncoding.SEC1
617
+ ? KeyEncoding.SEC1
618
+ : KeyEncoding.PKCS8;
619
+ const exported = priv.handle.exportKey(
620
+ format,
621
+ keyEncoding,
622
+ cipher,
623
+ passphrase,
624
+ );
625
+ if (format === KFormatType.PEM) {
626
+ privateKey = Buffer.from(new Uint8Array(exported)).toString('utf-8');
627
+ } else {
628
+ privateKey = exported;
629
+ }
630
+ }
631
+
632
+ return { publicKey, privateKey };
633
+ }
634
+
635
+ export async function ec_generateKeyPairNode(
636
+ options: GenerateKeyPairOptions | undefined,
637
+ encoding: KeyPairGenConfig,
638
+ ): Promise<{
639
+ publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
640
+ privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
641
+ }> {
642
+ const ec = ec_prepareKeyGenParams(options);
643
+ await ec.generateKeyPair();
644
+ return ec_formatKeyPairOutput(ec, encoding);
645
+ }
646
+
647
+ export function ec_generateKeyPairNodeSync(
648
+ options: GenerateKeyPairOptions | undefined,
649
+ encoding: KeyPairGenConfig,
650
+ ): {
651
+ publicKey: PublicKeyObject | Buffer | string | ArrayBuffer;
652
+ privateKey: PrivateKeyObject | Buffer | string | ArrayBuffer;
653
+ } {
654
+ const ec = ec_prepareKeyGenParams(options);
655
+ ec.generateKeyPairSync();
656
+ return ec_formatKeyPairOutput(ec, encoding);
657
+ }