Exemplo n.º 1
0
 def sign(self, unsigned_tx, privtKey):
     before_hash = utils.sha3(binascii.unhexlify(unsigned_tx.encode()))
     v, r, s = ecsign(before_hash, normalize_key(privtKey))
     signature = binascii.hexlify(
         int_to_big_endian(r) + int_to_big_endian(s) +
         bytes(chr(v).encode())).decode()
     return signature
Exemplo n.º 2
0
def sign(safe, multi):
    """Sign transation of a Safe.
    This will sign a given transaction hash and return the signature.
    """
    transaction_hash = click.prompt('Please enter transaction hash')
    transaction_hash = codecs.decode(transaction_hash, 'hex_codec')

    choice = click.prompt('What would you like to use for signing?\n(1) Private key\n(2) Account mnemonic\n(3) Safe mnemonic (Yields 2 signatures)\n', type=int)
    
    loops = 1 if not multi else safe.get_threshold()

    account_info = []

    while loops > 0:
        if choice == 1:
            private_key = click.prompt('Please enter private key (Input hidden)', hide_input=True)
            
            address = Account.privateKeyToAccount(private_key).address
            account_info.append((private_key, address))
        elif choice == 2:
            mnemonic = click.prompt('Please enter account mnemonic (Input hidden)', hide_input=True)
            account_info.append(get_account_info_from_mnemonic(mnemonic))
        else:
            mnemonic = click.prompt('Please enter Safe mnemonic (Input hidden)', hide_input=True)
            account_info.append(get_account_info_from_mnemonic(mnemonic, index=0))
            account_info.append(get_account_info_from_mnemonic(mnemonic, index=1))

        for i, info in enumerate(account_info):
            loops -= 1
            private_key = info[0]
            address = info[1]
            v, r, s = ecsign(transaction_hash, codecs.decode(private_key, 'hex_codec'))
            signature = {'v': v, 'r': r, 's': s}
            click.echo('Signature {} ({}):\n\n{}'.format(i, address, json.dumps(signature)))
Exemplo n.º 3
0
    def _generate_signature(self, data):
        """Generate v, r, s values from payload

        """

        # pack parameters based on type
        sig_str = b''
        for d in data:
            val = d[1]
            if d[2] == 'address':
                # remove 0x prefix and convert to bytes
                val = val[2:].encode('utf-8')
            elif d[2] == 'uint256':
                # encode, pad and convert to bytes
                val = binascii.b2a_hex(encode_int32(int(d[1])))
            sig_str += val

        # hash the packed string
        rawhash = sha3(codecs.decode(sig_str, 'hex_codec'))

        # salt the hashed packed string
        salted = sha3(u"\x19Ethereum Signed Message:\n32".encode('utf-8') + rawhash)

        # sign string
        v, r, s = ecsign(salted, codecs.decode(self._private_key[2:], 'hex_codec'))

        # pad r and s with 0 to 64 places
        return {'v': v, 'r': "{0:#0{1}x}".format(r, 66), 's': "{0:#0{1}x}".format(s, 66)}
    def test_ethereum_signed_message(self):
        eth_address, eth_key = get_eth_address_with_key()
        eth_address_bad_checksum = eth_address.lower()

        prefix = settings.ETH_HASH_PREFIX
        message = faker.name()
        prefixed_message = prefix + message
        message_hash = utils.sha3(prefixed_message)
        v, r, s = utils.ecsign(message_hash, eth_key)
        ethereum_signed_message = EthereumSignedMessage(message, v, r, s)

        self.assertTrue(ethereum_signed_message.check_message_hash(message))

        self.assertTrue(
            ethereum_signed_message.check_signing_address(eth_address))
        self.assertTrue(
            ethereum_signed_message.check_signing_address(eth_address.lower()))
        self.assertTrue(
            ethereum_signed_message.check_signing_address(eth_address[2:]))
        self.assertTrue(
            ethereum_signed_message.check_signing_address(
                eth_address_bad_checksum))

        self.assertEqual(ethereum_signed_message.get_signing_address(),
                         eth_address)
        self.assertTrue(
            utils.check_checksum(
                ethereum_signed_message.get_signing_address()))
Exemplo n.º 5
0
def sign_data(data, key):
    data_hash = eth.sha3(data)
    key_bytes = eth.normalize_key(key)
    sig = eth.ecsign(data_hash, key_bytes)
    logging.debug('Signature created: {0}'.format(sig))

    return sig
