Exemplo n.º 1
0
 def __init__(self, wallet_database, runmode):
     super(Wallet, self).__init__()
     self.wallet_database = wallet_database
     self.runmode = runmode
     self.addresses = {}
     self.crypter = Crypter()
     self.plain_masterkeys = []
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
def decrypt_masterkey(master_key, passphrase):
    """Return plain master key bytestring from a MasterKey object and a passphrase"""
    key, init_vect = derive_key_from_passphrase(passphrase, master_key.salt,
                                                master_key.derive_iterations,
                                                master_key.derivation_method)
    crypter = Crypter()
    crypter.set_key(key, init_vect)
    plain_masterkey = crypter.decrypt(master_key.crypted_key)
    return plain_masterkey
Exemplo n.º 4
0
    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()
Exemplo n.º 5
0
        "be4afa6923ad06790b0f8c3345131499cf2b149ca422bd11a7e67a76347c51a456a2d626f75da1ff809632fca7165d71"
    ),
                           salt=decodehexstr("8cdcbd8a494b0eeb"),
                           derivation_method=MasterKey.DERIVMETHOD_EVP_SHA512,
                           derive_iterations=45193,
                           other_derivation_parameters="")
    #Decrypt the master crypted_key using the passphrase
    plain_masterkey = decrypt_masterkey(master_key, "hello")
    #Decrypt a crypted_secret
    public_key = decodehexstr(
        "046a82d73af2cc093e3df7ae0185f045946970bcd5f0ef26f82d4f9a24e0d50f977c51e311e079e3183cfadd67d9b3f089fe7ba94a196c365fbd9e03b8c423787d"
    )
    crypted_secret = decodehexstr(
        "ff914ab69f58af92ac56de85051441e729cc51e11608d563e2a266ce3b8c59f573ed6a1828ff98fadb345890b6ed2626"
    )
    crypter2 = Crypter()
    crypter2.set_key(plain_masterkey, doublesha256(public_key))
    secret = crypter2.decrypt(crypted_secret)
    print hexstr(secret)
    #Test the secret
    k = KEY()
    k.set_secret(secret)
    sig = signature1 = k.sign("sign something")
    k2 = KEY()
    k2.set_pubkey(public_key)
    print k2.verify("sign something", sig)

    #Create a new masterkey
    m = new_masterkey("hello hello")
    print m
    print hexstr(decrypt_masterkey(m, "hello hello"))