from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature from cryptography.hazmat.primitives.hashes import SHA256 from app.core.security import b64url, canonical_json, verify_signature def test_verify_es256_signature_der_and_raw(): private_key = ec.generate_private_key(ec.SECP256R1()) public_pem = private_key.public_key().public_bytes( serialization.Encoding.PEM, serialization.PublicFormat.SubjectPublicKeyInfo, ).decode("utf-8") payload = {"challenge_id": "abc", "nonce": "n", "user_id": "u"} der_sig = private_key.sign(canonical_json(payload), ec.ECDSA(SHA256())) r, s = decode_dss_signature(der_sig) raw_sig = r.to_bytes(32, "big") + s.to_bytes(32, "big") assert verify_signature(public_pem, payload, b64url(der_sig)) assert verify_signature(public_pem, payload, b64url(raw_sig)) assert not verify_signature(public_pem, payload | {"nonce": "changed"}, b64url(der_sig))