react-native-quick-crypto 1.0.0-beta.9 → 1.0.1

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 (526) hide show
  1. package/QuickCrypto.podspec +156 -8
  2. package/README.md +14 -27
  3. package/android/CMakeLists.txt +64 -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 +323 -0
  18. package/cpp/cipher/HybridCipher.hpp +68 -0
  19. package/cpp/cipher/HybridCipherFactory.hpp +105 -0
  20. package/cpp/cipher/HybridRsaCipher.cpp +367 -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 +757 -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/mldsa/HybridMlDsaKeyPair.cpp +264 -0
  40. package/cpp/mldsa/HybridMlDsaKeyPair.hpp +47 -0
  41. package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
  42. package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
  43. package/cpp/random/HybridRandom.cpp +6 -17
  44. package/cpp/random/HybridRandom.hpp +5 -6
  45. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  46. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  47. package/cpp/sign/HybridSignHandle.cpp +266 -0
  48. package/cpp/sign/HybridSignHandle.hpp +36 -0
  49. package/cpp/sign/HybridVerifyHandle.cpp +227 -0
  50. package/cpp/sign/HybridVerifyHandle.hpp +36 -0
  51. package/cpp/sign/SignUtils.hpp +108 -0
  52. package/cpp/utils/Macros.hpp +68 -0
  53. package/cpp/utils/Utils.hpp +43 -2
  54. package/cpp/utils/base64.h +309 -0
  55. package/deps/blake3/.cargo/config.toml +2 -0
  56. package/deps/blake3/.git-blame-ignore-revs +2 -0
  57. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  58. package/deps/blake3/.github/workflows/ci.yml +491 -0
  59. package/deps/blake3/.github/workflows/tag.yml +43 -0
  60. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  61. package/deps/blake3/CONTRIBUTING.md +31 -0
  62. package/deps/blake3/Cargo.toml +135 -0
  63. package/deps/blake3/LICENSE_A2 +202 -0
  64. package/deps/blake3/LICENSE_A2LLVM +219 -0
  65. package/deps/blake3/LICENSE_CC0 +121 -0
  66. package/deps/blake3/README.md +229 -0
  67. package/deps/blake3/b3sum/Cargo.lock +513 -0
  68. package/deps/blake3/b3sum/Cargo.toml +26 -0
  69. package/deps/blake3/b3sum/README.md +72 -0
  70. package/deps/blake3/b3sum/src/main.rs +564 -0
  71. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  72. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  73. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  74. package/deps/blake3/benches/bench.rs +623 -0
  75. package/deps/blake3/build.rs +389 -0
  76. package/deps/blake3/c/CMakeLists.txt +383 -0
  77. package/deps/blake3/c/CMakePresets.json +73 -0
  78. package/deps/blake3/c/Makefile.testing +82 -0
  79. package/deps/blake3/c/README.md +403 -0
  80. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  81. package/deps/blake3/c/blake3.c +650 -0
  82. package/deps/blake3/c/blake3.h +86 -0
  83. package/deps/blake3/c/blake3_avx2.c +326 -0
  84. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  85. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  86. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  87. package/deps/blake3/c/blake3_avx512.c +1388 -0
  88. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  89. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  90. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  91. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  92. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  93. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  94. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  95. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  96. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  97. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  98. package/deps/blake3/c/blake3_dispatch.c +332 -0
  99. package/deps/blake3/c/blake3_impl.h +333 -0
  100. package/deps/blake3/c/blake3_neon.c +366 -0
  101. package/deps/blake3/c/blake3_portable.c +160 -0
  102. package/deps/blake3/c/blake3_sse2.c +566 -0
  103. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  104. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  105. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  106. package/deps/blake3/c/blake3_sse41.c +560 -0
  107. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  108. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  109. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  110. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  111. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  112. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  113. package/deps/blake3/c/example.c +36 -0
  114. package/deps/blake3/c/example_tbb.c +57 -0
  115. package/deps/blake3/c/libblake3.pc.in +12 -0
  116. package/deps/blake3/c/main.c +166 -0
  117. package/deps/blake3/c/test.py +97 -0
  118. package/deps/blake3/media/B3.svg +70 -0
  119. package/deps/blake3/media/BLAKE3.svg +85 -0
  120. package/deps/blake3/media/speed.svg +1474 -0
  121. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  122. package/deps/blake3/reference_impl/README.md +14 -0
  123. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  124. package/deps/blake3/src/ffi_avx2.rs +65 -0
  125. package/deps/blake3/src/ffi_avx512.rs +169 -0
  126. package/deps/blake3/src/ffi_neon.rs +82 -0
  127. package/deps/blake3/src/ffi_sse2.rs +126 -0
  128. package/deps/blake3/src/ffi_sse41.rs +126 -0
  129. package/deps/blake3/src/guts.rs +60 -0
  130. package/deps/blake3/src/hazmat.rs +704 -0
  131. package/deps/blake3/src/io.rs +64 -0
  132. package/deps/blake3/src/join.rs +92 -0
  133. package/deps/blake3/src/lib.rs +1835 -0
  134. package/deps/blake3/src/platform.rs +587 -0
  135. package/deps/blake3/src/portable.rs +198 -0
  136. package/deps/blake3/src/rust_avx2.rs +474 -0
  137. package/deps/blake3/src/rust_sse2.rs +775 -0
  138. package/deps/blake3/src/rust_sse41.rs +766 -0
  139. package/deps/blake3/src/test.rs +1049 -0
  140. package/deps/blake3/src/traits.rs +227 -0
  141. package/deps/blake3/src/wasm32_simd.rs +794 -0
  142. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  143. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  144. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  145. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  146. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  147. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  148. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  149. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  150. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  151. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  152. package/deps/blake3/tools/release.md +16 -0
  153. package/deps/fastpbkdf2/fastpbkdf2.c +5 -1
  154. package/deps/ncrypto/.bazelignore +4 -0
  155. package/deps/ncrypto/.bazelrc +2 -0
  156. package/deps/ncrypto/.bazelversion +1 -0
  157. package/deps/ncrypto/.clang-format +111 -0
  158. package/deps/ncrypto/.github/workflows/bazel.yml +58 -0
  159. package/deps/ncrypto/.github/workflows/linter.yml +38 -0
  160. package/deps/ncrypto/.github/workflows/macos.yml +43 -0
  161. package/deps/ncrypto/.github/workflows/ubuntu.yml +46 -0
  162. package/deps/ncrypto/.github/workflows/visual-studio.yml +49 -0
  163. package/deps/ncrypto/.python-version +1 -0
  164. package/deps/ncrypto/BUILD.bazel +36 -0
  165. package/deps/ncrypto/CMakeLists.txt +55 -0
  166. package/deps/ncrypto/LICENSE +21 -0
  167. package/deps/ncrypto/MODULE.bazel +1 -0
  168. package/deps/ncrypto/MODULE.bazel.lock +280 -0
  169. package/deps/ncrypto/README.md +18 -0
  170. package/deps/ncrypto/WORKSPACE +15 -0
  171. package/deps/ncrypto/cmake/CPM.cmake +1225 -0
  172. package/deps/ncrypto/cmake/ncrypto-flags.cmake +16 -0
  173. package/deps/ncrypto/include/dh-primes.h +67 -0
  174. package/deps/ncrypto/include/ncrypto.h +1897 -0
  175. package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +28 -0
  176. package/deps/ncrypto/pyproject.toml +38 -0
  177. package/deps/ncrypto/src/CMakeLists.txt +15 -0
  178. package/deps/ncrypto/src/engine.cpp +93 -0
  179. package/deps/ncrypto/src/ncrypto.cpp +5613 -0
  180. package/deps/ncrypto/tests/BUILD.bazel +9 -0
  181. package/deps/ncrypto/tests/CMakeLists.txt +7 -0
  182. package/deps/ncrypto/tests/basic.cpp +86 -0
  183. package/deps/ncrypto/tools/run-clang-format.sh +42 -0
  184. package/lib/commonjs/blake3.js +98 -0
  185. package/lib/commonjs/blake3.js.map +1 -0
  186. package/lib/commonjs/cipher.js +180 -0
  187. package/lib/commonjs/cipher.js.map +1 -0
  188. package/lib/commonjs/constants.js +32 -0
  189. package/lib/commonjs/constants.js.map +1 -0
  190. package/lib/commonjs/ec.js +480 -0
  191. package/lib/commonjs/ec.js.map +1 -0
  192. package/lib/commonjs/ed.js +214 -2
  193. package/lib/commonjs/ed.js.map +1 -1
  194. package/lib/commonjs/expo-plugin/@types.js +2 -0
  195. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  196. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  197. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  198. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  199. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  200. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  201. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  202. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  203. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  204. package/lib/commonjs/hash.js +215 -0
  205. package/lib/commonjs/hash.js.map +1 -0
  206. package/lib/commonjs/hmac.js +109 -0
  207. package/lib/commonjs/hmac.js.map +1 -0
  208. package/lib/commonjs/index.js +102 -24
  209. package/lib/commonjs/index.js.map +1 -1
  210. package/lib/commonjs/keys/classes.js +115 -52
  211. package/lib/commonjs/keys/classes.js.map +1 -1
  212. package/lib/commonjs/keys/generateKeyPair.js +141 -144
  213. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  214. package/lib/commonjs/keys/index.js +229 -0
  215. package/lib/commonjs/keys/index.js.map +1 -1
  216. package/lib/commonjs/keys/publicCipher.js +152 -0
  217. package/lib/commonjs/keys/publicCipher.js.map +1 -0
  218. package/lib/commonjs/keys/signVerify.js +178 -39
  219. package/lib/commonjs/keys/signVerify.js.map +1 -1
  220. package/lib/commonjs/keys/utils.js +18 -13
  221. package/lib/commonjs/keys/utils.js.map +1 -1
  222. package/lib/commonjs/mldsa.js +69 -0
  223. package/lib/commonjs/mldsa.js.map +1 -0
  224. package/lib/commonjs/pbkdf2.js.map +1 -1
  225. package/lib/commonjs/random.js +6 -0
  226. package/lib/commonjs/random.js.map +1 -1
  227. package/lib/commonjs/rsa.js +202 -0
  228. package/lib/commonjs/rsa.js.map +1 -0
  229. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  230. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  231. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  232. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  233. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  234. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  235. package/lib/commonjs/specs/hash.nitro.js +6 -0
  236. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  237. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  238. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  239. package/lib/commonjs/specs/mlDsaKeyPair.nitro.js +6 -0
  240. package/lib/commonjs/specs/mlDsaKeyPair.nitro.js.map +1 -0
  241. package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
  242. package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
  243. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  244. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  245. package/lib/commonjs/specs/sign.nitro.js +6 -0
  246. package/lib/commonjs/specs/sign.nitro.js.map +1 -0
  247. package/lib/commonjs/subtle.js +1092 -0
  248. package/lib/commonjs/subtle.js.map +1 -0
  249. package/lib/commonjs/utils/cipher.js +64 -0
  250. package/lib/commonjs/utils/cipher.js.map +1 -0
  251. package/lib/commonjs/utils/conversion.js +44 -5
  252. package/lib/commonjs/utils/conversion.js.map +1 -1
  253. package/lib/commonjs/utils/hashnames.js +2 -1
  254. package/lib/commonjs/utils/hashnames.js.map +1 -1
  255. package/lib/commonjs/utils/index.js +11 -0
  256. package/lib/commonjs/utils/index.js.map +1 -1
  257. package/lib/commonjs/utils/noble.js +82 -0
  258. package/lib/commonjs/utils/noble.js.map +1 -0
  259. package/lib/commonjs/utils/types.js +32 -17
  260. package/lib/commonjs/utils/types.js.map +1 -1
  261. package/lib/commonjs/utils/validation.js +74 -1
  262. package/lib/commonjs/utils/validation.js.map +1 -1
  263. package/lib/module/blake3.js +90 -0
  264. package/lib/module/blake3.js.map +1 -0
  265. package/lib/module/cipher.js +173 -0
  266. package/lib/module/cipher.js.map +1 -0
  267. package/lib/module/constants.js +28 -0
  268. package/lib/module/constants.js.map +1 -0
  269. package/lib/module/ec.js +470 -0
  270. package/lib/module/ec.js.map +1 -0
  271. package/lib/module/ed.js +212 -3
  272. package/lib/module/ed.js.map +1 -1
  273. package/lib/module/expo-plugin/@types.js +2 -0
  274. package/lib/module/expo-plugin/@types.js.map +1 -0
  275. package/lib/module/expo-plugin/withRNQC.js +21 -0
  276. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  277. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  278. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  279. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  280. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  281. package/lib/module/expo-plugin/withXCode.js +46 -0
  282. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  283. package/lib/module/hash.js +207 -0
  284. package/lib/module/hash.js.map +1 -0
  285. package/lib/module/hmac.js +104 -0
  286. package/lib/module/hmac.js.map +1 -0
  287. package/lib/module/index.js +21 -21
  288. package/lib/module/index.js.map +1 -1
  289. package/lib/module/keys/classes.js +112 -49
  290. package/lib/module/keys/classes.js.map +1 -1
  291. package/lib/module/keys/generateKeyPair.js +134 -143
  292. package/lib/module/keys/generateKeyPair.js.map +1 -1
  293. package/lib/module/keys/index.js +161 -22
  294. package/lib/module/keys/index.js.map +1 -1
  295. package/lib/module/keys/publicCipher.js +145 -0
  296. package/lib/module/keys/publicCipher.js.map +1 -0
  297. package/lib/module/keys/signVerify.js +170 -39
  298. package/lib/module/keys/signVerify.js.map +1 -1
  299. package/lib/module/keys/utils.js +16 -12
  300. package/lib/module/keys/utils.js.map +1 -1
  301. package/lib/module/mldsa.js +63 -0
  302. package/lib/module/mldsa.js.map +1 -0
  303. package/lib/module/pbkdf2.js.map +1 -1
  304. package/lib/module/random.js +6 -0
  305. package/lib/module/random.js.map +1 -1
  306. package/lib/module/rsa.js +194 -0
  307. package/lib/module/rsa.js.map +1 -0
  308. package/lib/module/specs/blake3.nitro.js +4 -0
  309. package/lib/module/specs/blake3.nitro.js.map +1 -0
  310. package/lib/module/specs/cipher.nitro.js +4 -0
  311. package/lib/module/specs/cipher.nitro.js.map +1 -0
  312. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  313. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  314. package/lib/module/specs/hash.nitro.js +4 -0
  315. package/lib/module/specs/hash.nitro.js.map +1 -0
  316. package/lib/module/specs/hmac.nitro.js +4 -0
  317. package/lib/module/specs/hmac.nitro.js.map +1 -0
  318. package/lib/module/specs/mlDsaKeyPair.nitro.js +4 -0
  319. package/lib/module/specs/mlDsaKeyPair.nitro.js.map +1 -0
  320. package/lib/module/specs/rsaCipher.nitro.js +4 -0
  321. package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
  322. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  323. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  324. package/lib/module/specs/sign.nitro.js +4 -0
  325. package/lib/module/specs/sign.nitro.js.map +1 -0
  326. package/lib/module/subtle.js +1087 -0
  327. package/lib/module/subtle.js.map +1 -0
  328. package/lib/module/utils/cipher.js +56 -0
  329. package/lib/module/utils/cipher.js.map +1 -0
  330. package/lib/module/utils/conversion.js +26 -5
  331. package/lib/module/utils/conversion.js.map +1 -1
  332. package/lib/module/utils/hashnames.js +2 -1
  333. package/lib/module/utils/hashnames.js.map +1 -1
  334. package/lib/module/utils/index.js +1 -0
  335. package/lib/module/utils/index.js.map +1 -1
  336. package/lib/module/utils/noble.js +76 -0
  337. package/lib/module/utils/noble.js.map +1 -0
  338. package/lib/module/utils/types.js +32 -17
  339. package/lib/module/utils/types.js.map +1 -1
  340. package/lib/module/utils/validation.js +69 -1
  341. package/lib/module/utils/validation.js.map +1 -1
  342. package/lib/tsconfig.tsbuildinfo +1 -1
  343. package/lib/typescript/blake3.d.ts +33 -0
  344. package/lib/typescript/blake3.d.ts.map +1 -0
  345. package/lib/typescript/cipher.d.ts +60 -0
  346. package/lib/typescript/cipher.d.ts.map +1 -0
  347. package/lib/typescript/constants.d.ts +21 -0
  348. package/lib/typescript/constants.d.ts.map +1 -0
  349. package/lib/typescript/ec.d.ts +22 -0
  350. package/lib/typescript/ec.d.ts.map +1 -0
  351. package/lib/typescript/ed.d.ts +28 -1
  352. package/lib/typescript/ed.d.ts.map +1 -1
  353. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  354. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  355. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  356. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  357. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  358. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  359. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  360. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  361. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  362. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  363. package/lib/typescript/hash.d.ts +122 -0
  364. package/lib/typescript/hash.d.ts.map +1 -0
  365. package/lib/typescript/hmac.d.ts +66 -0
  366. package/lib/typescript/hmac.d.ts.map +1 -0
  367. package/lib/typescript/index.d.ts +102 -10
  368. package/lib/typescript/index.d.ts.map +1 -1
  369. package/lib/typescript/keys/classes.d.ts +52 -8
  370. package/lib/typescript/keys/classes.d.ts.map +1 -1
  371. package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
  372. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  373. package/lib/typescript/keys/index.d.ts +22 -2
  374. package/lib/typescript/keys/index.d.ts.map +1 -1
  375. package/lib/typescript/keys/publicCipher.d.ts +20 -0
  376. package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
  377. package/lib/typescript/keys/signVerify.d.ts +28 -0
  378. package/lib/typescript/keys/signVerify.d.ts.map +1 -1
  379. package/lib/typescript/keys/utils.d.ts +3 -1
  380. package/lib/typescript/keys/utils.d.ts.map +1 -1
  381. package/lib/typescript/mldsa.d.ts +18 -0
  382. package/lib/typescript/mldsa.d.ts.map +1 -0
  383. package/lib/typescript/pbkdf2.d.ts +1 -1
  384. package/lib/typescript/pbkdf2.d.ts.map +1 -1
  385. package/lib/typescript/random.d.ts +6 -0
  386. package/lib/typescript/random.d.ts.map +1 -1
  387. package/lib/typescript/rsa.d.ts +19 -0
  388. package/lib/typescript/rsa.d.ts.map +1 -0
  389. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  390. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  391. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  392. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  393. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  394. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  395. package/lib/typescript/specs/edKeyPair.nitro.d.ts +1 -0
  396. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
  397. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  398. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  399. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  400. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  401. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -1
  402. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  403. package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts +16 -0
  404. package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts.map +1 -0
  405. package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
  406. package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
  407. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  408. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  409. package/lib/typescript/specs/sign.nitro.d.ts +19 -0
  410. package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
  411. package/lib/typescript/subtle.d.ts +17 -0
  412. package/lib/typescript/subtle.d.ts.map +1 -0
  413. package/lib/typescript/utils/cipher.d.ts +7 -0
  414. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  415. package/lib/typescript/utils/conversion.d.ts +1 -0
  416. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  417. package/lib/typescript/utils/hashnames.d.ts +3 -1
  418. package/lib/typescript/utils/hashnames.d.ts.map +1 -1
  419. package/lib/typescript/utils/index.d.ts +1 -0
  420. package/lib/typescript/utils/index.d.ts.map +1 -1
  421. package/lib/typescript/utils/noble.d.ts +19 -0
  422. package/lib/typescript/utils/noble.d.ts.map +1 -0
  423. package/lib/typescript/utils/types.d.ts +129 -25
  424. package/lib/typescript/utils/types.d.ts.map +1 -1
  425. package/lib/typescript/utils/validation.d.ts +5 -0
  426. package/lib/typescript/utils/validation.d.ts.map +1 -1
  427. package/nitrogen/generated/.gitattributes +1 -0
  428. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +31 -1
  429. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  430. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +125 -1
  431. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  432. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  433. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
  434. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  435. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  436. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +3 -3
  437. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +121 -1
  438. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
  439. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +116 -0
  440. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  441. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  442. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  443. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  444. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  445. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  446. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  447. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  448. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  449. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +2 -1
  450. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
  451. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  452. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  453. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  454. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  455. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -1
  456. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
  457. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +29 -0
  458. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +73 -0
  459. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  460. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
  461. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  462. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
  463. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
  464. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
  465. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  466. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  467. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
  468. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
  469. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
  470. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
  471. package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
  472. package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
  473. package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
  474. package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
  475. package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
  476. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
  477. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  478. package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
  479. package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
  480. package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
  481. package/package.json +31 -23
  482. package/src/blake3.ts +123 -0
  483. package/src/cipher.ts +335 -0
  484. package/src/constants.ts +32 -0
  485. package/src/ec.ts +657 -0
  486. package/src/ed.ts +297 -13
  487. package/src/expo-plugin/@types.ts +7 -0
  488. package/src/expo-plugin/withRNQC.ts +23 -0
  489. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  490. package/src/expo-plugin/withSodiumIos.ts +30 -0
  491. package/src/expo-plugin/withXCode.ts +55 -0
  492. package/src/hash.ts +274 -0
  493. package/src/hmac.ts +135 -0
  494. package/src/index.ts +20 -20
  495. package/src/keys/classes.ts +157 -55
  496. package/src/keys/generateKeyPair.ts +177 -134
  497. package/src/keys/index.ts +226 -14
  498. package/src/keys/publicCipher.ts +229 -0
  499. package/src/keys/signVerify.ts +239 -39
  500. package/src/keys/utils.ts +24 -18
  501. package/src/mldsa.ts +125 -0
  502. package/src/pbkdf2.ts +1 -1
  503. package/src/random.ts +7 -0
  504. package/src/rsa.ts +310 -0
  505. package/src/specs/blake3.nitro.ts +12 -0
  506. package/src/specs/cipher.nitro.ts +25 -0
  507. package/src/specs/ecKeyPair.nitro.ts +38 -0
  508. package/src/specs/edKeyPair.nitro.ts +2 -0
  509. package/src/specs/hash.nitro.ts +10 -0
  510. package/src/specs/hmac.nitro.ts +7 -0
  511. package/src/specs/keyObjectHandle.nitro.ts +1 -1
  512. package/src/specs/mlDsaKeyPair.nitro.ts +29 -0
  513. package/src/specs/rsaCipher.nitro.ts +65 -0
  514. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  515. package/src/specs/sign.nitro.ts +31 -0
  516. package/src/subtle.ts +1576 -0
  517. package/src/utils/cipher.ts +60 -0
  518. package/src/utils/conversion.ts +33 -4
  519. package/src/utils/hashnames.ts +4 -2
  520. package/src/utils/index.ts +1 -0
  521. package/src/utils/noble.ts +85 -0
  522. package/src/utils/types.ts +219 -31
  523. package/src/utils/validation.ts +96 -1
  524. package/lib/module/package.json +0 -1
  525. package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
  526. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
