Update for seed changes

pull/35/head
Niels Andriesse 6 years ago
parent 23c3320ab3
commit ca822480b1

@ -1,7 +1,7 @@
final class OnboardingKeyPairViewController : OnboardingBaseViewController { final class OnboardingKeyPairViewController : OnboardingBaseViewController {
private var mode: Mode = .register { didSet { if mode != oldValue { handleModeChanged() } } } private var mode: Mode = .register { didSet { if mode != oldValue { handleModeChanged() } } }
private var keyPair: ECKeyPair! { didSet { updateMnemonic() } } private var seed: Data! { didSet { updateMnemonic() } }
private var mnemonic: String! { didSet { handleMnemonicChanged() } } private var mnemonic: String! { didSet { handleMnemonicChanged() } }
private var userName: String? private var userName: String?
@ -104,7 +104,7 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController {
super.loadView() super.loadView()
setUpViewHierarchy() setUpViewHierarchy()
handleModeChanged() // Perform initial update handleModeChanged() // Perform initial update
updateKeyPair() updateSeed()
} }
private func setUpViewHierarchy() { private func setUpViewHierarchy() {
@ -159,14 +159,13 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController {
if mode == .register { mnemonicTextField.resignFirstResponder() } if mode == .register { mnemonicTextField.resignFirstResponder() }
} }
private func updateKeyPair() { private func updateSeed() {
let identityManager = OWSIdentityManager.shared() seed = Randomness.generateRandomBytes(16)
identityManager.generateNewIdentityKey() // Generate and store a new identity key pair
keyPair = identityManager.identityKeyPair()!
} }
private func updateMnemonic() { private func updateMnemonic() {
mnemonic = Mnemonic.encode(hexEncodedString: keyPair.hexEncodedPrivateKey) let hexEncodedSeed = seed!.toHexString()
mnemonic = Mnemonic.encode(hexEncodedString: hexEncodedSeed)
} }
private func handleMnemonicChanged() { private func handleMnemonicChanged() {
@ -191,25 +190,27 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController {
} }
@objc private func registerOrRestore() { @objc private func registerOrRestore() {
let hexEncodedPublicKey: String var seed: Data
switch mode { switch mode {
case .register: hexEncodedPublicKey = keyPair.hexEncodedPublicKey case .register: seed = self.seed
case .restore: case .restore:
let mnemonic = mnemonicTextField.text! let mnemonic = mnemonicTextField.text!
do { do {
let hexEncodedPrivateKey = try Mnemonic.decode(mnemonic: mnemonic) let hexEncodedSeed = try Mnemonic.decode(mnemonic: mnemonic)
let keyPair = ECKeyPair.generate(withHexEncodedPrivateKey: hexEncodedPrivateKey) seed = Data(hex: hexEncodedSeed)
// Use KVC to access dbConnection even though it's private
let databaseConnection = OWSIdentityManager.shared().value(forKey: "dbConnection") as! YapDatabaseConnection
// OWSPrimaryStorageIdentityKeyStoreIdentityKey is private so just use its value directly
databaseConnection.setObject(keyPair, forKey: "TSStorageManagerIdentityKeyStoreIdentityKey", inCollection: OWSPrimaryStorageIdentityKeyStoreCollection)
hexEncodedPublicKey = keyPair.hexEncodedPublicKey
} catch let error { } catch let error {
let error = error as? Mnemonic.DecodingError ?? Mnemonic.DecodingError.generic let error = error as? Mnemonic.DecodingError ?? Mnemonic.DecodingError.generic
errorLabel.text = error.errorDescription return errorLabel.text = error.errorDescription
return
} }
} }
// Use KVC to access dbConnection even though it's private
let databaseConnection = OWSIdentityManager.shared().value(forKey: "dbConnection") as! YapDatabaseConnection
databaseConnection.setObject(seed.toHexString(), forKey: "LKLokiSeed", inCollection: OWSPrimaryStorageIdentityKeyStoreCollection)
if seed.count == 16 { seed = seed + seed }
let identityManager = OWSIdentityManager.shared()
identityManager.generateNewIdentityKeyPair(fromSeed: seed) // This also stores it
let keyPair = identityManager.identityKeyPair()!
let hexEncodedPublicKey = keyPair.hexEncodedPublicKey
let accountManager = TSAccountManager.sharedInstance() let accountManager = TSAccountManager.sharedInstance()
accountManager.phoneNumberAwaitingVerification = hexEncodedPublicKey accountManager.phoneNumberAwaitingVerification = hexEncodedPublicKey
accountManager.didRegister() accountManager.didRegister()

@ -520,8 +520,11 @@
- (void)showSeed - (void)showSeed
{ {
NSString *title = NSLocalizedString(@"Your Seed", @""); NSString *title = NSLocalizedString(@"Your Seed", @"");
ECKeyPair *keyPair = OWSIdentityManager.sharedManager.identityKeyPair; OWSIdentityManager *identityManager = OWSIdentityManager.sharedManager;
NSString *mnemonic = [LKMnemonic encodeHexEncodedString:keyPair.hexEncodedPrivateKey]; YapDatabaseConnection *databaseConnection = (YapDatabaseConnection *)[identityManager valueForKey:@"dbConnection"];
NSString *hexEncodedSeed = [databaseConnection objectForKey:@"LKLokiSeed" inCollection:OWSPrimaryStorageIdentityKeyStoreCollection];
if (hexEncodedSeed == nil) { hexEncodedSeed = identityManager.identityKeyPair.hexEncodedPrivateKey; } // Legacy account
NSString *mnemonic = [LKMnemonic encodeHexEncodedString:hexEncodedSeed];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:mnemonic preferredStyle:UIAlertControllerStyleAlert]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:mnemonic preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"") style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { /* Do nothing */ }]]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"") style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { /* Do nothing */ }]];
[alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Copy", @"") style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { UIPasteboard.generalPasteboard.string = mnemonic; }]]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Copy", @"") style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { UIPasteboard.generalPasteboard.string = mnemonic; }]];

