react-native-quick-crypto 1.0.9 → 1.0.11

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 (292) hide show
  1. package/QuickCrypto.podspec +9 -2
  2. package/README.md +13 -9
  3. package/android/CMakeLists.txt +13 -0
  4. package/cpp/argon2/HybridArgon2.cpp +103 -0
  5. package/cpp/argon2/HybridArgon2.hpp +32 -0
  6. package/cpp/certificate/HybridCertificate.cpp +42 -0
  7. package/cpp/certificate/HybridCertificate.hpp +16 -0
  8. package/cpp/cipher/HybridCipher.cpp +58 -0
  9. package/cpp/cipher/HybridCipher.hpp +4 -0
  10. package/cpp/cipher/HybridCipherFactory.hpp +15 -1
  11. package/cpp/cipher/OCBCipher.cpp +4 -4
  12. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
  13. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
  14. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
  15. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
  16. package/cpp/dh/HybridDhKeyPair.cpp +179 -0
  17. package/cpp/dh/HybridDhKeyPair.hpp +37 -0
  18. package/cpp/dh/HybridDiffieHellman.cpp +10 -0
  19. package/cpp/dh/HybridDiffieHellman.hpp +1 -0
  20. package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
  21. package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
  22. package/cpp/ec/HybridEcKeyPair.cpp +21 -0
  23. package/cpp/ec/HybridEcKeyPair.hpp +1 -0
  24. package/cpp/ecdh/HybridECDH.cpp +35 -0
  25. package/cpp/ecdh/HybridECDH.hpp +1 -0
  26. package/cpp/hash/HybridHash.cpp +1 -1
  27. package/cpp/hash/HybridHash.hpp +1 -1
  28. package/cpp/hmac/HybridHmac.cpp +1 -1
  29. package/cpp/hmac/HybridHmac.hpp +1 -1
  30. package/cpp/keys/HybridKeyObjectHandle.cpp +131 -1
  31. package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
  32. package/cpp/prime/HybridPrime.cpp +81 -0
  33. package/cpp/prime/HybridPrime.hpp +20 -0
  34. package/deps/ncrypto/.bazelrc +0 -1
  35. package/deps/ncrypto/.bazelversion +1 -1
  36. package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
  37. package/deps/ncrypto/.github/workflows/linter.yml +2 -2
  38. package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
  39. package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
  40. package/deps/ncrypto/.release-please-manifest.json +3 -0
  41. package/deps/ncrypto/BUILD.bazel +9 -1
  42. package/deps/ncrypto/CHANGELOG.md +37 -0
  43. package/deps/ncrypto/CMakeLists.txt +35 -11
  44. package/deps/ncrypto/MODULE.bazel +16 -1
  45. package/deps/ncrypto/MODULE.bazel.lock +299 -118
  46. package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
  47. package/deps/ncrypto/include/ncrypto/aead.h +137 -0
  48. package/deps/ncrypto/include/ncrypto/version.h +14 -0
  49. package/deps/ncrypto/include/ncrypto.h +85 -230
  50. package/deps/ncrypto/ncrypto.pc.in +10 -0
  51. package/deps/ncrypto/release-please-config.json +11 -0
  52. package/deps/ncrypto/src/CMakeLists.txt +31 -6
  53. package/deps/ncrypto/src/aead.cpp +302 -0
  54. package/deps/ncrypto/src/ncrypto.cpp +274 -556
  55. package/deps/ncrypto/tests/BUILD.bazel +2 -0
  56. package/deps/ncrypto/tests/basic.cpp +772 -2
  57. package/deps/ncrypto/tools/run-clang-format.sh +5 -5
  58. package/lib/commonjs/argon2.js +39 -0
  59. package/lib/commonjs/argon2.js.map +1 -0
  60. package/lib/commonjs/certificate.js +35 -0
  61. package/lib/commonjs/certificate.js.map +1 -0
  62. package/lib/commonjs/cipher.js +8 -0
  63. package/lib/commonjs/cipher.js.map +1 -1
  64. package/lib/commonjs/dhKeyPair.js +109 -0
  65. package/lib/commonjs/dhKeyPair.js.map +1 -0
  66. package/lib/commonjs/diffie-hellman.js +4 -1
  67. package/lib/commonjs/diffie-hellman.js.map +1 -1
  68. package/lib/commonjs/dsa.js +92 -0
  69. package/lib/commonjs/dsa.js.map +1 -0
  70. package/lib/commonjs/ec.js +20 -25
  71. package/lib/commonjs/ec.js.map +1 -1
  72. package/lib/commonjs/ecdh.js +37 -0
  73. package/lib/commonjs/ecdh.js.map +1 -1
  74. package/lib/commonjs/ed.js +1 -2
  75. package/lib/commonjs/ed.js.map +1 -1
  76. package/lib/commonjs/hash.js +7 -0
  77. package/lib/commonjs/hash.js.map +1 -1
  78. package/lib/commonjs/index.js +46 -1
  79. package/lib/commonjs/index.js.map +1 -1
  80. package/lib/commonjs/keys/classes.js +18 -12
  81. package/lib/commonjs/keys/classes.js.map +1 -1
  82. package/lib/commonjs/keys/generateKeyPair.js +11 -0
  83. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  84. package/lib/commonjs/prime.js +84 -0
  85. package/lib/commonjs/prime.js.map +1 -0
  86. package/lib/commonjs/specs/argon2.nitro.js +6 -0
  87. package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
  88. package/lib/commonjs/specs/certificate.nitro.js +6 -0
  89. package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
  90. package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
  91. package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
  92. package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
  93. package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
  94. package/lib/commonjs/specs/prime.nitro.js +6 -0
  95. package/lib/commonjs/specs/prime.nitro.js.map +1 -0
  96. package/lib/commonjs/subtle.js +181 -39
  97. package/lib/commonjs/subtle.js.map +1 -1
  98. package/lib/commonjs/utils/types.js.map +1 -1
  99. package/lib/module/argon2.js +34 -0
  100. package/lib/module/argon2.js.map +1 -0
  101. package/lib/module/certificate.js +30 -0
  102. package/lib/module/certificate.js.map +1 -0
  103. package/lib/module/cipher.js +7 -0
  104. package/lib/module/cipher.js.map +1 -1
  105. package/lib/module/dhKeyPair.js +102 -0
  106. package/lib/module/dhKeyPair.js.map +1 -0
  107. package/lib/module/diffie-hellman.js +4 -0
  108. package/lib/module/diffie-hellman.js.map +1 -1
  109. package/lib/module/dsa.js +85 -0
  110. package/lib/module/dsa.js.map +1 -0
  111. package/lib/module/ec.js +19 -25
  112. package/lib/module/ec.js.map +1 -1
  113. package/lib/module/ecdh.js +37 -0
  114. package/lib/module/ecdh.js.map +1 -1
  115. package/lib/module/ed.js +1 -2
  116. package/lib/module/ed.js.map +1 -1
  117. package/lib/module/hash.js +6 -0
  118. package/lib/module/hash.js.map +1 -1
  119. package/lib/module/index.js +12 -0
  120. package/lib/module/index.js.map +1 -1
  121. package/lib/module/keys/classes.js +18 -12
  122. package/lib/module/keys/classes.js.map +1 -1
  123. package/lib/module/keys/generateKeyPair.js +11 -0
  124. package/lib/module/keys/generateKeyPair.js.map +1 -1
  125. package/lib/module/prime.js +77 -0
  126. package/lib/module/prime.js.map +1 -0
  127. package/lib/module/specs/argon2.nitro.js +4 -0
  128. package/lib/module/specs/argon2.nitro.js.map +1 -0
  129. package/lib/module/specs/certificate.nitro.js +4 -0
  130. package/lib/module/specs/certificate.nitro.js.map +1 -0
  131. package/lib/module/specs/dhKeyPair.nitro.js +4 -0
  132. package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
  133. package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
  134. package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
  135. package/lib/module/specs/prime.nitro.js +4 -0
  136. package/lib/module/specs/prime.nitro.js.map +1 -0
  137. package/lib/module/subtle.js +183 -42
  138. package/lib/module/subtle.js.map +1 -1
  139. package/lib/module/utils/types.js.map +1 -1
  140. package/lib/tsconfig.tsbuildinfo +1 -1
  141. package/lib/typescript/argon2.d.ts +16 -0
  142. package/lib/typescript/argon2.d.ts.map +1 -0
  143. package/lib/typescript/certificate.d.ts +8 -0
  144. package/lib/typescript/certificate.d.ts.map +1 -0
  145. package/lib/typescript/cipher.d.ts +12 -0
  146. package/lib/typescript/cipher.d.ts.map +1 -1
  147. package/lib/typescript/dhKeyPair.d.ts +19 -0
  148. package/lib/typescript/dhKeyPair.d.ts.map +1 -0
  149. package/lib/typescript/diffie-hellman.d.ts +2 -0
  150. package/lib/typescript/diffie-hellman.d.ts.map +1 -1
  151. package/lib/typescript/dsa.d.ts +19 -0
  152. package/lib/typescript/dsa.d.ts.map +1 -0
  153. package/lib/typescript/ec.d.ts +1 -0
  154. package/lib/typescript/ec.d.ts.map +1 -1
  155. package/lib/typescript/ecdh.d.ts +3 -0
  156. package/lib/typescript/ecdh.d.ts.map +1 -1
  157. package/lib/typescript/ed.d.ts.map +1 -1
  158. package/lib/typescript/hash.d.ts +2 -0
  159. package/lib/typescript/hash.d.ts.map +1 -1
  160. package/lib/typescript/index.d.ts +22 -0
  161. package/lib/typescript/index.d.ts.map +1 -1
  162. package/lib/typescript/keys/classes.d.ts +4 -0
  163. package/lib/typescript/keys/classes.d.ts.map +1 -1
  164. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  165. package/lib/typescript/prime.d.ts +19 -0
  166. package/lib/typescript/prime.d.ts.map +1 -0
  167. package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
  168. package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
  169. package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
  170. package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
  171. package/lib/typescript/specs/cipher.nitro.d.ts +9 -0
  172. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -1
  173. package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
  174. package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
  175. package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
  176. package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
  177. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
  178. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
  179. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
  180. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
  181. package/lib/typescript/specs/ecdh.nitro.d.ts +1 -0
  182. package/lib/typescript/specs/ecdh.nitro.d.ts.map +1 -1
  183. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
  184. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  185. package/lib/typescript/specs/prime.nitro.d.ts +11 -0
  186. package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
  187. package/lib/typescript/subtle.d.ts +2 -0
  188. package/lib/typescript/subtle.d.ts.map +1 -1
  189. package/lib/typescript/utils/types.d.ts +24 -7
  190. package/lib/typescript/utils/types.d.ts.map +1 -1
  191. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +13 -5
  192. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  193. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +104 -54
  194. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  195. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
  196. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
  197. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  198. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  199. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
  200. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +104 -54
  201. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
  202. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
  203. package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
  204. package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
  205. package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
  206. package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
  207. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
  208. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
  209. package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
  210. package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
  211. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
  212. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
  213. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +2 -1
  214. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +5 -3
  215. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
  216. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
  217. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
  218. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
  219. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
  220. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
  221. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +2 -1
  222. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +3 -3
  223. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
  224. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
  225. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
  226. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
  227. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
  228. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
  229. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
  230. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
  231. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
  232. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
  233. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
  234. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
  235. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
  236. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
  237. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  238. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
  239. package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
  240. package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
  241. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  242. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
  243. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
  244. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
  245. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
  246. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
  247. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
  248. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
  249. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
  250. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
  251. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
  252. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
  253. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
  254. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
  255. package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
  256. package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
  257. package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
  258. package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
  259. package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
  260. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
  261. package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
  262. package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
  263. package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
  264. package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
  265. package/package.json +1 -1
  266. package/src/argon2.ts +83 -0
  267. package/src/certificate.ts +41 -0
  268. package/src/cipher.ts +24 -0
  269. package/src/dhKeyPair.ts +156 -0
  270. package/src/diffie-hellman.ts +6 -0
  271. package/src/dsa.ts +129 -0
  272. package/src/ec.ts +23 -19
  273. package/src/ecdh.ts +59 -0
  274. package/src/ed.ts +1 -2
  275. package/src/hash.ts +11 -0
  276. package/src/index.ts +12 -0
  277. package/src/keys/classes.ts +26 -8
  278. package/src/keys/generateKeyPair.ts +14 -0
  279. package/src/prime.ts +134 -0
  280. package/src/specs/argon2.nitro.ts +29 -0
  281. package/src/specs/certificate.nitro.ts +8 -0
  282. package/src/specs/cipher.nitro.ts +14 -0
  283. package/src/specs/dhKeyPair.nitro.ts +14 -0
  284. package/src/specs/diffie-hellman.nitro.ts +1 -0
  285. package/src/specs/dsaKeyPair.nitro.ts +13 -0
  286. package/src/specs/ecKeyPair.nitro.ts +2 -0
  287. package/src/specs/ecdh.nitro.ts +1 -0
  288. package/src/specs/keyObjectHandle.nitro.ts +2 -0
  289. package/src/specs/prime.nitro.ts +18 -0
  290. package/src/subtle.ts +400 -42
  291. package/src/utils/types.ts +39 -5
  292. package/deps/ncrypto/WORKSPACE +0 -15
