コード例 #1
0
def test_update_mediated_transfer(settle_timeout, tester_state,
                                  tester_channels, tester_events):
    privatekey0_raw, privatekey1_raw, nettingchannel, channel0, channel1 = tester_channels[
        0]
    privatekey0 = PrivateKey(privatekey0_raw, ctx=GLOBAL_CTX, raw=True)
    privatekey1 = PrivateKey(privatekey1_raw, ctx=GLOBAL_CTX, raw=True)
    address0 = privatekey_to_address(privatekey0_raw)
    address1 = privatekey_to_address(privatekey1_raw)

    transfer_amount = 3
    direct_transfer0 = channel0.create_directtransfer(
        transfer_amount,
        1  # TODO: fill in identifier
    )
    direct_transfer0.sign(privatekey0, address0)
    direct_transfer0_data = str(direct_transfer0.packed().data)

    channel0.register_transfer(direct_transfer0)
    channel1.register_transfer(direct_transfer0)

    target = tester.a0
    initiator = tester.a1
    lock_amount = 5
    lock_expiration = tester_state.block.number + DEFAULT_REVEAL_TIMEOUT + 3
    lock_hashlock = sha3('secret')
    mediated_transfer0 = channel0.create_mediatedtransfer(
        transfer_initiator=initiator,
        transfer_target=target,
        fee=0,
        amount=lock_amount,
        identifier=1,  # TODO: fill in identifier
        expiration=lock_expiration,
        hashlock=lock_hashlock,
    )
    mediated_transfer0.sign(privatekey0, address0)
    mediated_transfer0_data = str(mediated_transfer0.packed().data)

    channel0.register_transfer(mediated_transfer0)
    channel1.register_transfer(mediated_transfer0)

    transfer_amount = 13
    direct_transfer1 = channel1.create_directtransfer(transfer_amount)
    direct_transfer1.sign(privatekey1, address1)
    direct_transfer1_data = str(direct_transfer1.packed().data)

    channel0.register_transfer(direct_transfer1)
    channel1.register_transfer(direct_transfer1)

    nettingchannel.close(
        direct_transfer0_data,
        direct_transfer1_data,
        sender=privatekey0_raw,
    )

    nettingchannel.updateTransfer(
        mediated_transfer0_data,
        sender=privatekey1_raw,
    )

    tester_state.mine(number_of_blocks=settle_timeout + 1)
コード例 #2
0
    def test_verify_recoverable_sign(self):
        """Verifies recovering a signature."""

        test_requests = [TEST_REQUEST_TRANSFER_ICX, TEST_REQUEST_SCORE_FUNCTION_CALL,
                         TEST_REQUEST_SEND_MESSAGE, TEST_REQUEST_SCORE_UPDATE, TEST_REQUEST_SCORE_ISNTALL]

        for request in test_requests:
            # Serialize a signature
            private_key_object = PrivateKey()
            msg_hash_bytes = sha3_256(serialize(request["params"])).digest()
            sign_bytes = sign(msg_hash_bytes, private_key_object.private_key)

            # Deserialize a signature
            recoverable_sign = private_key_object.ecdsa_recoverable_deserialize(sign_bytes[0:64], sign_bytes[64])
            sign_ = private_key_object.ecdsa_recoverable_convert(recoverable_sign)
            # Verify a signature with a public key
            self.assertTrue(private_key_object.pubkey.ecdsa_verify(msg_hash_bytes, sign_, raw=True))

            # Verify a signature when an message is invalid
            invalid_msg_hash = sha3_256(f'invalid message'.encode()).digest()
            self.assertFalse(private_key_object.pubkey.ecdsa_verify(invalid_msg_hash, sign_, raw=True))

            # Verify a signature when a private key is invalid
            invalid_private_key = PrivateKey()
            self.assertFalse(invalid_private_key.pubkey.ecdsa_verify(msg_hash_bytes, sign_, raw=True))