@ -24,7 +24,7 @@ public class CreatePreKeysOperation: OWSOperation {
Logger.debug("") Logger.debug("")
if identityKeyManager.identityKeyPair() == nil { if identityKeyManager.identityKeyPair() == nil {
identityKeyManager.generateNewIdentityKey() identityKeyManager.generateNewIdentityKeyPair()
} }
// Loki: We don't generate PreKeyRecords here. // Loki: We don't generate PreKeyRecords here.

@ -35,7 +35,8 @@ extern const NSUInteger kStoredIdentityKeyLength;
+ (instancetype)sharedManager; + (instancetype)sharedManager;
- (void)generateNewIdentityKey; - (void)generateNewIdentityKeyPair;
- (void)generateNewIdentityKeyPairFromSeed:(NSData *)seed;
- (void)clearIdentityKey; - (void)clearIdentityKey;
- (void)setVerificationState:(OWSVerificationState)verificationState - (void)setVerificationState:(OWSVerificationState)verificationState

@ -117,11 +117,16 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa
object:nil]; object:nil];
} }
- (void)generateNewIdentityKey - (void)generateNewIdentityKeyPair
{ {
[self.dbConnection setObject:[Curve25519 generateKeyPair] ECKeyPair *keyPair = [Curve25519 generateKeyPair];
forKey:OWSPrimaryStorageIdentityKeyStoreIdentityKey [self.dbConnection setObject:keyPair forKey:OWSPrimaryStorageIdentityKeyStoreIdentityKey inCollection:OWSPrimaryStorageIdentityKeyStoreCollection];
inCollection:OWSPrimaryStorageIdentityKeyStoreCollection]; }
- (void)generateNewIdentityKeyPairFromSeed:(NSData *)seed
{
ECKeyPair *keyPair = [Curve25519 generateKeyPairFromSeed:seed];
[self.dbConnection setObject:keyPair forKey:OWSPrimaryStorageIdentityKeyStoreIdentityKey inCollection:OWSPrimaryStorageIdentityKeyStoreCollection];
} }
- (void)clearIdentityKey - (void)clearIdentityKey

@ -107,7 +107,7 @@ extern NSString *const OWSPrimaryStorageTrustedKeysCollection;
- (void)testIdentityKey - (void)testIdentityKey
{ {
[[OWSIdentityManager sharedManager] generateNewIdentityKey]; [[OWSIdentityManager sharedManager] generateNewIdentityKeyPair];
XCTAssert([[[OWSIdentityManager sharedManager] identityKeyPair].publicKey length] == 32); XCTAssert([[[OWSIdentityManager sharedManager] identityKeyPair].publicKey length] == 32);
} }

Loading…
Cancel
Save