import base64 from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.asymmetric.utils import decode_dss_signature from cryptography.hazmat.primitives.serialization import load_der_public_key from cryptography.hazmat.backends import default_backend from cryptography.exceptions import InvalidSignature def verify_signature(public_key_base64: str, digest_algorithm: str, base64_data: str, base64_signature: str) -> bool: # Decode the base64 encoded public key, data, and signature public_key_der = base64.b64decode(public_key_base64) data = base64.b64decode(base64_data) signature = base64.b64decode(base64_signature) # Load the public key from the raw DER-encoded bytes public_key = load_der_public_key(public_key_der, backend=default_backend()) # Select the digest algorithm if digest_algorithm.lower() == 'sha256': chosen_hash = hashes.SHA256() elif digest_algorithm.lower() == 'sha384': chosen_hash = hashes.SHA384() elif digest_algorithm.lower() == 'sha512': chosen_hash = hashes.SHA512() else: raise ValueError("Unsupported digest algorithm") try: # Verify the signature public_key.verify(signature, data, ec.ECDSA(chosen_hash)) return True except InvalidSignature: return False public_key_base64 = 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbfwR+RJudXscgRBRpKX1XFDy3PyudDxz/SfnRi1fT8ekpfBd2O1uoz7jr3Z8nKzxA69EUQ+eFCFI3zeubPWU7w==' digest_algorithm = "SHA256" base64_data = "AAAAAAGCJ8CenAABw1XuU9aeaKreBOXGzCAs+sEfvKpn6aK6emTO0q7IzNAAAZswggGXoAMCAQICFEZvaJ+8w74T5j3b0UonfEHNVtJxMAoGCCqGSM49BAMDMDcxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEeMBwGA1UEAxMVc2lnc3RvcmUtaW50ZXJtZWRpYXRlMB4XDTIyMDcyMjIxMTE1MVoXDTIyMDcyMjIxMjE1MVowADBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFnyqyvCsvnbmOcRIHscYdn4UvukVsQKHc3WkN6e+cL7phM6VlzMp2r97qY1KhsNvPmT506QGJK8pP85d6SkVBCjgbcwgbQwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBQc4BNuLlzfGwl1gqkyaQX/xA9VfzAfBgNVHSMEGDAWgBTf0+nPViQRlvmo2OkoVaLGLhhkPzAfBgNVHREBAf8EFTATgRFicmlhbkBkZWhhbWVyLmNvbTAsBgorBgEEAYO/MAEBBB5odHRwczovL2dpdGh1Yi5jb20vbG9naW4vb2F1dGgAAA==" base64_signature = "MEUCIQC57LC1KG/uog1EKkCdqMUmC9audrMR1x+s7/HH/JPIXAIgTjXlXWKaGoT5qIXnYh2bOvntjn/9AmBnkTm9p2TF59A=" # Example usage #public_key_base64 = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1YrO4tKt3O1db58LJ/FLj5iv9JfrZp2k/udEjO5AAwUIJTeBvlvOKx3JX/gT6DtjHtAEoL3UNtBt7oO/SFZ4gg==" #digest_algorithm = "SHA256" #base64_data = "SGVsbG8gd29ybGQ=" # "Hello world" in base64 #base64_signature = "MEUCIQC1clZrhDxeFVNCqxGFkEjVR8zSlDA5FcOtd5v+ctXt2wIgfZ5PHzkm9UpyXyo6ns/n1hzK1aTz9+yKMdX1FMyEYPg=" is_valid = verify_signature(public_key_base64, digest_algorithm, base64_data, base64_signature) print(f"Signature valid: {is_valid}")