Exemplo n.º 6
0
def sign_block(block, key, randao_parent, vchash, skips):
    block.header.extra_data = \
        randao_parent + \
        utils.zpad(utils.encode_int(skips), 32) + \
        vchash
    for val in utils.ecsign(block.header.signing_hash, key):
        block.header.extra_data += utils.zpad(utils.encode_int(val), 32)
    return block
Exemplo n.º 7
0
 def withdraw(self, gasprice=20 * 10**9):
     h = sha3(b'withdrawwithdrawwithdrawwithdraw')
     v, r, s = ecsign(h, self.key)
     sigdata = encode_int32(v) + encode_int32(r) + encode_int32(s)
     txdata = casper_ct.encode('startWithdrawal', [self.indices[0], self.indices[1], sigdata])
     tx = Transaction(self.chain.state.get_nonce(self.address), gasprice, 650000, self.chain.config['CASPER_ADDR'], 0, txdata).sign(self.key)
     self.chain.add_transaction(tx)
     self.network.broadcast(self, tx)
     print 'Withdrawing!'
Exemplo n.º 8
0
    def sign(self, payload):
        rawhash = keccak256(payload)

        v, r, s = ecsign(rawhash, self.key)
        signature = \
            zpad(bytearray_to_bytestr(int_to_32bytearray(r)), 32) + \
            zpad(bytearray_to_bytestr(int_to_32bytearray(s)), 32) + \
            bytearray_to_bytestr([v])

        return signature
Exemplo n.º 9
0
def main(accounts):
    from py_eth_sig_utils import signing

    data['message'] = {
        'channel_adr': '0x254dffcd3277C0b1660F6d42EFbB754edaBAbC2B',
        'channel_seq': 39,
        'balance': 2700,
    }
    # signature: 0xe32976b152f5d3107a789bee8512741493c262984145415c1ffb3a42c1a80e7224dd52cc552bf86665dd185d9e04004eb8d783f624eeb6aab0011c21757e6bb21b

    # generate a new raw random private key
    if True:
        # maker_key
        # pkey_raw = a2b_hex('6370fd033278c143179d81c5526140625662b8daa446c22ee2d73db3707e620c')

        # consumer_delegate_key
        #pkey_raw = a2b_hex('e485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52')
        pkey_raw = a2b_hex(
            'a4985a2ed93107886e9a1f12c7b8e2e351cc1d26c42f3aab7f220f3a7d08fda6')
    else:
        pkey_raw = os.urandom(32)
    print('Using private key: {}'.format(b2a_hex(pkey_raw).decode()))

    # make a private key object from the raw private key bytes
    pkey = eth_keys.keys.PrivateKey(pkey_raw)

    # make a private account from the private key
    acct = Account.privateKeyToAccount(pkey)

    # get the public key of the account
    addr = pkey.public_key.to_canonical_address()
    print('Account address: {}'.format(b2a_hex(addr).decode()))

    # get the canonical address of the account
    caddr = web3.Web3.toChecksumAddress(addr)
    print('Account canonical address: {}'.format(caddr))

    # step-wise computation of signature
    msg_hash = signing.encode_typed_data(data)
    print('Ok, MSG_HASH = 0x{}'.format(b2a_hex(msg_hash).decode()))
    sig_vrs = utils.ecsign(msg_hash, pkey_raw)
    sig = signing.v_r_s_to_signature(*sig_vrs)

    signature = signing.v_r_s_to_signature(
        *signing.sign_typed_data(data, pkey_raw))
    assert len(signature) == 32 + 32 + 1
    #assert signature == sig
    print('Ok, signed typed data (using key {}):\nSIGNATURE = 0x{}'.format(
        caddr,
        b2a_hex(signature).decode()))

    signer_address = signing.recover_typed_data(
        data, *signing.signature_to_v_r_s(signature))
    assert signer_address == caddr
    print('Ok, verified signature was signed by {}'.format(signer_address))
Exemplo n.º 10
0
 def sign_args(self,typeList, valueList, privtKey):
     '''
     :param typeList: ['bytes32', 'bytes32', 'uint256', 'uint256']
     :param valueList: ["0x3ae88fe370c39384fc16da2c9e768cf5d2495b48", "0x9da26fc2e1d6ad9fdd46138906b0104ae68a65d8", 1, 1]
     :param privtKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
     :return:
     '''
     data_hash = self.solidity_hash(typeList, valueList)
     v, r, s = ecsign(data_hash, normalize_key(privtKey))
     signature = self.int_to_big_endian(r) + self.int_to_big_endian(s) + bytes(chr(v - 27).encode())
     return signature.hex()
