Skip to content

Commit

Permalink
add verify tests from official repo (2 fails)
Browse files Browse the repository at this point in the history
  • Loading branch information
MarshalX committed Jan 11, 2024
1 parent 2412083 commit 672d5a9
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
68 changes: 68 additions & 0 deletions tests/test_atproto_crypto/signature-fixtures.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[
{
"comment": "valid P-256 key and signature, with low-S signature",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256",
"didDocSuite": "EcdsaSecp256r1VerificationKey2019",
"publicKeyDid": "did:key:zDnaembgSGUhZULN2Caob4HLJPaxBh92N7rtH21TErzqf8HQo",
"publicKeyMultibase": "zxdM8dSstjrpZaRUwBmDvjGXweKuEMVN95A9oJBFjkWMh",
"signatureBase64": "2vZNsG3UKvvO/CDlrdvyZRISOFylinBh0Jupc6KcWoJWExHptCfduPleDbG3rko3YZnn9Lw0IjpixVmexJDegg",
"validSignature": true,
"tags": []
},
{
"comment": "valid K-256 key and signature, with low-S signature",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256K",
"didDocSuite": "EcdsaSecp256k1VerificationKey2019",
"publicKeyDid": "did:key:zQ3shqwJEJyMBsBXCWyCBpUBMqxcon9oHB7mCvx4sSpMdLJwc",
"publicKeyMultibase": "z25z9DTpsiYYJKGsWmSPJK2NFN8PcJtZig12K59UgW7q5t",
"signatureBase64": "5WpdIuEUUfVUYaozsi8G0B3cWO09cgZbIIwg1t2YKdUn/FEznOndsz/qgiYb89zwxYCbB71f7yQK5Lr7NasfoA",
"validSignature": true,
"tags": []
},
{
"comment": "P-256 key and signature, with non-low-S signature which is invalid in atproto",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256",
"didDocSuite": "EcdsaSecp256r1VerificationKey2019",
"publicKeyDid": "did:key:zDnaembgSGUhZULN2Caob4HLJPaxBh92N7rtH21TErzqf8HQo",
"publicKeyMultibase": "zxdM8dSstjrpZaRUwBmDvjGXweKuEMVN95A9oJBFjkWMh",
"signatureBase64": "2vZNsG3UKvvO/CDlrdvyZRISOFylinBh0Jupc6KcWoKp7O4VS9giSAah8k5IUbXIW00SuOrjfEqQ9HEkN9JGzw",
"validSignature": false,
"tags": ["high-s"]
},
{
"comment": "K-256 key and signature, with non-low-S signature which is invalid in atproto",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256K",
"didDocSuite": "EcdsaSecp256k1VerificationKey2019",
"publicKeyDid": "did:key:zQ3shqwJEJyMBsBXCWyCBpUBMqxcon9oHB7mCvx4sSpMdLJwc",
"publicKeyMultibase": "z25z9DTpsiYYJKGsWmSPJK2NFN8PcJtZig12K59UgW7q5t",
"signatureBase64": "5WpdIuEUUfVUYaozsi8G0B3cWO09cgZbIIwg1t2YKdXYA67MYxYiTMAVfdnkDCMN9S5B3vHosRe07aORmoshoQ",
"validSignature": false,
"tags": ["high-s"]
},
{
"comment": "P-256 key and signature, with DER-encoded signature which is invalid in atproto",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256",
"didDocSuite": "EcdsaSecp256r1VerificationKey2019",
"publicKeyDid": "did:key:zDnaeT6hL2RnTdUhAPLij1QBkhYZnmuKyM7puQLW1tkF4Zkt8",
"publicKeyMultibase": "ze8N2PPxnu19hmBQ58t5P3E9Yj6CqakJmTVCaKvf9Byq2",
"signatureBase64": "MEQCIFxYelWJ9lNcAVt+jK0y/T+DC/X4ohFZ+m8f9SEItkY1AiACX7eXz5sgtaRrz/SdPR8kprnbHMQVde0T2R8yOTBweA",
"validSignature": false,
"tags": ["der-encoded"]
},
{
"comment": "K-256 key and signature, with DER-encoded signature which is invalid in atproto",
"messageBase64": "oWVoZWxsb2V3b3JsZA",
"algorithm": "ES256K",
"didDocSuite": "EcdsaSecp256k1VerificationKey2019",
"publicKeyDid": "did:key:zQ3shnriYMXc8wvkbJqfNWh5GXn2bVAeqTC92YuNbek4npqGF",
"publicKeyMultibase": "z22uZXWP8fdHXi4jyx8cCDiBf9qQTsAe6VcycoMQPfcMQX",
"signatureBase64": "MEUCIQCWumUqJqOCqInXF7AzhIRg2MhwRz2rWZcOEsOjPmNItgIgXJH7RnqfYY6M0eg33wU0sFYDlprwdOcpRn78Sz5ePgk",
"validSignature": false,
"tags": ["der-encoded"]
}
]
32 changes: 32 additions & 0 deletions tests/test_atproto_crypto/test_verify.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import base64
import json
import os

import pytest
from atproto_crypto.verify import verify_signature

# Ref: https://github.com/bluesky-social/atproto/blob/main/interop-test-files/crypto/signature-fixtures.json
_FIXTURES_FILE_PATH = os.path.join(os.path.dirname(__file__), 'signature-fixtures.json')


def _load_test_cases() -> list:
with open(_FIXTURES_FILE_PATH, encoding='UTF-8') as file:
return json.load(file)


def _fix_base64_padding(data: str) -> str:
return data + '=='


def _decode_b64(data: str) -> bytes:
return base64.b64decode(_fix_base64_padding(data))


@pytest.mark.parametrize('test_case', _load_test_cases(), ids=lambda x: x['comment'])
def test_verify_signature(test_case: dict) -> None:
did_key = test_case['publicKeyDid']
data = _decode_b64(test_case['messageBase64'])
signature = _decode_b64(test_case['signatureBase64'])
expected_valid = test_case['validSignature']

assert verify_signature(did_key, data, signature) == expected_valid

0 comments on commit 672d5a9

Please sign in to comment.