From 5b95f47a533b6c1a2c50f6002cc15829104045c5 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Tue, 15 Sep 2026 10:51:03 +0000 Subject: [PATCH] proto.cosmos.tx.protobuf: move `ecdsa` `verify_sig()` backend to test suite --- mmgen/proto/cosmos/tx/protobuf.py | 34 ++++++++----------- .../mmgen/proto/cosmos/tx/protobuf.py | 15 ++++++++ 2 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 test/overlay/fakemods/mmgen/proto/cosmos/tx/protobuf.py diff --git a/mmgen/proto/cosmos/tx/protobuf.py b/mmgen/proto/cosmos/tx/protobuf.py index fff72913..261b085c 100755 --- a/mmgen/proto/cosmos/tx/protobuf.py +++ b/mmgen/proto/cosmos/tx/protobuf.py @@ -122,6 +122,8 @@ class Tx(BaseMessage): authInfo: Annotated[bytes, Field(2)] signatures: Annotated[list[bytes], Field(3)] + verify_sig_backends = ('secp256k1',) + @property def raw(self): return RawTx( @@ -133,30 +135,24 @@ class Tx(BaseMessage): def txid(self): return sha256(bytes(self.raw)).hexdigest() + def verify_sig_secp256k1(self, *, sig, msghash, pubkey): + from ...secp256k1.secp256k1 import verify_sig + if not verify_sig(sig, msghash, pubkey): + raise ValueError('signature verification failed') + # raises exception on failure: def verify_sig(self, cfg, proto, account_number, backend='secp256k1'): + + if not backend in self.verify_sig_backends: + raise ValueError(f'verify_sig(): {backend}: unrecognized backend') + sign_doc = SignDoc( bodyBytes = bytes(self.body), authInfoBytes = bytes(self.authInfo), chainId = proto.chain_id, accountNumber = account_number) - sig = self.signatures[0] - pubkey = self.authInfo.signerInfos[0].publicKey.key.data - msghash = sha256(bytes(sign_doc)).digest() - match backend: - case 'secp256k1': - from ...secp256k1.secp256k1 import verify_sig - if not verify_sig(sig, msghash, pubkey): - raise ValueError('signature verification failed') - case 'ecdsa': - if not cfg.test_suite: - from ....util import die - die(3, 'The `ecdsa` package is unsafe and may be used only in a testing environment') - # ecdsa.keys.VerifyingKey.verify_digest(): - # raises BadSignatureError if the signature is invalid or malformed - import ecdsa - ec_pubkey = ecdsa.VerifyingKey.from_string(pubkey, curve=ecdsa.curves.SECP256k1) - ec_pubkey.verify_digest(sig, msghash) - case _: - raise ValueError(f'verify_sig(): {backend}: unrecognized backend') + getattr(self, f'verify_sig_{backend}')( + sig = self.signatures[0], + msghash = sha256(bytes(sign_doc)).digest(), + pubkey = self.authInfo.signerInfos[0].publicKey.key.data) diff --git a/test/overlay/fakemods/mmgen/proto/cosmos/tx/protobuf.py b/test/overlay/fakemods/mmgen/proto/cosmos/tx/protobuf.py new file mode 100644 index 00000000..93c7e28c --- /dev/null +++ b/test/overlay/fakemods/mmgen/proto/cosmos/tx/protobuf.py @@ -0,0 +1,15 @@ +from .protobuf_orig import * + +class overlay_fake_Tx: + + verify_sig_backends = ('secp256k1', 'ecdsa') + + def verify_sig_ecdsa(self, *, sig, msghash, pubkey): + # ecdsa.keys.VerifyingKey.verify_digest(): + # raises BadSignatureError if the signature is invalid or malformed + import ecdsa + ec_pubkey = ecdsa.VerifyingKey.from_string(pubkey, curve=ecdsa.curves.SECP256k1) + ec_pubkey.verify_digest(sig, msghash) + +Tx.verify_sig_backends = overlay_fake_Tx.verify_sig_backends +Tx.verify_sig_ecdsa = overlay_fake_Tx.verify_sig_ecdsa