async def sign_tx(ctx, msg): address_n = msg.address_n or () node = await seed.derive_node(ctx, address_n, TEZOS_CURVE) if msg.transaction is not None: to = _get_address_from_contract(msg.transaction.destination) await require_confirm_tx(ctx, to, msg.transaction.amount) await require_confirm_fee(ctx, msg.transaction.amount, msg.transaction.fee) elif msg.origination is not None: source = _get_address_from_contract(msg.origination.source) await require_confirm_origination(ctx, source) # if we are immediately delegating contract if msg.origination.delegate is not None: delegate = _get_address_by_tag(msg.origination.delegate) await require_confirm_delegation_baker(ctx, delegate) await require_confirm_origination_fee( ctx, msg.origination.balance, msg.origination.fee ) elif msg.delegation is not None: source = _get_address_from_contract(msg.delegation.source) delegate = None if msg.delegation.delegate is not None: delegate = _get_address_by_tag(msg.delegation.delegate) if delegate is not None and source != delegate: await require_confirm_delegation_baker(ctx, delegate) await require_confirm_set_delegate(ctx, msg.delegation.fee) # if account registers itself as a delegate else: await require_confirm_register_delegate(ctx, source, msg.delegation.fee) else: raise wire.DataError("Invalid operation") w = bytearray() _get_operation_bytes(w, msg) opbytes = bytes(w) # watermark 0x03 is prefix for transactions, delegations, originations, reveals... watermark = bytes([3]) wm_opbytes = watermark + opbytes wm_opbytes_hash = hashlib.blake2b(wm_opbytes, outlen=32).digest() signature = ed25519.sign(node.private_key(), wm_opbytes_hash) sig_op_contents = opbytes + signature sig_op_contents_hash = hashlib.blake2b(sig_op_contents, outlen=32).digest() ophash = base58_encode_check(sig_op_contents_hash, prefix="o") sig_prefixed = base58_encode_check(signature, prefix=TEZOS_SIGNATURE_PREFIX) return TezosSignedTx( signature=sig_prefixed, sig_op_contents=sig_op_contents, operation_hash=ophash )
def test_sign_verify_random(self): for l in range(1, 300): sk = ed25519.generate_secret() pk = ed25519.publickey(sk) msg = random.bytes(l) sig = ed25519.sign(sk, msg) self.assertTrue(ed25519.verify(pk, sig, msg))
async def sign_tx(ctx, msg: NEMSignTx): validate(msg) await validate_path( ctx, check_path, path=msg.transaction.address_n, network=msg.transaction.network ) node = await seed.derive_node(ctx, msg.transaction.address_n, NEM_CURVE) if msg.multisig: public_key = msg.multisig.signer common = msg.multisig await multisig.ask(ctx, msg) else: public_key = seed.remove_ed25519_prefix(node.public_key()) common = msg.transaction if msg.transfer: tx = await transfer.transfer(ctx, public_key, common, msg.transfer, node) elif msg.provision_namespace: tx = await namespace.namespace(ctx, public_key, common, msg.provision_namespace) elif msg.mosaic_creation: tx = await mosaic.mosaic_creation(ctx, public_key, common, msg.mosaic_creation) elif msg.supply_change: tx = await mosaic.supply_change(ctx, public_key, common, msg.supply_change) elif msg.aggregate_modification: tx = await multisig.aggregate_modification( ctx, public_key, common, msg.aggregate_modification, msg.multisig is not None, ) elif msg.importance_transfer: tx = await transfer.importance_transfer( ctx, public_key, common, msg.importance_transfer ) else: raise ValueError("No transaction provided") if msg.multisig: # wrap transaction in multisig wrapper if msg.cosigning: tx = multisig.cosign( seed.remove_ed25519_prefix(node.public_key()), msg.transaction, tx, msg.multisig.signer, ) else: tx = multisig.initiate( seed.remove_ed25519_prefix(node.public_key()), msg.transaction, tx ) signature = ed25519.sign(node.private_key(), tx, NEM_HASH_ALG) resp = NEMSignedTx() resp.data = tx resp.signature = signature return resp
async def sign_message(ctx, msg, keychain): await paths.validate_path(ctx, validate_full_path, path=msg.address_n) await require_confirm_sign_message(ctx, msg.message) node = keychain.derive(msg.address_n, LISK_CURVE) seckey = node.private_key() pubkey = node.public_key() pubkey = pubkey[1:] # skip ed25519 pubkey marker signature = ed25519.sign(seckey, message_digest(msg.message)) return LiskMessageSignature(public_key=pubkey, signature=signature)
async def sign_message(ctx, msg, keychain): await paths.validate_path(ctx, keychain, msg.address_n) await confirm_signverify(ctx, "Lisk", decode_message(msg.message)) node = keychain.derive(msg.address_n) seckey = node.private_key() pubkey = node.public_key() pubkey = pubkey[1:] # skip ed25519 pubkey marker signature = ed25519.sign(seckey, message_digest(msg.message)) return LiskMessageSignature(public_key=pubkey, signature=signature)
def sign_challenge( seckey: bytes, challenge_hidden: bytes, challenge_visual: str, sigtype: Union[str, coininfo.CoinInfo], curve: str, ) -> bytes: from trezor.crypto.hashlib import sha256 if curve == "secp256k1": from trezor.crypto.curve import secp256k1 elif curve == "nist256p1": from trezor.crypto.curve import nist256p1 elif curve == "ed25519": from trezor.crypto.curve import ed25519 from apps.common.signverify import message_digest if sigtype == "gpg": data = challenge_hidden elif sigtype == "signify": if curve != "ed25519": raise wire.DataError("Unsupported curve") data = challenge_hidden elif sigtype == "ssh": if curve != "ed25519": data = sha256(challenge_hidden).digest() else: data = challenge_hidden elif isinstance(sigtype, coininfo.CoinInfo): # sigtype is coin challenge = ( sha256(challenge_hidden).digest() + sha256(challenge_visual.encode()).digest() ) data = message_digest(sigtype, challenge) else: raise wire.DataError("Unsupported sigtype") if curve == "secp256k1": signature = secp256k1.sign(seckey, data) elif curve == "nist256p1": signature = nist256p1.sign(seckey, data) elif curve == "ed25519": signature = ed25519.sign(seckey, data) else: raise wire.DataError("Unknown curve") if curve == "ed25519": signature = b"\x00" + signature elif sigtype == "gpg" or sigtype == "ssh": signature = b"\x00" + signature[1:] return signature
async def sign_message(ctx, msg): message = msg.message address_n = msg.address_n or () await require_confirm_sign_message(ctx, message) node = await seed.derive_node(ctx, address_n, LISK_CURVE) seckey = node.private_key() pubkey = node.public_key() pubkey = pubkey[1:] # skip ed25519 pubkey marker signature = ed25519.sign(seckey, message_digest(message)) return LiskMessageSignature(public_key=pubkey, signature=signature)
def sign(self, data: Iterable[bytes]) -> bytes: if (self.algorithm, self.curve) == ( common.COSE_ALG_ES256, common.COSE_CURVE_P256, ): return self._u2f_sign(data) elif (self.algorithm, self.curve) == ( common.COSE_ALG_EDDSA, common.COSE_CURVE_ED25519, ): return ed25519.sign(self._private_key(), b"".join(segment for segment in data)) raise TypeError
async def sign_tx_hash(ctx, msg, keychain): await paths.validate_path(ctx, keychain, msg.address_n) hash = bytes(msg.hash) # Confirm text = Text("Sign transaction hash", ui.ICON_SEND, ui.GREEN) text.mono(base58.encode(hash)) await require_confirm(ctx, text, ButtonRequestType.SignTx) # Get key node = keychain.derive(msg.address_n) seckey = node.private_key() pubkey = node.public_key()[1:] # skip ed25519 pubkey marker # Sign hash signature = ed25519.sign(seckey, hash) return SolanaSignedTx(signature=signature)
async def sign_tx(ctx, msg: StellarSignTx): if msg.num_operations == 0: raise ProcessError("Stellar: At least one operation is required") node = await seed.derive_node(ctx, msg.address_n, consts.STELLAR_CURVE) pubkey = seed.remove_ed25519_prefix(node.public_key()) w = bytearray() await _init(ctx, w, pubkey, msg) _timebounds(w, msg.timebounds_start, msg.timebounds_end) await _memo(ctx, w, msg) await _operations(ctx, w, msg.num_operations) await _final(ctx, w, msg) # sign digest = sha256(w).digest() signature = ed25519.sign(node.private_key(), digest) # Add the public key for verification that the right account was used for signing return StellarSignedTx(pubkey, signature)
async def sign_tx(ctx, msg): pubkey, seckey = await _get_keys(ctx, msg) transaction = _update_raw_tx(msg.transaction, pubkey) try: await _require_confirm_by_type(ctx, transaction) except AttributeError: raise wire.DataError("The transaction has invalid asset data field") await layout.require_confirm_fee(ctx, transaction.amount, transaction.fee) txbytes = _get_transaction_bytes(transaction) txhash = HashWriter(sha256()) for field in txbytes: txhash.extend(field) digest = txhash.get_digest() signature = ed25519.sign(seckey, digest) return LiskSignedTx(signature=signature)
def sign_challenge(seckey: bytes, challenge_hidden: bytes, challenge_visual: str, sigtype, curve: str) -> bytes: from trezor.crypto.hashlib import sha256 if curve == 'secp256k1': from trezor.crypto.curve import secp256k1 elif curve == 'nist256p1': from trezor.crypto.curve import nist256p1 elif curve == 'ed25519': from trezor.crypto.curve import ed25519 from ..common.signverify import message_digest if sigtype == 'gpg': data = challenge_hidden elif sigtype == 'ssh': if curve != 'ed25519': data = sha256(challenge_hidden).digest() else: data = challenge_hidden else: # sigtype is coin challenge = sha256(challenge_hidden).digest() + sha256(challenge_visual).digest() data = message_digest(sigtype, challenge) if curve == 'secp256k1': signature = secp256k1.sign(seckey, data) elif curve == 'nist256p1': signature = nist256p1.sign(seckey, data) elif curve == 'ed25519': signature = ed25519.sign(seckey, data) else: raise ValueError('Unknown curve') if curve == 'ed25519': signature = b'\x00' + signature elif sigtype == 'gpg' or sigtype == 'ssh': signature = b'\x00' + signature[1:] return signature
def sign_challenge(seckey: bytes, challenge_hidden: bytes, challenge_visual: str, sigtype, curve: str) -> bytes: from trezor.crypto.hashlib import sha256 if curve == "secp256k1": from trezor.crypto.curve import secp256k1 elif curve == "nist256p1": from trezor.crypto.curve import nist256p1 elif curve == "ed25519": from trezor.crypto.curve import ed25519 from apps.common.signverify import message_digest if sigtype == "gpg": data = challenge_hidden elif sigtype == "ssh": if curve != "ed25519": data = sha256(challenge_hidden).digest() else: data = challenge_hidden else: # sigtype is coin challenge = (sha256(challenge_hidden).digest() + sha256(challenge_visual).digest()) data = message_digest(sigtype, challenge) if curve == "secp256k1": signature = secp256k1.sign(seckey, data) elif curve == "nist256p1": signature = nist256p1.sign(seckey, data) elif curve == "ed25519": signature = ed25519.sign(seckey, data) else: raise ValueError("Unknown curve") if curve == "ed25519": signature = b"\x00" + signature elif sigtype == "gpg" or sigtype == "ssh": signature = b"\x00" + signature[1:] return signature
async def sign_tx(ctx, msg: StellarSignTx, keychain): await paths.validate_path(ctx, keychain, msg.address_n) node = keychain.derive(msg.address_n) pubkey = seed.remove_ed25519_prefix(node.public_key()) if msg.num_operations == 0: raise ProcessError("Stellar: At least one operation is required") w = bytearray() await _init(ctx, w, pubkey, msg) await _timebounds(ctx, w, msg.timebounds_start, msg.timebounds_end) await _memo(ctx, w, msg) await _operations(ctx, w, msg.num_operations) await _final(ctx, w, msg) # sign digest = sha256(w).digest() signature = ed25519.sign(node.private_key(), digest) # Add the public key for verification that the right account was used for signing return StellarSignedTx(public_key=pubkey, signature=signature)
async def sign_tx(ctx, msg, keychain): await paths.validate_path( ctx, helpers.validate_full_path, keychain, msg.address_n, CURVE ) node = keychain.derive(msg.address_n, CURVE) if msg.transaction is not None: # if the tranasction oprtation is used to execute code on a smart contract if msg.transaction.parameters_manager is not None: parameters_manager = msg.transaction.parameters_manager # operation to delegate from a smart contract with manager.tz if parameters_manager.set_delegate is not None: delegate = _get_address_by_tag(parameters_manager.set_delegate) await layout.require_confirm_delegation_baker(ctx, delegate) await layout.require_confirm_set_delegate(ctx, msg.transaction.fee) # operation to remove delegate from the smart contract with manager.tz elif parameters_manager.cancel_delegate is not None: address = _get_address_from_contract(msg.transaction.destination) await layout.require_confirm_delegation_manager_withdraw(ctx, address) await layout.require_confirm_manager_remove_delegate( ctx, msg.transaction.fee ) # operation to transfer tokens from a smart contract to an implicit account or a smart contract elif parameters_manager.transfer is not None: to = _get_address_from_contract(parameters_manager.transfer.destination) await layout.require_confirm_tx( ctx, to, parameters_manager.transfer.amount ) await layout.require_confirm_fee( ctx, parameters_manager.transfer.amount, msg.transaction.fee ) else: # transactions from an implicit account to = _get_address_from_contract(msg.transaction.destination) await layout.require_confirm_tx(ctx, to, msg.transaction.amount) await layout.require_confirm_fee( ctx, msg.transaction.amount, msg.transaction.fee ) elif msg.origination is not None: source = _get_address_by_tag(msg.origination.source) await layout.require_confirm_origination(ctx, source) # if we are immediately delegating contract if msg.origination.delegate is not None: delegate = _get_address_by_tag(msg.origination.delegate) await layout.require_confirm_delegation_baker(ctx, delegate) await layout.require_confirm_origination_fee( ctx, msg.origination.balance, msg.origination.fee ) elif msg.delegation is not None: source = _get_address_by_tag(msg.delegation.source) delegate = None if msg.delegation.delegate is not None: delegate = _get_address_by_tag(msg.delegation.delegate) if delegate is not None and source != delegate: await layout.require_confirm_delegation_baker(ctx, delegate) await layout.require_confirm_set_delegate(ctx, msg.delegation.fee) # if account registers itself as a delegate else: await layout.require_confirm_register_delegate( ctx, source, msg.delegation.fee ) elif msg.proposal is not None: proposed_protocols = [_get_protocol_hash(p) for p in msg.proposal.proposals] await layout.require_confirm_proposals(ctx, proposed_protocols) elif msg.ballot is not None: proposed_protocol = _get_protocol_hash(msg.ballot.proposal) submitted_ballot = _get_ballot(msg.ballot.ballot) await layout.require_confirm_ballot(ctx, proposed_protocol, submitted_ballot) else: raise wire.DataError("Invalid operation") w = bytearray() _get_operation_bytes(w, msg) opbytes = bytes(w) # watermark 0x03 is prefix for transactions, delegations, originations, reveals... watermark = bytes([3]) wm_opbytes = watermark + opbytes wm_opbytes_hash = hashlib.blake2b(wm_opbytes, outlen=32).digest() signature = ed25519.sign(node.private_key(), wm_opbytes_hash) sig_op_contents = opbytes + signature sig_op_contents_hash = hashlib.blake2b(sig_op_contents, outlen=32).digest() ophash = helpers.base58_encode_check(sig_op_contents_hash, prefix="o") sig_prefixed = helpers.base58_encode_check( signature, prefix=helpers.TEZOS_SIGNATURE_PREFIX ) return TezosSignedTx( signature=sig_prefixed, sig_op_contents=sig_op_contents, operation_hash=ophash )
def test_sign(self): for sk, pk, sig in self.vectors: # msg = pk sig2 = ed25519.sign(unhexlify(sk), unhexlify(pk)) self.assertEqual(sig2, unhexlify(sig))