def new_masterkey(passphrase, rand=Random(), get_time=time.time, nb_iterations_test=25000): """Create a new masterkey""" crypter = Crypter() plain_master_key = rand.get_random_bytes(WALLET_CRYPTO_KEY_SIZE) rand.add_system_seeds() salt = rand.get_random_bytes(WALLET_CRYPTO_SALT_SIZE) deriv_method = MasterKey.DERIVMETHOD_EVP_SHA512 target_seconds = 0.1 #100ms # estimate number of derivations for 100ms per decrypt using 25000 iterations. start_time = get_time() derive_key_from_passphrase(passphrase, salt, nb_iterations_test, deriv_method) estimate1 = int((nb_iterations_test * 1.0 * target_seconds) / (get_time() - start_time)) # try it and take the mean of the estimate1 and estimate2 start_time = get_time() derive_key_from_passphrase(passphrase, salt, estimate1, deriv_method) estimate2 = int(estimate1 * target_seconds / (get_time() - start_time)) deriv_iterations = (estimate1 + estimate2) / 2 # use it key, init_vect = derive_key_from_passphrase(passphrase, salt, deriv_iterations, deriv_method) crypter.set_key(key, init_vect) crypted_key = crypter.encrypt(plain_master_key) return MasterKey(crypted_key, salt, deriv_method, deriv_iterations)
def create(self, passphrase): self.wallet_database.begin_updates() crypter = Crypter() #first create masterkey master_key = new_masterkey(passphrase) plain_masterkey = decrypt_masterkey(master_key, passphrase) self.wallet_database.add_master_key(master_key) #create transaction pool for i in range(100): k = KEY() k.generate(True) public_key = k.get_pubkey() crypter.set_key(plain_masterkey, doublesha256(public_key)) crypted_secret = crypter.encrypt(k.get_secret()) self.wallet_database.add_crypted_key(public_key, crypted_secret) pool_key = WalletPoolKey(i, 60000, time.time(), public_key) self.wallet_database.add_poolkey(pool_key) self.wallet_database.commit_updates() self.load()
def create(self, passphrase): self.wallet_database.begin_updates() crypter = Crypter() #first create masterkey master_key = new_masterkey(passphrase) plain_masterkey = decrypt_masterkey(master_key, passphrase) self.wallet_database.add_master_key(master_key) #create transaction pool for i in range(100): k = KEY() k.generate(True) public_key = k.get_pubkey() crypter.set_key(plain_masterkey, doublesha256(public_key)) crypted_secret = crypter.encrypt(k.get_secret()) self.wallet_database.add_crypted_key(public_key, crypted_secret) pool_key = WalletPoolKey(i, 60000, time.time(), public_key) self.wallet_database.add_poolkey(pool_key) self.wallet_database.commit_updates() self.load()
def new_masterkey(passphrase, rand=Random(), get_time=time.time, nb_iterations_test=25000): """Create a new masterkey""" crypter = Crypter() plain_master_key = rand.get_random_bytes(WALLET_CRYPTO_KEY_SIZE) rand.add_system_seeds() salt = rand.get_random_bytes(WALLET_CRYPTO_SALT_SIZE) deriv_method = MasterKey.DERIVMETHOD_EVP_SHA512 target_seconds = 0.1 #100ms # estimate number of derivations for 100ms per decrypt using 25000 iterations. start_time = get_time() derive_key_from_passphrase(passphrase, salt, nb_iterations_test, deriv_method) estimate1 = int((nb_iterations_test * 1.0 * target_seconds) / (get_time() - start_time)) # try it and take the mean of the estimate1 and estimate2 start_time = get_time() derive_key_from_passphrase(passphrase, salt, estimate1, deriv_method) estimate2 = int(estimate1 * target_seconds / (get_time() - start_time)) deriv_iterations = (estimate1 + estimate2) / 2 # use it key, init_vect = derive_key_from_passphrase(passphrase, salt, deriv_iterations, deriv_method) crypter.set_key(key, init_vect) crypted_key = crypter.encrypt(plain_master_key) return MasterKey(crypted_key, salt, deriv_method, deriv_iterations)