Ejemplo n.º 1
0
def test_sig_bitcoin1(bare_session):
    msg = "this is a test message"

    name1, name2 = "member_a", "member_b"

    priv1, addr1 = makeTestKey(name1)
    priv2, addr2 = makeTestKey(name2)

    msg = b"this is a test message"
    sig1 = bitcoin.ecdsa_sign(msg, priv1)
    sig2 = bitcoin.ecdsa_sign(msg, priv2)

    with pytest.raises(ValidationError):
        # member not existing
        checkSig(msg, sig1, name1)

    m1 = Member(name1, addr1)
    m2 = Member(name2, addr2)
    bare_session.add(m1)
    bare_session.add(m2)

    # should succeed
    checkSig(msg, sig1, name1)

    with pytest.raises(ValidationError):
        # wrong sig
        checkSig(msg, sig2, name1)

    # should succeed
    checkSig(msg, sig2, name2)
Ejemplo n.º 2
0
def create_intkey_transaction(verb, name, value, private_key, public_key):
    payload = IntKeyPayload(verb=verb, name=name, value=value)

    # The prefix should eventually be looked up from the
    # validator's namespace registry.
    intkey_prefix = hashlib.sha512('intkey'.encode('utf-8')).hexdigest()[0:6]

    addr = intkey_prefix + hashlib.sha512(name.encode('utf-8')).hexdigest()

    header = transaction_pb2.TransactionHeader(
        signer_pubkey=public_key,
        family_name='intkey',
        family_version='1.0',
        inputs=[addr],
        outputs=[addr],
        dependencies=[],
        payload_encoding="application/cbor",
        payload_sha512=payload.sha512(),
        batcher_pubkey=public_key,
        nonce=time.time().hex().encode())

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(header_bytes, private_key)

    transaction = transaction_pb2.Transaction(header=header_bytes,
                                              payload=payload.to_cbor(),
                                              header_signature=signature)

    return transaction
def makeTestAction(author, apart, pgp=False):
    """ Create signed test action where privkey of author equals sha256(author). """

    action_string = config.action_prefix + apart
    privkey = bitcoin.sha256(author.name)

    if pgp:  # use PGP signature
        assert author.name in ["member_a", "member_b"]
        gpg = gpglayer.gpgInstance()
        ki1 = gpg.import_keys(testkeys.privkey1)
        ki2 = gpg.import_keys(testkeys.privkey2)

        signature = gpg.sign(action_string,
                             keyid=(ki1.fingerprints[0] if author.name
                                    == "member_a" else ki2.fingerprints[0]),
                             detach=True,
                             passphrase="123").data.decode("ascii")

        assert len(signature)
    else:
        signature = bitcoin.ecdsa_sign(action_string, privkey)

    return Action(author=author,
                  action_string=action_string,
                  signature=signature)
Ejemplo n.º 4
0
def _do_config_set(args):
    """Executes the 'set' subcommand.  Given a key file, and a series of
    key/value pairs, it generates batches of sawtooth_config transactions in a
    BatchList instance, and stores it in a file.
    """
    settings = [s.split('=', 1) for s in args.setting]

    with open(args.key, 'r') as key_file:
        wif_key = key_file.read().strip()
        signing_key = bitcoin.encode_privkey(
            bitcoin.decode_privkey(wif_key, 'wif'), 'hex')
        pubkey = bitcoin.encode_pubkey(bitcoin.privkey_to_pubkey(signing_key),
                                       'hex')

    txns = [
        _create_config_txn(pubkey, signing_key, setting)
        for setting in settings
    ]
    txn_ids = [txn.header_signature for txn in txns]

    batch_header = BatchHeader(signer_pubkey=pubkey,
                               transaction_ids=txn_ids).SerializeToString()

    batch = Batch(header=batch_header,
                  header_signature=bitcoin.ecdsa_sign(batch_header,
                                                      signing_key),
                  transactions=txns)

    batch_list = BatchList(batches=[batch]).SerializeToString()

    try:
        with open(args.output, 'wb') as batch_file:
            batch_file.write(batch_list)
    except:
        raise CliException('Unable to write to {}'.format(args.output))
