react-native-quick-crypto 0.7.3 → 1.0.0-beta.2
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 +34 -0
- package/README.md +13 -46
- package/android/CMakeLists.txt +32 -64
- package/android/build.gradle +52 -125
- package/android/gradle.properties +4 -4
- package/android/src/main/cpp/cpp-adapter.cpp +9 -54
- package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +38 -0
- package/cpp/random/HybridRandom.cpp +34 -0
- package/cpp/random/HybridRandom.hpp +44 -0
- package/cpp/utils/Utils.hpp +9 -0
- package/ios/QuickCryptoOnLoad.mm +19 -0
- package/lib/commonjs/index.js +39 -39
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/random.js +26 -12
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/{NativeQuickCrypto/rsa.js → specs/random.nitro.js} +1 -1
- package/lib/commonjs/{NativeQuickCrypto/aes.js.map → specs/random.nitro.js.map} +1 -1
- package/lib/commonjs/utils/conversion.js +22 -0
- package/lib/commonjs/utils/conversion.js.map +1 -0
- package/lib/commonjs/utils/index.js +12 -0
- package/lib/commonjs/utils/index.js.map +1 -0
- package/lib/commonjs/utils/types.js +2 -0
- package/lib/{module/NativeQuickCrypto/aes.js.map → commonjs/utils/types.js.map} +1 -1
- package/lib/module/index.js +38 -38
- package/lib/module/index.js.map +1 -1
- package/lib/module/random.js +26 -12
- package/lib/module/random.js.map +1 -1
- package/lib/module/specs/random.nitro.js +4 -0
- package/lib/module/{NativeQuickCrypto/rsa.js.map → specs/random.nitro.js.map} +1 -1
- package/lib/module/utils/conversion.js +16 -0
- package/lib/module/utils/conversion.js.map +1 -0
- package/lib/module/utils/index.js +8 -0
- package/lib/module/utils/index.js.map +1 -0
- package/lib/module/utils/types.js +2 -0
- package/lib/{commonjs/NativeQuickCrypto/rsa.js.map → module/utils/types.js.map} +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/typescript/index.d.ts +10 -141
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/random.d.ts +4 -5
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/specs/random.nitro.d.ts +9 -0
- package/lib/typescript/specs/random.nitro.d.ts.map +1 -0
- package/lib/typescript/utils/conversion.d.ts +4 -0
- package/lib/typescript/utils/conversion.d.ts.map +1 -0
- package/lib/typescript/utils/index.d.ts +6 -0
- package/lib/typescript/utils/index.d.ts.map +1 -0
- package/lib/typescript/utils/types.d.ts +5 -0
- package/lib/typescript/utils/types.d.ts.map +1 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +45 -0
- package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +26 -0
- package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +57 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +9 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +25 -0
- package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +29 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +62 -0
- package/package.json +50 -106
- package/src/index.ts +38 -48
- package/src/random.ts +51 -48
- package/src/specs/random.nitro.ts +14 -0
- package/src/utils/conversion.ts +16 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/types.ts +15 -0
- package/LICENSE +0 -27
- package/android/src/main/java/com/margelo/quickcrypto/QuickCryptoModule.java +0 -70
- package/android/src/main/java/com/margelo/quickcrypto/QuickCryptoPackage.java +0 -25
- package/cpp/Cipher/MGLCipherHostObject.cpp +0 -663
- package/cpp/Cipher/MGLCipherHostObject.h +0 -90
- package/cpp/Cipher/MGLCreateCipherInstaller.cpp +0 -75
- package/cpp/Cipher/MGLCreateCipherInstaller.h +0 -22
- package/cpp/Cipher/MGLCreateDecipherInstaller.cpp +0 -77
- package/cpp/Cipher/MGLCreateDecipherInstaller.h +0 -17
- package/cpp/Cipher/MGLGenerateKeyPairInstaller.cpp +0 -134
- package/cpp/Cipher/MGLGenerateKeyPairInstaller.h +0 -35
- package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.cpp +0 -63
- package/cpp/Cipher/MGLGenerateKeyPairSyncInstaller.h +0 -37
- package/cpp/Cipher/MGLPublicCipher.h +0 -124
- package/cpp/Cipher/MGLPublicCipherInstaller.h +0 -107
- package/cpp/Cipher/MGLRsa.cpp +0 -573
- package/cpp/Cipher/MGLRsa.h +0 -109
- package/cpp/HMAC/MGLHmacHostObject.cpp +0 -95
- package/cpp/HMAC/MGLHmacHostObject.h +0 -39
- package/cpp/HMAC/MGLHmacInstaller.cpp +0 -43
- package/cpp/HMAC/MGLHmacInstaller.h +0 -20
- package/cpp/Hash/MGLHashHostObject.cpp +0 -147
- package/cpp/Hash/MGLHashHostObject.h +0 -53
- package/cpp/Hash/MGLHashInstaller.cpp +0 -44
- package/cpp/Hash/MGLHashInstaller.h +0 -20
- package/cpp/JSIUtils/MGLJSIMacros.h +0 -110
- package/cpp/JSIUtils/MGLJSIUtils.h +0 -41
- package/cpp/JSIUtils/MGLSmartHostObject.cpp +0 -43
- package/cpp/JSIUtils/MGLSmartHostObject.h +0 -46
- package/cpp/JSIUtils/MGLThreadAwareHostObject.cpp +0 -24
- package/cpp/JSIUtils/MGLThreadAwareHostObject.h +0 -43
- package/cpp/JSIUtils/MGLTypedArray.cpp +0 -325
- package/cpp/JSIUtils/MGLTypedArray.h +0 -160
- package/cpp/MGLKeys.cpp +0 -1426
- package/cpp/MGLKeys.h +0 -203
- package/cpp/MGLQuickCryptoHostObject.cpp +0 -127
- package/cpp/MGLQuickCryptoHostObject.h +0 -30
- package/cpp/Random/MGLRandomHostObject.cpp +0 -96
- package/cpp/Random/MGLRandomHostObject.h +0 -27
- package/cpp/Sig/MGLSignHostObjects.cpp +0 -757
- package/cpp/Sig/MGLSignHostObjects.h +0 -128
- package/cpp/Sig/MGLSignInstaller.cpp +0 -24
- package/cpp/Sig/MGLSignInstaller.h +0 -29
- package/cpp/Sig/MGLVerifyInstaller.cpp +0 -24
- package/cpp/Sig/MGLVerifyInstaller.h +0 -22
- package/cpp/Utils/MGLDispatchQueue.cpp +0 -75
- package/cpp/Utils/MGLDispatchQueue.h +0 -55
- package/cpp/Utils/MGLUtils.cpp +0 -295
- package/cpp/Utils/MGLUtils.h +0 -358
- package/cpp/Utils/base64.h +0 -320
- package/cpp/Utils/logs.h +0 -38
- package/cpp/Utils/node.h +0 -13
- package/cpp/fastpbkdf2/MGLPbkdf2HostObject.cpp +0 -164
- package/cpp/fastpbkdf2/MGLPbkdf2HostObject.h +0 -29
- package/cpp/fastpbkdf2/fastpbkdf2.c +0 -352
- package/cpp/fastpbkdf2/fastpbkdf2.h +0 -68
- package/cpp/webcrypto/MGLWebCrypto.cpp +0 -125
- package/cpp/webcrypto/MGLWebCrypto.h +0 -32
- package/cpp/webcrypto/crypto_aes.cpp +0 -516
- package/cpp/webcrypto/crypto_aes.h +0 -79
- package/cpp/webcrypto/crypto_ec.cpp +0 -424
- package/cpp/webcrypto/crypto_ec.h +0 -78
- package/cpp/webcrypto/crypto_keygen.cpp +0 -86
- package/cpp/webcrypto/crypto_keygen.h +0 -38
- package/ios/QuickCrypto.xcodeproj/project.pbxproj +0 -274
- package/ios/QuickCryptoModule.h +0 -5
- package/ios/QuickCryptoModule.mm +0 -42
- package/lib/commonjs/Cipher.js +0 -502
- package/lib/commonjs/Cipher.js.map +0 -1
- package/lib/commonjs/Hash.js +0 -99
- package/lib/commonjs/Hash.js.map +0 -1
- package/lib/commonjs/Hashnames.js +0 -87
- package/lib/commonjs/Hashnames.js.map +0 -1
- package/lib/commonjs/Hmac.js +0 -79
- package/lib/commonjs/Hmac.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/Cipher.js +0 -30
- package/lib/commonjs/NativeQuickCrypto/Cipher.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js +0 -52
- package/lib/commonjs/NativeQuickCrypto/NativeQuickCrypto.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/aes.js +0 -6
- package/lib/commonjs/NativeQuickCrypto/hash.js +0 -2
- package/lib/commonjs/NativeQuickCrypto/hash.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/hmac.js +0 -2
- package/lib/commonjs/NativeQuickCrypto/hmac.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/keygen.js +0 -6
- package/lib/commonjs/NativeQuickCrypto/keygen.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/pbkdf2.js +0 -2
- package/lib/commonjs/NativeQuickCrypto/pbkdf2.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/random.js +0 -2
- package/lib/commonjs/NativeQuickCrypto/random.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/sig.js +0 -19
- package/lib/commonjs/NativeQuickCrypto/sig.js.map +0 -1
- package/lib/commonjs/NativeQuickCrypto/webcrypto.js +0 -6
- package/lib/commonjs/NativeQuickCrypto/webcrypto.js.map +0 -1
- package/lib/commonjs/Utils.js +0 -608
- package/lib/commonjs/Utils.js.map +0 -1
- package/lib/commonjs/aes.js +0 -281
- package/lib/commonjs/aes.js.map +0 -1
- package/lib/commonjs/constants.js +0 -85
- package/lib/commonjs/constants.js.map +0 -1
- package/lib/commonjs/ec.js +0 -276
- package/lib/commonjs/ec.js.map +0 -1
- package/lib/commonjs/keygen.js +0 -56
- package/lib/commonjs/keygen.js.map +0 -1
- package/lib/commonjs/keys.js +0 -492
- package/lib/commonjs/keys.js.map +0 -1
- package/lib/commonjs/pbkdf2.js +0 -90
- package/lib/commonjs/pbkdf2.js.map +0 -1
- package/lib/commonjs/rsa.js +0 -248
- package/lib/commonjs/rsa.js.map +0 -1
- package/lib/commonjs/sig.js +0 -129
- package/lib/commonjs/sig.js.map +0 -1
- package/lib/commonjs/subtle.js +0 -448
- package/lib/commonjs/subtle.js.map +0 -1
- package/lib/commonjs/webcrypto.js +0 -14
- package/lib/commonjs/webcrypto.js.map +0 -1
- package/lib/module/Cipher.js +0 -491
- package/lib/module/Cipher.js.map +0 -1
- package/lib/module/Hash.js +0 -93
- package/lib/module/Hash.js.map +0 -1
- package/lib/module/Hashnames.js +0 -85
- package/lib/module/Hashnames.js.map +0 -1
- package/lib/module/Hmac.js +0 -74
- package/lib/module/Hmac.js.map +0 -1
- package/lib/module/NativeQuickCrypto/Cipher.js +0 -26
- package/lib/module/NativeQuickCrypto/Cipher.js.map +0 -1
- package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js +0 -49
- package/lib/module/NativeQuickCrypto/NativeQuickCrypto.js.map +0 -1
- package/lib/module/NativeQuickCrypto/aes.js +0 -4
- package/lib/module/NativeQuickCrypto/hash.js +0 -2
- package/lib/module/NativeQuickCrypto/hash.js.map +0 -1
- package/lib/module/NativeQuickCrypto/hmac.js +0 -2
- package/lib/module/NativeQuickCrypto/hmac.js.map +0 -1
- package/lib/module/NativeQuickCrypto/keygen.js +0 -4
- package/lib/module/NativeQuickCrypto/keygen.js.map +0 -1
- package/lib/module/NativeQuickCrypto/pbkdf2.js +0 -2
- package/lib/module/NativeQuickCrypto/pbkdf2.js.map +0 -1
- package/lib/module/NativeQuickCrypto/random.js +0 -2
- package/lib/module/NativeQuickCrypto/random.js.map +0 -1
- package/lib/module/NativeQuickCrypto/rsa.js +0 -4
- package/lib/module/NativeQuickCrypto/sig.js +0 -17
- package/lib/module/NativeQuickCrypto/sig.js.map +0 -1
- package/lib/module/NativeQuickCrypto/webcrypto.js +0 -4
- package/lib/module/NativeQuickCrypto/webcrypto.js.map +0 -1
- package/lib/module/Utils.js +0 -539
- package/lib/module/Utils.js.map +0 -1
- package/lib/module/aes.js +0 -274
- package/lib/module/aes.js.map +0 -1
- package/lib/module/constants.js +0 -81
- package/lib/module/constants.js.map +0 -1
- package/lib/module/ec.js +0 -267
- package/lib/module/ec.js.map +0 -1
- package/lib/module/keygen.js +0 -49
- package/lib/module/keygen.js.map +0 -1
- package/lib/module/keys.js +0 -477
- package/lib/module/keys.js.map +0 -1
- package/lib/module/pbkdf2.js +0 -84
- package/lib/module/pbkdf2.js.map +0 -1
- package/lib/module/rsa.js +0 -242
- package/lib/module/rsa.js.map +0 -1
- package/lib/module/sig.js +0 -124
- package/lib/module/sig.js.map +0 -1
- package/lib/module/subtle.js +0 -443
- package/lib/module/subtle.js.map +0 -1
- package/lib/module/webcrypto.js +0 -10
- package/lib/module/webcrypto.js.map +0 -1
- package/lib/typescript/Cipher.d.ts +0 -81
- package/lib/typescript/Cipher.d.ts.map +0 -1
- package/lib/typescript/Hash.d.ts +0 -44
- package/lib/typescript/Hash.d.ts.map +0 -1
- package/lib/typescript/Hashnames.d.ts +0 -11
- package/lib/typescript/Hashnames.d.ts.map +0 -1
- package/lib/typescript/Hmac.d.ts +0 -37
- package/lib/typescript/Hmac.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/Cipher.d.ts +0 -44
- package/lib/typescript/NativeQuickCrypto/Cipher.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/NativeQuickCrypto.d.ts +0 -33
- package/lib/typescript/NativeQuickCrypto/NativeQuickCrypto.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/aes.d.ts +0 -5
- package/lib/typescript/NativeQuickCrypto/aes.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/hash.d.ts +0 -7
- package/lib/typescript/NativeQuickCrypto/hash.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/hmac.d.ts +0 -6
- package/lib/typescript/NativeQuickCrypto/hmac.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/keygen.d.ts +0 -4
- package/lib/typescript/NativeQuickCrypto/keygen.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/pbkdf2.d.ts +0 -5
- package/lib/typescript/NativeQuickCrypto/pbkdf2.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/random.d.ts +0 -5
- package/lib/typescript/NativeQuickCrypto/random.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/rsa.d.ts +0 -5
- package/lib/typescript/NativeQuickCrypto/rsa.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/sig.d.ts +0 -23
- package/lib/typescript/NativeQuickCrypto/sig.d.ts.map +0 -1
- package/lib/typescript/NativeQuickCrypto/webcrypto.d.ts +0 -39
- package/lib/typescript/NativeQuickCrypto/webcrypto.d.ts.map +0 -1
- package/lib/typescript/Utils.d.ts +0 -48
- package/lib/typescript/Utils.d.ts.map +0 -1
- package/lib/typescript/aes.d.ts +0 -22
- package/lib/typescript/aes.d.ts.map +0 -1
- package/lib/typescript/constants.d.ts +0 -76
- package/lib/typescript/constants.d.ts.map +0 -1
- package/lib/typescript/ec.d.ts +0 -7
- package/lib/typescript/ec.d.ts.map +0 -1
- package/lib/typescript/keygen.d.ts +0 -6
- package/lib/typescript/keygen.d.ts.map +0 -1
- package/lib/typescript/keys.d.ts +0 -206
- package/lib/typescript/keys.d.ts.map +0 -1
- package/lib/typescript/pbkdf2.d.ts +0 -12
- package/lib/typescript/pbkdf2.d.ts.map +0 -1
- package/lib/typescript/rsa.d.ts +0 -12
- package/lib/typescript/rsa.d.ts.map +0 -1
- package/lib/typescript/sig.d.ts +0 -21
- package/lib/typescript/sig.d.ts.map +0 -1
- package/lib/typescript/subtle.d.ts +0 -15
- package/lib/typescript/subtle.d.ts.map +0 -1
- package/lib/typescript/webcrypto.d.ts +0 -9
- package/lib/typescript/webcrypto.d.ts.map +0 -1
- package/react-native-quick-crypto.podspec +0 -40
- package/src/Cipher.ts +0 -832
- package/src/Hash.ts +0 -132
- package/src/Hashnames.ts +0 -93
- package/src/Hmac.ts +0 -106
- package/src/NativeQuickCrypto/Cipher.ts +0 -102
- package/src/NativeQuickCrypto/NativeQuickCrypto.ts +0 -102
- package/src/NativeQuickCrypto/aes.ts +0 -14
- package/src/NativeQuickCrypto/hash.ts +0 -10
- package/src/NativeQuickCrypto/hmac.ts +0 -9
- package/src/NativeQuickCrypto/keygen.ts +0 -7
- package/src/NativeQuickCrypto/pbkdf2.ts +0 -16
- package/src/NativeQuickCrypto/random.ts +0 -12
- package/src/NativeQuickCrypto/rsa.ts +0 -12
- package/src/NativeQuickCrypto/sig.ts +0 -44
- package/src/NativeQuickCrypto/webcrypto.ts +0 -72
- package/src/Utils.ts +0 -777
- package/src/aes.ts +0 -402
- package/src/constants.ts +0 -79
- package/src/ec.ts +0 -375
- package/src/keygen.ts +0 -80
- package/src/keys.ts +0 -787
- package/src/pbkdf2.ts +0 -169
- package/src/rsa.ts +0 -370
- package/src/sig.ts +0 -164
- package/src/subtle.ts +0 -639
- package/src/webcrypto.ts +0 -8
- /package/android/src/main/{AndroidManifestNew.xml → AndroidManifest.xml} +0 -0
|
@@ -1,757 +0,0 @@
|
|
|
1
|
-
#include "MGLSignHostObjects.h"
|
|
2
|
-
|
|
3
|
-
#include <openssl/evp.h>
|
|
4
|
-
|
|
5
|
-
#include <optional>
|
|
6
|
-
|
|
7
|
-
#include "MGLKeys.h"
|
|
8
|
-
#ifdef ANDROID
|
|
9
|
-
#include "JSIUtils/MGLJSIUtils.h"
|
|
10
|
-
#include "JSIUtils/MGLTypedArray.h"
|
|
11
|
-
#include "Utils/MGLUtils.h"
|
|
12
|
-
#else
|
|
13
|
-
#include "MGLJSIUtils.h"
|
|
14
|
-
#include "MGLTypedArray.h"
|
|
15
|
-
#include "MGLUtils.h"
|
|
16
|
-
#endif
|
|
17
|
-
|
|
18
|
-
namespace margelo {
|
|
19
|
-
|
|
20
|
-
bool ValidateDSAParameters(EVP_PKEY* key) {
|
|
21
|
-
/* Validate DSA2 parameters from FIPS 186-4 */
|
|
22
|
-
#if OPENSSL_VERSION_MAJOR >= 3
|
|
23
|
-
if (EVP_default_properties_is_fips_enabled(nullptr) &&
|
|
24
|
-
EVP_PKEY_DSA == EVP_PKEY_base_id(key)) {
|
|
25
|
-
#else
|
|
26
|
-
if (FIPS_mode() && EVP_PKEY_DSA == EVP_PKEY_base_id(key)) {
|
|
27
|
-
#endif
|
|
28
|
-
const DSA* dsa = EVP_PKEY_get0_DSA(key);
|
|
29
|
-
const BIGNUM* p;
|
|
30
|
-
DSA_get0_pqg(dsa, &p, nullptr, nullptr);
|
|
31
|
-
size_t L = BN_num_bits(p);
|
|
32
|
-
const BIGNUM* q;
|
|
33
|
-
DSA_get0_pqg(dsa, nullptr, &q, nullptr);
|
|
34
|
-
size_t N = BN_num_bits(q);
|
|
35
|
-
|
|
36
|
-
return (L == 1024 && N == 160) || (L == 2048 && N == 224) ||
|
|
37
|
-
(L == 2048 && N == 256) || (L == 3072 && N == 256);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
bool ApplyRSAOptions(const ManagedEVPPKey& pkey, EVP_PKEY_CTX* pkctx,
|
|
44
|
-
int padding, std::optional<int> salt_len) {
|
|
45
|
-
if (EVP_PKEY_id(pkey.get()) == EVP_PKEY_RSA ||
|
|
46
|
-
EVP_PKEY_id(pkey.get()) == EVP_PKEY_RSA2 ||
|
|
47
|
-
EVP_PKEY_id(pkey.get()) == EVP_PKEY_RSA_PSS) {
|
|
48
|
-
if (EVP_PKEY_CTX_set_rsa_padding(pkctx, padding) <= 0) return false;
|
|
49
|
-
if (padding == RSA_PKCS1_PSS_PADDING && salt_len.has_value()) {
|
|
50
|
-
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, salt_len.value()) <= 0)
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
std::optional<MGLTypedArray<MGLTypedArrayKind::Uint8Array>> Node_SignFinal(
|
|
59
|
-
jsi::Runtime& runtime,
|
|
60
|
-
EVPMDPointer&& mdctx,
|
|
61
|
-
const ManagedEVPPKey& pkey,
|
|
62
|
-
int padding,
|
|
63
|
-
std::optional<int> pss_salt_len
|
|
64
|
-
) {
|
|
65
|
-
std::optional<MGLTypedArray<MGLTypedArrayKind::Uint8Array>> ret;
|
|
66
|
-
|
|
67
|
-
unsigned char m[EVP_MAX_MD_SIZE];
|
|
68
|
-
unsigned int m_len;
|
|
69
|
-
|
|
70
|
-
if (!EVP_DigestFinal_ex(mdctx.get(), m, &m_len)) return {};
|
|
71
|
-
|
|
72
|
-
int signed_sig_len = EVP_PKEY_size(pkey.get());
|
|
73
|
-
CHECK_GE(signed_sig_len, 0);
|
|
74
|
-
size_t sig_len = static_cast<size_t>(signed_sig_len);
|
|
75
|
-
|
|
76
|
-
MGLTypedArray<MGLTypedArrayKind::Uint8Array> sig(runtime, sig_len);
|
|
77
|
-
|
|
78
|
-
EVPKeyCtxPointer pkctx(EVP_PKEY_CTX_new(pkey.get(), nullptr));
|
|
79
|
-
if (pkctx && EVP_PKEY_sign_init(pkctx.get()) &&
|
|
80
|
-
ApplyRSAOptions(pkey, pkctx.get(), padding, pss_salt_len) &&
|
|
81
|
-
EVP_PKEY_CTX_set_signature_md(pkctx.get(), EVP_MD_CTX_md(mdctx.get())) &&
|
|
82
|
-
EVP_PKEY_sign(
|
|
83
|
-
pkctx.get(),
|
|
84
|
-
static_cast<unsigned char*>(sig.getBuffer(runtime).data(runtime)),
|
|
85
|
-
&sig_len, m, m_len)) {
|
|
86
|
-
CHECK_LE(sig_len, sig.size(runtime));
|
|
87
|
-
|
|
88
|
-
// (osp) do these bits need to be trimmed? I think so
|
|
89
|
-
// if (sig_len == 0)
|
|
90
|
-
// sig = ArrayBuffer::NewBackingStore(env->isolate(), 0);
|
|
91
|
-
// else
|
|
92
|
-
// sig = BackingStore::Reallocate(env->isolate(), std::move(sig),
|
|
93
|
-
// sig_len);
|
|
94
|
-
ret.emplace(std::move(sig));
|
|
95
|
-
return ret;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return {};
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// int GetDefaultSignPadding(const ManagedEVPPKey& m_pkey) {
|
|
102
|
-
// return EVP_PKEY_id(m_pkey.get()) == EVP_PKEY_RSA_PSS ?
|
|
103
|
-
// RSA_PKCS1_PSS_PADDING : RSA_PKCS1_PADDING;
|
|
104
|
-
// }
|
|
105
|
-
//
|
|
106
|
-
unsigned int GetBytesOfRS(const ManagedEVPPKey& pkey) {
|
|
107
|
-
int bits, base_id = EVP_PKEY_base_id(pkey.get());
|
|
108
|
-
|
|
109
|
-
if (base_id == EVP_PKEY_DSA) {
|
|
110
|
-
const DSA* dsa_key = EVP_PKEY_get0_DSA(pkey.get());
|
|
111
|
-
// Both r and s are computed mod q, so their width is limited by that of
|
|
112
|
-
bits = BN_num_bits(DSA_get0_q(dsa_key));
|
|
113
|
-
} else if (base_id == EVP_PKEY_EC) {
|
|
114
|
-
const EC_KEY* ec_key = EVP_PKEY_get0_EC_KEY(pkey.get());
|
|
115
|
-
const EC_GROUP* ec_group = EC_KEY_get0_group(ec_key);
|
|
116
|
-
bits = EC_GROUP_order_bits(ec_group);
|
|
117
|
-
} else {
|
|
118
|
-
return kNoDsaSignature;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return (bits + 7) / 8;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
bool ExtractP1363(const unsigned char* sig_data,
|
|
125
|
-
unsigned char* out,
|
|
126
|
-
size_t len,
|
|
127
|
-
size_t n) {
|
|
128
|
-
ECDSASigPointer asn1_sig(d2i_ECDSA_SIG(nullptr,
|
|
129
|
-
&sig_data, len)); if (!asn1_sig)
|
|
130
|
-
return false;
|
|
131
|
-
|
|
132
|
-
const BIGNUM* pr = ECDSA_SIG_get0_r(asn1_sig.get());
|
|
133
|
-
const BIGNUM* ps = ECDSA_SIG_get0_s(asn1_sig.get());
|
|
134
|
-
|
|
135
|
-
return BN_bn2binpad(pr, out, n) > 0 && BN_bn2binpad(ps,
|
|
136
|
-
out + n, n) > 0;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// // Returns the maximum size of each of the integers (r, s) of the DSA signature.
|
|
140
|
-
// std::unique_ptr<BackingStore> ConvertSignatureToP1363(Environment* env,
|
|
141
|
-
// const ManagedEVPPKey&
|
|
142
|
-
// pkey,
|
|
143
|
-
// std::unique_ptr<BackingStore>&&
|
|
144
|
-
// signature) {
|
|
145
|
-
// unsigned int n = GetBytesOfRS(pkey);
|
|
146
|
-
// if (n == kNoDsaSignature)
|
|
147
|
-
// return std::move(signature);
|
|
148
|
-
//
|
|
149
|
-
// std::unique_ptr<BackingStore> buf;
|
|
150
|
-
// {
|
|
151
|
-
// NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data());
|
|
152
|
-
// buf = ArrayBuffer::NewBackingStore(env->isolate(), 2 * n);
|
|
153
|
-
// }
|
|
154
|
-
// if (!ExtractP1363(static_cast<unsigned char*>(signature->Data()),
|
|
155
|
-
// static_cast<unsigned char*>(buf->Data()),
|
|
156
|
-
// signature->ByteLength(), n))
|
|
157
|
-
// return std::move(signature);
|
|
158
|
-
//
|
|
159
|
-
// return buf;
|
|
160
|
-
// }
|
|
161
|
-
|
|
162
|
-
// Returns the maximum size of each of the integers (r, s) of the DSA signature.
|
|
163
|
-
ByteSource ConvertSignatureToP1363(const ManagedEVPPKey& pkey,
|
|
164
|
-
const ByteSource& signature) {
|
|
165
|
-
unsigned int n = GetBytesOfRS(pkey);
|
|
166
|
-
if (n == kNoDsaSignature)
|
|
167
|
-
return ByteSource();
|
|
168
|
-
|
|
169
|
-
const unsigned char* sig_data =
|
|
170
|
-
signature.data<unsigned char>();
|
|
171
|
-
|
|
172
|
-
ByteSource::Builder out(n * 2);
|
|
173
|
-
memset(out.data<void>(), 0, n * 2);
|
|
174
|
-
|
|
175
|
-
if (!ExtractP1363(sig_data,
|
|
176
|
-
out.data<unsigned char>(),
|
|
177
|
-
signature.size(), n))
|
|
178
|
-
return ByteSource();
|
|
179
|
-
|
|
180
|
-
return std::move(out).release();
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
ByteSource ConvertSignatureToDER(const ManagedEVPPKey& pkey, ByteSource&& out) {
|
|
184
|
-
unsigned int n = GetBytesOfRS(pkey);
|
|
185
|
-
if (n == kNoDsaSignature) return std::move(out);
|
|
186
|
-
|
|
187
|
-
const unsigned char* sig_data = out.data<unsigned char>();
|
|
188
|
-
|
|
189
|
-
if (out.size() != 2 * n) return ByteSource();
|
|
190
|
-
|
|
191
|
-
ECDSASigPointer asn1_sig(ECDSA_SIG_new());
|
|
192
|
-
CHECK(asn1_sig);
|
|
193
|
-
BIGNUM* r = BN_new();
|
|
194
|
-
CHECK_NOT_NULL(r);
|
|
195
|
-
BIGNUM* s = BN_new();
|
|
196
|
-
CHECK_NOT_NULL(s);
|
|
197
|
-
CHECK_EQ(r, BN_bin2bn(sig_data, n, r));
|
|
198
|
-
CHECK_EQ(s, BN_bin2bn(sig_data + n, n, s));
|
|
199
|
-
CHECK_EQ(1, ECDSA_SIG_set0(asn1_sig.get(), r, s));
|
|
200
|
-
|
|
201
|
-
unsigned char* data = nullptr;
|
|
202
|
-
int len = i2d_ECDSA_SIG(asn1_sig.get(), &data);
|
|
203
|
-
|
|
204
|
-
if (len <= 0) return ByteSource();
|
|
205
|
-
|
|
206
|
-
CHECK_NOT_NULL(data);
|
|
207
|
-
|
|
208
|
-
return ByteSource::Allocated(reinterpret_cast<char*>(data), len);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// void CheckThrow(Environment* env, SignBase::Error error) {
|
|
212
|
-
// HandleScope scope(env->isolate());
|
|
213
|
-
//
|
|
214
|
-
// switch (error) {
|
|
215
|
-
// case SignBase::Error::kSignUnknownDigest:
|
|
216
|
-
// return THROW_ERR_CRYPTO_INVALID_DIGEST(env);
|
|
217
|
-
//
|
|
218
|
-
// case SignBase::Error::kSignNotInitialised:
|
|
219
|
-
// return THROW_ERR_CRYPTO_INVALID_STATE(env, "Not initialised");
|
|
220
|
-
//
|
|
221
|
-
// case SignBase::Error::kSignMalformedSignature:
|
|
222
|
-
// return THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Malformed signature");
|
|
223
|
-
//
|
|
224
|
-
// case SignBase::Error::kSignInit:
|
|
225
|
-
// case SignBase::Error::kSignUpdate:
|
|
226
|
-
// case SignBase::Error::kSignPrivateKey:
|
|
227
|
-
// case SignBase::Error::kSignPublicKey:
|
|
228
|
-
// {
|
|
229
|
-
// unsigned long err = ERR_get_error(); // NOLINT(runtime/int)
|
|
230
|
-
// if (err)
|
|
231
|
-
// return ThrowCryptoError(env, err);
|
|
232
|
-
// switch (error) {
|
|
233
|
-
// case SignBase::Error::kSignInit:
|
|
234
|
-
// return THROW_ERR_CRYPTO_OPERATION_FAILED(env,
|
|
235
|
-
// "EVP_SignInit_ex
|
|
236
|
-
// failed");
|
|
237
|
-
// case SignBase::Error::kSignUpdate:
|
|
238
|
-
// return THROW_ERR_CRYPTO_OPERATION_FAILED(env,
|
|
239
|
-
// "EVP_SignUpdate failed");
|
|
240
|
-
// case SignBase::Error::kSignPrivateKey:
|
|
241
|
-
// return THROW_ERR_CRYPTO_OPERATION_FAILED(env,
|
|
242
|
-
// "PEM_read_bio_PrivateKey
|
|
243
|
-
// failed");
|
|
244
|
-
// case SignBase::Error::kSignPublicKey:
|
|
245
|
-
// return THROW_ERR_CRYPTO_OPERATION_FAILED(env,
|
|
246
|
-
// "PEM_read_bio_PUBKEY
|
|
247
|
-
// failed");
|
|
248
|
-
// default:
|
|
249
|
-
// ABORT();
|
|
250
|
-
// }
|
|
251
|
-
// }
|
|
252
|
-
//
|
|
253
|
-
// case SignBase::Error::kSignOk:
|
|
254
|
-
// return;
|
|
255
|
-
// }
|
|
256
|
-
// }
|
|
257
|
-
|
|
258
|
-
bool IsOneShot(const ManagedEVPPKey& key) {
|
|
259
|
-
switch (EVP_PKEY_id(key.get())) {
|
|
260
|
-
case EVP_PKEY_ED25519:
|
|
261
|
-
case EVP_PKEY_ED448:
|
|
262
|
-
return true;
|
|
263
|
-
default:
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
bool UseP1363Encoding(const ManagedEVPPKey& key,
|
|
269
|
-
const DSASigEnc& dsa_encoding) {
|
|
270
|
-
switch (EVP_PKEY_id(key.get())) {
|
|
271
|
-
case EVP_PKEY_EC:
|
|
272
|
-
case EVP_PKEY_DSA:
|
|
273
|
-
return dsa_encoding == kSigEncP1363;
|
|
274
|
-
default:
|
|
275
|
-
return false;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
SignBase::SignResult SignBase::SignFinal(jsi::Runtime& runtime,
|
|
280
|
-
const ManagedEVPPKey& pkey,
|
|
281
|
-
int padding,
|
|
282
|
-
std::optional<int>& salt_len,
|
|
283
|
-
DSASigEnc dsa_sig_enc) {
|
|
284
|
-
if (!mdctx_) return SignResult(kSignNotInitialised);
|
|
285
|
-
|
|
286
|
-
EVPMDPointer mdctx = std::move(mdctx_);
|
|
287
|
-
|
|
288
|
-
if (!ValidateDSAParameters(pkey.get())) return SignResult(kSignPrivateKey);
|
|
289
|
-
ByteSource bs;
|
|
290
|
-
std::optional<MGLTypedArray<MGLTypedArrayKind::Uint8Array>> buffer =
|
|
291
|
-
Node_SignFinal(runtime, std::move(mdctx), pkey, padding, salt_len);
|
|
292
|
-
Error error = buffer.has_value() ? kSignOk : kSignPrivateKey;
|
|
293
|
-
if (error == kSignOk) {
|
|
294
|
-
bs = ByteSource::FromBuffer(runtime, buffer.value().getBuffer(runtime));
|
|
295
|
-
if (dsa_sig_enc == kSigEncP1363) {
|
|
296
|
-
bs = ConvertSignatureToP1363(pkey, std::move(bs));
|
|
297
|
-
}
|
|
298
|
-
CHECK_NOT_NULL(bs.data<unsigned char>());
|
|
299
|
-
}
|
|
300
|
-
return SignResult(error, toJSI(runtime, std::move(bs)));
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
SignBase::Error SignBase::VerifyFinal(const ManagedEVPPKey& pkey,
|
|
304
|
-
const ByteSource& sig, int padding,
|
|
305
|
-
std::optional<int>& saltlen,
|
|
306
|
-
bool* verify_result) {
|
|
307
|
-
if (!mdctx_) return kSignNotInitialised;
|
|
308
|
-
|
|
309
|
-
unsigned char m[EVP_MAX_MD_SIZE];
|
|
310
|
-
unsigned int m_len;
|
|
311
|
-
*verify_result = false;
|
|
312
|
-
EVPMDPointer mdctx = std::move(mdctx_);
|
|
313
|
-
|
|
314
|
-
if (!EVP_DigestFinal_ex(mdctx.get(), m, &m_len)) return kSignPublicKey;
|
|
315
|
-
|
|
316
|
-
EVPKeyCtxPointer pkctx(EVP_PKEY_CTX_new(pkey.get(), nullptr));
|
|
317
|
-
if (pkctx && EVP_PKEY_verify_init(pkctx.get()) > 0 &&
|
|
318
|
-
ApplyRSAOptions(pkey, pkctx.get(), padding, saltlen) &&
|
|
319
|
-
EVP_PKEY_CTX_set_signature_md(pkctx.get(), EVP_MD_CTX_md(mdctx.get())) >
|
|
320
|
-
0) {
|
|
321
|
-
const unsigned char* s = sig.data<unsigned char>();
|
|
322
|
-
const int r = EVP_PKEY_verify(pkctx.get(), s, sig.size(), m, m_len);
|
|
323
|
-
*verify_result = r == 1;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
return kSignOk;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
SignBase::SignBase(std::shared_ptr<react::CallInvoker> jsCallInvoker,
|
|
330
|
-
std::shared_ptr<DispatchQueue::dispatch_queue> workerQueue)
|
|
331
|
-
: MGLSmartHostObject(jsCallInvoker, workerQueue) {}
|
|
332
|
-
|
|
333
|
-
MGLSignHostObject::MGLSignHostObject(
|
|
334
|
-
std::shared_ptr<react::CallInvoker> jsCallInvoker,
|
|
335
|
-
std::shared_ptr<DispatchQueue::dispatch_queue> workerQueue)
|
|
336
|
-
: SignBase(jsCallInvoker, workerQueue) {
|
|
337
|
-
InstallMethods(kModeSign);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
MGLVerifyHostObject::MGLVerifyHostObject(
|
|
341
|
-
std::shared_ptr<react::CallInvoker> jsCallInvoker,
|
|
342
|
-
std::shared_ptr<DispatchQueue::dispatch_queue> workerQueue)
|
|
343
|
-
: SignBase(jsCallInvoker, workerQueue) {
|
|
344
|
-
InstallMethods(kModeVerify);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
int GetDefaultSignPadding(const ManagedEVPPKey& m_pkey) {
|
|
348
|
-
return EVP_PKEY_id(m_pkey.get()) == EVP_PKEY_RSA_PSS ? RSA_PKCS1_PSS_PADDING
|
|
349
|
-
: RSA_PKCS1_PADDING;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
void SignBase::InstallMethods(mode mode) {
|
|
353
|
-
this->fields.push_back(buildPair(
|
|
354
|
-
"init", JSIF([=]) {
|
|
355
|
-
if (count != 1 || !arguments[0].isString()) {
|
|
356
|
-
throw jsi::JSError(runtime, "init requires algorithm param");
|
|
357
|
-
return {};
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
std::string sign_type = arguments[0].asString(runtime).utf8(runtime);
|
|
361
|
-
CHECK_NULL(mdctx_);
|
|
362
|
-
|
|
363
|
-
// Historically, "dss1" and "DSS1" were DSA aliases for SHA-1
|
|
364
|
-
// exposed through the public API.
|
|
365
|
-
if (sign_type.compare("dss1") == 0 || sign_type.compare("DSS1") == 0) {
|
|
366
|
-
sign_type = "SHA1";
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
const EVP_MD* md = EVP_get_digestbyname(sign_type.c_str());
|
|
370
|
-
if (md == nullptr) return jsi::Value((int)kSignUnknownDigest);
|
|
371
|
-
|
|
372
|
-
mdctx_.reset(EVP_MD_CTX_new());
|
|
373
|
-
if (!mdctx_ || !EVP_DigestInit_ex(mdctx_.get(), md, nullptr)) {
|
|
374
|
-
mdctx_.reset();
|
|
375
|
-
return jsi::Value((int)kSignInit);
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
return jsi::Value((int)kSignOk);
|
|
379
|
-
}));
|
|
380
|
-
|
|
381
|
-
this->fields.push_back(buildPair(
|
|
382
|
-
"update", JSIF([=]) {
|
|
383
|
-
if (count != 1) {
|
|
384
|
-
throw jsi::JSError(runtime, "update requires 2 arguments");
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
if (!arguments[0].isObject() ||
|
|
388
|
-
!arguments[0].asObject(runtime).isArrayBuffer(runtime)) {
|
|
389
|
-
throw jsi::JSError(
|
|
390
|
-
runtime, "First argument (data) needs to be an array buffer");
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
auto data = arguments[0].asObject(runtime).getArrayBuffer(runtime);
|
|
394
|
-
|
|
395
|
-
if (!CheckSizeInt32(runtime, data)) {
|
|
396
|
-
throw jsi::JSError(runtime, "data is too large");
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
if (mdctx_ == nullptr) return (int)kSignNotInitialised;
|
|
400
|
-
if (!EVP_DigestUpdate(mdctx_.get(), data.data(runtime),
|
|
401
|
-
data.size(runtime)))
|
|
402
|
-
return (int)kSignUpdate;
|
|
403
|
-
return (int)kSignOk;
|
|
404
|
-
}));
|
|
405
|
-
|
|
406
|
-
if (mode == kModeSign) {
|
|
407
|
-
this->fields.push_back(buildPair(
|
|
408
|
-
"sign", JSIF([=]) {
|
|
409
|
-
unsigned int offset = 0;
|
|
410
|
-
ManagedEVPPKey key = ManagedEVPPKey::GetPrivateKeyFromJs(
|
|
411
|
-
runtime, arguments, &offset, true);
|
|
412
|
-
if (!key) {
|
|
413
|
-
return {};
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
int padding = GetDefaultSignPadding(key);
|
|
417
|
-
if (!arguments[offset].isUndefined()) {
|
|
418
|
-
// TODO(osp) need to add a check for int32
|
|
419
|
-
CHECK(arguments[offset].isNumber());
|
|
420
|
-
padding = static_cast<int>(arguments[offset].asNumber());
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
std::optional<int> salt_len;
|
|
424
|
-
if (!arguments[offset + 1].isUndefined()) {
|
|
425
|
-
// TODO(osp) add check for int32
|
|
426
|
-
CHECK(arguments[offset + 1].isNumber());
|
|
427
|
-
salt_len = static_cast<int>(arguments[offset + 1].asNumber());
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
// TODO(osp) add check for int32
|
|
431
|
-
CHECK(arguments[offset + 2].isNumber());
|
|
432
|
-
DSASigEnc dsa_sig_enc = static_cast<DSASigEnc>(
|
|
433
|
-
static_cast<int>(arguments[offset + 2].asNumber()));
|
|
434
|
-
|
|
435
|
-
SignResult ret =
|
|
436
|
-
this->SignFinal(runtime, key, padding, salt_len, dsa_sig_enc);
|
|
437
|
-
|
|
438
|
-
if (ret.error != kSignOk) {
|
|
439
|
-
throw jsi::JSError(runtime, "Error signing");
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
return std::move(ret.signature.value());
|
|
443
|
-
}));
|
|
444
|
-
} else {
|
|
445
|
-
this->fields.push_back(buildPair(
|
|
446
|
-
"verify", JSIF([=]) {
|
|
447
|
-
// Verify* verify;
|
|
448
|
-
// ASSIGN_OR_RETURN_UNWRAP(&verify, args.Holder());
|
|
449
|
-
|
|
450
|
-
unsigned int offset = 0;
|
|
451
|
-
ManagedEVPPKey pkey = ManagedEVPPKey::GetPublicOrPrivateKeyFromJs(
|
|
452
|
-
runtime, arguments, &offset);
|
|
453
|
-
if (!pkey) {
|
|
454
|
-
return {};
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
jsi::ArrayBuffer hbuf =
|
|
458
|
-
arguments[offset].asObject(runtime).getArrayBuffer(runtime);
|
|
459
|
-
if (!CheckSizeInt32(runtime, hbuf)) {
|
|
460
|
-
throw jsi::JSError(runtime, "buffer is too big");
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
int padding = GetDefaultSignPadding(pkey);
|
|
464
|
-
if (!arguments[offset + 1].isUndefined()) {
|
|
465
|
-
CHECK(arguments[offset + 1].isNumber());
|
|
466
|
-
padding = static_cast<int>(arguments[offset + 1].asNumber());
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
std::optional<int> salt_len;
|
|
470
|
-
if (!arguments[offset + 2].isUndefined()) {
|
|
471
|
-
// TODO(osp) add check for int32
|
|
472
|
-
CHECK(arguments[offset + 2].isNumber());
|
|
473
|
-
salt_len = static_cast<int>(arguments[offset + 2].asNumber());
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// TODO(osp) add check for int32
|
|
477
|
-
CHECK(arguments[offset + 3].isNumber());
|
|
478
|
-
DSASigEnc dsa_sig_enc = static_cast<DSASigEnc>(
|
|
479
|
-
static_cast<int>(arguments[offset + 3].asNumber()));
|
|
480
|
-
|
|
481
|
-
ByteSource signature = ArrayBufferToByteSource(runtime, hbuf);
|
|
482
|
-
if (dsa_sig_enc == kSigEncP1363) {
|
|
483
|
-
signature = ConvertSignatureToDER(
|
|
484
|
-
pkey, ArrayBufferToByteSource(runtime, hbuf));
|
|
485
|
-
if (signature.data() == nullptr) {
|
|
486
|
-
throw jsi::JSError(runtime, "kSignMalformedSignature");
|
|
487
|
-
}
|
|
488
|
-
// return crypto::CheckThrow(env,
|
|
489
|
-
// Error::kSignMalformedSignature);
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
bool verify_result;
|
|
493
|
-
Error err = this->VerifyFinal(pkey, signature, padding, salt_len,
|
|
494
|
-
&verify_result);
|
|
495
|
-
if (err != kSignOk) {
|
|
496
|
-
throw jsi::JSError(runtime, "Error on verify");
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
return verify_result;
|
|
500
|
-
}));
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
// SignConfiguration::SignConfiguration(SignConfiguration&& other) noexcept
|
|
505
|
-
//: job_mode(other.job_mode),
|
|
506
|
-
// mode(other.mode),
|
|
507
|
-
// key(std::move(other.key)),
|
|
508
|
-
// data(std::move(other.data)),
|
|
509
|
-
// signature(std::move(other.signature)),
|
|
510
|
-
// digest(other.digest),
|
|
511
|
-
// flags(other.flags),
|
|
512
|
-
// padding(other.padding),
|
|
513
|
-
// salt_length(other.salt_length),
|
|
514
|
-
// dsa_encoding(other.dsa_encoding) {}
|
|
515
|
-
//
|
|
516
|
-
// SignConfiguration& SignConfiguration::operator=(
|
|
517
|
-
// SignConfiguration&& other)
|
|
518
|
-
// noexcept {
|
|
519
|
-
// if (&other == this) return
|
|
520
|
-
// *this;
|
|
521
|
-
// this->~SignConfiguration();
|
|
522
|
-
// return *new (this)
|
|
523
|
-
// SignConfiguration(std::move(other));
|
|
524
|
-
// }
|
|
525
|
-
//
|
|
526
|
-
// void SignConfiguration::MemoryInfo(MemoryTracker* tracker) const {
|
|
527
|
-
// tracker->TrackField("key", key);
|
|
528
|
-
// if (job_mode == kCryptoJobAsync) {
|
|
529
|
-
// tracker->TrackFieldWithSize("data", data.size());
|
|
530
|
-
// tracker->TrackFieldWithSize("signature", signature.size());
|
|
531
|
-
// }
|
|
532
|
-
// }
|
|
533
|
-
|
|
534
|
-
SignConfiguration SubtleSignVerify::GetParamsFromJS(jsi::Runtime &rt,
|
|
535
|
-
const jsi::Value *args) {
|
|
536
|
-
SignConfiguration params;
|
|
537
|
-
unsigned int offset = 0;
|
|
538
|
-
|
|
539
|
-
// mode (sign/verify)
|
|
540
|
-
params.mode = static_cast<SignConfiguration::Mode>((int)args[offset].getNumber());
|
|
541
|
-
offset++;
|
|
542
|
-
|
|
543
|
-
// key
|
|
544
|
-
ManagedEVPPKey key;
|
|
545
|
-
unsigned int keyParamOffset = offset;
|
|
546
|
-
if (params.mode == SignConfiguration::kVerify) {
|
|
547
|
-
key = ManagedEVPPKey::GetPublicOrPrivateKeyFromJs(rt, args, &keyParamOffset);
|
|
548
|
-
} else {
|
|
549
|
-
key = ManagedEVPPKey::GetPrivateKeyFromJs(rt, args, &keyParamOffset, true);
|
|
550
|
-
}
|
|
551
|
-
if (!key) {
|
|
552
|
-
return params;
|
|
553
|
-
}
|
|
554
|
-
params.key = key;
|
|
555
|
-
offset = 5;
|
|
556
|
-
|
|
557
|
-
// data
|
|
558
|
-
if (!args[offset].isObject() || !args[offset].asObject(rt).isArrayBuffer(rt)) {
|
|
559
|
-
throw jsi::JSError(rt, "data is not an array buffer");
|
|
560
|
-
return params;
|
|
561
|
-
}
|
|
562
|
-
ByteSource data = ByteSource::FromStringOrBuffer(rt, args[offset]);
|
|
563
|
-
if (data.size() > INT_MAX) {
|
|
564
|
-
throw jsi::JSError(rt, "data is too big (> int32)");
|
|
565
|
-
return params;
|
|
566
|
-
}
|
|
567
|
-
params.data = std::move(data);
|
|
568
|
-
offset++;
|
|
569
|
-
|
|
570
|
-
// digest
|
|
571
|
-
if (args[offset].isString()) {
|
|
572
|
-
std::string digest = args[offset].asString(rt).utf8(rt);
|
|
573
|
-
params.digest = EVP_get_digestbyname(digest.c_str());
|
|
574
|
-
if (params.digest == nullptr) {
|
|
575
|
-
throw jsi::JSError(rt, "invalid digest");
|
|
576
|
-
return params;
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
offset++;
|
|
580
|
-
|
|
581
|
-
// salt length
|
|
582
|
-
if (CheckIsInt32(args[offset])) {
|
|
583
|
-
params.flags |= SignConfiguration::kHasSaltLength;
|
|
584
|
-
params.salt_length = args[offset].asNumber();
|
|
585
|
-
}
|
|
586
|
-
offset++;
|
|
587
|
-
|
|
588
|
-
// padding
|
|
589
|
-
if (CheckIsInt32(args[offset])) {
|
|
590
|
-
params.flags |= SignConfiguration::kHasPadding;
|
|
591
|
-
params.padding = args[offset].asNumber();
|
|
592
|
-
|
|
593
|
-
}
|
|
594
|
-
offset++;
|
|
595
|
-
|
|
596
|
-
// dsa encoding
|
|
597
|
-
if (args[offset].isNumber()) {
|
|
598
|
-
params.dsa_encoding =
|
|
599
|
-
static_cast<DSASigEnc>(args[offset].asNumber());
|
|
600
|
-
if (params.dsa_encoding != kSigEncDER &&
|
|
601
|
-
params.dsa_encoding != kSigEncP1363) {
|
|
602
|
-
throw jsi::JSError(rt, "invalid signature encoding");
|
|
603
|
-
return params;
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
offset++;
|
|
607
|
-
|
|
608
|
-
// signature
|
|
609
|
-
if (params.mode == SignConfiguration::kVerify) {
|
|
610
|
-
ByteSource signature = ByteSource::FromStringOrBuffer(rt, args[offset]);
|
|
611
|
-
if (signature.size() > INT_MAX) {
|
|
612
|
-
throw jsi::JSError(rt, "signature is too big (> int32)");
|
|
613
|
-
return params;
|
|
614
|
-
}
|
|
615
|
-
// If this is an EC key (assuming ECDSA) we need to convert the
|
|
616
|
-
// the signature from WebCrypto format into DER format...
|
|
617
|
-
ManagedEVPPKey m_pkey = params.key;
|
|
618
|
-
// Mutex::ScopedLock lock(*m_pkey.mutex());
|
|
619
|
-
if (UseP1363Encoding(m_pkey, params.dsa_encoding)) {
|
|
620
|
-
params.signature =
|
|
621
|
-
ConvertSignatureToDER(m_pkey, std::move(signature));
|
|
622
|
-
} else {
|
|
623
|
-
params.signature = std::move(signature);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
return params;
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
// Subtle Sign/Verify
|
|
631
|
-
|
|
632
|
-
void SubtleSignVerify::DoSignVerify(jsi::Runtime &rt,
|
|
633
|
-
const SignConfiguration ¶ms,
|
|
634
|
-
ByteSource &out) {
|
|
635
|
-
|
|
636
|
-
EVPMDPointer context(EVP_MD_CTX_new());
|
|
637
|
-
EVP_PKEY_CTX* ctx = nullptr;
|
|
638
|
-
|
|
639
|
-
switch (params.mode) {
|
|
640
|
-
case SignConfiguration::kSign:
|
|
641
|
-
if (!EVP_DigestSignInit(
|
|
642
|
-
context.get(),
|
|
643
|
-
&ctx,
|
|
644
|
-
params.digest,
|
|
645
|
-
nullptr,
|
|
646
|
-
params.key.get())) {
|
|
647
|
-
throw jsi::JSError(rt, "EVP_DigestSignInit failed");
|
|
648
|
-
}
|
|
649
|
-
break;
|
|
650
|
-
case SignConfiguration::kVerify:
|
|
651
|
-
if (!EVP_DigestVerifyInit(
|
|
652
|
-
context.get(),
|
|
653
|
-
&ctx,
|
|
654
|
-
params.digest,
|
|
655
|
-
nullptr,
|
|
656
|
-
params.key.get())) {
|
|
657
|
-
throw jsi::JSError(rt, "EVP_DigestVerifyInit failed");
|
|
658
|
-
}
|
|
659
|
-
break;
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
int padding = params.flags & SignConfiguration::kHasPadding
|
|
663
|
-
? params.padding
|
|
664
|
-
: GetDefaultSignPadding(params.key);
|
|
665
|
-
|
|
666
|
-
std::optional<int> salt_length = params.flags & SignConfiguration::kHasSaltLength
|
|
667
|
-
? std::optional(params.salt_length) : std::nullopt;
|
|
668
|
-
|
|
669
|
-
if (!ApplyRSAOptions(params.key,
|
|
670
|
-
ctx,
|
|
671
|
-
padding,
|
|
672
|
-
salt_length)) {
|
|
673
|
-
throw jsi::JSError(rt, "PEM_read_bio_PrivateKey failed");
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
switch (params.mode) {
|
|
677
|
-
case SignConfiguration::kSign: {
|
|
678
|
-
if (IsOneShot(params.key)) {
|
|
679
|
-
size_t len;
|
|
680
|
-
if (!EVP_DigestSign(
|
|
681
|
-
context.get(),
|
|
682
|
-
nullptr,
|
|
683
|
-
&len,
|
|
684
|
-
params.data.data<unsigned char>(),
|
|
685
|
-
params.data.size())) {
|
|
686
|
-
throw jsi::JSError(rt, "PEM_read_bio_PrivateKey failed");
|
|
687
|
-
}
|
|
688
|
-
ByteSource::Builder buf(len);
|
|
689
|
-
if (!EVP_DigestSign(context.get(),
|
|
690
|
-
buf.data<unsigned char>(),
|
|
691
|
-
&len,
|
|
692
|
-
params.data.data<unsigned char>(),
|
|
693
|
-
params.data.size())) {
|
|
694
|
-
throw jsi::JSError(rt, "PEM_read_bio_PrivateKey failed");
|
|
695
|
-
}
|
|
696
|
-
out = std::move(buf).release(len);
|
|
697
|
-
} else {
|
|
698
|
-
size_t len;
|
|
699
|
-
if (!EVP_DigestSignUpdate(
|
|
700
|
-
context.get(),
|
|
701
|
-
params.data.data<unsigned char>(),
|
|
702
|
-
params.data.size()) ||
|
|
703
|
-
!EVP_DigestSignFinal(context.get(), nullptr, &len)) {
|
|
704
|
-
throw jsi::JSError(rt, "PEM_read_bio_PrivateKey failed");
|
|
705
|
-
}
|
|
706
|
-
ByteSource::Builder buf(len);
|
|
707
|
-
if (!EVP_DigestSignFinal(
|
|
708
|
-
context.get(), buf.data<unsigned char>(),
|
|
709
|
-
&len)) {
|
|
710
|
-
throw jsi::JSError(rt, "PEM_read_bio_PrivateKey failed");
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
if (UseP1363Encoding(params.key, params.dsa_encoding)) {
|
|
714
|
-
out = ConvertSignatureToP1363(params.key,
|
|
715
|
-
std::move(buf).release());
|
|
716
|
-
} else {
|
|
717
|
-
out = std::move(buf).release(len);
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
case SignConfiguration::kVerify: {
|
|
723
|
-
ByteSource::Builder buf(1);
|
|
724
|
-
buf.data<char>()[0] = 0;
|
|
725
|
-
if (EVP_DigestVerify(
|
|
726
|
-
context.get(),
|
|
727
|
-
params.signature.data<unsigned char>(),
|
|
728
|
-
params.signature.size(),
|
|
729
|
-
params.data.data<unsigned char>(),
|
|
730
|
-
params.data.size()) == 1) {
|
|
731
|
-
buf.data<char>()[0] = 1;
|
|
732
|
-
}
|
|
733
|
-
out = std::move(buf).release();
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
// return out;
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
jsi::Value SubtleSignVerify::EncodeOutput(jsi::Runtime &rt,
|
|
741
|
-
const SignConfiguration ¶ms,
|
|
742
|
-
ByteSource &output) {
|
|
743
|
-
jsi::Value result;
|
|
744
|
-
switch (params.mode) {
|
|
745
|
-
case SignConfiguration::kSign:
|
|
746
|
-
result = toJSI(rt, std::move(output));
|
|
747
|
-
break;
|
|
748
|
-
case SignConfiguration::kVerify:
|
|
749
|
-
result = jsi::Value(output.data<char>()[0] == 1);
|
|
750
|
-
break;
|
|
751
|
-
default:
|
|
752
|
-
throw jsi::JSError(rt, "unreachable code in SubtleSignVerify::EncodeOutput");
|
|
753
|
-
}
|
|
754
|
-
return result;
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
} // namespace margelo
|