コード例 #3
0
def _sha3_secp256k1_deploy_data(current_height,
                                bytecode,
                                value,
                                quota,
                                privatekey,
                                version,
                                receiver=None):
    sender = get_sender(privatekey, False)
    if privatekey is None:
        temp = private_key()
        privkey = PrivateKey(hex2bytes(temp))
    else:
        privkey = PrivateKey(hex2bytes(privatekey))

    logger.debug(sender)
    nonce = get_nonce()
    logger.debug("nonce is {}".format(nonce))

    tx = Transaction()
    tx.valid_until_block = current_height + 88
    tx.nonce = nonce
    tx.version = version
    if version == 0:
        chainid = get_chainid()
        logger.info("version-{}, chainid-{}".format(version, chainid))
        tx.chain_id = chainid
    elif version < 3:
        chainid = get_chainid_v1()
        logger.info("version-{}, chainid_v1-{}".format(version, chainid))
        tx.chain_id_v1 = chainid.to_bytes(32, byteorder='big')
    else:
        logger.error("unexpected version {}".format(version))
    if receiver is not None:
        if version == 0:
            tx.to = receiver
        elif version < 3:
            tx.to_v1 = hex2bytes(receiver)
        else:
            logger.error("unexpected version {}".format(version))
    tx.data = hex2bytes(bytecode)
    tx.value = value.to_bytes(32, byteorder='big')
    tx.quota = quota

    message = sha3(tx.SerializeToString())

    logger.debug("hash message: {}")
    sign_recover = privkey.ecdsa_sign_recoverable(message, raw=True)
    sig = privkey.ecdsa_recoverable_serialize(sign_recover)

    signature = binascii.hexlify(sig[0]) + binascii.hexlify(
        bytes(bytearray([sig[1]])))

    unverify_tx = UnverifiedTransaction()
    unverify_tx.transaction.CopyFrom(tx)
    unverify_tx.signature = hex2bytes(signature)
    unverify_tx.crypto = Crypto.Value('DEFAULT')

    logger.info("unverify_tx is {}".format(
        binascii.hexlify(unverify_tx.SerializeToString())))
    return binascii.hexlify(unverify_tx.SerializeToString())
コード例 #4
0
def test_settlement_with_unauthorized_token_transfer(deposit, settle_timeout,
                                                     tester_state,
                                                     tester_channels,
                                                     tester_events,
                                                     tester_token):

    privatekey0_raw, privatekey1_raw, nettingchannel, channel0, channel1 = tester_channels[
        0]
    privatekey0 = PrivateKey(privatekey0_raw, ctx=GLOBAL_CTX, raw=True)
    privatekey1 = PrivateKey(privatekey1_raw, ctx=GLOBAL_CTX, raw=True)
    address0 = privatekey_to_address(privatekey0_raw)
    address1 = privatekey_to_address(privatekey1_raw)

    # transfer some extra tokens to the contract to try to mess up the balance
    extra_amount = 10
    assert tester_token.transfer(nettingchannel.address,
                                 extra_amount,
                                 sender=privatekey0_raw)

    initial_balance0 = tester_token.balanceOf(address0, sender=privatekey0_raw)
    initial_balance1 = tester_token.balanceOf(address1, sender=privatekey1_raw)

    transfer_amount0 = 10
    direct_transfer0 = channel0.create_directtransfer(
        transfer_amount0,
        1  # TODO: fill in identifier
    )
    direct_transfer0.sign(privatekey0, address0)

    transfer_amount1 = 30
    direct_transfer1 = channel1.create_directtransfer(
        transfer_amount1,
        1  # TODO: fill in identifier
    )
    direct_transfer1.sign(privatekey1, address1)

    nettingchannel.close(
        str(direct_transfer0.packed().data),
        str(direct_transfer1.packed().data),
        sender=privatekey1_raw,
    )

    block_number = tester_state.block.number

    assert nettingchannel.closed(sender=privatekey0_raw) == block_number
    assert nettingchannel.closingAddress(
        sender=privatekey0_raw) == encode_hex(address1)

    tester_state.mine(number_of_blocks=settle_timeout + 1)
    nettingchannel.settle(sender=privatekey0_raw)

    assert tester_token.balanceOf(
        address0, sender=privatekey0_raw
    ) == initial_balance0 + deposit - transfer_amount0 + transfer_amount1  # noqa
    assert tester_token.balanceOf(
        address1, sender=privatekey1_raw
    ) == initial_balance1 + deposit + transfer_amount0 - transfer_amount1  # noqa
    # Make sure that the extra amount is burned/locked in the netting channel
    assert tester_token.balanceOf(nettingchannel.address,
                                  sender=privatekey1_raw) == extra_amount