@@ -112,7 +112,7 @@ Pod::Spec.new do |s|
112
112
  # implementation (C++)
113
113
  "cpp/**/*.{hpp,cpp}",
114
114
  # dependencies (C++) - ncrypto
115
- "deps/ncrypto/include/*.{h}",
115
+ "deps/ncrypto/include/**/*.{h}",
116
116
  "deps/ncrypto/src/*.{cpp}",
117
117
  # dependencies (C) - exclude BLAKE3 x86 SIMD files (only use portable + NEON for ARM)
118
118
  "deps/blake3/c/*.{h,c}",
@@ -143,6 +143,9 @@ Pod::Spec.new do |s|
143
143
  "deps/blake3/c/example.c",
144
144
  "deps/blake3/c/example_tbb.c",
145
145
  "deps/blake3/c/blake3_tbb.cpp",
146
+ # Exclude ncrypto version.h to avoid header name collision with libsodium's version.h
147
+ # (ncrypto.h includes it via relative path "ncrypto/version.h" which still resolves)
148
+ "deps/ncrypto/include/ncrypto/version.h",
146
149
  # Exclude non-C parts of BLAKE3 repo (Rust, benchmarks, tools, etc.)
147
150
  "deps/blake3/src/**/*",
148
151
  "deps/blake3/b3sum/**/*",