Ejemplo n.º 5
0
def _create_config_txn(pubkey, signing_key, setting_key_value):
    """Creates an individual sawtooth_config transaction for the given key and
    value.
    """
    setting_key = setting_key_value[0]
    setting_value = setting_key_value[1]
    nonce = str(datetime.datetime.utcnow().timestamp())
    proposal = ConfigProposal(setting=setting_key,
                              value=setting_value,
                              nonce=nonce)
    payload = ConfigPayload(data=proposal.SerializeToString(),
                            action=ConfigPayload.PROPOSE).SerializeToString()

    header = TransactionHeader(
        signer_pubkey=pubkey,
        family_name='sawtooth_config',
        family_version='1.0',
        inputs=_config_inputs(setting_key),
        outputs=_config_outputs(setting_key),
        dependencies=[],
        payload_encoding='application/protobuf',
        payload_sha512=hashlib.sha512(payload).hexdigest(),
        batcher_pubkey=pubkey).SerializeToString()

    signature = bitcoin.ecdsa_sign(header, signing_key)

    return Transaction(header=header,
                       header_signature=signature,
                       payload=payload)
Ejemplo n.º 6
0
def make_transaction(inputs, outputs):
    timestamp = datetime.datetime.now().isoformat()
    out_total, out_msg = _process_outputs(outputs, timestamp)

    tx = {'inputs': [], 'outputs': [], 'timestamp': timestamp}

    in_total = 0
    for in_ in inputs:
        try:
            address, amount, privkey = in_
        except ValueError:
            raise Exception(
                "Transaction inputs must be a 3 item list: [address, amount, privkey]"
            )

        if amount <= 0:
            raise InvalidAmounts("Input can't be zero or negative")
        amount = _cut_to_8(amount)
        msg = "%s%s%s" % (address, amount, out_msg)
        sig = ecdsa_sign(msg, privkey)
        in_total += amount
        tx['inputs'].append([address, amount, sig])

    if in_total < out_total:
        raise InvalidAmounts("Not enough inputs for outputs: %s in, %s out" %
                             (in_total, out_total))

    random.shuffle(outputs)
    tx['outputs'] = outputs
    return tx
Ejemplo n.º 7
0
def create_intkey_transaction(verb, name, value, private_key, public_key):
    payload = IntKeyPayload(
        verb=verb, name=name, value=value)

    # The prefix should eventually be looked up from the
    # validator's namespace registry.
    intkey_prefix = hashlib.sha512('intkey'.encode('utf-8')).hexdigest()[0:6]

    addr = intkey_prefix + hashlib.sha512(name.encode('utf-8')).hexdigest()

    header = transaction_pb2.TransactionHeader(
        signer_pubkey=public_key,
        family_name='intkey',
        family_version='1.0',
        inputs=[addr],
        outputs=[addr],
        dependencies=[],
        payload_encoding="application/cbor",
        payload_sha512=payload.sha512(),
        batcher_pubkey=public_key,
        nonce=time.time().hex().encode())

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(
        header_bytes,
        private_key)

    transaction = transaction_pb2.Transaction(
        header=header_bytes,
        payload=payload.to_cbor(),
        header_signature=signature)

    return transaction
Ejemplo n.º 8
0
def templateReplaceOne(s, Jorig):
    # FIXME: This is kind of ugly code..
    match = re.match(r"\<bitcoin-address\:([a-z]+)\>", s)
    if match:
        res = bitcoin.privtoaddr(bitcoin.sha256(match.group(1)))
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res

    match = re.match(r"\<hash-of\:([^>]+)\>", s)
    if match:
        fn = match.group(1)
        res = bitcoin.sha256(open(fn).read())
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res

    match = re.match(r"\<signature:([a-z]+)\>", s)
    if match:
        msg = "VOTE-FORMAT-VERSION-1 %s %s %s %s %s" % (
            templateReplaceOne(Jorig["handle"], Jorig),
            templateReplaceOne(Jorig["addr"], Jorig),
            templateReplaceOne(Jorig["ballot_option"], Jorig),
            templateReplaceOne(Jorig["proposal"], Jorig),
            templateReplaceOne(Jorig["proposal_meta"], Jorig))
        privkey = bitcoin.sha256(match.group(1))
        res = bitcoin.ecdsa_sign(msg, privkey)
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res
    else:
        return s
Ejemplo n.º 9
0
def templateReplaceOne(s, Jorig):
    # FIXME: This is kind of ugly code..
    match=re.match(r"\<bitcoin-address\:([a-z]+)\>", s)
    if match:
        res=bitcoin.privtoaddr(
            bitcoin.sha256(match.group(1)))
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res
    
    match=re.match(r"\<hash-of\:([^>]+)\>", s)
    if match:
        fn=match.group(1)
        res=bitcoin.sha256(open(fn).read())
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res


    match=re.match(r"\<signature:([a-z]+)\>", s)
    if match:
        msg="VOTE-FORMAT-VERSION-1 %s %s %s %s %s" % (
            templateReplaceOne(Jorig["handle"], Jorig),
            templateReplaceOne(Jorig["addr"], Jorig),
            templateReplaceOne(Jorig["ballot_option"], Jorig),
            templateReplaceOne(Jorig["proposal"], Jorig),
            templateReplaceOne(Jorig["proposal_meta"], Jorig)
        )
        privkey=bitcoin.sha256(match.group(1))
        res=bitcoin.ecdsa_sign(msg, privkey)
        #logging.info("Replace %s with %s" % (match.group(0), res))
        return res
    else:
        return s
