react-native-quick-crypto 1.0.0-beta.2 → 1.0.0-beta.21
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 +143 -7
- package/README.md +12 -6
- package/android/CMakeLists.txt +82 -21
- package/android/build.gradle +47 -4
- package/android/src/main/cpp/cpp-adapter.cpp +3 -10
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +13 -10
- package/app.plugin.js +3 -0
- package/cpp/blake3/HybridBlake3.cpp +118 -0
- package/cpp/blake3/HybridBlake3.hpp +35 -0
- package/cpp/cipher/CCMCipher.cpp +199 -0
- package/cpp/cipher/CCMCipher.hpp +26 -0
- package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
- package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
- package/cpp/cipher/HybridCipher.cpp +322 -0
- package/cpp/cipher/HybridCipher.hpp +68 -0
- package/cpp/cipher/HybridCipherFactory.hpp +97 -0
- package/cpp/cipher/OCBCipher.cpp +55 -0
- package/cpp/cipher/OCBCipher.hpp +19 -0
- package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
- package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
- package/cpp/ec/HybridEcKeyPair.cpp +428 -0
- package/cpp/ec/HybridEcKeyPair.hpp +48 -0
- package/cpp/ed25519/HybridEdKeyPair.cpp +300 -0
- package/cpp/ed25519/HybridEdKeyPair.hpp +63 -0
- package/cpp/hash/HybridHash.cpp +185 -0
- package/cpp/hash/HybridHash.hpp +43 -0
- package/cpp/hmac/HybridHmac.cpp +95 -0
- package/cpp/hmac/HybridHmac.hpp +31 -0
- package/cpp/keys/HybridKeyObjectHandle.cpp +243 -0
- package/cpp/keys/HybridKeyObjectHandle.hpp +42 -0
- package/cpp/keys/KeyObjectData.cpp +226 -0
- package/cpp/keys/KeyObjectData.hpp +71 -0
- package/cpp/keys/node.h +5 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +51 -0
- package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
- package/cpp/random/HybridRandom.cpp +32 -18
- package/cpp/random/HybridRandom.hpp +18 -30
- package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
- package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
- package/cpp/utils/Macros.hpp +68 -0
- package/cpp/utils/Utils.hpp +53 -1
- package/deps/blake3/.cargo/config.toml +2 -0
- package/deps/blake3/.git-blame-ignore-revs +2 -0
- package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
- package/deps/blake3/.github/workflows/ci.yml +491 -0
- package/deps/blake3/.github/workflows/tag.yml +43 -0
- package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
- package/deps/blake3/CONTRIBUTING.md +31 -0
- package/deps/blake3/Cargo.toml +135 -0
- package/deps/blake3/LICENSE_A2 +202 -0
- package/deps/blake3/LICENSE_A2LLVM +219 -0
- package/deps/blake3/LICENSE_CC0 +121 -0
- package/deps/blake3/README.md +229 -0
- package/deps/blake3/b3sum/Cargo.lock +513 -0
- package/deps/blake3/b3sum/Cargo.toml +26 -0
- package/deps/blake3/b3sum/README.md +72 -0
- package/deps/blake3/b3sum/src/main.rs +564 -0
- package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
- package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
- package/deps/blake3/b3sum/what_does_check_do.md +176 -0
- package/deps/blake3/benches/bench.rs +623 -0
- package/deps/blake3/build.rs +389 -0
- package/deps/blake3/c/CMakeLists.txt +383 -0
- package/deps/blake3/c/CMakePresets.json +73 -0
- package/deps/blake3/c/Makefile.testing +82 -0
- package/deps/blake3/c/README.md +403 -0
- package/deps/blake3/c/blake3-config.cmake.in +14 -0
- package/deps/blake3/c/blake3.c +650 -0
- package/deps/blake3/c/blake3.h +86 -0
- package/deps/blake3/c/blake3_avx2.c +326 -0
- package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
- package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
- package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
- package/deps/blake3/c/blake3_avx512.c +1388 -0
- package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
- package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
- package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
- package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
- package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
- package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
- package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
- package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
- package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
- package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
- package/deps/blake3/c/blake3_dispatch.c +332 -0
- package/deps/blake3/c/blake3_impl.h +333 -0
- package/deps/blake3/c/blake3_neon.c +366 -0
- package/deps/blake3/c/blake3_portable.c +160 -0
- package/deps/blake3/c/blake3_sse2.c +566 -0
- package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
- package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
- package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
- package/deps/blake3/c/blake3_sse41.c +560 -0
- package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
- package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
- package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
- package/deps/blake3/c/blake3_tbb.cpp +37 -0
- package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
- package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
- package/deps/blake3/c/example.c +36 -0
- package/deps/blake3/c/example_tbb.c +57 -0
- package/deps/blake3/c/libblake3.pc.in +12 -0
- package/deps/blake3/c/main.c +166 -0
- package/deps/blake3/c/test.py +97 -0
- package/deps/blake3/media/B3.svg +70 -0
- package/deps/blake3/media/BLAKE3.svg +85 -0
- package/deps/blake3/media/speed.svg +1474 -0
- package/deps/blake3/reference_impl/Cargo.toml +8 -0
- package/deps/blake3/reference_impl/README.md +14 -0
- package/deps/blake3/reference_impl/reference_impl.rs +374 -0
- package/deps/blake3/src/ffi_avx2.rs +65 -0
- package/deps/blake3/src/ffi_avx512.rs +169 -0
- package/deps/blake3/src/ffi_neon.rs +82 -0
- package/deps/blake3/src/ffi_sse2.rs +126 -0
- package/deps/blake3/src/ffi_sse41.rs +126 -0
- package/deps/blake3/src/guts.rs +60 -0
- package/deps/blake3/src/hazmat.rs +704 -0
- package/deps/blake3/src/io.rs +64 -0
- package/deps/blake3/src/join.rs +92 -0
- package/deps/blake3/src/lib.rs +1835 -0
- package/deps/blake3/src/platform.rs +587 -0
- package/deps/blake3/src/portable.rs +198 -0
- package/deps/blake3/src/rust_avx2.rs +474 -0
- package/deps/blake3/src/rust_sse2.rs +775 -0
- package/deps/blake3/src/rust_sse41.rs +766 -0
- package/deps/blake3/src/test.rs +1049 -0
- package/deps/blake3/src/traits.rs +227 -0
- package/deps/blake3/src/wasm32_simd.rs +794 -0
- package/deps/blake3/test_vectors/Cargo.toml +19 -0
- package/deps/blake3/test_vectors/cross_test.sh +25 -0
- package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
- package/deps/blake3/test_vectors/src/lib.rs +350 -0
- package/deps/blake3/test_vectors/test_vectors.json +217 -0
- package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
- package/deps/blake3/tools/compiler_version/build.rs +6 -0
- package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
- package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
- package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
- package/deps/blake3/tools/release.md +16 -0
- package/deps/fastpbkdf2/fastpbkdf2.c +356 -0
- package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
- package/deps/ncrypto/ncrypto.cc +4679 -0
- package/deps/ncrypto/ncrypto.h +1625 -0
- package/lib/commonjs/blake3.js +98 -0
- package/lib/commonjs/blake3.js.map +1 -0
- package/lib/commonjs/cipher.js +180 -0
- package/lib/commonjs/cipher.js.map +1 -0
- package/lib/commonjs/ec.js +344 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/ed.js +185 -0
- package/lib/commonjs/ed.js.map +1 -0
- package/lib/commonjs/expo-plugin/@types.js +2 -0
- package/lib/commonjs/expo-plugin/@types.js.map +1 -0
- package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
- package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
- package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
- package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
- package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
- package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/commonjs/expo-plugin/withXCode.js +51 -0
- package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
- package/lib/commonjs/hash.js +215 -0
- package/lib/commonjs/hash.js.map +1 -0
- package/lib/commonjs/hmac.js +109 -0
- package/lib/commonjs/hmac.js.map +1 -0
- package/lib/commonjs/index.js +152 -32
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +250 -0
- package/lib/commonjs/keys/classes.js.map +1 -0
- package/lib/commonjs/keys/generateKeyPair.js +102 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
- package/lib/commonjs/keys/index.js +89 -0
- package/lib/commonjs/keys/index.js.map +1 -0
- package/lib/commonjs/keys/signVerify.js +41 -0
- package/lib/commonjs/keys/signVerify.js.map +1 -0
- package/lib/commonjs/keys/utils.js +123 -0
- package/lib/commonjs/keys/utils.js.map +1 -0
- package/lib/commonjs/pbkdf2.js +89 -0
- package/lib/commonjs/pbkdf2.js.map +1 -0
- package/lib/commonjs/random.js +9 -3
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +129 -0
- package/lib/commonjs/rsa.js.map +1 -0
- package/lib/commonjs/specs/blake3.nitro.js +6 -0
- package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
- package/lib/commonjs/specs/cipher.nitro.js +6 -0
- package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/edKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/edKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/hash.nitro.js +6 -0
- package/lib/commonjs/specs/hash.nitro.js.map +1 -0
- package/lib/commonjs/specs/hmac.nitro.js +6 -0
- package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
- package/lib/commonjs/specs/keyObjectHandle.nitro.js +6 -0
- package/lib/commonjs/specs/keyObjectHandle.nitro.js.map +1 -0
- package/lib/commonjs/specs/pbkdf2.nitro.js +6 -0
- package/lib/commonjs/specs/pbkdf2.nitro.js.map +1 -0
- package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +365 -0
- package/lib/commonjs/subtle.js.map +1 -0
- package/lib/commonjs/utils/cipher.js +64 -0
- package/lib/commonjs/utils/cipher.js.map +1 -0
- package/lib/commonjs/utils/conversion.js +140 -6
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/errors.js +14 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/hashnames.js +91 -0
- package/lib/commonjs/utils/hashnames.js.map +1 -0
- package/lib/commonjs/utils/index.js +65 -5
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/noble.js +82 -0
- package/lib/commonjs/utils/noble.js.map +1 -0
- package/lib/commonjs/utils/types.js +52 -0
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +98 -0
- package/lib/commonjs/utils/validation.js.map +1 -0
- package/lib/module/blake3.js +90 -0
- package/lib/module/blake3.js.map +1 -0
- package/lib/module/cipher.js +173 -0
- package/lib/module/cipher.js.map +1 -0
- package/lib/module/ec.js +336 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/ed.js +178 -0
- package/lib/module/ed.js.map +1 -0
- package/lib/module/expo-plugin/@types.js +2 -0
- package/lib/module/expo-plugin/@types.js.map +1 -0
- package/lib/module/expo-plugin/withRNQC.js +21 -0
- package/lib/module/expo-plugin/withRNQC.js.map +1 -0
- package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
- package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
- package/lib/module/expo-plugin/withSodiumIos.js +20 -0
- package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/module/expo-plugin/withXCode.js +46 -0
- package/lib/module/expo-plugin/withXCode.js.map +1 -0
- package/lib/module/hash.js +207 -0
- package/lib/module/hash.js.map +1 -0
- package/lib/module/hmac.js +104 -0
- package/lib/module/hmac.js.map +1 -0
- package/lib/module/index.js +33 -29
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +241 -0
- package/lib/module/keys/classes.js.map +1 -0
- package/lib/module/keys/generateKeyPair.js +96 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -0
- package/lib/module/keys/index.js +32 -0
- package/lib/module/keys/index.js.map +1 -0
- package/lib/module/keys/signVerify.js +41 -0
- package/lib/module/keys/signVerify.js.map +1 -0
- package/lib/module/keys/utils.js +114 -0
- package/lib/module/keys/utils.js.map +1 -0
- package/lib/module/pbkdf2.js +83 -0
- package/lib/module/pbkdf2.js.map +1 -0
- package/lib/module/random.js +7 -1
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +123 -0
- package/lib/module/rsa.js.map +1 -0
- package/lib/module/specs/blake3.nitro.js +4 -0
- package/lib/module/specs/blake3.nitro.js.map +1 -0
- package/lib/module/specs/cipher.nitro.js +4 -0
- package/lib/module/specs/cipher.nitro.js.map +1 -0
- package/lib/module/specs/ecKeyPair.nitro.js +4 -0
- package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/edKeyPair.nitro.js +4 -0
- package/lib/module/specs/edKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/hash.nitro.js +4 -0
- package/lib/module/specs/hash.nitro.js.map +1 -0
- package/lib/module/specs/hmac.nitro.js +4 -0
- package/lib/module/specs/hmac.nitro.js.map +1 -0
- package/lib/module/specs/keyObjectHandle.nitro.js +4 -0
- package/lib/module/specs/keyObjectHandle.nitro.js.map +1 -0
- package/lib/module/specs/pbkdf2.nitro.js +4 -0
- package/lib/module/specs/pbkdf2.nitro.js.map +1 -0
- package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
- package/lib/module/subtle.js +360 -0
- package/lib/module/subtle.js.map +1 -0
- package/lib/module/utils/cipher.js +56 -0
- package/lib/module/utils/cipher.js.map +1 -0
- package/lib/module/utils/conversion.js +120 -8
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/errors.js +10 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/hashnames.js +89 -0
- package/lib/module/utils/hashnames.js.map +1 -0
- package/lib/module/utils/index.js +6 -5
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/noble.js +76 -0
- package/lib/module/utils/noble.js.map +1 -0
- package/lib/module/utils/types.js +53 -0
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +87 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/typescript/blake3.d.ts +33 -0
- package/lib/typescript/blake3.d.ts.map +1 -0
- package/lib/typescript/cipher.d.ts +60 -0
- package/lib/typescript/cipher.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +13 -0
- package/lib/typescript/ec.d.ts.map +1 -0
- package/lib/typescript/ed.d.ts +43 -0
- package/lib/typescript/ed.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/@types.d.ts +8 -0
- package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
- package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
- package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
- package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
- package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
- package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
- package/lib/typescript/hash.d.ts +122 -0
- package/lib/typescript/hash.d.ts.map +1 -0
- package/lib/typescript/hmac.d.ts +66 -0
- package/lib/typescript/hmac.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +110 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +79 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -0
- package/lib/typescript/keys/generateKeyPair.d.ts +6 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
- package/lib/typescript/keys/index.d.ts +7 -0
- package/lib/typescript/keys/index.d.ts.map +1 -0
- package/lib/typescript/keys/signVerify.d.ts +1 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -0
- package/lib/typescript/keys/utils.d.ts +34 -0
- package/lib/typescript/keys/utils.d.ts.map +1 -0
- package/lib/typescript/pbkdf2.d.ts +12 -0
- package/lib/typescript/pbkdf2.d.ts.map +1 -0
- package/lib/typescript/random.d.ts +11 -5
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts +10 -0
- package/lib/typescript/rsa.d.ts.map +1 -0
- package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
- package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
- package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts +17 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/hash.nitro.d.ts +13 -0
- package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
- package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +14 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/pbkdf2.nitro.d.ts +9 -0
- package/lib/typescript/specs/pbkdf2.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
- package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts +17 -0
- package/lib/typescript/subtle.d.ts.map +1 -0
- package/lib/typescript/utils/cipher.d.ts +7 -0
- package/lib/typescript/utils/cipher.d.ts.map +1 -0
- package/lib/typescript/utils/conversion.d.ts +24 -2
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/errors.d.ts +7 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -0
- package/lib/typescript/utils/hashnames.d.ts +13 -0
- package/lib/typescript/utils/hashnames.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +6 -5
- package/lib/typescript/utils/index.d.ts.map +1 -1
- package/lib/typescript/utils/noble.d.ts +19 -0
- package/lib/typescript/utils/noble.d.ts.map +1 -0
- package/lib/typescript/utils/types.d.ts +252 -2
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +13 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +47 -4
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +4 -3
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +144 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +25 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +11 -8
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +11 -3
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +5 -3
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +16 -7
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +135 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +12 -0
- package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +84 -0
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +30 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +75 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
- package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +92 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +2 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +9 -6
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/JWK.hpp +161 -0
- package/nitrogen/generated/shared/c++/JWKkty.hpp +84 -0
- package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
- package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +92 -0
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
- package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
- package/nitrogen/generated/shared/c++/KeyType.hpp +63 -0
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +116 -0
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +80 -0
- package/package.json +66 -39
- package/src/blake3.ts +123 -0
- package/src/cipher.ts +335 -0
- package/src/ec.ts +432 -0
- package/src/ed.ts +256 -0
- package/src/expo-plugin/@types.ts +7 -0
- package/src/expo-plugin/withRNQC.ts +23 -0
- package/src/expo-plugin/withSodiumAndroid.ts +24 -0
- package/src/expo-plugin/withSodiumIos.ts +30 -0
- package/src/expo-plugin/withXCode.ts +55 -0
- package/src/hash.ts +274 -0
- package/src/hmac.ts +135 -0
- package/src/index.ts +32 -29
- package/src/keys/classes.ts +317 -0
- package/src/keys/generateKeyPair.ts +145 -0
- package/src/keys/index.ts +52 -0
- package/src/keys/signVerify.ts +39 -0
- package/src/keys/utils.ts +190 -0
- package/src/pbkdf2.ts +154 -0
- package/src/random.ts +26 -23
- package/src/rsa.ts +176 -0
- package/src/specs/blake3.nitro.ts +12 -0
- package/src/specs/cipher.nitro.ts +25 -0
- package/src/specs/ecKeyPair.nitro.ts +38 -0
- package/src/specs/edKeyPair.nitro.ts +43 -0
- package/src/specs/hash.nitro.ts +10 -0
- package/src/specs/hmac.nitro.ts +7 -0
- package/src/specs/keyObjectHandle.nitro.ts +31 -0
- package/src/specs/pbkdf2.nitro.ts +18 -0
- package/src/specs/random.nitro.ts +2 -2
- package/src/specs/rsaKeyPair.nitro.ts +33 -0
- package/src/subtle.ts +614 -0
- package/src/utils/cipher.ts +60 -0
- package/src/utils/conversion.ts +143 -9
- package/src/utils/errors.ts +15 -0
- package/src/utils/hashnames.ts +98 -0
- package/src/utils/index.ts +6 -6
- package/src/utils/noble.ts +85 -0
- package/src/utils/types.ts +423 -3
- package/src/utils/validation.ts +130 -0
- package/ios/QuickCryptoOnLoad.mm +0 -19
- package/lib/module/package.json +0 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/evp.h>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
#include "HybridEdKeyPair.hpp"
|
|
7
|
+
|
|
8
|
+
namespace margelo::nitro::crypto {
|
|
9
|
+
|
|
10
|
+
std::shared_ptr<ArrayBuffer> HybridEdKeyPair::diffieHellman(const std::shared_ptr<ArrayBuffer>& privateKey,
|
|
11
|
+
const std::shared_ptr<ArrayBuffer>& publicKey) {
|
|
12
|
+
using EVP_PKEY_ptr = std::unique_ptr<EVP_PKEY, decltype(&EVP_PKEY_free)>;
|
|
13
|
+
using EVP_PKEY_CTX_ptr = std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)>;
|
|
14
|
+
|
|
15
|
+
// 1. Create EVP_PKEY for private key (our key)
|
|
16
|
+
EVP_PKEY_ptr pkey_priv(EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, privateKey->data(), privateKey->size()), EVP_PKEY_free);
|
|
17
|
+
if (!pkey_priv) {
|
|
18
|
+
throw std::runtime_error("Failed to create private key: " + getOpenSSLError());
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 2. Create EVP_PKEY for public key (peer's key)
|
|
22
|
+
EVP_PKEY_ptr pkey_pub(EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL, publicKey->data(), publicKey->size()), EVP_PKEY_free);
|
|
23
|
+
if (!pkey_pub) {
|
|
24
|
+
throw std::runtime_error("Failed to create public key: " + getOpenSSLError());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 3. Create the context for the key exchange
|
|
28
|
+
EVP_PKEY_CTX_ptr ctx(EVP_PKEY_CTX_new_from_pkey(NULL, pkey_priv.get(), NULL), EVP_PKEY_CTX_free);
|
|
29
|
+
if (!ctx) {
|
|
30
|
+
throw std::runtime_error("Failed to create key exchange context: " + getOpenSSLError());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 4. Initialize the context
|
|
34
|
+
if (EVP_PKEY_derive_init(ctx.get()) <= 0) {
|
|
35
|
+
throw std::runtime_error("Failed to initialize key exchange: " + getOpenSSLError());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 5. Provide the peer's public key
|
|
39
|
+
if (EVP_PKEY_derive_set_peer(ctx.get(), pkey_pub.get()) <= 0) {
|
|
40
|
+
throw std::runtime_error("Failed to set peer key: " + getOpenSSLError());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 6. Determine the size of the shared secret
|
|
44
|
+
size_t shared_secret_len;
|
|
45
|
+
if (EVP_PKEY_derive(ctx.get(), NULL, &shared_secret_len) <= 0) {
|
|
46
|
+
throw std::runtime_error("Failed to determine shared secret length: " + getOpenSSLError());
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 7. Allocate memory for the shared secret
|
|
50
|
+
auto shared_secret = new uint8_t[shared_secret_len];
|
|
51
|
+
|
|
52
|
+
// 8. Derive the shared secret
|
|
53
|
+
if (EVP_PKEY_derive(ctx.get(), shared_secret, &shared_secret_len) <= 0) {
|
|
54
|
+
delete[] shared_secret;
|
|
55
|
+
throw std::runtime_error("Failed to derive shared secret: " + getOpenSSLError());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 9. Return a newly-created ArrayBuffer from the raw buffer w/ cleanup
|
|
59
|
+
return std::make_shared<NativeArrayBuffer>(shared_secret, shared_secret_len, [=]() { delete[] shared_secret; });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
std::shared_ptr<Promise<void>> HybridEdKeyPair::generateKeyPair(double publicFormat, double publicType, double privateFormat,
|
|
63
|
+
double privateType, const std::optional<std::string>& cipher,
|
|
64
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
|
|
65
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
66
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativePassphrase = std::nullopt;
|
|
67
|
+
if (passphrase.has_value()) {
|
|
68
|
+
nativePassphrase = ToNativeArrayBuffer(passphrase.value());
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return Promise<void>::async([this, publicFormat, publicType, privateFormat, privateType, cipher, nativePassphrase]() {
|
|
72
|
+
this->generateKeyPairSync(publicFormat, publicType, privateFormat, privateType, cipher, nativePassphrase);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void HybridEdKeyPair::generateKeyPairSync(double publicFormat, double publicType, double privateFormat, double privateType,
|
|
77
|
+
const std::optional<std::string>& cipher,
|
|
78
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
|
|
79
|
+
// Clear any previous OpenSSL errors to prevent pollution
|
|
80
|
+
clearOpenSSLErrors();
|
|
81
|
+
|
|
82
|
+
if (this->curve.empty()) {
|
|
83
|
+
throw std::runtime_error("EC curve not set. Call setCurve() first.");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Clean up existing key if any
|
|
87
|
+
if (this->pkey != nullptr) {
|
|
88
|
+
EVP_PKEY_free(this->pkey);
|
|
89
|
+
this->pkey = nullptr;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
EVP_PKEY_CTX* pctx;
|
|
93
|
+
|
|
94
|
+
// key context
|
|
95
|
+
pctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
96
|
+
if (pctx == nullptr) {
|
|
97
|
+
throw std::runtime_error("Invalid curve name: " + this->curve);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// keygen init
|
|
101
|
+
if (EVP_PKEY_keygen_init(pctx) <= 0) {
|
|
102
|
+
EVP_PKEY_CTX_free(pctx);
|
|
103
|
+
throw std::runtime_error("Failed to initialize keygen");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// generate key
|
|
107
|
+
EVP_PKEY_keygen(pctx, &this->pkey);
|
|
108
|
+
if (this->pkey == nullptr) {
|
|
109
|
+
EVP_PKEY_CTX_free(pctx);
|
|
110
|
+
throw std::runtime_error("Failed to generate key");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// cleanup
|
|
114
|
+
EVP_PKEY_CTX_free(pctx);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> HybridEdKeyPair::sign(const std::shared_ptr<ArrayBuffer>& message,
|
|
118
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
119
|
+
// get owned NativeArrayBuffer before passing to sync function
|
|
120
|
+
auto nativeMessage = ToNativeArrayBuffer(message);
|
|
121
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativeKey = std::nullopt;
|
|
122
|
+
if (key.has_value()) {
|
|
123
|
+
nativeKey = ToNativeArrayBuffer(key.value());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return Promise<std::shared_ptr<ArrayBuffer>>::async(
|
|
127
|
+
[this, nativeMessage, nativeKey]() { return this->signSync(nativeMessage, nativeKey); });
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
std::shared_ptr<ArrayBuffer> HybridEdKeyPair::signSync(const std::shared_ptr<ArrayBuffer>& message,
|
|
131
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
132
|
+
// Clear any previous OpenSSL errors to prevent pollution
|
|
133
|
+
clearOpenSSLErrors();
|
|
134
|
+
|
|
135
|
+
size_t sig_len = 0;
|
|
136
|
+
uint8_t* sig = NULL;
|
|
137
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
138
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
139
|
+
|
|
140
|
+
// get key to use for signing
|
|
141
|
+
EVP_PKEY* pkey = this->importPrivateKey(key);
|
|
142
|
+
|
|
143
|
+
// key context
|
|
144
|
+
md_ctx = EVP_MD_CTX_new();
|
|
145
|
+
if (md_ctx == nullptr) {
|
|
146
|
+
throw std::runtime_error("Error creating signing context");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
150
|
+
if (pkey_ctx == nullptr) {
|
|
151
|
+
EVP_MD_CTX_free(md_ctx);
|
|
152
|
+
throw std::runtime_error("Error creating signing context: " + this->curve);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (EVP_DigestSignInit(md_ctx, &pkey_ctx, NULL, NULL, pkey) <= 0) {
|
|
156
|
+
EVP_MD_CTX_free(md_ctx);
|
|
157
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
158
|
+
char* err = ERR_error_string(ERR_get_error(), NULL);
|
|
159
|
+
throw std::runtime_error("Failed to initialize signing: " + std::string(err));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Calculate the required size for the signature by passing a NULL buffer.
|
|
163
|
+
if (EVP_DigestSign(md_ctx, NULL, &sig_len, message.get()->data(), message.get()->size()) <= 0) {
|
|
164
|
+
EVP_MD_CTX_free(md_ctx);
|
|
165
|
+
throw std::runtime_error("Failed to calculate signature size");
|
|
166
|
+
}
|
|
167
|
+
sig = new uint8_t[sig_len];
|
|
168
|
+
|
|
169
|
+
// Actually calculate the signature
|
|
170
|
+
if (EVP_DigestSign(md_ctx, sig, &sig_len, message.get()->data(), message.get()->size()) <= 0) {
|
|
171
|
+
EVP_MD_CTX_free(md_ctx);
|
|
172
|
+
delete[] sig;
|
|
173
|
+
throw std::runtime_error("Failed to calculate signature");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// return value for JS
|
|
177
|
+
std::shared_ptr<ArrayBuffer> signature = std::make_shared<NativeArrayBuffer>(sig, sig_len, [=]() { delete[] sig; });
|
|
178
|
+
|
|
179
|
+
// Clean up
|
|
180
|
+
EVP_MD_CTX_free(md_ctx);
|
|
181
|
+
// Note: pkey_ctx is freed automatically by EVP_MD_CTX_free when using EVP_DigestSignInit
|
|
182
|
+
|
|
183
|
+
return signature;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
std::shared_ptr<Promise<bool>> HybridEdKeyPair::verify(const std::shared_ptr<ArrayBuffer>& signature,
|
|
187
|
+
const std::shared_ptr<ArrayBuffer>& message,
|
|
188
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
189
|
+
// get owned NativeArrayBuffers before passing to sync function
|
|
190
|
+
auto nativeSignature = ToNativeArrayBuffer(signature);
|
|
191
|
+
auto nativeMessage = ToNativeArrayBuffer(message);
|
|
192
|
+
std::optional<std::shared_ptr<ArrayBuffer>> nativeKey = std::nullopt;
|
|
193
|
+
if (key.has_value()) {
|
|
194
|
+
nativeKey = ToNativeArrayBuffer(key.value());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return Promise<bool>::async(
|
|
198
|
+
[this, nativeSignature, nativeMessage, nativeKey]() { return this->verifySync(nativeSignature, nativeMessage, nativeKey); });
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
bool HybridEdKeyPair::verifySync(const std::shared_ptr<ArrayBuffer>& signature, const std::shared_ptr<ArrayBuffer>& message,
|
|
202
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
203
|
+
// Clear any previous OpenSSL errors to prevent pollution
|
|
204
|
+
clearOpenSSLErrors();
|
|
205
|
+
|
|
206
|
+
// get key to use for verifying
|
|
207
|
+
EVP_PKEY* pkey = this->importPublicKey(key);
|
|
208
|
+
|
|
209
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
210
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
211
|
+
|
|
212
|
+
// key context
|
|
213
|
+
md_ctx = EVP_MD_CTX_new();
|
|
214
|
+
if (md_ctx == nullptr) {
|
|
215
|
+
throw std::runtime_error("Error creating verify context");
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, this->curve.c_str(), nullptr);
|
|
219
|
+
if (pkey_ctx == nullptr) {
|
|
220
|
+
EVP_MD_CTX_free(md_ctx);
|
|
221
|
+
throw std::runtime_error("Error creating verify context: " + this->curve);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (EVP_DigestVerifyInit(md_ctx, &pkey_ctx, NULL, NULL, pkey) <= 0) {
|
|
225
|
+
EVP_MD_CTX_free(md_ctx);
|
|
226
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
227
|
+
char* err = ERR_error_string(ERR_get_error(), NULL);
|
|
228
|
+
throw std::runtime_error("Failed to initialize verify: " + std::string(err));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// verify
|
|
232
|
+
auto res = EVP_DigestVerify(md_ctx, signature.get()->data(), signature.get()->size(), message.get()->data(), message.get()->size());
|
|
233
|
+
|
|
234
|
+
// return value for JS
|
|
235
|
+
if (res < 0) {
|
|
236
|
+
EVP_MD_CTX_free(md_ctx);
|
|
237
|
+
throw std::runtime_error("Failed to verify");
|
|
238
|
+
}
|
|
239
|
+
return res == 1; // true if 1, false if 0
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
std::shared_ptr<ArrayBuffer> HybridEdKeyPair::getPublicKey() {
|
|
243
|
+
this->checkKeyPair();
|
|
244
|
+
size_t len = 32;
|
|
245
|
+
uint8_t* publ = new uint8_t[len];
|
|
246
|
+
EVP_PKEY_get_raw_public_key(this->pkey, publ, &len);
|
|
247
|
+
|
|
248
|
+
return std::make_shared<NativeArrayBuffer>(publ, len, [=]() { delete[] publ; });
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
std::shared_ptr<ArrayBuffer> HybridEdKeyPair::getPrivateKey() {
|
|
252
|
+
this->checkKeyPair();
|
|
253
|
+
size_t len = 32;
|
|
254
|
+
uint8_t* priv = new uint8_t[len];
|
|
255
|
+
EVP_PKEY_get_raw_private_key(this->pkey, priv, &len);
|
|
256
|
+
|
|
257
|
+
return std::make_shared<NativeArrayBuffer>(priv, len, [=]() { delete[] priv; });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
void HybridEdKeyPair::checkKeyPair() {
|
|
261
|
+
if (this->pkey == nullptr) {
|
|
262
|
+
throw std::runtime_error("Keypair not initialized");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
void HybridEdKeyPair::setCurve(const std::string& curve) {
|
|
267
|
+
this->curve = curve;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
EVP_PKEY* HybridEdKeyPair::importPublicKey(const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
271
|
+
EVP_PKEY* pkey = nullptr;
|
|
272
|
+
if (key.has_value()) {
|
|
273
|
+
pkey = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, // TODO: use this->curve somehow
|
|
274
|
+
NULL, key.value()->data(), 32);
|
|
275
|
+
if (pkey == nullptr) {
|
|
276
|
+
throw std::runtime_error("Failed to read public key");
|
|
277
|
+
}
|
|
278
|
+
} else {
|
|
279
|
+
this->checkKeyPair();
|
|
280
|
+
pkey = this->pkey;
|
|
281
|
+
}
|
|
282
|
+
return pkey;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
EVP_PKEY* HybridEdKeyPair::importPrivateKey(const std::optional<std::shared_ptr<ArrayBuffer>>& key) {
|
|
286
|
+
EVP_PKEY* pkey = nullptr;
|
|
287
|
+
if (key.has_value()) {
|
|
288
|
+
pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, // TODO: use this->curve somehow
|
|
289
|
+
NULL, key.value()->data(), 32);
|
|
290
|
+
if (pkey == nullptr) {
|
|
291
|
+
throw std::runtime_error("Failed to read private key");
|
|
292
|
+
}
|
|
293
|
+
} else {
|
|
294
|
+
this->checkKeyPair();
|
|
295
|
+
pkey = this->pkey;
|
|
296
|
+
}
|
|
297
|
+
return pkey;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#include <memory>
|
|
2
|
+
#include <openssl/err.h>
|
|
3
|
+
#include <openssl/evp.h>
|
|
4
|
+
#include <string>
|
|
5
|
+
|
|
6
|
+
#include "HybridEdKeyPairSpec.hpp"
|
|
7
|
+
#include "Utils.hpp"
|
|
8
|
+
|
|
9
|
+
namespace margelo::nitro::crypto {
|
|
10
|
+
|
|
11
|
+
class HybridEdKeyPair : public HybridEdKeyPairSpec {
|
|
12
|
+
public:
|
|
13
|
+
HybridEdKeyPair() : HybridObject(TAG) {}
|
|
14
|
+
~HybridEdKeyPair() {
|
|
15
|
+
if (pkey != nullptr) {
|
|
16
|
+
EVP_PKEY_free(pkey);
|
|
17
|
+
pkey = nullptr;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public:
|
|
22
|
+
// Methods
|
|
23
|
+
std::shared_ptr<ArrayBuffer> diffieHellman(const std::shared_ptr<ArrayBuffer>& privateKey,
|
|
24
|
+
const std::shared_ptr<ArrayBuffer>& publicKey) override;
|
|
25
|
+
|
|
26
|
+
std::shared_ptr<Promise<void>> generateKeyPair(double publicFormat, double publicType, double privateFormat, double privateType,
|
|
27
|
+
const std::optional<std::string>& cipher,
|
|
28
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) override;
|
|
29
|
+
|
|
30
|
+
void generateKeyPairSync(double publicFormat, double publicType, double privateFormat, double privateType,
|
|
31
|
+
const std::optional<std::string>& cipher,
|
|
32
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) override;
|
|
33
|
+
|
|
34
|
+
std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> sign(const std::shared_ptr<ArrayBuffer>& message,
|
|
35
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) override;
|
|
36
|
+
|
|
37
|
+
std::shared_ptr<ArrayBuffer> signSync(const std::shared_ptr<ArrayBuffer>& message,
|
|
38
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) override;
|
|
39
|
+
|
|
40
|
+
std::shared_ptr<Promise<bool>> verify(const std::shared_ptr<ArrayBuffer>& signature, const std::shared_ptr<ArrayBuffer>& message,
|
|
41
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) override;
|
|
42
|
+
|
|
43
|
+
bool verifySync(const std::shared_ptr<ArrayBuffer>& signature, const std::shared_ptr<ArrayBuffer>& message,
|
|
44
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& key) override;
|
|
45
|
+
|
|
46
|
+
protected:
|
|
47
|
+
std::shared_ptr<ArrayBuffer> getPublicKey() override;
|
|
48
|
+
|
|
49
|
+
std::shared_ptr<ArrayBuffer> getPrivateKey() override;
|
|
50
|
+
|
|
51
|
+
void checkKeyPair();
|
|
52
|
+
|
|
53
|
+
void setCurve(const std::string& curve) override;
|
|
54
|
+
|
|
55
|
+
private:
|
|
56
|
+
std::string curve;
|
|
57
|
+
EVP_PKEY* pkey = nullptr;
|
|
58
|
+
|
|
59
|
+
EVP_PKEY* importPublicKey(const std::optional<std::shared_ptr<ArrayBuffer>>& key);
|
|
60
|
+
EVP_PKEY* importPrivateKey(const std::optional<std::shared_ptr<ArrayBuffer>>& key);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <optional>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
#include "HybridHash.hpp"
|
|
10
|
+
#include "Utils.hpp"
|
|
11
|
+
|
|
12
|
+
namespace margelo::nitro::crypto {
|
|
13
|
+
|
|
14
|
+
HybridHash::~HybridHash() {
|
|
15
|
+
if (ctx) {
|
|
16
|
+
EVP_MD_CTX_free(ctx);
|
|
17
|
+
ctx = nullptr;
|
|
18
|
+
}
|
|
19
|
+
if (md && md_fetched) {
|
|
20
|
+
EVP_MD_free(md);
|
|
21
|
+
md = nullptr;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
void HybridHash::createHash(const std::string& hashAlgorithmArg, const std::optional<double> outputLengthArg) {
|
|
26
|
+
// Clear any previous OpenSSL errors to prevent pollution
|
|
27
|
+
clearOpenSSLErrors();
|
|
28
|
+
|
|
29
|
+
// Clean up existing resources before creating new ones
|
|
30
|
+
if (ctx) {
|
|
31
|
+
EVP_MD_CTX_free(ctx);
|
|
32
|
+
ctx = nullptr;
|
|
33
|
+
}
|
|
34
|
+
if (md && md_fetched) {
|
|
35
|
+
EVP_MD_free(md);
|
|
36
|
+
md = nullptr;
|
|
37
|
+
md_fetched = false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
algorithm = hashAlgorithmArg;
|
|
41
|
+
outputLength = outputLengthArg;
|
|
42
|
+
|
|
43
|
+
// Create hash context
|
|
44
|
+
ctx = EVP_MD_CTX_new();
|
|
45
|
+
if (!ctx) {
|
|
46
|
+
throw std::runtime_error("Failed to create hash context: " + std::to_string(ERR_get_error()));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Fetch the message digest using modern provider-based API
|
|
50
|
+
md = EVP_MD_fetch(nullptr, algorithm.c_str(), nullptr);
|
|
51
|
+
if (!md) {
|
|
52
|
+
EVP_MD_CTX_free(ctx);
|
|
53
|
+
ctx = nullptr;
|
|
54
|
+
throw std::runtime_error("Unknown hash algorithm: " + algorithm);
|
|
55
|
+
}
|
|
56
|
+
md_fetched = true;
|
|
57
|
+
|
|
58
|
+
// Initialize the digest
|
|
59
|
+
if (EVP_DigestInit_ex(ctx, md, nullptr) != 1) {
|
|
60
|
+
EVP_MD_CTX_free(ctx);
|
|
61
|
+
ctx = nullptr;
|
|
62
|
+
if (md_fetched) {
|
|
63
|
+
EVP_MD_free(md);
|
|
64
|
+
md = nullptr;
|
|
65
|
+
md_fetched = false;
|
|
66
|
+
}
|
|
67
|
+
throw std::runtime_error("Failed to initialize hash digest: " + std::to_string(ERR_get_error()));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void HybridHash::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
72
|
+
if (!ctx) {
|
|
73
|
+
throw std::runtime_error("Hash context not initialized");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Update the digest with the data
|
|
77
|
+
if (EVP_DigestUpdate(ctx, reinterpret_cast<const uint8_t*>(data->data()), data->size()) != 1) {
|
|
78
|
+
throw std::runtime_error("Failed to update hash digest: " + std::to_string(ERR_get_error()));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
std::shared_ptr<ArrayBuffer> HybridHash::digest(const std::optional<std::string>& encoding) {
|
|
83
|
+
if (!ctx) {
|
|
84
|
+
throw std::runtime_error("Hash context not initialized");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
setParams();
|
|
88
|
+
|
|
89
|
+
// Get the default digest size
|
|
90
|
+
const size_t defaultLen = EVP_MD_CTX_size(ctx);
|
|
91
|
+
const size_t digestSize = (outputLength.has_value()) ? static_cast<int>(*outputLength) : defaultLen;
|
|
92
|
+
|
|
93
|
+
if (digestSize < 0) {
|
|
94
|
+
throw std::runtime_error("Invalid digest size: " + std::to_string(digestSize));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Create a buffer for the hash output
|
|
98
|
+
uint8_t* hashBuffer = new uint8_t[digestSize];
|
|
99
|
+
size_t hashLength = digestSize;
|
|
100
|
+
|
|
101
|
+
// Finalize the digest
|
|
102
|
+
int ret;
|
|
103
|
+
if (digestSize == defaultLen) {
|
|
104
|
+
ret = EVP_DigestFinal_ex(ctx, hashBuffer, reinterpret_cast<unsigned int*>(&hashLength));
|
|
105
|
+
} else {
|
|
106
|
+
ret = EVP_DigestFinalXOF(ctx, hashBuffer, hashLength);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (ret != 1) {
|
|
110
|
+
delete[] hashBuffer;
|
|
111
|
+
throw std::runtime_error("Failed to finalize hash digest: " + std::to_string(ERR_get_error()));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return std::make_shared<NativeArrayBuffer>(hashBuffer, hashLength, [=]() { delete[] hashBuffer; });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
std::shared_ptr<margelo::nitro::crypto::HybridHashSpec> HybridHash::copy(const std::optional<double> outputLengthArg) {
|
|
118
|
+
if (!ctx) {
|
|
119
|
+
throw std::runtime_error("Hash context not initialized");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Create a new context
|
|
123
|
+
EVP_MD_CTX* newCtx = EVP_MD_CTX_new();
|
|
124
|
+
if (!newCtx) {
|
|
125
|
+
throw std::runtime_error("Failed to create new hash context: " + std::to_string(ERR_get_error()));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Copy the existing context to the new one
|
|
129
|
+
if (EVP_MD_CTX_copy(newCtx, ctx) != 1) {
|
|
130
|
+
EVP_MD_CTX_free(newCtx);
|
|
131
|
+
throw std::runtime_error("Failed to copy hash context: " + std::to_string(ERR_get_error()));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return std::make_shared<HybridHash>(newCtx, md, algorithm, outputLengthArg, false);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
std::vector<std::string> HybridHash::getSupportedHashAlgorithms() {
|
|
138
|
+
std::vector<std::string> hashAlgorithms;
|
|
139
|
+
|
|
140
|
+
EVP_MD_do_all_provided(
|
|
141
|
+
nullptr,
|
|
142
|
+
[](EVP_MD* md, void* arg) {
|
|
143
|
+
auto* algorithms = static_cast<std::vector<std::string>*>(arg);
|
|
144
|
+
const char* name = EVP_MD_get0_name(md);
|
|
145
|
+
if (name) {
|
|
146
|
+
algorithms->push_back(name);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
&hashAlgorithms);
|
|
150
|
+
|
|
151
|
+
return hashAlgorithms;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
void HybridHash::setParams() {
|
|
155
|
+
// Handle algorithm parameters (like XOF length for SHAKE)
|
|
156
|
+
if (outputLength.has_value()) {
|
|
157
|
+
uint32_t xoflen = outputLength.value();
|
|
158
|
+
|
|
159
|
+
// Add a reasonable maximum output length
|
|
160
|
+
const int MAX_OUTPUT_LENGTH = 16 * 1024 * 1024; // 16MB
|
|
161
|
+
if (xoflen > MAX_OUTPUT_LENGTH) {
|
|
162
|
+
throw std::runtime_error("Output length " + std::to_string(xoflen) + " exceeds maximum allowed size of " +
|
|
163
|
+
std::to_string(MAX_OUTPUT_LENGTH));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
OSSL_PARAM params[] = {OSSL_PARAM_construct_uint("xoflen", &xoflen), OSSL_PARAM_END};
|
|
167
|
+
|
|
168
|
+
if (EVP_MD_CTX_set_params(ctx, params) != 1) {
|
|
169
|
+
EVP_MD_CTX_free(ctx);
|
|
170
|
+
ctx = nullptr;
|
|
171
|
+
if (md && md_fetched) {
|
|
172
|
+
EVP_MD_free(md);
|
|
173
|
+
md = nullptr;
|
|
174
|
+
md_fetched = false;
|
|
175
|
+
}
|
|
176
|
+
throw std::runtime_error("Failed to set XOF length (outputLength) parameter: " + std::to_string(ERR_get_error()));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
std::string HybridHash::getOpenSSLVersion() {
|
|
182
|
+
return OpenSSL_version(OPENSSL_VERSION);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/evp.h>
|
|
4
|
+
#include <optional>
|
|
5
|
+
#include <string>
|
|
6
|
+
#include <vector>
|
|
7
|
+
|
|
8
|
+
#include "HybridHashSpec.hpp"
|
|
9
|
+
|
|
10
|
+
namespace margelo::nitro::crypto {
|
|
11
|
+
|
|
12
|
+
using namespace facebook;
|
|
13
|
+
|
|
14
|
+
class HybridHash : public HybridHashSpec {
|
|
15
|
+
public:
|
|
16
|
+
HybridHash() : HybridObject(TAG) {}
|
|
17
|
+
HybridHash(EVP_MD_CTX* ctx, EVP_MD* md, const std::string& algorithm, const std::optional<double> outputLength, bool md_fetched = false)
|
|
18
|
+
: HybridObject(TAG), ctx(ctx), md(md), md_fetched(md_fetched), algorithm(algorithm), outputLength(outputLength) {}
|
|
19
|
+
~HybridHash();
|
|
20
|
+
|
|
21
|
+
public:
|
|
22
|
+
// Methods
|
|
23
|
+
void createHash(const std::string& algorithm, const std::optional<double> outputLength) override;
|
|
24
|
+
void update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
25
|
+
std::shared_ptr<ArrayBuffer> digest(const std::optional<std::string>& encoding = std::nullopt) override;
|
|
26
|
+
std::shared_ptr<margelo::nitro::crypto::HybridHashSpec> copy(const std::optional<double> outputLength) override;
|
|
27
|
+
std::vector<std::string> getSupportedHashAlgorithms() override;
|
|
28
|
+
std::string getOpenSSLVersion() override;
|
|
29
|
+
|
|
30
|
+
private:
|
|
31
|
+
// Methods
|
|
32
|
+
void setParams();
|
|
33
|
+
|
|
34
|
+
private:
|
|
35
|
+
// Properties
|
|
36
|
+
EVP_MD_CTX* ctx = nullptr;
|
|
37
|
+
EVP_MD* md = nullptr;
|
|
38
|
+
bool md_fetched = false;
|
|
39
|
+
std::string algorithm = "";
|
|
40
|
+
std::optional<double> outputLength = std::nullopt;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <memory>
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <optional>
|
|
6
|
+
#include <string>
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
#include "HybridHmac.hpp"
|
|
10
|
+
|
|
11
|
+
namespace margelo::nitro::crypto {
|
|
12
|
+
|
|
13
|
+
HybridHmac::~HybridHmac() {
|
|
14
|
+
if (ctx) {
|
|
15
|
+
EVP_MAC_CTX_free(ctx);
|
|
16
|
+
ctx = nullptr;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
void HybridHmac::createHmac(const std::string& hmacAlgorithm, const std::shared_ptr<ArrayBuffer>& secretKey) {
|
|
21
|
+
algorithm = hmacAlgorithm;
|
|
22
|
+
|
|
23
|
+
// Create and use EVP_MAC locally
|
|
24
|
+
EVP_MAC* mac = EVP_MAC_fetch(nullptr, "HMAC", nullptr);
|
|
25
|
+
if (!mac) {
|
|
26
|
+
throw std::runtime_error("Failed to fetch HMAC implementation: " + std::to_string(ERR_get_error()));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Create HMAC context
|
|
30
|
+
ctx = EVP_MAC_CTX_new(mac);
|
|
31
|
+
EVP_MAC_free(mac); // Free immediately after creating the context
|
|
32
|
+
if (!ctx) {
|
|
33
|
+
throw std::runtime_error("Failed to create HMAC context: " + std::to_string(ERR_get_error()));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Validate algorithm
|
|
37
|
+
const EVP_MD* md = EVP_get_digestbyname(algorithm.c_str());
|
|
38
|
+
if (!md) {
|
|
39
|
+
throw std::runtime_error("Unknown HMAC algorithm: " + algorithm);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Set up parameters for HMAC
|
|
43
|
+
OSSL_PARAM params[2];
|
|
44
|
+
params[0] = OSSL_PARAM_construct_utf8_string("digest", const_cast<char*>(algorithm.c_str()), 0);
|
|
45
|
+
params[1] = OSSL_PARAM_construct_end();
|
|
46
|
+
|
|
47
|
+
const uint8_t* keyData = reinterpret_cast<const uint8_t*>(secretKey->data());
|
|
48
|
+
size_t keySize = secretKey->size();
|
|
49
|
+
|
|
50
|
+
// Handle empty key case by providing a dummy key
|
|
51
|
+
static const uint8_t dummyKey = 0;
|
|
52
|
+
if (keySize == 0) {
|
|
53
|
+
keyData = &dummyKey;
|
|
54
|
+
keySize = 1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Initialize HMAC
|
|
58
|
+
if (EVP_MAC_init(ctx, keyData, keySize, params) != 1) {
|
|
59
|
+
throw std::runtime_error("Failed to initialize HMAC: " + std::to_string(ERR_get_error()));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
void HybridHmac::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
64
|
+
if (!ctx) {
|
|
65
|
+
throw std::runtime_error("HMAC context not initialized");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Update HMAC with new data
|
|
69
|
+
if (EVP_MAC_update(ctx, reinterpret_cast<const uint8_t*>(data->data()), data->size()) != 1) {
|
|
70
|
+
throw std::runtime_error("Failed to update HMAC: " + std::to_string(ERR_get_error()));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
std::shared_ptr<ArrayBuffer> HybridHmac::digest() {
|
|
75
|
+
if (!ctx) {
|
|
76
|
+
throw std::runtime_error("HMAC context not initialized");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Determine the maximum possible size of the HMAC output
|
|
80
|
+
const EVP_MD* md = EVP_get_digestbyname(algorithm.c_str());
|
|
81
|
+
const size_t hmacLength = EVP_MD_get_size(md);
|
|
82
|
+
|
|
83
|
+
// Allocate buffer with the exact required size
|
|
84
|
+
uint8_t* hmacBuffer = new uint8_t[hmacLength];
|
|
85
|
+
|
|
86
|
+
// Finalize the HMAC computation directly into the final buffer
|
|
87
|
+
if (EVP_MAC_final(ctx, hmacBuffer, nullptr, hmacLength) != 1) {
|
|
88
|
+
delete[] hmacBuffer;
|
|
89
|
+
throw std::runtime_error("Failed to finalize HMAC digest: " + std::to_string(ERR_get_error()));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return std::make_shared<NativeArrayBuffer>(hmacBuffer, hmacLength, [=]() { delete[] hmacBuffer; });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
} // namespace margelo::nitro::crypto
|