Exemplo n.º 11
0
 def withdraw(self, gasprice=20 * 10**9):
     h = sha3(b'withdrawwithdrawwithdrawwithdraw')
     v, r, s = ecsign(h, self.key)
     sigdata = encode_int32(v) + encode_int32(r) + encode_int32(s)
     txdata = casper_ct.encode('startWithdrawal',
                               [self.indices[0], self.indices[1], sigdata])
     tx = Transaction(self.chain.state.get_nonce(self.address), gasprice,
                      650000, self.chain.config['CASPER_ADDR'], 0,
                      txdata).sign(self.key)
     self.chain.add_transaction(tx)
     self.network.broadcast(self, tx)
     print 'Withdrawing!'
 def __init__(self,
              message: str,
              key: bytes,
              hash_prefix: str = settings.ETH_HASH_PREFIX):
     """
     :param message: message
     :param key: ethereum key for signing the message
     :param hash_prefix: prefix for hashing
     """
     self.hash_prefix = hash_prefix if hash_prefix else ''
     v, r, s = utils.ecsign(self.calculate_hash(message), key)
     super().__init__(message, v, r, s, hash_prefix=hash_prefix)
Exemplo n.º 13
0
def sign_payload(private_key, payload):

    if isinstance(private_key, str):
        private_key = data_decoder(private_key)

    rawhash = sha3(payload)

    v, r, s = ecsign(rawhash, private_key)
    signature = zpad(bytearray_to_bytestr(int_to_32bytearray(r)), 32) + \
                zpad(bytearray_to_bytestr(int_to_32bytearray(s)), 32) + \
                bytearray_to_bytestr([v])

    return data_encoder(signature)
Exemplo n.º 14
0
def personal_sign(private_key, message):

    if isinstance(private_key, str):
        private_key = data_decoder(private_key)

    rawhash = sha3("\x19Ethereum Signed Message:\n{}{}".format(len(message), message))

    v, r, s = ecsign(rawhash, private_key)
    signature = zpad(bytearray_to_bytestr(int_to_32bytearray(r)), 32) + \
                zpad(bytearray_to_bytestr(int_to_32bytearray(s)), 32) + \
                bytearray_to_bytestr([v])

    return data_encoder(signature)
Exemplo n.º 15
0
    def sign_args(self, typeList, valueList, privtKey):
        '''

        :param typeList: ['bytes32', 'bytes32', 'uint256', 'uint256']
        :param valueList: ["0x3ae88fe370c39384fc16da2c9e768cf5d2495b48", "0x9da26fc2e1d6ad9fdd46138906b0104ae68a65d8", 1, 1]
        :param privtKey: "095e53c9c20e23fd01eaad953c01da9e9d3ed9bebcfed8e5b2c2fce94037d963"
        :return:
        '''
        data_hash = Web3.soliditySha3(typeList, valueList)
        v, r, s = ecsign(data_hash, normalize_key(privtKey))
        signature = binascii.hexlify(int_to_big_endian(r) + int_to_big_endian(s)
                                     + bytes(chr(v - 27).encode()))
        return signature
Exemplo n.º 16
0
def sign_apphash(apphash):
    sedes = CountableList(List([rlp.sedes.binary,
                                rlp.sedes.big_endian_int,
                                rlp.sedes.big_endian_int,
                                rlp.sedes.binary,
                                rlp.sedes.binary]))

    decoded = rlp.decode(bytes.fromhex(apphash), sedes)

    for i in decoded:
        data = list(i)
        data[2] = bool(data[2])
        msg_hash = w3.soliditySha3(['bytes32', 'uint256', 'bool', 'bytes', 'bytes'], data).hex()[2:]
        signed = utils.ecsign(bytes.fromhex(msg_hash), operator_normalize_key)
        tx = '1{0:0{1}X}{2:0{3}X}{4:0{5}X}{6:X}'.format(signed[1], 64,
                signed[2], 64, signed[0], 2, data[1])
        requests.get('http://localhost:26657/broadcast_tx_async?tx="{}"'.format(tx))
Exemplo n.º 17
0
def test_ecrecover():
    c = tester.Chain()
    x = c.contract(ecrecover_code, language='serpent')

    priv = utils.sha3('some big long brainwallet password')
    pub = bitcoin.privtopub(priv)

    msghash = utils.sha3('the quick brown fox jumps over the lazy dog')

    V, R, S = utils.ecsign(msghash, priv)

    assert bitcoin.ecdsa_raw_verify(msghash, (V, R, S), pub)

    addr = utils.big_endian_to_int(utils.sha3(bitcoin.encode_pubkey(pub, 'bin')[1:])[12:])
    assert utils.big_endian_to_int(utils.privtoaddr(priv)) == addr

    result = x.test_ecrecover(utils.big_endian_to_int(msghash), V, R, S)
    assert result == addr
