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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/QuickCrypto.podspec +145 -6
  2. package/README.md +14 -27
  3. package/android/CMakeLists.txt +62 -7
  4. package/android/build.gradle +12 -2
  5. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +0 -2
  6. package/app.plugin.js +3 -0
  7. package/cpp/blake3/HybridBlake3.cpp +118 -0
  8. package/cpp/blake3/HybridBlake3.hpp +35 -0
  9. package/cpp/cipher/CCMCipher.cpp +199 -0
  10. package/cpp/cipher/CCMCipher.hpp +26 -0
  11. package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
  12. package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
  13. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
  14. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
  15. package/cpp/cipher/GCMCipher.cpp +68 -0
  16. package/cpp/cipher/GCMCipher.hpp +14 -0
  17. package/cpp/cipher/HybridCipher.cpp +322 -0
  18. package/cpp/cipher/HybridCipher.hpp +68 -0
  19. package/cpp/cipher/HybridCipherFactory.hpp +105 -0
  20. package/cpp/cipher/HybridRsaCipher.cpp +348 -0
  21. package/cpp/cipher/HybridRsaCipher.hpp +29 -0
  22. package/cpp/cipher/OCBCipher.cpp +55 -0
  23. package/cpp/cipher/OCBCipher.hpp +19 -0
  24. package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
  25. package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
  26. package/cpp/ec/HybridEcKeyPair.cpp +428 -0
  27. package/cpp/ec/HybridEcKeyPair.hpp +48 -0
  28. package/cpp/ed25519/HybridEdKeyPair.cpp +228 -98
  29. package/cpp/ed25519/HybridEdKeyPair.hpp +42 -56
  30. package/cpp/hash/HybridHash.cpp +185 -0
  31. package/cpp/hash/HybridHash.hpp +43 -0
  32. package/cpp/hmac/HybridHmac.cpp +95 -0
  33. package/cpp/hmac/HybridHmac.hpp +31 -0
  34. package/cpp/keys/HybridKeyObjectHandle.cpp +749 -0
  35. package/cpp/keys/HybridKeyObjectHandle.hpp +51 -0
  36. package/cpp/keys/KeyObjectData.cpp +268 -0
  37. package/cpp/keys/KeyObjectData.hpp +71 -0
  38. package/cpp/keys/node.h +5 -0
  39. package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
  40. package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
  41. package/cpp/random/HybridRandom.cpp +6 -17
  42. package/cpp/random/HybridRandom.hpp +5 -6
  43. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  44. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  45. package/cpp/sign/HybridSignHandle.cpp +191 -0
  46. package/cpp/sign/HybridSignHandle.hpp +36 -0
  47. package/cpp/sign/HybridVerifyHandle.cpp +158 -0
  48. package/cpp/sign/HybridVerifyHandle.hpp +36 -0
  49. package/cpp/sign/SignUtils.hpp +108 -0
  50. package/cpp/utils/Macros.hpp +68 -0
  51. package/cpp/utils/Utils.hpp +43 -2
  52. package/cpp/utils/base64.h +309 -0
  53. package/deps/blake3/.cargo/config.toml +2 -0
  54. package/deps/blake3/.git-blame-ignore-revs +2 -0
  55. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  56. package/deps/blake3/.github/workflows/ci.yml +491 -0
  57. package/deps/blake3/.github/workflows/tag.yml +43 -0
  58. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  59. package/deps/blake3/CONTRIBUTING.md +31 -0
  60. package/deps/blake3/Cargo.toml +135 -0
  61. package/deps/blake3/LICENSE_A2 +202 -0
  62. package/deps/blake3/LICENSE_A2LLVM +219 -0
  63. package/deps/blake3/LICENSE_CC0 +121 -0
  64. package/deps/blake3/README.md +229 -0
  65. package/deps/blake3/b3sum/Cargo.lock +513 -0
  66. package/deps/blake3/b3sum/Cargo.toml +26 -0
  67. package/deps/blake3/b3sum/README.md +72 -0
  68. package/deps/blake3/b3sum/src/main.rs +564 -0
  69. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  70. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  71. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  72. package/deps/blake3/benches/bench.rs +623 -0
  73. package/deps/blake3/build.rs +389 -0
  74. package/deps/blake3/c/CMakeLists.txt +383 -0
  75. package/deps/blake3/c/CMakePresets.json +73 -0
  76. package/deps/blake3/c/Makefile.testing +82 -0
  77. package/deps/blake3/c/README.md +403 -0
  78. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  79. package/deps/blake3/c/blake3.c +650 -0
  80. package/deps/blake3/c/blake3.h +86 -0
  81. package/deps/blake3/c/blake3_avx2.c +326 -0
  82. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  83. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  84. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  85. package/deps/blake3/c/blake3_avx512.c +1388 -0
  86. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  87. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  88. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  89. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  90. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  91. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  92. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  93. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  94. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  95. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  96. package/deps/blake3/c/blake3_dispatch.c +332 -0
  97. package/deps/blake3/c/blake3_impl.h +333 -0
  98. package/deps/blake3/c/blake3_neon.c +366 -0
  99. package/deps/blake3/c/blake3_portable.c +160 -0
  100. package/deps/blake3/c/blake3_sse2.c +566 -0
  101. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  102. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  103. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  104. package/deps/blake3/c/blake3_sse41.c +560 -0
  105. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  106. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  107. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  108. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  109. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  110. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  111. package/deps/blake3/c/example.c +36 -0
  112. package/deps/blake3/c/example_tbb.c +57 -0
  113. package/deps/blake3/c/libblake3.pc.in +12 -0
  114. package/deps/blake3/c/main.c +166 -0
  115. package/deps/blake3/c/test.py +97 -0
  116. package/deps/blake3/media/B3.svg +70 -0
  117. package/deps/blake3/media/BLAKE3.svg +85 -0
  118. package/deps/blake3/media/speed.svg +1474 -0
  119. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  120. package/deps/blake3/reference_impl/README.md +14 -0
  121. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  122. package/deps/blake3/src/ffi_avx2.rs +65 -0
  123. package/deps/blake3/src/ffi_avx512.rs +169 -0
  124. package/deps/blake3/src/ffi_neon.rs +82 -0
  125. package/deps/blake3/src/ffi_sse2.rs +126 -0
  126. package/deps/blake3/src/ffi_sse41.rs +126 -0
  127. package/deps/blake3/src/guts.rs +60 -0
  128. package/deps/blake3/src/hazmat.rs +704 -0
  129. package/deps/blake3/src/io.rs +64 -0
  130. package/deps/blake3/src/join.rs +92 -0
  131. package/deps/blake3/src/lib.rs +1835 -0
  132. package/deps/blake3/src/platform.rs +587 -0
  133. package/deps/blake3/src/portable.rs +198 -0
  134. package/deps/blake3/src/rust_avx2.rs +474 -0
  135. package/deps/blake3/src/rust_sse2.rs +775 -0
  136. package/deps/blake3/src/rust_sse41.rs +766 -0
  137. package/deps/blake3/src/test.rs +1049 -0
  138. package/deps/blake3/src/traits.rs +227 -0
  139. package/deps/blake3/src/wasm32_simd.rs +794 -0
  140. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  141. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  142. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  143. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  144. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  145. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  146. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  147. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  148. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  149. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  150. package/deps/blake3/tools/release.md +16 -0
  151. package/deps/fastpbkdf2/fastpbkdf2.c +5 -1
  152. package/deps/ncrypto/ncrypto.cc +4679 -0
  153. package/deps/ncrypto/ncrypto.h +1625 -0
  154. package/lib/commonjs/blake3.js +98 -0
  155. package/lib/commonjs/blake3.js.map +1 -0
  156. package/lib/commonjs/cipher.js +180 -0
  157. package/lib/commonjs/cipher.js.map +1 -0
  158. package/lib/commonjs/constants.js +32 -0
  159. package/lib/commonjs/constants.js.map +1 -0
  160. package/lib/commonjs/ec.js +480 -0
  161. package/lib/commonjs/ec.js.map +1 -0
  162. package/lib/commonjs/ed.js +214 -2
  163. package/lib/commonjs/ed.js.map +1 -1
  164. package/lib/commonjs/expo-plugin/@types.js +2 -0
  165. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  166. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  167. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  168. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  169. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  170. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  171. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  172. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  173. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  174. package/lib/commonjs/hash.js +215 -0
  175. package/lib/commonjs/hash.js.map +1 -0
  176. package/lib/commonjs/hmac.js +109 -0
  177. package/lib/commonjs/hmac.js.map +1 -0
  178. package/lib/commonjs/index.js +102 -24
  179. package/lib/commonjs/index.js.map +1 -1
  180. package/lib/commonjs/keys/classes.js +109 -52
  181. package/lib/commonjs/keys/classes.js.map +1 -1
  182. package/lib/commonjs/keys/generateKeyPair.js +141 -144
  183. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  184. package/lib/commonjs/keys/index.js +229 -0
  185. package/lib/commonjs/keys/index.js.map +1 -1
  186. package/lib/commonjs/keys/publicCipher.js +152 -0
  187. package/lib/commonjs/keys/publicCipher.js.map +1 -0
  188. package/lib/commonjs/keys/signVerify.js +178 -39
  189. package/lib/commonjs/keys/signVerify.js.map +1 -1
  190. package/lib/commonjs/keys/utils.js +18 -13
  191. package/lib/commonjs/keys/utils.js.map +1 -1
  192. package/lib/commonjs/pbkdf2.js.map +1 -1
  193. package/lib/commonjs/random.js +6 -0
  194. package/lib/commonjs/random.js.map +1 -1
  195. package/lib/commonjs/rsa.js +202 -0
  196. package/lib/commonjs/rsa.js.map +1 -0
  197. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  198. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  199. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  200. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  201. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  202. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  203. package/lib/commonjs/specs/hash.nitro.js +6 -0
  204. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  205. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  206. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  207. package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
  208. package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
  209. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  210. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  211. package/lib/commonjs/specs/sign.nitro.js +6 -0
  212. package/lib/commonjs/specs/sign.nitro.js.map +1 -0
  213. package/lib/commonjs/subtle.js +987 -0
  214. package/lib/commonjs/subtle.js.map +1 -0
  215. package/lib/commonjs/utils/cipher.js +64 -0
  216. package/lib/commonjs/utils/cipher.js.map +1 -0
  217. package/lib/commonjs/utils/conversion.js +44 -5
  218. package/lib/commonjs/utils/conversion.js.map +1 -1
  219. package/lib/commonjs/utils/hashnames.js +2 -1
  220. package/lib/commonjs/utils/hashnames.js.map +1 -1
  221. package/lib/commonjs/utils/index.js +11 -0
  222. package/lib/commonjs/utils/index.js.map +1 -1
  223. package/lib/commonjs/utils/noble.js +82 -0
  224. package/lib/commonjs/utils/noble.js.map +1 -0
  225. package/lib/commonjs/utils/types.js +32 -17
  226. package/lib/commonjs/utils/types.js.map +1 -1
  227. package/lib/commonjs/utils/validation.js +74 -1
  228. package/lib/commonjs/utils/validation.js.map +1 -1
  229. package/lib/module/blake3.js +90 -0
  230. package/lib/module/blake3.js.map +1 -0
  231. package/lib/module/cipher.js +173 -0
  232. package/lib/module/cipher.js.map +1 -0
  233. package/lib/module/constants.js +28 -0
  234. package/lib/module/constants.js.map +1 -0
  235. package/lib/module/ec.js +470 -0
  236. package/lib/module/ec.js.map +1 -0
  237. package/lib/module/ed.js +212 -3
  238. package/lib/module/ed.js.map +1 -1
  239. package/lib/module/expo-plugin/@types.js +2 -0
  240. package/lib/module/expo-plugin/@types.js.map +1 -0
  241. package/lib/module/expo-plugin/withRNQC.js +21 -0
  242. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  243. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  244. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  245. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  246. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  247. package/lib/module/expo-plugin/withXCode.js +46 -0
  248. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  249. package/lib/module/hash.js +207 -0
  250. package/lib/module/hash.js.map +1 -0
  251. package/lib/module/hmac.js +104 -0
  252. package/lib/module/hmac.js.map +1 -0
  253. package/lib/module/index.js +21 -21
  254. package/lib/module/index.js.map +1 -1
  255. package/lib/module/keys/classes.js +106 -49
  256. package/lib/module/keys/classes.js.map +1 -1
  257. package/lib/module/keys/generateKeyPair.js +134 -143
  258. package/lib/module/keys/generateKeyPair.js.map +1 -1
  259. package/lib/module/keys/index.js +161 -22
  260. package/lib/module/keys/index.js.map +1 -1
  261. package/lib/module/keys/publicCipher.js +145 -0
  262. package/lib/module/keys/publicCipher.js.map +1 -0
  263. package/lib/module/keys/signVerify.js +170 -39
  264. package/lib/module/keys/signVerify.js.map +1 -1
  265. package/lib/module/keys/utils.js +16 -12
  266. package/lib/module/keys/utils.js.map +1 -1
  267. package/lib/module/pbkdf2.js.map +1 -1
  268. package/lib/module/random.js +6 -0
  269. package/lib/module/random.js.map +1 -1
  270. package/lib/module/rsa.js +194 -0
  271. package/lib/module/rsa.js.map +1 -0
  272. package/lib/module/specs/blake3.nitro.js +4 -0
  273. package/lib/module/specs/blake3.nitro.js.map +1 -0
  274. package/lib/module/specs/cipher.nitro.js +4 -0
  275. package/lib/module/specs/cipher.nitro.js.map +1 -0
  276. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  277. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  278. package/lib/module/specs/hash.nitro.js +4 -0
  279. package/lib/module/specs/hash.nitro.js.map +1 -0
  280. package/lib/module/specs/hmac.nitro.js +4 -0
  281. package/lib/module/specs/hmac.nitro.js.map +1 -0
  282. package/lib/module/specs/rsaCipher.nitro.js +4 -0
  283. package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
  284. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  285. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  286. package/lib/module/specs/sign.nitro.js +4 -0
  287. package/lib/module/specs/sign.nitro.js.map +1 -0
  288. package/lib/module/subtle.js +982 -0
  289. package/lib/module/subtle.js.map +1 -0
  290. package/lib/module/utils/cipher.js +56 -0
  291. package/lib/module/utils/cipher.js.map +1 -0
  292. package/lib/module/utils/conversion.js +26 -5
  293. package/lib/module/utils/conversion.js.map +1 -1
  294. package/lib/module/utils/hashnames.js +2 -1
  295. package/lib/module/utils/hashnames.js.map +1 -1
  296. package/lib/module/utils/index.js +1 -0
  297. package/lib/module/utils/index.js.map +1 -1
  298. package/lib/module/utils/noble.js +76 -0
  299. package/lib/module/utils/noble.js.map +1 -0
  300. package/lib/module/utils/types.js +32 -17
  301. package/lib/module/utils/types.js.map +1 -1
  302. package/lib/module/utils/validation.js +69 -1
  303. package/lib/module/utils/validation.js.map +1 -1
  304. package/lib/tsconfig.tsbuildinfo +1 -1
  305. package/lib/typescript/blake3.d.ts +33 -0
  306. package/lib/typescript/blake3.d.ts.map +1 -0
  307. package/lib/typescript/cipher.d.ts +60 -0
  308. package/lib/typescript/cipher.d.ts.map +1 -0
  309. package/lib/typescript/constants.d.ts +21 -0
  310. package/lib/typescript/constants.d.ts.map +1 -0
  311. package/lib/typescript/ec.d.ts +22 -0
  312. package/lib/typescript/ec.d.ts.map +1 -0
  313. package/lib/typescript/ed.d.ts +28 -1
  314. package/lib/typescript/ed.d.ts.map +1 -1
  315. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  316. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  317. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  318. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  319. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  320. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  321. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  322. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  323. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  324. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  325. package/lib/typescript/hash.d.ts +122 -0
  326. package/lib/typescript/hash.d.ts.map +1 -0
  327. package/lib/typescript/hmac.d.ts +66 -0
  328. package/lib/typescript/hmac.d.ts.map +1 -0
  329. package/lib/typescript/index.d.ts +102 -10
  330. package/lib/typescript/index.d.ts.map +1 -1
  331. package/lib/typescript/keys/classes.d.ts +50 -8
  332. package/lib/typescript/keys/classes.d.ts.map +1 -1
  333. package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
  334. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  335. package/lib/typescript/keys/index.d.ts +22 -2
  336. package/lib/typescript/keys/index.d.ts.map +1 -1
  337. package/lib/typescript/keys/publicCipher.d.ts +20 -0
  338. package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
  339. package/lib/typescript/keys/signVerify.d.ts +28 -0
  340. package/lib/typescript/keys/signVerify.d.ts.map +1 -1
  341. package/lib/typescript/keys/utils.d.ts +3 -1
  342. package/lib/typescript/keys/utils.d.ts.map +1 -1
  343. package/lib/typescript/pbkdf2.d.ts +1 -1
  344. package/lib/typescript/pbkdf2.d.ts.map +1 -1
  345. package/lib/typescript/random.d.ts +6 -0
  346. package/lib/typescript/random.d.ts.map +1 -1
  347. package/lib/typescript/rsa.d.ts +19 -0
  348. package/lib/typescript/rsa.d.ts.map +1 -0
  349. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  350. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  351. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  352. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  353. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  354. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  355. package/lib/typescript/specs/edKeyPair.nitro.d.ts +1 -0
  356. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
  357. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  358. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  359. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  360. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  361. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -1
  362. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  363. package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
  364. package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
  365. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  366. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  367. package/lib/typescript/specs/sign.nitro.d.ts +19 -0
  368. package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
  369. package/lib/typescript/subtle.d.ts +17 -0
  370. package/lib/typescript/subtle.d.ts.map +1 -0
  371. package/lib/typescript/utils/cipher.d.ts +7 -0
  372. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  373. package/lib/typescript/utils/conversion.d.ts +1 -0
  374. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  375. package/lib/typescript/utils/hashnames.d.ts +3 -1
  376. package/lib/typescript/utils/hashnames.d.ts.map +1 -1
  377. package/lib/typescript/utils/index.d.ts +1 -0
  378. package/lib/typescript/utils/index.d.ts.map +1 -1
  379. package/lib/typescript/utils/noble.d.ts +19 -0
  380. package/lib/typescript/utils/noble.d.ts.map +1 -0
  381. package/lib/typescript/utils/types.d.ts +125 -23
  382. package/lib/typescript/utils/types.d.ts.map +1 -1
  383. package/lib/typescript/utils/validation.d.ts +5 -0
  384. package/lib/typescript/utils/validation.d.ts.map +1 -1
  385. package/nitrogen/generated/.gitattributes +1 -0
  386. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +30 -1
  387. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  388. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +115 -1
  389. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  390. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  391. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
  392. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  393. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  394. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +3 -3
  395. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +111 -1
  396. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
  397. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +104 -0
  398. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  399. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  400. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  401. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  402. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  403. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  404. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  405. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  406. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  407. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +2 -1
  408. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
  409. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  410. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  411. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  412. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  413. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -1
  414. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
  415. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  416. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
  417. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  418. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
  419. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
  420. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
  421. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  422. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  423. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
  424. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
  425. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
  426. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
  427. package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
  428. package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
  429. package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
  430. package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
  431. package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
  432. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
  433. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  434. package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
  435. package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
  436. package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
  437. package/package.json +28 -23
  438. package/src/blake3.ts +123 -0
  439. package/src/cipher.ts +335 -0
  440. package/src/constants.ts +32 -0
  441. package/src/ec.ts +657 -0
  442. package/src/ed.ts +297 -13
  443. package/src/expo-plugin/@types.ts +7 -0
  444. package/src/expo-plugin/withRNQC.ts +23 -0
  445. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  446. package/src/expo-plugin/withSodiumIos.ts +30 -0
  447. package/src/expo-plugin/withXCode.ts +55 -0
  448. package/src/hash.ts +274 -0
  449. package/src/hmac.ts +135 -0
  450. package/src/index.ts +20 -20
  451. package/src/keys/classes.ts +148 -55
  452. package/src/keys/generateKeyPair.ts +177 -134
  453. package/src/keys/index.ts +226 -14
  454. package/src/keys/publicCipher.ts +229 -0
  455. package/src/keys/signVerify.ts +239 -39
  456. package/src/keys/utils.ts +24 -18
  457. package/src/pbkdf2.ts +1 -1
  458. package/src/random.ts +7 -0
  459. package/src/rsa.ts +310 -0
  460. package/src/specs/blake3.nitro.ts +12 -0
  461. package/src/specs/cipher.nitro.ts +25 -0
  462. package/src/specs/ecKeyPair.nitro.ts +38 -0
  463. package/src/specs/edKeyPair.nitro.ts +2 -0
  464. package/src/specs/hash.nitro.ts +10 -0
  465. package/src/specs/hmac.nitro.ts +7 -0
  466. package/src/specs/keyObjectHandle.nitro.ts +1 -1
  467. package/src/specs/rsaCipher.nitro.ts +65 -0
  468. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  469. package/src/specs/sign.nitro.ts +31 -0
  470. package/src/subtle.ts +1436 -0
  471. package/src/utils/cipher.ts +60 -0
  472. package/src/utils/conversion.ts +33 -4
  473. package/src/utils/hashnames.ts +4 -2
  474. package/src/utils/index.ts +1 -0
  475. package/src/utils/noble.ts +85 -0
  476. package/src/utils/types.ts +209 -29
  477. package/src/utils/validation.ts +96 -1
  478. package/lib/module/package.json +0 -1
  479. package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
  480. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