コード例 #5
0
    def test_wallet_load_by_private_key(self):
        """A wallet loads by a private key correctly."""

        # Creates a wallet.
        private_key_object = PrivateKey()
        private_key = private_key_object.private_key
        wallet1 = KeyWallet.load(private_key)

        # Checks a private key as same.
        self.assertEqual(private_key.hex(), wallet1.get_private_key())

        # Checks a wallet's address is correct.
        self.assertTrue(is_wallet_address(wallet1.get_address()))

        # Creates the other wallet.
        private_key_object2 = PrivateKey()
        private_key2 = private_key_object2.private_key
        wallet2 = KeyWallet.load(private_key2)

        # Checks a private key as same.
        self.assertEqual(private_key2.hex(), wallet2.get_private_key())

        # Checks a wallet's address is correct.
        self.assertTrue(is_wallet_address(wallet2.get_address()))

        self.assertNotEqual(private_key2, private_key)
コード例 #6
0
def test_closewithouttransfer_badalice(deposit, settle_timeout, tester_state,
                                       tester_events, tester_channels,
                                       tester_token):
    privatekeyA_raw, privatekeyB_raw, nettingchannel, channelAB, channelBA = tester_channels[
        0]
    privatekeyA = PrivateKey(privatekeyA_raw, ctx=GLOBAL_CTX, raw=True)
    privatekeyB = PrivateKey(privatekeyB_raw, ctx=GLOBAL_CTX, raw=True)
    addressA = privatekey_to_address(privatekeyA_raw)
    addressB = privatekey_to_address(privatekeyB_raw)

    initial_balanceA = tester_token.balanceOf(addressA, sender=privatekeyA_raw)
    initial_balanceB = tester_token.balanceOf(addressB, sender=privatekeyB_raw)

    transfer_amount = 50
    AB_Transfer0 = channelAB.create_directtransfer(
        transfer_amount,
        1  # TODO: fill in identifier
    )
    AB_Transfer0.sign(privatekeyA, addressA)
    channelAB.register_transfer(AB_Transfer0)
    channelBA.register_transfer(AB_Transfer0)

    transfer_amount = 40
    BA_Transfer0 = channelBA.create_directtransfer(
        transfer_amount,
        1  # TODO: fill in identifier
    )
    BA_Transfer0.sign(privatekeyB, addressB)
    channelAB.register_transfer(BA_Transfer0)
    channelBA.register_transfer(BA_Transfer0)

    transfer_amount = 90
    AB_Transfer1 = channelAB.create_directtransfer(
        transfer_amount,
        1  # TODO: fill in identifier
    )
    AB_Transfer1.sign(privatekeyA, addressA)
    channelAB.register_transfer(AB_Transfer1)
    channelBA.register_transfer(AB_Transfer1)
    AB_Transfer1_data = str(AB_Transfer1.packed().data)

    nettingchannel.close("", "", sender=privatekeyA_raw)

    nettingchannel.updateTransfer(
        AB_Transfer1_data,
        sender=privatekeyB_raw,
    )

    tester_state.mine(number_of_blocks=settle_timeout + 1)
    nettingchannel.settle(sender=privatekeyB_raw)
    tester_state.mine(number_of_blocks=2)

    assert tester_token.balanceOf(nettingchannel.address,
                                  sender=privatekeyA_raw) == 0
    assert tester_token.balanceOf(
        addressB, sender=privatekeyA_raw) == initial_balanceB + 100
    assert tester_token.balanceOf(
        addressA, sender=privatekeyA_raw) == initial_balanceA + deposit - 100
コード例 #7
0
    def setUp(self):
        # create private key and sender_address receive_address
        self.private_key = PrivateKey()
        self.send_address = self.__create_address(self.private_key.pubkey)
        logging.debug(f"create sender address : {self.send_address}")
        self.receive_address = self.__create_address(PrivateKey().pubkey)
        logging.debug(f"create sender address : {self.receive_address}")

        self.hash_generator = get_tx_hash_generator(conf.LOOPCHAIN_DEFAULT_CHANNEL)
        self.tx_validator = TxValidator(conf.LOOPCHAIN_DEFAULT_CHANNEL, conf.SendTxType.icx, self.hash_generator)
コード例 #8
0
def sign(priv_key, message):
    sk = PrivateKey(priv_key, True)
    pk = binascii.hexlify(sk.pubkey.serialize(True)).decode("utf-8")
    sig_raw = sk.ecdsa_sign(bytes(bytearray.fromhex(message)),
                            digest=bitcoin_hash)
    sig = sk.ecdsa_serialize(sig_raw)
    return pk, binascii.hexlify(sig).decode("utf-8")
