def test_tx_secp256k1_signing(self): tx = make_tx() full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) self.assertEqual(signature, "MEUCIQCsA7IbQ6sIxi6ANJqMEze9eNSFfp8YmPdj8oVnBBy40QIgW30dhhjyZi2WKKdKZoEph844IW3Dfm8sPMoowNrkAhE=") tx.invoker = "some invocation id" full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) self.assertEqual(signature, "MEQCIAOavhcfdISa+QD6KkPljl9mnVCneEeFkYCcY8dRlMUYAiBOpm490EX+D7HxHtawCX8sc0+F5N7ofLgcn8lfieyJ7Q==")
def test_tx_sha3_256_hashing(self): tx = make_tx() full_hash, signature = crypto.sign_transaction(sha3_256, secp256k1, key, tx) self.assertEqual(full_hash, "YOuqbUaJYcy6aDrUJVkhZNQjGMZYIU7XtWPxssz4ODA=") tx.invoker = "some invocation id" full_hash, signature = crypto.sign_transaction(sha3_256, secp256k1, key, tx) self.assertEqual(full_hash, "HlYdM5TLQU6xR4lWI0zq0C58vQ9aXdd1va7pYIfwoqo=")
def test_tx_sha256_hashing(self): tx = make_tx() full_hash, signature = crypto.sign_transaction(sha256, secp256k1, key, tx) self.assertEqual(full_hash, "tvP0nnwld0Ow6Wyvz0T9pS7kQ6qncBo2fBWFDwo9+8I=") tx.invoker = "some invocation id" full_hash, signature = crypto.sign_transaction(sha256, secp256k1, key, tx) self.assertEqual(full_hash, "sYC/PwscI0vKMBlfue/S3saeRVnggkj4XrTeJNwMtmw=")
def test_tx_blake2b_hashing(self): tx = make_tx() full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) self.assertEqual(full_hash, "5z25UmHrb61hA7GFHRN9p28sS/v8H0Tnnb1Bfo4XIuc=") tx.invoker = "some invocation id" full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) self.assertEqual(full_hash, "+apS5zAuLgvxGBBwKDHGh8dt/AGVpwSbFmzp7/g8mYE=")
def test_stripped_tx_verifying(self): tx = make_tx() full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) tx.signature = signature tx.full_hash = full_hash self.assertTrue(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) valid_tx = copy.deepcopy(tx) tx.invoker = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.txn_id = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.txn_type = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.timestamp = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.dc_id = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.block_id = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.tag = "forged" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.full_hash = "forged==" self.assertFalse(crypto.verify_stripped_transaction(blake2b, secp256k1, key.pubkey, tx))
def test_full_tx_verifying(self): tx = make_tx() tx.invoker = "something" full_hash, signature = crypto.sign_transaction(blake2b, secp256k1, key, tx) tx.signature = signature tx.full_hash = full_hash self.assertTrue(crypto.verify_full_transaction(blake2b, secp256k1, key.pubkey, tx)) valid_tx = copy.deepcopy(tx) tx.payload = "forged" self.assertFalse(crypto.verify_full_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.invoker = "forged" self.assertFalse(crypto.verify_full_transaction(blake2b, secp256k1, key.pubkey, tx)) tx = copy.deepcopy(valid_tx) tx.signature = "MEQCIF+o3DHBiTbpw8X6W4/yOuPF/FfANIiNnG0mFLgjBAjuAiAe/QAHN8ufmHMeRvHFItdrzVHFORGED4/msipzFORGED==" self.assertFalse(crypto.verify_full_transaction(blake2b, secp256k1, key.pubkey, tx))
def sign_transaction( self, signable_tx: "transaction_model.TransactionModel" ) -> Tuple[str, str]: """Sign a transaction Args: signable_tx: TransactionModel to sign Returns: Tuple of strings where index 0 is the base64 encoded full hash and index 1 is the base64 encoded stripped signature Raises: exceptions.InvalidNodeLevel when self is not level 1 RuntimeError when no private key is set on self """ if self.level != 1: raise exceptions.InvalidNodeLevel( "Transactions only exist on level 1 nodes") if self.priv is None: raise RuntimeError("No private key has been set for signing") return crypto.sign_transaction(self.hash, self.encryption, self.priv, signable_tx)