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.
- package/QuickCrypto.podspec +9 -2
- package/README.md +13 -9
- package/android/CMakeLists.txt +13 -0
- package/cpp/argon2/HybridArgon2.cpp +103 -0
- package/cpp/argon2/HybridArgon2.hpp +32 -0
- package/cpp/certificate/HybridCertificate.cpp +42 -0
- package/cpp/certificate/HybridCertificate.hpp +16 -0
- package/cpp/cipher/HybridCipher.cpp +58 -0
- package/cpp/cipher/HybridCipher.hpp +4 -0
- package/cpp/cipher/HybridCipherFactory.hpp +15 -1
- package/cpp/cipher/OCBCipher.cpp +4 -4
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +161 -0
- package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +43 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +145 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +42 -0
- package/cpp/dh/HybridDhKeyPair.cpp +179 -0
- package/cpp/dh/HybridDhKeyPair.hpp +37 -0
- package/cpp/dh/HybridDiffieHellman.cpp +10 -0
- package/cpp/dh/HybridDiffieHellman.hpp +1 -0
- package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
- package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
- package/cpp/ec/HybridEcKeyPair.cpp +21 -0
- package/cpp/ec/HybridEcKeyPair.hpp +1 -0
- package/cpp/ecdh/HybridECDH.cpp +35 -0
- package/cpp/ecdh/HybridECDH.hpp +1 -0
- package/cpp/hash/HybridHash.cpp +1 -1
- package/cpp/hash/HybridHash.hpp +1 -1
- package/cpp/hmac/HybridHmac.cpp +1 -1
- package/cpp/hmac/HybridHmac.hpp +1 -1
- package/cpp/keys/HybridKeyObjectHandle.cpp +131 -1
- package/cpp/keys/HybridKeyObjectHandle.hpp +5 -1
- package/cpp/prime/HybridPrime.cpp +81 -0
- package/cpp/prime/HybridPrime.hpp +20 -0
- package/deps/ncrypto/.bazelrc +0 -1
- package/deps/ncrypto/.bazelversion +1 -1
- package/deps/ncrypto/.github/workflows/commitlint.yml +16 -0
- package/deps/ncrypto/.github/workflows/linter.yml +2 -2
- package/deps/ncrypto/.github/workflows/release-please.yml +16 -0
- package/deps/ncrypto/.github/workflows/ubuntu.yml +82 -0
- package/deps/ncrypto/.release-please-manifest.json +3 -0
- package/deps/ncrypto/BUILD.bazel +9 -1
- package/deps/ncrypto/CHANGELOG.md +37 -0
- package/deps/ncrypto/CMakeLists.txt +35 -11
- package/deps/ncrypto/MODULE.bazel +16 -1
- package/deps/ncrypto/MODULE.bazel.lock +299 -118
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +1 -0
- package/deps/ncrypto/include/ncrypto/aead.h +137 -0
- package/deps/ncrypto/include/ncrypto/version.h +14 -0
- package/deps/ncrypto/include/ncrypto.h +85 -230
- package/deps/ncrypto/ncrypto.pc.in +10 -0
- package/deps/ncrypto/release-please-config.json +11 -0
- package/deps/ncrypto/src/CMakeLists.txt +31 -6
- package/deps/ncrypto/src/aead.cpp +302 -0
- package/deps/ncrypto/src/ncrypto.cpp +274 -556
- package/deps/ncrypto/tests/BUILD.bazel +2 -0
- package/deps/ncrypto/tests/basic.cpp +772 -2
- package/deps/ncrypto/tools/run-clang-format.sh +5 -5
- package/lib/commonjs/argon2.js +39 -0
- package/lib/commonjs/argon2.js.map +1 -0
- package/lib/commonjs/certificate.js +35 -0
- package/lib/commonjs/certificate.js.map +1 -0
- package/lib/commonjs/cipher.js +8 -0
- package/lib/commonjs/cipher.js.map +1 -1
- package/lib/commonjs/dhKeyPair.js +109 -0
- package/lib/commonjs/dhKeyPair.js.map +1 -0
- package/lib/commonjs/diffie-hellman.js +4 -1
- package/lib/commonjs/diffie-hellman.js.map +1 -1
- package/lib/commonjs/dsa.js +92 -0
- package/lib/commonjs/dsa.js.map +1 -0
- package/lib/commonjs/ec.js +20 -25
- package/lib/commonjs/ec.js.map +1 -1
- package/lib/commonjs/ecdh.js +37 -0
- package/lib/commonjs/ecdh.js.map +1 -1
- package/lib/commonjs/ed.js +1 -2
- package/lib/commonjs/ed.js.map +1 -1
- package/lib/commonjs/hash.js +7 -0
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/index.js +46 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +18 -12
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/keys/generateKeyPair.js +11 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
- package/lib/commonjs/prime.js +84 -0
- package/lib/commonjs/prime.js.map +1 -0
- package/lib/commonjs/specs/argon2.nitro.js +6 -0
- package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
- package/lib/commonjs/specs/certificate.nitro.js +6 -0
- package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/prime.nitro.js +6 -0
- package/lib/commonjs/specs/prime.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +181 -39
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/module/argon2.js +34 -0
- package/lib/module/argon2.js.map +1 -0
- package/lib/module/certificate.js +30 -0
- package/lib/module/certificate.js.map +1 -0
- package/lib/module/cipher.js +7 -0
- package/lib/module/cipher.js.map +1 -1
- package/lib/module/dhKeyPair.js +102 -0
- package/lib/module/dhKeyPair.js.map +1 -0
- package/lib/module/diffie-hellman.js +4 -0
- package/lib/module/diffie-hellman.js.map +1 -1
- package/lib/module/dsa.js +85 -0
- package/lib/module/dsa.js.map +1 -0
- package/lib/module/ec.js +19 -25
- package/lib/module/ec.js.map +1 -1
- package/lib/module/ecdh.js +37 -0
- package/lib/module/ecdh.js.map +1 -1
- package/lib/module/ed.js +1 -2
- package/lib/module/ed.js.map +1 -1
- package/lib/module/hash.js +6 -0
- package/lib/module/hash.js.map +1 -1
- package/lib/module/index.js +12 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +18 -12
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/keys/generateKeyPair.js +11 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -1
- package/lib/module/prime.js +77 -0
- package/lib/module/prime.js.map +1 -0
- package/lib/module/specs/argon2.nitro.js +4 -0
- package/lib/module/specs/argon2.nitro.js.map +1 -0
- package/lib/module/specs/certificate.nitro.js +4 -0
- package/lib/module/specs/certificate.nitro.js.map +1 -0
- package/lib/module/specs/dhKeyPair.nitro.js +4 -0
- package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/prime.nitro.js +4 -0
- package/lib/module/specs/prime.nitro.js.map +1 -0
- package/lib/module/subtle.js +183 -42
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/types.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/argon2.d.ts +16 -0
- package/lib/typescript/argon2.d.ts.map +1 -0
- package/lib/typescript/certificate.d.ts +8 -0
- package/lib/typescript/certificate.d.ts.map +1 -0
- package/lib/typescript/cipher.d.ts +12 -0
- package/lib/typescript/cipher.d.ts.map +1 -1
- package/lib/typescript/dhKeyPair.d.ts +19 -0
- package/lib/typescript/dhKeyPair.d.ts.map +1 -0
- package/lib/typescript/diffie-hellman.d.ts +2 -0
- package/lib/typescript/diffie-hellman.d.ts.map +1 -1
- package/lib/typescript/dsa.d.ts +19 -0
- package/lib/typescript/dsa.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +1 -0
- package/lib/typescript/ec.d.ts.map +1 -1
- package/lib/typescript/ecdh.d.ts +3 -0
- package/lib/typescript/ecdh.d.ts.map +1 -1
- package/lib/typescript/ed.d.ts.map +1 -1
- package/lib/typescript/hash.d.ts +2 -0
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +22 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +4 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
- package/lib/typescript/prime.d.ts +19 -0
- package/lib/typescript/prime.d.ts.map +1 -0
- package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
- package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
- package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/cipher.nitro.d.ts +9 -0
- package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts +1 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
- package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/ecdh.nitro.d.ts +1 -0
- package/lib/typescript/specs/ecdh.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +2 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/prime.nitro.d.ts +11 -0
- package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts +2 -0
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +24 -7
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +13 -5
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +104 -54
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +1 -1
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +2 -2
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +1 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +104 -54
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +5 -1
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +34 -19
- package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +1 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +5 -3
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +2 -1
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +2 -4
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +3 -4
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +3 -1
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -4
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +2 -3
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +1 -3
- package/nitrogen/generated/shared/c++/JWK.hpp +84 -68
- package/nitrogen/generated/shared/c++/JWKkty.hpp +5 -1
- package/nitrogen/generated/shared/c++/JWKuse.hpp +1 -1
- package/nitrogen/generated/shared/c++/KFormatType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +39 -23
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyObject.hpp +21 -5
- package/nitrogen/generated/shared/c++/KeyType.hpp +1 -1
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +1 -1
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +1 -1
- package/package.json +1 -1
- package/src/argon2.ts +83 -0
- package/src/certificate.ts +41 -0
- package/src/cipher.ts +24 -0
- package/src/dhKeyPair.ts +156 -0
- package/src/diffie-hellman.ts +6 -0
- package/src/dsa.ts +129 -0
- package/src/ec.ts +23 -19
- package/src/ecdh.ts +59 -0
- package/src/ed.ts +1 -2
- package/src/hash.ts +11 -0
- package/src/index.ts +12 -0
- package/src/keys/classes.ts +26 -8
- package/src/keys/generateKeyPair.ts +14 -0
- package/src/prime.ts +134 -0
- package/src/specs/argon2.nitro.ts +29 -0
- package/src/specs/certificate.nitro.ts +8 -0
- package/src/specs/cipher.nitro.ts +14 -0
- package/src/specs/dhKeyPair.nitro.ts +14 -0
- package/src/specs/diffie-hellman.nitro.ts +1 -0
- package/src/specs/dsaKeyPair.nitro.ts +13 -0
- package/src/specs/ecKeyPair.nitro.ts +2 -0
- package/src/specs/ecdh.nitro.ts +1 -0
- package/src/specs/keyObjectHandle.nitro.ts +2 -0
- package/src/specs/prime.nitro.ts +18 -0
- package/src/subtle.ts +400 -42
- package/src/utils/types.ts +39 -5
- package/deps/ncrypto/WORKSPACE +0 -15
package/QuickCrypto.podspec
CHANGED
|
@@ -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
|
|
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
|
-
- 🏎️
|
|
23
|
-
- ⚡️ Lightning fast implementation with pure C++ and JSI
|
|
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
|
|
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="#"
|
|
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
|
package/android/CMakeLists.txt
CHANGED
|
@@ -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);
|
package/cpp/cipher/OCBCipher.cpp
CHANGED
|
@@ -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
|
|
17
|
-
if (auth_tag_len <
|
|
18
|
-
throw std::runtime_error("OCB tag length must be between
|
|
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 <
|
|
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
|