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,428 @@
|
|
|
1
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
2
|
+
#include <NitroModules/Promise.hpp>
|
|
3
|
+
#include <memory>
|
|
4
|
+
#include <openssl/bio.h>
|
|
5
|
+
#include <openssl/buffer.h>
|
|
6
|
+
#include <openssl/ec.h>
|
|
7
|
+
#include <openssl/err.h>
|
|
8
|
+
#include <openssl/evp.h>
|
|
9
|
+
#include <openssl/obj_mac.h>
|
|
10
|
+
#include <openssl/pem.h>
|
|
11
|
+
#include <openssl/sha.h>
|
|
12
|
+
#include <stdexcept>
|
|
13
|
+
#include <string>
|
|
14
|
+
|
|
15
|
+
// OpenSSL EC parameter encoding constants
|
|
16
|
+
#ifndef OPENSSL_EC_EXPLICIT_CURVE
|
|
17
|
+
#define OPENSSL_EC_EXPLICIT_CURVE 0x000
|
|
18
|
+
#endif
|
|
19
|
+
#ifndef OPENSSL_EC_NAMED_CURVE
|
|
20
|
+
#define OPENSSL_EC_NAMED_CURVE 0x001
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#include "HybridEcKeyPair.hpp"
|
|
24
|
+
#include "Utils.hpp"
|
|
25
|
+
|
|
26
|
+
namespace margelo::nitro::crypto {
|
|
27
|
+
|
|
28
|
+
std::shared_ptr<Promise<void>> HybridEcKeyPair::generateKeyPair() {
|
|
29
|
+
return Promise<void>::async([this]() { this->generateKeyPairSync(); });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
void HybridEcKeyPair::generateKeyPairSync() {
|
|
33
|
+
if (this->curve.empty()) {
|
|
34
|
+
throw std::runtime_error("EC curve not set. Call setCurve() first.");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Clean up existing key if any
|
|
38
|
+
if (this->pkey != nullptr) {
|
|
39
|
+
EVP_PKEY_free(this->pkey);
|
|
40
|
+
this->pkey = nullptr;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Get curve NID from curve name
|
|
44
|
+
int curve_nid = GetCurveFromName(this->curve.c_str());
|
|
45
|
+
if (curve_nid == NID_undef) {
|
|
46
|
+
throw std::runtime_error("Invalid or unsupported curve: " + this->curve);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> key_ctx(nullptr, EVP_PKEY_CTX_free);
|
|
50
|
+
|
|
51
|
+
// Handle special curves (Ed25519, X25519, etc.)
|
|
52
|
+
switch (curve_nid) {
|
|
53
|
+
case EVP_PKEY_ED25519:
|
|
54
|
+
case EVP_PKEY_ED448:
|
|
55
|
+
case EVP_PKEY_X25519:
|
|
56
|
+
case EVP_PKEY_X448:
|
|
57
|
+
key_ctx.reset(EVP_PKEY_CTX_new_id(curve_nid, nullptr));
|
|
58
|
+
break;
|
|
59
|
+
default: {
|
|
60
|
+
// Standard EC curves
|
|
61
|
+
std::unique_ptr<EVP_PKEY_CTX, decltype(&EVP_PKEY_CTX_free)> param_ctx(EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr), EVP_PKEY_CTX_free);
|
|
62
|
+
|
|
63
|
+
if (!param_ctx) {
|
|
64
|
+
throw std::runtime_error("Failed to create parameter context");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (EVP_PKEY_paramgen_init(param_ctx.get()) <= 0) {
|
|
68
|
+
throw std::runtime_error("Failed to initialize parameter generation");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(param_ctx.get(), curve_nid) <= 0) {
|
|
72
|
+
throw std::runtime_error("Failed to set curve NID");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (EVP_PKEY_CTX_set_ec_param_enc(param_ctx.get(), OPENSSL_EC_NAMED_CURVE) <= 0) {
|
|
76
|
+
throw std::runtime_error("Failed to set parameter encoding");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
EVP_PKEY* raw_params = nullptr;
|
|
80
|
+
if (EVP_PKEY_paramgen(param_ctx.get(), &raw_params) <= 0) {
|
|
81
|
+
throw std::runtime_error("Failed to generate parameters");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
std::unique_ptr<EVP_PKEY, decltype(&EVP_PKEY_free)> key_params(raw_params, EVP_PKEY_free);
|
|
85
|
+
key_ctx.reset(EVP_PKEY_CTX_new(key_params.get(), nullptr));
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!key_ctx) {
|
|
91
|
+
throw std::runtime_error("Failed to create key generation context");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (EVP_PKEY_keygen_init(key_ctx.get()) <= 0) {
|
|
95
|
+
throw std::runtime_error("Failed to initialize key generation");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
EVP_PKEY* raw_pkey = nullptr;
|
|
99
|
+
if (EVP_PKEY_keygen(key_ctx.get(), &raw_pkey) <= 0) {
|
|
100
|
+
throw std::runtime_error("Failed to generate EC key pair");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this->pkey = raw_pkey;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
KeyObject HybridEcKeyPair::importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData,
|
|
107
|
+
const std::string& /* algorithm */, bool /* extractable */,
|
|
108
|
+
const std::vector<std::string>& /* keyUsages */) {
|
|
109
|
+
// Clean up any existing key
|
|
110
|
+
if (this->pkey != nullptr) {
|
|
111
|
+
EVP_PKEY_free(this->pkey);
|
|
112
|
+
this->pkey = nullptr;
|
|
113
|
+
}
|
|
114
|
+
// Reset curve state to avoid interference between different uses
|
|
115
|
+
this->curve.clear();
|
|
116
|
+
|
|
117
|
+
// Import key from DER format
|
|
118
|
+
if (format != "der") {
|
|
119
|
+
throw std::runtime_error("Only DER format is supported for key import");
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const unsigned char* keyPtr = static_cast<const unsigned char*>(keyData->data());
|
|
123
|
+
size_t keyLen = keyData->size();
|
|
124
|
+
|
|
125
|
+
// Try to import as public key first (SPKI format)
|
|
126
|
+
EVP_PKEY* pkey = d2i_PUBKEY(nullptr, &keyPtr, keyLen);
|
|
127
|
+
|
|
128
|
+
if (!pkey) {
|
|
129
|
+
// Reset pointer and try as private key (PKCS8 format)
|
|
130
|
+
keyPtr = static_cast<const unsigned char*>(keyData->data());
|
|
131
|
+
|
|
132
|
+
// Try PKCS8 format for private keys
|
|
133
|
+
BIO* pkcs8_bio = BIO_new_mem_buf(keyData->data(), static_cast<int>(keyData->size()));
|
|
134
|
+
if (pkcs8_bio) {
|
|
135
|
+
PKCS8_PRIV_KEY_INFO* p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(pkcs8_bio, nullptr);
|
|
136
|
+
if (p8inf != nullptr) {
|
|
137
|
+
EVP_PKEY* pkcs8_pkey = EVP_PKCS82PKEY(p8inf);
|
|
138
|
+
PKCS8_PRIV_KEY_INFO_free(p8inf);
|
|
139
|
+
BIO_free(pkcs8_bio);
|
|
140
|
+
if (pkcs8_pkey != nullptr) {
|
|
141
|
+
this->pkey = pkcs8_pkey;
|
|
142
|
+
KeyObject keyObj;
|
|
143
|
+
return keyObj;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
BIO_free(pkcs8_bio);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Try to parse as SPKI (public key) with BIO
|
|
150
|
+
BIO* spki_bio = BIO_new_mem_buf(keyData->data(), static_cast<int>(keyData->size()));
|
|
151
|
+
if (spki_bio) {
|
|
152
|
+
EVP_PKEY* spki_pkey = d2i_PUBKEY_bio(spki_bio, nullptr);
|
|
153
|
+
BIO_free(spki_bio);
|
|
154
|
+
if (spki_pkey != nullptr) {
|
|
155
|
+
this->pkey = spki_pkey;
|
|
156
|
+
KeyObject keyObj;
|
|
157
|
+
return keyObj;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
throw std::runtime_error("Failed to import EC key from DER data");
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
this->pkey = pkey;
|
|
165
|
+
|
|
166
|
+
// Return a placeholder KeyObject - this would need proper implementation
|
|
167
|
+
// For now, we just need the key imported into this->pkey for sign/verify
|
|
168
|
+
KeyObject keyObj;
|
|
169
|
+
return keyObj;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
std::shared_ptr<ArrayBuffer> HybridEcKeyPair::exportKey(const KeyObject& key, const std::string& format) {
|
|
173
|
+
// Suppress unused parameter warning
|
|
174
|
+
(void)key;
|
|
175
|
+
|
|
176
|
+
if (!this->pkey) {
|
|
177
|
+
throw std::runtime_error("No key pair generated");
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (format == "der-spki") {
|
|
181
|
+
// Export public key in DER SPKI format
|
|
182
|
+
int len = i2d_PUBKEY(this->pkey, nullptr);
|
|
183
|
+
if (len <= 0) {
|
|
184
|
+
throw std::runtime_error("Failed to get public key DER length");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
std::vector<unsigned char> derData(len);
|
|
188
|
+
unsigned char* ptr = derData.data();
|
|
189
|
+
i2d_PUBKEY(this->pkey, &ptr);
|
|
190
|
+
return ToNativeArrayBuffer(std::string(derData.begin(), derData.end()));
|
|
191
|
+
} else if (format == "der-pkcs8") {
|
|
192
|
+
// Export private key in DER PKCS8 format
|
|
193
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
194
|
+
if (!bio) {
|
|
195
|
+
throw std::runtime_error("Failed to create BIO for private key export");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
|
|
199
|
+
BIO_free(bio);
|
|
200
|
+
throw std::runtime_error("Failed to export private key to DER PKCS8 format");
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
BUF_MEM* mem;
|
|
204
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
205
|
+
std::string derData(mem->data, mem->length);
|
|
206
|
+
BIO_free(bio);
|
|
207
|
+
|
|
208
|
+
return ToNativeArrayBuffer(derData);
|
|
209
|
+
} else if (format == "pem-spki") {
|
|
210
|
+
// Export public key in PEM SPKI format
|
|
211
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
212
|
+
if (!bio) {
|
|
213
|
+
throw std::runtime_error("Failed to create BIO for public key export");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (PEM_write_bio_PUBKEY(bio, this->pkey) != 1) {
|
|
217
|
+
BIO_free(bio);
|
|
218
|
+
throw std::runtime_error("Failed to export public key to PEM SPKI format");
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
BUF_MEM* mem;
|
|
222
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
223
|
+
std::string pemData(mem->data, mem->length);
|
|
224
|
+
BIO_free(bio);
|
|
225
|
+
|
|
226
|
+
return ToNativeArrayBuffer(pemData);
|
|
227
|
+
} else if (format == "pem-pkcs8") {
|
|
228
|
+
// Export private key in PEM PKCS8 format
|
|
229
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
230
|
+
if (!bio) {
|
|
231
|
+
throw std::runtime_error("Failed to create BIO for private key export");
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (PEM_write_bio_PKCS8PrivateKey(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
|
|
235
|
+
BIO_free(bio);
|
|
236
|
+
throw std::runtime_error("Failed to export private key to PEM PKCS8 format");
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
BUF_MEM* mem;
|
|
240
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
241
|
+
std::string pemData(mem->data, mem->length);
|
|
242
|
+
BIO_free(bio);
|
|
243
|
+
|
|
244
|
+
return ToNativeArrayBuffer(pemData);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
throw std::runtime_error("Unsupported export format: " + format);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
std::shared_ptr<ArrayBuffer> HybridEcKeyPair::getPublicKey() {
|
|
251
|
+
this->checkKeyPair();
|
|
252
|
+
|
|
253
|
+
// Export as DER format using direct OpenSSL calls
|
|
254
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
255
|
+
if (!bio) {
|
|
256
|
+
throw std::runtime_error("Failed to create BIO for public key export");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (i2d_PUBKEY_bio(bio, this->pkey) != 1) {
|
|
260
|
+
BIO_free(bio);
|
|
261
|
+
throw std::runtime_error("Failed to export public key to DER format");
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
BUF_MEM* mem;
|
|
265
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
266
|
+
|
|
267
|
+
// Create a string from the DER data and use ToNativeArrayBuffer utility
|
|
268
|
+
std::string derData(mem->data, mem->length);
|
|
269
|
+
BIO_free(bio);
|
|
270
|
+
|
|
271
|
+
return ToNativeArrayBuffer(derData);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
std::shared_ptr<ArrayBuffer> HybridEcKeyPair::getPrivateKey() {
|
|
275
|
+
if (this->pkey == nullptr) {
|
|
276
|
+
throw std::runtime_error("No private key available");
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Export private key in PKCS8 DER format
|
|
280
|
+
BIO* bio = BIO_new(BIO_s_mem());
|
|
281
|
+
if (i2d_PKCS8PrivateKey_bio(bio, this->pkey, nullptr, nullptr, 0, nullptr, nullptr) != 1) {
|
|
282
|
+
BIO_free(bio);
|
|
283
|
+
throw std::runtime_error("Failed to export private key");
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
BUF_MEM* mem;
|
|
287
|
+
BIO_get_mem_ptr(bio, &mem);
|
|
288
|
+
std::string derData(mem->data, mem->length);
|
|
289
|
+
BIO_free(bio);
|
|
290
|
+
|
|
291
|
+
return ToNativeArrayBuffer(derData);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
void HybridEcKeyPair::setCurve(const std::string& curve) {
|
|
295
|
+
this->curve = curve;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
int HybridEcKeyPair::GetCurveFromName(const char* name) {
|
|
299
|
+
// Handle NIST curve name mappings first
|
|
300
|
+
std::string curve_name(name);
|
|
301
|
+
if (curve_name == "P-256") {
|
|
302
|
+
return NID_X9_62_prime256v1;
|
|
303
|
+
} else if (curve_name == "P-384") {
|
|
304
|
+
return NID_secp384r1;
|
|
305
|
+
} else if (curve_name == "P-521") {
|
|
306
|
+
return NID_secp521r1;
|
|
307
|
+
} else if (curve_name == "secp256k1") {
|
|
308
|
+
return NID_secp256k1;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Try standard OpenSSL name resolution
|
|
312
|
+
int nid = OBJ_txt2nid(name);
|
|
313
|
+
if (nid == NID_undef) {
|
|
314
|
+
// Try short names
|
|
315
|
+
nid = OBJ_sn2nid(name);
|
|
316
|
+
}
|
|
317
|
+
if (nid == NID_undef) {
|
|
318
|
+
// Try long names
|
|
319
|
+
nid = OBJ_ln2nid(name);
|
|
320
|
+
}
|
|
321
|
+
return nid;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
std::shared_ptr<ArrayBuffer> HybridEcKeyPair::sign(const std::shared_ptr<ArrayBuffer>& data, const std::string& hashAlgorithm) {
|
|
325
|
+
this->checkKeyPair();
|
|
326
|
+
|
|
327
|
+
// Get the hash algorithm EVP_MD
|
|
328
|
+
const EVP_MD* md = nullptr;
|
|
329
|
+
if (hashAlgorithm == "SHA-256") {
|
|
330
|
+
md = EVP_sha256();
|
|
331
|
+
} else if (hashAlgorithm == "SHA-384") {
|
|
332
|
+
md = EVP_sha384();
|
|
333
|
+
} else if (hashAlgorithm == "SHA-512") {
|
|
334
|
+
md = EVP_sha512();
|
|
335
|
+
} else if (hashAlgorithm == "SHA-1") {
|
|
336
|
+
md = EVP_sha1();
|
|
337
|
+
} else {
|
|
338
|
+
throw std::runtime_error("Unsupported hash algorithm: " + hashAlgorithm);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Create signing context
|
|
342
|
+
std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)> md_ctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
|
|
343
|
+
if (!md_ctx) {
|
|
344
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Initialize signing
|
|
348
|
+
if (EVP_DigestSignInit(md_ctx.get(), nullptr, md, nullptr, this->pkey) <= 0) {
|
|
349
|
+
throw std::runtime_error("Failed to initialize ECDSA signing");
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Update with data
|
|
353
|
+
if (EVP_DigestSignUpdate(md_ctx.get(), data->data(), data->size()) <= 0) {
|
|
354
|
+
throw std::runtime_error("Failed to update ECDSA signing with data");
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Get signature length
|
|
358
|
+
size_t sig_len = 0;
|
|
359
|
+
if (EVP_DigestSignFinal(md_ctx.get(), nullptr, &sig_len) <= 0) {
|
|
360
|
+
throw std::runtime_error("Failed to get ECDSA signature length");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Allocate signature buffer
|
|
364
|
+
std::vector<uint8_t> signature(sig_len);
|
|
365
|
+
|
|
366
|
+
// Get the actual signature
|
|
367
|
+
if (EVP_DigestSignFinal(md_ctx.get(), signature.data(), &sig_len) <= 0) {
|
|
368
|
+
throw std::runtime_error("Failed to generate ECDSA signature");
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Resize to actual signature length
|
|
372
|
+
signature.resize(sig_len);
|
|
373
|
+
|
|
374
|
+
// Convert to ArrayBuffer
|
|
375
|
+
return ToNativeArrayBuffer(std::string(signature.begin(), signature.end()));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
bool HybridEcKeyPair::verify(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& signature,
|
|
379
|
+
const std::string& hashAlgorithm) {
|
|
380
|
+
this->checkKeyPair();
|
|
381
|
+
|
|
382
|
+
// Get the hash algorithm EVP_MD
|
|
383
|
+
const EVP_MD* md = nullptr;
|
|
384
|
+
if (hashAlgorithm == "SHA-256") {
|
|
385
|
+
md = EVP_sha256();
|
|
386
|
+
} else if (hashAlgorithm == "SHA-384") {
|
|
387
|
+
md = EVP_sha384();
|
|
388
|
+
} else if (hashAlgorithm == "SHA-512") {
|
|
389
|
+
md = EVP_sha512();
|
|
390
|
+
} else if (hashAlgorithm == "SHA-1") {
|
|
391
|
+
md = EVP_sha1();
|
|
392
|
+
} else {
|
|
393
|
+
throw std::runtime_error("Unsupported hash algorithm: " + hashAlgorithm);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Create verification context
|
|
397
|
+
std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)> md_ctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
|
|
398
|
+
if (!md_ctx) {
|
|
399
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Initialize verification
|
|
403
|
+
if (EVP_DigestVerifyInit(md_ctx.get(), nullptr, md, nullptr, this->pkey) <= 0) {
|
|
404
|
+
throw std::runtime_error("Failed to initialize ECDSA verification");
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Update with data
|
|
408
|
+
if (EVP_DigestVerifyUpdate(md_ctx.get(), data->data(), data->size()) <= 0) {
|
|
409
|
+
throw std::runtime_error("Failed to update ECDSA verification with data");
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Verify signature
|
|
413
|
+
int result = EVP_DigestVerifyFinal(md_ctx.get(), static_cast<const unsigned char*>(signature->data()), signature->size());
|
|
414
|
+
|
|
415
|
+
if (result < 0) {
|
|
416
|
+
throw std::runtime_error("ECDSA verification failed with error");
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return result == 1;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
void HybridEcKeyPair::checkKeyPair() {
|
|
423
|
+
if (this->pkey == nullptr) {
|
|
424
|
+
throw std::runtime_error("EC KeyPair not initialized");
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#include <memory>
|
|
2
|
+
#include <openssl/ec.h>
|
|
3
|
+
#include <openssl/err.h>
|
|
4
|
+
#include <openssl/evp.h>
|
|
5
|
+
#include <openssl/obj_mac.h>
|
|
6
|
+
#include <string>
|
|
7
|
+
|
|
8
|
+
#include "HybridEcKeyPairSpec.hpp"
|
|
9
|
+
#include "Utils.hpp"
|
|
10
|
+
|
|
11
|
+
namespace margelo::nitro::crypto {
|
|
12
|
+
|
|
13
|
+
class HybridEcKeyPair : public HybridEcKeyPairSpec {
|
|
14
|
+
public:
|
|
15
|
+
HybridEcKeyPair() : HybridObject(TAG) {}
|
|
16
|
+
~HybridEcKeyPair() {
|
|
17
|
+
if (pkey != nullptr) {
|
|
18
|
+
EVP_PKEY_free(pkey);
|
|
19
|
+
pkey = nullptr;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public:
|
|
24
|
+
// Methods
|
|
25
|
+
std::shared_ptr<Promise<void>> generateKeyPair() override;
|
|
26
|
+
void generateKeyPairSync() override;
|
|
27
|
+
KeyObject importKey(const std::string& format, const std::shared_ptr<ArrayBuffer>& keyData, const std::string& algorithm,
|
|
28
|
+
bool extractable, const std::vector<std::string>& keyUsages) override;
|
|
29
|
+
std::shared_ptr<ArrayBuffer> exportKey(const KeyObject& key, const std::string& format) override;
|
|
30
|
+
std::shared_ptr<ArrayBuffer> getPublicKey() override;
|
|
31
|
+
std::shared_ptr<ArrayBuffer> getPrivateKey() override;
|
|
32
|
+
|
|
33
|
+
void setCurve(const std::string& curve) override;
|
|
34
|
+
std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<ArrayBuffer>& data, const std::string& hashAlgorithm) override;
|
|
35
|
+
bool verify(const std::shared_ptr<ArrayBuffer>& data, const std::shared_ptr<ArrayBuffer>& signature,
|
|
36
|
+
const std::string& hashAlgorithm) override;
|
|
37
|
+
|
|
38
|
+
protected:
|
|
39
|
+
void checkKeyPair();
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
std::string curve;
|
|
43
|
+
EVP_PKEY* pkey = nullptr;
|
|
44
|
+
|
|
45
|
+
static int GetCurveFromName(const char* name);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
} // namespace margelo::nitro::crypto
|