@pmishra0/react-native-aes-gcm 0.1.2 → 0.1.4

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 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"
package/README.md CHANGED
@@ -12,16 +12,24 @@ npm install react-native-aes-gcm
12
12
 
13
13
 
14
14
  ```js
15
- import { encrypt, decrypt } from 'react-native-aes-gcm';
15
+ import { encrypt, decrypt } from '@pmishra0/react-native-aes-gcm';
16
16
 
17
17
  // ...
18
18
 
19
- const encrypted = await encrypt(text, key, iterations).catch((e) => {
19
+ const encrypted = await encrypt(text, key, {
20
+ iterationCount: 1000,
21
+ saltLength: 16,
22
+ ivLength: 12
23
+ }).catch((e) => {
20
24
  console.log('Error Enctyption:: ', e);
21
25
 
22
26
  });
23
27
 
24
- const decrypted = await decrypt(text, key, iterations).catch((e) => {
28
+ const decrypted = await decrypt(text, key, {
29
+ iterationCount: 1000,
30
+ saltLength: 16,
31
+ ivLength: 12
32
+ }).catch((e) => {
25
33
  console.log('Error:: ', e);
26
34
 
27
35
  });
@@ -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;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
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;DLcom/facebook/react/bridge/Promise;)V", args, count, cachedMethodId);
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 &params)
26
26
  : JavaTurboModule(params) {
27
- methodMap_["encrypt"] = MethodMetadata {3, __hostFunction_NativeAesGcmSpecJSI_encrypt};
28
- methodMap_["decrypt"] = MethodMetadata {3, __hostFunction_NativeAesGcmSpecJSI_decrypt};
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 &params) {
@@ -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 = 3, .invoker = __encrypt};
26
- methodMap_["decrypt"] = MethodMetadata {.argCount = 3, .invoker = __decrypt};
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) == 4,
33
- "Expected encrypt(...) to have 4 parameters");
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) == 4,
43
- "Expected decrypt(...) to have 4 parameters");
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(SALT_LENGTH)
40
+ val salt = getRandomNonce(saltLength.toInt())
39
41
  val secretKey: SecretKey = getAESKeyFromPassword(key.toCharArray(), salt, iterationCount)
40
- val iv = getRandomNonce(IV_LENGTH)
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(SALT_LENGTH)
71
+ val salt = ByteArray(saltLength.toInt())
68
72
  byteBuffer.get(salt)
69
- val iv = ByteArray(IV_LENGTH)
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 * 8, iv))
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 * 8, iv))
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 * 8)
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 = 16
111
- private const val SALT_LENGTH: Int = 16
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
  }
@@ -1,33 +1,21 @@
1
1
  package com.aesgcm
2
2
 
3
- import com.facebook.react.BaseReactPackage
3
+ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.module.model.ReactModuleInfo
7
- import com.facebook.react.module.model.ReactModuleInfoProvider
8
- import java.util.HashMap
6
+ import com.facebook.react.uimanager.ViewManager
9
7
 
10
- class AesGcmPackage : BaseReactPackage() {
11
- override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
- return if (name == AesGcmModule.NAME) {
13
- AesGcmModule(reactContext)
14
- } else {
15
- null
16
- }
8
+ class AesGcmPackage : ReactPackage {
9
+
10
+ override fun createNativeModules(
11
+ reactContext: ReactApplicationContext
12
+ ): List<NativeModule> {
13
+ return listOf(AesGcmModule(reactContext))
17
14
  }
18
15
 
19
- override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
20
- return ReactModuleInfoProvider {
21
- val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
22
- moduleInfos[AesGcmModule.NAME] = ReactModuleInfo(
23
- AesGcmModule.NAME,
24
- AesGcmModule.NAME,
25
- false, // canOverrideExistingModule
26
- false, // needsEagerInit
27
- false, // isCxxModule
28
- true // isTurboModule
29
- )
30
- moduleInfos
31
- }
16
+ override fun createViewManagers(
17
+ reactContext: ReactApplicationContext
18
+ ): List<ViewManager<*, *>> {
19
+ return emptyList()
32
20
  }
33
21
  }
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.example", code: Int(result), userInfo: nil)
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 > (SALT_LENGTH + IV_LENGTH) else {
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[..<SALT_LENGTH]
56
- let iv = encryptedData[SALT_LENGTH..<(SALT_LENGTH + IV_LENGTH)]
57
- let encrypted = encryptedData[(SALT_LENGTH + IV_LENGTH)...]
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: SALT_LENGTH)
108
- let iv = try getRandomNonce(length: IV_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 &params)
38
38
  : ObjCTurboModule(params) {
39
39
 
40
- methodMap_["encrypt"] = MethodMetadata {3, __hostFunction_NativeAesGcmSpecJSI_encrypt};
40
+ methodMap_["encrypt"] = MethodMetadata {5, __hostFunction_NativeAesGcmSpecJSI_encrypt};
41
41
 
42
42
 
43
- methodMap_["decrypt"] = MethodMetadata {3, __hostFunction_NativeAesGcmSpecJSI_decrypt};
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 = 3, .invoker = __encrypt};
26
- methodMap_["decrypt"] = MethodMetadata {.argCount = 3, .invoker = __decrypt};
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) == 4,
33
- "Expected encrypt(...) to have 4 parameters");
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) == 4,
43
- "Expected decrypt(...) to have 4 parameters");
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
  }
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
 
3
3
  import AesGcm from './NativeAesGcm';
4
- export function encrypt(plainText, key, iterationCount) {
5
- return AesGcm.encrypt(plainText, key, iterationCount);
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, iterationCount) {
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
@@ -1 +1 @@
1
- {"version":3,"names":["AesGcm","encrypt","plainText","key","iterationCount","decrypt","encryptedText"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,gBAAgB;AAEnC,OAAO,SAASC,OAAOA,CACrBC,SAAiB,EACjBC,GAAW,EACXC,cAAsB,EACL;EACjB,OAAOJ,MAAM,CAACC,OAAO,CAACC,SAAS,EAAEC,GAAG,EAAEC,cAAc,CAAC;AACvD;AAEA,OAAO,SAASC,OAAOA,CACrBC,aAAqB,EACrBH,GAAW,EACXC,cAAsB,EACL;EACjB,OAAOJ,MAAM,CAACK,OAAO,CAACC,aAAa,EAAEH,GAAG,EAAEC,cAAc,CAAC;AAC3D","ignoreList":[]}
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
- export declare function encrypt(plainText: string, key: string, iterationCount: number): Promise<string>;
2
- export declare function decrypt(encryptedText: string, key: string, iterationCount: number): Promise<string>;
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,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAgB,OAAO,CACrB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAEjB"}
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
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "@pmishra0/react-native-aes-gcm",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "AES-GCM encryption/decryption for React Native",
5
5
  "source": "./src/index.tsx",
6
6
  "main": "./lib/module/index.js",
7
+ "module": "./lib/module/index.js",
8
+ "types": "lib/typescript/src/index.d.ts",
9
+ "react-native": "./src/index",
7
10
  "exports": {
8
11
  ".": {
9
12
  "types": "./lib/typescript/src/index.d.ts",
13
+ "import": "./lib/module/index.js",
14
+ "require": "./lib/commonjs/index.js",
10
15
  "default": "./lib/module/index.js"
11
16
  },
12
17
  "./package.json": "./package.json"
@@ -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
- iterationCount: number
15
+ options?: EncryptOptions
7
16
  ): Promise<string> {
8
- return AesGcm.encrypt(plainText, key, iterationCount);
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
- iterationCount: number
29
+ options?: EncryptOptions
15
30
  ): Promise<string> {
16
- return AesGcm.decrypt(encryptedText, key, iterationCount);
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
  }