@@ -59,8 +59,6 @@ class Signature(NamedTuple):
59
59
[b'\x27 ' , b'\x29 ' , b'\x28 ' , b'\x2a ' ],
60
60
[b'\x2b ' , b'\x2c ' , b'\x2d ' , b'\x2e ' ]]
61
61
62
- addresses = ['p2pkh' , 'p2wpkh-p2sh' , 'p2wpkh' ]
63
-
64
62
65
63
class BitcoinMessageError (Exception ):
66
64
"""Base exception for PieWallet"""
@@ -373,7 +371,7 @@ def sign(privkey: int, msg: int, /) -> Signature:
373
371
374
372
def derive_address (pubkey , addr_type : str , uncompressed = False ) -> tuple [str , int ]:
375
373
if uncompressed and addr_type != 'p2pkh' :
376
- raise SignatureError
374
+ raise PrivateKeyError ( 'Need WIF-compressed private key for this address type:' , addr_type )
377
375
elif uncompressed :
378
376
return create_address (pubkey ), 0
379
377
elif addr_type .lower () == 'p2pkh' :
@@ -383,7 +381,7 @@ def derive_address(pubkey, addr_type: str, uncompressed=False) -> tuple[str, int
383
381
elif addr_type .lower () == 'p2wpkh' :
384
382
return create_native_segwit (pubkey ), 3
385
383
else :
386
- raise SignatureError
384
+ raise SignatureError ( 'Invalid address type' )
387
385
388
386
389
387
def sign_message (wif : str , addr_type : str , message : str , / , * , deterministic = False ) -> tuple [str , ...]:
@@ -404,7 +402,7 @@ def sign_message(wif: str, addr_type: str, message: str, /, *, deterministic=Fal
404
402
verified = verify_message (address , message , signature )
405
403
if verified :
406
404
return address , message , signature
407
- raise SignatureError
405
+ raise SignatureError ( 'Invalid signature parameters' )
408
406
409
407
410
408
def bitcoin_message (wif , addr_type : str , message : str , / , * , deterministic = False ) -> None :
@@ -422,12 +420,13 @@ def verify_message(address: str, message: str, signature: str, /) -> bool:
422
420
dsig = base64 .b64decode (signature )
423
421
if len (dsig ) != 65 :
424
422
raise SignatureError ('Signature must be 65 bytes long:' , len (dsig ))
425
- ver = dsig [:1 ]
426
- m_bytes = msg_magic (message )
427
- z = int .from_bytes (double_sha256 (m_bytes ), 'big' )
428
423
header , r , s = dsig [0 ], int .from_bytes (dsig [1 :33 ], 'big' ), int .from_bytes (dsig [33 :], 'big' )
429
424
if header < 27 or header > 46 :
430
425
raise SignatureError ('Header byte out of range:' , header )
426
+ if r >= secp256k1 .n_curve or r == 0 :
427
+ raise SignatureError ('r-value out of range:' , r )
428
+ if s >= secp256k1 .n_curve or s == 0 :
429
+ raise SignatureError ('s-value out of range:' , s )
431
430
if header >= 43 :
432
431
header -= 16
433
432
if header >= 39 :
@@ -444,6 +443,9 @@ def verify_message(address: str, message: str, signature: str, /) -> bool:
444
443
if is_odd (beta - recid ):
445
444
y = secp256k1 .p_curve - beta
446
445
R = Point (x , y )
446
+ ver = dsig [:1 ]
447
+ m_bytes = msg_magic (message )
448
+ z = int .from_bytes (double_sha256 (m_bytes ), 'big' )
447
449
e = (- z ) % secp256k1 .n_curve
448
450
inv_r = mod_inverse (r , secp256k1 .n_curve )
449
451
p = ec_mul (s , R )
@@ -463,8 +465,6 @@ def verify_message(address: str, message: str, signature: str, /) -> bool:
463
465
addr = create_native_segwit (pubkey )
464
466
elif ver in headers [4 ]:
465
467
raise NotImplementedError ()
466
- else :
467
- raise SignatureError ('Header byte out of range:' , header )
468
468
return addr == address
469
469
470
470
0 commit comments