@@ -165,7 +168,11 @@ Pod::Spec.new do |s|
165
168
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
166
169
  "CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES" => "YES",
167
170
  # Exclude ARM NEON source when building x86_64 simulator (no NEON support).
168
- "EXCLUDED_SOURCE_FILE_NAMES[sdk=iphonesimulator*][arch=x86_64]" => "deps/blake3/c/blake3_neon.c"
171
+ "EXCLUDED_SOURCE_FILE_NAMES[sdk=iphonesimulator*][arch=x86_64]" => "deps/blake3/c/blake3_neon.c",
172
+ # Disable x86 SIMD intrinsics on iOS simulator — the .c implementation files are already
173
+ # excluded above, but blake3_dispatch.c still references the symbols unless these macros
174
+ # are defined. Mirrors the Android CMakeLists.txt approach (line 18-22).
175
+ "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphonesimulator*][arch=x86_64]" => "$(inherited) BLAKE3_NO_AVX512 BLAKE3_NO_AVX2 BLAKE3_NO_SSE41 BLAKE3_NO_SSE2"
169
176
  }
170
177
 
171
178
  # Add cpp subdirectories to header search paths
package/README.md CHANGED
@@ -10,19 +10,15 @@
10
10
 
11
11
  A fast implementation of Node's `crypto` module.
12
12
 