Ejemplo n.º 10
0
def create_transaction(name, private_key, public_key):
    payload = name
    addr = '000000' + hashlib.sha512(name.encode()).hexdigest()

    header = transaction_pb2.TransactionHeader(
        signer_pubkey=public_key,
        family_name='scheduler_test',
        family_version='1.0',
        inputs=[addr],
        outputs=[addr],
        dependencies=[],
        payload_encoding="application/cbor",
        payload_sha512=hashlib.sha512(payload.encode()).hexdigest(),
        batcher_pubkey=public_key)

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(
        header_bytes,
        private_key)

    transaction = transaction_pb2.Transaction(
        header=header_bytes,
        payload=payload.encode(),
        header_signature=signature)

    return transaction
Ejemplo n.º 11
0
def create_transaction(name, private_key, public_key):
    payload = name
    addr = '000000' + hashlib.sha512(name.encode()).hexdigest()

    header = transaction_pb2.TransactionHeader(
        signer_pubkey=public_key,
        family_name='scheduler_test',
        family_version='1.0',
        inputs=[addr],
        outputs=[addr],
        dependencies=[],
        payload_encoding="application/cbor",
        payload_sha512=hashlib.sha512(payload.encode()).hexdigest(),
        batcher_pubkey=public_key)

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(
        header_bytes,
        private_key)

    transaction = transaction_pb2.Transaction(
        header=header_bytes,
        payload=payload.encode(),
        header_signature=signature)

    return transaction
Ejemplo n.º 12
0
def test_go_sig():
    """
    go client started with:

    ethereum -port="40404" -loglevel=5  -nodekeyhex="9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658" -bootnodes="enode://2da47499d52d9161a778e4c711e22e8651cb90350ec066452f9516d1d11eb465d1ec42bb27ec6cd4488b8b6a1a411cb5ef83c16cbb8bee194624bb65fef0f7fd@127.0.0.1:30303"
    """

    r_pubkey = "ab16b8c7fc1febb74ceedf1349944ffd4a04d11802451d02e808f08cb3b0c1c1a9c4e1efb7d309a762baa4c9c8da08890b3b712d1666b5b630d6c6a09cbba171".decode(
        'hex')
    d = {
        'signed_data':
        'a061e5b799b5bb3a3a68a7eab6ee11207d90672e796510ac455e985bd206e240',
        'cmd':
        'find_node',
        'body':
        '03f847b840ab16b8c7fc1febb74ceedf1349944ffd4a04d11802451d02e808f08cb3b0c1c1a9c4e1efb7d309a762baa4c9c8da08890b3b712d1666b5b630d6c6a09cbba1718454e869b1',
        'signature':
        '0de032c62e30f4a9f9f07f25ac5377c5a531116147617a6c08f946c97991f351577e53ae138210bdb7447bab53f3398d746d42c64a9ce67a6248e59353f1bc6e01'
    }

    priv_seed = 'test'
    priv_key = mk_privkey(priv_seed)
    assert priv_key == "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658".decode(
        'hex')
    my_pubkey = privtopub(priv_key)
    assert my_pubkey == r_pubkey, (my_pubkey, r_pubkey)
    go_body = d['body'].decode('hex')  # cmd_id, rlp.encoded
    import rlp
    target_node_id, expiry = rlp.decode(go_body[1:])
    assert target_node_id == r_pubkey  # lookup for itself
    go_signed_data = d['signed_data'].decode('hex')
    go_signature = d['signature'].decode('hex')

    b_signature = bitcoin.ecdsa_sign(go_signed_data,
                                     priv_key)  # base64 encoded!

    # https://github.com/vbuterin/pybitcointools/blob/master/bitcoin/main.py#L500
    my_signature = ecdsa_sign(go_signed_data, priv_key)
    assert my_signature == ecdsa_sign(go_signed_data,
                                      priv_key)  # deterministic k

    assert len(go_signed_data) == 32  # sha3()
    assert len(go_signature) == 65
    assert len(my_signature) == 65  # length is okay

    try:
        assert my_signature == go_signature
        failed = False
    except:
        "expected fail, go signatures are not generated with deterministic k"
        failed = True
        pass
    assert failed

    # decoding works when we signed it
    assert my_pubkey == ecdsa_recover(go_signed_data, my_signature)

    # problem we can not decode the pubkey from the go signature
    # and go can not decode ours
    ecdsa_recover(go_signed_data, go_signature)
