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

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 (309) hide show
  1. package/QuickCrypto.podspec +34 -0
  2. package/README.md +13 -46
  3. package/android/CMakeLists.txt +32 -64
  4. package/android/build.gradle +52 -125
  5. package/android/gradle.properties +4 -4
  6. package/android/src/main/cpp/cpp-adapter.cpp +9 -54
  7. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +38 -0
  8. package/cpp/random/HybridRandom.cpp +34 -0
  9. package/cpp/random/HybridRandom.hpp +44 -0
  10. package/cpp/utils/Utils.hpp +9 -0
  11. package/ios/QuickCryptoOnLoad.mm +19 -0
  12. package/lib/commonjs/index.js +39 -39
  13. package/lib/commonjs/index.js.map +1 -1
  14. package/lib/commonjs/random.js +26 -12
  15. package/lib/commonjs/random.js.map +1 -1
  16. package/lib/commonjs/{NativeQuickCrypto/rsa.js → specs/random.nitro.js} +1 -1
  17. package/lib/commonjs/{NativeQuickCrypto/aes.js.map → specs/random.nitro.js.map} +1 -1
  18. package/lib/commonjs/utils/conversion.js +22 -0
  19. package/lib/commonjs/utils/conversion.js.map +1 -0
  20. package/lib/commonjs/utils/index.js +12 -0
  21. package/lib/commonjs/utils/index.js.map +1 -0
  22. package/lib/commonjs/utils/types.js +2 -0
  23. package/lib/{module/NativeQuickCrypto/aes.js.map → commonjs/utils/types.js.map} +1 -1
  24. package/lib/module/index.js +38 -38
  25. package/lib/module/index.js.map +1 -1
  26. package/lib/module/random.js +26 -12
  27. package/lib/module/random.js.map +1 -1
  28. package/lib/module/specs/random.nitro.js +4 -0
  29. package/lib/module/{NativeQuickCrypto/rsa.js.map → specs/random.nitro.js.map} +1 -1
  30. package/lib/module/utils/conversion.js +16 -0
  31. package/lib/module/utils/conversion.js.map +1 -0
  32. package/lib/module/utils/index.js +8 -0
  33. package/lib/module/utils/index.js.map +1 -0
  34. package/lib/module/utils/types.js +2 -0
  35. package/lib/{commonjs/NativeQuickCrypto/rsa.js.map → module/utils/types.js.map} +1 -1
  36. package/lib/tsconfig.tsbuildinfo +1 -0
  37. package/lib/typescript/index.d.ts +10 -141
  38. package/lib/typescript/index.d.ts.map +1 -1
  39. package/lib/typescript/random.d.ts +4 -5
  40. package/lib/typescript/random.d.ts.map +1 -1
  41. package/lib/typescript/specs/random.nitro.d.ts +9 -0
  42. package/lib/typescript/specs/random.nitro.d.ts.map +1 -0
  43. package/lib/typescript/utils/conversion.d.ts +4 -0
  44. package/lib/typescript/utils/conversion.d.ts.map +1 -0
  45. package/lib/typescript/utils/index.d.ts +6 -0
  46. package/lib/typescript/utils/index.d.ts.map +1 -0
  47. package/lib/typescript/utils/types.d.ts +5 -0
  48. package/lib/typescript/utils/types.d.ts.map +1 -0
  49. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +45 -0
  50. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +26 -0
  51. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +57 -0
  52. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +9 -0
  53. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +25 -0
  54. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +29 -0
  55. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +23 -0
  56. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +62 -0
  57. package/package.json +50 -106
  58. package/src/index.ts +38 -48
  59. package/src/random.ts +51 -48
  60. package/src/specs/random.nitro.ts +14 -0
  61. package/src/utils/conversion.ts +16 -0
  62. package/src/utils/index.ts +6 -0
  63. package/src/utils/types.ts +15 -0
  64. package/LICENSE +0 -27
  65. package/android/src/main/java/com/margelo/quickcrypto/QuickCryptoModule.java +0 -70
  66. package/android/src/main/java/com/margelo/quickcrypto/QuickCryptoPackage.java +0 -25
  67. package/cpp/Cipher/MGLCipherHostObject.cpp +0 -663
  68. package/cpp/Cipher/MGLCipherHostObject.h +0 -90
  69. package/cpp/Cipher/MGLCreateCipherInstaller.cpp +0 -75
  70. package/cpp/Cipher/MGLCreateCipherInstaller.h +0 -22
  71. package/cpp/Cipher/MGLCreateDecipherInstaller.cpp +0 -77
  72. package/cpp/Cipher/MGLCreateDecipherInstaller.h +0 -17
  73. package/cpp/Cipher/MGLGenerateKeyPairInstaller.cpp +0 -134
  74. package/cpp/Cipher/MGLGenerateKeyPairInstaller.h +0 -35
  75. package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp +0 -63
  76. package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.h +0 -37
  77. package/cpp/Cipher/MGLPublicCipher.h +0 -124
  78. package/cpp/Cipher/MGLPublicCipherInstaller.h +0 -107
  79. package/cpp/Cipher/MGLRsa.cpp +0 -573
  80. package/cpp/Cipher/MGLRsa.h +0 -109
  81. package/cpp/HMAC/MGLHmacHostObject.cpp +0 -95
  82. package/cpp/HMAC/MGLHmacHostObject.h +0 -39
  83. package/cpp/HMAC/MGLHmacInstaller.cpp +0 -43
  84. package/cpp/HMAC/MGLHmacInstaller.h +0 -20
  85. package/cpp/Hash/MGLHashHostObject.cpp +0 -147
  86. package/cpp/Hash/MGLHashHostObject.h +0 -53
  87. package/cpp/Hash/MGLHashInstaller.cpp +0 -44
  88. package/cpp/Hash/MGLHashInstaller.h +0 -20
  89. package/cpp/JSIUtils/MGLJSIMacros.h +0 -110
  90. package/cpp/JSIUtils/MGLJSIUtils.h +0 -41
  91. package/cpp/JSIUtils/MGLSmartHostObject.cpp +0 -43
  92. package/cpp/JSIUtils/MGLSmartHostObject.h +0 -46
  93. package/cpp/JSIUtils/MGLThreadAwareHostObject.cpp +0 -24
  94. package/cpp/JSIUtils/MGLThreadAwareHostObject.h +0 -43
  95. package/cpp/JSIUtils/MGLTypedArray.cpp +0 -325
  96. package/cpp/JSIUtils/MGLTypedArray.h +0 -160
  97. package/cpp/MGLKeys.cpp +0 -1426
  98. package/cpp/MGLKeys.h +0 -203
  99. package/cpp/MGLQuickCryptoHostObject.cpp +0 -127
  100. package/cpp/MGLQuickCryptoHostObject.h +0 -30
  101. package/cpp/Random/MGLRandomHostObject.cpp +0 -96
  102. package/cpp/Random/MGLRandomHostObject.h +0 -27
  103. package/cpp/Sig/MGLSignHostObjects.cpp +0 -757
  104. package/cpp/Sig/MGLSignHostObjects.h +0 -128
  105. package/cpp/Sig/MGLSignInstaller.cpp +0 -24
  106. package/cpp/Sig/MGLSignInstaller.h +0 -29
  107. package/cpp/Sig/MGLVerifyInstaller.cpp +0 -24
  108. package/cpp/Sig/MGLVerifyInstaller.h +0 -22
  109. package/cpp/Utils/MGLDispatchQueue.cpp +0 -75
  110. package/cpp/Utils/MGLDispatchQueue.h +0 -55
  111. package/cpp/Utils/MGLUtils.cpp +0 -295
  112. package/cpp/Utils/MGLUtils.h +0 -358
  113. package/cpp/Utils/base64.h +0 -320
  114. package/cpp/Utils/logs.h +0 -38
  115. package/cpp/Utils/node.h +0 -13
  116. package/cpp/fastpbkdf2/MGLPbkdf2HostObject.cpp +0 -164
  117. package/cpp/fastpbkdf2/MGLPbkdf2HostObject.h +0 -29
  118. package/cpp/fastpbkdf2/fastpbkdf2.c +0 -352
  119. package/cpp/fastpbkdf2/fastpbkdf2.h +0 -68
  120. package/cpp/webcrypto/MGLWebCrypto.cpp +0 -125
  121. package/cpp/webcrypto/MGLWebCrypto.h +0 -32
  122. package/cpp/webcrypto/crypto_aes.cpp +0 -516
  123. package/cpp/webcrypto/crypto_aes.h +0 -79
  124. package/cpp/webcrypto/crypto_ec.cpp +0 -424
  125. package/cpp/webcrypto/crypto_ec.h +0 -78
  126. package/cpp/webcrypto/crypto_keygen.cpp +0 -86
  127. package/cpp/webcrypto/crypto_keygen.h +0 -38
  128. package/ios/QuickCrypto.xcodeproj/project.pbxproj +0 -274
  129. package/ios/QuickCryptoModule.h +0 -5
  130. package/ios/QuickCryptoModule.mm +0 -42
  131. package/lib/commonjs/Cipher.js +0 -502
  132. package/lib/commonjs/Cipher.js.map +0 -1
  133. package/lib/commonjs/Hash.js +0 -99
  134. package/lib/commonjs/Hash.js.map +0 -1
  135. package/lib/commonjs/Hashnames.js +0 -87
  136. package/lib/commonjs/Hashnames.js.map +0 -1
  137. package/lib/commonjs/Hmac.js +0 -79
  138. package/lib/commonjs/Hmac.js.map +0 -1
  139. package/lib/commonjs/NativeQuickCrypto/Cipher.js +0 -30
  140. package/lib/commonjs/NativeQuickCrypto/Cipher.js.map +0 -1
  141. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js +0 -52
  142. package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +0 -1
  143. package/lib/commonjs/NativeQuickCrypto/aes.js +0 -6
  144. package/lib/commonjs/NativeQuickCrypto/hash.js +0 -2
  145. package/lib/commonjs/NativeQuickCrypto/hash.js.map +0 -1
  146. package/lib/commonjs/NativeQuickCrypto/hmac.js +0 -2
  147. package/lib/commonjs/NativeQuickCrypto/hmac.js.map +0 -1
  148. package/lib/commonjs/NativeQuickCrypto/keygen.js +0 -6
  149. package/lib/commonjs/NativeQuickCrypto/keygen.js.map +0 -1
  150. package/lib/commonjs/NativeQuickCrypto/pbkdf2.js +0 -2
  151. package/lib/commonjs/NativeQuickCrypto/pbkdf2.js.map +0 -1
  152. package/lib/commonjs/NativeQuickCrypto/random.js +0 -2
  153. package/lib/commonjs/NativeQuickCrypto/random.js.map +0 -1
  154. package/lib/commonjs/NativeQuickCrypto/sig.js +0 -19
  155. package/lib/commonjs/NativeQuickCrypto/sig.js.map +0 -1
  156. package/lib/commonjs/NativeQuickCrypto/webcrypto.js +0 -6
  157. package/lib/commonjs/NativeQuickCrypto/webcrypto.js.map +0 -1
  158. package/lib/commonjs/Utils.js +0 -608
  159. package/lib/commonjs/Utils.js.map +0 -1
  160. package/lib/commonjs/aes.js +0 -281
  161. package/lib/commonjs/aes.js.map +0 -1
  162. package/lib/commonjs/constants.js +0 -85
  163. package/lib/commonjs/constants.js.map +0 -1
  164. package/lib/commonjs/ec.js +0 -276
  165. package/lib/commonjs/ec.js.map +0 -1
  166. package/lib/commonjs/keygen.js +0 -56
  167. package/lib/commonjs/keygen.js.map +0 -1
  168. package/lib/commonjs/keys.js +0 -492
  169. package/lib/commonjs/keys.js.map +0 -1
  170. package/lib/commonjs/pbkdf2.js +0 -90
  171. package/lib/commonjs/pbkdf2.js.map +0 -1
  172. package/lib/commonjs/rsa.js +0 -248
  173. package/lib/commonjs/rsa.js.map +0 -1
  174. package/lib/commonjs/sig.js +0 -129
  175. package/lib/commonjs/sig.js.map +0 -1
  176. package/lib/commonjs/subtle.js +0 -448
  177. package/lib/commonjs/subtle.js.map +0 -1
  178. package/lib/commonjs/webcrypto.js +0 -14
  179. package/lib/commonjs/webcrypto.js.map +0 -1
  180. package/lib/module/Cipher.js +0 -491
  181. package/lib/module/Cipher.js.map +0 -1
  182. package/lib/module/Hash.js +0 -93
  183. package/lib/module/Hash.js.map +0 -1
  184. package/lib/module/Hashnames.js +0 -85
  185. package/lib/module/Hashnames.js.map +0 -1
  186. package/lib/module/Hmac.js +0 -74
  187. package/lib/module/Hmac.js.map +0 -1
  188. package/lib/module/NativeQuickCrypto/Cipher.js +0 -26
  189. package/lib/module/NativeQuickCrypto/Cipher.js.map +0 -1
  190. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js +0 -49
  191. package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +0 -1
  192. package/lib/module/NativeQuickCrypto/aes.js +0 -4
  193. package/lib/module/NativeQuickCrypto/hash.js +0 -2
  194. package/lib/module/NativeQuickCrypto/hash.js.map +0 -1
  195. package/lib/module/NativeQuickCrypto/hmac.js +0 -2
  196. package/lib/module/NativeQuickCrypto/hmac.js.map +0 -1
  197. package/lib/module/NativeQuickCrypto/keygen.js +0 -4
  198. package/lib/module/NativeQuickCrypto/keygen.js.map +0 -1
  199. package/lib/module/NativeQuickCrypto/pbkdf2.js +0 -2
  200. package/lib/module/NativeQuickCrypto/pbkdf2.js.map +0 -1
  201. package/lib/module/NativeQuickCrypto/random.js +0 -2
  202. package/lib/module/NativeQuickCrypto/random.js.map +0 -1
  203. package/lib/module/NativeQuickCrypto/rsa.js +0 -4
  204. package/lib/module/NativeQuickCrypto/sig.js +0 -17
  205. package/lib/module/NativeQuickCrypto/sig.js.map +0 -1
  206. package/lib/module/NativeQuickCrypto/webcrypto.js +0 -4
  207. package/lib/module/NativeQuickCrypto/webcrypto.js.map +0 -1
  208. package/lib/module/Utils.js +0 -539
  209. package/lib/module/Utils.js.map +0 -1
  210. package/lib/module/aes.js +0 -274
  211. package/lib/module/aes.js.map +0 -1
  212. package/lib/module/constants.js +0 -81
  213. package/lib/module/constants.js.map +0 -1
  214. package/lib/module/ec.js +0 -267
  215. package/lib/module/ec.js.map +0 -1
  216. package/lib/module/keygen.js +0 -49
  217. package/lib/module/keygen.js.map +0 -1
  218. package/lib/module/keys.js +0 -477
  219. package/lib/module/keys.js.map +0 -1
  220. package/lib/module/pbkdf2.js +0 -84
  221. package/lib/module/pbkdf2.js.map +0 -1
  222. package/lib/module/rsa.js +0 -242
  223. package/lib/module/rsa.js.map +0 -1
  224. package/lib/module/sig.js +0 -124
  225. package/lib/module/sig.js.map +0 -1
  226. package/lib/module/subtle.js +0 -443
  227. package/lib/module/subtle.js.map +0 -1
  228. package/lib/module/webcrypto.js +0 -10
  229. package/lib/module/webcrypto.js.map +0 -1
  230. package/lib/typescript/Cipher.d.ts +0 -81
  231. package/lib/typescript/Cipher.d.ts.map +0 -1
  232. package/lib/typescript/Hash.d.ts +0 -44
  233. package/lib/typescript/Hash.d.ts.map +0 -1
  234. package/lib/typescript/Hashnames.d.ts +0 -11
  235. package/lib/typescript/Hashnames.d.ts.map +0 -1
  236. package/lib/typescript/Hmac.d.ts +0 -37
  237. package/lib/typescript/Hmac.d.ts.map +0 -1
  238. package/lib/typescript/NativeQuickCrypto/Cipher.d.ts +0 -44
  239. package/lib/typescript/NativeQuickCrypto/Cipher.d.ts.map +0 -1
  240. package/lib/typescript/NativeQuickCrypto/NativeQuickCrypto.d.ts +0 -33
  241. package/lib/typescript/NativeQuickCrypto/NativeQuickCrypto.d.ts.map +0 -1
  242. package/lib/typescript/NativeQuickCrypto/aes.d.ts +0 -5
  243. package/lib/typescript/NativeQuickCrypto/aes.d.ts.map +0 -1
  244. package/lib/typescript/NativeQuickCrypto/hash.d.ts +0 -7
  245. package/lib/typescript/NativeQuickCrypto/hash.d.ts.map +0 -1
  246. package/lib/typescript/NativeQuickCrypto/hmac.d.ts +0 -6
  247. package/lib/typescript/NativeQuickCrypto/hmac.d.ts.map +0 -1
  248. package/lib/typescript/NativeQuickCrypto/keygen.d.ts +0 -4
  249. package/lib/typescript/NativeQuickCrypto/keygen.d.ts.map +0 -1
  250. package/lib/typescript/NativeQuickCrypto/pbkdf2.d.ts +0 -5
  251. package/lib/typescript/NativeQuickCrypto/pbkdf2.d.ts.map +0 -1
  252. package/lib/typescript/NativeQuickCrypto/random.d.ts +0 -5
  253. package/lib/typescript/NativeQuickCrypto/random.d.ts.map +0 -1
  254. package/lib/typescript/NativeQuickCrypto/rsa.d.ts +0 -5
  255. package/lib/typescript/NativeQuickCrypto/rsa.d.ts.map +0 -1
  256. package/lib/typescript/NativeQuickCrypto/sig.d.ts +0 -23
  257. package/lib/typescript/NativeQuickCrypto/sig.d.ts.map +0 -1
  258. package/lib/typescript/NativeQuickCrypto/webcrypto.d.ts +0 -39
  259. package/lib/typescript/NativeQuickCrypto/webcrypto.d.ts.map +0 -1
  260. package/lib/typescript/Utils.d.ts +0 -48
  261. package/lib/typescript/Utils.d.ts.map +0 -1
  262. package/lib/typescript/aes.d.ts +0 -22
  263. package/lib/typescript/aes.d.ts.map +0 -1
  264. package/lib/typescript/constants.d.ts +0 -76
  265. package/lib/typescript/constants.d.ts.map +0 -1
  266. package/lib/typescript/ec.d.ts +0 -7
  267. package/lib/typescript/ec.d.ts.map +0 -1
  268. package/lib/typescript/keygen.d.ts +0 -6
  269. package/lib/typescript/keygen.d.ts.map +0 -1
  270. package/lib/typescript/keys.d.ts +0 -206
  271. package/lib/typescript/keys.d.ts.map +0 -1
  272. package/lib/typescript/pbkdf2.d.ts +0 -12
  273. package/lib/typescript/pbkdf2.d.ts.map +0 -1
  274. package/lib/typescript/rsa.d.ts +0 -12
  275. package/lib/typescript/rsa.d.ts.map +0 -1
  276. package/lib/typescript/sig.d.ts +0 -21
  277. package/lib/typescript/sig.d.ts.map +0 -1
  278. package/lib/typescript/subtle.d.ts +0 -15
  279. package/lib/typescript/subtle.d.ts.map +0 -1
  280. package/lib/typescript/webcrypto.d.ts +0 -9
  281. package/lib/typescript/webcrypto.d.ts.map +0 -1
  282. package/react-native-quick-crypto.podspec +0 -40
  283. package/src/Cipher.ts +0 -832
  284. package/src/Hash.ts +0 -132
  285. package/src/Hashnames.ts +0 -93
  286. package/src/Hmac.ts +0 -106
  287. package/src/NativeQuickCrypto/Cipher.ts +0 -102
  288. package/src/NativeQuickCrypto/NativeQuickCrypto.ts +0 -102
  289. package/src/NativeQuickCrypto/aes.ts +0 -14
  290. package/src/NativeQuickCrypto/hash.ts +0 -10
  291. package/src/NativeQuickCrypto/hmac.ts +0 -9
  292. package/src/NativeQuickCrypto/keygen.ts +0 -7
  293. package/src/NativeQuickCrypto/pbkdf2.ts +0 -16
  294. package/src/NativeQuickCrypto/random.ts +0 -12
  295. package/src/NativeQuickCrypto/rsa.ts +0 -12
  296. package/src/NativeQuickCrypto/sig.ts +0 -44
  297. package/src/NativeQuickCrypto/webcrypto.ts +0 -72
  298. package/src/Utils.ts +0 -777
  299. package/src/aes.ts +0 -402
  300. package/src/constants.ts +0 -79
  301. package/src/ec.ts +0 -375
  302. package/src/keygen.ts +0 -80
  303. package/src/keys.ts +0 -787
  304. package/src/pbkdf2.ts +0 -169
  305. package/src/rsa.ts +0 -370
  306. package/src/sig.ts +0 -164
  307. package/src/subtle.ts +0 -639
  308. package/src/webcrypto.ts +0 -8
  309. /package/android/src/main/{AndroidManifestNew.xml → AndroidManifest.xml} +0 -0
