Skip to content

Commit 1ea9be5

Browse files
committed
Merge pull request #39 from daostack/Add-UID-Native
Add uid native
1 parent 62b9204 commit 1ea9be5

File tree

8 files changed

+45
-152
lines changed

8 files changed

+45
-152
lines changed

packages/common/android/app/src/main/java/com/daostack/common/bridge/WalletModule.java

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public String getName() {
3232
@ReactMethod
3333
public void generateMnemonic(Promise promise) {
3434
try {
35-
String mnemonic = WalletManager.getInstance().generateMnemonic(false);
35+
String mnemonic = WalletManager.getInstance().generateMnemonic("",false);
3636
promise.resolve(mnemonic);
3737
} catch (Exception e) {
3838
promise.reject(e);
@@ -41,9 +41,9 @@ public void generateMnemonic(Promise promise) {
4141
}
4242

4343
@ReactMethod
44-
public void generateAndStoreMnemonic(Promise promise) {
44+
public void generateAndStoreMnemonic(String uid, Promise promise) {
4545
try {
46-
String mnemonic = WalletManager.getInstance().generateMnemonic(true);
46+
String mnemonic = WalletManager.getInstance().generateMnemonic(uid,true);
4747
promise.resolve(mnemonic);
4848
} catch (Exception e) {
4949
promise.reject(e);
@@ -52,33 +52,22 @@ public void generateAndStoreMnemonic(Promise promise) {
5252
}
5353

5454
@ReactMethod
55-
public void storeMnemonic(String mnemonic, Promise promise) {
55+
public void storeMnemonic(String uid, String mnemonic, Promise promise) {
5656
try {
57-
WalletManager.getInstance().storeMnemonic(mnemonic);
57+
WalletManager.getInstance().storeMnemonic(uid, mnemonic);
5858
promise.resolve(mnemonic);
5959
} catch (Exception e) {
6060
promise.reject(e);
6161
}
6262
}
6363

6464
@ReactMethod
65-
public void retrieveMnemonic(Promise promise) {
65+
public void retrieveMnemonic(String uid, Promise promise) {
6666
try {
67-
String mnemonic = WalletManager.getInstance().retrieveMnemonic();
67+
String mnemonic = WalletManager.getInstance().retrieveMnemonic(uid);
6868
promise.resolve(mnemonic);
6969
} catch (Exception e) {
7070
promise.reject(e);
7171
}
7272
}
73-
74-
@ReactMethod
75-
public void signMessage(String message, Promise promise) {
76-
try {
77-
String signed = WalletManager.getInstance().signMessage(message);
78-
promise.resolve(signed);
79-
} catch (Exception e) {
80-
promise.reject(e);
81-
}
82-
83-
}
8473
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.daostack.common.config;
22

33
public class Constants {
4-
public final static String MEMORIZINGWORDS= "memorizingWords";
4+
// public final static String MEMORIZINGWORDS= "memorizingWords";
55
public final static String KEY_STORE_PATH= "key_store_path";
66
public final static String KEY_ADDRESS= "key_address";
77
}
Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,13 @@
11
package com.daostack.common.manager;
22

3-
import android.os.Environment;
4-
import android.text.TextUtils;
5-
63
import com.daostack.common.MainApplication;
7-
import com.facebook.react.bridge.Promise;
8-
import com.fasterxml.jackson.core.util.DefaultPrettyPrinter;
9-
import com.fasterxml.jackson.databind.ObjectMapper;
10-
import com.fasterxml.jackson.databind.ObjectWriter;
11-
12-
import com.daostack.common.async.WorkThreadHandler;
13-
import com.daostack.common.async.*;
14-
15-
import org.web3j.crypto.Bip32ECKeyPair;
16-
import org.web3j.crypto.Credentials;
174
import org.web3j.crypto.MnemonicUtils;
18-
import org.web3j.crypto.Wallet;
19-
import org.web3j.crypto.WalletFile;
20-
import org.web3j.protocol.Web3j;
21-
import org.web3j.utils.Numeric;
22-
23-
import java.io.File;
245
import java.security.SecureRandom;
25-
26-
import io.reactivex.disposables.CompositeDisposable;
27-
import wallet.core.jni.CoinType;
28-
import wallet.core.jni.Curve;
29-
import wallet.core.jni.HDWallet;
30-
import wallet.core.jni.Hash;
31-
import wallet.core.jni.PrivateKey;
32-
336
import com.orhanobut.hawk.Hawk;
34-
import com.fasterxml.jackson.databind.ObjectWriter;
35-
import com.daostack.common.util.*;
36-
import com.daostack.common.config.*;
377
import com.yakivmospan.scytale.Crypto;
388
import com.yakivmospan.scytale.Options;
399
import com.yakivmospan.scytale.Store;
40-
4110
import javax.crypto.SecretKey;
42-
import static com.daostack.common.config.Constants.MEMORIZINGWORDS;
4311

4412
public class WalletManager {
4513

@@ -66,7 +34,7 @@ public WalletManager () {
6634
System.loadLibrary("TrustWalletCore");
6735
}
6836

69-
public String generateMnemonic(Boolean shouldStore) throws Exception {
37+
public String generateMnemonic(String uid, Boolean shouldStore) throws Exception {
7038
try {
7139
byte[] initialEntropy = new byte[16];
7240
SecureRandom secureRandom = new SecureRandom();
@@ -75,27 +43,27 @@ public String generateMnemonic(Boolean shouldStore) throws Exception {
7543
if (shouldStore) {
7644
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
7745
String encryptedData = crypto.encrypt(mnemonic, key);
78-
Hawk.put(MEMORIZINGWORDS, encryptedData);
46+
Hawk.put(uid, encryptedData);
7947
}
8048
return mnemonic;
8149
}catch (Exception e){
8250
throw e;
8351
}
8452
}
8553

86-
public void storeMnemonic(String mnemonic) throws Exception {
54+
public void storeMnemonic(String uid, String mnemonic) throws Exception {
8755
try {
8856
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
8957
String encryptedData = crypto.encrypt(mnemonic, key);
90-
Hawk.put(MEMORIZINGWORDS, encryptedData);
58+
Hawk.put(uid, encryptedData);
9159
} catch (Exception e){
9260
throw e;
9361
}
9462
}
9563

96-
public String retrieveMnemonic() throws Exception {
64+
public String retrieveMnemonic(String uid ) throws Exception {
9765
try {
98-
String encryptedData = Hawk.get(MEMORIZINGWORDS);
66+
String encryptedData = Hawk.get(uid);
9967
Crypto crypto = new Crypto(Options.TRANSFORMATION_SYMMETRIC);
10068
String decryptedData = crypto.decrypt(encryptedData, key);
10169
return decryptedData;
@@ -105,19 +73,4 @@ public String retrieveMnemonic() throws Exception {
10573

10674
}
10775

108-
public String signMessage(String message) throws Exception {
109-
try{
110-
byte[] messageBytes = Numeric.hexStringToByteArray(message);
111-
String mnemonic = retrieveMnemonic();
112-
HDWallet newWallet = new HDWallet(mnemonic, "");
113-
PrivateKey pk = newWallet.getKeyForCoin(CoinType.ETHEREUM);
114-
byte[] digest = Hash.keccak256(messageBytes);
115-
byte[] sigBytes = pk.sign(digest, Curve.SECP256K1);
116-
String result = Numeric.toHexString(sigBytes);
117-
return result;
118-
}catch (Exception e){
119-
throw e;
120-
}
121-
}
122-
12376
}

packages/common/ios/common/Modules/ReactNative/RNBridge.m

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@ @interface RCT_EXTERN_MODULE(WalletModule, NSObject)
1717
RCT_EXTERN_METHOD(generateMnemonic:(RCTPromiseResolveBlock)resolve
1818
reject:(RCTPromiseRejectBlock)reject)
1919

20-
RCT_EXTERN_METHOD(generateAndStoreMnemonic:(RCTPromiseResolveBlock)resolve
21-
reject:(RCTPromiseRejectBlock)reject)
22-
23-
RCT_EXTERN_METHOD(storeMnemonic:(NSString *)mnemonic
20+
RCT_EXTERN_METHOD(generateAndStoreMnemonic(NSString *)uid
21+
mnemonic:(NSString *)mnemonic
2422
resolve:(RCTPromiseResolveBlock)resolve
2523
reject:(RCTPromiseRejectBlock)reject)
2624

27-
RCT_EXTERN_METHOD(retrieveMnemonic:(RCTPromiseResolveBlock)resolve
25+
RCT_EXTERN_METHOD(storeMnemonic:(NSString *)uid
26+
mnemonic:(NSString *)mnemonic
27+
resolve:(RCTPromiseResolveBlock)resolve
2828
reject:(RCTPromiseRejectBlock)reject)
2929

30-
RCT_EXTERN_METHOD(signMessage:(NSString *)message
30+
RCT_EXTERN_METHOD(retrieveMnemonic:(NSString *)uid
31+
mnemonic:(NSString *)mnemonic
3132
resolve:(RCTPromiseResolveBlock)resolve
3233
reject:(RCTPromiseRejectBlock)reject)
3334

packages/common/ios/common/Modules/ReactNative/WalletModule.swift

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,62 +15,52 @@ class WalletModule: NSObject {
1515
reject: @escaping RCTPromiseRejectBlock) {
1616
DispatchQueue.main.async {
1717
do {
18-
let seed = try WalletManager.shared.generateMnemonic(shouldStore: false)
18+
let seed = try WalletManager.shared.generateMnemonic(uid: "", shouldStore: false)
1919
resolve(seed)
2020
} catch {
2121
reject("1", "Create mnemonic failed", error)
2222
}
2323
}
2424
}
2525

26-
@objc func generateAndStoreMnemonic(_ resolve: @escaping RCTPromiseResolveBlock,
26+
@objc func generateAndStoreMnemonic(_ uid: String,
27+
resolve: @escaping RCTPromiseResolveBlock,
2728
reject: @escaping RCTPromiseRejectBlock) {
2829
DispatchQueue.main.async {
2930
do {
30-
let seed = try WalletManager.shared.generateMnemonic(shouldStore: true)
31+
let seed = try WalletManager.shared.generateMnemonic(uid: uid, shouldStore: true)
3132
resolve(seed)
3233
} catch {
3334
reject("1", "Create and store mnemonic failed", error)
3435
}
3536
}
3637
}
3738

38-
@objc func storeMnemonic(_ mnemonic: String,
39+
@objc func storeMnemonic(_ uid: String,
40+
mnemonic: String,
3941
resolve: @escaping RCTPromiseResolveBlock,
4042
reject: @escaping RCTPromiseRejectBlock) {
4143
DispatchQueue.main.async {
4244
do {
43-
try WalletManager.shared.storeMnemonic(mnemonic: mnemonic)
45+
try WalletManager.shared.storeMnemonic(uid: uid, mnemonic: mnemonic)
4446
resolve(true)
4547
} catch {
4648
reject("3", "Store mnemonic failed", error)
4749
}
4850
}
4951
}
5052

51-
@objc func retrieveMnemonic(_ resolve: @escaping RCTPromiseResolveBlock,
53+
@objc func retrieveMnemonic(_ uid: String,
54+
resolve: @escaping RCTPromiseResolveBlock,
5255
reject: @escaping RCTPromiseRejectBlock) {
5356
DispatchQueue.main.async {
5457
do {
55-
let seed = try WalletManager.shared.retrieveMnemonic()
58+
let seed = try WalletManager.shared.retrieveMnemonic(uid: uid)
5659
resolve(seed)
5760
} catch {
5861
reject("4", "Retrieve mnemonic failed", error)
5962
}
6063
}
6164
}
6265

63-
@objc func signMessage(_ message: String,
64-
resolve: @escaping RCTPromiseResolveBlock,
65-
reject: @escaping RCTPromiseRejectBlock) {
66-
DispatchQueue.main.async {
67-
do {
68-
let signed = try WalletManager.shared.signMessage(message: message)
69-
resolve(signed)
70-
} catch {
71-
reject("2", "Sign Data failed", error)
72-
}
73-
}
74-
}
75-
7666
}

packages/common/ios/common/Modules/Wallet/WalletManager.swift

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@ public class WalletManager {
1414

1515
static var shared = WalletManager()
1616
var keychain: Keychain?
17-
18-
private let keychainKey = "mnemonic"
17+
1918
let defaultPassword = "web3swift"
2019

2120
init() {
2221
keychain = Keychain(service: "com.daostack.common")
2322
}
2423

25-
func generateMnemonic(shouldStore: Bool) throws -> String? {
24+
func generateMnemonic(uid: String, shouldStore: Bool) throws -> String? {
2625

2726
guard let keychain = self.keychain else {
2827
throw WalletError.custom("keychian is nil")
@@ -32,57 +31,30 @@ public class WalletManager {
3231
let bitsOfEntropy: Int = 128 // Entropy is a measure of password strength. Usually used 128 or 256 bits.
3332
let mnemonics = try BIP39.generateMnemonics(bitsOfEntropy: bitsOfEntropy)
3433
if shouldStore {
35-
keychain[keychainKey] = mnemonics
34+
keychain[uid] = mnemonics
3635
}
3736
return mnemonics
3837
} catch {
3938
throw WalletError.custom("Create mnemonics failed")
4039
}
4140
}
4241

43-
func storeMnemonic(mnemonic: String) throws {
42+
func storeMnemonic(uid: String, mnemonic: String) throws {
4443
guard let keychain = self.keychain else {
4544
throw WalletError.custom("keychian is nil")
4645
}
47-
keychain[keychainKey] = mnemonic
46+
keychain[uid] = mnemonic
4847
}
4948

50-
func retrieveMnemonic() throws -> String? {
49+
func retrieveMnemonic(uid: String) throws -> String? {
5150
guard let keychain = self.keychain else {
5251
throw WalletError.custom("keychian is nil")
5352
}
5453

55-
let mnemonics = keychain[keychainKey]
54+
let mnemonics = keychain[uid]
5655
// defer {
5756
// mnemonics = nil
5857
// }
5958
return mnemonics
6059
}
61-
62-
/// Message is hex data string
63-
func signMessage(message: String) throws -> String? {
64-
65-
guard let data = Data.fromHex(message) else {
66-
throw WalletError.custom("Data")
67-
}
68-
69-
guard let mnemonics = try retrieveMnemonic(),
70-
let keystore = try BIP32Keystore(mnemonics: mnemonics),
71-
let address = keystore.addresses?.first else {
72-
throw WalletError.malformedKeystore
73-
}
74-
75-
do {
76-
guard let signedData = try Web3Signer.signPersonalMessage(data,
77-
keystore: keystore,
78-
account: address,
79-
password: defaultPassword) else {
80-
throw WalletError.custom("Sign Failed")
81-
}
82-
return signedData.toHexString().addHexPrefix()
83-
} catch {
84-
throw WalletError.messageFailedToData
85-
}
86-
}
87-
8860
}

packages/common/src/Screens/NativeBridgeTests.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default class nativeBridgeTests extends React.Component {
6262
console.log('storeMnemonic: ', storedMnemonic);
6363
this.setState({storedMnemonic: 'true'});
6464
} catch (e) {
65-
throw 'Sign message failed with error: ' + e;
65+
throw 'Store mnemonic failed with error: ' + e;
6666
}
6767
};
6868

0 commit comments

Comments
 (0)