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,266 @@
1
+ #include "HybridSignHandle.hpp"
2
+
3
+ #include "../keys/HybridKeyObjectHandle.hpp"
4
+ #include "SignUtils.hpp"
5
+ #include "Utils.hpp"
6
+
7
+ #include <cstring>
8
+ #include <openssl/err.h>
9
+ #include <openssl/evp.h>
10
+ #include <openssl/rsa.h>
11
+
12
+ #if OPENSSL_VERSION_NUMBER >= 0x30500000L
13
+ #define RNQC_HAS_ML_DSA 1
14
+ #else
15
+ #define RNQC_HAS_ML_DSA 0
16
+ #endif
17
+
18
+ namespace margelo::nitro::crypto {
19
+
20
+ using margelo::nitro::NativeArrayBuffer;
21
+
22
+ HybridSignHandle::~HybridSignHandle() {
23
+ if (md_ctx) {
24
+ EVP_MD_CTX_free(md_ctx);
25
+ md_ctx = nullptr;
26
+ }
27
+ }
28
+
29
+ void HybridSignHandle::init(const std::string& algorithm) {
30
+ algorithm_name = algorithm;
31
+
32
+ // For ML-DSA and other pure signature schemes, algorithm may be empty/null
33
+ if (!algorithm.empty()) {
34
+ md = getDigestByName(algorithm);
35
+
36
+ md_ctx = EVP_MD_CTX_new();
37
+ if (!md_ctx) {
38
+ throw std::runtime_error("Failed to create message digest context");
39
+ }
40
+
41
+ if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
42
+ EVP_MD_CTX_free(md_ctx);
43
+ md_ctx = nullptr;
44
+ throw std::runtime_error("Failed to initialize message digest");
45
+ }
46
+ } else {
47
+ // No digest for pure signature schemes like ML-DSA
48
+ md = nullptr;
49
+ md_ctx = EVP_MD_CTX_new();
50
+ if (!md_ctx) {
51
+ throw std::runtime_error("Failed to create message digest context");
52
+ }
53
+ }
54
+ }
55
+
56
+ void HybridSignHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
57
+ if (!md_ctx) {
58
+ throw std::runtime_error("Sign not initialized");
59
+ }
60
+
61
+ auto native_data = ToNativeArrayBuffer(data);
62
+
63
+ // Accumulate raw data for potential one-shot signing (Ed25519/Ed448/ML-DSA)
64
+ const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
65
+ data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
66
+
67
+ // Only update digest if we have one (not needed for pure signature schemes)
68
+ if (md != nullptr) {
69
+ if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
70
+ unsigned long err = ERR_get_error();
71
+ char err_buf[256];
72
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
73
+ throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
74
+ }
75
+ }
76
+ }
77
+
78
+ // Check if key type requires one-shot signing (Ed25519, Ed448, ML-DSA)
79
+ static bool isOneShotVariant(EVP_PKEY* pkey) {
80
+ int type = EVP_PKEY_id(pkey);
81
+ #if RNQC_HAS_ML_DSA
82
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448 || type == EVP_PKEY_ML_DSA_44 || type == EVP_PKEY_ML_DSA_65 ||
83
+ type == EVP_PKEY_ML_DSA_87;
84
+ #else
85
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
86
+ #endif
87
+ }
88
+
89
+ // Get the algorithm name for creating PKEY_CTX (for ML-DSA variants)
90
+ static const char* getAlgorithmName(EVP_PKEY* pkey) {
91
+ int type = EVP_PKEY_id(pkey);
92
+ #if RNQC_HAS_ML_DSA
93
+ switch (type) {
94
+ case EVP_PKEY_ML_DSA_44:
95
+ return "ML-DSA-44";
96
+ case EVP_PKEY_ML_DSA_65:
97
+ return "ML-DSA-65";
98
+ case EVP_PKEY_ML_DSA_87:
99
+ return "ML-DSA-87";
100
+ case EVP_PKEY_ED25519:
101
+ return "ED25519";
102
+ case EVP_PKEY_ED448:
103
+ return "ED448";
104
+ default:
105
+ return nullptr;
106
+ }
107
+ #else
108
+ switch (type) {
109
+ case EVP_PKEY_ED25519:
110
+ return "ED25519";
111
+ case EVP_PKEY_ED448:
112
+ return "ED448";
113
+ default:
114
+ return nullptr;
115
+ }
116
+ #endif
117
+ }
118
+
119
+ std::shared_ptr<ArrayBuffer> HybridSignHandle::sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
120
+ std::optional<double> padding, std::optional<double> saltLength,
121
+ std::optional<double> dsaEncoding) {
122
+ if (!md_ctx) {
123
+ throw std::runtime_error("Sign not initialized");
124
+ }
125
+
126
+ auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
127
+ EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
128
+
129
+ if (!pkey) {
130
+ throw std::runtime_error("Invalid private key for signing");
131
+ }
132
+
133
+ size_t sig_len = 0;
134
+ std::unique_ptr<uint8_t[]> sig_buf;
135
+
136
+ int pkey_type = EVP_PKEY_id(pkey);
137
+ bool is_one_shot = isOneShotVariant(pkey);
138
+
139
+ // Ed25519/Ed448/ML-DSA require one-shot signing with EVP_DigestSign
140
+ // Also use one-shot path if no digest was specified (md == nullptr)
141
+ if (is_one_shot || md == nullptr) {
142
+ // Create a new context for one-shot signing
143
+ EVP_MD_CTX* sign_ctx = EVP_MD_CTX_new();
144
+ if (!sign_ctx) {
145
+ throw std::runtime_error("Failed to create signing context");
146
+ }
147
+
148
+ // Get algorithm name and create PKEY_CTX for ML-DSA
149
+ const char* alg_name = getAlgorithmName(pkey);
150
+ EVP_PKEY_CTX* pkey_ctx = nullptr;
151
+ if (alg_name != nullptr) {
152
+ pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, alg_name, nullptr);
153
+ if (!pkey_ctx) {
154
+ EVP_MD_CTX_free(sign_ctx);
155
+ throw std::runtime_error(std::string("Failed to create signing context for ") + alg_name);
156
+ }
157
+ }
158
+
159
+ // Initialize for one-shot signing (pass nullptr for md - these algorithms have built-in hash)
160
+ if (EVP_DigestSignInit(sign_ctx, pkey_ctx ? &pkey_ctx : nullptr, nullptr, nullptr, pkey) <= 0) {
161
+ EVP_MD_CTX_free(sign_ctx);
162
+ if (pkey_ctx)
163
+ EVP_PKEY_CTX_free(pkey_ctx);
164
+ throw std::runtime_error("Failed to initialize one-shot signing");
165
+ }
166
+
167
+ // Get the accumulated data from the digest context
168
+ // For Ed25519/Ed448, we need to pass the original data, not a digest
169
+ // Since we've been accumulating with DigestUpdate, we need to use the data buffer
170
+ // Unfortunately, EVP_MD_CTX doesn't expose the accumulated data directly
171
+ // We need to use EVP_DigestSign with the accumulated data
172
+
173
+ // For one-shot variants, determine signature length first
174
+ if (EVP_DigestSign(sign_ctx, nullptr, &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
175
+ EVP_MD_CTX_free(sign_ctx);
176
+ throw std::runtime_error("Failed to determine Ed signature length");
177
+ }
178
+
179
+ sig_buf = std::make_unique<uint8_t[]>(sig_len);
180
+ if (EVP_DigestSign(sign_ctx, sig_buf.get(), &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
181
+ EVP_MD_CTX_free(sign_ctx);
182
+ unsigned long err = ERR_get_error();
183
+ char err_buf[256];
184
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
185
+ throw std::runtime_error("Failed to sign with Ed key: " + std::string(err_buf));
186
+ }
187
+
188
+ EVP_MD_CTX_free(sign_ctx);
189
+ } else {
190
+ // Standard signing flow for RSA/ECDSA
191
+ unsigned char digest[EVP_MAX_MD_SIZE];
192
+ unsigned int digest_len = 0;
193
+
194
+ if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
195
+ throw std::runtime_error("Failed to finalize digest");
196
+ }
197
+
198
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
199
+ if (!pkey_ctx) {
200
+ throw std::runtime_error("Failed to create signing context");
201
+ }
202
+
203
+ if (EVP_PKEY_sign_init(pkey_ctx) <= 0) {
204
+ EVP_PKEY_CTX_free(pkey_ctx);
205
+ char err_buf[512];
206
+ snprintf(err_buf, sizeof(err_buf), "Failed to initialize signing for key type %d (expected one-shot: %s, RNQC_HAS_ML_DSA=%d)",
207
+ pkey_type, is_one_shot ? "true" : "false", RNQC_HAS_ML_DSA);
208
+ throw std::runtime_error(std::string(err_buf) + ": " + getOpenSSLError());
209
+ }
210
+
211
+ if (padding.has_value()) {
212
+ int pad = static_cast<int>(padding.value());
213
+ if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
214
+ EVP_PKEY_CTX_free(pkey_ctx);
215
+ throw std::runtime_error("Failed to set RSA padding");
216
+ }
217
+ }
218
+
219
+ if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
220
+ int salt_len = static_cast<int>(saltLength.value());
221
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
222
+ EVP_PKEY_CTX_free(pkey_ctx);
223
+ throw std::runtime_error("Failed to set PSS salt length");
224
+ }
225
+ }
226
+
227
+ if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
228
+ EVP_PKEY_CTX_free(pkey_ctx);
229
+ throw std::runtime_error("Failed to set signature digest");
230
+ }
231
+
232
+ if (EVP_PKEY_sign(pkey_ctx, nullptr, &sig_len, digest, digest_len) <= 0) {
233
+ EVP_PKEY_CTX_free(pkey_ctx);
234
+ throw std::runtime_error("Failed to determine signature length");
235
+ }
236
+
237
+ sig_buf = std::make_unique<uint8_t[]>(sig_len);
238
+ if (EVP_PKEY_sign(pkey_ctx, sig_buf.get(), &sig_len, digest, digest_len) <= 0) {
239
+ EVP_PKEY_CTX_free(pkey_ctx);
240
+ unsigned long err = ERR_get_error();
241
+ char err_buf[256];
242
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
243
+ throw std::runtime_error("Failed to sign: " + std::string(err_buf));
244
+ }
245
+
246
+ EVP_PKEY_CTX_free(pkey_ctx);
247
+ }
248
+
249
+ int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
250
+ if (dsa_enc == kSigEncP1363) {
251
+ unsigned int n = getBytesOfRS(pkey);
252
+ if (n > 0) {
253
+ auto p1363_buf = std::make_unique<uint8_t[]>(2 * n);
254
+ std::memset(p1363_buf.get(), 0, 2 * n);
255
+ if (convertSignatureToP1363(sig_buf.get(), sig_len, p1363_buf.get(), n)) {
256
+ uint8_t* raw_ptr = p1363_buf.get();
257
+ return std::make_shared<NativeArrayBuffer>(p1363_buf.release(), 2 * n, [raw_ptr]() { delete[] raw_ptr; });
258
+ }
259
+ }
260
+ }
261
+
262
+ uint8_t* raw_ptr = sig_buf.get();
263
+ return std::make_shared<NativeArrayBuffer>(sig_buf.release(), sig_len, [raw_ptr]() { delete[] raw_ptr; });
264
+ }
265
+
266
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+ #include <NitroModules/ArrayBuffer.hpp>
4
+ #include <memory>
5
+ #include <openssl/evp.h>
6
+ #include <optional>
7
+ #include <string>
8
+ #include <vector>
9
+
10
+ #include "HybridKeyObjectHandleSpec.hpp"
11
+ #include "HybridSignHandleSpec.hpp"
12
+
13
+ namespace margelo::nitro::crypto {
14
+
15
+ using namespace facebook;
16
+
17
+ class HybridSignHandle : public HybridSignHandleSpec {
18
+ public:
19
+ HybridSignHandle() : HybridObject(TAG) {}
20
+ ~HybridSignHandle();
21
+
22
+ public:
23
+ void init(const std::string& algorithm) override;
24
+ void update(const std::shared_ptr<ArrayBuffer>& data) override;
25
+ std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, std::optional<double> padding,
26
+ std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
27
+
28
+ private:
29
+ EVP_MD_CTX* md_ctx = nullptr;
30
+ const EVP_MD* md = nullptr;
31
+ std::string algorithm_name;
32
+ // Buffer for accumulating data for one-shot signing (Ed25519/Ed448)
33
+ std::vector<uint8_t> data_buffer;
34
+ };
35
+
36
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,227 @@
1
+ #include "HybridVerifyHandle.hpp"
2
+
3
+ #include "../keys/HybridKeyObjectHandle.hpp"
4
+ #include "SignUtils.hpp"
5
+ #include "Utils.hpp"
6
+
7
+ #include <cstring>
8
+ #include <openssl/err.h>
9
+ #include <openssl/evp.h>
10
+ #include <openssl/rsa.h>
11
+
12
+ #if OPENSSL_VERSION_NUMBER >= 0x30500000L
13
+ #define RNQC_HAS_ML_DSA 1
14
+ #else
15
+ #define RNQC_HAS_ML_DSA 0
16
+ #endif
17
+
18
+ namespace margelo::nitro::crypto {
19
+
20
+ using margelo::nitro::NativeArrayBuffer;
21
+
22
+ HybridVerifyHandle::~HybridVerifyHandle() {
23
+ if (md_ctx) {
24
+ EVP_MD_CTX_free(md_ctx);
25
+ md_ctx = nullptr;
26
+ }
27
+ }
28
+
29
+ void HybridVerifyHandle::init(const std::string& algorithm) {
30
+ algorithm_name = algorithm;
31
+
32
+ // For ML-DSA and other pure signature schemes, algorithm may be empty/null
33
+ if (!algorithm.empty()) {
34
+ md = getDigestByName(algorithm);
35
+
36
+ md_ctx = EVP_MD_CTX_new();
37
+ if (!md_ctx) {
38
+ throw std::runtime_error("Failed to create message digest context");
39
+ }
40
+
41
+ if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
42
+ EVP_MD_CTX_free(md_ctx);
43
+ md_ctx = nullptr;
44
+ throw std::runtime_error("Failed to initialize message digest");
45
+ }
46
+ } else {
47
+ // No digest for pure signature schemes like ML-DSA
48
+ md = nullptr;
49
+ md_ctx = EVP_MD_CTX_new();
50
+ if (!md_ctx) {
51
+ throw std::runtime_error("Failed to create message digest context");
52
+ }
53
+ }
54
+ }
55
+
56
+ void HybridVerifyHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
57
+ if (!md_ctx) {
58
+ throw std::runtime_error("Verify not initialized");
59
+ }
60
+
61
+ auto native_data = ToNativeArrayBuffer(data);
62
+
63
+ // Accumulate raw data for potential one-shot verification (Ed25519/Ed448/ML-DSA)
64
+ const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
65
+ data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
66
+
67
+ // Only update digest if we have one (not needed for pure signature schemes)
68
+ if (md != nullptr) {
69
+ if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
70
+ unsigned long err = ERR_get_error();
71
+ char err_buf[256];
72
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
73
+ throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
74
+ }
75
+ }
76
+ }
77
+
78
+ // Check if key type requires one-shot verification (Ed25519, Ed448, ML-DSA)
79
+ static bool isOneShotVariant(EVP_PKEY* pkey) {
80
+ int type = EVP_PKEY_id(pkey);
81
+ #if RNQC_HAS_ML_DSA
82
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448 || type == EVP_PKEY_ML_DSA_44 || type == EVP_PKEY_ML_DSA_65 ||
83
+ type == EVP_PKEY_ML_DSA_87;
84
+ #else
85
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
86
+ #endif
87
+ }
88
+
89
+ // Get the algorithm name for creating PKEY_CTX (for ML-DSA variants)
90
+ static const char* getAlgorithmName(EVP_PKEY* pkey) {
91
+ int type = EVP_PKEY_id(pkey);
92
+ #if RNQC_HAS_ML_DSA
93
+ switch (type) {
94
+ case EVP_PKEY_ML_DSA_44:
95
+ return "ML-DSA-44";
96
+ case EVP_PKEY_ML_DSA_65:
97
+ return "ML-DSA-65";
98
+ case EVP_PKEY_ML_DSA_87:
99
+ return "ML-DSA-87";
100
+ case EVP_PKEY_ED25519:
101
+ return "ED25519";
102
+ case EVP_PKEY_ED448:
103
+ return "ED448";
104
+ default:
105
+ return nullptr;
106
+ }
107
+ #else
108
+ switch (type) {
109
+ case EVP_PKEY_ED25519:
110
+ return "ED25519";
111
+ case EVP_PKEY_ED448:
112
+ return "ED448";
113
+ default:
114
+ return nullptr;
115
+ }
116
+ #endif
117
+ }
118
+
119
+ bool HybridVerifyHandle::verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
120
+ std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) {
121
+ if (!md_ctx) {
122
+ throw std::runtime_error("Verify not initialized");
123
+ }
124
+
125
+ auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
126
+ EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
127
+
128
+ if (!pkey) {
129
+ throw std::runtime_error("Invalid public key for verification");
130
+ }
131
+
132
+ auto native_sig = ToNativeArrayBuffer(signature);
133
+ const unsigned char* sig_data = native_sig->data();
134
+ size_t sig_len = native_sig->size();
135
+
136
+ // Ed25519/Ed448/ML-DSA require one-shot verification with EVP_DigestVerify
137
+ // Also use one-shot path if no digest was specified (md == nullptr)
138
+ if (isOneShotVariant(pkey) || md == nullptr) {
139
+ EVP_MD_CTX* verify_ctx = EVP_MD_CTX_new();
140
+ if (!verify_ctx) {
141
+ throw std::runtime_error("Failed to create verification context");
142
+ }
143
+
144
+ // Get algorithm name and create PKEY_CTX for ML-DSA
145
+ const char* alg_name = getAlgorithmName(pkey);
146
+ EVP_PKEY_CTX* pkey_ctx = nullptr;
147
+ if (alg_name != nullptr) {
148
+ pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, alg_name, nullptr);
149
+ if (!pkey_ctx) {
150
+ EVP_MD_CTX_free(verify_ctx);
151
+ throw std::runtime_error(std::string("Failed to create verification context for ") + alg_name);
152
+ }
153
+ }
154
+
155
+ // Initialize for one-shot verification (pass nullptr for md - these algorithms have built-in hash)
156
+ if (EVP_DigestVerifyInit(verify_ctx, pkey_ctx ? &pkey_ctx : nullptr, nullptr, nullptr, pkey) <= 0) {
157
+ EVP_MD_CTX_free(verify_ctx);
158
+ if (pkey_ctx)
159
+ EVP_PKEY_CTX_free(pkey_ctx);
160
+ throw std::runtime_error("Failed to initialize one-shot verification");
161
+ }
162
+
163
+ int result = EVP_DigestVerify(verify_ctx, sig_data, sig_len, data_buffer.data(), data_buffer.size());
164
+ EVP_MD_CTX_free(verify_ctx);
165
+ return result == 1;
166
+ }
167
+
168
+ // Standard verification flow for RSA/ECDSA
169
+ unsigned char digest[EVP_MAX_MD_SIZE];
170
+ unsigned int digest_len = 0;
171
+
172
+ if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
173
+ throw std::runtime_error("Failed to finalize digest");
174
+ }
175
+
176
+ std::unique_ptr<uint8_t[]> der_sig_buf;
177
+ int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
178
+ if (dsa_enc == kSigEncP1363) {
179
+ unsigned int n = getBytesOfRS(pkey);
180
+ if (n > 0) {
181
+ size_t der_len = 0;
182
+ der_sig_buf = convertSignatureToDER(sig_data, sig_len, n, &der_len);
183
+ if (der_sig_buf) {
184
+ sig_data = der_sig_buf.get();
185
+ sig_len = der_len;
186
+ }
187
+ }
188
+ }
189
+
190
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
191
+ if (!pkey_ctx) {
192
+ throw std::runtime_error("Failed to create verification context");
193
+ }
194
+
195
+ if (EVP_PKEY_verify_init(pkey_ctx) <= 0) {
196
+ EVP_PKEY_CTX_free(pkey_ctx);
197
+ throw std::runtime_error("Failed to initialize verification");
198
+ }
199
+
200
+ if (padding.has_value()) {
201
+ int pad = static_cast<int>(padding.value());
202
+ if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
203
+ EVP_PKEY_CTX_free(pkey_ctx);
204
+ throw std::runtime_error("Failed to set RSA padding");
205
+ }
206
+ }
207
+
208
+ if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
209
+ int salt_len = static_cast<int>(saltLength.value());
210
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
211
+ EVP_PKEY_CTX_free(pkey_ctx);
212
+ throw std::runtime_error("Failed to set PSS salt length");
213
+ }
214
+ }
215
+
216
+ if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
217
+ EVP_PKEY_CTX_free(pkey_ctx);
218
+ throw std::runtime_error("Failed to set signature digest");
219
+ }
220
+
221
+ int result = EVP_PKEY_verify(pkey_ctx, sig_data, sig_len, digest, digest_len);
222
+ EVP_PKEY_CTX_free(pkey_ctx);
223
+
224
+ return result == 1;
225
+ }
226
+
227
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+ #include <NitroModules/ArrayBuffer.hpp>
4
+ #include <memory>
5
+ #include <openssl/evp.h>
6
+ #include <optional>
7
+ #include <string>
8
+ #include <vector>
9
+
10
+ #include "HybridKeyObjectHandleSpec.hpp"
11
+ #include "HybridVerifyHandleSpec.hpp"
12
+
13
+ namespace margelo::nitro::crypto {
14
+
15
+ using namespace facebook;
16
+
17
+ class HybridVerifyHandle : public HybridVerifyHandleSpec {
18
+ public:
19
+ HybridVerifyHandle() : HybridObject(TAG) {}
20
+ ~HybridVerifyHandle();
21
+
22
+ public:
23
+ void init(const std::string& algorithm) override;
24
+ void update(const std::shared_ptr<ArrayBuffer>& data) override;
25
+ bool verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
26
+ std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
27
+
28
+ private:
29
+ EVP_MD_CTX* md_ctx = nullptr;
30
+ const EVP_MD* md = nullptr;
31
+ std::string algorithm_name;
32
+ // Buffer for accumulating data for one-shot verification (Ed25519/Ed448)
33
+ std::vector<uint8_t> data_buffer;
34
+ };
35
+
36
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,108 @@
1
+ #pragma once
2
+
3
+ #include <cstring>
4
+ #include <memory>
5
+ #include <openssl/dsa.h>
6
+ #include <openssl/ec.h>
7
+ #include <openssl/ecdsa.h>
8
+ #include <openssl/evp.h>
9
+ #include <string>
10
+
11
+ namespace margelo::nitro::crypto {
12
+
13
+ enum DSASigEnc {
14
+ kSigEncDER = 0,
15
+ kSigEncP1363 = 1,
16
+ };
17
+
18
+ inline const EVP_MD* getDigestByName(const std::string& algorithm) {
19
+ if (algorithm == "SHA1" || algorithm == "sha1" || algorithm == "SHA-1" || algorithm == "sha-1") {
20
+ return EVP_sha1();
21
+ } else if (algorithm == "SHA224" || algorithm == "sha224" || algorithm == "SHA-224" || algorithm == "sha-224") {
22
+ return EVP_sha224();
23
+ } else if (algorithm == "SHA256" || algorithm == "sha256" || algorithm == "SHA-256" || algorithm == "sha-256") {
24
+ return EVP_sha256();
25
+ } else if (algorithm == "SHA384" || algorithm == "sha384" || algorithm == "SHA-384" || algorithm == "sha-384") {
26
+ return EVP_sha384();
27
+ } else if (algorithm == "SHA512" || algorithm == "sha512" || algorithm == "SHA-512" || algorithm == "sha-512") {
28
+ return EVP_sha512();
29
+ } else if (algorithm == "SHA3-224" || algorithm == "sha3-224") {
30
+ return EVP_sha3_224();
31
+ } else if (algorithm == "SHA3-256" || algorithm == "sha3-256") {
32
+ return EVP_sha3_256();
33
+ } else if (algorithm == "SHA3-384" || algorithm == "sha3-384") {
34
+ return EVP_sha3_384();
35
+ } else if (algorithm == "SHA3-512" || algorithm == "sha3-512") {
36
+ return EVP_sha3_512();
37
+ }
38
+ throw std::runtime_error("Unsupported hash algorithm: " + algorithm);
39
+ }
40
+
41
+ inline unsigned int getBytesOfRS(EVP_PKEY* pkey) {
42
+ int bits;
43
+ int base_id = EVP_PKEY_base_id(pkey);
44
+
45
+ if (base_id == EVP_PKEY_DSA) {
46
+ const DSA* dsa_key = EVP_PKEY_get0_DSA(pkey);
47
+ bits = BN_num_bits(DSA_get0_q(dsa_key));
48
+ } else if (base_id == EVP_PKEY_EC) {
49
+ const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey);
50
+ const EC_GROUP* ec_group = EC_KEY_get0_group(ec_key);
51
+ bits = EC_GROUP_order_bits(ec_group);
52
+ } else {
53
+ return 0;
54
+ }
55
+
56
+ return (bits + 7) / 8;
57
+ }
58
+
59
+ inline bool convertSignatureToP1363(const unsigned char* sig_data, size_t sig_len, unsigned char* out, size_t n) {
60
+ ECDSA_SIG* asn1_sig = d2i_ECDSA_SIG(nullptr, &sig_data, sig_len);
61
+ if (!asn1_sig)
62
+ return false;
63
+
64
+ const BIGNUM* pr = ECDSA_SIG_get0_r(asn1_sig);
65
+ const BIGNUM* ps = ECDSA_SIG_get0_s(asn1_sig);
66
+
67
+ bool success = BN_bn2binpad(pr, out, static_cast<int>(n)) > 0 && BN_bn2binpad(ps, out + n, static_cast<int>(n)) > 0;
68
+ ECDSA_SIG_free(asn1_sig);
69
+ return success;
70
+ }
71
+
72
+ inline std::unique_ptr<uint8_t[]> convertSignatureToDER(const unsigned char* sig_data, size_t sig_len, size_t n, size_t* out_len) {
73
+ if (sig_len != 2 * n) {
74
+ return nullptr;
75
+ }
76
+
77
+ ECDSA_SIG* asn1_sig = ECDSA_SIG_new();
78
+ if (!asn1_sig)
79
+ return nullptr;
80
+
81
+ BIGNUM* r = BN_bin2bn(sig_data, static_cast<int>(n), nullptr);
82
+ BIGNUM* s = BN_bin2bn(sig_data + n, static_cast<int>(n), nullptr);
83
+
84
+ if (!r || !s || !ECDSA_SIG_set0(asn1_sig, r, s)) {
85
+ if (r)
86
+ BN_free(r);
87
+ if (s)
88
+ BN_free(s);
89
+ ECDSA_SIG_free(asn1_sig);
90
+ return nullptr;
91
+ }
92
+
93
+ int der_len = i2d_ECDSA_SIG(asn1_sig, nullptr);
94
+ if (der_len <= 0) {
95
+ ECDSA_SIG_free(asn1_sig);
96
+ return nullptr;
97
+ }
98
+
99
+ auto der_buf = std::make_unique<uint8_t[]>(der_len);
100
+ unsigned char* der_ptr = der_buf.get();
101
+ i2d_ECDSA_SIG(asn1_sig, &der_ptr);
102
+
103
+ ECDSA_SIG_free(asn1_sig);
104
+ *out_len = der_len;
105
+ return der_buf;
106
+ }
107
+
108
+ } // namespace margelo::nitro::crypto