Ejemplo n.º 13
0
 def make(cls, epoch, correct_hash, wrong_push, my_pk):
     msg = "%s%s%s" % (epoch, correct_hash, cls._make_reason(wrong_push))
     return {
         'epoch': epoch,
         'correct_hash': correct_hash,
         'push': wrong_push,
         'signature': ecdsa_sign(msg, my_pk)
     }
Ejemplo n.º 14
0
def make_transaction_rejection(tx, exc, my_domain, my_pk):
    msg = "%s%s" % (tx['txid'], my_domain)
    return {
        'domain': my_domain,
        'txid': tx['txid'],
        'signature': ecdsa_sign(msg, my_pk),
        'reason': exc.display()
    }
Ejemplo n.º 15
0
 def sign_db(self, privkey, index):
     #function to add a signature to the mapping object generated from the supplied key
     jsonstring = json.dumps(self.map["assets"], sort_keys=True)
     jsonstring += str(self.map["n"]) + str(self.map["m"]) + str(
         self.map["time"]) + str(self.map["height"])
     strhash = bc.sha256(jsonstring)
     sig = bc.ecdsa_sign(jsonstring, privkey)
     self.map["sigs"][index] = sig
def test_invalid1(bare_session, member_list, member_a):
    privkey = bitcoin.sha256("invalid")

    multi_action_string = mas1(member_list)

    multi_signature = bitcoin.ecdsa_sign(multi_action_string, privkey)

    with pytest.raises(ValidationError):
        ma = MultiAction(member_a, multi_action_string, multi_signature)
Ejemplo n.º 17
0
 def make(cls, epoch, from_domain, to_domain, from_pk, hashes):
     msg = "%s%s%s%s" % (from_domain, to_domain, "".join(hashes), epoch)
     return {
         'epoch': epoch,
         'from_domain': from_domain,
         'to_domain': to_domain,
         'hashes': hashes,
         'signature': ecdsa_sign(msg, from_pk)
     }
Ejemplo n.º 18
0
def make_peer_registration(pk, domain):
    timestamp = datetime.datetime.now().isoformat()
    address = privtoaddr(pk)
    to_sign = "%s%s%s" % (domain, address, timestamp)
    return {
        'domain': domain,
        'payout_address': address,
        'timestamp': timestamp,
        'signature': ecdsa_sign(to_sign, pk)
    }
Ejemplo n.º 19
0
 def sign(self, priv):
     # tx_in들에 sign에 self.hash에 대한 서명을 작성
     for tx_in in self.inputs:
         # digest = SHA256.new(str(tx_in).encode())
         # signer = PKCS1_v1_5.new(priv)
         # tx_in.sign = signer.sign(digest)  # 서명
         # tx_in.pubk = str(priv.publickey())
         tx_in.pubk = bitcoin.privkey_to_pubkey(priv)
         digest = bitcoin.sha256(str(tx_in))
         tx_in.sign = bitcoin.ecdsa_sign(digest, priv)
def test_construct1(bare_session, member_list, member_a):

    privkey = bitcoin.sha256(member_a.name)

    multi_action_string = mas1(member_list)
    multi_signature = bitcoin.ecdsa_sign(multi_action_string, privkey)

    ma = MultiAction(member_a, multi_action_string, multi_signature)

    assert len(ma.actions) == 3