Exemplo n.º 18
0
    def sign(self, key, network_id=None):
        """Sign this transaction with a private key.

        A potentially already existing signature would be overridden.
        """
        if network_id is None:
            rawhash = utils.sha3(rlp.encode(self, UnsignedTransaction))
        else:
            assert 1 <= network_id < 2**63 - 18
            rlpdata = rlp.encode(rlp.infer_sedes(self).serialize(self)[
                                 :-3] + [network_id, b'', b''])
            rawhash = utils.sha3(rlpdata)

        key = normalize_key(key)

        self.v, self.r, self.s = ecsign(rawhash, key)
        if network_id is not None:
            self.v += 8 + network_id * 2

        self._sender = utils.privtoaddr(key)
        return self
Exemplo n.º 19
0
    def sign(self, key, network_id=None):
        """Sign this transaction with a private key.

        A potentially already existing signature would be overridden.
        """
        if network_id is None:
            rawhash = utils.sha3(rlp.encode(self, UnsignedTransaction))
        else:
            assert 1 <= network_id < 2**63 - 18
            rlpdata = rlp.encode(rlp.infer_sedes(self).serialize(self)[
                                 :-3] + [network_id, b'', b''])
            rawhash = utils.sha3(rlpdata)

        key = normalize_key(key)

        self.v, self.r, self.s = ecsign(rawhash, key)
        if network_id is not None:
            self.v += 8 + network_id * 2

        self._sender = utils.privtoaddr(key)
        return self
Exemplo n.º 20
0
ecrecover_test = """
def test_ecrecover(h: bytes32, v:num256, r:num256, s:num256) -> address:
    return ecrecover(h, v, r, s)

def test_ecrecover2() -> address:
    return ecrecover(0x3535353535353535353535353535353535353535353535353535353535353535,
                     as_num256(28),
                     as_num256(63198938615202175987747926399054383453528475999185923188997970550032613358815),
                     as_num256(6577251522710269046055727877571505144084475024240851440410274049870970796685))
"""

c = s.abi_contract(ecrecover_test, language='viper')
h = b'\x35' * 32
k = b'\x46' * 32
v, r, S = u.ecsign(h, k)
assert c.test_ecrecover(h, v, r, S) == '0x' + u.encode_hex(u.privtoaddr(k))
assert c.test_ecrecover2() == '0x' + u.encode_hex(u.privtoaddr(k))

print("Passed ecrecover test")