@@ -0,0 +1,154 @@
1
+ #include <NitroModules/ArrayBuffer.hpp>
2
+ #include <NitroModules/Promise.hpp>
3
+ #include <memory>
4
+ #include <openssl/bio.h>
5
+ #include <openssl/buffer.h>
6
+ #include <openssl/err.h>
7
+ #include <openssl/evp.h>
8
+ #include <openssl/pem.h>
9
+ #include <openssl/rsa.h>
10
+ #include <stdexcept>
11
+ #include <string>
12
+
13
+ #include "HybridRsaKeyPair.hpp"
14
+ #include "Utils.hpp"
15
+
16
+ namespace margelo::nitro::crypto {
17
+
18
+ std::shared_ptr<Promise<void>> HybridRsaKeyPair::generateKeyPair() {
19
+ return Promise<void>::async([this]() { this->generateKeyPairSync(); });
20
+ }
21
+
22
+ void HybridRsaKeyPair::generateKeyPairSync() {
23
+ // Clean up existing key if any
24
+ if (this->pkey != nullptr) {
25
+ EVP_PKEY_free(this->pkey);
26
+ this->pkey = nullptr;
27
+ }
28
+
29
+ // Create key generation context
30
+ std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr), EVP_PKEY_CTX_free);
31
+
32
+ if (!ctx) {
33
+ throw std::runtime_error("Failed to create RSA key generation context");
34
+ }
35
+
36
+ if (EVP_PKEY_keygen_init(ctx.get()) <= 0) {
37
+ throw std::runtime_error("Failed to initialize RSA key generation");
38
+ }
39
+
40
+ // Set modulus length
41
+ if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx.get(), this->modulusLength) <= 0) {
42
+ throw std::runtime_error("Failed to set RSA modulus length");
43
+ }
44
+
45
+ // Set public exponent
46
+ std::unique_ptr<BIGNUM, decltype(&BN_free)> exponent(BN_new(), BN_free);
47
+ if (!exponent) {
48
+ throw std::runtime_error("Failed to create BIGNUM for public exponent");
49
+ }
50
+
51
+ // Default to 65537 (0x10001) if no public exponent is set
52
+ if (this->publicExponent.empty()) {
53
+ if (BN_set_word(exponent.get(), RSA_F4) != 1) {
54
+ throw std::runtime_error("Failed to set default public exponent");
55
+ }
56
+ } else {
57
+ if (BN_bin2bn(this->publicExponent.data(), this->publicExponent.size(), exponent.get()) == nullptr) {
58
+ throw std::runtime_error("Failed to convert public exponent to BIGNUM");
59
+ }
60
+ }
61
+
62
+ if (EVP_PKEY_CTX_set1_rsa_keygen_pubexp(ctx.get(), exponent.get()) <= 0) {
63
+ throw std::runtime_error("Failed to set RSA public exponent");
64
+ }
65
+
66
+ // Generate the key pair
67
+ EVP_PKEY* raw_pkey = nullptr;
68
+ if (EVP_PKEY_keygen(ctx.get(), &raw_pkey) <= 0) {
69
+ throw std::runtime_error("Failed to generate RSA key pair");
70
+ }
71
+
72
+ this->pkey = raw_pkey;
73
+ }
74
+
75
+ void HybridRsaKeyPair::setModulusLength(double modulusLength) {
76
+ this->modulusLength = static_cast<int>(modulusLength);
77
+ }
78
+
79
+ void HybridRsaKeyPair::setPublicExponent(const std::shared_ptr<ArrayBuffer>& publicExponent) {
80
+ if (publicExponent && publicExponent->size() > 0) {
81
+ const uint8_t* data = publicExponent->data();
82
+ this->publicExponent.assign(data, data + publicExponent->size());
83
+ }
84
+ }
85
+
86
+ void HybridRsaKeyPair::setHashAlgorithm(const std::string& hashAlgorithm) {
87
+ this->hashAlgorithm = hashAlgorithm;
88
+ }
89
+
90
+ std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::getPublicKey() {
91
+ this->checkKeyPair();
92
+
93
+ // Export as DER format using direct OpenSSL calls
94
+ BIO* bio = BIO_new(BIO_s_mem());
95
+ if (!bio) {
96
+ throw std::runtime_error("Failed to create BIO for public key export");
97
+ }
98
+
99
+ if (i2d_PUBKEY_bio(bio, this->pkey) != 1) {
100
+ BIO_free(bio);
101
+ throw std::runtime_error("Failed to export public key to DER format");
102
+ }
103
+
104
+ BUF_MEM* mem;
105
+ BIO_get_mem_ptr(bio, &mem);
106
+
107
+ // Create a string from the DER data and use ToNativeArrayBuffer utility
108
+ std::string derData(mem->data, mem->length);
109
+ BIO_free(bio);
110
+
111
+ return ToNativeArrayBuffer(derData);
112
+ }
113
+
114
+ std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::getPrivateKey() {
115
+ this->checkKeyPair();
116
+
117
+ // Export as DER format in PKCS8 format using direct OpenSSL calls
118
+ BIO* bio = BIO_new(BIO_s_mem());
119
+ if (!bio) {
120
+ throw std::runtime_error("Failed to create BIO for private key export");
121
+ }
122
+
123
+ if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
124
+ BIO_free(bio);
125
+ throw std::runtime_error("Failed to export private key to DER PKCS8 format");
126
+ }
127
+
128
+ BUF_MEM* mem;
129
+ BIO_get_mem_ptr(bio, &mem);
130
+
131
+ // Create a string from the DER data and use ToNativeArrayBuffer utility
132
+ std::string derData(mem->data, mem->length);
133
+ BIO_free(bio);
134
+
135
+ return ToNativeArrayBuffer(derData);
136
+ }
137
+
138
+ KeyObject HybridRsaKeyPair::importKey(const std::string& /* format */, const std::shared_ptr<ArrayBuffer>& /* keyData */,
139
+ const std::string& /* algorithm */, bool /* extractable */,
140
+ const std::vector<std::string>& /* keyUsages */) {
141
+ throw std::runtime_error("HybridRsaKeyPair::importKey() is not yet implemented");
142
+ }
143
+
144
+ std::shared_ptr<ArrayBuffer> HybridRsaKeyPair::exportKey(const KeyObject& /* key */, const std::string& /* format */) {
145
+ throw std::runtime_error("HybridRsaKeyPair::exportKey() is not yet implemented");
146
+ }
147
+
148
+ void HybridRsaKeyPair::checkKeyPair() {
149
+ if (this->pkey == nullptr) {
150
+ throw std::runtime_error("RSA KeyPair not initialized");
151
+ }
152
+ }
153
+
154
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,43 @@
1
+ #pragma once
2
+
3
+ #include "HybridRsaKeyPairSpec.hpp"
4
+ #include <NitroModules/ArrayBuffer.hpp>
5
+ #include <NitroModules/Promise.hpp>
6
+ #include <memory>
7
+ #include <openssl/evp.h>
8
+ #include <openssl/rsa.h>
9
+ #include <string>
10
+ #include <vector>
11
+
12
+ namespace margelo::nitro::crypto {
13
+
14
+ class HybridRsaKeyPair : public HybridRsaKeyPairSpec {
15
+ public:
16
+ HybridRsaKeyPair() : HybridObject(TAG), pkey(nullptr), modulusLength(2048), hashAlgorithm("SHA-256") {}
17
+ ~HybridRsaKeyPair() {
18
+ if (pkey) {
19
+ EVP_PKEY_free(pkey);
20
+ }
21
+ }
22
+
23
+ std::shared_ptr<Promise<void>> generateKeyPair() override;
24
+ void generateKeyPairSync() override;
25
+ void setModulusLength(double modulusLength) override;
26
+ void setPublicExponent(const std::shared_ptr<ArrayBuffer>& publicExponent) override;
27
+ void setHashAlgorithm(const std::string& hashAlgorithm) override;
28
+ std::shared_ptr<ArrayBuffer> getPublicKey() override;
29
+ std::shared_ptr<ArrayBuffer> getPrivateKey() override;
30
+ KeyObject importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData, const std::string& algorithm,
31
+ bool extractable, const std::vector<std::string>& keyUsages) override;
32
+ std::shared_ptr<ArrayBuffer> exportKey(const KeyObject& key, const std::string& format) override;
33
+
34
+ private:
35
+ EVP_PKEY* pkey;
36
+ int modulusLength;
37
+ std::vector<unsigned char> publicExponent;
38
+ std::string hashAlgorithm;
39
+
40
+ void checkKeyPair();
41
+ };
42
+
43
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,191 @@
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
+ namespace margelo::nitro::crypto {
13
+
14
+ using margelo::nitro::NativeArrayBuffer;
15
+
16
+ HybridSignHandle::~HybridSignHandle() {
17
+ if (md_ctx) {
18
+ EVP_MD_CTX_free(md_ctx);
19
+ md_ctx = nullptr;
20
+ }
21
+ }
22
+
23
+ void HybridSignHandle::init(const std::string& algorithm) {
24
+ algorithm_name = algorithm;
25
+ md = getDigestByName(algorithm);
26
+
27
+ md_ctx = EVP_MD_CTX_new();
28
+ if (!md_ctx) {
29
+ throw std::runtime_error("Failed to create message digest context");
30
+ }
31
+
32
+ if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
33
+ EVP_MD_CTX_free(md_ctx);
34
+ md_ctx = nullptr;
35
+ throw std::runtime_error("Failed to initialize message digest");
36
+ }
37
+ }
38
+
39
+ void HybridSignHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
40
+ if (!md_ctx) {
41
+ throw std::runtime_error("Sign not initialized");
42
+ }
43
+
44
+ auto native_data = ToNativeArrayBuffer(data);
45
+
46
+ // Accumulate raw data for potential one-shot signing (Ed25519/Ed448)
47
+ const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
48
+ data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
49
+
50
+ if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
51
+ unsigned long err = ERR_get_error();
52
+ char err_buf[256];
53
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
54
+ throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
55
+ }
56
+ }
57
+
58
+ // Check if key type requires one-shot signing (Ed25519, Ed448)
59
+ static bool isOneShotVariant(EVP_PKEY* pkey) {
60
+ int type = EVP_PKEY_id(pkey);
61
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
62
+ }
63
+
64
+ std::shared_ptr<ArrayBuffer> HybridSignHandle::sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
65
+ std::optional<double> padding, std::optional<double> saltLength,
66
+ std::optional<double> dsaEncoding) {
67
+ if (!md_ctx) {
68
+ throw std::runtime_error("Sign not initialized");
69
+ }
70
+
71
+ auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
72
+ EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
73
+
74
+ if (!pkey) {
75
+ throw std::runtime_error("Invalid private key for signing");
76
+ }
77
+
78
+ size_t sig_len = 0;
79
+ std::unique_ptr<uint8_t[]> sig_buf;
80
+
81
+ // Ed25519/Ed448 require one-shot signing with EVP_DigestSign
82
+ if (isOneShotVariant(pkey)) {
83
+ // Create a new context for one-shot signing
84
+ EVP_MD_CTX* sign_ctx = EVP_MD_CTX_new();
85
+ if (!sign_ctx) {
86
+ throw std::runtime_error("Failed to create signing context");
87
+ }
88
+
89
+ // Initialize for one-shot signing (pass nullptr for md - Ed25519/Ed448 have built-in hash)
90
+ if (EVP_DigestSignInit(sign_ctx, nullptr, nullptr, nullptr, pkey) <= 0) {
91
+ EVP_MD_CTX_free(sign_ctx);
92
+ throw std::runtime_error("Failed to initialize Ed signing");
93
+ }
94
+
95
+ // Get the accumulated data from the digest context
96
+ // For Ed25519/Ed448, we need to pass the original data, not a digest
97
+ // Since we've been accumulating with DigestUpdate, we need to use the data buffer
98
+ // Unfortunately, EVP_MD_CTX doesn't expose the accumulated data directly
99
+ // We need to use EVP_DigestSign with the accumulated data
100
+
101
+ // For one-shot variants, determine signature length first
102
+ if (EVP_DigestSign(sign_ctx, nullptr, &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
103
+ EVP_MD_CTX_free(sign_ctx);
104
+ throw std::runtime_error("Failed to determine Ed signature length");
105
+ }
106
+
107
+ sig_buf = std::make_unique<uint8_t[]>(sig_len);
108
+ if (EVP_DigestSign(sign_ctx, sig_buf.get(), &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
109
+ EVP_MD_CTX_free(sign_ctx);
110
+ unsigned long err = ERR_get_error();
111
+ char err_buf[256];
112
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
113
+ throw std::runtime_error("Failed to sign with Ed key: " + std::string(err_buf));
114
+ }
115
+
116
+ EVP_MD_CTX_free(sign_ctx);
117
+ } else {
118
+ // Standard signing flow for RSA/ECDSA
119
+ unsigned char digest[EVP_MAX_MD_SIZE];
120
+ unsigned int digest_len = 0;
121
+
122
+ if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
123
+ throw std::runtime_error("Failed to finalize digest");
124
+ }
125
+
126
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
127
+ if (!pkey_ctx) {
128
+ throw std::runtime_error("Failed to create signing context");
129
+ }
130
+
131
+ if (EVP_PKEY_sign_init(pkey_ctx) <= 0) {
132
+ EVP_PKEY_CTX_free(pkey_ctx);
133
+ throw std::runtime_error("Failed to initialize signing");
134
+ }
135
+
136
+ if (padding.has_value()) {
137
+ int pad = static_cast<int>(padding.value());
138
+ if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
139
+ EVP_PKEY_CTX_free(pkey_ctx);
140
+ throw std::runtime_error("Failed to set RSA padding");
141
+ }
142
+ }
143
+
144
+ if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
145
+ int salt_len = static_cast<int>(saltLength.value());
146
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
147
+ EVP_PKEY_CTX_free(pkey_ctx);
148
+ throw std::runtime_error("Failed to set PSS salt length");
149
+ }
150
+ }
151
+
152
+ if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
153
+ EVP_PKEY_CTX_free(pkey_ctx);
154
+ throw std::runtime_error("Failed to set signature digest");
155
+ }
156
+
157
+ if (EVP_PKEY_sign(pkey_ctx, nullptr, &sig_len, digest, digest_len) <= 0) {
158
+ EVP_PKEY_CTX_free(pkey_ctx);
159
+ throw std::runtime_error("Failed to determine signature length");
160
+ }
161
+
162
+ sig_buf = std::make_unique<uint8_t[]>(sig_len);
163
+ if (EVP_PKEY_sign(pkey_ctx, sig_buf.get(), &sig_len, digest, digest_len) <= 0) {
164
+ EVP_PKEY_CTX_free(pkey_ctx);
165
+ unsigned long err = ERR_get_error();
166
+ char err_buf[256];
167
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
168
+ throw std::runtime_error("Failed to sign: " + std::string(err_buf));
169
+ }
170
+
171
+ EVP_PKEY_CTX_free(pkey_ctx);
172
+ }
173
+
174
+ int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
175
+ if (dsa_enc == kSigEncP1363) {
176
+ unsigned int n = getBytesOfRS(pkey);
177
+ if (n > 0) {
178
+ auto p1363_buf = std::make_unique<uint8_t[]>(2 * n);
179
+ std::memset(p1363_buf.get(), 0, 2 * n);
180
+ if (convertSignatureToP1363(sig_buf.get(), sig_len, p1363_buf.get(), n)) {
181
+ uint8_t* raw_ptr = p1363_buf.get();
182
+ return std::make_shared<NativeArrayBuffer>(p1363_buf.release(), 2 * n, [raw_ptr]() { delete[] raw_ptr; });
183
+ }
184
+ }
185
+ }
186
+
187
+ uint8_t* raw_ptr = sig_buf.get();
188
+ return std::make_shared<NativeArrayBuffer>(sig_buf.release(), sig_len, [raw_ptr]() { delete[] raw_ptr; });
189
+ }
190
+
191
+ } // 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,158 @@
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
+ namespace margelo::nitro::crypto {
13
+
14
+ using margelo::nitro::NativeArrayBuffer;
15
+
16
+ HybridVerifyHandle::~HybridVerifyHandle() {
17
+ if (md_ctx) {
18
+ EVP_MD_CTX_free(md_ctx);
19
+ md_ctx = nullptr;
20
+ }
21
+ }
22
+
23
+ void HybridVerifyHandle::init(const std::string& algorithm) {
24
+ algorithm_name = algorithm;
25
+ md = getDigestByName(algorithm);
26
+
27
+ md_ctx = EVP_MD_CTX_new();
28
+ if (!md_ctx) {
29
+ throw std::runtime_error("Failed to create message digest context");
30
+ }
31
+
32
+ if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
33
+ EVP_MD_CTX_free(md_ctx);
34
+ md_ctx = nullptr;
35
+ throw std::runtime_error("Failed to initialize message digest");
36
+ }
37
+ }
38
+
39
+ void HybridVerifyHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
40
+ if (!md_ctx) {
41
+ throw std::runtime_error("Verify not initialized");
42
+ }
43
+
44
+ auto native_data = ToNativeArrayBuffer(data);
45
+
46
+ // Accumulate raw data for potential one-shot verification (Ed25519/Ed448)
47
+ const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
48
+ data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
49
+
50
+ if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
51
+ unsigned long err = ERR_get_error();
52
+ char err_buf[256];
53
+ ERR_error_string_n(err, err_buf, sizeof(err_buf));
54
+ throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
55
+ }
56
+ }
57
+
58
+ // Check if key type requires one-shot verification (Ed25519, Ed448)
59
+ static bool isOneShotVariant(EVP_PKEY* pkey) {
60
+ int type = EVP_PKEY_id(pkey);
61
+ return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
62
+ }
63
+
64
+ bool HybridVerifyHandle::verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
65
+ std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) {
66
+ if (!md_ctx) {
67
+ throw std::runtime_error("Verify not initialized");
68
+ }
69
+
70
+ auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
71
+ EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
72
+
73
+ if (!pkey) {
74
+ throw std::runtime_error("Invalid public key for verification");
75
+ }
76
+
77
+ auto native_sig = ToNativeArrayBuffer(signature);
78
+ const unsigned char* sig_data = native_sig->data();
79
+ size_t sig_len = native_sig->size();
80
+
81
+ // Ed25519/Ed448 require one-shot verification with EVP_DigestVerify
82
+ if (isOneShotVariant(pkey)) {
83
+ EVP_MD_CTX* verify_ctx = EVP_MD_CTX_new();
84
+ if (!verify_ctx) {
85
+ throw std::runtime_error("Failed to create verification context");
86
+ }
87
+
88
+ // Initialize for one-shot verification (pass nullptr for md - Ed25519/Ed448 have built-in hash)
89
+ if (EVP_DigestVerifyInit(verify_ctx, nullptr, nullptr, nullptr, pkey) <= 0) {
90
+ EVP_MD_CTX_free(verify_ctx);
91
+ throw std::runtime_error("Failed to initialize Ed verification");
92
+ }
93
+
94
+ int result = EVP_DigestVerify(verify_ctx, sig_data, sig_len, data_buffer.data(), data_buffer.size());
95
+ EVP_MD_CTX_free(verify_ctx);
96
+ return result == 1;
97
+ }
98
+
99
+ // Standard verification flow for RSA/ECDSA
100
+ unsigned char digest[EVP_MAX_MD_SIZE];
101
+ unsigned int digest_len = 0;
102
+
103
+ if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
104
+ throw std::runtime_error("Failed to finalize digest");
105
+ }
106
+
107
+ std::unique_ptr<uint8_t[]> der_sig_buf;
108
+ int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
109
+ if (dsa_enc == kSigEncP1363) {
110
+ unsigned int n = getBytesOfRS(pkey);
111
+ if (n > 0) {
112
+ size_t der_len = 0;
113
+ der_sig_buf = convertSignatureToDER(sig_data, sig_len, n, &der_len);
114
+ if (der_sig_buf) {
115
+ sig_data = der_sig_buf.get();
116
+ sig_len = der_len;
117
+ }
118
+ }
119
+ }
120
+
121
+ EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
122
+ if (!pkey_ctx) {
123
+ throw std::runtime_error("Failed to create verification context");
124
+ }
125
+
126
+ if (EVP_PKEY_verify_init(pkey_ctx) <= 0) {
127
+ EVP_PKEY_CTX_free(pkey_ctx);
128
+ throw std::runtime_error("Failed to initialize verification");
129
+ }
130
+
131
+ if (padding.has_value()) {
132
+ int pad = static_cast<int>(padding.value());
133
+ if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
134
+ EVP_PKEY_CTX_free(pkey_ctx);
135
+ throw std::runtime_error("Failed to set RSA padding");
136
+ }
137
+ }
138
+
139
+ if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
140
+ int salt_len = static_cast<int>(saltLength.value());
141
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
142
+ EVP_PKEY_CTX_free(pkey_ctx);
143
+ throw std::runtime_error("Failed to set PSS salt length");
144
+ }
145
+ }
146
+
147
+ if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
148
+ EVP_PKEY_CTX_free(pkey_ctx);
149
+ throw std::runtime_error("Failed to set signature digest");
150
+ }
151
+
152
+ int result = EVP_PKEY_verify(pkey_ctx, sig_data, sig_len, digest, digest_len);
153
+ EVP_PKEY_CTX_free(pkey_ctx);
154
+
155
+ return result == 1;
156
+ }
157
+
158
+ } // 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