Ejemplo n.º 21
0
    def auth_counterparty(self, nick, cr):
        #deserialize the commitment revelation
        cr_dict = btc.PoDLE.deserialize_revelation(cr)
        #check the validity of the proof of discrete log equivalence
        tries = jm_single().config.getint("POLICY", "taker_utxo_retries")
        def reject(msg):
            log.info("Counterparty commitment not accepted, reason: " + msg)
            return False
        if not btc.verify_podle(cr_dict['P'], cr_dict['P2'], cr_dict['sig'],
                                cr_dict['e'], self.maker.commit,
                                index_range=range(tries)):
            reason = "verify_podle failed"
            return reject(reason)
        #finally, check that the proffered utxo is real, old enough, large enough,
        #and corresponds to the pubkey
        res = jm_single().bc_interface.query_utxo_set([cr_dict['utxo']],
                                                      includeconf=True)
        if len(res) != 1 or not res[0]:
            reason = "authorizing utxo is not valid"
            return reject(reason)
        age = jm_single().config.getint("POLICY", "taker_utxo_age")
        if res[0]['confirms'] < age:
            reason = "commitment utxo not old enough: " + str(res[0]['confirms'])
            return reject(reason)
        reqd_amt = int(self.cj_amount * jm_single().config.getint(
            "POLICY", "taker_utxo_amtpercent") / 100.0)
        if res[0]['value'] < reqd_amt:
            reason = "commitment utxo too small: " + str(res[0]['value'])
            return reject(reason)
        if res[0]['address'] != btc.pubkey_to_address(cr_dict['P'],
                                                         get_p2pk_vbyte()):
            reason = "Invalid podle pubkey: " + str(cr_dict['P'])
            return reject(reason)

        # authorisation of taker passed

        # Send auth request to taker
        # Need to choose an input utxo pubkey to sign with
        # (no longer using the coinjoin pubkey from 0.2.0)
        # Just choose the first utxo in self.utxos and retrieve key from wallet.
        auth_address = self.utxos[self.utxos.keys()[0]]['address']
        auth_key = self.maker.wallet.get_key_from_addr(auth_address)
        auth_pub = btc.privtopub(auth_key)
        btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), auth_key)
        self.maker.msgchan.send_ioauth(nick, self.utxos.keys(), auth_pub,
                                       self.cj_addr, self.change_addr, btc_sig)
        #In case of *blacklisted (ie already used) commitments, we already
        #broadcasted them on receipt; in case of valid, and now used commitments,
        #we broadcast them here, and not early - to avoid accidentally
        #blacklisting commitments that are broadcast between makers in real time
        #for the same transaction.
        self.maker.transfer_commitment(self.maker.commit)
        #now persist the fact that the commitment is actually used.
        check_utxo_blacklist(self.maker.commit, persist=True)
        return True
Ejemplo n.º 22
0
 def start_encryption(self, nick, maker_pk):
     if nick not in self.active_orders.keys():
         raise Exception("Counterparty not part of this transaction.")
     self.crypto_boxes[nick] = [maker_pk, enc_wrapper.as_init_encryption(\
                             self.kp, enc_wrapper.init_pubkey(maker_pk))]
     #send authorisation request
     my_btc_addr = self.input_utxos.itervalues().next()['address']
     my_btc_priv = self.wallet.get_key_from_addr(my_btc_addr)
     my_btc_pub = btc.privtopub(my_btc_priv)
     my_btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), my_btc_priv)
     self.msgchan.send_auth(nick, my_btc_pub, my_btc_sig)
def makeTestMultiAction(author, aparts):
    """ Create signed multi action with privkey of authors as for makeTestAction. """
    multi_action_string = config.action_prefix + (
        "\n@@@@@\n" + config.action_prefix).join(aparts)

    privkey = bitcoin.sha256(author.name)
    multi_signature = bitcoin.ecdsa_sign(multi_action_string, privkey)

    return MultiAction(author=author,
                       multi_action_string=multi_action_string,
                       multi_signature=multi_signature)
Ejemplo n.º 24
0
	def start_encryption(self, nick, maker_pk):
		if nick not in self.active_orders.keys():
			raise Exception("Counterparty not part of this transaction.")
		self.crypto_boxes[nick] = [maker_pk, enc_wrapper.as_init_encryption(\
		                        self.kp, enc_wrapper.init_pubkey(maker_pk))]
		#send authorisation request
		my_btc_addr = self.input_utxos.itervalues().next()['address']
		my_btc_priv = self.wallet.get_key_from_addr(my_btc_addr)
		my_btc_pub = btc.privtopub(my_btc_priv)
		my_btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), my_btc_priv)
		self.msgchan.send_auth(nick, my_btc_pub, my_btc_sig)
Ejemplo n.º 25
0
def test_invalid_newml(bare_session, member_list, member_a):
    newml = makeTestMemberList(Global.current_member_list())
    Global.set_current_member_list(newml)
        
    # invalid action string (not current member list)
    action_string = config.action_prefix+member_list.hashref()
    privkey = bitcoin.sha256(member_a.name)
    signature = bitcoin.ecdsa_sign(action_string, privkey)
        
    with pytest.raises(ValidationError):
        Action(member_a, action_string, signature)
