@ohos-ports/react-native-quick-crypto 0.0.0-stage → 1.1.8-beta.0
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 +259 -0
- package/README.md +170 -2
- package/android/CMakeLists.txt +155 -0
- package/android/build.gradle +176 -0
- package/android/gradle.properties +6 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/cpp/cpp-adapter.cpp +8 -0
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +41 -0
- package/app.plugin.js +3 -0
- package/cpp/argon2/HybridArgon2.cpp +110 -0
- package/cpp/argon2/HybridArgon2.hpp +32 -0
- package/cpp/blake3/HybridBlake3.cpp +120 -0
- package/cpp/blake3/HybridBlake3.hpp +35 -0
- package/cpp/certificate/HybridCertificate.cpp +42 -0
- package/cpp/certificate/HybridCertificate.hpp +16 -0
- package/cpp/cipher/CCMCipher.cpp +211 -0
- package/cpp/cipher/CCMCipher.hpp +24 -0
- package/cpp/cipher/ChaCha20Cipher.cpp +91 -0
- package/cpp/cipher/ChaCha20Cipher.hpp +23 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +175 -0
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +27 -0
- package/cpp/cipher/GCMCipher.cpp +65 -0
- package/cpp/cipher/GCMCipher.hpp +14 -0
- package/cpp/cipher/HybridCipher.cpp +403 -0
- package/cpp/cipher/HybridCipher.hpp +90 -0
- package/cpp/cipher/HybridCipherFactory.hpp +119 -0
- package/cpp/cipher/HybridRsaCipher.cpp +477 -0
- package/cpp/cipher/HybridRsaCipher.hpp +33 -0
- package/cpp/cipher/OCBCipher.cpp +55 -0
- package/cpp/cipher/OCBCipher.hpp +19 -0
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +158 -0
- package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +42 -0
- package/cpp/cipher/XSalsa20Cipher.cpp +127 -0
- package/cpp/cipher/XSalsa20Cipher.hpp +55 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +138 -0
- package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +41 -0
- package/cpp/dh/HybridDhKeyPair.cpp +179 -0
- package/cpp/dh/HybridDhKeyPair.hpp +37 -0
- package/cpp/dh/HybridDiffieHellman.cpp +482 -0
- package/cpp/dh/HybridDiffieHellman.hpp +42 -0
- package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
- package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
- package/cpp/ec/HybridEcKeyPair.cpp +481 -0
- package/cpp/ec/HybridEcKeyPair.hpp +45 -0
- package/cpp/ecdh/HybridECDH.cpp +251 -0
- package/cpp/ecdh/HybridECDH.hpp +43 -0
- package/cpp/ed25519/HybridEdKeyPair.cpp +360 -0
- package/cpp/ed25519/HybridEdKeyPair.hpp +67 -0
- package/cpp/hash/HybridHash.cpp +190 -0
- package/cpp/hash/HybridHash.hpp +43 -0
- package/cpp/hkdf/HybridHkdf.cpp +115 -0
- package/cpp/hkdf/HybridHkdf.hpp +29 -0
- package/cpp/hmac/HybridHmac.cpp +102 -0
- package/cpp/hmac/HybridHmac.hpp +32 -0
- package/cpp/keys/HybridKeyObjectHandle.cpp +1519 -0
- package/cpp/keys/HybridKeyObjectHandle.hpp +78 -0
- package/cpp/keys/KeyObjectData.cpp +298 -0
- package/cpp/keys/KeyObjectData.hpp +73 -0
- package/cpp/keys/node.h +5 -0
- package/cpp/kmac/HybridKmac.cpp +83 -0
- package/cpp/kmac/HybridKmac.hpp +31 -0
- package/cpp/mldsa/HybridMlDsaKeyPair.cpp +243 -0
- package/cpp/mldsa/HybridMlDsaKeyPair.hpp +49 -0
- package/cpp/mlkem/HybridMlKemKeyPair.cpp +315 -0
- package/cpp/mlkem/HybridMlKemKeyPair.hpp +48 -0
- package/cpp/pbkdf2/HybridPbkdf2.cpp +50 -0
- package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
- package/cpp/prime/HybridPrime.cpp +81 -0
- package/cpp/prime/HybridPrime.hpp +20 -0
- package/cpp/random/HybridRandom.cpp +48 -0
- package/cpp/random/HybridRandom.hpp +32 -0
- package/cpp/rsa/HybridRsaKeyPair.cpp +151 -0
- package/cpp/rsa/HybridRsaKeyPair.hpp +40 -0
- package/cpp/scrypt/HybridScrypt.cpp +64 -0
- package/cpp/scrypt/HybridScrypt.hpp +28 -0
- package/cpp/sign/HybridSignHandle.cpp +241 -0
- package/cpp/sign/HybridSignHandle.hpp +36 -0
- package/cpp/sign/HybridVerifyHandle.cpp +207 -0
- package/cpp/sign/HybridVerifyHandle.hpp +36 -0
- package/cpp/sign/SignUtils.hpp +91 -0
- package/cpp/slhdsa/HybridSlhDsaKeyPair.cpp +245 -0
- package/cpp/slhdsa/HybridSlhDsaKeyPair.hpp +48 -0
- package/cpp/turboshake/HybridTurboShake.cpp +379 -0
- package/cpp/turboshake/HybridTurboShake.hpp +28 -0
- package/cpp/utils/HybridUtils.cpp +399 -0
- package/cpp/utils/HybridUtils.hpp +28 -0
- package/cpp/utils/Macros.hpp +68 -0
- package/cpp/utils/QuickCryptoUtils.cpp +44 -0
- package/cpp/utils/QuickCryptoUtils.hpp +186 -0
- package/cpp/utils/base64.h +309 -0
- package/cpp/x509/HybridX509Certificate.cpp +174 -0
- package/cpp/x509/HybridX509Certificate.hpp +51 -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 +228 -0
- package/deps/blake3/c/README.md +403 -0
- package/deps/blake3/c/blake3.c +651 -0
- package/deps/blake3/c/blake3.h +86 -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 +367 -0
- package/deps/blake3/c/blake3_portable.c +160 -0
- package/deps/fastpbkdf2/fastpbkdf2.c +356 -0
- package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
- package/deps/ncrypto/LICENSE +21 -0
- package/deps/ncrypto/README.md +18 -0
- package/deps/ncrypto/include/dh-primes.h +67 -0
- package/deps/ncrypto/include/ncrypto/aead.h +137 -0
- package/deps/ncrypto/include/ncrypto/version.h +14 -0
- package/deps/ncrypto/include/ncrypto.h +1759 -0
- package/deps/ncrypto/src/aead.cpp +302 -0
- package/deps/ncrypto/src/engine.cpp +93 -0
- package/deps/ncrypto/src/ncrypto.cpp +5426 -0
- package/deps/simdutf/LICENSE-APACHE +201 -0
- package/deps/simdutf/LICENSE-MIT +18 -0
- package/deps/simdutf/README.md +2782 -0
- package/deps/simdutf/include/simdutf/avx512.h +79 -0
- package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
- package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
- package/deps/simdutf/include/simdutf/common_defs.h +186 -0
- package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
- package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
- package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
- package/deps/simdutf/include/simdutf/error.h +126 -0
- package/deps/simdutf/include/simdutf/implementation.h +7081 -0
- package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
- package/deps/simdutf/include/simdutf/portability.h +285 -0
- package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
- package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
- package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
- package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
- package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
- package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
- package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
- package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
- package/deps/simdutf/include/simdutf.h +26 -0
- package/deps/simdutf/include/simdutf_c.h +342 -0
- package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
- package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
- package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
- package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
- package/deps/simdutf/src/encoding_types.cpp +67 -0
- package/deps/simdutf/src/error.cpp +3 -0
- package/deps/simdutf/src/fallback/implementation.cpp +589 -0
- package/deps/simdutf/src/generic/ascii_validation.h +50 -0
- package/deps/simdutf/src/generic/base64.h +233 -0
- package/deps/simdutf/src/generic/base64lengths.h +63 -0
- package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
- package/deps/simdutf/src/generic/find.h +75 -0
- package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
- package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
- package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
- package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
- package/deps/simdutf/src/generic/utf16.h +73 -0
- package/deps/simdutf/src/generic/utf32.h +136 -0
- package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
- package/deps/simdutf/src/generic/utf8.h +92 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
- package/deps/simdutf/src/generic/validate_utf16.h +164 -0
- package/deps/simdutf/src/generic/validate_utf32.h +99 -0
- package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
- package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
- package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
- package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
- package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
- package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
- package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
- package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
- package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
- package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
- package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
- package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
- package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
- package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
- package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
- package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
- package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
- package/deps/simdutf/src/implementation.cpp +2526 -0
- package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
- package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
- package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
- package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
- package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
- package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
- package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
- package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
- package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
- package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
- package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
- package/deps/simdutf/src/ppc64/templates.cpp +91 -0
- package/deps/simdutf/src/rvv/implementation.cpp +138 -0
- package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
- package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
- package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
- package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
- package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
- package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
- package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
- package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
- package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
- package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
- package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
- package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
- package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
- package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
- package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
- package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
- package/deps/simdutf/src/simdutf/arm64.h +43 -0
- package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
- package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
- package/deps/simdutf/src/simdutf/fallback.h +42 -0
- package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
- package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
- package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
- package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
- package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
- package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
- package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
- package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
- package/deps/simdutf/src/simdutf/haswell.h +63 -0
- package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
- package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
- package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
- package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
- package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
- package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
- package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
- package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
- package/deps/simdutf/src/simdutf/icelake.h +81 -0
- package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
- package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
- package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
- package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
- package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
- package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
- package/deps/simdutf/src/simdutf/lasx.h +49 -0
- package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
- package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
- package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
- package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
- package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
- package/deps/simdutf/src/simdutf/lsx.h +52 -0
- package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
- package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
- package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
- package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
- package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
- package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
- package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
- package/deps/simdutf/src/simdutf/ppc64.h +40 -0
- package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
- package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
- package/deps/simdutf/src/simdutf/rvv.h +41 -0
- package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
- package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
- package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
- package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
- package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
- package/deps/simdutf/src/simdutf/westmere.h +59 -0
- package/deps/simdutf/src/simdutf.cpp +152 -0
- package/deps/simdutf/src/simdutf_c.cpp +525 -0
- package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
- package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
- package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
- package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
- package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
- package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
- package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
- package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
- package/jest/index.js +16 -0
- package/lib/commonjs/argon2.js +88 -0
- package/lib/commonjs/argon2.js.map +1 -0
- package/lib/commonjs/blake3.js +99 -0
- package/lib/commonjs/blake3.js.map +1 -0
- package/lib/commonjs/certificate.js +35 -0
- package/lib/commonjs/certificate.js.map +1 -0
- package/lib/commonjs/cipher.js +299 -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/dh-groups.js +29 -0
- package/lib/commonjs/dh-groups.js.map +1 -0
- package/lib/commonjs/dhKeyPair.js +112 -0
- package/lib/commonjs/dhKeyPair.js.map +1 -0
- package/lib/commonjs/diffie-hellman.js +151 -0
- package/lib/commonjs/diffie-hellman.js.map +1 -0
- package/lib/commonjs/dsa.js +101 -0
- package/lib/commonjs/dsa.js.map +1 -0
- package/lib/commonjs/ec.js +370 -0
- package/lib/commonjs/ec.js.map +1 -0
- package/lib/commonjs/ecdh.js +109 -0
- package/lib/commonjs/ecdh.js.map +1 -0
- package/lib/commonjs/ed.js +443 -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 +23 -0
- package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/commonjs/expo-plugin/withXCode.js +109 -0
- package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
- package/lib/commonjs/hash.js +291 -0
- package/lib/commonjs/hash.js.map +1 -0
- package/lib/commonjs/hkdf.js +178 -0
- package/lib/commonjs/hkdf.js.map +1 -0
- package/lib/commonjs/hmac.js +125 -0
- package/lib/commonjs/hmac.js.map +1 -0
- package/lib/commonjs/index.js +356 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/keys/classes.js +280 -0
- package/lib/commonjs/keys/classes.js.map +1 -0
- package/lib/commonjs/keys/generateKeyPair.js +237 -0
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
- package/lib/commonjs/keys/index.js +381 -0
- package/lib/commonjs/keys/index.js.map +1 -0
- package/lib/commonjs/keys/publicCipher.js +171 -0
- package/lib/commonjs/keys/publicCipher.js.map +1 -0
- package/lib/commonjs/keys/signVerify.js +227 -0
- package/lib/commonjs/keys/signVerify.js.map +1 -0
- package/lib/commonjs/keys/utils.js +181 -0
- package/lib/commonjs/keys/utils.js.map +1 -0
- package/lib/commonjs/mldsa.js +69 -0
- package/lib/commonjs/mldsa.js.map +1 -0
- package/lib/commonjs/mlkem.js +219 -0
- package/lib/commonjs/mlkem.js.map +1 -0
- package/lib/commonjs/native-nitro-bridge.js +344 -0
- package/lib/commonjs/nitro-node-shim.js +23 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/pbkdf2.js +106 -0
- package/lib/commonjs/pbkdf2.js.map +1 -0
- package/lib/commonjs/prime.js +84 -0
- package/lib/commonjs/prime.js.map +1 -0
- package/lib/commonjs/random.js +296 -0
- package/lib/commonjs/random.js.map +1 -0
- package/lib/commonjs/rsa.js +213 -0
- package/lib/commonjs/rsa.js.map +1 -0
- package/lib/commonjs/scrypt.js +139 -0
- package/lib/commonjs/scrypt.js.map +1 -0
- package/lib/commonjs/slhdsa.js +70 -0
- package/lib/commonjs/slhdsa.js.map +1 -0
- package/lib/commonjs/specs/argon2.nitro.js +6 -0
- package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
- package/lib/commonjs/specs/blake3.nitro.js +6 -0
- package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
- package/lib/commonjs/specs/certificate.nitro.js +6 -0
- package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
- package/lib/commonjs/specs/cipher.nitro.js +6 -0
- package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/diffie-hellman.nitro.js +6 -0
- package/lib/commonjs/specs/diffie-hellman.nitro.js.map +1 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/ecdh.nitro.js +6 -0
- package/lib/commonjs/specs/ecdh.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/hkdf.nitro.js +6 -0
- package/lib/commonjs/specs/hkdf.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/kmac.nitro.js +6 -0
- package/lib/commonjs/specs/kmac.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/mlKemKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/mlKemKeyPair.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/prime.nitro.js +6 -0
- package/lib/commonjs/specs/prime.nitro.js.map +1 -0
- package/lib/commonjs/specs/random.nitro.js +6 -0
- package/lib/commonjs/specs/random.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/scrypt.nitro.js +6 -0
- package/lib/commonjs/specs/scrypt.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/specs/slhDsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/slhDsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/turboshake.nitro.js +6 -0
- package/lib/commonjs/specs/turboshake.nitro.js.map +1 -0
- package/lib/commonjs/specs/utils.nitro.js +6 -0
- package/lib/commonjs/specs/utils.nitro.js.map +1 -0
- package/lib/commonjs/specs/x509certificate.nitro.js +6 -0
- package/lib/commonjs/specs/x509certificate.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +3211 -0
- package/lib/commonjs/subtle.js.map +1 -0
- package/lib/commonjs/utils/cipher.js +75 -0
- package/lib/commonjs/utils/cipher.js.map +1 -0
- package/lib/commonjs/utils/conversion.js +249 -0
- package/lib/commonjs/utils/conversion.js.map +1 -0
- package/lib/commonjs/utils/errors.js +73 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/hashnames.js +122 -0
- package/lib/commonjs/utils/hashnames.js.map +1 -0
- package/lib/commonjs/utils/index.js +83 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/noble.js +82 -0
- package/lib/commonjs/utils/noble.js.map +1 -0
- package/lib/commonjs/utils/timingSafeEqual.js +29 -0
- package/lib/commonjs/utils/timingSafeEqual.js.map +1 -0
- package/lib/commonjs/utils/types.js +55 -0
- package/lib/commonjs/utils/types.js.map +1 -0
- package/lib/commonjs/utils/validation.js +144 -0
- package/lib/commonjs/utils/validation.js.map +1 -0
- package/lib/commonjs/x509certificate.js +189 -0
- package/lib/commonjs/x509certificate.js.map +1 -0
- package/lib/module/argon2.js +83 -0
- package/lib/module/argon2.js.map +1 -0
- package/lib/module/blake3.js +91 -0
- package/lib/module/blake3.js.map +1 -0
- package/lib/module/certificate.js +30 -0
- package/lib/module/certificate.js.map +1 -0
- package/lib/module/cipher.js +291 -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/dh-groups.js +25 -0
- package/lib/module/dh-groups.js.map +1 -0
- package/lib/module/dhKeyPair.js +105 -0
- package/lib/module/dhKeyPair.js.map +1 -0
- package/lib/module/diffie-hellman.js +145 -0
- package/lib/module/diffie-hellman.js.map +1 -0
- package/lib/module/dsa.js +94 -0
- package/lib/module/dsa.js.map +1 -0
- package/lib/module/ec.js +358 -0
- package/lib/module/ec.js.map +1 -0
- package/lib/module/ecdh.js +103 -0
- package/lib/module/ecdh.js.map +1 -0
- package/lib/module/ed.js +433 -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 +17 -0
- package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
- package/lib/module/expo-plugin/withXCode.js +101 -0
- package/lib/module/expo-plugin/withXCode.js.map +1 -0
- package/lib/module/hash.js +282 -0
- package/lib/module/hash.js.map +1 -0
- package/lib/module/hkdf.js +168 -0
- package/lib/module/hkdf.js.map +1 -0
- package/lib/module/hmac.js +120 -0
- package/lib/module/hmac.js.map +1 -0
- package/lib/module/index.js +115 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/keys/classes.js +271 -0
- package/lib/module/keys/classes.js.map +1 -0
- package/lib/module/keys/generateKeyPair.js +231 -0
- package/lib/module/keys/generateKeyPair.js.map +1 -0
- package/lib/module/keys/index.js +246 -0
- package/lib/module/keys/index.js.map +1 -0
- package/lib/module/keys/publicCipher.js +164 -0
- package/lib/module/keys/publicCipher.js.map +1 -0
- package/lib/module/keys/signVerify.js +217 -0
- package/lib/module/keys/signVerify.js.map +1 -0
- package/lib/module/keys/utils.js +170 -0
- package/lib/module/keys/utils.js.map +1 -0
- package/lib/module/mldsa.js +63 -0
- package/lib/module/mldsa.js.map +1 -0
- package/lib/module/mlkem.js +211 -0
- package/lib/module/mlkem.js.map +1 -0
- package/lib/module/pbkdf2.js +100 -0
- package/lib/module/pbkdf2.js.map +1 -0
- package/lib/module/prime.js +77 -0
- package/lib/module/prime.js.map +1 -0
- package/lib/module/random.js +284 -0
- package/lib/module/random.js.map +1 -0
- package/lib/module/rsa.js +205 -0
- package/lib/module/rsa.js.map +1 -0
- package/lib/module/scrypt.js +134 -0
- package/lib/module/scrypt.js.map +1 -0
- package/lib/module/slhdsa.js +64 -0
- package/lib/module/slhdsa.js.map +1 -0
- package/lib/module/specs/argon2.nitro.js +4 -0
- package/lib/module/specs/argon2.nitro.js.map +1 -0
- package/lib/module/specs/blake3.nitro.js +4 -0
- package/lib/module/specs/blake3.nitro.js.map +1 -0
- package/lib/module/specs/certificate.nitro.js +4 -0
- package/lib/module/specs/certificate.nitro.js.map +1 -0
- package/lib/module/specs/cipher.nitro.js +4 -0
- package/lib/module/specs/cipher.nitro.js.map +1 -0
- package/lib/module/specs/dhKeyPair.nitro.js +4 -0
- package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/diffie-hellman.nitro.js +4 -0
- package/lib/module/specs/diffie-hellman.nitro.js.map +1 -0
- package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/ecKeyPair.nitro.js +4 -0
- package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/ecdh.nitro.js +4 -0
- package/lib/module/specs/ecdh.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/hkdf.nitro.js +4 -0
- package/lib/module/specs/hkdf.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/kmac.nitro.js +4 -0
- package/lib/module/specs/kmac.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/mlKemKeyPair.nitro.js +4 -0
- package/lib/module/specs/mlKemKeyPair.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/prime.nitro.js +4 -0
- package/lib/module/specs/prime.nitro.js.map +1 -0
- package/lib/module/specs/random.nitro.js +4 -0
- package/lib/module/specs/random.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/scrypt.nitro.js +4 -0
- package/lib/module/specs/scrypt.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/specs/slhDsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/slhDsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/turboshake.nitro.js +4 -0
- package/lib/module/specs/turboshake.nitro.js.map +1 -0
- package/lib/module/specs/utils.nitro.js +4 -0
- package/lib/module/specs/utils.nitro.js.map +1 -0
- package/lib/module/specs/x509certificate.nitro.js +4 -0
- package/lib/module/specs/x509certificate.nitro.js.map +1 -0
- package/lib/module/subtle.js +3205 -0
- package/lib/module/subtle.js.map +1 -0
- package/lib/module/utils/cipher.js +67 -0
- package/lib/module/utils/cipher.js.map +1 -0
- package/lib/module/utils/conversion.js +205 -0
- package/lib/module/utils/conversion.js.map +1 -0
- package/lib/module/utils/errors.js +67 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/hashnames.js +120 -0
- package/lib/module/utils/hashnames.js.map +1 -0
- package/lib/module/utils/index.js +10 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/noble.js +76 -0
- package/lib/module/utils/noble.js.map +1 -0
- package/lib/module/utils/timingSafeEqual.js +25 -0
- package/lib/module/utils/timingSafeEqual.js.map +1 -0
- package/lib/module/utils/types.js +57 -0
- package/lib/module/utils/types.js.map +1 -0
- package/lib/module/utils/validation.js +131 -0
- package/lib/module/utils/validation.js.map +1 -0
- package/lib/module/x509certificate.js +184 -0
- package/lib/module/x509certificate.js.map +1 -0
- package/lib/typescript/argon2.d.ts +16 -0
- package/lib/typescript/argon2.d.ts.map +1 -0
- package/lib/typescript/blake3.d.ts +33 -0
- package/lib/typescript/blake3.d.ts.map +1 -0
- package/lib/typescript/certificate.d.ts +8 -0
- package/lib/typescript/certificate.d.ts.map +1 -0
- package/lib/typescript/cipher.d.ts +75 -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/dh-groups.d.ts +5 -0
- package/lib/typescript/dh-groups.d.ts.map +1 -0
- package/lib/typescript/dhKeyPair.d.ts +19 -0
- package/lib/typescript/dhKeyPair.d.ts.map +1 -0
- package/lib/typescript/diffie-hellman.d.ts +18 -0
- package/lib/typescript/diffie-hellman.d.ts.map +1 -0
- package/lib/typescript/dsa.d.ts +19 -0
- package/lib/typescript/dsa.d.ts.map +1 -0
- package/lib/typescript/ec.d.ts +24 -0
- package/lib/typescript/ec.d.ts.map +1 -0
- package/lib/typescript/ecdh.d.ts +19 -0
- package/lib/typescript/ecdh.d.ts.map +1 -0
- package/lib/typescript/ed.d.ts +47 -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 +23 -0
- package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
- package/lib/typescript/hash.d.ts +126 -0
- package/lib/typescript/hash.d.ts.map +1 -0
- package/lib/typescript/hkdf.d.ts +26 -0
- package/lib/typescript/hkdf.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 +240 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/keys/classes.d.ts +95 -0
- package/lib/typescript/keys/classes.d.ts.map +1 -0
- package/lib/typescript/keys/generateKeyPair.d.ts +17 -0
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
- package/lib/typescript/keys/index.d.ts +26 -0
- package/lib/typescript/keys/index.d.ts.map +1 -0
- package/lib/typescript/keys/publicCipher.d.ts +23 -0
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
- package/lib/typescript/keys/signVerify.d.ts +35 -0
- package/lib/typescript/keys/signVerify.d.ts.map +1 -0
- package/lib/typescript/keys/utils.d.ts +51 -0
- package/lib/typescript/keys/utils.d.ts.map +1 -0
- package/lib/typescript/mldsa.d.ts +18 -0
- package/lib/typescript/mldsa.d.ts.map +1 -0
- package/lib/typescript/mlkem.d.ts +30 -0
- package/lib/typescript/mlkem.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/prime.d.ts +19 -0
- package/lib/typescript/prime.d.ts.map +1 -0
- package/lib/typescript/random.d.ts +31 -0
- package/lib/typescript/random.d.ts.map +1 -0
- package/lib/typescript/rsa.d.ts +20 -0
- package/lib/typescript/rsa.d.ts.map +1 -0
- package/lib/typescript/scrypt.d.ts +18 -0
- package/lib/typescript/scrypt.d.ts.map +1 -0
- package/lib/typescript/slhdsa.d.ts +19 -0
- package/lib/typescript/slhdsa.d.ts.map +1 -0
- package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
- package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
- package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
- package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/cipher.nitro.d.ts +38 -0
- package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
- package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts +18 -0
- package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
- package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts +21 -0
- package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/ecdh.nitro.d.ts +15 -0
- package/lib/typescript/specs/ecdh.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/hkdf.nitro.d.ts +10 -0
- package/lib/typescript/specs/hkdf.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 +27 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/kmac.nitro.d.ts +10 -0
- package/lib/typescript/specs/kmac.nitro.d.ts.map +1 -0
- 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/mlKemKeyPair.nitro.d.ts +18 -0
- package/lib/typescript/specs/mlKemKeyPair.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/prime.nitro.d.ts +11 -0
- package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/random.nitro.d.ts +9 -0
- package/lib/typescript/specs/random.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/rsaCipher.nitro.d.ts +54 -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/scrypt.nitro.d.ts +9 -0
- package/lib/typescript/specs/scrypt.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/specs/slhDsaKeyPair.nitro.d.ts +16 -0
- package/lib/typescript/specs/slhDsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/turboshake.nitro.d.ts +11 -0
- package/lib/typescript/specs/turboshake.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/utils.nitro.d.ts +8 -0
- package/lib/typescript/specs/utils.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/x509certificate.nitro.d.ts +34 -0
- package/lib/typescript/specs/x509certificate.nitro.d.ts.map +1 -0
- package/lib/typescript/subtle.d.ts +33 -0
- package/lib/typescript/subtle.d.ts.map +1 -0
- package/lib/typescript/utils/cipher.d.ts +19 -0
- package/lib/typescript/utils/cipher.d.ts.map +1 -0
- package/lib/typescript/utils/conversion.d.ts +36 -0
- package/lib/typescript/utils/conversion.d.ts.map +1 -0
- package/lib/typescript/utils/errors.d.ts +19 -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 +8 -0
- package/lib/typescript/utils/index.d.ts.map +1 -0
- package/lib/typescript/utils/noble.d.ts +19 -0
- package/lib/typescript/utils/noble.d.ts.map +1 -0
- package/lib/typescript/utils/timingSafeEqual.d.ts +3 -0
- package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -0
- package/lib/typescript/utils/types.d.ts +314 -0
- package/lib/typescript/utils/types.d.ts.map +1 -0
- package/lib/typescript/utils/validation.d.ts +15 -0
- package/lib/typescript/utils/validation.d.ts.map +1 -0
- package/lib/typescript/x509certificate.d.ts +64 -0
- package/lib/typescript/x509certificate.d.ts.map +1 -0
- package/nitrogen/generated/.gitattributes +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +110 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +27 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +334 -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 +60 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +38 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +325 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +16 -0
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +176 -0
- package/nitrogen/generated/shared/c++/CipherArgs.hpp +101 -0
- package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
- package/nitrogen/generated/shared/c++/HkdfMode.hpp +80 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +78 -0
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
- package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +31 -0
- package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
- package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +28 -0
- package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +70 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +30 -0
- package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +76 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +30 -0
- package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
- package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +67 -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 +39 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +107 -0
- package/nitrogen/generated/shared/c++/HybridKmacSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridKmacSpec.hpp +66 -0
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.cpp +31 -0
- package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.hpp +74 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +65 -0
- package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +64 -0
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +25 -0
- package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +71 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +75 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +64 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.hpp +70 -0
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +62 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +69 -0
- package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.cpp +46 -0
- package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.hpp +96 -0
- package/nitrogen/generated/shared/c++/JWK.hpp +185 -0
- package/nitrogen/generated/shared/c++/JWKkty.hpp +92 -0
- package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
- package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
- package/nitrogen/generated/shared/c++/KangarooTwelveVariant.hpp +76 -0
- package/nitrogen/generated/shared/c++/KeyDetail.hpp +108 -0
- package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
- package/nitrogen/generated/shared/c++/KeyObject.hpp +83 -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/nitrogen/generated/shared/c++/TurboShakeVariant.hpp +76 -0
- package/ohos/binding.gyp +33 -0
- package/ohos/build/Release/quick_crypto.node +0 -0
- package/ohos/quick_crypto_napi.cpp +1316 -0
- package/package.json +158 -4
- package/src/argon2.ts +161 -0
- package/src/blake3.ts +124 -0
- package/src/certificate.ts +41 -0
- package/src/cipher.ts +497 -0
- package/src/constants.ts +32 -0
- package/src/dh-groups.ts +27 -0
- package/src/dhKeyPair.ts +164 -0
- package/src/diffie-hellman.ts +195 -0
- package/src/dsa.ts +146 -0
- package/src/ec.ts +580 -0
- package/src/ecdh.ts +132 -0
- package/src/ed.ts +605 -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 +25 -0
- package/src/expo-plugin/withXCode.ts +134 -0
- package/src/hash.ts +433 -0
- package/src/hkdf.ts +327 -0
- package/src/hmac.ts +150 -0
- package/src/index.ts +126 -0
- package/src/keys/classes.ts +369 -0
- package/src/keys/generateKeyPair.ts +358 -0
- package/src/keys/index.ts +383 -0
- package/src/keys/publicCipher.ts +256 -0
- package/src/keys/signVerify.ts +329 -0
- package/src/keys/utils.ts +263 -0
- package/src/mldsa.ts +125 -0
- package/src/mlkem.ts +350 -0
- package/src/pbkdf2.ts +183 -0
- package/src/prime.ts +134 -0
- package/src/random.ts +427 -0
- package/src/rsa.ts +333 -0
- package/src/scrypt.ts +201 -0
- package/src/slhdsa.ts +146 -0
- package/src/specs/argon2.nitro.ts +29 -0
- package/src/specs/blake3.nitro.ts +12 -0
- package/src/specs/certificate.nitro.ts +8 -0
- package/src/specs/cipher.nitro.ts +39 -0
- package/src/specs/dhKeyPair.nitro.ts +14 -0
- package/src/specs/diffie-hellman.nitro.ts +16 -0
- package/src/specs/dsaKeyPair.nitro.ts +13 -0
- package/src/specs/ecKeyPair.nitro.ts +40 -0
- package/src/specs/ecdh.nitro.ts +12 -0
- package/src/specs/edKeyPair.nitro.ts +43 -0
- package/src/specs/hash.nitro.ts +10 -0
- package/src/specs/hkdf.nitro.ts +25 -0
- package/src/specs/hmac.nitro.ts +7 -0
- package/src/specs/keyObjectHandle.nitro.ts +56 -0
- package/src/specs/kmac.nitro.ts +12 -0
- package/src/specs/mlDsaKeyPair.nitro.ts +29 -0
- package/src/specs/mlKemKeyPair.nitro.ts +32 -0
- package/src/specs/pbkdf2.nitro.ts +18 -0
- package/src/specs/prime.nitro.ts +18 -0
- package/src/specs/random.nitro.ts +14 -0
- package/src/specs/rsaCipher.nitro.ts +82 -0
- package/src/specs/rsaKeyPair.nitro.ts +33 -0
- package/src/specs/scrypt.nitro.ts +23 -0
- package/src/specs/sign.nitro.ts +31 -0
- package/src/specs/slhDsaKeyPair.nitro.ts +29 -0
- package/src/specs/turboshake.nitro.ts +21 -0
- package/src/specs/utils.nitro.ts +5 -0
- package/src/specs/x509certificate.nitro.ts +38 -0
- package/src/subtle.ts +4545 -0
- package/src/utils/cipher.ts +82 -0
- package/src/utils/conversion.ts +285 -0
- package/src/utils/errors.ts +83 -0
- package/src/utils/hashnames.ts +129 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/noble.ts +85 -0
- package/src/utils/timingSafeEqual.ts +28 -0
- package/src/utils/types.ts +617 -0
- package/src/utils/validation.ts +199 -0
- package/src/x509certificate.ts +276 -0
|
@@ -0,0 +1,1519 @@
|
|
|
1
|
+
#include <cstdio>
|
|
2
|
+
#include <mutex>
|
|
3
|
+
#include <stdexcept>
|
|
4
|
+
|
|
5
|
+
#include "../utils/base64.h"
|
|
6
|
+
#include "HybridKeyObjectHandle.hpp"
|
|
7
|
+
#include "QuickCryptoUtils.hpp"
|
|
8
|
+
#include <openssl/bn.h>
|
|
9
|
+
#include <openssl/core_names.h>
|
|
10
|
+
#include <openssl/crypto.h>
|
|
11
|
+
#include <openssl/ec.h>
|
|
12
|
+
#include <openssl/evp.h>
|
|
13
|
+
#include <openssl/obj_mac.h>
|
|
14
|
+
#include <openssl/provider.h>
|
|
15
|
+
#include <openssl/rsa.h>
|
|
16
|
+
|
|
17
|
+
namespace margelo::nitro::crypto {
|
|
18
|
+
|
|
19
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30600000L
|
|
20
|
+
// Configure loaded providers to prefer seed-only PKCS#8 output for ML-DSA /
|
|
21
|
+
// ML-KEM, falling back to priv-only when no seed is available. Without this,
|
|
22
|
+
// OpenSSL defaults to "seed-priv" — a longer encoding that bundles both —
|
|
23
|
+
// which breaks interop with Node and the exact-length export check in subtle.ts.
|
|
24
|
+
// Mirrors src/crypto/crypto_util.cc in Node.
|
|
25
|
+
static void configurePqcOutputFormats() {
|
|
26
|
+
static std::once_flag once;
|
|
27
|
+
std::call_once(once, []() {
|
|
28
|
+
OSSL_PROVIDER_do_all(
|
|
29
|
+
nullptr,
|
|
30
|
+
[](OSSL_PROVIDER* provider, void*) -> int {
|
|
31
|
+
OSSL_PROVIDER_add_conf_parameter(provider, "ml-kem.output_formats", "seed-only,priv-only");
|
|
32
|
+
OSSL_PROVIDER_add_conf_parameter(provider, "ml-dsa.output_formats", "seed-only,priv-only");
|
|
33
|
+
OSSL_PROVIDER_add_conf_parameter(provider, "slh-dsa.output_formats", "seed-only,priv-only");
|
|
34
|
+
return 1;
|
|
35
|
+
},
|
|
36
|
+
nullptr);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
HybridKeyObjectHandle::HybridKeyObjectHandle() : HybridObject(TAG) {
|
|
42
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30600000L
|
|
43
|
+
// Configure once on first handle construction. Providers are guaranteed
|
|
44
|
+
// loaded by this point (any prior crypto op routed through ncrypto), and
|
|
45
|
+
// the call_once flag makes subsequent constructions cheap.
|
|
46
|
+
configurePqcOutputFormats();
|
|
47
|
+
#endif
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Helper functions for base64url encoding/decoding with BIGNUMs
|
|
51
|
+
static std::string bn_to_base64url(const BIGNUM* bn, size_t expected_size = 0) {
|
|
52
|
+
if (!bn)
|
|
53
|
+
return "";
|
|
54
|
+
|
|
55
|
+
int num_bytes = BN_num_bytes(bn);
|
|
56
|
+
if (num_bytes == 0)
|
|
57
|
+
return "";
|
|
58
|
+
|
|
59
|
+
// If expected_size is provided and larger than num_bytes, pad with leading zeros
|
|
60
|
+
size_t buffer_size =
|
|
61
|
+
(expected_size > 0 && expected_size > static_cast<size_t>(num_bytes)) ? expected_size : static_cast<size_t>(num_bytes);
|
|
62
|
+
|
|
63
|
+
std::vector<unsigned char> buffer(buffer_size, 0);
|
|
64
|
+
|
|
65
|
+
// BN_bn2bin writes to the end of the buffer if it's larger than needed
|
|
66
|
+
size_t offset = buffer_size - num_bytes;
|
|
67
|
+
BN_bn2bin(bn, buffer.data() + offset);
|
|
68
|
+
|
|
69
|
+
// Return clean base64url - RFC 7517 compliant (no padding characters)
|
|
70
|
+
return base64_encode<std::string>(buffer.data(), buffer.size(), true);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Helper to add padding to base64url strings
|
|
74
|
+
static std::string add_base64_padding(const std::string& b64) {
|
|
75
|
+
std::string padded = b64;
|
|
76
|
+
// Base64 strings should be a multiple of 4 characters
|
|
77
|
+
// Add '=' padding to make it so
|
|
78
|
+
while (padded.length() % 4 != 0) {
|
|
79
|
+
padded += '=';
|
|
80
|
+
}
|
|
81
|
+
return padded;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static BIGNUM* base64url_to_bn(const std::string& b64) {
|
|
85
|
+
if (b64.empty())
|
|
86
|
+
return nullptr;
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
// Strip trailing periods (some JWK implementations use '.' as padding)
|
|
90
|
+
std::string cleaned = b64;
|
|
91
|
+
while (!cleaned.empty() && cleaned.back() == '.') {
|
|
92
|
+
cleaned.pop_back();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Add padding if needed for base64url
|
|
96
|
+
std::string padded = add_base64_padding(cleaned);
|
|
97
|
+
std::string decoded = base64_decode<std::string>(padded, false);
|
|
98
|
+
if (decoded.empty())
|
|
99
|
+
return nullptr;
|
|
100
|
+
|
|
101
|
+
return BN_bin2bn(reinterpret_cast<const unsigned char*>(decoded.data()), static_cast<int>(decoded.size()), nullptr);
|
|
102
|
+
} catch (const std::exception& e) {
|
|
103
|
+
throw std::runtime_error(std::string("Input is not valid base64-encoded data."));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static std::string base64url_encode(const unsigned char* data, size_t len) {
|
|
108
|
+
return base64_encode<std::string>(data, len, true);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static std::string base64url_decode(const std::string& input) {
|
|
112
|
+
// Strip trailing periods (some JWK implementations use '.' as padding)
|
|
113
|
+
std::string cleaned = input;
|
|
114
|
+
while (!cleaned.empty() && cleaned.back() == '.') {
|
|
115
|
+
cleaned.pop_back();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Add padding if needed for base64url
|
|
119
|
+
std::string padded = add_base64_padding(cleaned);
|
|
120
|
+
return base64_decode<std::string>(padded, false);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportKey(std::optional<KFormatType> format, std::optional<KeyEncoding> type,
|
|
124
|
+
const std::optional<std::string>& cipher,
|
|
125
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
|
|
126
|
+
auto keyType = data_.GetKeyType();
|
|
127
|
+
|
|
128
|
+
// Copy to avoid JSI ArrayBuffer GC issues. See #645.
|
|
129
|
+
if (keyType == KeyType::SECRET) {
|
|
130
|
+
return ToNativeArrayBuffer(data_.GetSymmetricKey());
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Handle asymmetric keys (public/private)
|
|
134
|
+
if (keyType == KeyType::PUBLIC || keyType == KeyType::PRIVATE) {
|
|
135
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
136
|
+
if (!pkey) {
|
|
137
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
int keyId = EVP_PKEY_id(pkey.get());
|
|
141
|
+
|
|
142
|
+
// For curve keys (X25519, X448, Ed25519, Ed448), use raw format if no format specified
|
|
143
|
+
bool isCurveKey = (keyId == EVP_PKEY_X25519 || keyId == EVP_PKEY_X448 || keyId == EVP_PKEY_ED25519 || keyId == EVP_PKEY_ED448);
|
|
144
|
+
|
|
145
|
+
// If no format specified and it's a curve key, export as raw
|
|
146
|
+
if (!format.has_value() && !type.has_value() && isCurveKey) {
|
|
147
|
+
if (keyType == KeyType::PUBLIC) {
|
|
148
|
+
auto rawData = pkey.rawPublicKey();
|
|
149
|
+
if (!rawData) {
|
|
150
|
+
throw std::runtime_error("Failed to get raw public key");
|
|
151
|
+
}
|
|
152
|
+
return ToNativeArrayBuffer(std::string(reinterpret_cast<const char*>(rawData.get()), rawData.size()));
|
|
153
|
+
} else {
|
|
154
|
+
auto rawData = pkey.rawPrivateKey();
|
|
155
|
+
if (!rawData) {
|
|
156
|
+
throw std::runtime_error("Failed to get raw private key");
|
|
157
|
+
}
|
|
158
|
+
return ToNativeArrayBuffer(std::string(reinterpret_cast<const char*>(rawData.get()), rawData.size()));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// For EC keys, handle raw format (uncompressed point)
|
|
163
|
+
if (!format.has_value() && !type.has_value() && keyId == EVP_PKEY_EC && keyType == KeyType::PUBLIC) {
|
|
164
|
+
size_t len = 0;
|
|
165
|
+
if (EVP_PKEY_get_octet_string_param(pkey.get(), OSSL_PKEY_PARAM_PUB_KEY, nullptr, 0, &len) != 1 || len == 0)
|
|
166
|
+
throw std::runtime_error("Failed to get EC public key size");
|
|
167
|
+
std::vector<uint8_t> buf(len);
|
|
168
|
+
if (EVP_PKEY_get_octet_string_param(pkey.get(), OSSL_PKEY_PARAM_PUB_KEY, buf.data(), buf.size(), &len) != 1)
|
|
169
|
+
throw std::runtime_error("Failed to get EC public key");
|
|
170
|
+
return ToNativeArrayBuffer(std::string(reinterpret_cast<const char*>(buf.data()), len));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
174
|
+
if (!format.has_value() && !type.has_value()) {
|
|
175
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
176
|
+
if (typeName != nullptr) {
|
|
177
|
+
std::string name(typeName);
|
|
178
|
+
bool isPqcKey = (name.starts_with("ML-KEM-") || name.starts_with("ML-DSA-") || name.starts_with("SLH-DSA-"));
|
|
179
|
+
if (isPqcKey) {
|
|
180
|
+
if (keyType == KeyType::PUBLIC) {
|
|
181
|
+
auto rawData = pkey.rawPublicKey();
|
|
182
|
+
if (!rawData) {
|
|
183
|
+
throw std::runtime_error("Failed to get raw PQC public key");
|
|
184
|
+
}
|
|
185
|
+
return ToNativeArrayBuffer(std::string(reinterpret_cast<const char*>(rawData.get()), rawData.size()));
|
|
186
|
+
} else {
|
|
187
|
+
auto rawData = pkey.rawSeed();
|
|
188
|
+
if (!rawData) {
|
|
189
|
+
throw std::runtime_error("Failed to get raw PQC seed");
|
|
190
|
+
}
|
|
191
|
+
return ToNativeArrayBuffer(std::string(reinterpret_cast<const char*>(rawData.get()), rawData.size()));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
#endif
|
|
197
|
+
|
|
198
|
+
// Set default format and type if not provided
|
|
199
|
+
auto exportFormat = format.value_or(KFormatType::DER);
|
|
200
|
+
auto exportType = type.value_or(keyType == KeyType::PUBLIC ? KeyEncoding::SPKI : KeyEncoding::PKCS8);
|
|
201
|
+
|
|
202
|
+
// If SPKI is requested, export as public key (works for both public and private keys)
|
|
203
|
+
// This allows extracting the public key from a private key
|
|
204
|
+
bool exportAsPublic = (exportType == KeyEncoding::SPKI) || (keyType == KeyType::PUBLIC);
|
|
205
|
+
|
|
206
|
+
// Create encoding config
|
|
207
|
+
if (exportAsPublic) {
|
|
208
|
+
ncrypto::EVPKeyPointer::PublicKeyEncodingConfig config(false, static_cast<ncrypto::EVPKeyPointer::PKFormatType>(exportFormat),
|
|
209
|
+
static_cast<ncrypto::EVPKeyPointer::PKEncodingType>(exportType));
|
|
210
|
+
|
|
211
|
+
auto result = pkey.writePublicKey(config);
|
|
212
|
+
if (!result) {
|
|
213
|
+
throw std::runtime_error("Failed to export public key");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
auto bio = std::move(result.value);
|
|
217
|
+
BUF_MEM* bptr = bio;
|
|
218
|
+
return ToNativeArrayBuffer(std::string(bptr->data, bptr->length));
|
|
219
|
+
} else {
|
|
220
|
+
ncrypto::EVPKeyPointer::PrivateKeyEncodingConfig config(false, static_cast<ncrypto::EVPKeyPointer::PKFormatType>(exportFormat),
|
|
221
|
+
static_cast<ncrypto::EVPKeyPointer::PKEncodingType>(exportType));
|
|
222
|
+
|
|
223
|
+
// Handle cipher and passphrase for encrypted private keys
|
|
224
|
+
if (cipher.has_value()) {
|
|
225
|
+
const EVP_CIPHER* evp_cipher = EVP_get_cipherbyname(cipher.value().c_str());
|
|
226
|
+
if (!evp_cipher) {
|
|
227
|
+
throw std::runtime_error("Unknown cipher: " + cipher.value());
|
|
228
|
+
}
|
|
229
|
+
config.cipher = evp_cipher;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (passphrase.has_value()) {
|
|
233
|
+
auto& passphrase_ptr = passphrase.value();
|
|
234
|
+
config.passphrase =
|
|
235
|
+
std::make_optional(ncrypto::DataPointer::Copy(ncrypto::Buffer<const void>{passphrase_ptr->data(), passphrase_ptr->size()}));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
auto result = pkey.writePrivateKey(config);
|
|
239
|
+
if (!result) {
|
|
240
|
+
throw std::runtime_error("Failed to export private key");
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
auto bio = std::move(result.value);
|
|
244
|
+
BUF_MEM* bptr = bio;
|
|
245
|
+
return ToNativeArrayBuffer(std::string(bptr->data, bptr->length));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
throw std::runtime_error("Unsupported key type for export");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
JWK HybridKeyObjectHandle::exportJwk(const JWK& key, bool handleRsaPss) {
|
|
253
|
+
JWK result = key;
|
|
254
|
+
auto keyType = data_.GetKeyType();
|
|
255
|
+
|
|
256
|
+
// Handle secret keys (AES, HMAC)
|
|
257
|
+
if (keyType == KeyType::SECRET) {
|
|
258
|
+
auto symKey = data_.GetSymmetricKey();
|
|
259
|
+
result.kty = JWKkty::OCT;
|
|
260
|
+
// RFC 7517 compliant base64url encoding (no padding characters)
|
|
261
|
+
result.k = base64url_encode(reinterpret_cast<const unsigned char*>(symKey->data()), symKey->size());
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Handle asymmetric keys (RSA, EC)
|
|
266
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
267
|
+
if (!pkey) {
|
|
268
|
+
throw std::runtime_error("Invalid key for JWK export");
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
int keyId = EVP_PKEY_id(pkey.get());
|
|
272
|
+
|
|
273
|
+
// Export RSA keys
|
|
274
|
+
if (keyId == EVP_PKEY_RSA || keyId == EVP_PKEY_RSA_PSS) {
|
|
275
|
+
const RSA* rsa = EVP_PKEY_get0_RSA(pkey.get());
|
|
276
|
+
if (!rsa)
|
|
277
|
+
throw std::runtime_error("Failed to get RSA key");
|
|
278
|
+
|
|
279
|
+
result.kty = JWKkty::RSA;
|
|
280
|
+
|
|
281
|
+
const BIGNUM *n_bn, *e_bn, *d_bn, *p_bn, *q_bn, *dmp1_bn, *dmq1_bn, *iqmp_bn;
|
|
282
|
+
RSA_get0_key(rsa, &n_bn, &e_bn, &d_bn);
|
|
283
|
+
RSA_get0_factors(rsa, &p_bn, &q_bn);
|
|
284
|
+
RSA_get0_crt_params(rsa, &dmp1_bn, &dmq1_bn, &iqmp_bn);
|
|
285
|
+
|
|
286
|
+
// Public components (always present)
|
|
287
|
+
if (n_bn)
|
|
288
|
+
result.n = bn_to_base64url(n_bn);
|
|
289
|
+
if (e_bn)
|
|
290
|
+
result.e = bn_to_base64url(e_bn);
|
|
291
|
+
|
|
292
|
+
// Private components (only for private keys)
|
|
293
|
+
if (keyType == KeyType::PRIVATE) {
|
|
294
|
+
if (d_bn)
|
|
295
|
+
result.d = bn_to_base64url(d_bn);
|
|
296
|
+
if (p_bn)
|
|
297
|
+
result.p = bn_to_base64url(p_bn);
|
|
298
|
+
if (q_bn)
|
|
299
|
+
result.q = bn_to_base64url(q_bn);
|
|
300
|
+
if (dmp1_bn)
|
|
301
|
+
result.dp = bn_to_base64url(dmp1_bn);
|
|
302
|
+
if (dmq1_bn)
|
|
303
|
+
result.dq = bn_to_base64url(dmq1_bn);
|
|
304
|
+
if (iqmp_bn)
|
|
305
|
+
result.qi = bn_to_base64url(iqmp_bn);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return result;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Export EC keys
|
|
312
|
+
if (keyId == EVP_PKEY_EC) {
|
|
313
|
+
char curve_name_buf[64];
|
|
314
|
+
size_t name_len = 0;
|
|
315
|
+
if (EVP_PKEY_get_utf8_string_param(pkey.get(), OSSL_PKEY_PARAM_GROUP_NAME, curve_name_buf, sizeof(curve_name_buf), &name_len) != 1)
|
|
316
|
+
throw std::runtime_error("Failed to get EC group name");
|
|
317
|
+
|
|
318
|
+
std::string curve_name(curve_name_buf, name_len);
|
|
319
|
+
|
|
320
|
+
int bits = EVP_PKEY_bits(pkey.get());
|
|
321
|
+
if (bits <= 0)
|
|
322
|
+
throw std::runtime_error("Failed to get EC key size");
|
|
323
|
+
size_t field_size = (static_cast<size_t>(bits) + 7) / 8;
|
|
324
|
+
|
|
325
|
+
result.kty = JWKkty::EC;
|
|
326
|
+
|
|
327
|
+
// Map OpenSSL curve names to JWK curve names
|
|
328
|
+
if (curve_name == "prime256v1") {
|
|
329
|
+
result.crv = "P-256";
|
|
330
|
+
} else if (curve_name == "secp384r1") {
|
|
331
|
+
result.crv = "P-384";
|
|
332
|
+
} else if (curve_name == "secp521r1") {
|
|
333
|
+
result.crv = "P-521";
|
|
334
|
+
} else {
|
|
335
|
+
result.crv = curve_name;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
BIGNUM* x_bn = nullptr;
|
|
339
|
+
BIGNUM* y_bn = nullptr;
|
|
340
|
+
if (EVP_PKEY_get_bn_param(pkey.get(), OSSL_PKEY_PARAM_EC_PUB_X, &x_bn) != 1 ||
|
|
341
|
+
EVP_PKEY_get_bn_param(pkey.get(), OSSL_PKEY_PARAM_EC_PUB_Y, &y_bn) != 1) {
|
|
342
|
+
BN_free(x_bn);
|
|
343
|
+
BN_free(y_bn);
|
|
344
|
+
throw std::runtime_error("Failed to get EC public key coordinates");
|
|
345
|
+
}
|
|
346
|
+
result.x = bn_to_base64url(x_bn, field_size);
|
|
347
|
+
result.y = bn_to_base64url(y_bn, field_size);
|
|
348
|
+
BN_free(x_bn);
|
|
349
|
+
BN_free(y_bn);
|
|
350
|
+
|
|
351
|
+
// Export private key if this is a private key
|
|
352
|
+
if (keyType == KeyType::PRIVATE) {
|
|
353
|
+
BIGNUM* priv_bn = nullptr;
|
|
354
|
+
if (EVP_PKEY_get_bn_param(pkey.get(), OSSL_PKEY_PARAM_PRIV_KEY, &priv_bn) == 1 && priv_bn) {
|
|
355
|
+
result.d = bn_to_base64url(priv_bn, field_size);
|
|
356
|
+
BN_free(priv_bn);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return result;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Export OKP keys (Ed25519, Ed448, X25519, X448) per RFC 8037
|
|
364
|
+
if (keyId == EVP_PKEY_ED25519 || keyId == EVP_PKEY_ED448 || keyId == EVP_PKEY_X25519 || keyId == EVP_PKEY_X448) {
|
|
365
|
+
result.kty = JWKkty::OKP;
|
|
366
|
+
|
|
367
|
+
switch (keyId) {
|
|
368
|
+
case EVP_PKEY_ED25519:
|
|
369
|
+
result.crv = "Ed25519";
|
|
370
|
+
break;
|
|
371
|
+
case EVP_PKEY_ED448:
|
|
372
|
+
result.crv = "Ed448";
|
|
373
|
+
break;
|
|
374
|
+
case EVP_PKEY_X25519:
|
|
375
|
+
result.crv = "X25519";
|
|
376
|
+
break;
|
|
377
|
+
case EVP_PKEY_X448:
|
|
378
|
+
result.crv = "X448";
|
|
379
|
+
break;
|
|
380
|
+
default:
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
auto pubKey = pkey.rawPublicKey();
|
|
385
|
+
if (!pubKey) {
|
|
386
|
+
throw std::runtime_error("Failed to get raw public key for OKP JWK export");
|
|
387
|
+
}
|
|
388
|
+
result.x = base64url_encode(reinterpret_cast<const unsigned char*>(pubKey.get()), pubKey.size());
|
|
389
|
+
|
|
390
|
+
if (keyType == KeyType::PRIVATE) {
|
|
391
|
+
auto privKey = pkey.rawPrivateKey();
|
|
392
|
+
if (!privKey) {
|
|
393
|
+
throw std::runtime_error("Failed to get raw private key for OKP JWK export");
|
|
394
|
+
}
|
|
395
|
+
result.d = base64url_encode(reinterpret_cast<const unsigned char*>(privKey.get()), privKey.size());
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return result;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
402
|
+
// Export AKP keys (ML-DSA, ML-KEM)
|
|
403
|
+
{
|
|
404
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
405
|
+
if (typeName != nullptr) {
|
|
406
|
+
std::string name(typeName);
|
|
407
|
+
bool isPqcKey = (name.starts_with("ML-DSA-") || name.starts_with("ML-KEM-") || name.starts_with("SLH-DSA-"));
|
|
408
|
+
if (isPqcKey) {
|
|
409
|
+
result.kty = JWKkty::AKP;
|
|
410
|
+
result.alg = name;
|
|
411
|
+
|
|
412
|
+
auto pubKey = pkey.rawPublicKey();
|
|
413
|
+
if (!pubKey) {
|
|
414
|
+
throw std::runtime_error("Failed to get raw public key for AKP JWK export");
|
|
415
|
+
}
|
|
416
|
+
result.pub = base64url_encode(reinterpret_cast<const unsigned char*>(pubKey.get()), pubKey.size());
|
|
417
|
+
|
|
418
|
+
if (keyType == KeyType::PRIVATE) {
|
|
419
|
+
auto seed = pkey.rawSeed();
|
|
420
|
+
if (!seed) {
|
|
421
|
+
throw std::runtime_error("Key does not have an available seed");
|
|
422
|
+
}
|
|
423
|
+
result.priv = base64url_encode(reinterpret_cast<const unsigned char*>(seed.get()), seed.size());
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
return result;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
#endif
|
|
431
|
+
|
|
432
|
+
throw std::runtime_error("Unsupported key type for JWK export");
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Returns true if the EVP_PKEY type supports raw public key export
|
|
436
|
+
// (CFRG keys: Ed25519, Ed448, X25519, X448; PQC keys: ML-DSA, ML-KEM, SLH-DSA).
|
|
437
|
+
static bool supportsRawPublic(int keyId, const char* typeName) {
|
|
438
|
+
if (keyId == EVP_PKEY_ED25519 || keyId == EVP_PKEY_ED448 || keyId == EVP_PKEY_X25519 || keyId == EVP_PKEY_X448) {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
442
|
+
if (keyId == EVP_PKEY_ML_DSA_44 || keyId == EVP_PKEY_ML_DSA_65 || keyId == EVP_PKEY_ML_DSA_87) {
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
if (typeName != nullptr) {
|
|
446
|
+
std::string name(typeName);
|
|
447
|
+
if (name.starts_with("ML-KEM-") || name.starts_with("ML-DSA-") || name.starts_with("SLH-DSA-")) {
|
|
448
|
+
return true;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
#else
|
|
452
|
+
(void)typeName;
|
|
453
|
+
#endif
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Returns true if the EVP_PKEY type supports raw private key export
|
|
458
|
+
// (CFRG keys: Ed25519, Ed448, X25519, X448; SLH-DSA private keys).
|
|
459
|
+
static bool supportsRawPrivate(int keyId, const char* typeName) {
|
|
460
|
+
if (keyId == EVP_PKEY_ED25519 || keyId == EVP_PKEY_ED448 || keyId == EVP_PKEY_X25519 || keyId == EVP_PKEY_X448) {
|
|
461
|
+
return true;
|
|
462
|
+
}
|
|
463
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
464
|
+
if (typeName != nullptr) {
|
|
465
|
+
std::string name(typeName);
|
|
466
|
+
if (name.starts_with("SLH-DSA-")) {
|
|
467
|
+
return true;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
#else
|
|
471
|
+
(void)typeName;
|
|
472
|
+
#endif
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Returns true if the EVP_PKEY type supports raw seed export
|
|
477
|
+
// (PQC keys: ML-DSA, ML-KEM, SLH-DSA).
|
|
478
|
+
static bool supportsRawSeed(int keyId, const char* typeName) {
|
|
479
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
480
|
+
if (keyId == EVP_PKEY_ML_DSA_44 || keyId == EVP_PKEY_ML_DSA_65 || keyId == EVP_PKEY_ML_DSA_87) {
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
if (typeName != nullptr) {
|
|
484
|
+
std::string name(typeName);
|
|
485
|
+
if (name.starts_with("ML-KEM-") || name.starts_with("ML-DSA-") || name.starts_with("SLH-DSA-")) {
|
|
486
|
+
return true;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
#else
|
|
490
|
+
(void)keyId;
|
|
491
|
+
(void)typeName;
|
|
492
|
+
#endif
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportRawPublic() {
|
|
497
|
+
auto keyType = data_.GetKeyType();
|
|
498
|
+
if (keyType == KeyType::SECRET) {
|
|
499
|
+
throw std::runtime_error("Raw public key export is not supported for secret keys");
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
503
|
+
if (!pkey) {
|
|
504
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
int keyId = EVP_PKEY_id(pkey.get());
|
|
508
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
509
|
+
|
|
510
|
+
if (!supportsRawPublic(keyId, typeName)) {
|
|
511
|
+
throw std::runtime_error("The key type does not support raw public key export");
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
auto rawData = pkey.rawPublicKey();
|
|
515
|
+
if (!rawData) {
|
|
516
|
+
throw std::runtime_error("Failed to get raw public key");
|
|
517
|
+
}
|
|
518
|
+
return ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(rawData.get()), rawData.size());
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportRawPrivate() {
|
|
522
|
+
auto keyType = data_.GetKeyType();
|
|
523
|
+
if (keyType != KeyType::PRIVATE) {
|
|
524
|
+
throw std::runtime_error("Raw private key export requires a private key");
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
528
|
+
if (!pkey) {
|
|
529
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
int keyId = EVP_PKEY_id(pkey.get());
|
|
533
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
534
|
+
|
|
535
|
+
if (!supportsRawPrivate(keyId, typeName)) {
|
|
536
|
+
throw std::runtime_error("The key type does not support raw private key export");
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
auto rawData = pkey.rawPrivateKey();
|
|
540
|
+
if (!rawData) {
|
|
541
|
+
throw std::runtime_error("Failed to get raw private key");
|
|
542
|
+
}
|
|
543
|
+
return ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(rawData.get()), rawData.size());
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportRawSeed() {
|
|
547
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
548
|
+
auto keyType = data_.GetKeyType();
|
|
549
|
+
if (keyType != KeyType::PRIVATE) {
|
|
550
|
+
throw std::runtime_error("Raw seed export requires a private key");
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
554
|
+
if (!pkey) {
|
|
555
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
int keyId = EVP_PKEY_id(pkey.get());
|
|
559
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
560
|
+
|
|
561
|
+
if (!supportsRawSeed(keyId, typeName)) {
|
|
562
|
+
throw std::runtime_error("The key type does not support raw seed export");
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
auto rawData = pkey.rawSeed();
|
|
566
|
+
if (!rawData) {
|
|
567
|
+
throw std::runtime_error("Key does not have an available seed");
|
|
568
|
+
}
|
|
569
|
+
return ToNativeArrayBuffer(reinterpret_cast<const uint8_t*>(rawData.get()), rawData.size());
|
|
570
|
+
#else
|
|
571
|
+
throw std::runtime_error("Raw seed export requires OpenSSL 3.5+");
|
|
572
|
+
#endif
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportECPublicRaw(bool compressed) {
|
|
576
|
+
auto keyType = data_.GetKeyType();
|
|
577
|
+
if (keyType == KeyType::SECRET) {
|
|
578
|
+
throw std::runtime_error("EC raw public key export is not supported for secret keys");
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
582
|
+
if (!pkey) {
|
|
583
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
if (EVP_PKEY_id(pkey.get()) != EVP_PKEY_EC) {
|
|
587
|
+
throw std::runtime_error("Key is not an EC key");
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey.get());
|
|
591
|
+
if (!ec_key) {
|
|
592
|
+
throw std::runtime_error("Failed to get EC key");
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
const EC_GROUP* group = EC_KEY_get0_group(ec_key);
|
|
596
|
+
const EC_POINT* point = EC_KEY_get0_public_key(ec_key);
|
|
597
|
+
if (!group || !point) {
|
|
598
|
+
throw std::runtime_error("Failed to get EC public key point");
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
point_conversion_form_t form = compressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED;
|
|
602
|
+
|
|
603
|
+
size_t len = EC_POINT_point2oct(group, point, form, nullptr, 0, nullptr);
|
|
604
|
+
if (len == 0) {
|
|
605
|
+
throw std::runtime_error("Failed to compute EC point size");
|
|
606
|
+
}
|
|
607
|
+
std::vector<uint8_t> buf(len);
|
|
608
|
+
if (EC_POINT_point2oct(group, point, form, buf.data(), buf.size(), nullptr) != len) {
|
|
609
|
+
throw std::runtime_error("Failed to encode EC public key point");
|
|
610
|
+
}
|
|
611
|
+
return ToNativeArrayBuffer(buf.data(), buf.size());
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
std::shared_ptr<ArrayBuffer> HybridKeyObjectHandle::exportECPrivateRaw() {
|
|
615
|
+
auto keyType = data_.GetKeyType();
|
|
616
|
+
if (keyType != KeyType::PRIVATE) {
|
|
617
|
+
throw std::runtime_error("EC raw private key export requires a private key");
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
621
|
+
if (!pkey) {
|
|
622
|
+
throw std::runtime_error("Invalid asymmetric key");
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
if (EVP_PKEY_id(pkey.get()) != EVP_PKEY_EC) {
|
|
626
|
+
throw std::runtime_error("Key is not an EC key");
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey.get());
|
|
630
|
+
if (!ec_key) {
|
|
631
|
+
throw std::runtime_error("Failed to get EC key");
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
const BIGNUM* priv_bn = EC_KEY_get0_private_key(ec_key);
|
|
635
|
+
if (!priv_bn) {
|
|
636
|
+
throw std::runtime_error("EC key has no private component");
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
const EC_GROUP* group = EC_KEY_get0_group(ec_key);
|
|
640
|
+
if (!group) {
|
|
641
|
+
throw std::runtime_error("Failed to get EC group");
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
BIGNUM* order = BN_new();
|
|
645
|
+
if (!order) {
|
|
646
|
+
throw std::runtime_error("Failed to allocate BIGNUM");
|
|
647
|
+
}
|
|
648
|
+
if (EC_GROUP_get_order(group, order, nullptr) != 1) {
|
|
649
|
+
BN_free(order);
|
|
650
|
+
throw std::runtime_error("Failed to get EC group order");
|
|
651
|
+
}
|
|
652
|
+
size_t order_size = (BN_num_bits(order) + 7) / 8;
|
|
653
|
+
BN_free(order);
|
|
654
|
+
|
|
655
|
+
std::vector<uint8_t> buf(order_size, 0);
|
|
656
|
+
if (BN_bn2binpad(priv_bn, buf.data(), static_cast<int>(order_size)) < 0) {
|
|
657
|
+
throw std::runtime_error("Failed to encode EC private key");
|
|
658
|
+
}
|
|
659
|
+
return ToNativeArrayBuffer(buf.data(), buf.size());
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
AsymmetricKeyType HybridKeyObjectHandle::getAsymmetricKeyType() {
|
|
663
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
664
|
+
if (!pkey) {
|
|
665
|
+
throw std::runtime_error("Key is not an asymmetric key");
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
int keyType = EVP_PKEY_id(pkey.get());
|
|
669
|
+
|
|
670
|
+
switch (keyType) {
|
|
671
|
+
case EVP_PKEY_RSA:
|
|
672
|
+
return AsymmetricKeyType::RSA;
|
|
673
|
+
case EVP_PKEY_RSA_PSS:
|
|
674
|
+
return AsymmetricKeyType::RSA_PSS;
|
|
675
|
+
case EVP_PKEY_DSA:
|
|
676
|
+
return AsymmetricKeyType::DSA;
|
|
677
|
+
case EVP_PKEY_EC:
|
|
678
|
+
return AsymmetricKeyType::EC;
|
|
679
|
+
case EVP_PKEY_DH:
|
|
680
|
+
return AsymmetricKeyType::DH;
|
|
681
|
+
case EVP_PKEY_X25519:
|
|
682
|
+
return AsymmetricKeyType::X25519;
|
|
683
|
+
case EVP_PKEY_X448:
|
|
684
|
+
return AsymmetricKeyType::X448;
|
|
685
|
+
case EVP_PKEY_ED25519:
|
|
686
|
+
return AsymmetricKeyType::ED25519;
|
|
687
|
+
case EVP_PKEY_ED448:
|
|
688
|
+
return AsymmetricKeyType::ED448;
|
|
689
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
690
|
+
case EVP_PKEY_ML_DSA_44:
|
|
691
|
+
return AsymmetricKeyType::ML_DSA_44;
|
|
692
|
+
case EVP_PKEY_ML_DSA_65:
|
|
693
|
+
return AsymmetricKeyType::ML_DSA_65;
|
|
694
|
+
case EVP_PKEY_ML_DSA_87:
|
|
695
|
+
return AsymmetricKeyType::ML_DSA_87;
|
|
696
|
+
#endif
|
|
697
|
+
default:
|
|
698
|
+
break;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
702
|
+
// EVP_PKEY_id returns -1 for provider-only key types (e.g. ML-KEM, SLH-DSA)
|
|
703
|
+
// Fall back to string-based type name comparison
|
|
704
|
+
const char* typeName = EVP_PKEY_get0_type_name(pkey.get());
|
|
705
|
+
if (typeName != nullptr) {
|
|
706
|
+
std::string name(typeName);
|
|
707
|
+
if (name == "ML-KEM-512")
|
|
708
|
+
return AsymmetricKeyType::ML_KEM_512;
|
|
709
|
+
if (name == "ML-KEM-768")
|
|
710
|
+
return AsymmetricKeyType::ML_KEM_768;
|
|
711
|
+
if (name == "ML-KEM-1024")
|
|
712
|
+
return AsymmetricKeyType::ML_KEM_1024;
|
|
713
|
+
if (name == "SLH-DSA-SHA2-128s")
|
|
714
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_128S;
|
|
715
|
+
if (name == "SLH-DSA-SHA2-128f")
|
|
716
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_128F;
|
|
717
|
+
if (name == "SLH-DSA-SHA2-192s")
|
|
718
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_192S;
|
|
719
|
+
if (name == "SLH-DSA-SHA2-192f")
|
|
720
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_192F;
|
|
721
|
+
if (name == "SLH-DSA-SHA2-256s")
|
|
722
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_256S;
|
|
723
|
+
if (name == "SLH-DSA-SHA2-256f")
|
|
724
|
+
return AsymmetricKeyType::SLH_DSA_SHA2_256F;
|
|
725
|
+
if (name == "SLH-DSA-SHAKE-128s")
|
|
726
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_128S;
|
|
727
|
+
if (name == "SLH-DSA-SHAKE-128f")
|
|
728
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_128F;
|
|
729
|
+
if (name == "SLH-DSA-SHAKE-192s")
|
|
730
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_192S;
|
|
731
|
+
if (name == "SLH-DSA-SHAKE-192f")
|
|
732
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_192F;
|
|
733
|
+
if (name == "SLH-DSA-SHAKE-256s")
|
|
734
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_256S;
|
|
735
|
+
if (name == "SLH-DSA-SHAKE-256f")
|
|
736
|
+
return AsymmetricKeyType::SLH_DSA_SHAKE_256F;
|
|
737
|
+
}
|
|
738
|
+
#endif
|
|
739
|
+
|
|
740
|
+
throw std::runtime_error("Unsupported asymmetric key type");
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
bool HybridKeyObjectHandle::init(KeyType keyType, const std::variant<std::shared_ptr<ArrayBuffer>, std::string>& key,
|
|
744
|
+
std::optional<KFormatType> format, std::optional<KeyEncoding> type,
|
|
745
|
+
const std::optional<std::shared_ptr<ArrayBuffer>>& passphrase) {
|
|
746
|
+
// Reset any existing data to prevent state leakage
|
|
747
|
+
data_ = KeyObjectData();
|
|
748
|
+
|
|
749
|
+
// get ArrayBuffer from key - always copy to ensure we own the data
|
|
750
|
+
std::shared_ptr<ArrayBuffer> ab;
|
|
751
|
+
if (std::holds_alternative<std::string>(key)) {
|
|
752
|
+
ab = ToNativeArrayBuffer(std::get<std::string>(key));
|
|
753
|
+
} else {
|
|
754
|
+
const auto& abPtr = std::get<std::shared_ptr<ArrayBuffer>>(key);
|
|
755
|
+
ab = ToNativeArrayBuffer(abPtr);
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// Handle raw asymmetric key material - only for special curves with known raw sizes
|
|
759
|
+
std::optional<KFormatType> actualFormat = format;
|
|
760
|
+
if (!actualFormat.has_value() && !type.has_value() && (keyType == KeyType::PUBLIC || keyType == KeyType::PRIVATE)) {
|
|
761
|
+
size_t keySize = ab->size();
|
|
762
|
+
// Only route to initRawKey for exact special curve sizes:
|
|
763
|
+
// X25519/Ed25519: 32 bytes, X448: 56 bytes, Ed448: 57 bytes
|
|
764
|
+
// DER-encoded keys will be much larger and should use standard parsing
|
|
765
|
+
if ((keySize == 32) || (keySize == 56) || (keySize == 57)) {
|
|
766
|
+
return initRawKey(keyType, ab);
|
|
767
|
+
}
|
|
768
|
+
// For larger sizes (DER-encoded keys), fall through to standard parsing
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
switch (keyType) {
|
|
772
|
+
case KeyType::SECRET: {
|
|
773
|
+
this->data_ = KeyObjectData::CreateSecret(ab);
|
|
774
|
+
break;
|
|
775
|
+
}
|
|
776
|
+
case KeyType::PUBLIC: {
|
|
777
|
+
auto data = KeyObjectData::GetPublicOrPrivateKey(ab, actualFormat, type, passphrase);
|
|
778
|
+
if (!data)
|
|
779
|
+
return false;
|
|
780
|
+
this->data_ = data.addRefWithType(KeyType::PUBLIC);
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
case KeyType::PRIVATE: {
|
|
784
|
+
if (auto data = KeyObjectData::GetPrivateKey(ab, actualFormat, type, passphrase, false)) {
|
|
785
|
+
this->data_ = std::move(data);
|
|
786
|
+
}
|
|
787
|
+
break;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return true;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
std::optional<KeyType> HybridKeyObjectHandle::initJwk(const JWK& keyData, std::optional<NamedCurve> namedCurve) {
|
|
794
|
+
// Reset any existing data
|
|
795
|
+
data_ = KeyObjectData();
|
|
796
|
+
|
|
797
|
+
if (!keyData.kty.has_value()) {
|
|
798
|
+
throw std::runtime_error("JWK missing required 'kty' field");
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
JWKkty kty = keyData.kty.value();
|
|
802
|
+
|
|
803
|
+
// Handle symmetric keys (AES, HMAC)
|
|
804
|
+
if (kty == JWKkty::OCT) {
|
|
805
|
+
if (!keyData.k.has_value()) {
|
|
806
|
+
throw std::runtime_error("JWK oct key missing 'k' field");
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
std::string decoded = base64url_decode(keyData.k.value());
|
|
810
|
+
auto keyBuffer = ToNativeArrayBuffer(decoded);
|
|
811
|
+
data_ = KeyObjectData::CreateSecret(keyBuffer);
|
|
812
|
+
return KeyType::SECRET;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
// Handle RSA keys
|
|
816
|
+
if (kty == JWKkty::RSA) {
|
|
817
|
+
bool isPrivate = keyData.d.has_value();
|
|
818
|
+
|
|
819
|
+
if (!keyData.n.has_value() || !keyData.e.has_value()) {
|
|
820
|
+
throw std::runtime_error("JWK RSA key missing required 'n' or 'e' fields");
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
RSA* rsa = RSA_new();
|
|
824
|
+
if (!rsa)
|
|
825
|
+
throw std::runtime_error("Failed to create RSA key");
|
|
826
|
+
|
|
827
|
+
// Set public components
|
|
828
|
+
BIGNUM* n = base64url_to_bn(keyData.n.value());
|
|
829
|
+
BIGNUM* e = base64url_to_bn(keyData.e.value());
|
|
830
|
+
|
|
831
|
+
if (!n || !e) {
|
|
832
|
+
RSA_free(rsa);
|
|
833
|
+
throw std::runtime_error("Failed to decode RSA public components");
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
if (isPrivate) {
|
|
837
|
+
// Private key
|
|
838
|
+
if (!keyData.d.has_value()) {
|
|
839
|
+
BN_free(n);
|
|
840
|
+
BN_free(e);
|
|
841
|
+
RSA_free(rsa);
|
|
842
|
+
throw std::runtime_error("JWK RSA private key missing 'd' field");
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
BIGNUM* d = base64url_to_bn(keyData.d.value());
|
|
846
|
+
if (!d) {
|
|
847
|
+
BN_free(n);
|
|
848
|
+
BN_free(e);
|
|
849
|
+
RSA_free(rsa);
|
|
850
|
+
throw std::runtime_error("Failed to decode RSA 'd' component");
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// Set key components (RSA_set0_key takes ownership)
|
|
854
|
+
if (RSA_set0_key(rsa, n, e, d) != 1) {
|
|
855
|
+
BN_free(n);
|
|
856
|
+
BN_free(e);
|
|
857
|
+
BN_free(d);
|
|
858
|
+
RSA_free(rsa);
|
|
859
|
+
throw std::runtime_error("Failed to set RSA key components");
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
// Set optional CRT parameters if present
|
|
863
|
+
if (keyData.p.has_value() && keyData.q.has_value()) {
|
|
864
|
+
BIGNUM* p = base64url_to_bn(keyData.p.value());
|
|
865
|
+
BIGNUM* q = base64url_to_bn(keyData.q.value());
|
|
866
|
+
if (p && q) {
|
|
867
|
+
RSA_set0_factors(rsa, p, q);
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
if (keyData.dp.has_value() && keyData.dq.has_value() && keyData.qi.has_value()) {
|
|
872
|
+
BIGNUM* dmp1 = base64url_to_bn(keyData.dp.value());
|
|
873
|
+
BIGNUM* dmq1 = base64url_to_bn(keyData.dq.value());
|
|
874
|
+
BIGNUM* iqmp = base64url_to_bn(keyData.qi.value());
|
|
875
|
+
if (dmp1 && dmq1 && iqmp) {
|
|
876
|
+
RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
// Create EVP_PKEY from RSA
|
|
881
|
+
EVP_PKEY* pkey = EVP_PKEY_new();
|
|
882
|
+
if (!pkey || EVP_PKEY_assign_RSA(pkey, rsa) != 1) {
|
|
883
|
+
RSA_free(rsa);
|
|
884
|
+
if (pkey)
|
|
885
|
+
EVP_PKEY_free(pkey);
|
|
886
|
+
throw std::runtime_error("Failed to create EVP_PKEY from RSA");
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, ncrypto::EVPKeyPointer(pkey));
|
|
890
|
+
return KeyType::PRIVATE;
|
|
891
|
+
|
|
892
|
+
} else {
|
|
893
|
+
// Public key
|
|
894
|
+
if (RSA_set0_key(rsa, n, e, nullptr) != 1) {
|
|
895
|
+
BN_free(n);
|
|
896
|
+
BN_free(e);
|
|
897
|
+
RSA_free(rsa);
|
|
898
|
+
throw std::runtime_error("Failed to set RSA public key components");
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
EVP_PKEY* pkey = EVP_PKEY_new();
|
|
902
|
+
if (!pkey || EVP_PKEY_assign_RSA(pkey, rsa) != 1) {
|
|
903
|
+
RSA_free(rsa);
|
|
904
|
+
if (pkey)
|
|
905
|
+
EVP_PKEY_free(pkey);
|
|
906
|
+
throw std::runtime_error("Failed to create EVP_PKEY from RSA");
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, ncrypto::EVPKeyPointer(pkey));
|
|
910
|
+
return KeyType::PUBLIC;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
// Handle EC keys
|
|
915
|
+
if (kty == JWKkty::EC) {
|
|
916
|
+
bool isPrivate = keyData.d.has_value();
|
|
917
|
+
|
|
918
|
+
if (!keyData.crv.has_value() || !keyData.x.has_value() || !keyData.y.has_value()) {
|
|
919
|
+
throw std::runtime_error("JWK EC key missing required fields (crv, x, y)");
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
std::string crv = keyData.crv.value();
|
|
923
|
+
|
|
924
|
+
// Map JWK curve names to OpenSSL group names and field sizes
|
|
925
|
+
const char* group_name;
|
|
926
|
+
size_t field_size;
|
|
927
|
+
if (crv == "P-256") {
|
|
928
|
+
group_name = "prime256v1";
|
|
929
|
+
field_size = 32;
|
|
930
|
+
} else if (crv == "P-384") {
|
|
931
|
+
group_name = "secp384r1";
|
|
932
|
+
field_size = 48;
|
|
933
|
+
} else if (crv == "P-521") {
|
|
934
|
+
group_name = "secp521r1";
|
|
935
|
+
field_size = 66;
|
|
936
|
+
} else {
|
|
937
|
+
throw std::runtime_error("Unsupported EC curve: " + crv);
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
// Decode public key coordinates
|
|
941
|
+
BIGNUM* x_bn = base64url_to_bn(keyData.x.value());
|
|
942
|
+
BIGNUM* y_bn = base64url_to_bn(keyData.y.value());
|
|
943
|
+
if (!x_bn || !y_bn) {
|
|
944
|
+
BN_free(x_bn);
|
|
945
|
+
BN_free(y_bn);
|
|
946
|
+
throw std::runtime_error("Failed to decode EC public key coordinates");
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// Build uncompressed point: 0x04 || x_padded || y_padded
|
|
950
|
+
std::vector<uint8_t> pub_oct(1 + 2 * field_size, 0);
|
|
951
|
+
pub_oct[0] = 0x04;
|
|
952
|
+
BN_bn2binpad(x_bn, pub_oct.data() + 1, static_cast<int>(field_size));
|
|
953
|
+
BN_bn2binpad(y_bn, pub_oct.data() + 1 + field_size, static_cast<int>(field_size));
|
|
954
|
+
BN_free(x_bn);
|
|
955
|
+
BN_free(y_bn);
|
|
956
|
+
|
|
957
|
+
BIGNUM* d_bn = nullptr;
|
|
958
|
+
if (isPrivate) {
|
|
959
|
+
d_bn = base64url_to_bn(keyData.d.value());
|
|
960
|
+
if (!d_bn)
|
|
961
|
+
throw std::runtime_error("Failed to decode EC private key");
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
EVP_PKEY* pkey = nullptr;
|
|
965
|
+
try {
|
|
966
|
+
pkey = createEcEvpPkey(group_name, pub_oct.data(), pub_oct.size(), d_bn);
|
|
967
|
+
} catch (...) {
|
|
968
|
+
BN_free(d_bn);
|
|
969
|
+
throw;
|
|
970
|
+
}
|
|
971
|
+
BN_free(d_bn);
|
|
972
|
+
|
|
973
|
+
KeyType type = isPrivate ? KeyType::PRIVATE : KeyType::PUBLIC;
|
|
974
|
+
data_ = KeyObjectData::CreateAsymmetric(type, ncrypto::EVPKeyPointer(pkey));
|
|
975
|
+
return type;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// Handle OKP keys (Ed25519, Ed448, X25519, X448) per RFC 8037
|
|
979
|
+
if (kty == JWKkty::OKP) {
|
|
980
|
+
bool isPrivate = keyData.d.has_value();
|
|
981
|
+
|
|
982
|
+
if (!keyData.crv.has_value() || !keyData.x.has_value()) {
|
|
983
|
+
throw std::runtime_error("JWK OKP key missing required fields (crv, x)");
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
std::string crv = keyData.crv.value();
|
|
987
|
+
|
|
988
|
+
int evpType;
|
|
989
|
+
if (crv == "Ed25519") {
|
|
990
|
+
evpType = EVP_PKEY_ED25519;
|
|
991
|
+
} else if (crv == "Ed448") {
|
|
992
|
+
evpType = EVP_PKEY_ED448;
|
|
993
|
+
} else if (crv == "X25519") {
|
|
994
|
+
evpType = EVP_PKEY_X25519;
|
|
995
|
+
} else if (crv == "X448") {
|
|
996
|
+
evpType = EVP_PKEY_X448;
|
|
997
|
+
} else {
|
|
998
|
+
throw std::runtime_error("Unsupported OKP curve: " + crv);
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
if (isPrivate) {
|
|
1002
|
+
std::string privBytes = base64url_decode(keyData.d.value());
|
|
1003
|
+
EVP_PKEY* pkey =
|
|
1004
|
+
EVP_PKEY_new_raw_private_key(evpType, nullptr, reinterpret_cast<const unsigned char*>(privBytes.data()), privBytes.size());
|
|
1005
|
+
if (!pkey) {
|
|
1006
|
+
throw std::runtime_error("Failed to create OKP private key from JWK");
|
|
1007
|
+
}
|
|
1008
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, ncrypto::EVPKeyPointer(pkey));
|
|
1009
|
+
return KeyType::PRIVATE;
|
|
1010
|
+
} else {
|
|
1011
|
+
std::string pubBytes = base64url_decode(keyData.x.value());
|
|
1012
|
+
EVP_PKEY* pkey =
|
|
1013
|
+
EVP_PKEY_new_raw_public_key(evpType, nullptr, reinterpret_cast<const unsigned char*>(pubBytes.data()), pubBytes.size());
|
|
1014
|
+
if (!pkey) {
|
|
1015
|
+
throw std::runtime_error("Failed to create OKP public key from JWK");
|
|
1016
|
+
}
|
|
1017
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, ncrypto::EVPKeyPointer(pkey));
|
|
1018
|
+
return KeyType::PUBLIC;
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
1023
|
+
// Handle AKP keys (ML-DSA, ML-KEM)
|
|
1024
|
+
if (kty == JWKkty::AKP) {
|
|
1025
|
+
if (!keyData.alg.has_value()) {
|
|
1026
|
+
throw std::runtime_error("JWK AKP key missing 'alg' field");
|
|
1027
|
+
}
|
|
1028
|
+
if (!keyData.pub.has_value()) {
|
|
1029
|
+
throw std::runtime_error("JWK AKP key missing 'pub' field");
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
const std::string& alg = keyData.alg.value();
|
|
1033
|
+
int nid = 0;
|
|
1034
|
+
if (alg == "ML-DSA-44")
|
|
1035
|
+
nid = EVP_PKEY_ML_DSA_44;
|
|
1036
|
+
else if (alg == "ML-DSA-65")
|
|
1037
|
+
nid = EVP_PKEY_ML_DSA_65;
|
|
1038
|
+
else if (alg == "ML-DSA-87")
|
|
1039
|
+
nid = EVP_PKEY_ML_DSA_87;
|
|
1040
|
+
else if (alg == "ML-KEM-512")
|
|
1041
|
+
nid = EVP_PKEY_ML_KEM_512;
|
|
1042
|
+
else if (alg == "ML-KEM-768")
|
|
1043
|
+
nid = EVP_PKEY_ML_KEM_768;
|
|
1044
|
+
else if (alg == "ML-KEM-1024")
|
|
1045
|
+
nid = EVP_PKEY_ML_KEM_1024;
|
|
1046
|
+
else if (alg == "SLH-DSA-SHA2-128s")
|
|
1047
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_128S;
|
|
1048
|
+
else if (alg == "SLH-DSA-SHA2-128f")
|
|
1049
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_128F;
|
|
1050
|
+
else if (alg == "SLH-DSA-SHA2-192s")
|
|
1051
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_192S;
|
|
1052
|
+
else if (alg == "SLH-DSA-SHA2-192f")
|
|
1053
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_192F;
|
|
1054
|
+
else if (alg == "SLH-DSA-SHA2-256s")
|
|
1055
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_256S;
|
|
1056
|
+
else if (alg == "SLH-DSA-SHA2-256f")
|
|
1057
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_256F;
|
|
1058
|
+
else if (alg == "SLH-DSA-SHAKE-128s")
|
|
1059
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_128S;
|
|
1060
|
+
else if (alg == "SLH-DSA-SHAKE-128f")
|
|
1061
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_128F;
|
|
1062
|
+
else if (alg == "SLH-DSA-SHAKE-192s")
|
|
1063
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_192S;
|
|
1064
|
+
else if (alg == "SLH-DSA-SHAKE-192f")
|
|
1065
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_192F;
|
|
1066
|
+
else if (alg == "SLH-DSA-SHAKE-256s")
|
|
1067
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_256S;
|
|
1068
|
+
else if (alg == "SLH-DSA-SHAKE-256f")
|
|
1069
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_256F;
|
|
1070
|
+
else
|
|
1071
|
+
throw std::runtime_error("Unsupported JWK AKP \"alg\": " + alg);
|
|
1072
|
+
|
|
1073
|
+
bool isPrivate = keyData.priv.has_value();
|
|
1074
|
+
ncrypto::EVPKeyPointer pkey;
|
|
1075
|
+
|
|
1076
|
+
if (isPrivate) {
|
|
1077
|
+
std::string seedBytes = base64url_decode(keyData.priv.value());
|
|
1078
|
+
ncrypto::Buffer<const unsigned char> buf{
|
|
1079
|
+
.data = reinterpret_cast<const unsigned char*>(seedBytes.data()),
|
|
1080
|
+
.len = seedBytes.size(),
|
|
1081
|
+
};
|
|
1082
|
+
pkey = ncrypto::EVPKeyPointer::NewRawSeed(nid, buf);
|
|
1083
|
+
if (!pkey) {
|
|
1084
|
+
throw std::runtime_error("Invalid JWK AKP key");
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
// Verify the pub field matches the public key derived from the seed.
|
|
1088
|
+
std::string pubBytes = base64url_decode(keyData.pub.value());
|
|
1089
|
+
auto derivedPub = pkey.rawPublicKey();
|
|
1090
|
+
if (!derivedPub || derivedPub.size() != pubBytes.size() || CRYPTO_memcmp(derivedPub.get(), pubBytes.data(), pubBytes.size()) != 0) {
|
|
1091
|
+
throw std::runtime_error("Invalid JWK AKP key");
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, std::move(pkey));
|
|
1095
|
+
return KeyType::PRIVATE;
|
|
1096
|
+
} else {
|
|
1097
|
+
std::string pubBytes = base64url_decode(keyData.pub.value());
|
|
1098
|
+
ncrypto::Buffer<const unsigned char> buf{
|
|
1099
|
+
.data = reinterpret_cast<const unsigned char*>(pubBytes.data()),
|
|
1100
|
+
.len = pubBytes.size(),
|
|
1101
|
+
};
|
|
1102
|
+
pkey = ncrypto::EVPKeyPointer::NewRawPublic(nid, buf);
|
|
1103
|
+
if (!pkey) {
|
|
1104
|
+
throw std::runtime_error("Invalid JWK AKP key");
|
|
1105
|
+
}
|
|
1106
|
+
data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, std::move(pkey));
|
|
1107
|
+
return KeyType::PUBLIC;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
#endif
|
|
1111
|
+
|
|
1112
|
+
throw std::runtime_error("Unsupported JWK key type");
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
KeyDetail HybridKeyObjectHandle::keyDetail() {
|
|
1116
|
+
const auto& pkey_ptr = data_.GetAsymmetricKey();
|
|
1117
|
+
if (!pkey_ptr) {
|
|
1118
|
+
return KeyDetail{};
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
EVP_PKEY* pkey = pkey_ptr.get();
|
|
1122
|
+
int keyType = EVP_PKEY_base_id(pkey);
|
|
1123
|
+
|
|
1124
|
+
if (keyType == EVP_PKEY_RSA) {
|
|
1125
|
+
// Extract RSA key details
|
|
1126
|
+
int modulusLength = EVP_PKEY_bits(pkey);
|
|
1127
|
+
|
|
1128
|
+
// Extract public exponent (typically 65537 = 0x10001)
|
|
1129
|
+
const RSA* rsa = EVP_PKEY_get0_RSA(pkey);
|
|
1130
|
+
if (rsa) {
|
|
1131
|
+
const BIGNUM* e_bn = nullptr;
|
|
1132
|
+
RSA_get0_key(rsa, nullptr, &e_bn, nullptr);
|
|
1133
|
+
if (e_bn) {
|
|
1134
|
+
unsigned long exponent_val = BN_get_word(e_bn);
|
|
1135
|
+
return KeyDetail(std::nullopt, static_cast<double>(exponent_val), static_cast<double>(modulusLength), std::nullopt, std::nullopt,
|
|
1136
|
+
std::nullopt, std::nullopt);
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
// Fallback if we couldn't extract the exponent
|
|
1141
|
+
return KeyDetail(std::nullopt, std::nullopt, static_cast<double>(modulusLength), std::nullopt, std::nullopt, std::nullopt,
|
|
1142
|
+
std::nullopt);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
if (keyType == EVP_PKEY_EC) {
|
|
1146
|
+
char curve_name[64];
|
|
1147
|
+
size_t name_len = 0;
|
|
1148
|
+
if (EVP_PKEY_get_utf8_string_param(pkey, OSSL_PKEY_PARAM_GROUP_NAME, curve_name, sizeof(curve_name), &name_len) == 1) {
|
|
1149
|
+
return KeyDetail(std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt,
|
|
1150
|
+
std::string(curve_name, name_len));
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
return KeyDetail{};
|
|
1155
|
+
}
|
|
1156
|
+
|
|
1157
|
+
bool HybridKeyObjectHandle::initRawKey(KeyType keyType, std::shared_ptr<ArrayBuffer> keyData) {
|
|
1158
|
+
// For asymmetric keys (x25519/x448/ed25519/ed448), we need to determine the curve type
|
|
1159
|
+
// Based on key size: x25519=32 bytes, x448=56 bytes, ed25519=32 bytes, ed448=57 bytes
|
|
1160
|
+
int curveId = -1;
|
|
1161
|
+
size_t keySize = keyData->size();
|
|
1162
|
+
|
|
1163
|
+
if (keySize == 32) {
|
|
1164
|
+
// Could be x25519 or ed25519 - for now assume x25519 based on test context
|
|
1165
|
+
curveId = EVP_PKEY_X25519;
|
|
1166
|
+
} else if (keySize == 56) {
|
|
1167
|
+
curveId = EVP_PKEY_X448;
|
|
1168
|
+
} else if (keySize == 57) {
|
|
1169
|
+
curveId = EVP_PKEY_ED448;
|
|
1170
|
+
} else {
|
|
1171
|
+
throw std::runtime_error("Invalid key size: expected 32, 56, or 57 bytes for curve keys");
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
ncrypto::Buffer<const unsigned char> buffer{.data = reinterpret_cast<const unsigned char*>(keyData->data()), .len = keyData->size()};
|
|
1175
|
+
|
|
1176
|
+
ncrypto::EVPKeyPointer pkey;
|
|
1177
|
+
if (keyType == KeyType::PRIVATE) {
|
|
1178
|
+
pkey = ncrypto::EVPKeyPointer::NewRawPrivate(curveId, buffer);
|
|
1179
|
+
} else if (keyType == KeyType::PUBLIC) {
|
|
1180
|
+
pkey = ncrypto::EVPKeyPointer::NewRawPublic(curveId, buffer);
|
|
1181
|
+
} else {
|
|
1182
|
+
throw std::runtime_error("Raw keys are only supported for asymmetric key types");
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
if (!pkey) {
|
|
1186
|
+
throw std::runtime_error("Failed to create key from raw data");
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
this->data_ = KeyObjectData::CreateAsymmetric(keyType, std::move(pkey));
|
|
1190
|
+
return true;
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
bool HybridKeyObjectHandle::initECRaw(const std::string& namedCurve, const std::shared_ptr<ArrayBuffer>& keyData) {
|
|
1194
|
+
// Reset any existing data
|
|
1195
|
+
data_ = KeyObjectData();
|
|
1196
|
+
|
|
1197
|
+
// Map curve name to NID (same logic as HybridEcKeyPair::GetCurveFromName)
|
|
1198
|
+
int nid = 0;
|
|
1199
|
+
if (namedCurve == "prime256v1" || namedCurve == "P-256") {
|
|
1200
|
+
nid = NID_X9_62_prime256v1;
|
|
1201
|
+
} else if (namedCurve == "secp384r1" || namedCurve == "P-384") {
|
|
1202
|
+
nid = NID_secp384r1;
|
|
1203
|
+
} else if (namedCurve == "secp521r1" || namedCurve == "P-521") {
|
|
1204
|
+
nid = NID_secp521r1;
|
|
1205
|
+
} else if (namedCurve == "secp256k1") {
|
|
1206
|
+
nid = NID_secp256k1;
|
|
1207
|
+
} else {
|
|
1208
|
+
// Try standard OpenSSL name resolution
|
|
1209
|
+
nid = OBJ_txt2nid(namedCurve.c_str());
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
if (nid == 0) {
|
|
1213
|
+
throw std::runtime_error("Unknown curve: " + namedCurve);
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
// Get the OpenSSL group name for this curve
|
|
1217
|
+
const char* group_name = OBJ_nid2sn(nid);
|
|
1218
|
+
if (!group_name) {
|
|
1219
|
+
throw std::runtime_error("Failed to get curve name for NID");
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
EVP_PKEY* pkey = createEcEvpPkey(group_name, keyData->data(), keyData->size());
|
|
1223
|
+
this->data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, ncrypto::EVPKeyPointer(pkey));
|
|
1224
|
+
return true;
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
bool HybridKeyObjectHandle::initPqcRaw(const std::string& algorithmName, const std::shared_ptr<ArrayBuffer>& keyData, bool isPublic) {
|
|
1228
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
1229
|
+
data_ = KeyObjectData();
|
|
1230
|
+
|
|
1231
|
+
int nid = 0;
|
|
1232
|
+
if (algorithmName == "ML-KEM-512")
|
|
1233
|
+
nid = EVP_PKEY_ML_KEM_512;
|
|
1234
|
+
else if (algorithmName == "ML-KEM-768")
|
|
1235
|
+
nid = EVP_PKEY_ML_KEM_768;
|
|
1236
|
+
else if (algorithmName == "ML-KEM-1024")
|
|
1237
|
+
nid = EVP_PKEY_ML_KEM_1024;
|
|
1238
|
+
else if (algorithmName == "ML-DSA-44")
|
|
1239
|
+
nid = EVP_PKEY_ML_DSA_44;
|
|
1240
|
+
else if (algorithmName == "ML-DSA-65")
|
|
1241
|
+
nid = EVP_PKEY_ML_DSA_65;
|
|
1242
|
+
else if (algorithmName == "ML-DSA-87")
|
|
1243
|
+
nid = EVP_PKEY_ML_DSA_87;
|
|
1244
|
+
else if (algorithmName == "SLH-DSA-SHA2-128s")
|
|
1245
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_128S;
|
|
1246
|
+
else if (algorithmName == "SLH-DSA-SHA2-128f")
|
|
1247
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_128F;
|
|
1248
|
+
else if (algorithmName == "SLH-DSA-SHA2-192s")
|
|
1249
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_192S;
|
|
1250
|
+
else if (algorithmName == "SLH-DSA-SHA2-192f")
|
|
1251
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_192F;
|
|
1252
|
+
else if (algorithmName == "SLH-DSA-SHA2-256s")
|
|
1253
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_256S;
|
|
1254
|
+
else if (algorithmName == "SLH-DSA-SHA2-256f")
|
|
1255
|
+
nid = EVP_PKEY_SLH_DSA_SHA2_256F;
|
|
1256
|
+
else if (algorithmName == "SLH-DSA-SHAKE-128s")
|
|
1257
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_128S;
|
|
1258
|
+
else if (algorithmName == "SLH-DSA-SHAKE-128f")
|
|
1259
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_128F;
|
|
1260
|
+
else if (algorithmName == "SLH-DSA-SHAKE-192s")
|
|
1261
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_192S;
|
|
1262
|
+
else if (algorithmName == "SLH-DSA-SHAKE-192f")
|
|
1263
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_192F;
|
|
1264
|
+
else if (algorithmName == "SLH-DSA-SHAKE-256s")
|
|
1265
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_256S;
|
|
1266
|
+
else if (algorithmName == "SLH-DSA-SHAKE-256f")
|
|
1267
|
+
nid = EVP_PKEY_SLH_DSA_SHAKE_256F;
|
|
1268
|
+
else
|
|
1269
|
+
throw std::runtime_error("Unknown PQC algorithm: " + algorithmName);
|
|
1270
|
+
|
|
1271
|
+
ncrypto::Buffer<const unsigned char> buffer{.data = reinterpret_cast<const unsigned char*>(keyData->data()), .len = keyData->size()};
|
|
1272
|
+
|
|
1273
|
+
ncrypto::EVPKeyPointer pkey;
|
|
1274
|
+
if (isPublic) {
|
|
1275
|
+
pkey = ncrypto::EVPKeyPointer::NewRawPublic(nid, buffer);
|
|
1276
|
+
} else {
|
|
1277
|
+
pkey = ncrypto::EVPKeyPointer::NewRawSeed(nid, buffer);
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
if (!pkey) {
|
|
1281
|
+
return false;
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
auto keyType = isPublic ? KeyType::PUBLIC : KeyType::PRIVATE;
|
|
1285
|
+
this->data_ = KeyObjectData::CreateAsymmetric(keyType, std::move(pkey));
|
|
1286
|
+
return true;
|
|
1287
|
+
#else
|
|
1288
|
+
throw std::runtime_error("PQC raw key import requires OpenSSL 3.5+");
|
|
1289
|
+
#endif
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// Map a string asymmetricKeyType to an EVP_PKEY NID for OKP/PQC keys.
|
|
1293
|
+
// Returns 0 if the type is not a known OKP or PQC type.
|
|
1294
|
+
static int evpNidForAsymmetricKeyType(const std::string& asymmetricKeyType) {
|
|
1295
|
+
if (asymmetricKeyType == "ed25519")
|
|
1296
|
+
return EVP_PKEY_ED25519;
|
|
1297
|
+
if (asymmetricKeyType == "ed448")
|
|
1298
|
+
return EVP_PKEY_ED448;
|
|
1299
|
+
if (asymmetricKeyType == "x25519")
|
|
1300
|
+
return EVP_PKEY_X25519;
|
|
1301
|
+
if (asymmetricKeyType == "x448")
|
|
1302
|
+
return EVP_PKEY_X448;
|
|
1303
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
1304
|
+
if (asymmetricKeyType == "ml-dsa-44")
|
|
1305
|
+
return EVP_PKEY_ML_DSA_44;
|
|
1306
|
+
if (asymmetricKeyType == "ml-dsa-65")
|
|
1307
|
+
return EVP_PKEY_ML_DSA_65;
|
|
1308
|
+
if (asymmetricKeyType == "ml-dsa-87")
|
|
1309
|
+
return EVP_PKEY_ML_DSA_87;
|
|
1310
|
+
if (asymmetricKeyType == "ml-kem-512")
|
|
1311
|
+
return EVP_PKEY_ML_KEM_512;
|
|
1312
|
+
if (asymmetricKeyType == "ml-kem-768")
|
|
1313
|
+
return EVP_PKEY_ML_KEM_768;
|
|
1314
|
+
if (asymmetricKeyType == "ml-kem-1024")
|
|
1315
|
+
return EVP_PKEY_ML_KEM_1024;
|
|
1316
|
+
if (asymmetricKeyType == "slh-dsa-sha2-128s")
|
|
1317
|
+
return EVP_PKEY_SLH_DSA_SHA2_128S;
|
|
1318
|
+
if (asymmetricKeyType == "slh-dsa-sha2-128f")
|
|
1319
|
+
return EVP_PKEY_SLH_DSA_SHA2_128F;
|
|
1320
|
+
if (asymmetricKeyType == "slh-dsa-sha2-192s")
|
|
1321
|
+
return EVP_PKEY_SLH_DSA_SHA2_192S;
|
|
1322
|
+
if (asymmetricKeyType == "slh-dsa-sha2-192f")
|
|
1323
|
+
return EVP_PKEY_SLH_DSA_SHA2_192F;
|
|
1324
|
+
if (asymmetricKeyType == "slh-dsa-sha2-256s")
|
|
1325
|
+
return EVP_PKEY_SLH_DSA_SHA2_256S;
|
|
1326
|
+
if (asymmetricKeyType == "slh-dsa-sha2-256f")
|
|
1327
|
+
return EVP_PKEY_SLH_DSA_SHA2_256F;
|
|
1328
|
+
if (asymmetricKeyType == "slh-dsa-shake-128s")
|
|
1329
|
+
return EVP_PKEY_SLH_DSA_SHAKE_128S;
|
|
1330
|
+
if (asymmetricKeyType == "slh-dsa-shake-128f")
|
|
1331
|
+
return EVP_PKEY_SLH_DSA_SHAKE_128F;
|
|
1332
|
+
if (asymmetricKeyType == "slh-dsa-shake-192s")
|
|
1333
|
+
return EVP_PKEY_SLH_DSA_SHAKE_192S;
|
|
1334
|
+
if (asymmetricKeyType == "slh-dsa-shake-192f")
|
|
1335
|
+
return EVP_PKEY_SLH_DSA_SHAKE_192F;
|
|
1336
|
+
if (asymmetricKeyType == "slh-dsa-shake-256s")
|
|
1337
|
+
return EVP_PKEY_SLH_DSA_SHAKE_256S;
|
|
1338
|
+
if (asymmetricKeyType == "slh-dsa-shake-256f")
|
|
1339
|
+
return EVP_PKEY_SLH_DSA_SHAKE_256F;
|
|
1340
|
+
#endif
|
|
1341
|
+
return 0;
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
bool HybridKeyObjectHandle::initRawPublic(const std::string& asymmetricKeyType, const std::shared_ptr<ArrayBuffer>& keyData,
|
|
1345
|
+
const std::optional<std::string>& namedCurve) {
|
|
1346
|
+
data_ = KeyObjectData();
|
|
1347
|
+
|
|
1348
|
+
if (asymmetricKeyType == "ec") {
|
|
1349
|
+
if (!namedCurve.has_value()) {
|
|
1350
|
+
throw std::runtime_error("namedCurve is required for EC raw public key import");
|
|
1351
|
+
}
|
|
1352
|
+
return initECRaw(namedCurve.value(), keyData);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
int nid = evpNidForAsymmetricKeyType(asymmetricKeyType);
|
|
1356
|
+
if (nid == 0) {
|
|
1357
|
+
throw std::runtime_error("Invalid asymmetricKeyType for raw public key import: " + asymmetricKeyType);
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
ncrypto::Buffer<const unsigned char> buffer{.data = reinterpret_cast<const unsigned char*>(keyData->data()), .len = keyData->size()};
|
|
1361
|
+
auto pkey = ncrypto::EVPKeyPointer::NewRawPublic(nid, buffer);
|
|
1362
|
+
if (!pkey) {
|
|
1363
|
+
throw std::runtime_error("Failed to create raw public key");
|
|
1364
|
+
}
|
|
1365
|
+
this->data_ = KeyObjectData::CreateAsymmetric(KeyType::PUBLIC, std::move(pkey));
|
|
1366
|
+
return true;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
bool HybridKeyObjectHandle::initRawPrivate(const std::string& asymmetricKeyType, const std::shared_ptr<ArrayBuffer>& keyData,
|
|
1370
|
+
const std::optional<std::string>& namedCurve) {
|
|
1371
|
+
data_ = KeyObjectData();
|
|
1372
|
+
|
|
1373
|
+
if (asymmetricKeyType == "ec") {
|
|
1374
|
+
if (!namedCurve.has_value()) {
|
|
1375
|
+
throw std::runtime_error("namedCurve is required for EC raw private key import");
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
int nid = 0;
|
|
1379
|
+
const std::string& curve = namedCurve.value();
|
|
1380
|
+
if (curve == "prime256v1" || curve == "P-256")
|
|
1381
|
+
nid = NID_X9_62_prime256v1;
|
|
1382
|
+
else if (curve == "secp384r1" || curve == "P-384")
|
|
1383
|
+
nid = NID_secp384r1;
|
|
1384
|
+
else if (curve == "secp521r1" || curve == "P-521")
|
|
1385
|
+
nid = NID_secp521r1;
|
|
1386
|
+
else if (curve == "secp256k1")
|
|
1387
|
+
nid = NID_secp256k1;
|
|
1388
|
+
else
|
|
1389
|
+
nid = OBJ_txt2nid(curve.c_str());
|
|
1390
|
+
|
|
1391
|
+
if (nid == 0) {
|
|
1392
|
+
throw std::runtime_error("Unknown curve: " + curve);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
auto ec_key = std::unique_ptr<EC_KEY, decltype(&EC_KEY_free)>(EC_KEY_new_by_curve_name(nid), EC_KEY_free);
|
|
1396
|
+
if (!ec_key) {
|
|
1397
|
+
throw std::runtime_error("Failed to create EC_KEY");
|
|
1398
|
+
}
|
|
1399
|
+
const EC_GROUP* group = EC_KEY_get0_group(ec_key.get());
|
|
1400
|
+
|
|
1401
|
+
BIGNUM* order = BN_new();
|
|
1402
|
+
if (!order || EC_GROUP_get_order(group, order, nullptr) != 1) {
|
|
1403
|
+
if (order)
|
|
1404
|
+
BN_free(order);
|
|
1405
|
+
throw std::runtime_error("Failed to get EC group order");
|
|
1406
|
+
}
|
|
1407
|
+
size_t order_size = (BN_num_bits(order) + 7) / 8;
|
|
1408
|
+
BN_free(order);
|
|
1409
|
+
|
|
1410
|
+
if (keyData->size() != order_size) {
|
|
1411
|
+
throw std::runtime_error("Invalid EC private key length");
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
BIGNUM* priv_bn = BN_bin2bn(reinterpret_cast<const unsigned char*>(keyData->data()), static_cast<int>(keyData->size()), nullptr);
|
|
1415
|
+
if (!priv_bn) {
|
|
1416
|
+
throw std::runtime_error("Failed to decode EC private key");
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
if (EC_KEY_set_private_key(ec_key.get(), priv_bn) != 1) {
|
|
1420
|
+
BN_free(priv_bn);
|
|
1421
|
+
throw std::runtime_error("Failed to set EC private key");
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
auto pub_point = std::unique_ptr<EC_POINT, decltype(&EC_POINT_free)>(EC_POINT_new(group), EC_POINT_free);
|
|
1425
|
+
if (!pub_point || EC_POINT_mul(group, pub_point.get(), priv_bn, nullptr, nullptr, nullptr) != 1 ||
|
|
1426
|
+
EC_KEY_set_public_key(ec_key.get(), pub_point.get()) != 1) {
|
|
1427
|
+
BN_free(priv_bn);
|
|
1428
|
+
throw std::runtime_error("Failed to derive EC public key");
|
|
1429
|
+
}
|
|
1430
|
+
BN_free(priv_bn);
|
|
1431
|
+
|
|
1432
|
+
EVP_PKEY* pkey = EVP_PKEY_new();
|
|
1433
|
+
if (!pkey || EVP_PKEY_assign_EC_KEY(pkey, ec_key.get()) != 1) {
|
|
1434
|
+
if (pkey)
|
|
1435
|
+
EVP_PKEY_free(pkey);
|
|
1436
|
+
throw std::runtime_error("Failed to create EVP_PKEY from EC_KEY");
|
|
1437
|
+
}
|
|
1438
|
+
ec_key.release();
|
|
1439
|
+
|
|
1440
|
+
this->data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, ncrypto::EVPKeyPointer(pkey));
|
|
1441
|
+
return true;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
int nid = evpNidForAsymmetricKeyType(asymmetricKeyType);
|
|
1445
|
+
if (nid == 0) {
|
|
1446
|
+
throw std::runtime_error("Invalid asymmetricKeyType for raw private key import: " + asymmetricKeyType);
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
ncrypto::Buffer<const unsigned char> buffer{.data = reinterpret_cast<const unsigned char*>(keyData->data()), .len = keyData->size()};
|
|
1450
|
+
auto pkey = ncrypto::EVPKeyPointer::NewRawPrivate(nid, buffer);
|
|
1451
|
+
if (!pkey) {
|
|
1452
|
+
throw std::runtime_error("Failed to create raw private key");
|
|
1453
|
+
}
|
|
1454
|
+
this->data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, std::move(pkey));
|
|
1455
|
+
return true;
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
bool HybridKeyObjectHandle::initRawSeed(const std::string& asymmetricKeyType, const std::shared_ptr<ArrayBuffer>& keyData) {
|
|
1459
|
+
#if OPENSSL_VERSION_NUMBER >= 0x30500000L
|
|
1460
|
+
data_ = KeyObjectData();
|
|
1461
|
+
|
|
1462
|
+
int nid = evpNidForAsymmetricKeyType(asymmetricKeyType);
|
|
1463
|
+
if (nid == 0) {
|
|
1464
|
+
throw std::runtime_error("Invalid asymmetricKeyType for raw seed import: " + asymmetricKeyType);
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
ncrypto::Buffer<const unsigned char> buffer{.data = reinterpret_cast<const unsigned char*>(keyData->data()), .len = keyData->size()};
|
|
1468
|
+
auto pkey = ncrypto::EVPKeyPointer::NewRawSeed(nid, buffer);
|
|
1469
|
+
if (!pkey) {
|
|
1470
|
+
throw std::runtime_error("Failed to create key from raw seed");
|
|
1471
|
+
}
|
|
1472
|
+
this->data_ = KeyObjectData::CreateAsymmetric(KeyType::PRIVATE, std::move(pkey));
|
|
1473
|
+
return true;
|
|
1474
|
+
#else
|
|
1475
|
+
throw std::runtime_error("Raw seed import requires OpenSSL 3.5+");
|
|
1476
|
+
#endif
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
bool HybridKeyObjectHandle::keyEquals(const std::shared_ptr<HybridKeyObjectHandleSpec>& other) {
|
|
1480
|
+
auto otherHandle = std::dynamic_pointer_cast<HybridKeyObjectHandle>(other);
|
|
1481
|
+
if (!otherHandle)
|
|
1482
|
+
return false;
|
|
1483
|
+
|
|
1484
|
+
const auto& otherData = otherHandle->getKeyObjectData();
|
|
1485
|
+
if (data_.GetKeyType() != otherData.GetKeyType())
|
|
1486
|
+
return false;
|
|
1487
|
+
|
|
1488
|
+
if (data_.GetKeyType() == KeyType::SECRET) {
|
|
1489
|
+
auto thisKey = data_.GetSymmetricKey();
|
|
1490
|
+
auto otherKey = otherData.GetSymmetricKey();
|
|
1491
|
+
if (thisKey->size() != otherKey->size())
|
|
1492
|
+
return false;
|
|
1493
|
+
return CRYPTO_memcmp(thisKey->data(), otherKey->data(), thisKey->size()) == 0;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
const auto& thisPkey = data_.GetAsymmetricKey();
|
|
1497
|
+
const auto& otherPkey = otherData.GetAsymmetricKey();
|
|
1498
|
+
if (!thisPkey || !otherPkey)
|
|
1499
|
+
return false;
|
|
1500
|
+
return EVP_PKEY_eq(thisPkey.get(), otherPkey.get()) == 1;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
double HybridKeyObjectHandle::getSymmetricKeySize() {
|
|
1504
|
+
return static_cast<double>(data_.GetSymmetricKeySize());
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
bool HybridKeyObjectHandle::checkEcKeyData() {
|
|
1508
|
+
const auto& pkey = data_.GetAsymmetricKey();
|
|
1509
|
+
if (!pkey || EVP_PKEY_id(pkey.get()) != EVP_PKEY_EC) {
|
|
1510
|
+
return false;
|
|
1511
|
+
}
|
|
1512
|
+
auto ctx = pkey.newCtx();
|
|
1513
|
+
if (!ctx) {
|
|
1514
|
+
return false;
|
|
1515
|
+
}
|
|
1516
|
+
return data_.GetKeyType() == KeyType::PRIVATE ? ctx.privateCheck() : ctx.publicCheck();
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
} // namespace margelo::nitro::crypto
|