"""Tests for PEM → fixed-width byte extraction.""" import pytest from cryptography.hazmat.primitives.asymmetric import ec from aliro_harness.personalizer.credentials import ( P256_COORD_LEN, extract_priv_scalar, extract_pub_xy, ) def test_extract_priv_scalar_is_32_bytes(): key = ec.generate_private_key(ec.SECP256R1()) s = extract_priv_scalar(key) assert len(s) == 32 def test_extract_priv_scalar_matches_private_value_be(): key = ec.generate_private_key(ec.SECP256R1()) expected = key.private_numbers().private_value.to_bytes(32, "big") assert extract_priv_scalar(key) == expected def test_extract_priv_scalar_pads_short_value(): """A scalar small enough to need leading zeros must be left-padded.""" # Private value of 1 is the smallest possible; should pad with 31 zeros. pem = ec.derive_private_key(1, ec.SECP256R1()).private_numbers() key = ec.derive_private_key(1, ec.SECP256R1()) s = extract_priv_scalar(key) assert s == bytes(31) + b"\x01" assert len(s) == P256_COORD_LEN def test_extract_pub_xy_is_64_bytes_no_prefix(): key = ec.generate_private_key(ec.SECP256R1()) xy = extract_pub_xy(key.public_key()) assert len(xy) == 64 # The 0x04 uncompressed-point tag must NOT appear; the applet's # set_reader_pubk_apdu prepends nothing. nums = key.public_key().public_numbers() assert xy[:32] == nums.x.to_bytes(32, "big") assert xy[32:] == nums.y.to_bytes(32, "big") def test_non_p256_priv_rejected(): key = ec.generate_private_key(ec.SECP384R1()) with pytest.raises(ValueError, match="P-256"): extract_priv_scalar(key) def test_non_p256_pub_rejected(): key = ec.generate_private_key(ec.SECP384R1()) with pytest.raises(ValueError, match="P-256"): extract_pub_xy(key.public_key())