Ejemplo n.º 26
0
def test_invalid(bare_session, member_list, member_a, newmember5):
    # invalid signature string (not base64)
    with pytest.raises(ValidationError):
        Action(member_a, "123", "invalidsig\x00")
    
    # valid signature, but wrong address
    action_string = "123"
    privkey = bitcoin.sha256("invalid")
    signature = bitcoin.ecdsa_sign(action_string, privkey)

    with pytest.raises(ValidationError):
        Action(member_a, action_string, signature)


    # invalid action string (no prefix)
    action_string = "invalid"
    privkey = bitcoin.sha256(member_a.name)
    signature = bitcoin.ecdsa_sign(action_string, privkey)
        
    with pytest.raises(ValidationError):
        Action(member_a, action_string, signature)

    # invalid action string (no member list)
    action_string = config.action_prefix+(64*"0")
    privkey = bitcoin.sha256(member_a.name)
    signature = bitcoin.ecdsa_sign(action_string, privkey)
        
    with pytest.raises(ValidationError):
        Action(member_a, action_string, signature)


    # invalid action string (member not in current list)
    action_string = config.action_prefix+member_list.hashref()
    privkey = bitcoin.sha256(newmember5.name)
    signature = bitcoin.ecdsa_sign(action_string, privkey)
        
    with pytest.raises(ValidationError):
        Action(newmember5, action_string, signature)
def postAction(client, astr, member, upload_data=None, upload_fn=None):
    """ Create dictionary for /action POST command. """
    privkey, address = makeTestKey(member)

    data = {}
    data["author_name"] = member
    data["action_string"] = (config.action_prefix +
                             ("%s " % current_member_list_hash(client)) + astr)
    data["signature"] = bitcoin.ecdsa_sign(data["action_string"], privkey)
    if upload_data is not None:
        data["upload"] = (BytesIO(upload_data), upload_fn)

    result = client.post(prefix + "action", data=data)
    rexpect(result, 201)
    return result
Ejemplo n.º 28
0
 def start_encryption(self, nick, maker_pk):
     if nick not in self.active_orders.keys():
         log.debug("Counterparty not part of this transaction. Ignoring")
         return
     self.crypto_boxes[nick] = [maker_pk, as_init_encryption(
             self.kp, init_pubkey(maker_pk))]
     # send authorisation request
     if self.auth_addr:
         my_btc_addr = self.auth_addr
     else:
         my_btc_addr = self.input_utxos.itervalues().next()['address']
     my_btc_priv = self.wallet.get_key_from_addr(my_btc_addr)
     my_btc_pub = btc.privtopub(my_btc_priv)
     my_btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), my_btc_priv)
     self.msgchan.send_auth(nick, my_btc_pub, my_btc_sig)
Ejemplo n.º 29
0
	def auth_counterparty(self, nick, i_utxo_pubkey, btc_sig):
		self.i_utxo_pubkey = i_utxo_pubkey
		
		if not btc.ecdsa_verify(self.taker_pk, btc_sig, self.i_utxo_pubkey):
			print 'signature didnt match pubkey and message'
			return False
		#authorisation of taker passed 
		#(but input utxo pubkey is checked in verify_unsigned_tx).
		#Send auth request to taker
		#TODO the next 2 lines are a little inefficient.
		btc_key = self.maker.wallet.get_key_from_addr(self.cj_addr)
		btc_pub = btc.privtopub(btc_key)
		btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), btc_key)
		self.maker.msgchan.send_ioauth(nick, self.utxos.keys(), btc_pub, self.change_addr, btc_sig)
		return True
Ejemplo n.º 30
0
def create_batch(transactions, private_key, public_key):
    transaction_signatures = [t.header_signature for t in transactions]

    header = batch_pb2.BatchHeader(signer_pubkey=public_key,
                                   transaction_ids=transaction_signatures)

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(header_bytes, private_key)

    batch = batch_pb2.Batch(header=header_bytes,
                            transactions=transactions,
                            header_signature=signature)

    return batch
Ejemplo n.º 31
0
 def start_encryption(self, nick, maker_pk):
     if nick not in self.active_orders.keys():
         log.debug("Counterparty not part of this transaction. Ignoring")
         return
     self.crypto_boxes[nick] = [
         maker_pk,
         as_init_encryption(self.kp, init_pubkey(maker_pk))
     ]
     # send authorisation request
     if self.auth_addr:
         my_btc_addr = self.auth_addr
     else:
         my_btc_addr = self.input_utxos.itervalues().next()['address']
     my_btc_priv = self.wallet.get_key_from_addr(my_btc_addr)
     my_btc_pub = btc.privtopub(my_btc_priv)
     my_btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), my_btc_priv)
     self.msgchan.send_auth(nick, my_btc_pub, my_btc_sig)
