-
-
Notifications
You must be signed in to change notification settings - Fork 184
Description
In some instances AppAttest attestation objects fail to validate when they should succeed. The final validation in Apple.VerifyAsync
compares the values of the attested credential data subject public key with the public key value of the credCert in the x5c and can produce a false negative in the form of a Fido2VerificationException
.
As far as I can tell, the problem emerges because on the one hand a CredentialPublicKey
is constructed from a CborMap
when parsing attested credential data. On the other a CredentialPublicKey
is constructed from an X509Certificate2
. For an X509Certficate2
with an ECDsa
public key, the exported parameters will always contain X
and Y
coordinates as byte[]
values with a fixed length (e.g. 32 bytes for P-256 etc). When parsing the attested credential data, the same EC coordinates can end up being represented with byte[]
values of varying length instead of being padded out to a fixed key length. Thus comparing the encoded values of each CredentialPublicKey
instance we can produce a false negative.
The issue can be reproduced in a test like this one using two AppAttest attestations as inputs.
[Theory]
[InlineData("o2NmbXRvYXBwbGUtYXBwYXR0ZXN0Z2F0dFN0bXSiY3g1Y4JZAwQwggMAMIICh6ADAgECAgYBjnrOb+8wCgYIKoZIzj0EAwIwTzEjMCEGA1UEAwwaQXBwbGUgQXBwIEF0dGVzdGF0aW9uIENBIDExEzARBgNVBAoMCkFwcGxlIEluYy4xEzARBgNVBAgMCkNhbGlmb3JuaWEwHhcNMjQwMzI1MTI0ODUzWhcNMjUwMTIyMDEyNDUzWjCBkTFJMEcGA1UEAwxAYmUxMjdiZWI0M2IxMmVjYzg1ZTM4MzBlM2UxYzk4Y2U1ZWE1NTc5M2Q2NWRjOTZjZjFjMTgzYjRhYjg3NGNjOTEaMBgGA1UECwwRQUFBIENlcnRpZmljYXRpb24xEzARBgNVBAoMCkFwcGxlIEluYy4xEzARBgNVBAgMCkNhbGlmb3JuaWEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT50drzzb2MPpuSSi/OfUiLumtWEoAHaGwpQsq+6/+C1rhnoaRuF2eWtnn0w1ngLyok/xIxtpuM1mTO/LysXoY4o4IBCjCCAQYwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCBPAwgYoGCSqGSIb3Y2QIBQR9MHukAwIBCr+JMAMCAQG/iTEDAgEAv4kyAwIBAb+JMwMCAQG/iTQrBClXN1Y0VjU1Mkw4LmNvbS5lbWlsZmplbGxzdHJvbS5BdHRlc3QtRGVtb6UGBARza3Mgv4k2AwIBBb+JNwMCAQC/iTkDAgEAv4k6AwIBAL+JOwMCAQAwJAYJKoZIhvdjZAgHBBcwFb+KeAYEBDE2LjK/iFAHAgUA/////zAzBgkqhkiG92NkCAIEJjAkoSIEIE+bI7CI0+7CkWkzJFeQfZJeUexwQMoArnB0MQCvmkEXMAoGCCqGSM49BAMCA2cAMGQCMCbgvFWv0WOE2+/AG8+ScK/CMDxUOFYu53aTaXVAOhG/cLcMgllkCzHL7Qs/cLInSgIwSULch/mCrMTgD+AffcEdemKxH6kwMU8cZohazfYDw9/vOQmpH9VyBzg4OVdxSpeOWQJHMIICQzCCAcigAwIBAgIQCbrF4bxAGtnUU5W8OBoIVDAKBggqhkjOPQQDAzBSMSYwJAYDVQQDDB1BcHBsZSBBcHAgQXR0ZXN0YXRpb24gUm9vdCBDQTETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yMDAzMTgxODM5NTVaFw0zMDAzMTMwMDAwMDBaME8xIzAhBgNVBAMMGkFwcGxlIEFwcCBBdHRlc3RhdGlvbiBDQSAxMRMwEQYDVQQKDApBcHBsZSBJbmMuMRMwEQYDVQQIDApDYWxpZm9ybmlhMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAErls3oHdNebI1j0Dn0fImJvHCX+8XgC3qs4JqWYdP+NKtFSV4mqJmBBkSSLY8uWcGnpjTY71eNw+/oI4ynoBzqYXndG6jWaL2bynbMq9FXiEWWNVnr54mfrJhTcIaZs6Zo2YwZDASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFKyREFMzvb5oQf+nDKnl+url5YqhMB0GA1UdDgQWBBQ+410cBBmpybQx+IR01uHhV3LjmzAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaQAwZgIxALu+iI1zjQUCz7z9Zm0JV1A1vNaHLD+EMEkmKe3R+RToeZkcmui1rvjTqFQz97YNBgIxAKs47dDMge0ApFLDukT5k2NlU/7MKX8utN+fXr5aSsq2mVxLgg35BDhveAe7WJQ5t2dyZWNlaXB0WQ57MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwGggCSABIID6DGCBDYwMQIBAgIBAQQpVzdWNFY1NTJMOC5jb20uZW1pbGZqZWxsc3Ryb20uQXR0ZXN0LURlbW8wggMOAgEDAgEBBIIDBDCCAwAwggKHoAMCAQICBgGOes5v7zAKBggqhkjOPQQDAjBPMSMwIQYDVQQDDBpBcHBsZSBBcHAgQXR0ZXN0YXRpb24gQ0EgMTETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yNDAzMjUxMjQ4NTNaFw0yNTAxMjIwMTI0NTNaMIGRMUkwRwYDVQQDDEBiZTEyN2JlYjQzYjEyZWNjODVlMzgzMGUzZTFjOThjZTVlYTU1NzkzZDY1ZGM5NmNmMWMxODNiNGFiODc0Y2M5MRowGAYDVQQLDBFBQUEgQ2VydGlmaWNhdGlvbjETMBEGA1UECgwKQXBwbGUgSW5jLjETMBEGA1UECAwKQ2FsaWZvcm5pYTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPnR2vPNvYw+m5JKL859SIu6a1YSgAdobClCyr7r/4LWuGehpG4XZ5a2efTDWeAvKiT/EjG2m4zWZM78vKxehjijggEKMIIBBjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIE8DCBigYJKoZIhvdjZAgFBH0we6QDAgEKv4kwAwIBAb+JMQMCAQC/iTIDAgEBv4kzAwIBAb+JNCsEKVc3VjRWNTUyTDguY29tLmVtaWxmamVsbHN0cm9tLkF0dGVzdC1EZW1vpQYEBHNrcyC/iTYDAgEFv4k3AwIBAL+JOQMCAQC/iToDAgEAv4k7AwIBADAkBgkqhkiG92NkCAcEFzAVv4p4BgQEMTYuMr+IUAcCBQD/////MDMGCSqGSIb3Y2QIAgQmMCShIgQgT5sjsIjT7sKRaTMkV5B9kl5R7HBAygCucHQxAK+aQRcwCgYIKoZIzj0EAwIDZwAwZAIwJuC8Va/RY4Tb78Abz5Jwr8IwPFQ4Vi7ndpNpdUA6Eb9wtwyCWWQLMcvtCz9wsidKAjBJQtyH+YKsxOAP4B99wR16YrEfqTAxTxxmiFrN9gPD3+85Cakf1XIHODg5V3FKl44wKAIBBAIBAQQgpmWkWSBCL51Bfkhn79xPuKBKHz//H6B+mY6G9/eieuMwYAIBBQIBAQRYWjVod0dmVEtONmZMNjFUOUgxWklQckkwRFhEVE9vNDhtTklQaWJ1L0ZSVHhzQkhVYXI1TW85Q3NOTEVzcExFSkpKdEZFMXpXMjAzcnFuL1MxbkFlOUE9PTAOAgEGAgEBBAZBVFRFU1QwDwIEUgEHAgEBBAdzYW5kYm94MCACAQwCAQEEGDIwMjQtMDMtMjZUMTI6NDg6NTMuMjY3WjAgAgEVAgEBBBgyMDI0LTA2LTI0VDEyOjQ4OjUzLjI2N1oAAAAAAACggDCCA64wggNUoAMCAQICEH4CEmDYznercqWd8Ggnvv0wCgYIKoZIzj0EAwIwfDEwMC4GA1UEAwwnQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgNSAtIEcxMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcNMjQwMjI3MTgzOTUyWhcNMjUwMzI4MTgzOTUxWjBaMTYwNAYDVQQDDC1BcHBsaWNhdGlvbiBBdHRlc3RhdGlvbiBGcmF1ZCBSZWNlaXB0IFNpZ25pbmcxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVDe4gsZPxRPpelHnEnRV4UsakAuZi9fUFodpPwvYk8qLNeo9WCPJanWt/Ey3f5LMKZmQk9nG3C0YAMkDIPR7RKOCAdgwggHUMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAU2Rf+S2eQOEuS9NvO1VeAFAuPPckwQwYIKwYBBQUHAQEENzA1MDMGCCsGAQUFBzABhidodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLWFhaWNhNWcxMDEwggEcBgNVHSAEggETMIIBDzCCAQsGCSqGSIb3Y2QFATCB/TCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjA1BggrBgEFBQcCARYpaHR0cDovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkwHQYDVR0OBBYEFCvPSR77zxt5DvCvAikTtQEW4Xk0MA4GA1UdDwEB/wQEAwIHgDAPBgkqhkiG92NkDA8EAgUAMAoGCCqGSM49BAMCA0gAMEUCIQCHqAkrdF+YQMU6lCFBGl2LqgmA1IaS1dbSmZnQeMfKtQIgP2VTjBMsz4gwNLBHdeiXU8/P0/dEg1W6l1ZcfYoGgRwwggL5MIICf6ADAgECAhBW+4PUK/+NwzeZI7Varm69MAoGCCqGSM49BAMDMGcxGzAZBgNVBAMMEkFwcGxlIFJvb3QgQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTE5MDMyMjE3NTMzM1oXDTM0MDMyMjAwMDAwMFowfDEwMC4GA1UEAwwnQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgNSAtIEcxMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASSzmO9fYaxqygKOxzhr/sElICRrPYx36bLKDVvREvhIeVX3RKNjbqCfJW+Sfq+M8quzQQZ8S9DJfr0vrPLg366o4H3MIH0MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUu7DeoVgziJqkipnevr3rr9rLJKswRgYIKwYBBQUHAQEEOjA4MDYGCCsGAQUFBzABhipodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLWFwcGxlcm9vdGNhZzMwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5hcHBsZS5jb20vYXBwbGVyb290Y2FnMy5jcmwwHQYDVR0OBBYEFNkX/ktnkDhLkvTbztVXgBQLjz3JMA4GA1UdDwEB/wQEAwIBBjAQBgoqhkiG92NkBgIDBAIFADAKBggqhkjOPQQDAwNoADBlAjEAjW+mn6Hg5OxbTnOKkn89eFOYj/TaH1gew3VK/jioTCqDGhqqDaZkbeG5k+jRVUztAjBnOyy04eg3B3fL1ex2qBo6VTs/NWrIxeaSsOFhvoBJaeRfK6ls4RECqsxh2Ti3c0owggJDMIIByaADAgECAggtxfyI0sVLlTAKBggqhkjOPQQDAzBnMRswGQYDVQQDDBJBcHBsZSBSb290IENBIC0gRzMxJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzAeFw0xNDA0MzAxODE5MDZaFw0zOTA0MzAxODE5MDZaMGcxGzAZBgNVBAMMEkFwcGxlIFJvb3QgQ0EgLSBHMzEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmOkvPUBypO2TInKBExzdEJXxxaNOcdwUFtkO5aYFKndke19OONO7HES1f/UftjJiXcnphFtPME8RWgD9WFgMpfUPLE0HRxN12peXl28xXO0rnXsgO9i5VNlemaQ6UQoxo0IwQDAdBgNVHQ4EFgQUu7DeoVgziJqkipnevr3rr9rLJKswDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIxAIPpwcQWXhpdNBjZ7e/0bA4ARku437JGEcUP/eZ6jKGma87CA9Sc9ZPGdLhq36ojFQIwbWaKEMrUDdRPzY1DPrSKY6UzbuNt2he3ZB/IUyb5iGJ0OQsXW8tRqAzoGAPnorIoAAAxgfwwgfkCAQEwgZAwfDEwMC4GA1UEAwwnQXBwbGUgQXBwbGljYXRpb24gSW50ZWdyYXRpb24gQ0EgNSAtIEcxMSYwJAYDVQQLDB1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCEH4CEmDYznercqWd8Ggnvv0wDQYJYIZIAWUDBAIBBQAwCgYIKoZIzj0EAwIERjBEAiA3miF1ila9mxHGJGN8v+QOzWHlrjAhqIBmz+rZ0AQOOQIgGCgd+phCyoUX2asxP504gAws167Y8kabRa2EswpaLGEAAAAAAABoYXV0aERhdGFYpFLniA4qE21Lw6Jq2clmZxLZk6zzTSOgIONjgO5PK2UUQAAAAABhcHBhdHRlc3RkZXZlbG9wACC+EnvrQ7EuzIXjgw4+HJjOXqVXk9ZdyWzxwYO0q4dMyaUBAgMmIAEhWCD50drzzb2MPpuSSi/OfUiLumtWEoAHaGwpQsq+6/+C1iJYILhnoaRuF2eWtnn0w1ngLyok/xIxtpuM1mTO/LysXoY4")]
[InlineData("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")]
public void AttestationCredCertPublicKeyShouldMatchSubjectPublicKey(string encodedAttestation)
{
var attestationObject = AttestationObject.FromBase64String(encodedAttestation);
var credCert = new X509Certificate2((byte[])(attestationObject.AttestationStatement["x5c"] as CborArray)![0]);
var certPublicKey = new CredentialPublicKey(credCert, ES256);
var parsedAuthData = AuthenticatorData.Parse(attestationObject.AuthenticatorData);
var attestedPublicKey = parsedAuthData.AttestedCredentialData!.CredentialPublicKey;
Assert.True(certPublicKey.GetBytes().AsSpan().SequenceEqual(attestedPublicKey.GetBytes().AsSpan()));
}