@@ -0,0 +1,51 @@
1
+ #pragma once
2
+
3
+ #include <memory>
4
+ #include <optional>
5
+ #include <string>
6
+
7
+ #include "HybridKeyObjectHandleSpec.hpp"
8
+ #include "JWK.hpp"
9
+ #include "KeyDetail.hpp"
10
+ #include "KeyObjectData.hpp"
11
+ #include "KeyType.hpp"
12
+ #include "NamedCurve.hpp"
13
+
14
+ namespace margelo::nitro::crypto {
15
+
16
+ class HybridKeyObjectHandle : public HybridKeyObjectHandleSpec {
17
+ public:
18
+ HybridKeyObjectHandle() : HybridObject(TAG) {}
19
+
20
+ public:
21
+ std::shared_ptr<ArrayBuffer> exportKey(std::optional<KFormatType> format, std::optional<KeyEncoding> type,
22
+ const std::optional<std::string>& cipher,
23
+ const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) override;
24
+
25
+ JWK exportJwk(const JWK& key, bool handleRsaPss) override;
26
+
27
+ AsymmetricKeyType getAsymmetricKeyType() override;
28
+
29
+ bool init(KeyType keyType, const std::variant<std::string, std::shared_ptr<ArrayBuffer>>& key, std::optional<KFormatType> format,
30
+ std::optional<KeyEncoding> type, const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) override;
31
+
32
+ bool initECRaw(const std::string& namedCurve, const std::shared_ptr<ArrayBuffer>& keyData) override;
33
+
34
+ std::optional<KeyType> initJwk(const JWK& keyData, std::optional<NamedCurve> namedCurve) override;
35
+
36
+ KeyDetail keyDetail() override;
37
+
38
+ KeyObjectData& getKeyObjectData() {
39
+ return data_;
40
+ }
41
+ const KeyObjectData& getKeyObjectData() const {
42
+ return data_;
43
+ }
44
+
45
+ private:
46
+ KeyObjectData data_;
47
+
48
+ bool initRawKey(KeyType keyType, std::shared_ptr<ArrayBuffer> keyData);
49
+ };
50
+
51
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,268 @@
1
+ #include "KeyObjectData.hpp"
2
+ #include "Utils.hpp"
3
+ #include <cstdio>
4
+ #include <optional>
5
+
6
+ namespace margelo::nitro::crypto {
7
+
8
+ ncrypto::EVPKeyPointer::PrivateKeyEncodingConfig GetPrivateKeyEncodingConfig(KFormatType format, KeyEncoding type) {
9
+ auto pk_format = static_cast<ncrypto::EVPKeyPointer::PKFormatType>(format);
10
+ auto pk_type = static_cast<ncrypto::EVPKeyPointer::PKEncodingType>(type);
11
+
12
+ auto config = ncrypto::EVPKeyPointer::PrivateKeyEncodingConfig(false, pk_format, pk_type);
13
+ return config;
14
+ }
15
+
16
+ ncrypto::EVPKeyPointer::PublicKeyEncodingConfig GetPublicKeyEncodingConfig(KFormatType format, KeyEncoding type) {
17
+ auto pk_format = static_cast<ncrypto::EVPKeyPointer::PKFormatType>(format);
18
+ auto pk_type = static_cast<ncrypto::EVPKeyPointer::PKEncodingType>(type);
19
+
20
+ auto config = ncrypto::EVPKeyPointer::PublicKeyEncodingConfig(false, pk_format, pk_type);
21
+ return config;
22
+ }
23
+
24
+ KeyObjectData TryParsePrivateKey(std::shared_ptr<ArrayBuffer> key, std::optional<KFormatType> format, std::optional<KeyEncoding> type,
25
+ const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
26
+ // For PEM format, use PKCS8 as default encoding
27
+ KeyEncoding actualType = type.value_or(KeyEncoding::PKCS8);
28
+ auto config = GetPrivateKeyEncodingConfig(format.value(), actualType);
29
+
30
+ if (passphrase.has_value()) {
31
+ auto& passphrase_ptr = passphrase.value();
32
+ config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
33
+ }
34
+
35
+ auto buffer = ncrypto::Buffer<const unsigned char>{key->data(), key->size()};
36
+
37
+ // Clear any existing OpenSSL errors before parsing
38
+ ERR_clear_error();
39
+
40
+ auto res = ncrypto::EVPKeyPointer::TryParsePrivateKey(config, buffer);
41
+ if (res) {
42
+ return KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, std::move(res.value));
43
+ }
44
+
45
+ if (res.error.has_value() && res.error.value() == ncrypto::EVPKeyPointer::PKParseError::NEED_PASSPHRASE) {
46
+ throw std::runtime_error("Passphrase required for encrypted key");
47
+ } else {
48
+ // Get OpenSSL error details
49
+ unsigned long err = ERR_get_error();
50
+ char err_buf[256];
51
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
52
+ throw std::runtime_error("Failed to read private key: " + std::string(err_buf));
53
+ }
54
+ }
55
+
56
+ KeyObjectData::KeyObjectData(std::nullptr_t) : key_type_(KeyType::SECRET) {}
57
+
58
+ KeyObjectData::KeyObjectData(std::shared_ptr<ArrayBuffer> symmetric_key)
59
+ : key_type_(KeyType::SECRET), data_(std::make_shared<Data>(std::move(symmetric_key))) {}
60
+
61
+ KeyObjectData::KeyObjectData(KeyType type, ncrypto::EVPKeyPointer&& pkey)
62
+ : key_type_(type), data_(std::make_shared<Data>(std::move(pkey))) {}
63
+
64
+ KeyObjectData KeyObjectData::CreateSecret(std::shared_ptr<ArrayBuffer> key) {
65
+ return KeyObjectData(std::move(key));
66
+ }
67
+
68
+ KeyObjectData KeyObjectData::CreateAsymmetric(KeyType key_type, ncrypto::EVPKeyPointer&& pkey) {
69
+ CHECK(pkey);
70
+ return KeyObjectData(key_type, std::move(pkey));
71
+ }
72
+
73
+ KeyType KeyObjectData::GetKeyType() const {
74
+ if (!data_) {
75
+ throw std::runtime_error("Invalid key object: no key data available");
76
+ }
77
+ return key_type_;
78
+ }
79
+
80
+ const ncrypto::EVPKeyPointer& KeyObjectData::GetAsymmetricKey() const {
81
+ if (key_type_ == KeyType::SECRET) {
82
+ throw std::runtime_error("Cannot get asymmetric key from secret key object");
83
+ }
84
+ if (!data_) {
85
+ throw std::runtime_error("Invalid key object: no key data available");
86
+ }
87
+ return data_->asymmetric_key;
88
+ }
89
+
90
+ std::shared_ptr<ArrayBuffer> KeyObjectData::GetSymmetricKey() const {
91
+ if (key_type_ != KeyType::SECRET) {
92
+ throw std::runtime_error("Cannot get symmetric key from asymmetric key object");
93
+ }
94
+ if (!data_) {
95
+ throw std::runtime_error("Invalid key object: no key data available");
96
+ }
97
+ return data_->symmetric_key;
98
+ }
99
+
100
+ size_t KeyObjectData::GetSymmetricKeySize() const {
101
+ if (key_type_ != KeyType::SECRET) {
102
+ throw std::runtime_error("Cannot get symmetric key size from asymmetric key object");
103
+ }
104
+ if (!data_) {
105
+ throw std::runtime_error("Invalid key object: no key data available");
106
+ }
107
+ return data_->symmetric_key->size();
108
+ }
109
+
110
+ KeyObjectData KeyObjectData::GetPublicOrPrivateKey(std::shared_ptr<ArrayBuffer> key, std::optional<KFormatType> format,
111
+ std::optional<KeyEncoding> type,
112
+ const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
113
+ if (key->size() > static_cast<size_t>(std::numeric_limits<int32_t>::max())) {
114
+ throw std::runtime_error("key is too big");
115
+ }
116
+
117
+ KFormatType actualFormat = format.value_or(KFormatType::DER);
118
+
119
+ if (actualFormat == KFormatType::PEM || actualFormat == KFormatType::DER) {
120
+ auto buffer = ncrypto::Buffer<const unsigned char>{key->data(), key->size()};
121
+
122
+ if (actualFormat == KFormatType::PEM) {
123
+ if (type.has_value() && type.value() == KeyEncoding::SPKI) {
124
+ auto res = ncrypto::EVPKeyPointer::TryParsePublicKeyPEM(buffer);
125
+ if (res) {
126
+ return CreateAsymmetric(KeyType::PUBLIC, std::move(res.value));
127
+ }
128
+ throw std::runtime_error("Failed to read PEM public key: key is not in SPKI format");
129
+ }
130
+
131
+ if (type.has_value() &&
132
+ (type.value() == KeyEncoding::PKCS8 || type.value() == KeyEncoding::SEC1 || type.value() == KeyEncoding::PKCS1)) {
133
+ auto config = GetPrivateKeyEncodingConfig(actualFormat, type.value());
134
+ if (passphrase.has_value()) {
135
+ auto& passphrase_ptr = passphrase.value();
136
+ config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
137
+ }
138
+ ERR_clear_error();
139
+ auto private_res = ncrypto::EVPKeyPointer::TryParsePrivateKey(config, buffer);
140
+ if (private_res) {
141
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(private_res.value));
142
+ }
143
+ unsigned long err = ERR_get_error();
144
+ char err_buf[256];
145
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
146
+ throw std::runtime_error("Failed to read PEM private key: " + std::string(err_buf));
147
+ }
148
+
149
+ auto res = ncrypto::EVPKeyPointer::TryParsePublicKeyPEM(buffer);
150
+ if (res) {
151
+ return CreateAsymmetric(KeyType::PUBLIC, std::move(res.value));
152
+ }
153
+
154
+ KeyEncoding actualType = KeyEncoding::PKCS8;
155
+ auto config = GetPrivateKeyEncodingConfig(actualFormat, actualType);
156
+ if (passphrase.has_value()) {
157
+ auto& passphrase_ptr = passphrase.value();
158
+ config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
159
+ }
160
+
161
+ ERR_clear_error();
162
+
163
+ auto private_res = ncrypto::EVPKeyPointer::TryParsePrivateKey(config, buffer);
164
+ if (private_res) {
165
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(private_res.value));
166
+ }
167
+
168
+ unsigned long err = ERR_get_error();
169
+ char err_buf[256];
170
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
171
+ throw std::runtime_error("Failed to read PEM asymmetric key: " + std::string(err_buf));
172
+ } else if (actualFormat == KFormatType::DER) {
173
+ // For DER, try parsing as public key first
174
+ if (type.has_value() && type.value() == KeyEncoding::SPKI) {
175
+ auto public_config = GetPublicKeyEncodingConfig(actualFormat, type.value());
176
+ auto res = ncrypto::EVPKeyPointer::TryParsePublicKey(public_config, buffer);
177
+ if (res) {
178
+ return CreateAsymmetric(KeyType::PUBLIC, std::move(res.value));
179
+ }
180
+ } else if (type.has_value() && type.value() == KeyEncoding::PKCS8) {
181
+ auto private_config = GetPrivateKeyEncodingConfig(actualFormat, type.value());
182
+ if (passphrase.has_value()) {
183
+ auto& passphrase_ptr = passphrase.value();
184
+ private_config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
185
+ }
186
+ auto res = ncrypto::EVPKeyPointer::TryParsePrivateKey(private_config, buffer);
187
+ if (res) {
188
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(res.value));
189
+ }
190
+ } else {
191
+ // If no encoding type specified, try both SPKI and PKCS8
192
+ auto public_config = GetPublicKeyEncodingConfig(actualFormat, KeyEncoding::SPKI);
193
+ auto public_res = ncrypto::EVPKeyPointer::TryParsePublicKey(public_config, buffer);
194
+ if (public_res) {
195
+ return CreateAsymmetric(KeyType::PUBLIC, std::move(public_res.value));
196
+ }
197
+
198
+ auto private_config = GetPrivateKeyEncodingConfig(actualFormat, KeyEncoding::PKCS8);
199
+ auto private_res = ncrypto::EVPKeyPointer::TryParsePrivateKey(private_config, buffer);
200
+ if (private_res) {
201
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(private_res.value));
202
+ }
203
+ }
204
+ throw std::runtime_error("Failed to read DER asymmetric key");
205
+ }
206
+ }
207
+
208
+ throw std::runtime_error("Unsupported key format for GetPublicOrPrivateKey. Only PEM and DER are supported.");
209
+ }
210
+
211
+ KeyObjectData KeyObjectData::GetPrivateKey(std::shared_ptr<ArrayBuffer> key, std::optional<KFormatType> format,
212
+ std::optional<KeyEncoding> type, const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase,
213
+ bool /* isPublic */) {
214
+ // Check if key size fits in int32_t without using double conversion
215
+ if (key->size() > static_cast<size_t>(std::numeric_limits<int32_t>::max())) {
216
+ std::string error_msg = "key is too big (int32): size=" + std::to_string(key->size()) +
217
+ ", max_int32=" + std::to_string(std::numeric_limits<int32_t>::max());
218
+ throw std::runtime_error(error_msg);
219
+ }
220
+
221
+ // If no format is specified, assume DER format for binary data
222
+ KFormatType actualFormat = format.has_value() ? format.value() : KFormatType::DER;
223
+
224
+ if (actualFormat == KFormatType::PEM || actualFormat == KFormatType::DER) {
225
+ auto buffer = ncrypto::Buffer<const unsigned char>{key->data(), key->size()};
226
+
227
+ if (actualFormat == KFormatType::PEM) {
228
+ return TryParsePrivateKey(key, format, type, passphrase);
229
+ } else if (actualFormat == KFormatType::DER) {
230
+ // Try the specified encoding first, or PKCS8 as default
231
+ KeyEncoding primaryEncoding = type.value_or(KeyEncoding::PKCS8);
232
+ auto private_config = GetPrivateKeyEncodingConfig(actualFormat, primaryEncoding);
233
+ if (passphrase.has_value()) {
234
+ auto& passphrase_ptr = passphrase.value();
235
+ private_config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
236
+ }
237
+
238
+ // Clear any existing OpenSSL errors before parsing
239
+ ERR_clear_error();
240
+
241
+ auto res = ncrypto::EVPKeyPointer::TryParsePrivateKey(private_config, buffer);
242
+ if (res) {
243
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(res.value));
244
+ }
245
+
246
+ // If no specific encoding was provided, try other encodings as fallback
247
+ if (!type.has_value()) {
248
+ std::vector<KeyEncoding> fallbackEncodings = {KeyEncoding::SEC1, KeyEncoding::PKCS1};
249
+ for (auto encoding : fallbackEncodings) {
250
+ auto config = GetPrivateKeyEncodingConfig(actualFormat, encoding);
251
+ if (passphrase.has_value()) {
252
+ auto& passphrase_ptr = passphrase.value();
253
+ config.passphrase = std::make_optional(ncrypto::DataPointer(passphrase_ptr->data(), passphrase_ptr->size()));
254
+ }
255
+ auto fallback_res = ncrypto::EVPKeyPointer::TryParsePrivateKey(config, buffer);
256
+ if (fallback_res) {
257
+ return CreateAsymmetric(KeyType::PRIVATE, std::move(fallback_res.value));
258
+ }
259
+ }
260
+ }
261
+ throw std::runtime_error("Failed to read DER private key");
262
+ }
263
+ }
264
+
265
+ throw std::runtime_error("Unsupported key format for GetPrivateKey. Only PEM and DER are supported.");
266
+ }
267
+
268
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,71 @@
1
+ #include <memory>
2
+
3
+ #include <NitroModules/ArrayBuffer.hpp>
4
+
5
+ #include "KFormatType.hpp"
6
+ #include "KeyEncoding.hpp"
7
+ #include "KeyType.hpp"
8
+ #include "Utils.hpp"
9
+ #include <ncrypto.h>
10
+
11
+ namespace margelo::nitro::crypto {
12
+
13
+ class KeyObjectData final {
14
+ public:
15
+ static KeyObjectData CreateSecret(std::shared_ptr<ArrayBuffer> key);
16
+
17
+ static KeyObjectData CreateAsymmetric(KeyType type, ncrypto::EVPKeyPointer&& pkey);
18
+
19
+ KeyObjectData(std::nullptr_t = nullptr);
20
+
21
+ inline operator bool() const {
22
+ return data_ != nullptr;
23
+ }
24
+
25
+ KeyType GetKeyType() const;
26
+
27
+ // These functions allow unprotected access to the raw key material and should
28
+ // only be used to implement cryptographic operations requiring the key.
29
+ const ncrypto::EVPKeyPointer& GetAsymmetricKey() const;
30
+ std::shared_ptr<ArrayBuffer> GetSymmetricKey() const;
31
+ size_t GetSymmetricKeySize() const;
32
+
33
+ static KeyObjectData GetPublicOrPrivateKey(std::shared_ptr<ArrayBuffer> key, std::optional<KFormatType> format,
34
+ std::optional<KeyEncoding> type,
35
+ const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase);
36
+
37
+ static KeyObjectData GetPrivateKey(std::shared_ptr<ArrayBuffer> key, std::optional<KFormatType> format, std::optional<KeyEncoding> type,
38
+ const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase, bool isPublic);
39
+
40
+ inline KeyObjectData addRef() const {
41
+ return KeyObjectData(key_type_, data_);
42
+ }
43
+
44
+ inline KeyObjectData addRefWithType(KeyType type) const {
45
+ return KeyObjectData(type, data_);
46
+ }
47
+
48
+ private:
49
+ explicit KeyObjectData(std::shared_ptr<ArrayBuffer> symmetric_key);
50
+ explicit KeyObjectData(KeyType type, ncrypto::EVPKeyPointer&& pkey);
51
+
52
+ // static KeyObjectData GetParsedKey(KeyType type,
53
+ // Environment* env,
54
+ // ncrypto::EVPKeyPointer&& pkey,
55
+ // ParseKeyResult ret,
56
+ // const char* default_msg);
57
+
58
+ KeyType key_type_;
59
+
60
+ struct Data {
61
+ const std::shared_ptr<ArrayBuffer> symmetric_key;
62
+ const ncrypto::EVPKeyPointer asymmetric_key;
63
+ explicit Data(std::shared_ptr<ArrayBuffer> symmetric_key) : symmetric_key(std::move(symmetric_key)) {}
64
+ explicit Data(ncrypto::EVPKeyPointer asymmetric_key) : asymmetric_key(std::move(asymmetric_key)) {}
65
+ };
66
+ std::shared_ptr<Data> data_;
67
+
68
+ KeyObjectData(KeyType type, std::shared_ptr<Data> data) : key_type_(type), data_(data) {}
69
+ };
70
+
71
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+
3
+ // BINARY is a deprecated alias of LATIN1.
4
+ // BASE64URL is not currently exposed to the JavaScript side.
5
+ enum encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER, BASE64URL, LATIN1 = BINARY };
@@ -0,0 +1,264 @@
1
+ #include "HybridMlDsaKeyPair.hpp"
2
+
3
+ #include <NitroModules/ArrayBuffer.hpp>
4
+ #include <openssl/bio.h>
5
+ #include <openssl/err.h>
6
+ #include <openssl/pem.h>
7
+
8
+ #include "Utils.hpp"
9
+
10
+ #if OPENSSL_VERSION_NUMBER >= 0x30500000L
11
+ #define RNQC_HAS_ML_DSA 1
12
+ #else
13
+ #define RNQC_HAS_ML_DSA 0
14
+ #endif
15
+
16
+ namespace margelo::nitro::crypto {
17
+
18
+ HybridMlDsaKeyPair::~HybridMlDsaKeyPair() {
19
+ if (pkey_ != nullptr) {
20
+ EVP_PKEY_free(pkey_);
21
+ pkey_ = nullptr;
22
+ }
23
+ }
24
+
25
+ int HybridMlDsaKeyPair::getEvpPkeyType() const {
26
+ #if RNQC_HAS_ML_DSA
27
+ if (variant_ == "ML-DSA-44")
28
+ return EVP_PKEY_ML_DSA_44;
29
+ if (variant_ == "ML-DSA-65")
30
+ return EVP_PKEY_ML_DSA_65;
31
+ if (variant_ == "ML-DSA-87")
32
+ return EVP_PKEY_ML_DSA_87;
33
+ #endif
34
+ return 0;
35
+ }
36
+
37
+ void HybridMlDsaKeyPair::setVariant(const std::string& variant) {
38
+ #if !RNQC_HAS_ML_DSA
39
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
40
+ #endif
41
+ if (variant != "ML-DSA-44" && variant != "ML-DSA-65" && variant != "ML-DSA-87") {
42
+ throw std::runtime_error("Invalid ML-DSA variant: " + variant + ". Must be ML-DSA-44, ML-DSA-65, or ML-DSA-87");
43
+ }
44
+ variant_ = variant;
45
+ }
46
+
47
+ std::shared_ptr<Promise<void>> HybridMlDsaKeyPair::generateKeyPair(double publicFormat, double publicType, double privateFormat,
48
+ double privateType) {
49
+ return Promise<void>::async([this, publicFormat, publicType, privateFormat, privateType]() {
50
+ this->generateKeyPairSync(publicFormat, publicType, privateFormat, privateType);
51
+ });
52
+ }
53
+
54
+ void HybridMlDsaKeyPair::generateKeyPairSync(double publicFormat, double publicType, double privateFormat, double privateType) {
55
+ #if !RNQC_HAS_ML_DSA
56
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
57
+ #else
58
+ clearOpenSSLErrors();
59
+
60
+ if (variant_.empty()) {
61
+ throw std::runtime_error("ML-DSA variant not set. Call setVariant() first.");
62
+ }
63
+
64
+ publicFormat_ = static_cast<int>(publicFormat);
65
+ publicType_ = static_cast<int>(publicType);
66
+ privateFormat_ = static_cast<int>(privateFormat);
67
+ privateType_ = static_cast<int>(privateType);
68
+
69
+ if (pkey_ != nullptr) {
70
+ EVP_PKEY_free(pkey_);
71
+ pkey_ = nullptr;
72
+ }
73
+
74
+ EVP_PKEY_CTX* pctx = EVP_PKEY_CTX_new_from_name(nullptr, variant_.c_str(), nullptr);
75
+ if (pctx == nullptr) {
76
+ throw std::runtime_error("Failed to create key context for " + variant_ + ": " + getOpenSSLError());
77
+ }
78
+
79
+ if (EVP_PKEY_keygen_init(pctx) <= 0) {
80
+ EVP_PKEY_CTX_free(pctx);
81
+ throw std::runtime_error("Failed to initialize keygen: " + getOpenSSLError());
82
+ }
83
+
84
+ if (EVP_PKEY_keygen(pctx, &pkey_) <= 0) {
85
+ EVP_PKEY_CTX_free(pctx);
86
+ throw std::runtime_error("Failed to generate ML-DSA key pair: " + getOpenSSLError());
87
+ }
88
+
89
+ EVP_PKEY_CTX_free(pctx);
90
+ #endif
91
+ }
92
+
93
+ std::shared_ptr<ArrayBuffer> HybridMlDsaKeyPair::getPublicKey() {
94
+ #if !RNQC_HAS_ML_DSA
95
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
96
+ #else
97
+ checkKeyPair();
98
+
99
+ BIO* bio = BIO_new(BIO_s_mem());
100
+ if (!bio) {
101
+ throw std::runtime_error("Failed to create BIO for public key export");
102
+ }
103
+
104
+ int result;
105
+ if (publicFormat_ == 1) {
106
+ result = PEM_write_bio_PUBKEY(bio, pkey_);
107
+ } else {
108
+ result = i2d_PUBKEY_bio(bio, pkey_);
109
+ }
110
+
111
+ if (result != 1) {
112
+ BIO_free(bio);
113
+ throw std::runtime_error("Failed to export public key: " + getOpenSSLError());
114
+ }
115
+
116
+ BUF_MEM* bptr;
117
+ BIO_get_mem_ptr(bio, &bptr);
118
+
119
+ uint8_t* data = new uint8_t[bptr->length];
120
+ memcpy(data, bptr->data, bptr->length);
121
+ size_t len = bptr->length;
122
+
123
+ BIO_free(bio);
124
+
125
+ return std::make_shared<NativeArrayBuffer>(data, len, [=]() { delete[] data; });
126
+ #endif
127
+ }
128
+
129
+ std::shared_ptr<ArrayBuffer> HybridMlDsaKeyPair::getPrivateKey() {
130
+ #if !RNQC_HAS_ML_DSA
131
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
132
+ #else
133
+ checkKeyPair();
134
+
135
+ BIO* bio = BIO_new(BIO_s_mem());
136
+ if (!bio) {
137
+ throw std::runtime_error("Failed to create BIO for private key export");
138
+ }
139
+
140
+ int result;
141
+ if (privateFormat_ == 1) {
142
+ result = PEM_write_bio_PrivateKey(bio, pkey_, nullptr, nullptr, 0, nullptr, nullptr);
143
+ } else {
144
+ // Use PKCS8 format for DER export (not raw private key format)
145
+ result = i2d_PKCS8PrivateKey_bio(bio, pkey_, nullptr, nullptr, 0, nullptr, nullptr);
146
+ }
147
+
148
+ if (result != 1) {
149
+ BIO_free(bio);
150
+ throw std::runtime_error("Failed to export private key: " + getOpenSSLError());
151
+ }
152
+
153
+ BUF_MEM* bptr;
154
+ BIO_get_mem_ptr(bio, &bptr);
155
+
156
+ uint8_t* data = new uint8_t[bptr->length];
157
+ memcpy(data, bptr->data, bptr->length);
158
+ size_t len = bptr->length;
159
+
160
+ BIO_free(bio);
161
+
162
+ return std::make_shared<NativeArrayBuffer>(data, len, [=]() { delete[] data; });
163
+ #endif
164
+ }
165
+
166
+ std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> HybridMlDsaKeyPair::sign(const std::shared_ptr<ArrayBuffer>& message) {
167
+ auto nativeMessage = ToNativeArrayBuffer(message);
168
+ return Promise<std::shared_ptr<ArrayBuffer>>::async([this, nativeMessage]() { return this->signSync(nativeMessage); });
169
+ }
170
+
171
+ std::shared_ptr<ArrayBuffer> HybridMlDsaKeyPair::signSync(const std::shared_ptr<ArrayBuffer>& message) {
172
+ #if !RNQC_HAS_ML_DSA
173
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
174
+ #else
175
+ clearOpenSSLErrors();
176
+ checkKeyPair();
177
+
178
+ EVP_MD_CTX* md_ctx = EVP_MD_CTX_new();
179
+ if (md_ctx == nullptr) {
180
+ throw std::runtime_error("Failed to create signing context");
181
+ }
182
+
183
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, variant_.c_str(), nullptr);
184
+ if (pkey_ctx == nullptr) {
185
+ EVP_MD_CTX_free(md_ctx);
186
+ throw std::runtime_error("Failed to create signing context for " + variant_);
187
+ }
188
+
189
+ if (EVP_DigestSignInit(md_ctx, &pkey_ctx, nullptr, nullptr, pkey_) <= 0) {
190
+ EVP_MD_CTX_free(md_ctx);
191
+ EVP_PKEY_CTX_free(pkey_ctx);
192
+ throw std::runtime_error("Failed to initialize signing: " + getOpenSSLError());
193
+ }
194
+
195
+ size_t sig_len = 0;
196
+ if (EVP_DigestSign(md_ctx, nullptr, &sig_len, message->data(), message->size()) <= 0) {
197
+ EVP_MD_CTX_free(md_ctx);
198
+ throw std::runtime_error("Failed to calculate signature size: " + getOpenSSLError());
199
+ }
200
+
201
+ uint8_t* sig = new uint8_t[sig_len];
202
+
203
+ if (EVP_DigestSign(md_ctx, sig, &sig_len, message->data(), message->size()) <= 0) {
204
+ EVP_MD_CTX_free(md_ctx);
205
+ delete[] sig;
206
+ throw std::runtime_error("Failed to sign message: " + getOpenSSLError());
207
+ }
208
+
209
+ EVP_MD_CTX_free(md_ctx);
210
+
211
+ return std::make_shared<NativeArrayBuffer>(sig, sig_len, [=]() { delete[] sig; });
212
+ #endif
213
+ }
214
+
215
+ std::shared_ptr<Promise<bool>> HybridMlDsaKeyPair::verify(const std::shared_ptr<ArrayBuffer>& signature,
216
+ const std::shared_ptr<ArrayBuffer>& message) {
217
+ auto nativeSignature = ToNativeArrayBuffer(signature);
218
+ auto nativeMessage = ToNativeArrayBuffer(message);
219
+ return Promise<bool>::async([this, nativeSignature, nativeMessage]() { return this->verifySync(nativeSignature, nativeMessage); });
220
+ }
221
+
222
+ bool HybridMlDsaKeyPair::verifySync(const std::shared_ptr<ArrayBuffer>& signature, const std::shared_ptr<ArrayBuffer>& message) {
223
+ #if !RNQC_HAS_ML_DSA
224
+ throw std::runtime_error("ML-DSA requires OpenSSL 3.5+");
225
+ #else
226
+ clearOpenSSLErrors();
227
+ checkKeyPair();
228
+
229
+ EVP_MD_CTX* md_ctx = EVP_MD_CTX_new();
230
+ if (md_ctx == nullptr) {
231
+ throw std::runtime_error("Failed to create verify context");
232
+ }
233
+
234
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, variant_.c_str(), nullptr);
235
+ if (pkey_ctx == nullptr) {
236
+ EVP_MD_CTX_free(md_ctx);
237
+ throw std::runtime_error("Failed to create verify context for " + variant_);
238
+ }
239
+
240
+ if (EVP_DigestVerifyInit(md_ctx, &pkey_ctx, nullptr, nullptr, pkey_) <= 0) {
241
+ EVP_MD_CTX_free(md_ctx);
242
+ EVP_PKEY_CTX_free(pkey_ctx);
243
+ throw std::runtime_error("Failed to initialize verification: " + getOpenSSLError());
244
+ }
245
+
246
+ int result = EVP_DigestVerify(md_ctx, signature->data(), signature->size(), message->data(), message->size());
247
+
248
+ EVP_MD_CTX_free(md_ctx);
249
+
250
+ if (result < 0) {
251
+ throw std::runtime_error("Verification error: " + getOpenSSLError());
252
+ }
253
+
254
+ return result == 1;
255
+ #endif
256
+ }
257
+
258
+ void HybridMlDsaKeyPair::checkKeyPair() {
259
+ if (pkey_ == nullptr) {
260
+ throw std::runtime_error("Key pair not initialized");
261
+ }
262
+ }
263
+
264
+ } // namespace margelo::nitro::crypto