@pmishra0/react-native-aes-gcm 0.1.2 → 0.1.3
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/AesGcm.podspec +2 -1
- package/android/generated/java/com/aesgcm/NativeAesGcmSpec.java +2 -2
- package/android/generated/jni/RNAesGcmSpec-generated.cpp +4 -4
- package/android/generated/jni/react/renderer/components/RNAesGcmSpec/RNAesGcmSpecJSI.h +12 -8
- package/android/src/main/java/com/aesgcm/AesGcmModule.kt +13 -11
- package/ios/AesGcm.mm +8 -0
- package/ios/EncryptionManager.swift +13 -13
- package/ios/generated/ReactCodegen/RNAesGcmSpec/RNAesGcmSpec-generated.mm +4 -4
- package/ios/generated/ReactCodegen/RNAesGcmSpec/RNAesGcmSpec.h +4 -0
- package/ios/generated/ReactCodegen/RNAesGcmSpecJSI.h +12 -8
- package/lib/module/NativeAesGcm.ts +4 -0
- package/lib/module/index.js +7 -4
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/NativeAesGcm.d.ts +2 -2
- package/lib/typescript/src/NativeAesGcm.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +8 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeAesGcm.ts +4 -0
- package/src/index.tsx +25 -4
package/AesGcm.podspec
CHANGED
|
@@ -19,7 +19,8 @@ Pod::Spec.new do |s|
|
|
|
19
19
|
"ios/**/RCTModuleProviders.*",
|
|
20
20
|
"ios/**/RCTThirdPartyComponentsProvider.*",
|
|
21
21
|
"ios/**/RCTModulesConformingToProtocolsProvider.*",
|
|
22
|
-
"ios/**/RCTUnstableModulesRequiringMainQueueSetupProvider.*"
|
|
22
|
+
"ios/**/RCTUnstableModulesRequiringMainQueueSetupProvider.*",
|
|
23
|
+
"**/Package.swift"
|
|
23
24
|
]
|
|
24
25
|
s.private_header_files = "ios/**/*.h"
|
|
25
26
|
s.dependency "CryptoSwift"
|
|
@@ -34,9 +34,9 @@ public abstract class NativeAesGcmSpec extends ReactContextBaseJavaModule implem
|
|
|
34
34
|
|
|
35
35
|
@ReactMethod
|
|
36
36
|
@DoNotStrip
|
|
37
|
-
public abstract void encrypt(String plainText, String key, double iterationCount, Promise promise);
|
|
37
|
+
public abstract void encrypt(String plainText, String key, double saltLength, double ivLength, double iterationCount, Promise promise);
|
|
38
38
|
|
|
39
39
|
@ReactMethod
|
|
40
40
|
@DoNotStrip
|
|
41
|
-
public abstract void decrypt(String encryptedText, String key, double iterationCount, Promise promise);
|
|
41
|
+
public abstract void decrypt(String encryptedText, String key, double saltLength, double ivLength, double iterationCount, Promise promise);
|
|
42
42
|
}
|
|
@@ -14,18 +14,18 @@ namespace facebook::react {
|
|
|
14
14
|
|
|
15
15
|
static facebook::jsi::Value __hostFunction_NativeAesGcmSpecJSI_encrypt(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
16
16
|
static jmethodID cachedMethodId = nullptr;
|
|
17
|
-
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "encrypt", "(Ljava/lang/String;Ljava/lang/String;
|
|
17
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "encrypt", "(Ljava/lang/String;Ljava/lang/String;DDDLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
static facebook::jsi::Value __hostFunction_NativeAesGcmSpecJSI_decrypt(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
21
21
|
static jmethodID cachedMethodId = nullptr;
|
|
22
|
-
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "decrypt", "(Ljava/lang/String;Ljava/lang/String;
|
|
22
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, PromiseKind, "decrypt", "(Ljava/lang/String;Ljava/lang/String;DDDLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
NativeAesGcmSpecJSI::NativeAesGcmSpecJSI(const JavaTurboModule::InitParams ¶ms)
|
|
26
26
|
: JavaTurboModule(params) {
|
|
27
|
-
methodMap_["encrypt"] = MethodMetadata {
|
|
28
|
-
methodMap_["decrypt"] = MethodMetadata {
|
|
27
|
+
methodMap_["encrypt"] = MethodMetadata {5, __hostFunction_NativeAesGcmSpecJSI_encrypt};
|
|
28
|
+
methodMap_["decrypt"] = MethodMetadata {5, __hostFunction_NativeAesGcmSpecJSI_decrypt};
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
std::shared_ptr<TurboModule> RNAesGcmSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
@@ -22,29 +22,33 @@ public:
|
|
|
22
22
|
|
|
23
23
|
protected:
|
|
24
24
|
NativeAesGcmCxxSpec(std::shared_ptr<CallInvoker> jsInvoker) : TurboModule(std::string{NativeAesGcmCxxSpec::kModuleName}, jsInvoker) {
|
|
25
|
-
methodMap_["encrypt"] = MethodMetadata {.argCount =
|
|
26
|
-
methodMap_["decrypt"] = MethodMetadata {.argCount =
|
|
25
|
+
methodMap_["encrypt"] = MethodMetadata {.argCount = 5, .invoker = __encrypt};
|
|
26
|
+
methodMap_["decrypt"] = MethodMetadata {.argCount = 5, .invoker = __decrypt};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
private:
|
|
30
30
|
static jsi::Value __encrypt(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
31
31
|
static_assert(
|
|
32
|
-
bridging::getParameterCount(&T::encrypt) ==
|
|
33
|
-
"Expected encrypt(...) to have
|
|
32
|
+
bridging::getParameterCount(&T::encrypt) == 6,
|
|
33
|
+
"Expected encrypt(...) to have 6 parameters");
|
|
34
34
|
return bridging::callFromJs<jsi::Value>(rt, &T::encrypt, static_cast<NativeAesGcmCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
35
35
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt),
|
|
36
36
|
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt),
|
|
37
|
-
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber()
|
|
37
|
+
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(),
|
|
38
|
+
count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(),
|
|
39
|
+
count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber());
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
static jsi::Value __decrypt(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
41
43
|
static_assert(
|
|
42
|
-
bridging::getParameterCount(&T::decrypt) ==
|
|
43
|
-
"Expected decrypt(...) to have
|
|
44
|
+
bridging::getParameterCount(&T::decrypt) == 6,
|
|
45
|
+
"Expected decrypt(...) to have 6 parameters");
|
|
44
46
|
return bridging::callFromJs<jsi::Value>(rt, &T::decrypt, static_cast<NativeAesGcmCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
45
47
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt),
|
|
46
48
|
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt),
|
|
47
|
-
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber()
|
|
49
|
+
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(),
|
|
50
|
+
count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(),
|
|
51
|
+
count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber());
|
|
48
52
|
}
|
|
49
53
|
};
|
|
50
54
|
|
|
@@ -31,13 +31,15 @@ class AesGcmModule(reactContext: ReactApplicationContext) : NativeAesGcmSpec(rea
|
|
|
31
31
|
override fun encrypt(
|
|
32
32
|
plainText: String,
|
|
33
33
|
key: String,
|
|
34
|
+
saltLength: Double,
|
|
35
|
+
ivLength: Double,
|
|
34
36
|
iterationCount: Double,
|
|
35
37
|
promise: Promise
|
|
36
38
|
) {
|
|
37
39
|
try {
|
|
38
|
-
val salt = getRandomNonce(
|
|
40
|
+
val salt = getRandomNonce(saltLength.toInt())
|
|
39
41
|
val secretKey: SecretKey = getAESKeyFromPassword(key.toCharArray(), salt, iterationCount)
|
|
40
|
-
val iv = getRandomNonce(
|
|
42
|
+
val iv = getRandomNonce(ivLength.toInt())
|
|
41
43
|
val cipher = initCipher(Cipher.ENCRYPT_MODE, secretKey, iv)
|
|
42
44
|
val encryptedMessageByte = cipher.doFinal(plainText.toByteArray())
|
|
43
45
|
val cipherByte = ByteBuffer.allocate(salt.size + iv.size + encryptedMessageByte.size)
|
|
@@ -55,6 +57,8 @@ class AesGcmModule(reactContext: ReactApplicationContext) : NativeAesGcmSpec(rea
|
|
|
55
57
|
override fun decrypt(
|
|
56
58
|
encryptedText: String,
|
|
57
59
|
key: String,
|
|
60
|
+
saltLength: Double,
|
|
61
|
+
ivLength: Double,
|
|
58
62
|
iterationCount: Double,
|
|
59
63
|
promise: Promise
|
|
60
64
|
) {
|
|
@@ -64,15 +68,15 @@ class AesGcmModule(reactContext: ReactApplicationContext) : NativeAesGcmSpec(rea
|
|
|
64
68
|
Base64.NO_WRAP
|
|
65
69
|
)
|
|
66
70
|
val byteBuffer = ByteBuffer.wrap(decode)
|
|
67
|
-
val salt = ByteArray(
|
|
71
|
+
val salt = ByteArray(saltLength.toInt())
|
|
68
72
|
byteBuffer.get(salt)
|
|
69
|
-
val iv = ByteArray(
|
|
73
|
+
val iv = ByteArray(ivLength.toInt())
|
|
70
74
|
byteBuffer.get(iv)
|
|
71
75
|
val content = ByteArray(byteBuffer.remaining())
|
|
72
76
|
byteBuffer.get(content)
|
|
73
77
|
val cipher = Cipher.getInstance(CIPHER_ALGORITHM)
|
|
74
78
|
val aesKeyFromPassword: SecretKeySpec = getAESKeyFromPassword(key.toCharArray(), salt, iterationCount)
|
|
75
|
-
cipher.init(Cipher.DECRYPT_MODE, aesKeyFromPassword, GCMParameterSpec(GCM_TAG_LENGTH
|
|
79
|
+
cipher.init(Cipher.DECRYPT_MODE, aesKeyFromPassword, GCMParameterSpec(GCM_TAG_LENGTH, iv))
|
|
76
80
|
val plainText = String(cipher.doFinal(content))
|
|
77
81
|
promise.resolve(plainText);
|
|
78
82
|
} catch (e: java.lang.Exception) {
|
|
@@ -94,23 +98,21 @@ class AesGcmModule(reactContext: ReactApplicationContext) : NativeAesGcmSpec(rea
|
|
|
94
98
|
)
|
|
95
99
|
private fun initCipher(mode: Int, secretKey: SecretKey?, iv: ByteArray): Cipher {
|
|
96
100
|
val cipher = Cipher.getInstance(CIPHER_ALGORITHM)
|
|
97
|
-
cipher.init(mode, secretKey, GCMParameterSpec(GCM_TAG_LENGTH
|
|
101
|
+
cipher.init(mode, secretKey, GCMParameterSpec(GCM_TAG_LENGTH, iv))
|
|
98
102
|
return cipher
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
@Throws(NoSuchAlgorithmException::class, InvalidKeySpecException::class)
|
|
102
106
|
private fun getAESKeyFromPassword(password: CharArray?, salt: ByteArray, iterationCount: Double): SecretKeySpec {
|
|
103
107
|
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512")
|
|
104
|
-
val spec: KeySpec = PBEKeySpec(password, salt, iterationCount.toInt(), KEY_LENGTH
|
|
108
|
+
val spec: KeySpec = PBEKeySpec(password, salt, iterationCount.toInt(), KEY_LENGTH)
|
|
105
109
|
return SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES")
|
|
106
110
|
}
|
|
107
111
|
|
|
108
112
|
companion object {
|
|
109
113
|
const val NAME = "AesGcm"
|
|
110
|
-
private const val GCM_TAG_LENGTH: Int =
|
|
111
|
-
private const val
|
|
112
|
-
private const val IV_LENGTH: Int = 12
|
|
113
|
-
private const val KEY_LENGTH: Int = 32
|
|
114
|
+
private const val GCM_TAG_LENGTH: Int = 128 // bits
|
|
115
|
+
private const val KEY_LENGTH: Int = 256 // AES-256
|
|
114
116
|
private const val CIPHER_ALGORITHM: String = "AES/GCM/NoPadding"
|
|
115
117
|
}
|
|
116
118
|
}
|
package/ios/AesGcm.mm
CHANGED
|
@@ -17,6 +17,8 @@ EncryptionManager *_manager;
|
|
|
17
17
|
|
|
18
18
|
- (void)encrypt:(NSString *)plainText
|
|
19
19
|
key:(NSString *)key
|
|
20
|
+
saltLength:(double)saltLength
|
|
21
|
+
ivLength:(double)ivLength
|
|
20
22
|
iterationCount:(double)iterationCount
|
|
21
23
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
22
24
|
reject:(RCTPromiseRejectBlock)reject {
|
|
@@ -24,6 +26,8 @@ EncryptionManager *_manager;
|
|
|
24
26
|
NSError *error = nil;
|
|
25
27
|
NSString *result = [_manager encrypt:plainText
|
|
26
28
|
key:key
|
|
29
|
+
saltLength:@((int)saltLength)
|
|
30
|
+
ivLength: @((int)ivLength)
|
|
27
31
|
iterationCount:@((int)iterationCount)
|
|
28
32
|
error:&error];
|
|
29
33
|
if (result != nil) {
|
|
@@ -38,6 +42,8 @@ EncryptionManager *_manager;
|
|
|
38
42
|
|
|
39
43
|
- (void)decrypt:(NSString *)encryptedText
|
|
40
44
|
key:(NSString *)key
|
|
45
|
+
saltLength:(double)saltLength
|
|
46
|
+
ivLength:(double)ivLength
|
|
41
47
|
iterationCount:(double)iterationCount
|
|
42
48
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
43
49
|
reject:(RCTPromiseRejectBlock)reject {
|
|
@@ -45,6 +51,8 @@ EncryptionManager *_manager;
|
|
|
45
51
|
|
|
46
52
|
NSString *result = [_manager decrypt:encryptedText
|
|
47
53
|
key:key
|
|
54
|
+
saltLength:@((int)saltLength)
|
|
55
|
+
ivLength: @((int)ivLength)
|
|
48
56
|
iterationCount:@((int)iterationCount)
|
|
49
57
|
error:&error];
|
|
50
58
|
|
|
@@ -11,16 +11,12 @@ import Foundation
|
|
|
11
11
|
|
|
12
12
|
@objc(EncryptionManager)
|
|
13
13
|
public class EncryptionManager: NSObject {
|
|
14
|
-
let SALT_LENGTH = 16
|
|
15
|
-
let IV_LENGTH = 12
|
|
16
|
-
let encriptedPos = 28
|
|
17
|
-
let remainingLengh = 0
|
|
18
14
|
|
|
19
15
|
func getRandomNonce(length: Int) throws -> [UInt8] {
|
|
20
16
|
var nonce = [UInt8](repeating: 0, count: length)
|
|
21
17
|
let result = SecRandomCopyBytes(kSecRandomDefault, length, &nonce)
|
|
22
18
|
guard result == errSecSuccess else {
|
|
23
|
-
throw NSError(domain: "com.
|
|
19
|
+
throw NSError(domain: "com.aesgcm", code: Int(result), userInfo: nil)
|
|
24
20
|
}
|
|
25
21
|
return nonce
|
|
26
22
|
}
|
|
@@ -31,9 +27,11 @@ public class EncryptionManager: NSObject {
|
|
|
31
27
|
return salt
|
|
32
28
|
}
|
|
33
29
|
|
|
34
|
-
@objc(decrypt:key:iterationCount:error:)
|
|
30
|
+
@objc(decrypt:key:saltLength:ivLength:iterationCount:error:)
|
|
35
31
|
public func decrypt(_ encryptedText: String,
|
|
36
32
|
key: String,
|
|
33
|
+
saltLength: NSNumber,
|
|
34
|
+
ivLength: NSNumber,
|
|
37
35
|
iterationCount: NSNumber,
|
|
38
36
|
error: NSErrorPointer) -> String? {
|
|
39
37
|
|
|
@@ -45,16 +43,16 @@ public class EncryptionManager: NSObject {
|
|
|
45
43
|
code: -1,
|
|
46
44
|
userInfo: [NSLocalizedDescriptionKey: "Invalid Base64 input"])
|
|
47
45
|
}
|
|
48
|
-
guard encryptedData.count > (
|
|
46
|
+
guard encryptedData.count > (saltLength.intValue + ivLength.intValue) else {
|
|
49
47
|
throw NSError(domain: "Decryption",
|
|
50
48
|
code: -2,
|
|
51
49
|
userInfo: [NSLocalizedDescriptionKey: "Encrypted data too short"])
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
// Extract salt, IV, ciphertext(+tag if combined)
|
|
55
|
-
let salt = encryptedData[..<
|
|
56
|
-
let iv = encryptedData[
|
|
57
|
-
let encrypted = encryptedData[(
|
|
53
|
+
let salt = encryptedData[..<saltLength.intValue]
|
|
54
|
+
let iv = encryptedData[saltLength.intValue..<(saltLength.intValue + ivLength.intValue)]
|
|
55
|
+
let encrypted = encryptedData[(saltLength.intValue + ivLength.intValue)...]
|
|
58
56
|
|
|
59
57
|
let saltData: [UInt8] = Array(salt)
|
|
60
58
|
let password: [UInt8] = Array(key.utf8)
|
|
@@ -94,9 +92,11 @@ public class EncryptionManager: NSObject {
|
|
|
94
92
|
}
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
@objc(encrypt:key:iterationCount:error:)
|
|
95
|
+
@objc(encrypt:key:saltLength:ivLength:iterationCount:error:)
|
|
98
96
|
public func encrypt(_ plainText: String,
|
|
99
97
|
key: String,
|
|
98
|
+
saltLength: NSNumber,
|
|
99
|
+
ivLength: NSNumber,
|
|
100
100
|
iterationCount: NSNumber,
|
|
101
101
|
error: NSErrorPointer) -> String? {
|
|
102
102
|
|
|
@@ -104,8 +104,8 @@ public class EncryptionManager: NSObject {
|
|
|
104
104
|
print("encryptTextAesGcm JSON : \(plainText)")
|
|
105
105
|
print("encryptTextAesGcm Key : \(key)")
|
|
106
106
|
|
|
107
|
-
let salt = generateRandomSalt(length:
|
|
108
|
-
let iv = try getRandomNonce(length:
|
|
107
|
+
let salt = generateRandomSalt(length: saltLength.intValue)
|
|
108
|
+
let iv = try getRandomNonce(length: ivLength.intValue)
|
|
109
109
|
|
|
110
110
|
let password: [UInt8] = Array(key.utf8)
|
|
111
111
|
let plainTextArray: [UInt8] = Array(plainText.utf8)
|
|
@@ -27,20 +27,20 @@
|
|
|
27
27
|
namespace facebook::react {
|
|
28
28
|
|
|
29
29
|
static facebook::jsi::Value __hostFunction_NativeAesGcmSpecJSI_encrypt(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
30
|
-
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "encrypt", @selector(encrypt:key:iterationCount:resolve:reject:), args, count);
|
|
30
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "encrypt", @selector(encrypt:key:saltLength:ivLength:iterationCount:resolve:reject:), args, count);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
static facebook::jsi::Value __hostFunction_NativeAesGcmSpecJSI_decrypt(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
34
|
-
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "decrypt", @selector(decrypt:key:iterationCount:resolve:reject:), args, count);
|
|
34
|
+
return static_cast<ObjCTurboModule&>(turboModule).invokeObjCMethod(rt, PromiseKind, "decrypt", @selector(decrypt:key:saltLength:ivLength:iterationCount:resolve:reject:), args, count);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
NativeAesGcmSpecJSI::NativeAesGcmSpecJSI(const ObjCTurboModule::InitParams ¶ms)
|
|
38
38
|
: ObjCTurboModule(params) {
|
|
39
39
|
|
|
40
|
-
methodMap_["encrypt"] = MethodMetadata {
|
|
40
|
+
methodMap_["encrypt"] = MethodMetadata {5, __hostFunction_NativeAesGcmSpecJSI_encrypt};
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
methodMap_["decrypt"] = MethodMetadata {
|
|
43
|
+
methodMap_["decrypt"] = MethodMetadata {5, __hostFunction_NativeAesGcmSpecJSI_decrypt};
|
|
44
44
|
|
|
45
45
|
}
|
|
46
46
|
} // namespace facebook::react
|
|
@@ -37,11 +37,15 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
37
37
|
|
|
38
38
|
- (void)encrypt:(NSString *)plainText
|
|
39
39
|
key:(NSString *)key
|
|
40
|
+
saltLength:(double)saltLength
|
|
41
|
+
ivLength:(double)ivLength
|
|
40
42
|
iterationCount:(double)iterationCount
|
|
41
43
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
42
44
|
reject:(RCTPromiseRejectBlock)reject;
|
|
43
45
|
- (void)decrypt:(NSString *)encryptedText
|
|
44
46
|
key:(NSString *)key
|
|
47
|
+
saltLength:(double)saltLength
|
|
48
|
+
ivLength:(double)ivLength
|
|
45
49
|
iterationCount:(double)iterationCount
|
|
46
50
|
resolve:(RCTPromiseResolveBlock)resolve
|
|
47
51
|
reject:(RCTPromiseRejectBlock)reject;
|
|
@@ -22,29 +22,33 @@ public:
|
|
|
22
22
|
|
|
23
23
|
protected:
|
|
24
24
|
NativeAesGcmCxxSpec(std::shared_ptr<CallInvoker> jsInvoker) : TurboModule(std::string{NativeAesGcmCxxSpec::kModuleName}, jsInvoker) {
|
|
25
|
-
methodMap_["encrypt"] = MethodMetadata {.argCount =
|
|
26
|
-
methodMap_["decrypt"] = MethodMetadata {.argCount =
|
|
25
|
+
methodMap_["encrypt"] = MethodMetadata {.argCount = 5, .invoker = __encrypt};
|
|
26
|
+
methodMap_["decrypt"] = MethodMetadata {.argCount = 5, .invoker = __decrypt};
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
private:
|
|
30
30
|
static jsi::Value __encrypt(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
31
31
|
static_assert(
|
|
32
|
-
bridging::getParameterCount(&T::encrypt) ==
|
|
33
|
-
"Expected encrypt(...) to have
|
|
32
|
+
bridging::getParameterCount(&T::encrypt) == 6,
|
|
33
|
+
"Expected encrypt(...) to have 6 parameters");
|
|
34
34
|
return bridging::callFromJs<jsi::Value>(rt, &T::encrypt, static_cast<NativeAesGcmCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
35
35
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt),
|
|
36
36
|
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt),
|
|
37
|
-
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber()
|
|
37
|
+
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(),
|
|
38
|
+
count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(),
|
|
39
|
+
count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber());
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
static jsi::Value __decrypt(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
41
43
|
static_assert(
|
|
42
|
-
bridging::getParameterCount(&T::decrypt) ==
|
|
43
|
-
"Expected decrypt(...) to have
|
|
44
|
+
bridging::getParameterCount(&T::decrypt) == 6,
|
|
45
|
+
"Expected decrypt(...) to have 6 parameters");
|
|
44
46
|
return bridging::callFromJs<jsi::Value>(rt, &T::decrypt, static_cast<NativeAesGcmCxxSpec*>(&turboModule)->jsInvoker_, static_cast<T*>(&turboModule),
|
|
45
47
|
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asString(rt),
|
|
46
48
|
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asString(rt),
|
|
47
|
-
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber()
|
|
49
|
+
count <= 2 ? throw jsi::JSError(rt, "Expected argument in position 2 to be passed") : args[2].asNumber(),
|
|
50
|
+
count <= 3 ? throw jsi::JSError(rt, "Expected argument in position 3 to be passed") : args[3].asNumber(),
|
|
51
|
+
count <= 4 ? throw jsi::JSError(rt, "Expected argument in position 4 to be passed") : args[4].asNumber());
|
|
48
52
|
}
|
|
49
53
|
};
|
|
50
54
|
|
|
@@ -5,11 +5,15 @@ export interface Spec extends TurboModule {
|
|
|
5
5
|
encrypt(
|
|
6
6
|
plainText: string,
|
|
7
7
|
key: string,
|
|
8
|
+
saltLength: number,
|
|
9
|
+
ivLength: number,
|
|
8
10
|
iterationCount: number
|
|
9
11
|
): Promise<string>;
|
|
10
12
|
decrypt(
|
|
11
13
|
encryptedText: string,
|
|
12
14
|
key: string,
|
|
15
|
+
saltLength: number,
|
|
16
|
+
ivLength: number,
|
|
13
17
|
iterationCount: number
|
|
14
18
|
): Promise<string>;
|
|
15
19
|
}
|
package/lib/module/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import AesGcm from './NativeAesGcm';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
const SALT_LENGTH = 16;
|
|
5
|
+
const IV_LENGTH = 12;
|
|
6
|
+
const ITERATION_COUNT = 1000;
|
|
7
|
+
export function encrypt(plainText, key, options) {
|
|
8
|
+
return AesGcm.encrypt(plainText, key, options?.saltLength ?? SALT_LENGTH, options?.ivLength ?? IV_LENGTH, options?.iterationCount ?? ITERATION_COUNT);
|
|
6
9
|
}
|
|
7
|
-
export function decrypt(encryptedText, key,
|
|
8
|
-
return AesGcm.decrypt(encryptedText, key, iterationCount);
|
|
10
|
+
export function decrypt(encryptedText, key, options) {
|
|
11
|
+
return AesGcm.decrypt(encryptedText, key, options?.saltLength ?? SALT_LENGTH, options?.ivLength ?? IV_LENGTH, options?.iterationCount ?? ITERATION_COUNT);
|
|
9
12
|
}
|
|
10
13
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AesGcm","encrypt","plainText","key","iterationCount","decrypt","encryptedText"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"names":["AesGcm","SALT_LENGTH","IV_LENGTH","ITERATION_COUNT","encrypt","plainText","key","options","saltLength","ivLength","iterationCount","decrypt","encryptedText"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,gBAAgB;AAOnC,MAAMC,WAAW,GAAG,EAAE;AACtB,MAAMC,SAAS,GAAG,EAAE;AACpB,MAAMC,eAAe,GAAG,IAAI;AAE5B,OAAO,SAASC,OAAOA,CACrBC,SAAiB,EACjBC,GAAW,EACXC,OAAwB,EACP;EACjB,OAAOP,MAAM,CAACI,OAAO,CACnBC,SAAS,EACTC,GAAG,EACHC,OAAO,EAAEC,UAAU,IAAIP,WAAW,EAClCM,OAAO,EAAEE,QAAQ,IAAIP,SAAS,EAC9BK,OAAO,EAAEG,cAAc,IAAIP,eAC7B,CAAC;AACH;AAEA,OAAO,SAASQ,OAAOA,CACrBC,aAAqB,EACrBN,GAAW,EACXC,OAAwB,EACP;EACjB,OAAOP,MAAM,CAACW,OAAO,CACnBC,aAAa,EACbN,GAAG,EACHC,OAAO,EAAEC,UAAU,IAAIP,WAAW,EAClCM,OAAO,EAAEE,QAAQ,IAAIP,SAAS,EAC9BK,OAAO,EAAEG,cAAc,IAAIP,eAC7B,CAAC;AACH","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TurboModule } from 'react-native';
|
|
2
2
|
export interface Spec extends TurboModule {
|
|
3
|
-
encrypt(plainText: string, key: string, iterationCount: number): Promise<string>;
|
|
4
|
-
decrypt(encryptedText: string, key: string, iterationCount: number): Promise<string>;
|
|
3
|
+
encrypt(plainText: string, key: string, saltLength: number, ivLength: number, iterationCount: number): Promise<string>;
|
|
4
|
+
decrypt(encryptedText: string, key: string, saltLength: number, ivLength: number, iterationCount: number): Promise<string>;
|
|
5
5
|
}
|
|
6
6
|
declare const _default: Spec;
|
|
7
7
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAesGcm.d.ts","sourceRoot":"","sources":["../../../src/NativeAesGcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CACL,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;;AAED,wBAAgE"}
|
|
1
|
+
{"version":3,"file":"NativeAesGcm.d.ts","sourceRoot":"","sources":["../../../src/NativeAesGcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,OAAO,CACL,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;;AAED,wBAAgE"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
type EncryptOptions = {
|
|
2
|
+
saltLength?: number;
|
|
3
|
+
ivLength?: number;
|
|
4
|
+
iterationCount?: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function encrypt(plainText: string, key: string, options?: EncryptOptions): Promise<string>;
|
|
7
|
+
export declare function decrypt(encryptedText: string, key: string, options?: EncryptOptions): Promise<string>;
|
|
8
|
+
export {};
|
|
3
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,KAAK,cAAc,GAAG;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAKF,wBAAgB,OAAO,CACrB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,OAAO,CACrB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC,CAQjB"}
|
package/package.json
CHANGED
package/src/NativeAesGcm.ts
CHANGED
|
@@ -5,11 +5,15 @@ export interface Spec extends TurboModule {
|
|
|
5
5
|
encrypt(
|
|
6
6
|
plainText: string,
|
|
7
7
|
key: string,
|
|
8
|
+
saltLength: number,
|
|
9
|
+
ivLength: number,
|
|
8
10
|
iterationCount: number
|
|
9
11
|
): Promise<string>;
|
|
10
12
|
decrypt(
|
|
11
13
|
encryptedText: string,
|
|
12
14
|
key: string,
|
|
15
|
+
saltLength: number,
|
|
16
|
+
ivLength: number,
|
|
13
17
|
iterationCount: number
|
|
14
18
|
): Promise<string>;
|
|
15
19
|
}
|
package/src/index.tsx
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
import AesGcm from './NativeAesGcm';
|
|
2
2
|
|
|
3
|
+
type EncryptOptions = {
|
|
4
|
+
saltLength?: number;
|
|
5
|
+
ivLength?: number;
|
|
6
|
+
iterationCount?: number;
|
|
7
|
+
};
|
|
8
|
+
const SALT_LENGTH = 16;
|
|
9
|
+
const IV_LENGTH = 12;
|
|
10
|
+
const ITERATION_COUNT = 1000;
|
|
11
|
+
|
|
3
12
|
export function encrypt(
|
|
4
13
|
plainText: string,
|
|
5
14
|
key: string,
|
|
6
|
-
|
|
15
|
+
options?: EncryptOptions
|
|
7
16
|
): Promise<string> {
|
|
8
|
-
return AesGcm.encrypt(
|
|
17
|
+
return AesGcm.encrypt(
|
|
18
|
+
plainText,
|
|
19
|
+
key,
|
|
20
|
+
options?.saltLength ?? SALT_LENGTH,
|
|
21
|
+
options?.ivLength ?? IV_LENGTH,
|
|
22
|
+
options?.iterationCount ?? ITERATION_COUNT
|
|
23
|
+
);
|
|
9
24
|
}
|
|
10
25
|
|
|
11
26
|
export function decrypt(
|
|
12
27
|
encryptedText: string,
|
|
13
28
|
key: string,
|
|
14
|
-
|
|
29
|
+
options?: EncryptOptions
|
|
15
30
|
): Promise<string> {
|
|
16
|
-
return AesGcm.decrypt(
|
|
31
|
+
return AesGcm.decrypt(
|
|
32
|
+
encryptedText,
|
|
33
|
+
key,
|
|
34
|
+
options?.saltLength ?? SALT_LENGTH,
|
|
35
|
+
options?.ivLength ?? IV_LENGTH,
|
|
36
|
+
options?.iterationCount ?? ITERATION_COUNT
|
|
37
|
+
);
|
|
17
38
|
}
|