Skip to content

Commit 303c8f3

Browse files
committed
Port verify_signature
1 parent a3082fc commit 303c8f3

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

chia/wallet/wallet_rpc_api.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@
264264
VCRevokeResponse,
265265
VCSpend,
266266
VCSpendResponse,
267+
VerifySignature,
268+
VerifySignatureResponse,
267269
WalletInfoResponse,
268270
)
269271
from chia.wallet.wallet_spend_bundle import WalletSpendBundle
@@ -1965,63 +1967,59 @@ async def send_notification(
19651967

19661968
return {"tx": None, "transactions": None} # tx_endpoint wrapper will take care of this
19671969

1968-
async def verify_signature(self, request: dict[str, Any]) -> EndpointResult:
1970+
@marshal
1971+
async def verify_signature(self, request: VerifySignature) -> VerifySignatureResponse:
19691972
"""
19701973
Given a public key, message and signature, verify if it is valid.
19711974
:param request:
19721975
:return:
19731976
"""
1974-
input_message: str = request["message"]
1975-
signing_mode_str: Optional[str] = request.get("signing_mode")
19761977
# Default to BLS_MESSAGE_AUGMENTATION_HEX_INPUT as this RPC was originally designed to verify
19771978
# signatures made by `chia keys sign`, which uses BLS_MESSAGE_AUGMENTATION_HEX_INPUT
1978-
if signing_mode_str is None:
1979+
if request.signing_mode is None:
19791980
signing_mode = SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT
19801981
else:
19811982
try:
1982-
signing_mode = SigningMode(signing_mode_str)
1983+
signing_mode = SigningMode(request.signing_mode)
19831984
except ValueError:
1984-
raise ValueError(f"Invalid signing mode: {signing_mode_str!r}")
1985+
raise ValueError(f"Invalid signing mode: {request.signing_mode!r}")
19851986

19861987
if signing_mode in {SigningMode.CHIP_0002, SigningMode.CHIP_0002_P2_DELEGATED_CONDITIONS}:
19871988
# CHIP-0002 message signatures are made over the tree hash of:
19881989
# ("Chia Signed Message", message)
1989-
message_to_verify: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, input_message)).get_tree_hash()
1990+
message_to_verify: bytes = Program.to((CHIP_0002_SIGN_MESSAGE_PREFIX, request.message)).get_tree_hash()
19901991
elif signing_mode == SigningMode.BLS_MESSAGE_AUGMENTATION_HEX_INPUT:
19911992
# Message is expected to be a hex string
1992-
message_to_verify = hexstr_to_bytes(input_message)
1993+
message_to_verify = hexstr_to_bytes(request.message)
19931994
elif signing_mode == SigningMode.BLS_MESSAGE_AUGMENTATION_UTF8_INPUT:
19941995
# Message is expected to be a UTF-8 string
1995-
message_to_verify = bytes(input_message, "utf-8")
1996+
message_to_verify = bytes(request.message, "utf-8")
19961997
else:
1997-
raise ValueError(f"Unsupported signing mode: {signing_mode_str!r}")
1998+
raise ValueError(f"Unsupported signing mode: {request.signing_mode!r}")
19981999

19992000
# Verify using the BLS message augmentation scheme
20002001
is_valid = AugSchemeMPL.verify(
2001-
G1Element.from_bytes(hexstr_to_bytes(request["pubkey"])),
2002+
request.pubkey,
20022003
message_to_verify,
2003-
G2Element.from_bytes(hexstr_to_bytes(request["signature"])),
2004+
request.signature,
20042005
)
2005-
address = request.get("address")
2006-
if address is not None:
2006+
if request.address is not None:
20072007
# For signatures made by the sign_message_by_address/sign_message_by_id
20082008
# endpoints, the "address" field should contain the p2_address of the NFT/DID
20092009
# that was used to sign the message.
2010-
puzzle_hash: bytes32 = decode_puzzle_hash(address)
2010+
puzzle_hash: bytes32 = decode_puzzle_hash(request.address)
20112011
expected_puzzle_hash: Optional[bytes32] = None
20122012
if signing_mode == SigningMode.CHIP_0002_P2_DELEGATED_CONDITIONS:
2013-
puzzle = p2_delegated_conditions.puzzle_for_pk(Program.to(hexstr_to_bytes(request["pubkey"])))
2013+
puzzle = p2_delegated_conditions.puzzle_for_pk(Program.to(request.pubkey))
20142014
expected_puzzle_hash = bytes32(puzzle.get_tree_hash())
20152015
else:
2016-
expected_puzzle_hash = puzzle_hash_for_synthetic_public_key(
2017-
G1Element.from_bytes(hexstr_to_bytes(request["pubkey"]))
2018-
)
2016+
expected_puzzle_hash = puzzle_hash_for_synthetic_public_key(request.pubkey)
20192017
if puzzle_hash != expected_puzzle_hash:
2020-
return {"isValid": False, "error": "Public key doesn't match the address"}
2018+
return VerifySignatureResponse(isValid=False, error="Public key doesn't match the address")
20212019
if is_valid:
2022-
return {"isValid": is_valid}
2020+
return VerifySignatureResponse(isValid=is_valid)
20232021
else:
2024-
return {"isValid": False, "error": "Signature is invalid."}
2022+
return VerifySignatureResponse(isValid=False, error="Signature is invalid.")
20252023

20262024
async def sign_message_by_address(self, request: dict[str, Any]) -> EndpointResult:
20272025
"""

0 commit comments

Comments
 (0)