コード例 #9
0
ファイル: addresses.py プロジェクト: coinext/cosmospy
def generate_wallet() -> Dict[str, str]:
    privkey = PrivateKey().serialize()
    return {
        "private_key": privkey,
        "public_key": privkey_to_pubkey(privkey),
        "address": privkey_to_address(privkey),
    }
コード例 #10
0
    def from_private_key(private_key: Optional[PrivateKey] = None) -> 'IconJsonrpc':
        """Create IconJsonrpc object from PrivateKey object. If parameter is None, make PrivateKey object.

        :param private_key: PrivateKey object
        :return: IconJsonrpc object
        """
        return IconJsonrpc(IcxSigner(private_key=private_key or PrivateKey().private_key))
コード例 #11
0
    def sign(self, key):
        """Sign this transaction with a private key.

        A potentially already existing signature would be overridden.
        """
        if not is_bitcoin_available() or not is_secp256k1_available():
            raise ImportError(
                "In order to sign transactions the "
                "`bitcoin` and `secp256k1` packages must be installed.")
        from bitcoin import privtopub
        from secp256k1 import PrivateKey

        if key in (0, b'', b'\x00' * 32, b'0' * 64):
            raise ValueError("Zero privkey cannot sign")

        rawhash = decode_hex(sha3(rlp.encode(self, UnsignedTransaction)))

        if len(key) in {64, 66}:
            # we need a binary key
            key = decode_hex(key)

        pk = PrivateKey(key, raw=True)
        sig_bytes, rec_id = pk.ecdsa_recoverable_serialize(
            pk.ecdsa_sign_recoverable(rawhash, raw=True))
        signature = sig_bytes + force_bytes(chr(rec_id))
        self.v = (ord(signature[64])
                  if is_string(signature[64]) else signature[64]) + 27
        self.r = decode_big_endian_int(signature[0:32])
        self.s = decode_big_endian_int(signature[32:64])

        self.sender = to_address(sha3(privtopub(key)[1:])[-40:])
        return self
コード例 #12
0
def test_receive_hashlocktransfer_unknown(raiden_network):
    app0 = raiden_network[0]  # pylint: disable=unbalanced-tuple-unpacking

    token_manager0 = app0.raiden.managers_by_token_address.values()[0]

    other_key = PrivateKey(HASH2, ctx=GLOBAL_CTX, raw=True)
    other_address = privatekey_to_address(other_key.private_key)
    amount = 10
    lock = Lock(amount, 1, HASH)
    refund_transfer = RefundTransfer(identifier=1,
                                     nonce=1,
                                     token=token_manager0.token_address,
                                     transferred_amount=amount,
                                     recipient=app0.raiden.address,
                                     locksroot=HASH,
                                     lock=lock)
    sign_and_send(refund_transfer, other_key, other_address, app0)

    transfer_timeout = TransferTimeout(HASH, HASH)
    sign_and_send(transfer_timeout, other_key, other_address, app0)

    secret = Secret(1, HASH, token_manager0.token_address)
    sign_and_send(secret, other_key, other_address, app0)

    secret_request = SecretRequest(1, HASH, 1)
    sign_and_send(secret_request, other_key, other_address, app0)

    reveal_secret = RevealSecret(HASH)
    sign_and_send(reveal_secret, other_key, other_address, app0)

    # Whenever processing of ConfirmTransfer is implemented test it here
    # too by removing the expectation of an exception
    with pytest.raises(KeyError):
        confirm_transfer = ConfirmTransfer(HASH)
        sign_and_send(confirm_transfer, other_key, other_address, app0)
コード例 #13
0
 def __init__(self, private_key, env: Optional[BinanceEnvironment] = None):
     super().__init__(env)
     self._private_key = private_key
     self._pk = PrivateKey(bytes(bytearray.fromhex(self._private_key)))
     self._public_key = self._pk.pubkey.serialize(compressed=True)
     self._address = address_from_public_key(self._public_key,
                                             self._env.hrp)