Ejemplo n.º 32
0
def create_batch(transactions, private_key, public_key):
    transaction_ids = [t.header_signature for t in transactions]

    header = batch_pb2.BatchHeader(
        signer_pubkey=public_key,
        transaction_ids=transaction_ids)

    header_bytes = header.SerializeToString()

    signature = bitcoin.ecdsa_sign(
        header_bytes,
        private_key)

    batch = batch_pb2.Batch(
        header=header_bytes,
        transactions=transactions,
        header_signature=signature)

    return batch
Ejemplo n.º 33
0
 def start_encryption(self, nick, maker_pk):
     if nick not in self.active_orders.keys():
         log.debug("Counterparty not part of this transaction. Ignoring")
         return
     try:
         self.crypto_boxes[nick] = [maker_pk, as_init_encryption(
             self.kp, init_pubkey(maker_pk))]
     except NaclError as e:
         log.debug("Unable to setup crypto box with " + nick + ": " + repr(e))
         self.msgchan.send_error(nick, "invalid nacl pubkey: " + maker_pk)
         return
     # send authorisation request
     if self.auth_addr:
         my_btc_addr = self.auth_addr
     else:
         my_btc_addr = self.input_utxos.itervalues().next()['address']
     my_btc_priv = self.wallet.get_key_from_addr(my_btc_addr)
     my_btc_pub = btc.privtopub(my_btc_priv)
     my_btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), my_btc_priv)
     self.msgchan.send_auth(nick, my_btc_pub, my_btc_sig)
Ejemplo n.º 34
0
    def privmsg(self, nick, cmd, message):
        log.debug('>>privmsg ' + 'nick=' + nick + ' cmd=' + cmd + ' msg=' +
                  message)
        # should we encrypt?
        box, encrypt = self.get_encryption_box(cmd, nick)
        if encrypt:
            if not box:
                log.debug('error, dont have encryption box object for ' + nick +
                          ', dropping message')
                return
            message = encrypt_encode(message, box)

        #Anti-replay measure: append the message channel identifier
        #to the signature; this prevents cross-channel replay but NOT
        #same-channel replay (in case of snooper after dropped connection
        #on this channel).
        msg_to_be_signed = message + str(self.hostid)

        sig = btc.ecdsa_sign(msg_to_be_signed, self.nick_priv)
        message += ' ' + self.nick_pubkey + ' ' + sig
        #forward to the implementation class (use single _ for polymrphsm to work)
        self._privmsg(nick, cmd, message)
Ejemplo n.º 35
0
    return pub


def test():
    sign = "HGbib2kv9gm9IJjDt1FXbXFczZi35u0rZR3iPUIt5GglDDCeIQ7v8eYXVNIaLoJRI4URGZrhwmsYQ9aVtRTnTfQ="
    pubkey = "044827c756561b8ef6b28b5e53a000805adbf4938ab82e1c2b7f7ea16a0d6face9a509a0a13e794d742210b00581f3e249ebcc705240af2540ea19591091ac1d41"
    assert getMessagePubkey("hello", sign).encode("hex") == pubkey


test()  # Make sure it working right

if __name__ == "__main__":
    import time
    import os
    import sys
    sys.path.append("../pybitcointools")
    import bitcoin as btctools
    print "OpenSSL version %s" % openssl_version
    print ssl._lib
    priv = "5JsunC55XGVqFQj5kPGK4MWgTL26jKbnPhjnmchSNPo75XXCwtk"
    address = "1N2XWu5soeppX2qUjvrf81rpdbShKJrjTr"
    sign = btctools.ecdsa_sign(
        "hello", priv
    )  # HGbib2kv9gm9IJjDt1FXbXFczZi35u0rZR3iPUIt5GglDDCeIQ7v8eYXVNIaLoJRI4URGZrhwmsYQ9aVtRTnTfQ=

    s = time.time()
    for i in range(1000):
        pubkey = getMessagePubkey("hello", sign)
        verified = btctools.pubkey_to_address(pubkey) == address
    print "1000x Verified", verified, time.time() - s
Ejemplo n.º 36
0
Archivo: sign.py Proyecto: awemany/buv
def sign(args):
    data=stdin.readline()[:-1] # remove newline
    privkey=bitcoin.sha256(args.handle)
    print bitcoin.ecdsa_sign(data, privkey)
    print
    print bitcoin.privtoaddr(privkey)
