react-native-quick-crypto 1.0.0-beta.2 → 1.0.0-beta.21

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 (462) hide show
  1. package/QuickCrypto.podspec +143 -7
  2. package/README.md +12 -6
  3. package/android/CMakeLists.txt +82 -21
  4. package/android/build.gradle +47 -4
  5. package/android/src/main/cpp/cpp-adapter.cpp +3 -10
  6. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +13 -10
  7. package/app.plugin.js +3 -0
  8. package/cpp/blake3/HybridBlake3.cpp +118 -0
  9. package/cpp/blake3/HybridBlake3.hpp +35 -0
  10. package/cpp/cipher/CCMCipher.cpp +199 -0
  11. package/cpp/cipher/CCMCipher.hpp +26 -0
  12. package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
  13. package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
  14. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
  15. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
  16. package/cpp/cipher/HybridCipher.cpp +322 -0
  17. package/cpp/cipher/HybridCipher.hpp +68 -0
  18. package/cpp/cipher/HybridCipherFactory.hpp +97 -0
  19. package/cpp/cipher/OCBCipher.cpp +55 -0
  20. package/cpp/cipher/OCBCipher.hpp +19 -0
  21. package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
  22. package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
  23. package/cpp/ec/HybridEcKeyPair.cpp +428 -0
  24. package/cpp/ec/HybridEcKeyPair.hpp +48 -0
  25. package/cpp/ed25519/HybridEdKeyPair.cpp +300 -0
  26. package/cpp/ed25519/HybridEdKeyPair.hpp +63 -0
  27. package/cpp/hash/HybridHash.cpp +185 -0
  28. package/cpp/hash/HybridHash.hpp +43 -0
  29. package/cpp/hmac/HybridHmac.cpp +95 -0
  30. package/cpp/hmac/HybridHmac.hpp +31 -0
  31. package/cpp/keys/HybridKeyObjectHandle.cpp +243 -0
  32. package/cpp/keys/HybridKeyObjectHandle.hpp +42 -0
  33. package/cpp/keys/KeyObjectData.cpp +226 -0
  34. package/cpp/keys/KeyObjectData.hpp +71 -0
  35. package/cpp/keys/node.h +5 -0
  36. package/cpp/pbkdf2/HybridPbkdf2.cpp +51 -0
  37. package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
  38. package/cpp/random/HybridRandom.cpp +32 -18
  39. package/cpp/random/HybridRandom.hpp +18 -30
  40. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  41. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  42. package/cpp/utils/Macros.hpp +68 -0
  43. package/cpp/utils/Utils.hpp +53 -1
  44. package/deps/blake3/.cargo/config.toml +2 -0
  45. package/deps/blake3/.git-blame-ignore-revs +2 -0
  46. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  47. package/deps/blake3/.github/workflows/ci.yml +491 -0
  48. package/deps/blake3/.github/workflows/tag.yml +43 -0
  49. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  50. package/deps/blake3/CONTRIBUTING.md +31 -0
  51. package/deps/blake3/Cargo.toml +135 -0
  52. package/deps/blake3/LICENSE_A2 +202 -0
  53. package/deps/blake3/LICENSE_A2LLVM +219 -0
  54. package/deps/blake3/LICENSE_CC0 +121 -0
  55. package/deps/blake3/README.md +229 -0
  56. package/deps/blake3/b3sum/Cargo.lock +513 -0
  57. package/deps/blake3/b3sum/Cargo.toml +26 -0
  58. package/deps/blake3/b3sum/README.md +72 -0
  59. package/deps/blake3/b3sum/src/main.rs +564 -0
  60. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  61. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  62. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  63. package/deps/blake3/benches/bench.rs +623 -0
  64. package/deps/blake3/build.rs +389 -0
  65. package/deps/blake3/c/CMakeLists.txt +383 -0
  66. package/deps/blake3/c/CMakePresets.json +73 -0
  67. package/deps/blake3/c/Makefile.testing +82 -0
  68. package/deps/blake3/c/README.md +403 -0
  69. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  70. package/deps/blake3/c/blake3.c +650 -0
  71. package/deps/blake3/c/blake3.h +86 -0
  72. package/deps/blake3/c/blake3_avx2.c +326 -0
  73. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  74. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  75. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  76. package/deps/blake3/c/blake3_avx512.c +1388 -0
  77. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  78. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  79. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  80. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  81. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  82. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  83. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  84. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  85. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  86. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  87. package/deps/blake3/c/blake3_dispatch.c +332 -0
  88. package/deps/blake3/c/blake3_impl.h +333 -0
  89. package/deps/blake3/c/blake3_neon.c +366 -0
  90. package/deps/blake3/c/blake3_portable.c +160 -0
  91. package/deps/blake3/c/blake3_sse2.c +566 -0
  92. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  93. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  94. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  95. package/deps/blake3/c/blake3_sse41.c +560 -0
  96. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  97. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  98. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  99. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  100. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  101. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  102. package/deps/blake3/c/example.c +36 -0
  103. package/deps/blake3/c/example_tbb.c +57 -0
  104. package/deps/blake3/c/libblake3.pc.in +12 -0
  105. package/deps/blake3/c/main.c +166 -0
  106. package/deps/blake3/c/test.py +97 -0
  107. package/deps/blake3/media/B3.svg +70 -0
  108. package/deps/blake3/media/BLAKE3.svg +85 -0
  109. package/deps/blake3/media/speed.svg +1474 -0
  110. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  111. package/deps/blake3/reference_impl/README.md +14 -0
  112. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  113. package/deps/blake3/src/ffi_avx2.rs +65 -0
  114. package/deps/blake3/src/ffi_avx512.rs +169 -0
  115. package/deps/blake3/src/ffi_neon.rs +82 -0
  116. package/deps/blake3/src/ffi_sse2.rs +126 -0
  117. package/deps/blake3/src/ffi_sse41.rs +126 -0
  118. package/deps/blake3/src/guts.rs +60 -0
  119. package/deps/blake3/src/hazmat.rs +704 -0
  120. package/deps/blake3/src/io.rs +64 -0
  121. package/deps/blake3/src/join.rs +92 -0
  122. package/deps/blake3/src/lib.rs +1835 -0
  123. package/deps/blake3/src/platform.rs +587 -0
  124. package/deps/blake3/src/portable.rs +198 -0
  125. package/deps/blake3/src/rust_avx2.rs +474 -0
  126. package/deps/blake3/src/rust_sse2.rs +775 -0
  127. package/deps/blake3/src/rust_sse41.rs +766 -0
  128. package/deps/blake3/src/test.rs +1049 -0
  129. package/deps/blake3/src/traits.rs +227 -0
  130. package/deps/blake3/src/wasm32_simd.rs +794 -0
  131. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  132. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  133. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  134. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  135. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  136. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  137. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  138. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  139. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  140. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  141. package/deps/blake3/tools/release.md +16 -0
  142. package/deps/fastpbkdf2/fastpbkdf2.c +356 -0
  143. package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
  144. package/deps/ncrypto/ncrypto.cc +4679 -0
  145. package/deps/ncrypto/ncrypto.h +1625 -0
  146. package/lib/commonjs/blake3.js +98 -0
  147. package/lib/commonjs/blake3.js.map +1 -0
  148. package/lib/commonjs/cipher.js +180 -0
  149. package/lib/commonjs/cipher.js.map +1 -0
  150. package/lib/commonjs/ec.js +344 -0
  151. package/lib/commonjs/ec.js.map +1 -0
  152. package/lib/commonjs/ed.js +185 -0
  153. package/lib/commonjs/ed.js.map +1 -0
  154. package/lib/commonjs/expo-plugin/@types.js +2 -0
  155. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  156. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  157. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  158. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  159. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  160. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  161. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  162. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  163. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  164. package/lib/commonjs/hash.js +215 -0
  165. package/lib/commonjs/hash.js.map +1 -0
  166. package/lib/commonjs/hmac.js +109 -0
  167. package/lib/commonjs/hmac.js.map +1 -0
  168. package/lib/commonjs/index.js +152 -32
  169. package/lib/commonjs/index.js.map +1 -1
  170. package/lib/commonjs/keys/classes.js +250 -0
  171. package/lib/commonjs/keys/classes.js.map +1 -0
  172. package/lib/commonjs/keys/generateKeyPair.js +102 -0
  173. package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
  174. package/lib/commonjs/keys/index.js +89 -0
  175. package/lib/commonjs/keys/index.js.map +1 -0
  176. package/lib/commonjs/keys/signVerify.js +41 -0
  177. package/lib/commonjs/keys/signVerify.js.map +1 -0
  178. package/lib/commonjs/keys/utils.js +123 -0
  179. package/lib/commonjs/keys/utils.js.map +1 -0
  180. package/lib/commonjs/pbkdf2.js +89 -0
  181. package/lib/commonjs/pbkdf2.js.map +1 -0
  182. package/lib/commonjs/random.js +9 -3
  183. package/lib/commonjs/random.js.map +1 -1
  184. package/lib/commonjs/rsa.js +129 -0
  185. package/lib/commonjs/rsa.js.map +1 -0
  186. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  187. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  188. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  189. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  190. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  191. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  192. package/lib/commonjs/specs/edKeyPair.nitro.js +6 -0
  193. package/lib/commonjs/specs/edKeyPair.nitro.js.map +1 -0
  194. package/lib/commonjs/specs/hash.nitro.js +6 -0
  195. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  196. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  197. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  198. package/lib/commonjs/specs/keyObjectHandle.nitro.js +6 -0
  199. package/lib/commonjs/specs/keyObjectHandle.nitro.js.map +1 -0
  200. package/lib/commonjs/specs/pbkdf2.nitro.js +6 -0
  201. package/lib/commonjs/specs/pbkdf2.nitro.js.map +1 -0
  202. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  203. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  204. package/lib/commonjs/subtle.js +365 -0
  205. package/lib/commonjs/subtle.js.map +1 -0
  206. package/lib/commonjs/utils/cipher.js +64 -0
  207. package/lib/commonjs/utils/cipher.js.map +1 -0
  208. package/lib/commonjs/utils/conversion.js +140 -6
  209. package/lib/commonjs/utils/conversion.js.map +1 -1
  210. package/lib/commonjs/utils/errors.js +14 -0
  211. package/lib/commonjs/utils/errors.js.map +1 -0
  212. package/lib/commonjs/utils/hashnames.js +91 -0
  213. package/lib/commonjs/utils/hashnames.js.map +1 -0
  214. package/lib/commonjs/utils/index.js +65 -5
  215. package/lib/commonjs/utils/index.js.map +1 -1
  216. package/lib/commonjs/utils/noble.js +82 -0
  217. package/lib/commonjs/utils/noble.js.map +1 -0
  218. package/lib/commonjs/utils/types.js +52 -0
  219. package/lib/commonjs/utils/types.js.map +1 -1
  220. package/lib/commonjs/utils/validation.js +98 -0
  221. package/lib/commonjs/utils/validation.js.map +1 -0
  222. package/lib/module/blake3.js +90 -0
  223. package/lib/module/blake3.js.map +1 -0
  224. package/lib/module/cipher.js +173 -0
  225. package/lib/module/cipher.js.map +1 -0
  226. package/lib/module/ec.js +336 -0
  227. package/lib/module/ec.js.map +1 -0
  228. package/lib/module/ed.js +178 -0
  229. package/lib/module/ed.js.map +1 -0
  230. package/lib/module/expo-plugin/@types.js +2 -0
  231. package/lib/module/expo-plugin/@types.js.map +1 -0
  232. package/lib/module/expo-plugin/withRNQC.js +21 -0
  233. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  234. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  235. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  236. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  237. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  238. package/lib/module/expo-plugin/withXCode.js +46 -0
  239. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  240. package/lib/module/hash.js +207 -0
  241. package/lib/module/hash.js.map +1 -0
  242. package/lib/module/hmac.js +104 -0
  243. package/lib/module/hmac.js.map +1 -0
  244. package/lib/module/index.js +33 -29
  245. package/lib/module/index.js.map +1 -1
  246. package/lib/module/keys/classes.js +241 -0
  247. package/lib/module/keys/classes.js.map +1 -0
  248. package/lib/module/keys/generateKeyPair.js +96 -0
  249. package/lib/module/keys/generateKeyPair.js.map +1 -0
  250. package/lib/module/keys/index.js +32 -0
  251. package/lib/module/keys/index.js.map +1 -0
  252. package/lib/module/keys/signVerify.js +41 -0
  253. package/lib/module/keys/signVerify.js.map +1 -0
  254. package/lib/module/keys/utils.js +114 -0
  255. package/lib/module/keys/utils.js.map +1 -0
  256. package/lib/module/pbkdf2.js +83 -0
  257. package/lib/module/pbkdf2.js.map +1 -0
  258. package/lib/module/random.js +7 -1
  259. package/lib/module/random.js.map +1 -1
  260. package/lib/module/rsa.js +123 -0
  261. package/lib/module/rsa.js.map +1 -0
  262. package/lib/module/specs/blake3.nitro.js +4 -0
  263. package/lib/module/specs/blake3.nitro.js.map +1 -0
  264. package/lib/module/specs/cipher.nitro.js +4 -0
  265. package/lib/module/specs/cipher.nitro.js.map +1 -0
  266. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  267. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  268. package/lib/module/specs/edKeyPair.nitro.js +4 -0
  269. package/lib/module/specs/edKeyPair.nitro.js.map +1 -0
  270. package/lib/module/specs/hash.nitro.js +4 -0
  271. package/lib/module/specs/hash.nitro.js.map +1 -0
  272. package/lib/module/specs/hmac.nitro.js +4 -0
  273. package/lib/module/specs/hmac.nitro.js.map +1 -0
  274. package/lib/module/specs/keyObjectHandle.nitro.js +4 -0
  275. package/lib/module/specs/keyObjectHandle.nitro.js.map +1 -0
  276. package/lib/module/specs/pbkdf2.nitro.js +4 -0
  277. package/lib/module/specs/pbkdf2.nitro.js.map +1 -0
  278. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  279. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  280. package/lib/module/subtle.js +360 -0
  281. package/lib/module/subtle.js.map +1 -0
  282. package/lib/module/utils/cipher.js +56 -0
  283. package/lib/module/utils/cipher.js.map +1 -0
  284. package/lib/module/utils/conversion.js +120 -8
  285. package/lib/module/utils/conversion.js.map +1 -1
  286. package/lib/module/utils/errors.js +10 -0
  287. package/lib/module/utils/errors.js.map +1 -0
  288. package/lib/module/utils/hashnames.js +89 -0
  289. package/lib/module/utils/hashnames.js.map +1 -0
  290. package/lib/module/utils/index.js +6 -5
  291. package/lib/module/utils/index.js.map +1 -1
  292. package/lib/module/utils/noble.js +76 -0
  293. package/lib/module/utils/noble.js.map +1 -0
  294. package/lib/module/utils/types.js +53 -0
  295. package/lib/module/utils/types.js.map +1 -1
  296. package/lib/module/utils/validation.js +87 -0
  297. package/lib/module/utils/validation.js.map +1 -0
  298. package/lib/tsconfig.tsbuildinfo +1 -1
  299. package/lib/typescript/blake3.d.ts +33 -0
  300. package/lib/typescript/blake3.d.ts.map +1 -0
  301. package/lib/typescript/cipher.d.ts +60 -0
  302. package/lib/typescript/cipher.d.ts.map +1 -0
  303. package/lib/typescript/ec.d.ts +13 -0
  304. package/lib/typescript/ec.d.ts.map +1 -0
  305. package/lib/typescript/ed.d.ts +43 -0
  306. package/lib/typescript/ed.d.ts.map +1 -0
  307. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  308. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  309. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  310. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  311. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  312. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  313. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  314. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  315. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  316. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  317. package/lib/typescript/hash.d.ts +122 -0
  318. package/lib/typescript/hash.d.ts.map +1 -0
  319. package/lib/typescript/hmac.d.ts +66 -0
  320. package/lib/typescript/hmac.d.ts.map +1 -0
  321. package/lib/typescript/index.d.ts +110 -9
  322. package/lib/typescript/index.d.ts.map +1 -1
  323. package/lib/typescript/keys/classes.d.ts +79 -0
  324. package/lib/typescript/keys/classes.d.ts.map +1 -0
  325. package/lib/typescript/keys/generateKeyPair.d.ts +6 -0
  326. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
  327. package/lib/typescript/keys/index.d.ts +7 -0
  328. package/lib/typescript/keys/index.d.ts.map +1 -0
  329. package/lib/typescript/keys/signVerify.d.ts +1 -0
  330. package/lib/typescript/keys/signVerify.d.ts.map +1 -0
  331. package/lib/typescript/keys/utils.d.ts +34 -0
  332. package/lib/typescript/keys/utils.d.ts.map +1 -0
  333. package/lib/typescript/pbkdf2.d.ts +12 -0
  334. package/lib/typescript/pbkdf2.d.ts.map +1 -0
  335. package/lib/typescript/random.d.ts +11 -5
  336. package/lib/typescript/random.d.ts.map +1 -1
  337. package/lib/typescript/rsa.d.ts +10 -0
  338. package/lib/typescript/rsa.d.ts.map +1 -0
  339. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  340. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  341. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  342. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  343. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  344. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  345. package/lib/typescript/specs/edKeyPair.nitro.d.ts +17 -0
  346. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
  347. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  348. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  349. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  350. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  351. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +14 -0
  352. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
  353. package/lib/typescript/specs/pbkdf2.nitro.d.ts +9 -0
  354. package/lib/typescript/specs/pbkdf2.nitro.d.ts.map +1 -0
  355. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  356. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  357. package/lib/typescript/subtle.d.ts +17 -0
  358. package/lib/typescript/subtle.d.ts.map +1 -0
  359. package/lib/typescript/utils/cipher.d.ts +7 -0
  360. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  361. package/lib/typescript/utils/conversion.d.ts +24 -2
  362. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  363. package/lib/typescript/utils/errors.d.ts +7 -0
  364. package/lib/typescript/utils/errors.d.ts.map +1 -0
  365. package/lib/typescript/utils/hashnames.d.ts +13 -0
  366. package/lib/typescript/utils/hashnames.d.ts.map +1 -0
  367. package/lib/typescript/utils/index.d.ts +6 -5
  368. package/lib/typescript/utils/index.d.ts.map +1 -1
  369. package/lib/typescript/utils/noble.d.ts +19 -0
  370. package/lib/typescript/utils/noble.d.ts.map +1 -0
  371. package/lib/typescript/utils/types.d.ts +252 -2
  372. package/lib/typescript/utils/types.d.ts.map +1 -1
  373. package/lib/typescript/utils/validation.d.ts +13 -0
  374. package/lib/typescript/utils/validation.d.ts.map +1 -0
  375. package/nitrogen/generated/.gitattributes +1 -0
  376. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +47 -4
  377. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +4 -3
  378. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +144 -0
  379. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +25 -0
  380. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  381. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +11 -8
  382. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +11 -3
  383. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +5 -3
  384. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +16 -7
  385. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +135 -0
  386. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +12 -0
  387. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +84 -0
  388. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  389. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  390. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  391. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  392. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  393. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  394. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  395. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  396. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  397. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +30 -0
  398. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +75 -0
  399. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  400. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  401. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  402. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  403. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +26 -0
  404. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +92 -0
  405. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
  406. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +66 -0
  407. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +2 -3
  408. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +9 -6
  409. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  410. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  411. package/nitrogen/generated/shared/c++/JWK.hpp +161 -0
  412. package/nitrogen/generated/shared/c++/JWKkty.hpp +84 -0
  413. package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
  414. package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
  415. package/nitrogen/generated/shared/c++/KeyDetail.hpp +92 -0
  416. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
  417. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  418. package/nitrogen/generated/shared/c++/KeyType.hpp +63 -0
  419. package/nitrogen/generated/shared/c++/KeyUsage.hpp +116 -0
  420. package/nitrogen/generated/shared/c++/NamedCurve.hpp +80 -0
  421. package/package.json +66 -39
  422. package/src/blake3.ts +123 -0
  423. package/src/cipher.ts +335 -0
  424. package/src/ec.ts +432 -0
  425. package/src/ed.ts +256 -0
  426. package/src/expo-plugin/@types.ts +7 -0
  427. package/src/expo-plugin/withRNQC.ts +23 -0
  428. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  429. package/src/expo-plugin/withSodiumIos.ts +30 -0
  430. package/src/expo-plugin/withXCode.ts +55 -0
  431. package/src/hash.ts +274 -0
  432. package/src/hmac.ts +135 -0
  433. package/src/index.ts +32 -29
  434. package/src/keys/classes.ts +317 -0
  435. package/src/keys/generateKeyPair.ts +145 -0
  436. package/src/keys/index.ts +52 -0
  437. package/src/keys/signVerify.ts +39 -0
  438. package/src/keys/utils.ts +190 -0
  439. package/src/pbkdf2.ts +154 -0
  440. package/src/random.ts +26 -23
  441. package/src/rsa.ts +176 -0
  442. package/src/specs/blake3.nitro.ts +12 -0
  443. package/src/specs/cipher.nitro.ts +25 -0
  444. package/src/specs/ecKeyPair.nitro.ts +38 -0
  445. package/src/specs/edKeyPair.nitro.ts +43 -0
  446. package/src/specs/hash.nitro.ts +10 -0
  447. package/src/specs/hmac.nitro.ts +7 -0
  448. package/src/specs/keyObjectHandle.nitro.ts +31 -0
  449. package/src/specs/pbkdf2.nitro.ts +18 -0
  450. package/src/specs/random.nitro.ts +2 -2
  451. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  452. package/src/subtle.ts +614 -0
  453. package/src/utils/cipher.ts +60 -0
  454. package/src/utils/conversion.ts +143 -9
  455. package/src/utils/errors.ts +15 -0
  456. package/src/utils/hashnames.ts +98 -0
  457. package/src/utils/index.ts +6 -6
  458. package/src/utils/noble.ts +85 -0
  459. package/src/utils/types.ts +423 -3
  460. package/src/utils/validation.ts +130 -0
  461. package/ios/QuickCryptoOnLoad.mm +0 -19
  462. package/lib/module/package.json +0 -1
