Skip to content

Commit

Permalink
fix 3.10+ syntax, don't skip lint in ci
Browse files Browse the repository at this point in the history
  • Loading branch information
droserasprout committed Jan 13, 2025
1 parent 524d1f0 commit 02e3ec4
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 101 deletions.
1 change: 0 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ jobs:

- name: Run lint
run: make lint
if: contains(matrix.python-version, '3.12')

- name: Run tests
run: OSTYPE=$OSTYPE make test-ci
Expand Down
19 changes: 9 additions & 10 deletions src/pytezos/crypto/encoding.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,15 @@


def scrub_input(v: str | bytes) -> bytes:
match v:
case bytes():
return v
case str():
try:
return bytes.fromhex(v.removeprefix('0x'))
except ValueError:
return v.encode('ascii')
case _:
raise TypeError('A bytes-like object is required (also str), not `%s`' % type(v).__name__)
if isinstance(v, bytes):
return v
elif isinstance(v, str):
try:
return bytes.fromhex(v.removeprefix('0x'))
except ValueError:
return v.encode('ascii')
else:
raise TypeError('A bytes-like object is required (also str), not `%s`' % type(v).__name__)


def base58_decode(v: bytes) -> bytes:
Expand Down
174 changes: 84 additions & 90 deletions src/pytezos/crypto/key.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,32 +145,31 @@ def from_secret_exponent(
:param curve: b'sp' for Secp256k1, b'p2' for P256/Secp256r1, b'ed' for Ed25519 (default), b'BL' for BLS12-381
:param activation_code: secret for initializing account balance
"""
match curve:
# Ed25519
case b'ed':
# Dealing with secret exponent or seed?
if len(secret_exponent) == 64:
public_point = pysodium.crypto_sign_sk_to_pk(sk=secret_exponent)
else:
public_point, secret_exponent = pysodium.crypto_sign_seed_keypair(seed=secret_exponent)

# Secp256k1
case b'sp':
sk = coincurve.PrivateKey(secret_exponent)
public_point = sk.public_key.format()

# P256
case b'p2':
pk = fastecdsa.keys.get_public_key(bytes_to_int(secret_exponent), curve=fastecdsa.curve.P256)
public_point = fastecdsa.encoding.sec1.SEC1Encoder.encode_public_key(pk)
# Ed25519
if curve == b'ed':
# Dealing with secret exponent or seed?
if len(secret_exponent) == 64:
public_point = pysodium.crypto_sign_sk_to_pk(sk=secret_exponent)
else:
public_point, secret_exponent = pysodium.crypto_sign_seed_keypair(seed=secret_exponent)

# Secp256k1
elif curve == b'sp':
sk = coincurve.PrivateKey(secret_exponent)
public_point = sk.public_key.format()

# P256
elif curve == b'p2':
pk = fastecdsa.keys.get_public_key(bytes_to_int(secret_exponent), curve=fastecdsa.curve.P256)
public_point = fastecdsa.encoding.sec1.SEC1Encoder.encode_public_key(pk)

# BLS12-381
elif curve == b'BL':
sk_int = int.from_bytes(secret_exponent, byteorder='little')
public_point = G2.SkToPk(sk_int)

# BLS12-381
case b'BL':
sk_int = int.from_bytes(secret_exponent, byteorder='little')
public_point = G2.SkToPk(sk_int)

case _:
raise ValueError(f'Invalid or unsupported curve type: `{curve!r}`.')
else:
raise ValueError(f'Invalid or unsupported curve type: `{curve!r}`.')

return cls(public_point, secret_exponent, curve=curve, activation_code=activation_code)

Expand Down Expand Up @@ -300,21 +299,20 @@ def from_mnemonic(

seed = Mnemonic.to_seed(mnemonic, passphrase=email + passphrase)

match curve:
if curve == b'ed':
# Ed25519
case b'ed':
_, secret_exponent = pysodium.crypto_sign_seed_keypair(seed=seed[:32])
_, secret_exponent = pysodium.crypto_sign_seed_keypair(seed=seed[:32])
elif curve == b'sp':
# Secp256k1
case b'sp':
secret_exponent = seed[:32]
secret_exponent = seed[:32]
elif curve == b'p2':
# P256
case b'p2':
secret_exponent = seed[:32]
secret_exponent = seed[:32]
elif curve == b'BL':
# BLS12-381
case b'BL':
secret_exponent = seed[:32]
case _:
raise ValueError(f'Invalid or unsupported curve type: `{curve!r}`.')
secret_exponent = seed[:32]
else:
raise ValueError(f'Invalid or unsupported curve type: `{curve!r}`.')

return cls.from_secret_exponent(secret_exponent, curve=curve, activation_code=activation_code)

Expand Down Expand Up @@ -457,29 +455,26 @@ def sign(self, message: str | bytes, generic: bool = False):
if not self.secret_exponent:
raise ValueError('Cannot sign without a secret key.')

match self.curve:
if self.curve == b'ed':
# Ed25519
case b'ed':
digest = pysodium.crypto_generichash(encoded_message)
signature = pysodium.crypto_sign_detached(digest, self.secret_exponent)
digest = pysodium.crypto_generichash(encoded_message)
signature = pysodium.crypto_sign_detached(digest, self.secret_exponent)
elif self.curve == b'sp':
# Secp256k1
case b'sp':
pk = coincurve.PrivateKey(self.secret_exponent)
signature = ecdsa.serialize_compact(
ecdsa.der_to_cdata(pk.sign(encoded_message, hasher=lambda x: blake2b_32(x).digest()))
)
pk = coincurve.PrivateKey(self.secret_exponent)
signature = ecdsa.serialize_compact(
ecdsa.der_to_cdata(pk.sign(encoded_message, hasher=lambda x: blake2b_32(x).digest()))
)
elif self.curve == b'p2':
# P256
case b'p2':
r, s = fastecdsa.ecdsa.sign(
msg=encoded_message, d=bytes_to_int(self.secret_exponent), hashfunc=blake2b_32
)
signature = r.to_bytes(32, 'big') + s.to_bytes(32, 'big')
r, s = fastecdsa.ecdsa.sign(msg=encoded_message, d=bytes_to_int(self.secret_exponent), hashfunc=blake2b_32)
signature = r.to_bytes(32, 'big') + s.to_bytes(32, 'big')
elif self.curve == b'BL':
# BLS12-381
case b'BL':
sk_int = int.from_bytes(self.secret_exponent, byteorder='little')
signature = G2.Sign(sk_int, encoded_message)
case _:
raise ValueError(f'Invalid or unsupported curve type: `{self.curve!r}`.')
sk_int = int.from_bytes(self.secret_exponent, byteorder='little')
signature = G2.Sign(sk_int, encoded_message)
else:
raise ValueError(f'Invalid or unsupported curve type: `{self.curve!r}`.')

if generic:
prefix = b'sig'
Expand Down Expand Up @@ -508,40 +503,39 @@ def verify(self, signature: str | bytes, message: str | bytes) -> bool:

decoded_signature = base58_decode(encoded_signature)

match self.curve:
# Ed25519
case b'ed':
digest = pysodium.crypto_generichash(encoded_message)
try:
pysodium.crypto_sign_verify_detached(decoded_signature, digest, self.public_point)
except ValueError as exc:
raise ValueError('Signature is invalid.') from exc
# Secp256k1
case b'sp':
pk = coincurve.PublicKey(self.public_point)
if not pk.verify(
signature=ecdsa.cdata_to_der(ecdsa.deserialize_compact(decoded_signature)),
message=encoded_message,
hasher=lambda x: blake2b_32(x).digest(),
):
raise ValueError('Signature is invalid.')
# P256
case b'p2':
pk = fastecdsa.encoding.sec1.SEC1Encoder.decode_public_key( # type: ignore
self.public_point, curve=fastecdsa.curve.P256
)
r, s = bytes_to_int(decoded_signature[:32]), bytes_to_int(decoded_signature[32:])
if not fastecdsa.ecdsa.verify(sig=(r, s), msg=encoded_message, Q=pk, hashfunc=blake2b_32): # type: ignore
raise ValueError('Signature is invalid.')
# BLS12-381
case b'BL':
if not G2.Verify(
BLSPubkey(self.public_point),
encoded_message,
BLSSignature(decoded_signature),
):
raise ValueError('Signature is invalid.')
case _:
raise ValueError(f'Invalid or unsupported curve type: `{self.curve!r}`.')
# Ed25519
if self.curve == b'ed':
digest = pysodium.crypto_generichash(encoded_message)
try:
pysodium.crypto_sign_verify_detached(decoded_signature, digest, self.public_point)
except ValueError as exc:
raise ValueError('Signature is invalid.') from exc
# Secp256k1
elif self.curve == b'sp':
pk = coincurve.PublicKey(self.public_point)
if not pk.verify(
signature=ecdsa.cdata_to_der(ecdsa.deserialize_compact(decoded_signature)),
message=encoded_message,
hasher=lambda x: blake2b_32(x).digest(),
):
raise ValueError('Signature is invalid.')
# P256
elif self.curve == b'p2':
pk = fastecdsa.encoding.sec1.SEC1Encoder.decode_public_key( # type: ignore
self.public_point, curve=fastecdsa.curve.P256
)
r, s = bytes_to_int(decoded_signature[:32]), bytes_to_int(decoded_signature[32:])
if not fastecdsa.ecdsa.verify(sig=(r, s), msg=encoded_message, Q=pk, hashfunc=blake2b_32): # type: ignore
raise ValueError('Signature is invalid.')
# BLS12-381
elif self.curve == b'BL':
if not G2.Verify(
BLSPubkey(self.public_point),
encoded_message,
BLSSignature(decoded_signature),
):
raise ValueError('Signature is invalid.')
else:
raise ValueError(f'Invalid or unsupported curve type: `{self.curve!r}`.')

return True

0 comments on commit 02e3ec4

Please sign in to comment.