File test_ece.py of Package failed_python-http-ece
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
from cryptography.hazmat.backends import default_backend
def make_key():
return ec.generate_private_key(ec.SECP256R1(), default_backend())
def encode_point_from_public_numbers(pub_numbers):
"""Compatibility helper: prefer existing encode_point(), fall back to serializing a public key."""
# Some versions of cryptography provide encode_point() on public_numbers;
# others do not. Try both ways.
try:
return pub_numbers.encode_point()
except Exception:
pub = ec.EllipticCurvePublicNumbers(pub_numbers.x, pub_numbers.y, pub_numbers.curve).public_key(default_backend())
return pub.public_bytes(Encoding.X962, PublicFormat.UncompressedPoint)
def test_encode_point_bytes():
priv = make_key()
pub_nums = priv.public_key().public_numbers()
p = encode_point_from_public_numbers(pub_nums)
assert isinstance(p, (bytes, bytearray))
# Uncompressed P-256 point should start with 0x04 and be 65 bytes
assert p[0] == 0x04
assert len(p) == 65
def test_different_keys_produce_different_points():
a = make_key()
b = make_key()
pa = encode_point_from_public_numbers(a.public_key().public_numbers())
pb = encode_point_from_public_numbers(b.public_key().public_numbers())
assert pa != pb
def test_point_roundtrip_via_public_key():
priv = make_key()
pub_nums = priv.public_key().public_numbers()
p = encode_point_from_public_numbers(pub_nums)
# Construct public key from numbers and serialize again
pub = ec.EllipticCurvePublicNumbers(pub_nums.x, pub_nums.y, pub_nums.curve).public_key(default_backend())
p2 = pub.public_bytes(Encoding.X962, PublicFormat.UncompressedPoint)
assert p == p2