コード例 #14
0
def main():
    args = render_args()

    from random import Random
    rng = Random(0xabad533d)
    def randbytes(l):
        ret = []
        while len(ret) < l:
            ret.append(rng.randrange(0, 256))
        return bytes(ret)
    rand = Rand(randbytes)

    test_vectors = []
    for i in range(10):
        chaincode = rand.b(32)
        pk = PrivateKey(rand.b(32), True).pubkey.serialize(compressed=True)
        (external_ovk, internal_ovk) = derive_ovks(chaincode, pk)
        test_vectors.append({
            'c' : chaincode,
            'pk': pk,
            'external_ovk': external_ovk,
            'internal_ovk': internal_ovk,
        })

    render_tv(
        args,
        'zip_0316',
        (
            ('c',            '[u8; 32]'),
            ('pk',           '[u8; 33]'),
            ('external_ovk', '[u8; 32]'),
            ('internal_ovk', '[u8; 32]'),
        ),
        test_vectors,
    )
コード例 #15
0
def test_receive_hashlocktransfer_unknown(raiden_network):
    app0 = raiden_network[0]  # pylint: disable=unbalanced-tuple-unpacking

    graph0 = app0.raiden.channelgraphs.values()[0]

    other_key = PrivateKey(HASH2, ctx=GLOBAL_CTX, raw=True)
    other_address = privatekey_to_address(other_key.private_key)
    amount = 10
    lock = Lock(amount, 1, HASH)
    refund_transfer = RefundTransfer(identifier=1,
                                     nonce=1,
                                     token=graph0.token_address,
                                     transferred_amount=amount,
                                     recipient=app0.raiden.address,
                                     locksroot=HASH,
                                     lock=lock)
    sign_and_send(refund_transfer, other_key, other_address, app0)

    secret = Secret(1, HASH, graph0.token_address)
    sign_and_send(secret, other_key, other_address, app0)

    secret_request = SecretRequest(1, HASH, 1)
    sign_and_send(secret_request, other_key, other_address, app0)

    reveal_secret = RevealSecret(HASH)
    sign_and_send(reveal_secret, other_key, other_address, app0)
コード例 #16
0
def private_to_public_uncompressed(private_key):
    if(type(private_key) == str):
        private_key = bytes.fromhex(private_key)
    private_key_object = PrivateKey(private_key)
    uncompressed = hexlify(private_key_object.pubkey.serialize(
        compressed=False)).decode('ascii')
    return uncompressed
コード例 #17
0
def create_message(sender, receiver, content):
    """create message""" ""
    try:
        store = JsonStore(default_path)
        sender_address = store.get(sender)['address']
        sender_ecc_prikey = store.get(sender)['ecc_prikey']
        sender_ecc_pubkey = store.get(sender)['ecc_pubkey']
        receiver_address = store.get(receiver)['address']
        receiver_rsa_pubkey = store.get(receiver)['rsa_pubkey']
        # use receiver's rsa pubkey encrypt content
        h = SHA.new(content.encode('utf-8'))
        key = RSA.importKey(receiver_rsa_pubkey)
        cipher = PKCS1_v1_5.new(key)
        encrypt = cipher.encrypt(content.encode('utf-8') + h.digest())
        encrypted_content = binascii.hexlify(encrypt).decode('utf-8')
        # sign message use sender's ecc prikey
        ecc_prikey = PrivateKey(bytes(bytearray.fromhex(sender_ecc_prikey)))
        sign = ecc_prikey.ecdsa_sign(encrypt)
        msg_sing = binascii.hexlify(
            ecc_prikey.ecdsa_serialize(sign)).decode('utf-8')
        return MessageLayout(sender=sender_address,
                             receiver=receiver_address,
                             content=encrypted_content,
                             sign=msg_sing,
                             pubkey=sender_ecc_pubkey,
                             t=str(time.asctime(time.localtime(time.time()))))
    except Exception as e:
        print(str(e))