@@ -0,0 +1,34 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::UI.puts "[QuickCrypto] crypto just got quicker 💨"
6
+
7
+ Pod::Spec.new do |s|
8
+ s.name = "QuickCrypto"
9
+ s.version = package["version"]
10
+ s.summary = package["description"]
11
+ s.homepage = package["homepage"]
12
+ s.license = package["license"]
13
+ s.authors = package["authors"]
14
+
15
+ s.platforms = { :ios => min_ios_version_supported }
16
+ s.source = { :git => "https://github.com/margelo/react-native-quick-crypto.git", :tag => "#{s.version}" }
17
+
18
+ s.source_files = [
19
+ # implementation (Swift)
20
+ "ios/**/*.{swift}",
21
+ # ios (Objective-C++)
22
+ "ios/**/*.{h,m,mm}",
23
+ # implementation (C++)
24
+ "cpp/**/*.{hpp,cpp}",
25
+ ]
26
+
27
+ # Add all files generated by Nitrogen
28
+ load 'nitrogen/generated/ios/QuickCrypto+autolinking.rb'
29
+ add_nitrogen_files(s)
30
+
31
+ install_modules_dependencies(s)
32
+ s.dependency "OpenSSL-Universal"
33
+
34
+ end
package/README.md CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  A fast implementation of Node's `crypto` module.
8
8
 