@@ -0,0 +1,428 @@
1
+ #include <NitroModules/ArrayBuffer.hpp>
2
+ #include <NitroModules/Promise.hpp>
3
+ #include <memory>
4
+ #include <openssl/bio.h>
5
+ #include <openssl/buffer.h>
6
+ #include <openssl/ec.h>
7
+ #include <openssl/err.h>
8
+ #include <openssl/evp.h>
9
+ #include <openssl/obj_mac.h>
10
+ #include <openssl/pem.h>
11
+ #include <openssl/sha.h>
12
+ #include <stdexcept>
13
+ #include <string>
14
+
15
+ // OpenSSL EC parameter encoding constants
16
+ #ifndef OPENSSL_EC_EXPLICIT_CURVE
17
+ #define OPENSSL_EC_EXPLICIT_CURVE 0x000
18
+ #endif
19
+ #ifndef OPENSSL_EC_NAMED_CURVE
20
+ #define OPENSSL_EC_NAMED_CURVE 0x001
21
+ #endif
22
+
23
+ #include "HybridEcKeyPair.hpp"
24
+ #include "Utils.hpp"
25
+
26
+ namespace margelo::nitro::crypto {
27
+
28
+ std::shared_ptr<Promise<void>> HybridEcKeyPair::generateKeyPair() {
29
+ return Promise<void>::async([this]() { this->generateKeyPairSync(); });
30
+ }
31
+
32
+ void HybridEcKeyPair::generateKeyPairSync() {
33
+ if (this->curve.empty()) {
34
+ throw std::runtime_error("EC curve not set. Call setCurve() first.");
35
+ }
36
+
37
+ // Clean up existing key if any
38
+ if (this->pkey != nullptr) {
39
+ EVP_PKEY_free(this->pkey);
40
+ this->pkey = nullptr;
41
+ }
42
+
43
+ // Get curve NID from curve name
44
+ int curve_nid = GetCurveFromName(this->curve.c_str());
45
+ if (curve_nid == NID_undef) {
46
+ throw std::runtime_error("Invalid or unsupported curve: " + this->curve);
47
+ }
48
+
49
+ std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> key_ctx(nullptr, EVP_PKEY_CTX_free);
50
+
51
+ // Handle special curves (Ed25519, X25519, etc.)
52
+ switch (curve_nid) {
53
+ case EVP_PKEY_ED25519:
54
+ case EVP_PKEY_ED448:
55
+ case EVP_PKEY_X25519:
56
+ case EVP_PKEY_X448:
57
+ key_ctx.reset(EVP_PKEY_CTX_new_id(curve_nid, nullptr));
58
+ break;
59
+ default: {
60
+ // Standard EC curves
61
+ std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> param_ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr), EVP_PKEY_CTX_free);
62
+
63
+ if (!param_ctx) {
64
+ throw std::runtime_error("Failed to create parameter context");
65
+ }
66
+
67
+ if (EVP_PKEY_paramgen_init(param_ctx.get()) <= 0) {
68
+ throw std::runtime_error("Failed to initialize parameter generation");
69
+ }
70
+
71
+ if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(param_ctx.get(), curve_nid) <= 0) {
72
+ throw std::runtime_error("Failed to set curve NID");
73
+ }
74
+
75
+ if (EVP_PKEY_CTX_set_ec_param_enc(param_ctx.get(), OPENSSL_EC_NAMED_CURVE) <= 0) {
76
+ throw std::runtime_error("Failed to set parameter encoding");
77
+ }
78
+
79
+ EVP_PKEY* raw_params = nullptr;
80
+ if (EVP_PKEY_paramgen(param_ctx.get(), &raw_params) <= 0) {
81
+ throw std::runtime_error("Failed to generate parameters");
82
+ }
83
+
84
+ std::unique_ptr<EVP_PKEY, decltype(&EVP_PKEY_free)> key_params(raw_params, EVP_PKEY_free);
85
+ key_ctx.reset(EVP_PKEY_CTX_new(key_params.get(), nullptr));
86
+ break;
87
+ }
88
+ }
89
+
90
+ if (!key_ctx) {
91
+ throw std::runtime_error("Failed to create key generation context");
92
+ }
93
+
94
+ if (EVP_PKEY_keygen_init(key_ctx.get()) <= 0) {
95
+ throw std::runtime_error("Failed to initialize key generation");
96
+ }
97
+
98
+ EVP_PKEY* raw_pkey = nullptr;
99
+ if (EVP_PKEY_keygen(key_ctx.get(), &raw_pkey) <= 0) {
100
+ throw std::runtime_error("Failed to generate EC key pair");
101
+ }
102
+
103
+ this->pkey = raw_pkey;
104
+ }
105
+
106
+ KeyObject HybridEcKeyPair::importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData,
107
+ const std::string& /* algorithm */, bool /* extractable */,
108
+ const std::vector<std::string>& /* keyUsages */) {
109
+ // Clean up any existing key
110
+ if (this->pkey != nullptr) {
111
+ EVP_PKEY_free(this->pkey);
112
+ this->pkey = nullptr;
113
+ }
114
+ // Reset curve state to avoid interference between different uses
115
+ this->curve.clear();
116
+
117
+ // Import key from DER format
118
+ if (format != "der") {
119
+ throw std::runtime_error("Only DER format is supported for key import");
120
+ }
121
+
122
+ const unsigned char* keyPtr = static_cast<const unsigned char*>(keyData->data());
123
+ size_t keyLen = keyData->size();
124
+
125
+ // Try to import as public key first (SPKI format)
126
+ EVP_PKEY* pkey = d2i_PUBKEY(nullptr, &keyPtr, keyLen);
127
+
128
+ if (!pkey) {
129
+ // Reset pointer and try as private key (PKCS8 format)
130
+ keyPtr = static_cast<const unsigned char*>(keyData->data());
131
+
132
+ // Try PKCS8 format for private keys
133
+ BIO* pkcs8_bio = BIO_new_mem_buf(keyData->data(), static_cast<int>(keyData->size()));
134
+ if (pkcs8_bio) {
135
+ PKCS8_PRIV_KEY_INFO* p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(pkcs8_bio, nullptr);
136
+ if (p8inf != nullptr) {
137
+ EVP_PKEY* pkcs8_pkey = EVP_PKCS82PKEY(p8inf);
138
+ PKCS8_PRIV_KEY_INFO_free(p8inf);
139
+ BIO_free(pkcs8_bio);
140
+ if (pkcs8_pkey != nullptr) {
141
+ this->pkey = pkcs8_pkey;
142
+ KeyObject keyObj;
143
+ return keyObj;
144
+ }
145
+ }
146
+ BIO_free(pkcs8_bio);
147
+ }
148
+
149
+ // Try to parse as SPKI (public key) with BIO
150
+ BIO* spki_bio = BIO_new_mem_buf(keyData->data(), static_cast<int>(keyData->size()));
151
+ if (spki_bio) {
152
+ EVP_PKEY* spki_pkey = d2i_PUBKEY_bio(spki_bio, nullptr);
153
+ BIO_free(spki_bio);
154
+ if (spki_pkey != nullptr) {
155
+ this->pkey = spki_pkey;
156
+ KeyObject keyObj;
157
+ return keyObj;
158
+ }
159
+ }
160
+
161
+ throw std::runtime_error("Failed to import EC key from DER data");
162
+ }
163
+
164
+ this->pkey = pkey;
165
+
166
+ // Return a placeholder KeyObject - this would need proper implementation
167
+ // For now, we just need the key imported into this->pkey for sign/verify
168
+ KeyObject keyObj;
169
+ return keyObj;
170
+ }
171
+
172
+ std::shared_ptr<ArrayBuffer> HybridEcKeyPair::exportKey(const KeyObject& key, const std::string& format) {
173
+ // Suppress unused parameter warning
174
+ (void)key;
175
+
176
+ if (!this->pkey) {
177
+ throw std::runtime_error("No key pair generated");
178
+ }
179
+
180
+ if (format == "der-spki") {
181
+ // Export public key in DER SPKI format
182
+ int len = i2d_PUBKEY(this->pkey, nullptr);
183
+ if (len <= 0) {
184
+ throw std::runtime_error("Failed to get public key DER length");
185
+ }
186
+
187
+ std::vector<unsigned char> derData(len);
188
+ unsigned char* ptr = derData.data();
189
+ i2d_PUBKEY(this->pkey, &ptr);
190
+ return ToNativeArrayBuffer(std::string(derData.begin(), derData.end()));
191
+ } else if (format == "der-pkcs8") {
192
+ // Export private key in DER PKCS8 format
193
+ BIO* bio = BIO_new(BIO_s_mem());
194
+ if (!bio) {
195
+ throw std::runtime_error("Failed to create BIO for private key export");
196
+ }
197
+
198
+ if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
199
+ BIO_free(bio);
200
+ throw std::runtime_error("Failed to export private key to DER PKCS8 format");
201
+ }
202
+
203
+ BUF_MEM* mem;
204
+ BIO_get_mem_ptr(bio, &mem);
205
+ std::string derData(mem->data, mem->length);
206
+ BIO_free(bio);
207
+
208
+ return ToNativeArrayBuffer(derData);
209
+ } else if (format == "pem-spki") {
210
+ // Export public key in PEM SPKI format
211
+ BIO* bio = BIO_new(BIO_s_mem());
212
+ if (!bio) {
213
+ throw std::runtime_error("Failed to create BIO for public key export");
214
+ }
215
+
216
+ if (PEM_write_bio_PUBKEY(bio, this->pkey) != 1) {
217
+ BIO_free(bio);
218
+ throw std::runtime_error("Failed to export public key to PEM SPKI format");
219
+ }
220
+
221
+ BUF_MEM* mem;
222
+ BIO_get_mem_ptr(bio, &mem);
223
+ std::string pemData(mem->data, mem->length);
224
+ BIO_free(bio);
225
+
226
+ return ToNativeArrayBuffer(pemData);
227
+ } else if (format == "pem-pkcs8") {
228
+ // Export private key in PEM PKCS8 format
229
+ BIO* bio = BIO_new(BIO_s_mem());
230
+ if (!bio) {
231
+ throw std::runtime_error("Failed to create BIO for private key export");
232
+ }
233
+
234
+ if (PEM_write_bio_PKCS8PrivateKey(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
235
+ BIO_free(bio);
236
+ throw std::runtime_error("Failed to export private key to PEM PKCS8 format");
237
+ }
238
+
239
+ BUF_MEM* mem;
240
+ BIO_get_mem_ptr(bio, &mem);
241
+ std::string pemData(mem->data, mem->length);
242
+ BIO_free(bio);
243
+
244
+ return ToNativeArrayBuffer(pemData);
245
+ }
246
+
247
+ throw std::runtime_error("Unsupported export format: " + format);
248
+ }
249
+
250
+ std::shared_ptr<ArrayBuffer> HybridEcKeyPair::getPublicKey() {
251
+ this->checkKeyPair();
252
+
253
+ // Export as DER format using direct OpenSSL calls
254
+ BIO* bio = BIO_new(BIO_s_mem());
255
+ if (!bio) {
256
+ throw std::runtime_error("Failed to create BIO for public key export");
257
+ }
258
+
259
+ if (i2d_PUBKEY_bio(bio, this->pkey) != 1) {
260
+ BIO_free(bio);
261
+ throw std::runtime_error("Failed to export public key to DER format");
262
+ }
263
+
264
+ BUF_MEM* mem;
265
+ BIO_get_mem_ptr(bio, &mem);
266
+
267
+ // Create a string from the DER data and use ToNativeArrayBuffer utility
268
+ std::string derData(mem->data, mem->length);
269
+ BIO_free(bio);
270
+
271
+ return ToNativeArrayBuffer(derData);
272
+ }
273
+
274
+ std::shared_ptr<ArrayBuffer> HybridEcKeyPair::getPrivateKey() {
275
+ if (this->pkey == nullptr) {
276
+ throw std::runtime_error("No private key available");
277
+ }
278
+
279
+ // Export private key in PKCS8 DER format
280
+ BIO* bio = BIO_new(BIO_s_mem());
281
+ if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
282
+ BIO_free(bio);
283
+ throw std::runtime_error("Failed to export private key");
284
+ }
285
+
286
+ BUF_MEM* mem;
287
+ BIO_get_mem_ptr(bio, &mem);
288
+ std::string derData(mem->data, mem->length);
289
+ BIO_free(bio);
290
+
291
+ return ToNativeArrayBuffer(derData);
292
+ }
293
+
294
+ void HybridEcKeyPair::setCurve(const std::string& curve) {
295
+ this->curve = curve;
296
+ }
297
+
298
+ int HybridEcKeyPair::GetCurveFromName(const char* name) {
299
+ // Handle NIST curve name mappings first
300
+ std::string curve_name(name);
301
+ if (curve_name == "P-256") {
302
+ return NID_X9_62_prime256v1;
303
+ } else if (curve_name == "P-384") {
304
+ return NID_secp384r1;
305
+ } else if (curve_name == "P-521") {
306
+ return NID_secp521r1;
307
+ } else if (curve_name == "secp256k1") {
308
+ return NID_secp256k1;
309
+ }
310
+
311
+ // Try standard OpenSSL name resolution
312
+ int nid = OBJ_txt2nid(name);
313
+ if (nid == NID_undef) {
314
+ // Try short names
315
+ nid = OBJ_sn2nid(name);
316
+ }
317
+ if (nid == NID_undef) {
318
+ // Try long names
319
+ nid = OBJ_ln2nid(name);
320
+ }
321
+ return nid;
322
+ }
323
+
324
+ std::shared_ptr<ArrayBuffer> HybridEcKeyPair::sign(const std::shared_ptr<ArrayBuffer>& data, const std::string& hashAlgorithm) {
325
+ this->checkKeyPair();
326
+
327
+ // Get the hash algorithm EVP_MD
328
+ const EVP_MD* md = nullptr;
329
+ if (hashAlgorithm == "SHA-256") {
330
+ md = EVP_sha256();
331
+ } else if (hashAlgorithm == "SHA-384") {
332
+ md = EVP_sha384();
333
+ } else if (hashAlgorithm == "SHA-512") {
334
+ md = EVP_sha512();
335
+ } else if (hashAlgorithm == "SHA-1") {
336
+ md = EVP_sha1();
337
+ } else {
338
+ throw std::runtime_error("Unsupported hash algorithm: " + hashAlgorithm);
339
+ }
340
+
341
+ // Create signing context
342
+ std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)> md_ctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
343
+ if (!md_ctx) {
344
+ throw std::runtime_error("Failed to create message digest context");
345
+ }
346
+
347
+ // Initialize signing
348
+ if (EVP_DigestSignInit(md_ctx.get(), nullptr, md, nullptr, this->pkey) <= 0) {
349
+ throw std::runtime_error("Failed to initialize ECDSA signing");
350
+ }
351
+
352
+ // Update with data
353
+ if (EVP_DigestSignUpdate(md_ctx.get(), data->data(), data->size()) <= 0) {
354
+ throw std::runtime_error("Failed to update ECDSA signing with data");
355
+ }
356
+
357
+ // Get signature length
358
+ size_t sig_len = 0;
359
+ if (EVP_DigestSignFinal(md_ctx.get(), nullptr, &sig_len) <= 0) {
360
+ throw std::runtime_error("Failed to get ECDSA signature length");
361
+ }
362
+
363
+ // Allocate signature buffer
364
+ std::vector<uint8_t> signature(sig_len);
365
+
366
+ // Get the actual signature
367
+ if (EVP_DigestSignFinal(md_ctx.get(), signature.data(), &sig_len) <= 0) {
368
+ throw std::runtime_error("Failed to generate ECDSA signature");
369
+ }
370
+
371
+ // Resize to actual signature length
372
+ signature.resize(sig_len);
373
+
374
+ // Convert to ArrayBuffer
375
+ return ToNativeArrayBuffer(std::string(signature.begin(), signature.end()));
376
+ }
377
+
378
+ bool HybridEcKeyPair::verify(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& signature,
379
+ const std::string& hashAlgorithm) {
380
+ this->checkKeyPair();
381
+
382
+ // Get the hash algorithm EVP_MD
383
+ const EVP_MD* md = nullptr;
384
+ if (hashAlgorithm == "SHA-256") {
385
+ md = EVP_sha256();
386
+ } else if (hashAlgorithm == "SHA-384") {
387
+ md = EVP_sha384();
388
+ } else if (hashAlgorithm == "SHA-512") {
389
+ md = EVP_sha512();
390
+ } else if (hashAlgorithm == "SHA-1") {
391
+ md = EVP_sha1();
392
+ } else {
393
+ throw std::runtime_error("Unsupported hash algorithm: " + hashAlgorithm);
394
+ }
395
+
396
+ // Create verification context
397
+ std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)> md_ctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
398
+ if (!md_ctx) {
399
+ throw std::runtime_error("Failed to create message digest context");
400
+ }
401
+
402
+ // Initialize verification
403
+ if (EVP_DigestVerifyInit(md_ctx.get(), nullptr, md, nullptr, this->pkey) <= 0) {
404
+ throw std::runtime_error("Failed to initialize ECDSA verification");
405
+ }
406
+
407
+ // Update with data
408
+ if (EVP_DigestVerifyUpdate(md_ctx.get(), data->data(), data->size()) <= 0) {
409
+ throw std::runtime_error("Failed to update ECDSA verification with data");
410
+ }
411
+
412
+ // Verify signature
413
+ int result = EVP_DigestVerifyFinal(md_ctx.get(), static_cast<const unsigned char*>(signature->data()), signature->size());
414
+
415
+ if (result < 0) {
416
+ throw std::runtime_error("ECDSA verification failed with error");
417
+ }
418
+
419
+ return result == 1;
420
+ }
421
+
422
+ void HybridEcKeyPair::checkKeyPair() {
423
+ if (this->pkey == nullptr) {
424
+ throw std::runtime_error("EC KeyPair not initialized");
425
+ }
426
+ }
427
+
428
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,48 @@
1
+ #include <memory>
2
+ #include <openssl/ec.h>
3
+ #include <openssl/err.h>
4
+ #include <openssl/evp.h>
5
+ #include <openssl/obj_mac.h>
6
+ #include <string>
7
+
8
+ #include "HybridEcKeyPairSpec.hpp"
9
+ #include "Utils.hpp"
10
+
11
+ namespace margelo::nitro::crypto {
12
+
13
+ class HybridEcKeyPair : public HybridEcKeyPairSpec {
14
+ public:
15
+ HybridEcKeyPair() : HybridObject(TAG) {}
16
+ ~HybridEcKeyPair() {
17
+ if (pkey != nullptr) {
18
+ EVP_PKEY_free(pkey);
19
+ pkey = nullptr;
20
+ }
21
+ }
22
+
23
+ public:
24
+ // Methods
25
+ std::shared_ptr<Promise<void>> generateKeyPair() override;
26
+ void generateKeyPairSync() override;
27
+ KeyObject importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData, const std::string& algorithm,
28
+ bool extractable, const std::vector<std::string>& keyUsages) override;
29
+ std::shared_ptr<ArrayBuffer> exportKey(const KeyObject& key, const std::string& format) override;
30
+ std::shared_ptr<ArrayBuffer> getPublicKey() override;
31
+ std::shared_ptr<ArrayBuffer> getPrivateKey() override;
32
+
33
+ void setCurve(const std::string& curve) override;
34
+ std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<ArrayBuffer>& data, const std::string& hashAlgorithm) override;
35
+ bool verify(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& signature,
36
+ const std::string& hashAlgorithm) override;
37
+
38
+ protected:
39
+ void checkKeyPair();
40
+
41
+ private:
42
+ std::string curve;
43
+ EVP_PKEY* pkey = nullptr;
44
+
45
+ static int GetCurveFromName(const char* name);
46
+ };
47
+
48
+ } // namespace margelo::nitro::crypto