コード例 #18
0
ファイル: message.py プロジェクト: danielsocials/pynode
    def __init__(self, node_id, port):
        super().__init__()
        self.type = HANDSHAKE_MESSAGE
        self.sigtype = 0

        self.network_version = int('0x04b6', 16)
        self.chain_id = bytes.fromhex(config.CHAIN_ID)
        self.node_id = node_id  #hashlib.sha256().digest() # random sha256
        self.key = bytes([0 for n in range(34)])
        self.time = int(time.time() * 1000000000)
        self.token = bytes([0 for n in range(32)])
        #self.token = hashlib.sha256(self.time).digest()
        pri = get_private_ket_by_wif(config.prvkey)
        privkey = PrivateKey(bytes(pri), raw=True)
        #self.sig,_ = privkey.ecdsa_sign(self.token, raw=True, count=0)
        #self.sig = bytes(self.sig.data)
        self.sig = bytes([0 for n in range(66)])
        self.p2p_address = "fakenode:%d - %s" % (port, self.node_id.hex()[0:7])
        self.p2p_address = self.p2p_address.encode('unicode_escape')
        self.last_irreversible_block_num = config.last_irreversible_block_num
        self.last_irreversible_block_id = bytes.fromhex(
            config.last_irreversible_block_id)
        self.head_num = config.head_num
        self.head_id = bytes.fromhex(config.head_id)
        self.os = "linux"  # linux/osx/win32/other
        self.os = self.os.encode('unicode_escape')
        self.agent = '"F**k eos"'
        self.agent = self.agent.encode('unicode_escape')
        self.generation = 1