9
+ > Note: This version `1.x` is undergoing a major refactor, porting to New Architecture, Bridgeless, and [`Nitro Modules`](https://github.com/mrousavy/react-native-nitro) and is incomplete compared to the `0.x` version. Status, as always, will be represented in [implementation-coverage.md](../blob/main/docs/implementation-coverage.md).
10
+
11
+ ## Features
12
+
9
13
  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.
10
14
  QuickCrypto can be used as a drop-in replacement for your Web3/Crypto apps to speed up common cryptography functions.
11
15
 
@@ -16,6 +20,15 @@ QuickCrypto can be used as a drop-in replacement for your Web3/Crypto apps to sp
16
20
  - 🔢 Secure native compiled cryptography
17
21
  - 🔁 Easy drop-in replacement for [crypto-browserify](https://github.com/browserify/crypto-browserify) or [react-native-crypto](https://github.com/tradle/react-native-crypto)
18
22
 
23
+ ## Versions
24
+
25
+ | Version | RN Architecture | Modules |
26
+ | ------- | ------ | ------- |
27
+ | `1.x` | new [->](https://github.com/reactwg/react-native-new-architecture/blob/main/docs/enable-apps.md) | Nitro Modules [->](https://github.com/margelo/react-native-nitro) |
28
+ | `0.x` | old | Bridge & JSI |
29
+
30
+ ## Benchmarks
31
+
19
32
  For example, creating a Wallet using ethers.js uses complex algorithms to generate a private-key/mnemonic-phrase pair:
20
33
 
21
34
  ```ts
@@ -133,52 +146,6 @@ const hashed = QuickCrypto.createHash('sha256')
133
146
  .digest('hex');
134
147
  ```
135
148
 
136
- ---
137
-
138
- ## Sponsors
139
-
140
- <!-- Onin -->
141
- <div align="center">
142
- <img height="50" src="./docs/img/sponsors/onin.svg" align="center"><br/>
143
- <a href="https://onin.co"><b>Onin</b></a> - This library is supported by Onin. Plan events without leaving the chat: <a href="https://onin.co">onin.co</a>
144
- </div>
145
- <br/>
146
- <br/>
147
-
148
- <!-- Steakwallet -->
149
- <div align="center">
150
- <img height="37" src="./docs/img/sponsors/omni.png" align="center"><br/>
151
- <a href="https://steakwallet.fi"><b>Omni</b></a> - Web3 for all. Access all of Web3 in one easy to use wallet. Omni supports more blockchains so you get more tokens, more yields, more NFTs, and more fun!
152
- </div>
153
- <br/>
154
- <br/>
155
-
156
- <!-- Litentry -->
157
- <div align="center">
158
- <img height="70" src="./docs/img/sponsors/litentry.png" align="center"><br/>
159
- <a href="https://litentry.com"><b>Litentry</b></a> - A decentralized identity aggregator, providing the structure and tools to empower you and your identity.
160
- </div>
161
- <br/>
162
- <br/>
163
-
164
- <!-- WalletConnect -->
165
- <div align="center">
166
- <img height="35" src="./docs/img/sponsors/walletconnect.png" align="center"><br/>
167
- <a href="https://walletconnect.com"><b>WalletConnect</b></a> - The communications protocol for web3, WalletConnect brings the ecosystem together by enabling wallets and apps to securely connect and interact.
168
- </div>
169
- <br/>
170
- <br/>
171
-
172
- <!-- WalletConnect -->
173
-
174
- <!-- THORSwap -->
175
- <div align="center">
176
- <img height="40" src="./docs/img/sponsors/thorswap.png" align="center"><br/>
177
- <a href="https://thorswap.finance"><b>THORSwap</b></a> - THORSwap is a cross-chain DEX aggregator that enables users to swap native assets across chains, provide liquidity to earn yield, and more. THORSwap is fully permissionless and non-custodial. No account signup, your wallet, your keys, your coins.
178
- </div>
179
- <br/>
180
- <br/>
181
-
182
149
  ## Limitations
183
150
 
184
151
  As the library uses JSI for synchronous native methods access, remote debugging (e.g. with Chrome) is no longer possible. Instead, you should use [Flipper](https://fbflipper.com).
@@ -1,76 +1,44 @@
1
- project(ReactNativeQuickCrypto)
2
- cmake_minimum_required(VERSION 3.10.2)
1
+ cmake_minimum_required(VERSION 3.9.0)
3
2
 
4
- set(PACKAGE_NAME "reactnativequickcrypto")
5
- set(BUILD_DIR ${CMAKE_SOURCE_DIR}/build)
6
- set(CMAKE_VERBOSE_MAKEFILE ON)
7
- set(CMAKE_CXX_STANDARD 17)
8
-
9
- # set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
10
- # set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
3
+ project(QuickCrypto)
4
+ set(PACKAGE_NAME QuickCrypto)
11
5
 
12
- # Third party libraries (Prefabs)
13
- find_package(fbjni REQUIRED CONFIG)
14
- find_package(ReactAndroid REQUIRED CONFIG)
15
- find_package(openssl REQUIRED CONFIG)
16
- find_library(LOG_LIB log)
6
+ set(CMAKE_VERBOSE_MAKEFILE ON)
7
+ set(CMAKE_CXX_STANDARD 20)
17
8
 
9
+ # Define C++ library and add all sources
18
10
  add_library(
19
- ${PACKAGE_NAME}
20
- SHARED
21
- "src/main/cpp/cpp-adapter.cpp"
22
- "../cpp/MGLQuickCryptoHostObject.cpp"
23
- "../cpp/JSIUtils/MGLTypedArray.cpp"
24
- "../cpp/Utils/MGLDispatchQueue.cpp"
25
- "../cpp/JSIUtils/MGLThreadAwareHostObject.cpp"
26
- "../cpp/JSIUtils/MGLSmartHostObject.cpp"
27
- "../cpp/HMAC/MGLHmacInstaller.cpp"
28
- "../cpp/HMAC/MGLHmacHostObject.cpp"
29
- "../cpp/fastpbkdf2/MGLPbkdf2HostObject.cpp"
30
- "../cpp/fastpbkdf2/fastpbkdf2.c"
31
- "../cpp/Random/MGLRandomHostObject.cpp"
32
- "../cpp/Hash/MGLHashInstaller.cpp"
33
- "../cpp/Hash/MGLHashHostObject.cpp"
34
- "../cpp/Cipher/MGLCipherHostObject.cpp"
35
- "../cpp/Cipher/MGLCreateCipherInstaller.cpp"
36
- "../cpp/Cipher/MGLCreateDecipherInstaller.cpp"
37
- "../cpp/MGLKeys.cpp"
38
- "../cpp/Utils/MGLUtils.cpp"
39
- "../cpp/Cipher/MGLRsa.cpp"
40
- "../cpp/Cipher/MGLGenerateKeyPairInstaller.cpp"
41
- "../cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp"
42
- "../cpp/Sig/MGLSignInstaller.cpp"
43
- "../cpp/Sig/MGLVerifyInstaller.cpp"
44
- "../cpp/Sig/MGLSignHostObjects.cpp"
45
- "../cpp/webcrypto/MGLWebCrypto.cpp"
46
- "../cpp/webcrypto/crypto_aes.cpp"
47
- "../cpp/webcrypto/crypto_ec.cpp"
48
- "../cpp/webcrypto/crypto_keygen.cpp"
11
+ ${PACKAGE_NAME} SHARED
12
+ src/main/cpp/cpp-adapter.cpp
13
+ ../cpp/random/HybridRandom.cpp
49
14
  )
50
15
 
51
- target_include_directories(
52
- ${PACKAGE_NAME}
53
- PRIVATE
54
- "../cpp"
55
- "src/main/cpp"
56
- "${NODE_MODULES_DIR}/react-native/ReactCommon"
57
- "${NODE_MODULES_DIR}/react-native/ReactCommon/callinvoker"
58
- "${NODE_MODULES_DIR}/react-native/ReactAndroid/src/main/jni/react/turbomodule"
59
- "${NODE_MODULES_DIR}/react-native/ReactCommon/jsi"
60
- "${NODE_MODULES_DIR}/react-native/ReactCommon/turbomodule/core"
61
- "${NODE_MODULES_DIR}/react-native/ReactCommon/react/nativemodule/core"
62
- )
16
+ include_directories(../cpp)
17
+ include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/QuickCrypto+autolinking.cmake)
63
18
 
64
- #file(GLOB LIBRN_DIR "${BUILD_DIR}/react-native-0*/jni/${ANDROID_ABI}")
19
+ # Third party libraries (Prefabs)
20
+ find_library(LOG_LIB log)
21
+
22
+ find_package(ReactAndroid REQUIRED CONFIG)
23
+ find_package(fbjni REQUIRED CONFIG)
24
+ find_package(openssl REQUIRED CONFIG)
65
25
 
26
+ # Link all libraries together
66
27
  target_link_libraries(
67
28
  ${PACKAGE_NAME}
68
- ReactAndroid::turbomodulejsijni
69
- fbjni::fbjni # <-- fbjni
70
29
  ${LOG_LIB} # <-- Logcat logger
71
- ReactAndroid::jsi # <-- RN: JSI
72
- ReactAndroid::reactnativejni # <-- RN: React Native JNI bindings
73
- ReactAndroid::react_nativemodule_core # <-- RN: React Native native module core
74
- android # <-- Android JNI core
30
+ android # <-- Android core
31
+ fbjni::fbjni # <-- Facebook C++ JNI helpers
75
32
  openssl::crypto # <-- OpenSSL (Crypto)
76
- )
33
+ ReactAndroid::jsi
34
+ ReactAndroid::turbomodulejsijni
35
+ ReactAndroid::react_nativemodule_core
36
+ ReactAndroid::react_render_core
37
+ ReactAndroid::runtimeexecutor
38
+ ReactAndroid::fabricjni
39
+ ReactAndroid::react_debug
40
+ ReactAndroid::react_render_core
41
+ ReactAndroid::react_render_componentregistry
42
+ ReactAndroid::rrc_view
43
+ ReactAndroid::folly_runtime
44
+ )
@@ -1,118 +1,56 @@
1
- import java.nio.file.Paths
2
- import com.android.Version
3
-
4
- def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
5
- def agpVersionMajor = agpVersion.tokenize('.')[0].toInteger()
6
- def agpVersionMinor = agpVersion.tokenize('.')[1].toInteger()
7
-
8
1
  buildscript {
2
+ ext.kotlinVersion = '1.9.25'
3
+
9
4
  repositories {
10
- maven {
11
- url "https://plugins.gradle.org/m2/"
12
- }
13
- mavenCentral()
14
5
  google()
6
+ mavenCentral()
15
7
  }
16
8
 
17
9
  dependencies {
18
- classpath("com.android.tools.build:gradle:8.3.1")
10
+ classpath "com.android.tools.build:gradle:8.2.2"
11
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
19
12
  }
20
13
  }
21
14
 
22
- def isNewArchitectureEnabled() {
23
- // To opt-in for the New Architecture, you can either:
24
- // - Set `newArchEnabled` to true inside the `gradle.properties` file
25
- // - Invoke gradle with `-newArchEnabled=true`
26
- // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
27
- return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
15
+ def reactNativeArchitectures() {
16
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
17
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
28
18
  }
29
19
 
30
- def resolveBuildType() {
31
- Gradle gradle = getGradle()
32
- String tskReqStr = gradle.getStartParameter().getTaskRequests()['args'].toString()
33
-
34
- return tskReqStr.contains('Release') ? 'release' : 'debug'
20
+ def isNewArchitectureEnabled() {
21
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
35
22
  }
36
23
 
24
+ apply plugin: "com.android.library"
25
+ apply plugin: "org.jetbrains.kotlin.android"
26
+ apply from: "../nitrogen/generated/android/QuickCrypto+autolinking.gradle"
27
+
37
28
  if (isNewArchitectureEnabled()) {
38
29
  apply plugin: "com.facebook.react"
39
30
  }
40
- apply plugin: 'com.android.library'
41
-
42
- def safeExtGet(prop, fallback) {
43
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
44
- }
45
31
 
46
- def reactNativeArchitectures() {
47
- def value = project.getProperties().get("reactNativeArchitectures")
48
- return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
32
+ def getExtOrDefault(name) {
33
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["QuickCrypto_" + name]
49
34
  }
50
35
 
51
- static def findNodeModules(baseDir) {
52
- def basePath = baseDir.toPath().normalize()
53
- // Node's module resolution algorithm searches up to the root directory,
54
- // after which the base path will be null
55
- while (basePath) {
56
- def nodeModulesPath = Paths.get(basePath.toString(), "node_modules")
57
- def reactNativePath = Paths.get(nodeModulesPath.toString(), "react-native")
58
- if (nodeModulesPath.toFile().exists() && reactNativePath.toFile().exists()) {
59
- return nodeModulesPath.toString()
60
- }
61
- basePath = basePath.getParent()
62
- }
63
- throw new GradleException("react-native-quick-crypto: Failed to find node_modules/ path!")
64
- }
65
-
66
- def nodeModules = findNodeModules(projectDir)
67
-
68
- repositories {
69
- google()
70
- mavenCentral()
36
+ def getExtOrIntegerDefault(name) {
37
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["QuickCrypto_" + name]).toInteger()
71
38
  }
72
39
 
73
40
  android {
74
- compileSdkVersion safeExtGet("compileSdkVersion", 31)
75
-
76
- if ((agpVersionMajor == 7 && agpVersionMinor >= 3) || agpVersionMajor >= 8) {
77
- // Namespace support was added in 7.3.0
78
- namespace "com.margelo.quickcrypto"
79
-
80
- sourceSets {
81
- main {
82
- manifest.srcFile "src/main/AndroidManifestNew.xml"
83
- }
84
- }
85
- }
86
-
87
- if (agpVersionMajor >= 8) {
88
- buildFeatures {
89
- buildConfig = true
90
- }
91
- }
92
-
93
- // Used to override the NDK path/version on internal CI or by allowing
94
- // users to customize the NDK path/version from their root project (e.g. for M1 support)
95
- if (rootProject.hasProperty("ndkPath")) {
96
- ndkPath rootProject.ext.ndkPath
97
- }
98
- if (rootProject.hasProperty("ndkVersion")) {
99
- ndkVersion rootProject.ext.ndkVersion
100
- }
101
-
102
- buildFeatures {
103
- prefab true
104
- }
41
+ namespace "com.margelo.nitro.quickcrypto"
42
+ ndkVersion getExtOrDefault("ndkVersion")
43
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
105
44
 
106
45
  defaultConfig {
107
- minSdkVersion safeExtGet('minSdkVersion', 28)
108
- targetSdkVersion safeExtGet('targetSdkVersion', 31)
109
- versionCode 1
110
- versionName "1.0"
46
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
47
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
111
48
  buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
49
+
112
50
  externalNativeBuild {
113
51
  cmake {
114
- cppFlags "-O2 -frtti -fexceptions -Wall -Wno-unused-variable -fstack-protector-all -DANDROID"
115
- arguments "-DANDROID_STL=c++_shared", "-DNODE_MODULES_DIR=${nodeModules}"
52
+ cppFlags "-O2 -frtti -fexceptions -Wall -fstack-protector-all"
53
+ arguments "-DANDROID_STL=c++_shared"
116
54
  abiFilters (*reactNativeArchitectures())
117
55
  }
118
56
  }
@@ -124,42 +62,36 @@ android {
124
62
  }
125
63
  }
126
64
 
127
- packagingOptions {
128
- doNotStrip resolveBuildType() == 'debug' ? "**/**/*.so" : ''
129
- excludes = [
130
- "**/libc++_shared.so",
131
- "**/libfbjni.so",
132
- "**/libreactnativejni.so",
133
- "**/libjsi.so",
134
- "**/libreact_nativemodule_core.so",
135
- "**/libturbomodulejsijni.so",
136
- "**/MANIFEST.MF",
137
- ]
65
+ buildFeatures {
66
+ buildConfig true
67
+ prefab true
138
68
  }
139
69
 
140
70
  buildTypes {
141
71
  release {
142
72
  minifyEnabled false
143
73
  }
144
- debug {
145
- packagingOptions {
146
- doNotStrip '**/*.so'
147
- }
148
- minifyEnabled false
149
- debuggable true
150
- jniDebuggable true
151
- renderscriptDebuggable true
152
- }
153
74
  }
154
75
 
155
76
  lintOptions {
156
- disable 'GradleCompatible'
77
+ disable "GradleCompatible"
157
78
  }
79
+
158
80
  compileOptions {
159
81
  sourceCompatibility JavaVersion.VERSION_1_8
160
82
  targetCompatibility JavaVersion.VERSION_1_8
161
83
  }
162
84
 
85
+ sourceSets {
86
+ main {
87
+ if (isNewArchitectureEnabled()) {
88
+ java.srcDirs += [
89
+ // React Codegen files
90
+ "${project.buildDir}/generated/source/codegen/java"
91
+ ]
92
+ }
93
+ }
94
+ }
163
95
  }
164
96
 
165
97
  repositories {
@@ -167,24 +99,19 @@ repositories {
167
99
  google()
168
100
  }
169
101
 
102
+
170
103
  dependencies {
171
104
  //noinspection GradleDynamicVersion
172
- implementation "com.facebook.react:react-android:+"
173
- // https://mvnrepository.com/artifact/com.android.ndk.thirdparty/openssl
174
- implementation 'com.android.ndk.thirdparty:openssl:1.1.1q-beta-1'
105
+ implementation "com.facebook.react:react-native:+"
106
+
107
+ implementation project(":react-native-nitro-modules")
108
+ implementation "com.android.ndk.thirdparty:openssl:1.1.1q-beta-1"
175
109
  }
176
110
 
177
- // Resolves "LOCAL_SRC_FILES points to a missing file, Check that libfb.so exists or that its path is correct".
178
- tasks.whenTaskAdded { task ->
179
- if (task.name.contains("configureCMakeDebug")) {
180
- rootProject.getTasksByName("packageReactNdkDebugLibs", true).forEach {
181
- task.dependsOn(it)
182
- }
183
- }
184
- // We want to add a dependency for both configureCMakeRelease and configureCMakeRelWithDebInfo
185
- if (task.name.contains("configureCMakeRel")) {
186
- rootProject.getTasksByName("packageReactNdkReleaseLibs", true).forEach {
187
- task.dependsOn(it)
188
- }
111
+ if (isNewArchitectureEnabled()) {
112
+ react {
113
+ jsRootDir = file("../src/")
114
+ libraryName = "QuickCrypto"
115
+ codegenJavaPackageName = "com.margelo.nitro.quickcrypto"
189
116
  }
190
- }
117
+ }
@@ -1,6 +1,6 @@
1
- QuickCrypto_compileSdkVersion=31
2
- QuickCrypto_targetSdkVersion=31
3
- QuickCrypto_ndkversion=21.4.7075529
4
- QuickCrypto_minSdkVersion=28
1
+ QuickCrypto_compileSdkVersion=34
2
+ QuickCrypto_targetSdkVersion=34
3
+ QuickCrypto_minSdkVersion=23
4
+ QuickCrypto_ndkVersion=21.4.7075529
5
5
 
6
6
  android.useAndroidX=true
@@ -1,60 +1,15 @@
1
- #include <ReactCommon/CallInvokerHolder.h>
2
- #include <fbjni/fbjni.h>
3
1
  #include <jni.h>
4
- #include <jsi/jsi.h>
5
2
 
6
- #include "MGLQuickCryptoHostObject.h"
3
+ #include "random/HybridRandom.hpp"
4
+ #include <NitroModules/HybridObjectRegistry.hpp>
7
5
 
8
- using namespace facebook;
6
+ using namespace margelo::nitro::crypto;
7
+ using namespace margelo::crypto;
9
8
 
10
- class CryptoCppAdapter : public jni::HybridClass<CryptoCppAdapter> {
11
- public:
12
- static auto constexpr kJavaDescriptor =
13
- "Lcom/margelo/quickcrypto/QuickCryptoModule;";
9
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
10
+ HybridObjectRegistry::registerHybridObjectConstructor(
11
+ "Random", []() -> std::shared_ptr<HybridObject> { return std::make_shared<HybridRandom>();
12
+ });
14
13
 
15
- static jni::local_ref<jni::HybridClass<CryptoCppAdapter>::jhybriddata>
16
- initHybrid(jni::alias_ref<jhybridobject> jThis) {
17
- return makeCxxInstance();
18
- }
19
-
20
- CryptoCppAdapter() {}
21
-
22
- void install(jsi::Runtime &runtime,
23
- std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker) {
24
- auto workerQueue = std::make_shared<margelo::DispatchQueue::dispatch_queue>(
25
- "margelo crypto worker thread");
26
- auto hostObject = std::make_shared<margelo::MGLQuickCryptoHostObject>(
27
- jsCallInvoker, workerQueue);
28
- auto object = jsi::Object::createFromHostObject(runtime, hostObject);
29
- runtime.global().setProperty(runtime, "__QuickCryptoProxy",
30
- std::move(object));
31
- }
32
-
33
- void nativeInstall(
34
- jlong jsiPtr,
35
- jni::alias_ref<facebook::react::CallInvokerHolder::javaobject>
36
- jsCallInvokerHolder) {
37
- auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
38
- auto runtime = reinterpret_cast<jsi::Runtime *>(jsiPtr);
39
- if (runtime) {
40
- install(*runtime, jsCallInvoker);
41
- }
42
- // if runtime was nullptr, QuickCrypto will not be installed. This should
43
- // only happen while Remote Debugging (Chrome), but will be weird either
44
- // way.
45
- }
46
-
47
- static void registerNatives() {
48
- registerHybrid(
49
- {makeNativeMethod("initHybrid", CryptoCppAdapter::initHybrid),
50
- makeNativeMethod("nativeInstall", CryptoCppAdapter::nativeInstall)});
51
- }
52
-
53
- private:
54
- friend HybridBase;
55
- };
56
-
57
- JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
58
- return facebook::jni::initialize(vm,
59
- [] { CryptoCppAdapter::registerNatives(); });
14
+ return JNI_VERSION_1_2;
60
15
  }
@@ -0,0 +1,38 @@
1
+ package com.margelo.nitro.quickcrypto;
2
+
3
+ import android.util.Log;
4
+ import androidx.annotation.Nullable;
5
+
6
+ import com.facebook.react.bridge.NativeModule;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.module.model.ReactModuleInfoProvider;
9
+ import com.facebook.react.TurboReactPackage;
10
+
11
+ import java.util.HashMap;
12
+
13
+ public class QuickCryptoPackage extends TurboReactPackage {
14
+ private static final String TAG = "QuickCrypto";
15
+ static {
16
+ try {
17
+ Log.i(TAG, "Loading C++ library...");
18
+ System.loadLibrary(TAG);
19
+ Log.i(TAG, "Successfully loaded C++ library!");
20
+ } catch (Throwable e) {
21
+ Log.e(TAG, "Failed to load C++ library! Is it properly installed and linked?", e);
22
+ throw e;
23
+ }
24
+ }
25
+
26
+ @Nullable
27
+ @Override
28
+ public NativeModule getModule(String name, ReactApplicationContext reactContext) {
29
+ return null;
30
+ }
31
+
32
+ @Override
33
+ public ReactModuleInfoProvider getReactModuleInfoProvider() {
34
+ return () -> {
35
+ return new HashMap<>();
36
+ };
37
+ }
38
+ }
@@ -0,0 +1,34 @@
1
+ #include "HybridRandom.hpp"
2
+
3
+ #include <openssl/err.h>
4
+ #include <openssl/rand.h>
5
+
6
+ namespace margelo::crypto {
7
+
8
+ using namespace margelo::nitro;
9
+ using namespace margelo::nitro::crypto;
10
+
11
+ std::future<std::shared_ptr<ArrayBuffer>> HybridRandom::randomFill(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset,
12
+ double dSize) {
13
+ size_t size = checkSize(dSize);
14
+ // copy the JSArrayBuffer that we do not own into a NativeArrayBuffer that we do own, before passing to sync function
15
+ uint8_t* data = new uint8_t[size];
16
+ memcpy(data, buffer.get()->data(), size);
17
+ std::shared_ptr<ArrayBuffer> nativeBuffer = std::make_shared<NativeArrayBuffer>(data, size, false);
18
+
19
+ return std::async(std::launch::async,
20
+ [this, nativeBuffer, dOffset, dSize]() { return this->randomFillSync(nativeBuffer, dOffset, dSize); });
21
+ };
22
+
23
+ std::shared_ptr<ArrayBuffer> HybridRandom::randomFillSync(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset, double dSize) {
24
+ size_t size = checkSize(dSize);
25
+ size_t offset = checkOffset(dSize, dOffset);
26
+ uint8_t* data = buffer.get()->data();
27
+
28
+ if (RAND_bytes(data + offset, (int)size) != 1) {
29
+ throw std::runtime_error("error calling RAND_bytes" + std::to_string(ERR_get_error()));
30
+ }
31
+ return std::make_shared<NativeArrayBuffer>(data, size, false);
32
+ };
33
+
34
+ } // namespace margelo::crypto
@@ -0,0 +1,44 @@
1
+ #include <NitroModules/ArrayBuffer.hpp>
2
+ #include <cmath>
3
+ #include <future>
4
+
5
+ #include "HybridRandomSpec.hpp"
6
+
7
+ #ifdef ANDROID
8
+ #include "utils/Utils.hpp"
9
+ #else
10
+ #include "Utils.hpp"
11
+ #endif
12
+
13
+ namespace margelo::crypto {
14
+
15
+ using namespace margelo::nitro;
16
+ using namespace margelo::nitro::crypto;
17
+
18
+ class HybridRandom : public HybridRandomSpec {
19
+ public:
20
+ std::future<std::shared_ptr<ArrayBuffer>> randomFill(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset, double dSize) override;
21
+ std::shared_ptr<ArrayBuffer> randomFillSync(const std::shared_ptr<ArrayBuffer>& buffer, double dOffset, double dSize) override;
22
+ };
23
+
24
+ inline size_t checkSize(double size) {
25
+ if (!CheckIsUint32(size)) {
26
+ throw std::runtime_error("size must be uint32");
27
+ }
28
+ if (static_cast<uint32_t>(size) > pow(2, 31) - 1) {
29
+ throw std::runtime_error("size must be less than 2^31 - 1");
30
+ }
31
+ return static_cast<size_t>(size);
32
+ }
33
+
34
+ inline size_t checkOffset(double size, double offset) {
35
+ if (!CheckIsUint32(offset)) {
36
+ throw std::runtime_error("offset must be uint32");
37
+ }
38
+ if (offset > size) {
39
+ throw std::runtime_error("offset must be less than size");
40
+ }
41
+ return static_cast<size_t>(offset);
42
+ }
43
+
44
+ } // namespace margelo::crypto
@@ -0,0 +1,9 @@
1
+ #include <limits>
2
+
3
+ inline bool CheckIsUint32(double value) {
4
+ return (value >= std::numeric_limits<uint32_t>::lowest() && value <= std::numeric_limits<uint32_t>::max());
5
+ }
6
+
7
+ inline bool CheckIsInt32(double value) {
8
+ return (value >= std::numeric_limits<int32_t>::lowest() && value <= std::numeric_limits<int32_t>::max());
9
+ }