Skip to content

Commit 81a02a9

Browse files
committed
Dont use UTF8 for encoding since we might be trying to encrypt binary data
1 parent a4951b2 commit 81a02a9

5 files changed

Lines changed: 15 additions & 12 deletions

File tree

android/src/main/java/org/walletconnect/crypto/RCTAes.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public String getName() {
6161
}
6262

6363
@ReactMethod
64-
public void encrypt(String data, String keyBase64, String ivBase64, Promise promise) {
64+
public void encrypt(String dataBase64, String keyBase64, String ivBase64, Promise promise) {
6565
try {
66-
String result = encrypt(data, keyBase64, ivBase64);
66+
String result = encrypt(dataBase64, keyBase64, ivBase64);
6767
promise.resolve(result);
6868
} catch (Exception e) {
6969
promise.reject("-1", e.getMessage());
@@ -116,8 +116,8 @@ public static String bytesToHex(byte[] bytes) {
116116

117117
final static IvParameterSpec emptyIvSpec = new IvParameterSpec(new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
118118

119-
private static String encrypt(String text, String hexKey, String hexIv) throws Exception {
120-
if (text == null || text.length() == 0) {
119+
private static String encrypt(String textBase64, String hexKey, String hexIv) throws Exception {
120+
if (textBase64 == null || textBase64.length() == 0) {
121121
return null;
122122
}
123123

@@ -126,7 +126,8 @@ private static String encrypt(String text, String hexKey, String hexIv) throws E
126126

127127
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
128128
cipher.init(Cipher.ENCRYPT_MODE, secretKey, hexIv == null ? emptyIvSpec : new IvParameterSpec(Hex.decode(hexIv)));
129-
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
129+
byte [] textBytes = Base64.getEncoder().decode(textBase64);
130+
byte[] encrypted = cipher.doFinal(textBytes);
130131
return Base64.encodeToString(encrypted, Base64.NO_WRAP);
131132
}
132133

index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,12 @@ function randomBytes(length) {
9191

9292
const AES = {
9393
encrypt: function(textArrayBuffer, keyArrayBuffer, ivArrayBuffer) {
94-
const textString = convertArrayBufferToUtf8(textArrayBuffer);
94+
// Input might not be UTF8 encodable
95+
const textBase64 = convertArrayBufferToBase64(textArrayBuffer);
9596
const keyHex = convertArrayBufferToHex(keyArrayBuffer);
9697
const ivHex = convertArrayBufferToHex(ivArrayBuffer);
9798
return new Promise((resolve, reject) => {
98-
NativeModules.Aes.encrypt(textString, keyHex, ivHex)
99+
NativeModules.Aes.encrypt(textBase64, keyHex, ivHex)
99100
.then(cipherTextBase64 => {
100101
const result = convertBase64ToArrayBuffer(cipherTextBase64);
101102
resolve(result);

ios/RCTCrypto/RCTAes.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ @implementation RCTAes
55

66
RCT_EXPORT_MODULE()
77

8-
RCT_EXPORT_METHOD(encrypt:(NSString *)data key:(NSString *)key iv:(NSString *)iv
8+
RCT_EXPORT_METHOD(encrypt:(NSString *)dataBase64 key:(NSString *)key iv:(NSString *)iv
99
resolver:(RCTPromiseResolveBlock)resolve
1010
rejecter:(RCTPromiseRejectBlock)reject) {
1111
NSError *error = nil;
12-
NSString *base64 = [Aes encrypt:data key:key iv:iv];
12+
NSString *base64 = [Aes encrypt:dataBase64 key:key iv:iv];
1313
if (base64 == nil) {
1414
reject(@"encrypt_fail", @"Encrypt error", error);
1515
} else {

ios/RCTCrypto/lib/Aes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#import <Foundation/Foundation.h>
22

33
@interface Aes : NSObject
4-
+ (NSString *) encrypt: (NSString *)clearText key: (NSString *)key iv: (NSString *)iv;
4+
+ (NSString *) encrypt: (NSString *)clearText64 key: (NSString *)key iv: (NSString *)iv;
55
+ (NSString *) decrypt: (NSString *)cipherText key: (NSString *)key iv: (NSString *)iv;
66
@end

ios/RCTCrypto/lib/Aes.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ + (NSData *) AES128CBC: (NSString *)operation data: (NSData *)data key: (NSStrin
3434
return nil;
3535
}
3636

37-
+ (NSString *) encrypt: (NSString *)clearText key: (NSString *)key iv: (NSString *)iv {
38-
NSData *result = [self AES128CBC:@"encrypt" data:[clearText dataUsingEncoding:NSUTF8StringEncoding] key:key iv:iv];
37+
+ (NSString *) encrypt: (NSString *)clearText64 key: (NSString *)key iv: (NSString *)iv {
38+
NSData* clearData = [[NSData alloc] initWithBase64EncodedString:base64Encoded options:0];
39+
NSData *result = [self AES128CBC:@"encrypt" data:clearData key:key iv:iv];
3940
return [result base64EncodedStringWithOptions:0];
4041
}
4142

0 commit comments

Comments
 (0)