extract32_code = """
y: bytes <= 100
def extrakt32(inp: bytes <= 100, index: num) -> bytes32:
    return extract32(inp, index)

def extrakt32_mem(inp: bytes <= 100, index: num) -> bytes32:
    x = inp
    return extract32(x, index)

def extrakt32_storage(index: num, inp: bytes <= 100) -> bytes32:
Exemplo n.º 21
0
def createOrder(orderHash, key=tester.k0):
    key = normalize_key(key)
    v, r, s = ecsign(sha3("\x19Ethereum Signed Message:\n32" + orderHash), key)
    return v, zpad(bytearray_to_bytestr(int_to_32bytearray(r)),
                   32), zpad(bytearray_to_bytestr(int_to_32bytearray(s)), 32)
Exemplo n.º 22
0
def sign(seq, to, value, data, key):
    h1 = utils.sha3(utils.encode_int32(seq) + b'\x00' * 12 + to + utils.encode_int32(value) + data)
    h2 = utils.sha3(b"\x19Ethereum Signed Message:\n32" + h1)
    return list(utils.ecsign(h2, key))
Exemplo n.º 23
0
def createOrder(orderHash, key=tester.k0):
    key = normalize_key(key)
    v, r, s = ecsign(sha3("\x19Ethereum Signed Message:\n32" + orderHash), key)
    return v, zpad(bytearray_to_bytestr(int_to_32bytearray(r)), 32), zpad(bytearray_to_bytestr(int_to_32bytearray(s)), 32)
from ethereum import utils

token1 = 'fjDy8vAdvHE:APA91bHGE51C3j0OJz6fBuRUwa_aV1pLzVCh3vePVA4h2-9nhTbz4-gy6KIcduMs3PGncPAryNQ0VxyF7z3KdKviD10_yNGzgzVkXhdNQ7OWlxYgEaIorXXYkPPe45aUR4C0ic2aYSIw'
priv1 = bytes.fromhex(
    '17fa8dab3ff55ca2156a47a0f128e67789a3a2da6adebf581e1c4c2f99fbc071')
address1 = '0x919aff0cc2975DEB38379a65FB2Debc6c6CdF028'

token2 = 'fWU_G7outKU:APA91bF4BiMJt1eiknSKzThEx6Fs7u1ZkXDbDPGcYPcaS6Nm2pfegfaDKcaHxGmKMOK8vXEWp8bZD1Z8KmMgbpGQXaVsSNoG0BascdUZhDqcngvQGqHmByurg7ShVb6XYFc5YVxAhETT'
priv2 = bytes.fromhex(
    '0a3c393c83a0c45d6509419980c2828bbb129ed2ff966abebda9d7157ffa8e9c')
address2 = '0x2865BE1F71ddA04FC9A596fA70a7Db4F82890343'

prefix = 'GNO'

v1, r1, s1, = utils.ecsign(utils.sha3(prefix + token1), priv1)
print("=== 1 ===")
print("R: %s" % r1)
print("S: %s" % s1)
print("V: %s" % v1)

v2, r2, s2, = utils.ecsign(utils.sha3(prefix + token2), priv2)
print("=== 2 ===")
print("R: %s" % r2)
print("S: %s" % s2)
print("V: %s" % v2)

print("=== Message ===")
v_mess2, r_mess2, s_mess2, = utils.ecsign(
    utils.sha3(prefix + "{\"title\":\"Hello Patron\"}"), priv2)
print("R: %s" % r_mess2)
print("S: %s" % s_mess2)
Exemplo n.º 25
0
def sign(hash, privkey):
    assert len(privkey) == 32
    v, r, s = ecsign(hash, privkey)
    return encode_int32(v) + encode_int32(r) + encode_int32(s)
Exemplo n.º 26
0
def make_withdrawal_signature(key):
    h = sha3(b'withdrawwithdrawwithdrawwithdraw')
    v, r, s = ecsign(h, key)
    return encode_int32(v) + encode_int32(r) + encode_int32(s)
Exemplo n.º 27
0
from ethereum.tools import tester as t
from ethereum import utils as u
c = t.Chain()
x = c.contract(open('utxos.v.py').read(), language='viper', sender=t.k0)
assert u.normalize_address(x.get_utxos__owner(u.encode_int32(1))) == t.a0
assert x.get_utxos__value(u.encode_int32(1)) == 2**32

sigdata = u.encode_int32(1) + u.encode_int32(0) + b'\x00' * 12 + t.a2 + \
    u.encode_int32(2**30) + b'\x00' * 12 + t.a2 + u.encode_int32(3 * 2**30)
sighash = u.sha3(sigdata)

v, r, s = u.ecsign(sighash, t.k0)

assert x.tx(u.encode_int32(1), u.encode_int32(0), t.a2, 2**30, t.a2, 3 * 2**30,
            v, r, s) == sighash
assert u.normalize_address(x.get_utxos__owner(sighash)) == t.a2
assert x.get_utxos__value(sighash) == 2**30

sigdata2 = sighash + u.encode_int32(0) + b'\x00' * 12 + t.a3 + \
    u.encode_int32(2**29) + b'\x00' * 12 + t.a3 + u.encode_int32(2**29)
sighash2 = u.sha3(sigdata2)

v, r, s = u.ecsign(sighash2, t.k2)

assert x.tx(sighash, u.encode_int32(0), t.a3, 2**29, t.a3, 2**29, v, r,
            s) == sighash2

print('Tests passed')
Exemplo n.º 28
0
def sign(hash, key):
    vrs = u.ecsign(hash, key)
    rsv = vrs[1:] + vrs[:1]
    vrs_bytes = [u.encode_int32(i) for i in rsv[:2]] + [u.int_to_bytes(rsv[2])]
    return b''.join(vrs_bytes)
Exemplo n.º 29
0
def sign(msg_hash, privkey):
    v, r, s = utils.ecsign(msg_hash, privkey)
    signature = utils.encode_int32(v) + utils.encode_int32(
        r) + utils.encode_int32(s)
    return signature
Exemplo n.º 30
0
    def sign(self, tx_hash: str):
        msg_bytes = bytes.fromhex(tx_hash)

        v, r, s = ecsign(msg_bytes, self.private_key)

        return r, s, v
def sign(_hash, key):
    v, r, s = utils.ecsign(_hash, key)
    return utils.encode_int32(r) + utils.encode_int32(s) + utils.encode_int(v)