Free AI web copilot to create summaries, insights and extended knowledge, download it at here
1894
Abstract
t attCert subject organisation (O) is not empty</li><li>Check that attCert subject organisation unit (OU) is set to literal string “Authenticator Attestation”</li><li>Check that attCert subject common name(CN) is not empty.</li><li>Check that attCert basic constraints for CA is set to FALSE</li><li>If certificate contains id-fido-gen-ce-aaguid(1.3.6.1.4.1.45724.1.1.4) extension, then check that its value set to the AAGUID returned by the authenticator in authData.</li></ol>
<figure id="b349">
<div>
<div>
<iframe class="gist-iframe" src="/gist/herrjemand/99217ec3dc4df90c10f1772da3739be9.js" allowfullscreen="" frameborder="0" height="undefined" width="undefined">
</div>
</div>
</figure></iframe></div></div></figure><h2 id="d239">Verifying attestation</h2><ol><li>Concatenate <b>authData</b> with <b>clientDataHash</b> to create <b>signatureBase</b></li><li>Verify signature “sig” over the <b>signatureBase </b>with the public key extracted from leaf attCert in “x5c”, using the algorithm “alg”</li><li><b>If you are supporting metadata </b>or MDS: Locate corresponding metadata using the AAGUID returned in that authData. Parse authData, and verify that authData.publicKey algorithm set to the corresponding algorithm to the one set in metadata statement.</li><li>Parse authData, and verify that authData.publicKey algorithm set to the corresponding algorithm to the one set in metadata statement.</li><li>For each attestationRoot in metadata.attestationRootCertificates, generate verification chain <b>verifX5C</b> by appending attestationRoot to the x5c. Try verifying <b>verifX5C</b>. If fail try next attestationRoot. If no attestationRoots left to try, return error.</li></ol><h1 id="6081">SELF(SURROGATE) Attestation</h1><p id="13ff">Self attestation is simple proof of key owner
Options
ship, that is produced by signing attestation with user’s freshly generated private key. It used by the authenticators that don’t have memory to store batch certificate and key pair. If attStmt missing “x5c” and “ecdaaKeyId”, then it is a SELF(SURROGATE) attestation.</p><h2 id="b2a3">Verifying attestation</h2><ol><li>Concatenate <b>authData</b> with <b>clientDataHash</b> to create <b>signatureBase</b></li><li>Parse <b>authData</b> and extract COSE public key</li><li>Verify signature “sig” over the <b>signatureBase </b>with the previously extracted public key.</li><li><b>If you are supporting metadata </b>or MDS: Locate corresponding metadata using the AAGUID returned in that authData.</li><li>Parse authData, and verify that authData.publicKey algorithm set to the corresponding algorithm to the one set in metadata statement.</li><li>Check that metadata.attestationRootCertificates is set to an empty sequence.</li></ol><h1 id="7c77">Snippets</h1>
<figure id="8b0e">
<div>
<div>
<iframe class="gist-iframe" src="/gist/herrjemand/dbeb2c2b76362052e5268224660b6fbc.js" allowfullscreen="" frameborder="0" height="undefined" width="undefined">
</div>
</div>
</figure></iframe></div></div></figure><h1 id="7285">License</h1><p id="dbc8">This article is licensed under <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)</a>. So you are free to read, share, etc. If you are interested in commercial use of this article, or wish to translate it to a different language, please contact ackermann(dot)yuriy(at)gmail(dot)com.</p><p id="7179">The code samples are licensed under <a href="https://gist.github.com/herrjemand/09492b2c6fc6c4ebc0d49b5942d4ec30">MIT license</a>.</p></article></body>