13
- > Note: This version `1.x` completed a major refactor, porting to OpenSSL 3.6+, New Architecture, Bridgeless, and [`Nitro Modules`](https://github.com/mrousavy/react-native-nitro). It should be at or above feature-parity compared to the `0.x` version. Status, as always, will be represented in [implementation-coverage.md](./.docs/implementation-coverage.md).
14
-
15
- > Note: Minimum supported version of React Native is `0.75`. If you need to use earlier versions, please use `0.x` versions of this library.
16
-
17
13
  ## Features
18
14
 
19
15
  Unlike any other current JS-based polyfills, react-native-quick-crypto is written in C/C++ JSI and provides much greater performance - especially on mobile devices.
20
- QuickCrypto can be used as a drop-in replacement for your Web3/Crypto apps to speed up common cryptography functions.
16
+ QuickCrypto can be used as a drop-in replacement for your Web3/Crypto apps or CRDT-based local first databases to speed up common cryptography functions.
21
17
 
22
- - 🏎️ Up to 58x faster than all other solutions
23
- - ⚡️ Lightning fast implementation with pure C++ and JSI, instead of JS
18
+ - 🏎️ Hundreds of times faster than all JS-based solutions
19
+ - ⚡️ Lightning fast implementation with Nitro Modules (pure C++ and JSI) instead of JS
24
20
  - 🧪 Well tested in JS and C++ (OpenSSL)
25
- - 💰 Made for crypto apps and Wallets
21
+ - 💰 Made for crypto apps and wallets
26
22
  - 🔢 Secure native compiled cryptography
27
23
  - 🔁 Easy drop-in replacement for [crypto-browserify](https://github.com/browserify/crypto-browserify) or [react-native-crypto](https://github.com/tradle/react-native-crypto)
28
24
 
@@ -33,6 +29,8 @@ QuickCrypto can be used as a drop-in replacement for your Web3/Crypto apps to sp
33
29
  | `1.x` | new [->](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md) | Nitro Modules [->](https://github.com/mrousavy/nitro) |
34
30
  | `0.x` | old, new 🤞 | Bridge & JSI |
35
31
 
32
+ > Note: Minimum supported version of React Native is `0.75`. If you need to use earlier versions, please use `0.x` versions of this library.
33
+
36
34
  ## Migration
37
35
 
38
36
  Our goal in refactoring to v1.0 was to maintain API compatibility. If you are upgrading to v1.0 from v0.x, and find any discrepancies, please open an issue in this repo.
@@ -55,7 +53,13 @@ cd ios && pod install
55
53
  ```
56
54
 
57
55
  <h3>
58
- Expo  <a href="#"><img src="./.docs/img/expo.png" height="12" /></a>
56
+ Expo  <a href="#">
57
+ <picture>
58
+ <source media="(prefers-color-scheme: dark)" srcset="./.docs/img/expo/dark.png" />
59
+ <source media="(prefers-color-scheme: light)" srcset="./.docs/img/expo/light.png" />
60
+ <img alt="Expo" src="./.docs/img/expo/light.png" height="12" />
61
+ </picture>
62
+ </a>
59
63
  </h3>
60
64
 
61
65
  ```sh
@@ -25,16 +25,22 @@ endif()
25
25
  add_library(
26
26
  ${PACKAGE_NAME} SHARED
27
27
  src/main/cpp/cpp-adapter.cpp
28
+ ../cpp/argon2/HybridArgon2.cpp
28
29
  ../cpp/blake3/HybridBlake3.cpp
30
+ ../cpp/certificate/HybridCertificate.cpp
29
31
  ../cpp/cipher/CCMCipher.cpp
30
32
  ../cpp/cipher/GCMCipher.cpp
31
33
  ../cpp/cipher/HybridCipher.cpp
32
34
  ../cpp/cipher/HybridRsaCipher.cpp
33
35
  ../cpp/cipher/OCBCipher.cpp
34
36
  ../cpp/cipher/XSalsa20Cipher.cpp
37
+ ../cpp/cipher/XSalsa20Poly1305Cipher.cpp
38
+ ../cpp/cipher/XChaCha20Poly1305Cipher.cpp
35
39
  ../cpp/cipher/ChaCha20Cipher.cpp
36
40
  ../cpp/cipher/ChaCha20Poly1305Cipher.cpp
37
41
  ../cpp/dh/HybridDiffieHellman.cpp
42
+ ../cpp/dh/HybridDhKeyPair.cpp
43
+ ../cpp/dsa/HybridDsaKeyPair.cpp
38
44
  ../cpp/ec/HybridEcKeyPair.cpp
39
45
  ../cpp/ecdh/HybridECDH.cpp
40
46
  ../cpp/ed25519/HybridEdKeyPair.cpp
@@ -45,6 +51,7 @@ add_library(
45
51
  ../cpp/keys/KeyObjectData.cpp
46
52
  ../cpp/mldsa/HybridMlDsaKeyPair.cpp
47
53
  ../cpp/pbkdf2/HybridPbkdf2.cpp
54
+ ../cpp/prime/HybridPrime.cpp
48
55
  ../cpp/random/HybridRandom.cpp
49
56
  ../cpp/rsa/HybridRsaKeyPair.cpp
50
57
  ../cpp/scrypt/HybridScrypt.cpp
@@ -53,6 +60,8 @@ add_library(
53
60
  ../cpp/utils/HybridUtils.cpp
54
61
  ${BLAKE3_SOURCES}
55
62
  ../deps/fastpbkdf2/fastpbkdf2.c
63
+ ../deps/ncrypto/src/aead.cpp
64
+ ../deps/ncrypto/src/engine.cpp
56
65
  ../deps/ncrypto/src/ncrypto.cpp
57
66
  )
58
67
 
@@ -62,9 +71,12 @@ include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/QuickCrypto+autolinkin
62
71
  # local includes
63
72
  include_directories(
64
73
  "src/main/cpp"
74
+ "../cpp/argon2"
65
75
  "../cpp/blake3"
76
+ "../cpp/certificate"
66
77
  "../cpp/cipher"
67
78
  "../cpp/dh"
79
+ "../cpp/dsa"
68
80
  "../cpp/ec"
69
81
  "../cpp/ecdh"
70
82
  "../cpp/ed25519"
@@ -74,6 +86,7 @@ include_directories(
74
86
  "../cpp/keys"
75
87
  "../cpp/mldsa"
76
88
  "../cpp/pbkdf2"
89
+ "../cpp/prime"
77
90
  "../cpp/random"
78
91
  "../cpp/rsa"
79
92
  "../cpp/sign"
@@ -0,0 +1,103 @@
1
+ #include <NitroModules/ArrayBuffer.hpp>
2
+ #include <memory>
3
+ #include <ncrypto.h>
4
+ #include <openssl/err.h>
5
+ #include <openssl/opensslv.h>
6
+ #include <string>
7
+
8
+ #include "HybridArgon2.hpp"
9
+ #include "QuickCryptoUtils.hpp"
10
+
11
+ namespace margelo::nitro::crypto {
12
+
13
+ #if OPENSSL_VERSION_NUMBER >= 0x30200000L
14
+ #ifndef OPENSSL_NO_ARGON2
15
+
16
+ static ncrypto::Argon2Type parseAlgorithm(const std::string& algo) {
17
+ if (algo == "argon2d")
18
+ return ncrypto::Argon2Type::ARGON2D;
19
+ if (algo == "argon2i")
20
+ return ncrypto::Argon2Type::ARGON2I;
21
+ if (algo == "argon2id")
22
+ return ncrypto::Argon2Type::ARGON2ID;
23
+ throw std::runtime_error("Unknown argon2 algorithm: " + algo);
24
+ }
25
+
26
+ static std::shared_ptr<ArrayBuffer> hashImpl(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& message,
27
+ const std::shared_ptr<ArrayBuffer>& nonce, double parallelism, double tagLength, double memory,
28
+ double passes, double version, const std::optional<std::shared_ptr<ArrayBuffer>>& secret,
29
+ const std::optional<std::shared_ptr<ArrayBuffer>>& associatedData) {
30
+
31
+ auto type = parseAlgorithm(algorithm);
32
+
33
+ ncrypto::Buffer<const char> passBuf{message->size() > 0 ? reinterpret_cast<const char*>(message->data()) : "", message->size()};
34
+
35
+ ncrypto::Buffer<const unsigned char> saltBuf{nonce->size() > 0 ? reinterpret_cast<const unsigned char*>(nonce->data())
36
+ : reinterpret_cast<const unsigned char*>(""),
37
+ nonce->size()};
38
+
39
+ ncrypto::Buffer<const unsigned char> secretBuf{nullptr, 0};
40
+ if (secret.has_value() && secret.value()->size() > 0) {
41
+ secretBuf = {reinterpret_cast<const unsigned char*>(secret.value()->data()), secret.value()->size()};
42
+ }
43
+
44
+ ncrypto::Buffer<const unsigned char> adBuf{nullptr, 0};
45
+ if (associatedData.has_value() && associatedData.value()->size() > 0) {
46
+ adBuf = {reinterpret_cast<const unsigned char*>(associatedData.value()->data()), associatedData.value()->size()};
47
+ }
48
+
49
+ auto result =
50
+ ncrypto::argon2(passBuf, saltBuf, static_cast<uint32_t>(parallelism), static_cast<size_t>(tagLength), static_cast<uint32_t>(memory),
51
+ static_cast<uint32_t>(passes), static_cast<uint32_t>(version), secretBuf, adBuf, type);
52
+
53
+ if (!result) {
54
+ unsigned long err = ERR_peek_last_error();
55
+ const char* reason = err ? ERR_reason_error_string(err) : nullptr;
56
+ throw std::runtime_error(reason ? std::string("Argon2 operation failed: ") + reason : "Argon2 operation failed");
57
+ }
58
+
59
+ return ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(result.get()), result.size());
60
+ }
61
+
62
+ #endif // OPENSSL_NO_ARGON2
63
+ #endif // OPENSSL_VERSION_NUMBER
64
+
65
+ std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>>
66
+ HybridArgon2::hash(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& message, const std::shared_ptr<ArrayBuffer>& nonce,
67
+ double parallelism, double tagLength, double memory, double passes, double version,
68
+ const std::optional<std::shared_ptr<ArrayBuffer>>& secret,
69
+ const std::optional<std::shared_ptr<ArrayBuffer>>& associatedData) {
70
+ #if OPENSSL_VERSION_NUMBER >= 0x30200000L && !defined(OPENSSL_NO_ARGON2)
71
+ auto nativeMessage = ToNativeArrayBuffer(message);
72
+ auto nativeNonce = ToNativeArrayBuffer(nonce);
73
+ std::optional<std::shared_ptr<ArrayBuffer>> nativeSecret;
74
+ if (secret.has_value()) {
75
+ nativeSecret = ToNativeArrayBuffer(secret.value());
76
+ }
77
+ std::optional<std::shared_ptr<ArrayBuffer>> nativeAd;
78
+ if (associatedData.has_value()) {
79
+ nativeAd = ToNativeArrayBuffer(associatedData.value());
80
+ }
81
+
82
+ return Promise<std::shared_ptr<ArrayBuffer>>::async([algorithm, nativeMessage, nativeNonce, parallelism, tagLength, memory, passes,
83
+ version, nativeSecret = std::move(nativeSecret), nativeAd = std::move(nativeAd)]() {
84
+ return hashImpl(algorithm, nativeMessage, nativeNonce, parallelism, tagLength, memory, passes, version, nativeSecret, nativeAd);
85
+ });
86
+ #else
87
+ throw std::runtime_error("Argon2 is not supported (requires OpenSSL 3.2+)");
88
+ #endif
89
+ }
90
+
91
+ std::shared_ptr<ArrayBuffer> HybridArgon2::hashSync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& message,
92
+ const std::shared_ptr<ArrayBuffer>& nonce, double parallelism, double tagLength,
93
+ double memory, double passes, double version,
94
+ const std::optional<std::shared_ptr<ArrayBuffer>>& secret,
95
+ const std::optional<std::shared_ptr<ArrayBuffer>>& associatedData) {
96
+ #if OPENSSL_VERSION_NUMBER >= 0x30200000L && !defined(OPENSSL_NO_ARGON2)
97
+ return hashImpl(algorithm, message, nonce, parallelism, tagLength, memory, passes, version, secret, associatedData);
98
+ #else
99
+ throw std::runtime_error("Argon2 is not supported (requires OpenSSL 3.2+)");
100
+ #endif
101
+ }
102
+
103
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include <NitroModules/ArrayBuffer.hpp>
4
+ #include <NitroModules/Promise.hpp>
5
+ #include <memory>
6
+ #include <optional>
7
+ #include <string>
8
+
9
+ #include "HybridArgon2Spec.hpp"
10
+
11
+ namespace margelo::nitro::crypto {
12
+
13
+ using namespace facebook;
14
+
15
+ class HybridArgon2 : public HybridArgon2Spec {
16
+ public:
17
+ HybridArgon2() : HybridObject(TAG) {}
18
+
19
+ public:
20
+ std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> hash(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& message,
21
+ const std::shared_ptr<ArrayBuffer>& nonce, double parallelism,
22
+ double tagLength, double memory, double passes, double version,
23
+ const std::optional<std::shared_ptr<ArrayBuffer>>& secret,
24
+ const std::optional<std::shared_ptr<ArrayBuffer>>& associatedData) override;
25
+
26
+ std::shared_ptr<ArrayBuffer> hashSync(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& message,
27
+ const std::shared_ptr<ArrayBuffer>& nonce, double parallelism, double tagLength, double memory,
28
+ double passes, double version, const std::optional<std::shared_ptr<ArrayBuffer>>& secret,
29
+ const std::optional<std::shared_ptr<ArrayBuffer>>& associatedData) override;
30
+ };
31
+
32
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,42 @@
1
+ #include "HybridCertificate.hpp"
2
+ #include "QuickCryptoUtils.hpp"
3
+ #include <ncrypto.h>
4
+ #include <openssl/crypto.h>
5
+
6
+ namespace margelo::nitro::crypto {
7
+
8
+ bool HybridCertificate::verifySpkac(const std::shared_ptr<ArrayBuffer>& spkac) {
9
+ return ncrypto::VerifySpkac(reinterpret_cast<const char*>(spkac->data()), spkac->size());
10
+ }
11
+
12
+ std::shared_ptr<ArrayBuffer> HybridCertificate::exportPublicKey(const std::shared_ptr<ArrayBuffer>& spkac) {
13
+ auto bio = ncrypto::ExportPublicKey(reinterpret_cast<const char*>(spkac->data()), spkac->size());
14
+
15
+ if (!bio) {
16
+ auto empty = new uint8_t[0];
17
+ return std::make_shared<NativeArrayBuffer>(empty, 0, [empty]() { delete[] empty; });
18
+ }
19
+
20
+ BUF_MEM* mem = bio;
21
+ if (!mem || mem->length == 0) {
22
+ auto empty = new uint8_t[0];
23
+ return std::make_shared<NativeArrayBuffer>(empty, 0, [empty]() { delete[] empty; });
24
+ }
25
+
26
+ return ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(mem->data), mem->length);
27
+ }
28
+
29
+ std::shared_ptr<ArrayBuffer> HybridCertificate::exportChallenge(const std::shared_ptr<ArrayBuffer>& spkac) {
30
+ auto buf = ncrypto::ExportChallenge(reinterpret_cast<const char*>(spkac->data()), spkac->size());
31
+
32
+ if (buf.data == nullptr) {
33
+ auto empty = new uint8_t[0];
34
+ return std::make_shared<NativeArrayBuffer>(empty, 0, [empty]() { delete[] empty; });
35
+ }
36
+
37
+ auto result = ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(buf.data), buf.len);
38
+ OPENSSL_free(buf.data);
39
+ return result;
40
+ }
41
+
42
+ } // namespace margelo::nitro::crypto
@@ -0,0 +1,16 @@
1
+ #pragma once
2
+
3
+ #include "HybridCertificateSpec.hpp"
4
+
5
+ namespace margelo::nitro::crypto {
6
+
7
+ class HybridCertificate : public HybridCertificateSpec {
8
+ public:
9
+ HybridCertificate() : HybridObject(TAG) {}
10
+
11
+ bool verifySpkac(const std::shared_ptr<ArrayBuffer>& spkac) override;
12
+ std::shared_ptr<ArrayBuffer> exportPublicKey(const std::shared_ptr<ArrayBuffer>& spkac) override;
13
+ std::shared_ptr<ArrayBuffer> exportChallenge(const std::shared_ptr<ArrayBuffer>& spkac) override;
14
+ };
15
+
16
+ } // namespace margelo::nitro::crypto
@@ -8,6 +8,7 @@
8
8
  #include "HybridCipher.hpp"
9
9
  #include "QuickCryptoUtils.hpp"
10
10
 
11
+ #include <ncrypto.h>
11
12
  #include <openssl/err.h>
12
13
  #include <openssl/evp.h>
13
14
 
@@ -336,4 +337,61 @@ std::vector<std::string> HybridCipher::getSupportedCiphers() {
336
337
  return cipher_names;
337
338
  }
338
339
 
340
+ std::optional<CipherInfo> HybridCipher::getCipherInfo(const std::string& name, std::optional<double> keyLength,
341
+ std::optional<double> ivLength) {
342
+ auto cipher = ncrypto::Cipher::FromName(name.c_str());
343
+ if (!cipher)
344
+ return std::nullopt;
345
+
346
+ size_t iv_length = cipher.getIvLength();
347
+ size_t key_length = cipher.getKeyLength();
348
+
349
+ if (keyLength.has_value() || ivLength.has_value()) {
350
+ auto ctx = ncrypto::CipherCtxPointer::New();
351
+ if (!ctx.init(cipher, true))
352
+ return std::nullopt;
353
+
354
+ if (keyLength.has_value()) {
355
+ size_t check_len = static_cast<size_t>(keyLength.value());
356
+ if (!ctx.setKeyLength(check_len))
357
+ return std::nullopt;
358
+ key_length = check_len;
359
+ }
360
+
361
+ if (ivLength.has_value()) {
362
+ size_t check_len = static_cast<size_t>(ivLength.value());
363
+ if (cipher.isCcmMode()) {
364
+ if (check_len < 7 || check_len > 13)
365
+ return std::nullopt;
366
+ } else if (cipher.isGcmMode()) {
367
+ // GCM accepts flexible IV lengths
368
+ } else if (cipher.isOcbMode()) {
369
+ if (!ctx.setIvLength(check_len))
370
+ return std::nullopt;
371
+ } else {
372
+ if (check_len != iv_length)
373
+ return std::nullopt;
374
+ }
375
+ iv_length = check_len;
376
+ }
377
+ }
378
+
379
+ std::string name_str(cipher.getName());
380
+ std::transform(name_str.begin(), name_str.end(), name_str.begin(), ::tolower);
381
+
382
+ std::string mode_str(cipher.getModeLabel());
383
+
384
+ std::optional<double> block_size = std::nullopt;
385
+ if (!cipher.isStreamMode()) {
386
+ block_size = static_cast<double>(cipher.getBlockSize());
387
+ }
388
+
389
+ std::optional<double> iv_len = std::nullopt;
390
+ if (iv_length != 0) {
391
+ iv_len = static_cast<double>(iv_length);
392
+ }
393
+
394
+ return CipherInfo{name_str, static_cast<double>(cipher.getNid()), mode_str, static_cast<double>(key_length), block_size, iv_len};
395
+ }
396
+
339
397
  } // namespace margelo::nitro::crypto
@@ -8,6 +8,7 @@
8
8
  #include <string>
9
9
  #include <vector>
10
10
 
11
+ #include "CipherInfo.hpp"
11
12
  #include "HybridCipherSpec.hpp"
12
13
 
13
14
  namespace margelo::nitro::crypto {
@@ -40,6 +41,9 @@ class HybridCipher : public HybridCipherSpec {
40
41
 
41
42
  std::vector<std::string> getSupportedCiphers() override;
42
43
 
44
+ std::optional<CipherInfo> getCipherInfo(const std::string& name, std::optional<double> keyLength,
45
+ std::optional<double> ivLength) override;
46
+
43
47
  protected:
44
48
  // Protected enums for state management
45
49
  enum CipherKind { kCipher, kDecipher };
@@ -11,7 +11,9 @@
11
11
  #include "HybridCipherFactorySpec.hpp"
12
12
  #include "OCBCipher.hpp"
13
13
  #include "QuickCryptoUtils.hpp"
14
+ #include "XChaCha20Poly1305Cipher.hpp"
14
15
  #include "XSalsa20Cipher.hpp"
16
+ #include "XSalsa20Poly1305Cipher.hpp"
15
17
 
16
18
  namespace margelo::nitro::crypto {
17
19
 
@@ -88,7 +90,7 @@ class HybridCipherFactory : public HybridCipherFactorySpec {
88
90
  }
89
91
  EVP_CIPHER_free(cipher);
90
92
 
91
- // libsodium
93
+ // libsodium ciphers
92
94
  std::string cipherName = toLower(args.cipherType);
93
95
  if (cipherName == "xsalsa20") {
94
96
  cipherInstance = std::make_shared<XSalsa20Cipher>();
@@ -96,6 +98,18 @@ class HybridCipherFactory : public HybridCipherFactorySpec {
96
98
  cipherInstance->init(args.cipherKey, args.iv);
97
99
  return cipherInstance;
98
100
  }
101
+ if (cipherName == "xsalsa20-poly1305") {
102
+ cipherInstance = std::make_shared<XSalsa20Poly1305Cipher>();
103
+ cipherInstance->setArgs(args);
104
+ cipherInstance->init(args.cipherKey, args.iv);
105
+ return cipherInstance;
106
+ }
107
+ if (cipherName == "xchacha20-poly1305") {
108
+ cipherInstance = std::make_shared<XChaCha20Poly1305Cipher>();
109
+ cipherInstance->setArgs(args);
110
+ cipherInstance->init(args.cipherKey, args.iv);
111
+ return cipherInstance;
112
+ }
99
113
 
100
114
  // Unsupported cipher type
101
115
  throw std::runtime_error("Unsupported or unknown cipher type: " + args.cipherType);
@@ -13,9 +13,9 @@ void OCBCipher::init(const std::shared_ptr<ArrayBuffer>& key, const std::shared_
13
13
  HybridCipher::init(key, iv);
14
14
  auth_tag_len = tag_len;
15
15
 
16
- // Set tag length for OCB (must be 12-16 bytes)
17
- if (auth_tag_len < 12 || auth_tag_len > 16) {
18
- throw std::runtime_error("OCB tag length must be between 12 and 16 bytes");
16
+ // Set tag length for OCB (must be 8-16 bytes)
17
+ if (auth_tag_len < 8 || auth_tag_len > 16) {
18
+ throw std::runtime_error("OCB tag length must be between 8 and 16 bytes");
19
19
  }
20
20
  if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, auth_tag_len, nullptr) != 1) {
21
21
  throw std::runtime_error("Failed to set OCB tag length");
@@ -42,7 +42,7 @@ bool OCBCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
42
42
  }
43
43
  auto native_tag = ToNativeArrayBuffer(tag);
44
44
  size_t tag_len = native_tag->size();
45
- if (tag_len < 12 || tag_len > 16) {
45
+ if (tag_len < 8 || tag_len > 16) {
46
46
  throw std::runtime_error("Invalid OCB tag length");
47
47
  }
48
48
  if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, native_tag->data()) != 1) {
@@ -0,0 +1,161 @@
1
+ #include "XChaCha20Poly1305Cipher.hpp"
2
+
3
+ #include <cstring>
4
+ #include <stdexcept>
5
+
6
+ #include "NitroModules/ArrayBuffer.hpp"
7
+ #include "QuickCryptoUtils.hpp"
8
+
9
+ namespace margelo::nitro::crypto {
10
+
11
+ XChaCha20Poly1305Cipher::~XChaCha20Poly1305Cipher() {
12
+ #ifdef BLSALLOC_SODIUM
13
+ sodium_memzero(key_, kKeySize);
14
+ sodium_memzero(nonce_, kNonceSize);
15
+ sodium_memzero(auth_tag_, kTagSize);
16
+ if (!data_buffer_.empty()) {
17
+ sodium_memzero(data_buffer_.data(), data_buffer_.size());
18
+ }
19
+ if (!aad_.empty()) {
20
+ sodium_memzero(aad_.data(), aad_.size());
21
+ }
22
+ #else
23
+ std::memset(key_, 0, kKeySize);
24
+ std::memset(nonce_, 0, kNonceSize);
25
+ std::memset(auth_tag_, 0, kTagSize);
26
+ #endif
27
+ data_buffer_.clear();
28
+ aad_.clear();
29
+ }
30
+
31
+ void XChaCha20Poly1305Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
32
+ auto native_key = ToNativeArrayBuffer(cipher_key);
33
+ auto native_iv = ToNativeArrayBuffer(iv);
34
+
35
+ if (native_key->size() != kKeySize) {
36
+ throw std::runtime_error("XChaCha20-Poly1305 key must be 32 bytes, got " + std::to_string(native_key->size()) + " bytes");
37
+ }
38
+
39
+ if (native_iv->size() != kNonceSize) {
40
+ throw std::runtime_error("XChaCha20-Poly1305 nonce must be 24 bytes, got " + std::to_string(native_iv->size()) + " bytes");
41
+ }
42
+
43
+ std::memcpy(key_, native_key->data(), kKeySize);
44
+ std::memcpy(nonce_, native_iv->data(), kNonceSize);
45
+
46
+ data_buffer_.clear();
47
+ aad_.clear();
48
+ final_called_ = false;
49
+ }
50
+
51
+ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
52
+ #ifndef BLSALLOC_SODIUM
53
+ throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
54
+ #else
55
+ auto native_data = ToNativeArrayBuffer(data);
56
+ size_t data_len = native_data->size();
57
+
58
+ size_t old_size = data_buffer_.size();
59
+ data_buffer_.resize(old_size + data_len);
60
+ std::memcpy(data_buffer_.data() + old_size, native_data->data(), data_len);
61
+
62
+ return std::make_shared<NativeArrayBuffer>(nullptr, 0, nullptr);
63
+ #endif
64
+ }
65
+
66
+ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::final() {
67
+ #ifndef BLSALLOC_SODIUM
68
+ throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
69
+ #else
70
+ if (is_cipher) {
71
+ uint8_t* ciphertext = new uint8_t[data_buffer_.size()];
72
+
73
+ int result =
74
+ crypto_aead_xchacha20poly1305_ietf_encrypt_detached(ciphertext, auth_tag_, nullptr, data_buffer_.data(), data_buffer_.size(),
75
+ aad_.empty() ? nullptr : aad_.data(), aad_.size(), nullptr, nonce_, key_);
76
+
77
+ if (result != 0) {
78
+ sodium_memzero(ciphertext, data_buffer_.size());
79
+ delete[] ciphertext;
80
+ throw std::runtime_error("XChaCha20Poly1305Cipher: encryption failed");
81
+ }
82
+
83
+ final_called_ = true;
84
+ size_t ct_len = data_buffer_.size();
85
+ return std::make_shared<NativeArrayBuffer>(ciphertext, ct_len, [=]() { delete[] ciphertext; });
86
+ } else {
87
+ if (data_buffer_.empty()) {
88
+ final_called_ = true;
89
+ return std::make_shared<NativeArrayBuffer>(nullptr, 0, nullptr);
90
+ }
91
+
92
+ uint8_t* plaintext = new uint8_t[data_buffer_.size()];
93
+
94
+ int result =
95
+ crypto_aead_xchacha20poly1305_ietf_decrypt_detached(plaintext, nullptr, data_buffer_.data(), data_buffer_.size(), auth_tag_,
96
+ aad_.empty() ? nullptr : aad_.data(), aad_.size(), nonce_, key_);
97
+
98
+ if (result != 0) {
99
+ sodium_memzero(plaintext, data_buffer_.size());
100
+ delete[] plaintext;
101
+ throw std::runtime_error("XChaCha20Poly1305Cipher: decryption failed - authentication tag mismatch");
102
+ }
103
+
104
+ final_called_ = true;
105
+ size_t pt_len = data_buffer_.size();
106
+ return std::make_shared<NativeArrayBuffer>(plaintext, pt_len, [=]() { delete[] plaintext; });
107
+ }
108
+ #endif
109
+ }
110
+
111
+ bool XChaCha20Poly1305Cipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
112
+ #ifndef BLSALLOC_SODIUM
113
+ throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
114
+ #else
115
+ auto native_aad = ToNativeArrayBuffer(data);
116
+ aad_.resize(native_aad->size());
117
+ std::memcpy(aad_.data(), native_aad->data(), native_aad->size());
118
+ return true;
119
+ #endif
120
+ }
121
+
122
+ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::getAuthTag() {
123
+ #ifndef BLSALLOC_SODIUM
124
+ throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
125
+ #else
126
+ if (!is_cipher) {
127
+ throw std::runtime_error("getAuthTag can only be called during encryption");
128
+ }
129
+ if (!final_called_) {
130
+ throw std::runtime_error("getAuthTag must be called after final()");
131
+ }
132
+
133
+ uint8_t* tag_copy = new uint8_t[kTagSize];
134
+ std::memcpy(tag_copy, auth_tag_, kTagSize);
135
+ return std::make_shared<NativeArrayBuffer>(tag_copy, kTagSize, [=]() { delete[] tag_copy; });
136
+ #endif
137
+ }
138
+
139
+ bool XChaCha20Poly1305Cipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
140
+ #ifndef BLSALLOC_SODIUM
141
+ throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
142
+ #else
143
+ if (is_cipher) {
144
+ throw std::runtime_error("setAuthTag can only be called during decryption");
145
+ }
146
+
147
+ auto native_tag = ToNativeArrayBuffer(tag);
148
+ if (native_tag->size() != kTagSize) {
149
+ throw std::runtime_error("XChaCha20-Poly1305 tag must be 16 bytes, got " + std::to_string(native_tag->size()) + " bytes");
150
+ }
151
+
152
+ std::memcpy(auth_tag_, native_tag->data(), kTagSize);
153
+ return true;
154
+ #endif
155
+ }
156
+
157
+ bool XChaCha20Poly1305Cipher::setAutoPadding(bool autoPad) {
158
+ throw std::runtime_error("setAutoPadding is not supported for xchacha20-poly1305");
159
+ }
160
+
161
+ } // namespace margelo::nitro::crypto