Пример #1
0
 def is_signed_by(self, channel: 'Output', ledger=None):
     if self.claim.unsigned_payload:
         pieces = [
             Base58.decode(self.get_address(ledger)),
             self.claim.unsigned_payload,
             self.claim.signing_channel_hash[::-1]
         ]
     else:
         pieces = [
             self.tx_ref.tx.inputs[0].txo_ref.hash,
             self.claim.signing_channel_hash,
             self.claim.to_message_bytes()
         ]
     digest = sha256(b''.join(pieces))
     public_key = load_der_public_key(
         channel.claim.channel.public_key_bytes, default_backend())
     hash = hashes.SHA256()
     signature = hexlify(self.claim.signature)
     r = int(signature[:int(len(signature) / 2)], 16)
     s = int(signature[int(len(signature) / 2):], 16)
     encoded_sig = ecdsa.util.sigencode_der(r, s, len(signature) * 4)
     try:
         public_key.verify(encoded_sig, digest, ec.ECDSA(Prehashed(hash)))
         return True
     except (ValueError, InvalidSignature):
         pass
     return False
Пример #2
0
def generate_signed_legacy(address: bytes, output: Output):
    decoded_address = Base58.decode(address)
    claim = OldClaimMessage()
    claim.ParseFromString(unhexlify(
        '080110011aee04080112a604080410011a2b4865726520617265203520526561736f6e73204920e29da4e'
        'fb88f204e657874636c6f7564207c20544c4722920346696e64206f7574206d6f72652061626f7574204e'
        '657874636c6f75643a2068747470733a2f2f6e657874636c6f75642e636f6d2f0a0a596f752063616e206'
        '6696e64206d65206f6e20746865736520736f6369616c733a0a202a20466f72756d733a2068747470733a'
        '2f2f666f72756d2e6865617679656c656d656e742e696f2f0a202a20506f64636173743a2068747470733'
        'a2f2f6f6666746f706963616c2e6e65740a202a2050617472656f6e3a2068747470733a2f2f7061747265'
        '6f6e2e636f6d2f7468656c696e757867616d65720a202a204d657263683a2068747470733a2f2f7465657'
        '37072696e672e636f6d2f73746f7265732f6f6666696369616c2d6c696e75782d67616d65720a202a2054'
        '77697463683a2068747470733a2f2f7477697463682e74762f786f6e64616b0a202a20547769747465723'
        'a2068747470733a2f2f747769747465722e636f6d2f7468656c696e757867616d65720a0a2e2e2e0a6874'
        '7470733a2f2f7777772e796f75747562652e636f6d2f77617463683f763d4672546442434f535f66632a0'
        'f546865204c696e75782047616d6572321c436f7079726967687465642028636f6e746163742061757468'
        '6f722938004a2968747470733a2f2f6265726b2e6e696e6a612f7468756d626e61696c732f46725464424'
        '34f535f666352005a001a41080110011a30040e8ac6e89c061f982528c23ad33829fd7146435bf7a4cc22'
        'f0bff70c4fe0b91fd36da9a375e3e1c171db825bf5d1f32209766964656f2f6d70342a5c080110031a406'
        '2b2dd4c45e364030fbfad1a6fefff695ebf20ea33a5381b947753e2a0ca359989a5cc7d15e5392a0d354c'
        '0b68498382b2701b22c03beb8dcb91089031b871e72214feb61536c007cdf4faeeaab4876cb397feaf6b51'
    ))
    claim.ClearField("publisherSignature")
    digest = sha256(b''.join([
        decoded_address,
        claim.SerializeToString(),
        output.claim_hash[::-1]
    ]))
    private_key = ecdsa.SigningKey.from_pem(output.private_key, hashfunc=hashlib.sha256)
    signature = private_key.sign_digest_deterministic(digest, hashfunc=hashlib.sha256)
    claim.publisherSignature.version = 1
    claim.publisherSignature.signatureType = 1
    claim.publisherSignature.signature = signature
    claim.publisherSignature.certificateId = output.claim_hash[::-1]
    return claim
Пример #3
0
def from_extended_key_string(ledger, ekey_str):
    """Given an extended key string, such as

    xpub6BsnM1W2Y7qLMiuhi7f7dbAwQZ5Cz5gYJCRzTNainXzQXYjFwtuQXHd
    3qfi3t3KJtHxshXezfjft93w4UE7BGMtKwhqEHae3ZA7d823DVrL

    return a PubKey or PrivateKey.
    """
    return _from_extended_key(ledger, Base58.decode_check(ekey_str))
Пример #4
0
 def get_signature_digest(self, ledger):
     if self.claim.unsigned_payload:
         pieces = [
             Base58.decode(self.get_address(ledger)),
             self.claim.unsigned_payload,
             self.claim.signing_channel_hash[::-1]
         ]
     else:
         pieces = [
             self.tx_ref.tx.inputs[0].txo_ref.hash,
             self.claim.signing_channel_hash,
             self.claim.to_message_bytes()
         ]
     return sha256(b''.join(pieces))
Пример #5
0
 def is_valid_address(cls, address):
     decoded = Base58.decode_check(address)
     return decoded[0] == cls.pubkey_address_prefix[0]
Пример #6
0
 def address_to_hash160(address):
     return Base58.decode(address)[1:21]
Пример #7
0
 def hash160_to_address(cls, h160):
     raw_address = cls.pubkey_address_prefix + h160
     return Base58.encode(
         bytearray(raw_address + double_sha256(raw_address)[0:4]))
Пример #8
0
 def address(self, address: str):
     self.address_bytes = Base58.decode(address)
Пример #9
0
 def address(self) -> str:
     if self.address_bytes:
         return Base58.encode(self.address_bytes)
Пример #10
0
 def address(self, address: str):
     self.message.address = Base58.decode(address)
Пример #11
0
 def address(self) -> str:
     return Base58.encode(self.message.address)
Пример #12
0
 def address(self, address: str):
     self._fee.address = Base58.decode(address)
Пример #13
0
 def address(self) -> str:
     return Base58.encode(self._fee.address)
Пример #14
0
 def extended_key_string(self):
     """ Return an extended key as a base58 string. """
     return Base58.encode_check(self.extended_key())