Ejemplo n.º 37
0
        closeLibrary()
        openLibrary()
    """
    return pub


def test():
    sign = "HGbib2kv9gm9IJjDt1FXbXFczZi35u0rZR3iPUIt5GglDDCeIQ7v8eYXVNIaLoJRI4URGZrhwmsYQ9aVtRTnTfQ="
    pubkey = "044827c756561b8ef6b28b5e53a000805adbf4938ab82e1c2b7f7ea16a0d6face9a509a0a13e794d742210b00581f3e249ebcc705240af2540ea19591091ac1d41"
    assert getMessagePubkey("hello", sign).encode("hex") == pubkey

test()  # Make sure it working right

if __name__ == "__main__":
    import time
    import os
    import sys
    sys.path.append("../pybitcointools")
    import bitcoin as btctools
    print "OpenSSL version %s" % openssl_version
    print ssl._lib
    priv = "5JsunC55XGVqFQj5kPGK4MWgTL26jKbnPhjnmchSNPo75XXCwtk"
    address = "1N2XWu5soeppX2qUjvrf81rpdbShKJrjTr"
    sign = btctools.ecdsa_sign("hello", priv)  # HGbib2kv9gm9IJjDt1FXbXFczZi35u0rZR3iPUIt5GglDDCeIQ7v8eYXVNIaLoJRI4URGZrhwmsYQ9aVtRTnTfQ=

    s = time.time()
    for i in range(1000):
        pubkey = getMessagePubkey("hello", sign)
        verified = btctools.pubkey_to_address(pubkey) == address
    print "100x Verified", verified, time.time() - s
Ejemplo n.º 38
0
def _sign(content, private):
    return bitcoin.ecdsa_sign(content, private)
Ejemplo n.º 39
0
    def auth_counterparty(self, nick, cr):
        #deserialize the commitment revelation
        cr_dict = btc.PoDLE.deserialize_revelation(cr)
        #check the validity of the proof of discrete log equivalence
        tries = jm_single().config.getint("POLICY", "taker_utxo_retries")

        def reject(msg):
            log.debug("Counterparty commitment not accepted, reason: " + msg)
            return False

        if not btc.verify_podle(cr_dict['P'],
                                cr_dict['P2'],
                                cr_dict['sig'],
                                cr_dict['e'],
                                self.maker.commit,
                                index_range=range(tries)):
            reason = "verify_podle failed"
            return reject(reason)
        #finally, check that the proffered utxo is real, old enough, large enough,
        #and corresponds to the pubkey
        res = jm_single().bc_interface.query_utxo_set([cr_dict['utxo']],
                                                      includeconf=True)
        if len(res) != 1 or not res[0]:
            reason = "authorizing utxo is not valid"
            return reject(reason)
        age = jm_single().config.getint("POLICY", "taker_utxo_age")
        if res[0]['confirms'] < age:
            reason = "commitment utxo not old enough: " + str(
                res[0]['confirms'])
            return reject(reason)
        reqd_amt = int(
            self.cj_amount *
            jm_single().config.getint("POLICY", "taker_utxo_amtpercent") /
            100.0)
        if res[0]['value'] < reqd_amt:
            reason = "commitment utxo too small: " + str(res[0]['value'])
            return reject(reason)
        if res[0]['address'] != btc.pubkey_to_address(cr_dict['P'],
                                                      get_p2pk_vbyte()):
            reason = "Invalid podle pubkey: " + str(cr_dict['P'])
            return reject(reason)

        # authorisation of taker passed

        # Send auth request to taker
        # Need to choose an input utxo pubkey to sign with
        # (no longer using the coinjoin pubkey from 0.2.0)
        # Just choose the first utxo in self.utxos and retrieve key from wallet.
        auth_address = self.utxos[self.utxos.keys()[0]]['address']
        auth_key = self.maker.wallet.get_key_from_addr(auth_address)
        auth_pub = btc.privtopub(auth_key)
        btc_sig = btc.ecdsa_sign(self.kp.hex_pk(), auth_key)
        self.maker.msgchan.send_ioauth(nick, self.utxos.keys(), auth_pub,
                                       self.cj_addr, self.change_addr, btc_sig)
        #In case of *blacklisted (ie already used) commitments, we already
        #broadcasted them on receipt; in case of valid, and now used commitments,
        #we broadcast them here, and not early - to avoid accidentally
        #blacklisting commitments that are broadcast between makers in real time
        #for the same transaction.
        self.maker.transfer_commitment(self.maker.commit)
        #now persist the fact that the commitment is actually used.
        check_utxo_blacklist(self.maker.commit, persist=True)
        return True
Ejemplo n.º 40
0
def _sign(content, private):
    return bitcoin.ecdsa_sign(content, private)