コード例 #19
0
def from_prikey_file(prikey_file: str, password):
    if isinstance(password, str):
        password = password.encode()
    # if prikey_file.endswith('.der') or prikey_file.endswith('.pem'):
    with open(prikey_file, "rb") as file:
        private_bytes = file.read()
    try:
        if is_binaray_string(prikey_file):
            temp_private = serialization \
                .load_der_private_key(private_bytes,
                                      password,
                                      default_backend())
        else:
            temp_private = serialization \
                .load_pem_private_key(private_bytes,
                                      password,
                                      default_backend())
    except Exception as e:
        raise ValueError("Invalid Password or Certificate load Failure)")
    no_pass_private = temp_private.private_bytes(
        encoding=serialization.Encoding.DER,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )
    key_info = keys.PrivateKeyInfo.load(no_pass_private)
    val = key_info['private_key'].native['private_key']
    width = val.bit_length()
    width += 8 - ((width % 8) or 8)
    fmt = '%%0%dx' % (width // 4)
    prikey = binascii.unhexlify(fmt % val)
    pubkey = PrivateKey(prikey).pubkey.serialize(compressed=False)
    hash_pub = hashlib.sha3_256(pubkey[1:]).hexdigest()
    return prikey
コード例 #20
0
def verify_sig(secret, hash_digest, sig_bytes):
    """
        Verify that the provided signature was in fact
        generated by the given private key for the
        given hash_digest

        inputs:
        - privkey: a hex-string private key scalar
        - hash_digest: a hex-string hash message
        - sig: a 64-byte array of concatenated r + s values of the signature to verify

        returns:
        - True if valid signature,
        - False otherwise
    """
    if len(sig_bytes) != 64:
        raise ValueError(
            "Expected a 64-byte array for sig, got {} ({})".format(
                len(sig_bytes), sig_bytes.hex()))

    privkey = PrivateKey(bytes(bytearray.fromhex(secret)), raw=True)
    sig = privkey.ecdsa_deserialize_compact(sig_bytes)
    return privkey.pubkey.ecdsa_verify(bytes(bytearray.fromhex(hash_digest)),
                                       sig,
                                       raw=True)
コード例 #21
0
ファイル: cli.py プロジェクト: ziwon/nekoyume
 def convert(self, value, param, ctx) -> PrivateKey:
     val = value[2:] if value.startswith(('0x', '0X')) else value
     try:
         num = bytes.fromhex(val)
         return PrivateKey(num)
     except (ValueError, TypeError):
         self.fail('%s is not a valid private key of 64 hexadecimal digits')
コード例 #22
0
def test_ecrecover():
    s = tester.state()
    c = s.abi_contract(ecrecover_code)

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

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

    pk = PrivateKey(priv, raw=True)
    signature = pk.ecdsa_recoverable_serialize(
        pk.ecdsa_sign_recoverable(msghash, raw=True))
    signature = signature[0] + utils.bytearray_to_bytestr([signature[1]])
    V = utils.safe_ord(signature[64]) + 27
    R = big_endian_to_int(signature[0:32])
    S = big_endian_to_int(signature[32:64])

    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 = c.test_ecrecover(utils.big_endian_to_int(msghash), V, R, S)
    assert result == addr
コード例 #23
0
ファイル: views.py プロジェクト: scresh/fashion_dlt
def sign(message, private_key_hex):
    private_key = PrivateKey(bytes(bytearray.fromhex(private_key_hex)),
                             raw=True)
    signature = private_key.ecdsa_sign(message)
    signature = private_key.ecdsa_serialize_compact(signature).hex()

    return signature
コード例 #24
0
def test_decode_direct_transfer(private_keys, settle_timeout, tester_state,
                                tester_token, tester_events, tester_registry):

    privatekey0 = tester.DEFAULT_KEY
    privatekey1 = private_keys[1]
    address0 = privatekey_to_address(privatekey0)
    address1 = privatekey_to_address(privatekey1)

    dtester = deploy_decoder_tester(tester_token.address, address0, address1,
                                    settle_timeout)

    locksroot = sha3("Waldemarstr")

    message = DirectTransfer(identifier=1,
                             nonce=2,
                             asset=tester_token.address,
                             transferred_amount=1337,
                             recipient=address1,
                             locksroot=locksroot)

    message.sign(PrivateKey(privatekey0, ctx=GLOBAL_CTX, raw=True), address0)
    _, publickey = wrap_and_validate(message.encode())
    recovered_address = address_from_key(publickey)
    assert recovered_address == address0

    assert dtester.testDecodeTransfer(message.encode()) is True
    assert dtester.decodedNonce() == 2
    assert dtester.decodedAsset() == tester_token.address.encode('hex')
    assert dtester.decodedRecipient() == address1.encode('hex')
    assert dtester.decodedAmount() == 1337
    assert dtester.decodedLocksroot() == locksroot
コード例 #25
0
 def test_from_private_key_bytes(self):
     byte_data = f'{"0"*32}'.encode()
     private_key_object = PrivateKey(byte_data)
     from_private_key = IconJsonrpc.from_private_key(
         private_key_object.private_key)
     self.assertTrue(from_private_key.signer)
     self.assertTrue(from_private_key.address)
コード例 #26
0
    def test_sign_recoverable_verify_sig(self):
        # get sign, recovery
        sign, recovery_id = self.signer.sign_recoverable(self.hashed_message)

        # Convert recoverable sig to normal sig
        deserialized_recoverable_sig = self.test_private_key.ecdsa_recoverable_deserialize(
            sign, recovery_id)
        normal_sig = self.test_private_key.ecdsa_recoverable_convert(
            deserialized_recoverable_sig)

        # Check sig
        self.assertTrue(
            self.test_private_key.pubkey.ecdsa_verify(self.hashed_message,
                                                      normal_sig,
                                                      raw=True))

        # Verify using invalid message
        m = hashlib.sha256()
        m.update(b'invalid message')
        invalid_message = m.digest()
        self.assertFalse(
            self.test_private_key.pubkey.ecdsa_verify(invalid_message,
                                                      normal_sig,
                                                      raw=True))

        # Verify using invalid private key
        invalid_privateKey = PrivateKey()
        self.assertFalse(
            invalid_privateKey.pubkey.ecdsa_verify(self.hashed_message,
                                                   normal_sig,
                                                   raw=True))
コード例 #27
0
def test_update_must_fail_with_a_nonparticipant_transfer(
        tester_channels, private_keys):
    """ updateTransfer must not accept a transfer from a non participant. """
    pkey0, pkey1, nettingchannel, channel0, channel1 = tester_channels[0]
    nonparticipant_key = private_keys[2]

    # make a transfer where pkey1 is the target
    transfer_nonparticipant = DirectTransfer(
        identifier=1,
        nonce=1,
        token=channel0.token_address,
        transferred_amount=10,
        recipient=channel1.our_address,
        locksroot='',
    )

    nonparticipant_address = privatekey_to_address(nonparticipant_key)
    nonparticipant_sign_key = PrivateKey(nonparticipant_key,
                                         ctx=GLOBAL_CTX,
                                         raw=True)

    transfer_nonparticipant.sign(nonparticipant_sign_key,
                                 nonparticipant_address)
    transfer_nonparticipant_data = str(transfer_nonparticipant.packed().data)

    nettingchannel.close('', sender=pkey0)

    with pytest.raises(TransactionFailed):
        nettingchannel.updateTransfer(transfer_nonparticipant_data,
                                      sender=pkey1)
コード例 #28
0
class BlockVerifier(ABC):
    version = None
    _ecdsa = PrivateKey()

    def __init__(self, tx_versioner: 'TransactionVersioner'):
        self._tx_versioner = tx_versioner
        self.invoke_func: Callable[['Block'], ('Block', dict)] = None

    @abstractmethod
    def verify(self,
               block: 'Block',
               prev_block: 'Block',
               blockchain=None,
               generator: 'ExternalAddress' = None):
        raise NotImplementedError

    @abstractmethod
    def verify_loosely(self,
                       block: 'Block',
                       prev_block: 'Block',
                       blockchain=None,
                       generator: 'ExternalAddress' = None):
        raise NotImplementedError

    def verify_version(self, block: 'Block'):
        if block.header.version != self.version:
            raise BlockVersionNotMatch(
                block.header.version, self.version,
                f"The block version is incorrect. Block({block.header})")

    def verify_signature(self, block: 'Block'):
        recoverable_sig = self._ecdsa.ecdsa_recoverable_deserialize(
            block.header.signature.signature(),
            block.header.signature.recover_id())
        raw_public_key = self._ecdsa.ecdsa_recover(block.header.hash,
                                                   recover_sig=recoverable_sig,
                                                   raw=True,
                                                   digest=hashlib.sha3_256)

        public_key = PublicKey(raw_public_key, ctx=self._ecdsa.ctx)
        hash_pub = hashlib.sha3_256(
            public_key.serialize(compressed=False)[1:]).digest()
        expect_address = hash_pub[-20:]
        if expect_address != block.header.peer_id:
            raise RuntimeError(
                f"block peer id {block.header.peer_id.hex_xx()}, "
                f"expected {ExternalAddress(expect_address).hex_xx()}")

    @classmethod
    def new(cls, version: str,
            tx_versioner: 'TransactionVersioner') -> 'BlockVerifier':
        from . import v0_1a, v0_2
        if version == v0_1a.version:
            return v0_1a.BlockVerifier(tx_versioner)

        if version == v0_2.version:
            return v0_2.BlockVerifier(tx_versioner)

        raise NotImplementedError(
            f"BlockBuilder Version({version}) not supported.")
コード例 #29
0
ファイル: base.py プロジェクト: internet-com/Research
    def sign(self, privkey):
        """Sign this with a private key"""
        if self.v:
            raise InvalidSignature("already signed")

        if privkey in (0, '', '\x00' * 32):
            raise InvalidSignature("Zero privkey cannot sign")
        rawhash = sha3(
            rlp.encode(self, self.__class__.exclude(['v', 'r', 's'])))

        if len(privkey) == 64:
            privkey = encode_privkey(privkey, 'bin')

        pk = PrivateKey(privkey, raw=True)
        signature = pk.ecdsa_recoverable_serialize(
            pk.ecdsa_sign_recoverable(rawhash, raw=True))

        signature = signature[0] + chr(signature[1])

        self.v = ord(signature[64]) + 27
        self.r = big_endian_to_int(signature[0:32])
        self.s = big_endian_to_int(signature[32:64])

        self._sender = None
        return self
コード例 #30
0
ファイル: make_tx.py プロジェクト: gokzrlp/Sushumna
def generate_deploy_data(bytecode, privatekey, receiver=None):
    privkey = PrivateKey(hex2bytes(privatekey))
    sender = get_sender()
    print(sender)
    nonce = get_nonce(sender)
    print("nonce is {}".format(nonce))

    tx = Transaction()
    tx.valid_until_block = 4294967296
    tx.nonce = nonce
    if receiver is not None:
        tx.to = receiver
    tx.data = hex2bytes(bytecode)

    message = sha3(tx.SerializeToString())
    sign_recover = privkey.ecdsa_sign_recoverable(message, raw=True)
    sig = privkey.ecdsa_recoverable_serialize(sign_recover)
    signature = binascii.hexlify(
        sig[0]) + binascii.hexlify(bytes(bytearray([sig[1]])))

    unverify_tx = UnverifiedTransaction()
    unverify_tx.transaction.CopyFrom(tx)
    unverify_tx.signature = hex2bytes(signature)
    unverify_tx.crypto = Crypto.Value('SECP')

    signed_transaction = SignedTransaction()
    signed_transaction.transaction_with_sig.CopyFrom(unverify_tx)
    signed_transaction.tx_hash = sha3(unverify_tx.SerializeToString())
    pub = recover_pub(hex2bytes(privatekey))
    signed_transaction.signer = pub
    #print(binascii.hexlify(pub))

    return binascii.hexlify(signed_transaction.SerializeToString())