react-native-quick-crypto 1.0.0-beta.9 → 1.0.1
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 +156 -8
- package/README.md +14 -27
- package/android/CMakeLists.txt +64 -7
- package/android/build.gradle +12 -2
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +0 -2
- 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/GCMCipher.cpp +68 -0
- package/cpp/cipher/GCMCipher.hpp +14 -0
- package/cpp/cipher/HybridCipher.cpp +323 -0
- package/cpp/cipher/HybridCipher.hpp +68 -0
- package/cpp/cipher/HybridCipherFactory.hpp +105 -0
- package/cpp/cipher/HybridRsaCipher.cpp +367 -0
- package/cpp/cipher/HybridRsaCipher.hpp +29 -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 +228 -98
- package/cpp/ed25519/HybridEdKeyPair.hpp +42 -56
- 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 +757 -0
- package/cpp/keys/HybridKeyObjectHandle.hpp +51 -0
- package/cpp/keys/KeyObjectData.cpp +268 -0
- package/cpp/keys/KeyObjectData.hpp +71 -0
- package/cpp/keys/node.h +5 -0
- package/cpp/mldsa/HybridMlDsaKeyPair.cpp +264 -0
- package/cpp/mldsa/HybridMlDsaKeyPair.hpp +47 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
- package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
- package/cpp/random/HybridRandom.cpp +6 -17
- package/cpp/random/HybridRandom.hpp +5 -6
- package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
- package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
- package/cpp/sign/HybridSignHandle.cpp +266 -0
- package/cpp/sign/HybridSignHandle.hpp +36 -0
- package/cpp/sign/HybridVerifyHandle.cpp +227 -0
- package/cpp/sign/HybridVerifyHandle.hpp +36 -0
- package/cpp/sign/SignUtils.hpp +108 -0
- package/cpp/utils/Macros.hpp +68 -0
- package/cpp/utils/Utils.hpp +43 -2
- package/cpp/utils/base64.h +309 -0
- 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 +5 -1
- package/deps/ncrypto/.bazelignore +4 -0
- package/deps/ncrypto/.bazelrc +2 -0
- package/deps/ncrypto/.bazelversion +1 -0
- package/deps/ncrypto/.clang-format +111 -0
- package/deps/ncrypto/.github/workflows/bazel.yml +58 -0
- package/deps/ncrypto/.github/workflows/linter.yml +38 -0
- package/deps/ncrypto/.github/workflows/macos.yml +43 -0
- package/deps/ncrypto/.github/workflows/ubuntu.yml +46 -0
- package/deps/ncrypto/.github/workflows/visual-studio.yml +49 -0
- package/deps/ncrypto/.python-version +1 -0
- package/deps/ncrypto/BUILD.bazel +36 -0
- package/deps/ncrypto/CMakeLists.txt +55 -0
- package/deps/ncrypto/LICENSE +21 -0
- package/deps/ncrypto/MODULE.bazel +1 -0
- package/deps/ncrypto/MODULE.bazel.lock +280 -0
- package/deps/ncrypto/README.md +18 -0
- package/deps/ncrypto/WORKSPACE +15 -0
- package/deps/ncrypto/cmake/CPM.cmake +1225 -0
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +16 -0
- package/deps/ncrypto/include/dh-primes.h +67 -0
- package/deps/ncrypto/include/ncrypto.h +1897 -0
- package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +28 -0
- package/deps/ncrypto/pyproject.toml +38 -0
- package/deps/ncrypto/src/CMakeLists.txt +15 -0
- package/deps/ncrypto/src/engine.cpp +93 -0
- package/deps/ncrypto/src/ncrypto.cpp +5613 -0
- package/deps/ncrypto/tests/BUILD.bazel +9 -0
- package/deps/ncrypto/tests/CMakeLists.txt +7 -0
- package/deps/ncrypto/tests/basic.cpp +86 -0
- package/deps/ncrypto/tools/run-clang-format.sh +42 -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/constants.js +32 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/ec.js +480 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/ed.js +214 -2
- package/lib/commonjs/ed.js.map +1 -1
- 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 +102 -24
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/keys/classes.js +115 -52
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/keys/generateKeyPair.js +141 -144
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
- package/lib/commonjs/keys/index.js +229 -0
- package/lib/commonjs/keys/index.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +152 -0
- package/lib/commonjs/keys/publicCipher.js.map +1 -0
- package/lib/commonjs/keys/signVerify.js +178 -39
- package/lib/commonjs/keys/signVerify.js.map +1 -1
- package/lib/commonjs/keys/utils.js +18 -13
- package/lib/commonjs/keys/utils.js.map +1 -1
- package/lib/commonjs/mldsa.js +69 -0
- package/lib/commonjs/mldsa.js.map +1 -0
- package/lib/commonjs/pbkdf2.js.map +1 -1
- package/lib/commonjs/random.js +6 -0
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +202 -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/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/mlDsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/mlDsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
- package/lib/commonjs/specs/rsaCipher.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/specs/sign.nitro.js +6 -0
- package/lib/commonjs/specs/sign.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +1092 -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 +44 -5
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/hashnames.js +2 -1
- package/lib/commonjs/utils/hashnames.js.map +1 -1
- package/lib/commonjs/utils/index.js +11 -0
- 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 +32 -17
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +74 -1
- package/lib/commonjs/utils/validation.js.map +1 -1
- 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/constants.js +28 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/ec.js +470 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/ed.js +212 -3
- package/lib/module/ed.js.map +1 -1
- 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 +21 -21
- package/lib/module/index.js.map +1 -1
- package/lib/module/keys/classes.js +112 -49
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/keys/generateKeyPair.js +134 -143
- package/lib/module/keys/generateKeyPair.js.map +1 -1
- package/lib/module/keys/index.js +161 -22
- package/lib/module/keys/index.js.map +1 -1
- package/lib/module/keys/publicCipher.js +145 -0
- package/lib/module/keys/publicCipher.js.map +1 -0
- package/lib/module/keys/signVerify.js +170 -39
- package/lib/module/keys/signVerify.js.map +1 -1
- package/lib/module/keys/utils.js +16 -12
- package/lib/module/keys/utils.js.map +1 -1
- package/lib/module/mldsa.js +63 -0
- package/lib/module/mldsa.js.map +1 -0
- package/lib/module/pbkdf2.js.map +1 -1
- package/lib/module/random.js +6 -0
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +194 -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/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/mlDsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/mlDsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/rsaCipher.nitro.js +4 -0
- package/lib/module/specs/rsaCipher.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/specs/sign.nitro.js +4 -0
- package/lib/module/specs/sign.nitro.js.map +1 -0
- package/lib/module/subtle.js +1087 -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 +26 -5
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/hashnames.js +2 -1
- package/lib/module/utils/hashnames.js.map +1 -1
- package/lib/module/utils/index.js +1 -0
- 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 +32 -17
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +69 -1
- package/lib/module/utils/validation.js.map +1 -1
- 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/constants.d.ts +21 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +22 -0
- package/lib/typescript/ec.d.ts.map +1 -0
- package/lib/typescript/ed.d.ts +28 -1
- package/lib/typescript/ed.d.ts.map +1 -1
- 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 +102 -10
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +52 -8
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
- package/lib/typescript/keys/index.d.ts +22 -2
- package/lib/typescript/keys/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts +20 -0
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
- package/lib/typescript/keys/signVerify.d.ts +28 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -1
- package/lib/typescript/keys/utils.d.ts +3 -1
- package/lib/typescript/keys/utils.d.ts.map +1 -1
- package/lib/typescript/mldsa.d.ts +18 -0
- package/lib/typescript/mldsa.d.ts.map +1 -0
- package/lib/typescript/pbkdf2.d.ts +1 -1
- package/lib/typescript/pbkdf2.d.ts.map +1 -1
- package/lib/typescript/random.d.ts +6 -0
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts +19 -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 +1 -0
- package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
- 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 +1 -1
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts +16 -0
- package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
- package/lib/typescript/specs/rsaCipher.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/specs/sign.nitro.d.ts +19 -0
- package/lib/typescript/specs/sign.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 +1 -0
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/hashnames.d.ts +3 -1
- package/lib/typescript/utils/hashnames.d.ts.map +1 -1
- package/lib/typescript/utils/index.d.ts +1 -0
- 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 +129 -25
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +5 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -1
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +31 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +125 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +3 -3
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +121 -1
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +116 -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 +2 -1
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
- 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 +1 -1
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +73 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
- package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
- package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
- package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
- package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
- package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
- package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
- package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
- package/package.json +31 -23
- package/src/blake3.ts +123 -0
- package/src/cipher.ts +335 -0
- package/src/constants.ts +32 -0
- package/src/ec.ts +657 -0
- package/src/ed.ts +297 -13
- 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 +20 -20
- package/src/keys/classes.ts +157 -55
- package/src/keys/generateKeyPair.ts +177 -134
- package/src/keys/index.ts +226 -14
- package/src/keys/publicCipher.ts +229 -0
- package/src/keys/signVerify.ts +239 -39
- package/src/keys/utils.ts +24 -18
- package/src/mldsa.ts +125 -0
- package/src/pbkdf2.ts +1 -1
- package/src/random.ts +7 -0
- package/src/rsa.ts +310 -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 +2 -0
- package/src/specs/hash.nitro.ts +10 -0
- package/src/specs/hmac.nitro.ts +7 -0
- package/src/specs/keyObjectHandle.nitro.ts +1 -1
- package/src/specs/mlDsaKeyPair.nitro.ts +29 -0
- package/src/specs/rsaCipher.nitro.ts +65 -0
- package/src/specs/rsaKeyPair.nitro.ts +33 -0
- package/src/specs/sign.nitro.ts +31 -0
- package/src/subtle.ts +1576 -0
- package/src/utils/cipher.ts +60 -0
- package/src/utils/conversion.ts +33 -4
- package/src/utils/hashnames.ts +4 -2
- package/src/utils/index.ts +1 -0
- package/src/utils/noble.ts +85 -0
- package/src/utils/types.ts +219 -31
- package/src/utils/validation.ts +96 -1
- package/lib/module/package.json +0 -1
- package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
- package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
#include "HybridSignHandle.hpp"
|
|
2
|
+
|
|
3
|
+
#include "../keys/HybridKeyObjectHandle.hpp"
|
|
4
|
+
#include "SignUtils.hpp"
|
|
5
|
+
#include "Utils.hpp"
|
|
6
|
+
|
|
7
|
+
#include <cstring>
|
|
8
|
+
#include <openssl/err.h>
|
|
9
|
+
#include <openssl/evp.h>
|
|
10
|
+
#include <openssl/rsa.h>
|
|
11
|
+
|
|
12
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
13
|
+
#define RNQC_HAS_ML_DSA 1
|
|
14
|
+
#else
|
|
15
|
+
#define RNQC_HAS_ML_DSA 0
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
namespace margelo::nitro::crypto {
|
|
19
|
+
|
|
20
|
+
using margelo::nitro::NativeArrayBuffer;
|
|
21
|
+
|
|
22
|
+
HybridSignHandle::~HybridSignHandle() {
|
|
23
|
+
if (md_ctx) {
|
|
24
|
+
EVP_MD_CTX_free(md_ctx);
|
|
25
|
+
md_ctx = nullptr;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void HybridSignHandle::init(const std::string& algorithm) {
|
|
30
|
+
algorithm_name = algorithm;
|
|
31
|
+
|
|
32
|
+
// For ML-DSA and other pure signature schemes, algorithm may be empty/null
|
|
33
|
+
if (!algorithm.empty()) {
|
|
34
|
+
md = getDigestByName(algorithm);
|
|
35
|
+
|
|
36
|
+
md_ctx = EVP_MD_CTX_new();
|
|
37
|
+
if (!md_ctx) {
|
|
38
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
|
|
42
|
+
EVP_MD_CTX_free(md_ctx);
|
|
43
|
+
md_ctx = nullptr;
|
|
44
|
+
throw std::runtime_error("Failed to initialize message digest");
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
// No digest for pure signature schemes like ML-DSA
|
|
48
|
+
md = nullptr;
|
|
49
|
+
md_ctx = EVP_MD_CTX_new();
|
|
50
|
+
if (!md_ctx) {
|
|
51
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void HybridSignHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
57
|
+
if (!md_ctx) {
|
|
58
|
+
throw std::runtime_error("Sign not initialized");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
62
|
+
|
|
63
|
+
// Accumulate raw data for potential one-shot signing (Ed25519/Ed448/ML-DSA)
|
|
64
|
+
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
65
|
+
data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
|
|
66
|
+
|
|
67
|
+
// Only update digest if we have one (not needed for pure signature schemes)
|
|
68
|
+
if (md != nullptr) {
|
|
69
|
+
if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
|
|
70
|
+
unsigned long err = ERR_get_error();
|
|
71
|
+
char err_buf[256];
|
|
72
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
73
|
+
throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Check if key type requires one-shot signing (Ed25519, Ed448, ML-DSA)
|
|
79
|
+
static bool isOneShotVariant(EVP_PKEY* pkey) {
|
|
80
|
+
int type = EVP_PKEY_id(pkey);
|
|
81
|
+
#if RNQC_HAS_ML_DSA
|
|
82
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448 || type == EVP_PKEY_ML_DSA_44 || type == EVP_PKEY_ML_DSA_65 ||
|
|
83
|
+
type == EVP_PKEY_ML_DSA_87;
|
|
84
|
+
#else
|
|
85
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
|
|
86
|
+
#endif
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Get the algorithm name for creating PKEY_CTX (for ML-DSA variants)
|
|
90
|
+
static const char* getAlgorithmName(EVP_PKEY* pkey) {
|
|
91
|
+
int type = EVP_PKEY_id(pkey);
|
|
92
|
+
#if RNQC_HAS_ML_DSA
|
|
93
|
+
switch (type) {
|
|
94
|
+
case EVP_PKEY_ML_DSA_44:
|
|
95
|
+
return "ML-DSA-44";
|
|
96
|
+
case EVP_PKEY_ML_DSA_65:
|
|
97
|
+
return "ML-DSA-65";
|
|
98
|
+
case EVP_PKEY_ML_DSA_87:
|
|
99
|
+
return "ML-DSA-87";
|
|
100
|
+
case EVP_PKEY_ED25519:
|
|
101
|
+
return "ED25519";
|
|
102
|
+
case EVP_PKEY_ED448:
|
|
103
|
+
return "ED448";
|
|
104
|
+
default:
|
|
105
|
+
return nullptr;
|
|
106
|
+
}
|
|
107
|
+
#else
|
|
108
|
+
switch (type) {
|
|
109
|
+
case EVP_PKEY_ED25519:
|
|
110
|
+
return "ED25519";
|
|
111
|
+
case EVP_PKEY_ED448:
|
|
112
|
+
return "ED448";
|
|
113
|
+
default:
|
|
114
|
+
return nullptr;
|
|
115
|
+
}
|
|
116
|
+
#endif
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
std::shared_ptr<ArrayBuffer> HybridSignHandle::sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
|
|
120
|
+
std::optional<double> padding, std::optional<double> saltLength,
|
|
121
|
+
std::optional<double> dsaEncoding) {
|
|
122
|
+
if (!md_ctx) {
|
|
123
|
+
throw std::runtime_error("Sign not initialized");
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
127
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
128
|
+
|
|
129
|
+
if (!pkey) {
|
|
130
|
+
throw std::runtime_error("Invalid private key for signing");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
size_t sig_len = 0;
|
|
134
|
+
std::unique_ptr<uint8_t[]> sig_buf;
|
|
135
|
+
|
|
136
|
+
int pkey_type = EVP_PKEY_id(pkey);
|
|
137
|
+
bool is_one_shot = isOneShotVariant(pkey);
|
|
138
|
+
|
|
139
|
+
// Ed25519/Ed448/ML-DSA require one-shot signing with EVP_DigestSign
|
|
140
|
+
// Also use one-shot path if no digest was specified (md == nullptr)
|
|
141
|
+
if (is_one_shot || md == nullptr) {
|
|
142
|
+
// Create a new context for one-shot signing
|
|
143
|
+
EVP_MD_CTX* sign_ctx = EVP_MD_CTX_new();
|
|
144
|
+
if (!sign_ctx) {
|
|
145
|
+
throw std::runtime_error("Failed to create signing context");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Get algorithm name and create PKEY_CTX for ML-DSA
|
|
149
|
+
const char* alg_name = getAlgorithmName(pkey);
|
|
150
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
151
|
+
if (alg_name != nullptr) {
|
|
152
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, alg_name, nullptr);
|
|
153
|
+
if (!pkey_ctx) {
|
|
154
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
155
|
+
throw std::runtime_error(std::string("Failed to create signing context for ") + alg_name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Initialize for one-shot signing (pass nullptr for md - these algorithms have built-in hash)
|
|
160
|
+
if (EVP_DigestSignInit(sign_ctx, pkey_ctx ? &pkey_ctx : nullptr, nullptr, nullptr, pkey) <= 0) {
|
|
161
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
162
|
+
if (pkey_ctx)
|
|
163
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
164
|
+
throw std::runtime_error("Failed to initialize one-shot signing");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Get the accumulated data from the digest context
|
|
168
|
+
// For Ed25519/Ed448, we need to pass the original data, not a digest
|
|
169
|
+
// Since we've been accumulating with DigestUpdate, we need to use the data buffer
|
|
170
|
+
// Unfortunately, EVP_MD_CTX doesn't expose the accumulated data directly
|
|
171
|
+
// We need to use EVP_DigestSign with the accumulated data
|
|
172
|
+
|
|
173
|
+
// For one-shot variants, determine signature length first
|
|
174
|
+
if (EVP_DigestSign(sign_ctx, nullptr, &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
|
|
175
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
176
|
+
throw std::runtime_error("Failed to determine Ed signature length");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
sig_buf = std::make_unique<uint8_t[]>(sig_len);
|
|
180
|
+
if (EVP_DigestSign(sign_ctx, sig_buf.get(), &sig_len, data_buffer.data(), data_buffer.size()) <= 0) {
|
|
181
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
182
|
+
unsigned long err = ERR_get_error();
|
|
183
|
+
char err_buf[256];
|
|
184
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
185
|
+
throw std::runtime_error("Failed to sign with Ed key: " + std::string(err_buf));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
EVP_MD_CTX_free(sign_ctx);
|
|
189
|
+
} else {
|
|
190
|
+
// Standard signing flow for RSA/ECDSA
|
|
191
|
+
unsigned char digest[EVP_MAX_MD_SIZE];
|
|
192
|
+
unsigned int digest_len = 0;
|
|
193
|
+
|
|
194
|
+
if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
|
|
195
|
+
throw std::runtime_error("Failed to finalize digest");
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
199
|
+
if (!pkey_ctx) {
|
|
200
|
+
throw std::runtime_error("Failed to create signing context");
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (EVP_PKEY_sign_init(pkey_ctx) <= 0) {
|
|
204
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
205
|
+
char err_buf[512];
|
|
206
|
+
snprintf(err_buf, sizeof(err_buf), "Failed to initialize signing for key type %d (expected one-shot: %s, RNQC_HAS_ML_DSA=%d)",
|
|
207
|
+
pkey_type, is_one_shot ? "true" : "false", RNQC_HAS_ML_DSA);
|
|
208
|
+
throw std::runtime_error(std::string(err_buf) + ": " + getOpenSSLError());
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (padding.has_value()) {
|
|
212
|
+
int pad = static_cast<int>(padding.value());
|
|
213
|
+
if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
|
|
214
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
215
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
|
|
220
|
+
int salt_len = static_cast<int>(saltLength.value());
|
|
221
|
+
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
|
|
222
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
223
|
+
throw std::runtime_error("Failed to set PSS salt length");
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
|
|
228
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
229
|
+
throw std::runtime_error("Failed to set signature digest");
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (EVP_PKEY_sign(pkey_ctx, nullptr, &sig_len, digest, digest_len) <= 0) {
|
|
233
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
234
|
+
throw std::runtime_error("Failed to determine signature length");
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
sig_buf = std::make_unique<uint8_t[]>(sig_len);
|
|
238
|
+
if (EVP_PKEY_sign(pkey_ctx, sig_buf.get(), &sig_len, digest, digest_len) <= 0) {
|
|
239
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
240
|
+
unsigned long err = ERR_get_error();
|
|
241
|
+
char err_buf[256];
|
|
242
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
243
|
+
throw std::runtime_error("Failed to sign: " + std::string(err_buf));
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
|
|
250
|
+
if (dsa_enc == kSigEncP1363) {
|
|
251
|
+
unsigned int n = getBytesOfRS(pkey);
|
|
252
|
+
if (n > 0) {
|
|
253
|
+
auto p1363_buf = std::make_unique<uint8_t[]>(2 * n);
|
|
254
|
+
std::memset(p1363_buf.get(), 0, 2 * n);
|
|
255
|
+
if (convertSignatureToP1363(sig_buf.get(), sig_len, p1363_buf.get(), n)) {
|
|
256
|
+
uint8_t* raw_ptr = p1363_buf.get();
|
|
257
|
+
return std::make_shared<NativeArrayBuffer>(p1363_buf.release(), 2 * n, [raw_ptr]() { delete[] raw_ptr; });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
uint8_t* raw_ptr = sig_buf.get();
|
|
263
|
+
return std::make_shared<NativeArrayBuffer>(sig_buf.release(), sig_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "HybridKeyObjectHandleSpec.hpp"
|
|
11
|
+
#include "HybridSignHandleSpec.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::crypto {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
class HybridSignHandle : public HybridSignHandleSpec {
|
|
18
|
+
public:
|
|
19
|
+
HybridSignHandle() : HybridObject(TAG) {}
|
|
20
|
+
~HybridSignHandle();
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
void init(const std::string& algorithm) override;
|
|
24
|
+
void update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
25
|
+
std::shared_ptr<ArrayBuffer> sign(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, std::optional<double> padding,
|
|
26
|
+
std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
30
|
+
const EVP_MD* md = nullptr;
|
|
31
|
+
std::string algorithm_name;
|
|
32
|
+
// Buffer for accumulating data for one-shot signing (Ed25519/Ed448)
|
|
33
|
+
std::vector<uint8_t> data_buffer;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
#include "HybridVerifyHandle.hpp"
|
|
2
|
+
|
|
3
|
+
#include "../keys/HybridKeyObjectHandle.hpp"
|
|
4
|
+
#include "SignUtils.hpp"
|
|
5
|
+
#include "Utils.hpp"
|
|
6
|
+
|
|
7
|
+
#include <cstring>
|
|
8
|
+
#include <openssl/err.h>
|
|
9
|
+
#include <openssl/evp.h>
|
|
10
|
+
#include <openssl/rsa.h>
|
|
11
|
+
|
|
12
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
13
|
+
#define RNQC_HAS_ML_DSA 1
|
|
14
|
+
#else
|
|
15
|
+
#define RNQC_HAS_ML_DSA 0
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
namespace margelo::nitro::crypto {
|
|
19
|
+
|
|
20
|
+
using margelo::nitro::NativeArrayBuffer;
|
|
21
|
+
|
|
22
|
+
HybridVerifyHandle::~HybridVerifyHandle() {
|
|
23
|
+
if (md_ctx) {
|
|
24
|
+
EVP_MD_CTX_free(md_ctx);
|
|
25
|
+
md_ctx = nullptr;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void HybridVerifyHandle::init(const std::string& algorithm) {
|
|
30
|
+
algorithm_name = algorithm;
|
|
31
|
+
|
|
32
|
+
// For ML-DSA and other pure signature schemes, algorithm may be empty/null
|
|
33
|
+
if (!algorithm.empty()) {
|
|
34
|
+
md = getDigestByName(algorithm);
|
|
35
|
+
|
|
36
|
+
md_ctx = EVP_MD_CTX_new();
|
|
37
|
+
if (!md_ctx) {
|
|
38
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (EVP_DigestInit_ex(md_ctx, md, nullptr) <= 0) {
|
|
42
|
+
EVP_MD_CTX_free(md_ctx);
|
|
43
|
+
md_ctx = nullptr;
|
|
44
|
+
throw std::runtime_error("Failed to initialize message digest");
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
// No digest for pure signature schemes like ML-DSA
|
|
48
|
+
md = nullptr;
|
|
49
|
+
md_ctx = EVP_MD_CTX_new();
|
|
50
|
+
if (!md_ctx) {
|
|
51
|
+
throw std::runtime_error("Failed to create message digest context");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void HybridVerifyHandle::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
57
|
+
if (!md_ctx) {
|
|
58
|
+
throw std::runtime_error("Verify not initialized");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
auto native_data = ToNativeArrayBuffer(data);
|
|
62
|
+
|
|
63
|
+
// Accumulate raw data for potential one-shot verification (Ed25519/Ed448/ML-DSA)
|
|
64
|
+
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
65
|
+
data_buffer.insert(data_buffer.end(), ptr, ptr + native_data->size());
|
|
66
|
+
|
|
67
|
+
// Only update digest if we have one (not needed for pure signature schemes)
|
|
68
|
+
if (md != nullptr) {
|
|
69
|
+
if (EVP_DigestUpdate(md_ctx, native_data->data(), native_data->size()) <= 0) {
|
|
70
|
+
unsigned long err = ERR_get_error();
|
|
71
|
+
char err_buf[256];
|
|
72
|
+
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
73
|
+
throw std::runtime_error("Failed to update digest: " + std::string(err_buf));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Check if key type requires one-shot verification (Ed25519, Ed448, ML-DSA)
|
|
79
|
+
static bool isOneShotVariant(EVP_PKEY* pkey) {
|
|
80
|
+
int type = EVP_PKEY_id(pkey);
|
|
81
|
+
#if RNQC_HAS_ML_DSA
|
|
82
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448 || type == EVP_PKEY_ML_DSA_44 || type == EVP_PKEY_ML_DSA_65 ||
|
|
83
|
+
type == EVP_PKEY_ML_DSA_87;
|
|
84
|
+
#else
|
|
85
|
+
return type == EVP_PKEY_ED25519 || type == EVP_PKEY_ED448;
|
|
86
|
+
#endif
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Get the algorithm name for creating PKEY_CTX (for ML-DSA variants)
|
|
90
|
+
static const char* getAlgorithmName(EVP_PKEY* pkey) {
|
|
91
|
+
int type = EVP_PKEY_id(pkey);
|
|
92
|
+
#if RNQC_HAS_ML_DSA
|
|
93
|
+
switch (type) {
|
|
94
|
+
case EVP_PKEY_ML_DSA_44:
|
|
95
|
+
return "ML-DSA-44";
|
|
96
|
+
case EVP_PKEY_ML_DSA_65:
|
|
97
|
+
return "ML-DSA-65";
|
|
98
|
+
case EVP_PKEY_ML_DSA_87:
|
|
99
|
+
return "ML-DSA-87";
|
|
100
|
+
case EVP_PKEY_ED25519:
|
|
101
|
+
return "ED25519";
|
|
102
|
+
case EVP_PKEY_ED448:
|
|
103
|
+
return "ED448";
|
|
104
|
+
default:
|
|
105
|
+
return nullptr;
|
|
106
|
+
}
|
|
107
|
+
#else
|
|
108
|
+
switch (type) {
|
|
109
|
+
case EVP_PKEY_ED25519:
|
|
110
|
+
return "ED25519";
|
|
111
|
+
case EVP_PKEY_ED448:
|
|
112
|
+
return "ED448";
|
|
113
|
+
default:
|
|
114
|
+
return nullptr;
|
|
115
|
+
}
|
|
116
|
+
#endif
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
bool HybridVerifyHandle::verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
|
|
120
|
+
std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) {
|
|
121
|
+
if (!md_ctx) {
|
|
122
|
+
throw std::runtime_error("Verify not initialized");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
auto keyHandleImpl = std::static_pointer_cast<HybridKeyObjectHandle>(keyHandle);
|
|
126
|
+
EVP_PKEY* pkey = keyHandleImpl->getKeyObjectData().GetAsymmetricKey().get();
|
|
127
|
+
|
|
128
|
+
if (!pkey) {
|
|
129
|
+
throw std::runtime_error("Invalid public key for verification");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
auto native_sig = ToNativeArrayBuffer(signature);
|
|
133
|
+
const unsigned char* sig_data = native_sig->data();
|
|
134
|
+
size_t sig_len = native_sig->size();
|
|
135
|
+
|
|
136
|
+
// Ed25519/Ed448/ML-DSA require one-shot verification with EVP_DigestVerify
|
|
137
|
+
// Also use one-shot path if no digest was specified (md == nullptr)
|
|
138
|
+
if (isOneShotVariant(pkey) || md == nullptr) {
|
|
139
|
+
EVP_MD_CTX* verify_ctx = EVP_MD_CTX_new();
|
|
140
|
+
if (!verify_ctx) {
|
|
141
|
+
throw std::runtime_error("Failed to create verification context");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Get algorithm name and create PKEY_CTX for ML-DSA
|
|
145
|
+
const char* alg_name = getAlgorithmName(pkey);
|
|
146
|
+
EVP_PKEY_CTX* pkey_ctx = nullptr;
|
|
147
|
+
if (alg_name != nullptr) {
|
|
148
|
+
pkey_ctx = EVP_PKEY_CTX_new_from_name(nullptr, alg_name, nullptr);
|
|
149
|
+
if (!pkey_ctx) {
|
|
150
|
+
EVP_MD_CTX_free(verify_ctx);
|
|
151
|
+
throw std::runtime_error(std::string("Failed to create verification context for ") + alg_name);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Initialize for one-shot verification (pass nullptr for md - these algorithms have built-in hash)
|
|
156
|
+
if (EVP_DigestVerifyInit(verify_ctx, pkey_ctx ? &pkey_ctx : nullptr, nullptr, nullptr, pkey) <= 0) {
|
|
157
|
+
EVP_MD_CTX_free(verify_ctx);
|
|
158
|
+
if (pkey_ctx)
|
|
159
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
160
|
+
throw std::runtime_error("Failed to initialize one-shot verification");
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
int result = EVP_DigestVerify(verify_ctx, sig_data, sig_len, data_buffer.data(), data_buffer.size());
|
|
164
|
+
EVP_MD_CTX_free(verify_ctx);
|
|
165
|
+
return result == 1;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Standard verification flow for RSA/ECDSA
|
|
169
|
+
unsigned char digest[EVP_MAX_MD_SIZE];
|
|
170
|
+
unsigned int digest_len = 0;
|
|
171
|
+
|
|
172
|
+
if (EVP_DigestFinal_ex(md_ctx, digest, &digest_len) <= 0) {
|
|
173
|
+
throw std::runtime_error("Failed to finalize digest");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
std::unique_ptr<uint8_t[]> der_sig_buf;
|
|
177
|
+
int dsa_enc = dsaEncoding.has_value() ? static_cast<int>(dsaEncoding.value()) : kSigEncDER;
|
|
178
|
+
if (dsa_enc == kSigEncP1363) {
|
|
179
|
+
unsigned int n = getBytesOfRS(pkey);
|
|
180
|
+
if (n > 0) {
|
|
181
|
+
size_t der_len = 0;
|
|
182
|
+
der_sig_buf = convertSignatureToDER(sig_data, sig_len, n, &der_len);
|
|
183
|
+
if (der_sig_buf) {
|
|
184
|
+
sig_data = der_sig_buf.get();
|
|
185
|
+
sig_len = der_len;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
EVP_PKEY_CTX* pkey_ctx = EVP_PKEY_CTX_new(pkey, nullptr);
|
|
191
|
+
if (!pkey_ctx) {
|
|
192
|
+
throw std::runtime_error("Failed to create verification context");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (EVP_PKEY_verify_init(pkey_ctx) <= 0) {
|
|
196
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
197
|
+
throw std::runtime_error("Failed to initialize verification");
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (padding.has_value()) {
|
|
201
|
+
int pad = static_cast<int>(padding.value());
|
|
202
|
+
if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, pad) <= 0) {
|
|
203
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
204
|
+
throw std::runtime_error("Failed to set RSA padding");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (saltLength.has_value() && padding.has_value() && static_cast<int>(padding.value()) == RSA_PKCS1_PSS_PADDING) {
|
|
209
|
+
int salt_len = static_cast<int>(saltLength.value());
|
|
210
|
+
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, salt_len) <= 0) {
|
|
211
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
212
|
+
throw std::runtime_error("Failed to set PSS salt length");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (EVP_PKEY_CTX_set_signature_md(pkey_ctx, md) <= 0) {
|
|
217
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
218
|
+
throw std::runtime_error("Failed to set signature digest");
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
int result = EVP_PKEY_verify(pkey_ctx, sig_data, sig_len, digest, digest_len);
|
|
222
|
+
EVP_PKEY_CTX_free(pkey_ctx);
|
|
223
|
+
|
|
224
|
+
return result == 1;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/evp.h>
|
|
6
|
+
#include <optional>
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "HybridKeyObjectHandleSpec.hpp"
|
|
11
|
+
#include "HybridVerifyHandleSpec.hpp"
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::crypto {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
|
|
17
|
+
class HybridVerifyHandle : public HybridVerifyHandleSpec {
|
|
18
|
+
public:
|
|
19
|
+
HybridVerifyHandle() : HybridObject(TAG) {}
|
|
20
|
+
~HybridVerifyHandle();
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
void init(const std::string& algorithm) override;
|
|
24
|
+
void update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
25
|
+
bool verify(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle, const std::shared_ptr<ArrayBuffer>& signature,
|
|
26
|
+
std::optional<double> padding, std::optional<double> saltLength, std::optional<double> dsaEncoding) override;
|
|
27
|
+
|
|
28
|
+
private:
|
|
29
|
+
EVP_MD_CTX* md_ctx = nullptr;
|
|
30
|
+
const EVP_MD* md = nullptr;
|
|
31
|
+
std::string algorithm_name;
|
|
32
|
+
// Buffer for accumulating data for one-shot verification (Ed25519/Ed448)
|
|
33
|
+
std::vector<uint8_t> data_buffer;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
} // namespace margelo::nitro::crypto
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <cstring>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#include <openssl/dsa.h>
|
|
6
|
+
#include <openssl/ec.h>
|
|
7
|
+
#include <openssl/ecdsa.h>
|
|
8
|
+
#include <openssl/evp.h>
|
|
9
|
+
#include <string>
|
|
10
|
+
|
|
11
|
+
namespace margelo::nitro::crypto {
|
|
12
|
+
|
|
13
|
+
enum DSASigEnc {
|
|
14
|
+
kSigEncDER = 0,
|
|
15
|
+
kSigEncP1363 = 1,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
inline const EVP_MD* getDigestByName(const std::string& algorithm) {
|
|
19
|
+
if (algorithm == "SHA1" || algorithm == "sha1" || algorithm == "SHA-1" || algorithm == "sha-1") {
|
|
20
|
+
return EVP_sha1();
|
|
21
|
+
} else if (algorithm == "SHA224" || algorithm == "sha224" || algorithm == "SHA-224" || algorithm == "sha-224") {
|
|
22
|
+
return EVP_sha224();
|
|
23
|
+
} else if (algorithm == "SHA256" || algorithm == "sha256" || algorithm == "SHA-256" || algorithm == "sha-256") {
|
|
24
|
+
return EVP_sha256();
|
|
25
|
+
} else if (algorithm == "SHA384" || algorithm == "sha384" || algorithm == "SHA-384" || algorithm == "sha-384") {
|
|
26
|
+
return EVP_sha384();
|
|
27
|
+
} else if (algorithm == "SHA512" || algorithm == "sha512" || algorithm == "SHA-512" || algorithm == "sha-512") {
|
|
28
|
+
return EVP_sha512();
|
|
29
|
+
} else if (algorithm == "SHA3-224" || algorithm == "sha3-224") {
|
|
30
|
+
return EVP_sha3_224();
|
|
31
|
+
} else if (algorithm == "SHA3-256" || algorithm == "sha3-256") {
|
|
32
|
+
return EVP_sha3_256();
|
|
33
|
+
} else if (algorithm == "SHA3-384" || algorithm == "sha3-384") {
|
|
34
|
+
return EVP_sha3_384();
|
|
35
|
+
} else if (algorithm == "SHA3-512" || algorithm == "sha3-512") {
|
|
36
|
+
return EVP_sha3_512();
|
|
37
|
+
}
|
|
38
|
+
throw std::runtime_error("Unsupported hash algorithm: " + algorithm);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
inline unsigned int getBytesOfRS(EVP_PKEY* pkey) {
|
|
42
|
+
int bits;
|
|
43
|
+
int base_id = EVP_PKEY_base_id(pkey);
|
|
44
|
+
|
|
45
|
+
if (base_id == EVP_PKEY_DSA) {
|
|
46
|
+
const DSA* dsa_key = EVP_PKEY_get0_DSA(pkey);
|
|
47
|
+
bits = BN_num_bits(DSA_get0_q(dsa_key));
|
|
48
|
+
} else if (base_id == EVP_PKEY_EC) {
|
|
49
|
+
const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey);
|
|
50
|
+
const EC_GROUP* ec_group = EC_KEY_get0_group(ec_key);
|
|
51
|
+
bits = EC_GROUP_order_bits(ec_group);
|
|
52
|
+
} else {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return (bits + 7) / 8;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
inline bool convertSignatureToP1363(const unsigned char* sig_data, size_t sig_len, unsigned char* out, size_t n) {
|
|
60
|
+
ECDSA_SIG* asn1_sig = d2i_ECDSA_SIG(nullptr, &sig_data, sig_len);
|
|
61
|
+
if (!asn1_sig)
|
|
62
|
+
return false;
|
|
63
|
+
|
|
64
|
+
const BIGNUM* pr = ECDSA_SIG_get0_r(asn1_sig);
|
|
65
|
+
const BIGNUM* ps = ECDSA_SIG_get0_s(asn1_sig);
|
|
66
|
+
|
|
67
|
+
bool success = BN_bn2binpad(pr, out, static_cast<int>(n)) > 0 && BN_bn2binpad(ps, out + n, static_cast<int>(n)) > 0;
|
|
68
|
+
ECDSA_SIG_free(asn1_sig);
|
|
69
|
+
return success;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
inline std::unique_ptr<uint8_t[]> convertSignatureToDER(const unsigned char* sig_data, size_t sig_len, size_t n, size_t* out_len) {
|
|
73
|
+
if (sig_len != 2 * n) {
|
|
74
|
+
return nullptr;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
ECDSA_SIG* asn1_sig = ECDSA_SIG_new();
|
|
78
|
+
if (!asn1_sig)
|
|
79
|
+
return nullptr;
|
|
80
|
+
|
|
81
|
+
BIGNUM* r = BN_bin2bn(sig_data, static_cast<int>(n), nullptr);
|
|
82
|
+
BIGNUM* s = BN_bin2bn(sig_data + n, static_cast<int>(n), nullptr);
|
|
83
|
+
|
|
84
|
+
if (!r || !s || !ECDSA_SIG_set0(asn1_sig, r, s)) {
|
|
85
|
+
if (r)
|
|
86
|
+
BN_free(r);
|
|
87
|
+
if (s)
|
|
88
|
+
BN_free(s);
|
|
89
|
+
ECDSA_SIG_free(asn1_sig);
|
|
90
|
+
return nullptr;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
int der_len = i2d_ECDSA_SIG(asn1_sig, nullptr);
|
|
94
|
+
if (der_len <= 0) {
|
|
95
|
+
ECDSA_SIG_free(asn1_sig);
|
|
96
|
+
return nullptr;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
auto der_buf = std::make_unique<uint8_t[]>(der_len);
|
|
100
|
+
unsigned char* der_ptr = der_buf.get();
|
|
101
|
+
i2d_ECDSA_SIG(asn1_sig, &der_ptr);
|
|
102
|
+
|
|
103
|
+
ECDSA_SIG_free(asn1_sig);
|
|
104
|
+
*out_len = der_len;
|
|
105
|
+
return der_buf;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
} // namespace margelo::nitro::crypto
|