2021-01-04 18:11:04 +08:00
<! DOCTYPE html >
< html lang = " en " >
< head >
< meta charset = " utf-8 " >
< link rel = " dns-prefetch " href = " https://github.githubassets.com " >
< link rel = " dns-prefetch " href = " https://avatars0.githubusercontent.com " >
< link rel = " dns-prefetch " href = " https://avatars1.githubusercontent.com " >
< link rel = " dns-prefetch " href = " https://avatars2.githubusercontent.com " >
< link rel = " dns-prefetch " href = " https://avatars3.githubusercontent.com " >
< link rel = " dns-prefetch " href = " https://github-cloud.s3.amazonaws.com " >
< link rel = " dns-prefetch " href = " https://user-images.githubusercontent.com/ " >
< link crossorigin = " anonymous " media = " all " integrity = " sha512-BSy+E+S5PJuDWKcXiIXBoFJ7uJ+88y6hFdIhZpf7nf9MVNVvnJDPUaotaxFUQi8UXCLJOcGv1uifxVMc9o5DYQ== " rel = " stylesheet " href = " https://github.githubassets.com/assets/frameworks-052cbe13e4b93c9b8358a7178885c1a0.css " />
< link crossorigin = " anonymous " media = " all " integrity = " sha512-tuayzhY7bkBEq/qU4J930ofI//FEC8Na42y8grGUvaSDLLvJi8/hbKbZ7zxph9o0cZecDALcD+Ks9ppE9YmS5w== " rel = " stylesheet " href = " https://github.githubassets.com/assets/site-b6e6b2ce163b6e4044abfa94e09f77d2.css " />
< link crossorigin = " anonymous " media = " all " integrity = " sha512-zZEYWrT2WyrAqN2Nm29ttIz36AXxSxE+Mf4ARvtJCQrVVOFpnh0nRYu5fbAjtXXTRBDytc8BGLPA7sCsjvGQLw== " rel = " stylesheet " href = " https://github.githubassets.com/assets/github-cd91185ab4f65b2ac0a8dd8d9b6f6db4.css " />
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-8K2vvwbW+6H27Nad5ydg8PA2/aMD/LKq+EiK9s0U0hhVZxCI2tWBsYk9beAtisRw2j+Or5k2/F+6dk02nmj/PA== " type = " application/javascript " src = " https://github.githubassets.com/assets/environment-f0adafbf.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-bf3k8Y60Hljk6JoJikJwUktgpWsNM3NEnNgmlScAD6u57WAUEgCSZh5BsU5ls8YxsL8cZUaKGHC5fsf143pfaw== " type = " application/javascript " src = " https://github.githubassets.com/assets/chunk-frameworks-6dfde4f1.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-TZfq2T+XE31Mcp17bGlABjjeQ/69IH2f/sBvS31c4Jua0e1O/NE+aVbQtItMM2GFlmeEm13p/zyyWGIx10jVKQ== " type = " application/javascript " src = " https://github.githubassets.com/assets/chunk-vendor-4d97ead9.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-gkZCpFyYrX7ycwoeUW7Wyk7sg8OBhVVIA5gFuJfzX3jZcu1jiTPWWM749XEjX9pILro9F5+l+WUfz/MUpAwI0w== " type = " application/javascript " src = " https://github.githubassets.com/assets/behaviors-824642a4.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-F/8sNCLF603gJL0egQeZwFTYP9dfZAVEWHdjMssZ2opLZXRK08vgowBRzKyra6u9zU/rGVxe+igfJsSWzfO2lg== " type = " application/javascript " data - module - id = " ./chunk-contributions-spider-graph.js " data - src = " https://github.githubassets.com/assets/chunk-contributions-spider-graph-17ff2c34.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-obMR8mPKx8OvqRe34LgnUcxeJ1qujiA4ND3H6UX13ExMlA/WfHLjEzXRmgGRcRvN/8J1nzc+Z+jgz/PLTFy6zg== " type = " application/javascript " data - module - id = " ./chunk-drag-drop.js " data - src = " https://github.githubassets.com/assets/chunk-drag-drop-a1b311f2.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-AVtc/43rg+h7XgMPOa+baO1Fj+uiMUrLHd16U6+c6Tk7atk70Ux4IcGRPOHqMv422QIJD7l7BhG2PL4G/tUVKg== " type = " application/javascript " data - module - id = " ./chunk-jump-to.js " data - src = " https://github.githubassets.com/assets/chunk-jump-to-015b5cff.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-biWH4OAQPiDiTkaeyDnXf6hHF3u3Mv3eaDEvt8AdT/QvWDpLbnusALT4ZO+f+DgYp07UiHxNRAB6/J7IwPW6TQ== " type = " application/javascript " data - module - id = " ./chunk-lib.dev.js " data - src = " https://github.githubassets.com/assets/chunk-lib.dev-6e2587e0.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-tcH4xCRuMBAh1PruDaiwGnRIbHlF6bGLhxyCQ16uqok1cV5QFMguVPWJtN9KI0jGQOgN+Pha3+uOUXhXdfK/qw== " type = " application/javascript " data - module - id = " ./chunk-profile-pins-element.js " data - src = " https://github.githubassets.com/assets/chunk-profile-pins-element-b5c1f8c4.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-E+H+wAtjiqutBvn2cnXzDIvmasIhYiS7i7JzOfFUwo+Ej8zT54OrJtP//RhwixnypgOpCF4JvqzYy6zOtORDmg== " type = " application/javascript " data - module - id = " ./chunk-runner-groups.js " data - src = " https://github.githubassets.com/assets/chunk-runner-groups-13e1fec0.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-rIWotuwsYxV+jXNuevOVsulW2zsw98Gi4j7KXrJZq+bWFV86Y/R75+1jMjt5k1MPgabdTPpWPI/IoESZhah9ng== " type = " application/javascript " data - module - id = " ./chunk-sortable-behavior.js " data - src = " https://github.githubassets.com/assets/chunk-sortable-behavior-ac85a8b6.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-ZBICwPA18KYIgHbafqdjnTkxoCSNf/39rTlupkrtdpIWizECoux0ROzjAgyAx20Bf27VfshuBqrYwDqOVftyag== " type = " application/javascript " data - module - id = " ./chunk-tweetsodium.js " data - src = " https://github.githubassets.com/assets/chunk-tweetsodium-641202c0.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-QUtHMb3mxbE2DQSQZb9+tK8ZC2m05FFqZOa5ju2Sj0GdiQV+ce/bnIK/YwoMdty44NEhEIkZUIyh9DqLMsRedg== " type = " application/javascript " data - module - id = " ./chunk-user-status-submit.js " data - src = " https://github.githubassets.com/assets/chunk-user-status-submit-414b4731.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-B+TgAy+wlZmUjsDcWKt55BrTpxxZDolcD9v47x25Ue46lVb9c0n1tRz+BjjSeC4CuN9M3psDUpBhsr1aFKpFCw== " type = " application/javascript " src = " https://github.githubassets.com/assets/repositories-07e4e003.js " ></ script >
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-Dl4JXoI2igFuQLn6MCPPgiS7TVx3c0/G8iaIZCNzgGi4Iwg8TC0y4LPT584yJ+r6ZsF5QIFL9uo+nhHdBvfLNQ== " type = " application/javascript " src = " https://github.githubassets.com/assets/diffs-0e5e095e.js " ></ script >
< meta name = " viewport " content = " width=device-width " >
< title > WebAuthn / U2f . php at master · lbuchs / WebAuthn · GitHub </ title >
< meta name = " description " content = " A simple PHP WebAuthn (FIDO2) server library. Contribute to lbuchs/WebAuthn development by creating an account on GitHub. " >
< link rel = " search " type = " application/opensearchdescription+xml " href = " /opensearch.xml " title = " GitHub " >
< link rel = " fluid-icon " href = " https://github.com/fluidicon.png " title = " GitHub " >
< meta property = " fb:app_id " content = " 1401488693436528 " >
< meta name = " apple-itunes-app " content = " app-id=1477376905 " />
< meta name = " twitter:image:src " content = " https://avatars1.githubusercontent.com/u/37619779?s=400&v=4 " />< meta name = " twitter:site " content = " @github " />< meta name = " twitter:card " content = " summary " />< meta name = " twitter:title " content = " lbuchs/WebAuthn " />< meta name = " twitter:description " content = " A simple PHP WebAuthn (FIDO2) server library. Contribute to lbuchs/WebAuthn development by creating an account on GitHub. " />
< meta property = " og:image " content = " https://avatars1.githubusercontent.com/u/37619779?s=400&v=4 " />< meta property = " og:site_name " content = " GitHub " />< meta property = " og:type " content = " object " />< meta property = " og:title " content = " lbuchs/WebAuthn " />< meta property = " og:url " content = " https://github.com/lbuchs/WebAuthn " />< meta property = " og:description " content = " A simple PHP WebAuthn (FIDO2) server library. Contribute to lbuchs/WebAuthn development by creating an account on GitHub. " />
< link rel = " assets " href = " https://github.githubassets.com/ " >
< meta name = " request-id " content = " 9E92:4939:66CE6B4:927EDD8:5FF2E997 " data - pjax - transient = " true " />< meta name = " html-safe-nonce " content = " 7542a9b892db023c2b9745385a8d153039033cedf47b1573318c1c5f43430e1a " data - pjax - transient = " true " />< meta name = " visitor-payload " content = " eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5RTkyOjQ5Mzk6NjZDRTZCNDo5MjdFREQ4OjVGRjJFOTk3IiwidmlzaXRvcl9pZCI6IjE1NTE1NTUxMzM0MDM0OTA3MTEiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ== " data - pjax - transient = " true " />< meta name = " visitor-hmac " content = " d552c3c83a273d68ee0537231b5365a51683433d08c4275be5df83b0c7f39fa6 " data - pjax - transient = " true " />
< meta name = " hovercard-subject-tag " content = " repository:149437753 " data - pjax - transient >
< meta name = " github-keyboard-shortcuts " content = " repository,source-code " data - pjax - transient = " true " />
< meta name = " selected-link " value = " repo_source " data - pjax - transient >
< meta name = " google-site-verification " content = " c1kuD-K2HIVF635lypcsWPoD4kilo5-jA_wBFyT4uMY " >
< meta name = " google-site-verification " content = " KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU " >
< meta name = " google-site-verification " content = " ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA " >
< meta name = " google-site-verification " content = " GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc " >
< meta name = " octolytics-host " content = " collector.githubapp.com " />< meta name = " octolytics-app-id " content = " github " />< meta name = " octolytics-event-url " content = " https://collector.githubapp.com/github-external/browser_event " />
< meta name = " analytics-location " content = " /<user-name>/<repo-name>/blob/show " data - pjax - transient = " true " />
< meta name = " optimizely-datafile " content = " { "version": "4", "rollouts": [], "typedAudiences": [], "anonymizeIP": true, "projectId": "16737760170", "variables": [], "featureFlags": [], "experiments": [ { "status": "Running", "audienceIds": [], "variations": [ { "variables": [], "id": "19512260014", "key": "separate_plans_and_usage"}, { "variables": [], "id": "19509770036", "key": "control"}], "id": "19536000020", "key": "account_billing_plans_and_usage", "layerId": "19545220022", "trafficAllocation": [ { "entityId": "19509770036", "endOfRange": 2500}, { "entityId": "", "endOfRange": 5000}, { "entityId": "19512260014", "endOfRange": 7500}, { "entityId": "", "endOfRange": 10000}], "forcedVariations": { "1238720267648ea2c88a74b410aa3c5c": "separate_plans_and_usage"}}], "audiences": [ { "conditions": "[ \ "or \ ", { \ "match \ ": \ "exact \ ", \ "name \ ": \ " $opt_dummy_attribute\ ", \ "type \ ": \ "custom_attribute \ ", \ "value \ ": \ " $opt_dummy_value\ "}]", "id": " $opt_dummy_audience ", "name": "Optimizely-Generated Audience for Backwards Compatibility"}], "groups": [], "attributes": [ { "id": "16822470375", "key": "user_id"}, { "id": "17143601254", "key": "spammy"}, { "id": "18175660309", "key": "organization_plan"}, { "id": "18813001570", "key": "is_logged_in"}, { "id": "19073851829", "key": "geo"}], "botFiltering": false, "accountId": "16737760170", "events": [ { "experimentIds": [], "id": "17911811441", "key": "hydro_click.dashboard.teacher_toolbox_cta"}, { "experimentIds": [], "id": "18124116703", "key": "submit.organizations.complete_sign_up"}, { "experimentIds": [], "id": "18145892387", "key": "no_metric.tracked_outside_of_optimizely"}, { "experimentIds": [], "id": "18178755568", "key": "click.org_onboarding_checklist.add_repo"}, { "experimentIds": [], "id": "18180553241", "key": "submit.repository_imports.create"}, { "experimentIds": [], "id": "18186103728", "key": "click.help.learn_more_about_repository_creation"}, { "experimentIds": [], "id": "18188530140", "key": "test_event.do_not_use_in_production"}, { "experimentIds": [], "id": "18191963644", "key": "click.empty_org_repo_cta.transfer_repository"}, { "experimentIds": [], "id": "18195612788", "key": "click.empty_org_repo_cta.import_repository"}, { "experimentIds": [], "id": "18210945499", "key": "click.org_onboarding_checklist.invite_members"}, { "experimentIds": [], "id": "18211063248", "key": "click.empty_org_repo_cta.create_repository"}, { "experimentIds": [], "id": "18215721889", "key": "click.org_onboarding_checklist.update_profile"}, { "experimentIds": [], "id": "18224360785", "key": "click.org_onboarding_checklist.d
<!-- To prevent page flashing , the optimizely JS needs to be loaded in the
< head > tag before the DOM renders -->
< script crossorigin = " anonymous " defer = " defer " integrity = " sha512-VJrqSK702Mzl9EQxm2OvFxKaumGptgVdeJS2rsaLvVlOdR4HEu3ZFjtV83kMKdYRelUnxxaAFw0wthkpdEUafw== " type = " application/javascript " src = " https://github.githubassets.com/assets/optimizely-549aea48.js " ></ script >
< meta name = " hostname " content = " github.com " >
< meta name = " user-login " content = " " >
< meta name = " expected-hostname " content = " github.com " >
< meta name = " enabled-features " content = " MARKETPLACE_PENDING_INSTALLATIONS,ACTIONS_ENVIRONMENTS,ACTIONS_ENVIRONMENTS " >
< meta http - equiv = " x-pjax-version " content = " b9519ee0f1a36ea318a50dfe223f5168c887f949c28be1eb4abf8a9c37367fa6 " >
< link href = " https://github.com/lbuchs/WebAuthn/commits/master.atom " rel = " alternate " title = " Recent Commits to WebAuthn:master " type = " application/atom+xml " >
< meta name = " go-import " content = " github.com/lbuchs/WebAuthn git https://github.com/lbuchs/WebAuthn.git " >
< meta name = " octolytics-dimension-user_id " content = " 37619779 " />< meta name = " octolytics-dimension-user_login " content = " lbuchs " />< meta name = " octolytics-dimension-repository_id " content = " 149437753 " />< meta name = " octolytics-dimension-repository_nwo " content = " lbuchs/WebAuthn " />< meta name = " octolytics-dimension-repository_public " content = " true " />< meta name = " octolytics-dimension-repository_is_fork " content = " false " />< meta name = " octolytics-dimension-repository_network_root_id " content = " 149437753 " />< meta name = " octolytics-dimension-repository_network_root_nwo " content = " lbuchs/WebAuthn " />< meta name = " octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown " content = " false " />
< link rel = " canonical " href = " https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php " data - pjax - transient >
< meta name = " browser-stats-url " content = " https://api.github.com/_private/browser/stats " >
< meta name = " browser-errors-url " content = " https://api.github.com/_private/browser/errors " >
< meta name = " browser-optimizely-client-errors-url " content = " https://api.github.com/_private/browser/optimizely_client/errors " >
< link rel = " mask-icon " href = " https://github.githubassets.com/pinned-octocat.svg " color = " #000000 " >
< link rel = " alternate icon " class = " js-site-favicon " type = " image/png " href = " https://github.githubassets.com/favicons/favicon.png " >
< link rel = " icon " class = " js-site-favicon " type = " image/svg+xml " href = " https://github.githubassets.com/favicons/favicon.svg " >
< meta name = " theme-color " content = " #1e2327 " >
< meta name = " color-scheme " content = " light dark " >
< link rel = " manifest " href = " /manifest.json " crossOrigin = " use-credentials " >
</ head >
< body class = " logged-out env-production page-responsive page-blob " >
< div class = " position-relative js-header-wrapper " >
< a href = " #start-of-content " class = " px-2 py-4 bg-blue text-white show-on-focus js-skip-to-content " > Skip to content </ a >
< span class = " progress-pjax-loader width-full js-pjax-loader-bar Progress position-fixed " >
< span style = " background-color: #79b8ff;width: 0%; " class = " Progress-item progress-pjax-loader-bar " ></ span >
</ span >
< header class = " Header-old header-logged-out js-details-container Details position-relative f4 py-2 " role = " banner " >
< div class = " container-xl d-lg-flex flex-items-center p-responsive " >
< div class = " d-flex flex-justify-between flex-items-center " >
< a class = " mr-4 " href = " https://github.com/ " aria - label = " Homepage " data - ga - click = " (Logged out) Header, go to homepage, icon:logo-wordmark " >
< svg height = " 32 " class = " octicon octicon-mark-github text-white " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 32 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z " ></ path ></ svg >
</ a >
< div class = " d-lg-none css-truncate css-truncate-target width-fit p-2 " >
</ div >
< div class = " d-flex flex-items-center " >
< a href = " /join?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&source=header-repo "
class = " d-inline-block d-lg-none f5 text-white no-underline border border-gray-dark rounded-2 px-2 py-1 mr-3 mr-sm-5 "
data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"site header","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 1fa73645d79e7339fa56f9c3fdc149417fb1e8add226b07afc3dee86ae9c1d63 "
data - ga - click = " Sign up, click to sign up for account, ref_page:/<user-name>/<repo-name>/blob/show;ref_cta:Sign up;ref_loc:header logged out " >
Sign & nbsp ; up
</ a >
< button class = " btn-link d-lg-none mt-1 js-details-target " type = " button " aria - label = " Toggle navigation " aria - expanded = " false " >
< svg height = " 24 " class = " octicon octicon-three-bars text-white " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 24 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1 2.75A.75.75 0 011.75 2h12.5a.75.75 0 110 1.5H1.75A.75.75 0 011 2.75zm0 5A.75.75 0 011.75 7h12.5a.75.75 0 110 1.5H1.75A.75.75 0 011 7.75zM1.75 12a.75.75 0 100 1.5h12.5a.75.75 0 100-1.5H1.75z " ></ path ></ svg >
</ button >
</ div >
</ div >
< div class = " HeaderMenu HeaderMenu--logged-out position-fixed top-0 right-0 bottom-0 height-fit position-lg-relative d-lg-flex flex-justify-between flex-items-center flex-auto " >
< div class = " d-flex d-lg-none flex-justify-end border-bottom bg-gray-light p-3 " >
< button class = " btn-link js-details-target " type = " button " aria - label = " Toggle navigation " aria - expanded = " false " >
< svg height = " 24 " class = " octicon octicon-x text-gray " viewBox = " 0 0 24 24 " version = " 1.1 " width = " 24 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M5.72 5.72a.75.75 0 011.06 0L12 10.94l5.22-5.22a.75.75 0 111.06 1.06L13.06 12l5.22 5.22a.75.75 0 11-1.06 1.06L12 13.06l-5.22 5.22a.75.75 0 01-1.06-1.06L10.94 12 5.72 6.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
</ div >
< nav class = " mt-0 px-3 px-lg-0 mb-5 mb-lg-0 " aria - label = " Global " >
< ul class = " d-lg-flex list-style-none " >
< li class = " d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center " >
< details class = " HeaderMenu-details details-overlay details-reset width-full " >
< summary class = " HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block " >
Why GitHub ?
< svg x = " 0px " y = " 0px " viewBox = " 0 0 14 8 " xml : space = " preserve " fill = " none " class = " icon-chevon-down-mktg position-absolute position-lg-relative " >
< path d = " M1,1l6.2,6L13,1 " ></ path >
</ svg >
</ summary >
< div class = " dropdown-menu flex-auto rounded-1 bg-white px-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4 " >
< a href = " /features " class = " py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Features " > Features < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a >
< ul class = " list-style-none f5 pb-3 " >
< li class = " edge-item-fix " >< a href = " /features/code-review/ " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Code review " > Code review </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features/project-management/ " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Project management " > Project management </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features/integrations " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Integrations " > Integrations </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features/actions " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Actions " > Actions </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features/packages " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to GitHub Packages " > Packages </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features/security " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Security " > Security </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features#team-management " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Team management " > Team management </ a ></ li >
< li class = " edge-item-fix " >< a href = " /features#hosting " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Code hosting " > Hosting </ a ></ li >
< li class = " edge-item-fix hide-xl " >< a href = " /mobile " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Mobile " > Mobile </ a ></ li >
</ ul >
< ul class = " list-style-none mb-0 border-lg-top pt-lg-3 " >
< li class = " edge-item-fix " >< a href = " /customer-stories " class = " py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Customer stories " > Customer stories < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a ></ li >
< li class = " edge-item-fix " >< a href = " /security " class = " py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Security " > Security < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a ></ li >
</ ul >
</ div >
</ details >
</ li >
< li class = " border-bottom border-lg-bottom-0 mr-0 mr-lg-3 " >
< a href = " /team " class = " HeaderMenu-link no-underline py-3 d-block d-lg-inline-block " data - ga - click = " (Logged out) Header, go to Team " > Team </ a >
</ li >
< li class = " border-bottom border-lg-bottom-0 mr-0 mr-lg-3 " >
< a href = " /enterprise " class = " HeaderMenu-link no-underline py-3 d-block d-lg-inline-block " data - ga - click = " (Logged out) Header, go to Enterprise " > Enterprise </ a >
</ li >
< li class = " d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center " >
< details class = " HeaderMenu-details details-overlay details-reset width-full " >
< summary class = " HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block " >
Explore
< svg x = " 0px " y = " 0px " viewBox = " 0 0 14 8 " xml : space = " preserve " fill = " none " class = " icon-chevon-down-mktg position-absolute position-lg-relative " >
< path d = " M1,1l6.2,6L13,1 " ></ path >
</ svg >
</ summary >
< div class = " dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4 " >
< ul class = " list-style-none mb-3 " >
< li class = " edge-item-fix " >< a href = " /explore " class = " py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Explore " > Explore GitHub < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a ></ li >
</ ul >
< h4 class = " text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3 " > Learn & amp ; contribute </ h4 >
< ul class = " list-style-none mb-3 " >
< li class = " edge-item-fix " >< a href = " /topics " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Topics " > Topics </ a ></ li >
< li class = " edge-item-fix " >< a href = " /collections " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Collections " > Collections </ a ></ li >
< li class = " edge-item-fix " >< a href = " /trending " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Trending " > Trending </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://lab.github.com/ " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Learning lab " > Learning Lab </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://opensource.guide " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Open source guides " > Open source guides </ a ></ li >
</ ul >
< h4 class = " text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3 " > Connect with others </ h4 >
< ul class = " list-style-none mb-0 " >
< li class = " edge-item-fix " >< a href = " https://github.com/events " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Events " > Events </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://github.community " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Community forum " > Community forum </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://education.github.com " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to GitHub Education " > GitHub Education </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://stars.github.com " class = " py-2 pb-0 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to GitHub Stars Program " > GitHub Stars program </ a ></ li >
</ ul >
</ div >
</ details >
</ li >
< li class = " border-bottom border-lg-bottom-0 mr-0 mr-lg-3 " >
< a href = " /marketplace " class = " HeaderMenu-link no-underline py-3 d-block d-lg-inline-block " data - ga - click = " (Logged out) Header, go to Marketplace " > Marketplace </ a >
</ li >
< li class = " d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center " >
< details class = " HeaderMenu-details details-overlay details-reset width-full " >
< summary class = " HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block " >
Pricing
< svg x = " 0px " y = " 0px " viewBox = " 0 0 14 8 " xml : space = " preserve " fill = " none " class = " icon-chevon-down-mktg position-absolute position-lg-relative " >
< path d = " M1,1l6.2,6L13,1 " ></ path >
</ svg >
</ summary >
< div class = " dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-4 mt-0 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4 " >
< a href = " /pricing " class = " pb-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Pricing " > Plans < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a >
< ul class = " list-style-none mb-3 " >
< li class = " edge-item-fix " >< a href = " /pricing#feature-comparison " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Compare plans " > Compare plans </ a ></ li >
< li class = " edge-item-fix " >< a href = " https://enterprise.github.com/contact " class = " py-2 lh-condensed-ultra d-block link-gray no-underline f5 " data - ga - click = " (Logged out) Header, go to Contact Sales " > Contact Sales </ a ></ li >
</ ul >
< ul class = " list-style-none mb-0 border-lg-top pt-lg-3 " >
< li class = " edge-item-fix " >< a href = " /nonprofit " class = " py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Nonprofits " > Nonprofit < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a ></ li >
< li class = " edge-item-fix " >< a href = " https://education.github.com " class = " py-2 pb-0 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover " data - ga - click = " (Logged out) Header, go to Education " > Education < span class = " Bump-link-symbol float-right text-normal text-gray-light " >& rarr ; </ span ></ a ></ li >
</ ul >
</ div >
</ details >
</ li >
</ ul >
</ nav >
< div class = " d-lg-flex flex-items-center px-3 px-lg-0 text-center text-lg-left " >
< div class = " d-lg-flex mb-3 mb-lg-0 " >
< div class = " header-search flex-auto js-site-search position-relative flex-self-stretch flex-md-self-auto mb-3 mb-md-0 mr-0 mr-md-3 scoped-search site-scoped-search js-jump-to "
role = " combobox "
aria - owns = " jump-to-results "
aria - label = " Search or jump to "
aria - haspopup = " listbox "
aria - expanded = " false "
>
< div class = " position-relative " >
<!-- ' " ` --><!-- </textarea></xmp> --></option></form><form class= " js - site - search - form " role= " search " aria-label= " Site " data-flagged-in= " false " data-scope-type= " Repository " data-scope-id= " 149437753 " data-scoped-search-url= " / lbuchs / WebAuthn / search " data-owner-scoped-search-url= " / users / lbuchs / search " data-unscoped-search-url= " / search " action= " / lbuchs / WebAuthn / search " accept-charset= " UTF - 8 " method= " get " >
< label class = " form-control input-sm header-search-wrapper p-0 js-chromeless-input-container header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center " >
< input type = " text "
class = " form-control input-sm header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable "
data - hotkey = " s,/ "
name = " q "
value = " "
placeholder = " Search "
data - unscoped - placeholder = " Search GitHub "
data - scoped - placeholder = " Search "
autocapitalize = " off "
aria - autocomplete = " list "
aria - controls = " jump-to-results "
aria - label = " Search "
data - jump - to - suggestions - path = " /_graphql/GetSuggestedNavigationDestinations "
spellcheck = " false "
autocomplete = " off "
>
< input type = " hidden " data - csrf = " true " class = " js-data-jump-to-suggestions-path-csrf " value = " zUjaiZOouHy7sVPjvd6AoASla0iHuBSr0e3yU0K5eRH4kPloSavD1Kkyv/CvwhwcB5ZV/96AkuUeozlrZh2nYQ== " />
< input type = " hidden " class = " js-site-search-type-field " name = " type " >
< img src = " https://github.githubassets.com/images/search-key-slash.svg " alt = " " class = " mr-2 header-search-key-slash " >
< div class = " Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container " >
< ul class = " d-none js-jump-to-suggestions-template-container " >
< li class = " d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-suggestion " role = " option " >
< a tabindex = " -1 " class = " no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2 " href = " " data - item - type = " suggestion " >
< div class = " jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none " >
< svg height = " 16 " width = " 16 " class = " octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none " title = " Repository " aria - label = " Repository " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none " title = " Project " aria - label = " Project " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M1.75 0A1.75 1.75 0 000 1.75v12.5C0 15.216.784 16 1.75 16h12.5A1.75 1.75 0 0016 14.25V1.75A1.75 1.75 0 0014.25 0H1.75zM1.5 1.75a.25.25 0 01.25-.25h12.5a.25.25 0 01.25.25v12.5a.25.25 0 01-.25.25H1.75a.25.25 0 01-.25-.25V1.75zM11.75 3a.75.75 0 00-.75.75v7.5a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75zm-8.25.75a.75.75 0 011.5 0v5.5a.75.75 0 01-1.5 0v-5.5zM8 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 3z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none " title = " Search " aria - label = " Search " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M11.5 7a4.499 4.499 0 11-8.998 0A4.499 4.499 0 0111.5 7zm-.82 4.74a6 6 0 111.06-1.06l3.04 3.04a.75.75 0 11-1.06 1.06l-3.04-3.04z " ></ path ></ svg >
</ div >
< img class = " avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none " alt = " " aria - label = " Team " src = " " width = " 28 " height = " 28 " >
< div class = " jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target " >
</ div >
< div class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search " >
< span class = " js-jump-to-badge-search-text-default d-none " aria - label = " in this repository " >
In this repository
</ span >
< span class = " js-jump-to-badge-search-text-global d-none " aria - label = " in all of GitHub " >
All GitHub
</ span >
< span aria - hidden = " true " class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
< div aria - hidden = " true " class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump " >
Jump to
< span class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
</ a >
</ li >
</ ul >
< ul class = " d-none js-jump-to-no-results-template-container " >
< li class = " d-flex flex-justify-center flex-items-center f5 d-none js-jump-to-suggestion p-2 " >
< span class = " text-gray " > No suggested jump to results </ span >
</ li >
</ ul >
< ul id = " jump-to-results " role = " listbox " class = " p-0 m-0 js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container " >
< li class = " d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-scoped-search d-none " role = " option " >
< a tabindex = " -1 " class = " no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2 " href = " " data - item - type = " scoped_search " >
< div class = " jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none " >
< svg height = " 16 " width = " 16 " class = " octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none " title = " Repository " aria - label = " Repository " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none " title = " Project " aria - label = " Project " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M1.75 0A1.75 1.75 0 000 1.75v12.5C0 15.216.784 16 1.75 16h12.5A1.75 1.75 0 0016 14.25V1.75A1.75 1.75 0 0014.25 0H1.75zM1.5 1.75a.25.25 0 01.25-.25h12.5a.25.25 0 01.25.25v12.5a.25.25 0 01-.25.25H1.75a.25.25 0 01-.25-.25V1.75zM11.75 3a.75.75 0 00-.75.75v7.5a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75zm-8.25.75a.75.75 0 011.5 0v5.5a.75.75 0 01-1.5 0v-5.5zM8 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 3z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none " title = " Search " aria - label = " Search " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M11.5 7a4.499 4.499 0 11-8.998 0A4.499 4.499 0 0111.5 7zm-.82 4.74a6 6 0 111.06-1.06l3.04 3.04a.75.75 0 11-1.06 1.06l-3.04-3.04z " ></ path ></ svg >
</ div >
< img class = " avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none " alt = " " aria - label = " Team " src = " " width = " 28 " height = " 28 " >
< div class = " jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target " >
</ div >
< div class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search " >
< span class = " js-jump-to-badge-search-text-default d-none " aria - label = " in this repository " >
In this repository
</ span >
< span class = " js-jump-to-badge-search-text-global d-none " aria - label = " in all of GitHub " >
All GitHub
</ span >
< span aria - hidden = " true " class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
< div aria - hidden = " true " class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump " >
Jump to
< span class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
</ a >
</ li >
< li class = " d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-global-search d-none " role = " option " >
< a tabindex = " -1 " class = " no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2 " href = " " data - item - type = " global_search " >
< div class = " jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none " >
< svg height = " 16 " width = " 16 " class = " octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none " title = " Repository " aria - label = " Repository " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none " title = " Project " aria - label = " Project " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M1.75 0A1.75 1.75 0 000 1.75v12.5C0 15.216.784 16 1.75 16h12.5A1.75 1.75 0 0016 14.25V1.75A1.75 1.75 0 0014.25 0H1.75zM1.5 1.75a.25.25 0 01.25-.25h12.5a.25.25 0 01.25.25v12.5a.25.25 0 01-.25.25H1.75a.25.25 0 01-.25-.25V1.75zM11.75 3a.75.75 0 00-.75.75v7.5a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75zm-8.25.75a.75.75 0 011.5 0v5.5a.75.75 0 01-1.5 0v-5.5zM8 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 3z " ></ path ></ svg >
< svg height = " 16 " width = " 16 " class = " octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none " title = " Search " aria - label = " Search " viewBox = " 0 0 16 16 " version = " 1.1 " role = " img " >< path fill - rule = " evenodd " d = " M11.5 7a4.499 4.499 0 11-8.998 0A4.499 4.499 0 0111.5 7zm-.82 4.74a6 6 0 111.06-1.06l3.04 3.04a.75.75 0 11-1.06 1.06l-3.04-3.04z " ></ path ></ svg >
</ div >
< img class = " avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none " alt = " " aria - label = " Team " src = " " width = " 28 " height = " 28 " >
< div class = " jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target " >
</ div >
< div class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search " >
< span class = " js-jump-to-badge-search-text-default d-none " aria - label = " in this repository " >
In this repository
</ span >
< span class = " js-jump-to-badge-search-text-global d-none " aria - label = " in all of GitHub " >
All GitHub
</ span >
< span aria - hidden = " true " class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
< div aria - hidden = " true " class = " border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump " >
Jump to
< span class = " d-inline-block ml-1 v-align-middle " > ↵ </ span >
</ div >
</ a >
</ li >
</ ul >
</ div >
</ label >
</ form > </ div >
</ div >
</ div >
< a href = " /login?return_to=%2Flbuchs%2FWebAuthn%2Fblob%2Fmaster%2Fsrc%2FAttestation%2FFormat%2FU2f.php "
class = " HeaderMenu-link no-underline mr-3 "
data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 3cfd2894fb0d052d292731382a8442c1bef5d120299c4c1adcfef7574f6d3214 "
data - ga - click = " (Logged out) Header, clicked Sign in, text:sign-in " >
Sign & nbsp ; in
</ a >
< a href = " /join?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&source=header-repo&source_repo=lbuchs%2FWebAuthn "
class = " HeaderMenu-link d-inline-block no-underline border border-gray-dark rounded-1 px-2 py-1 "
data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 3cfd2894fb0d052d292731382a8442c1bef5d120299c4c1adcfef7574f6d3214 "
data - ga - click = " Sign up, click to sign up for account, ref_page:/<user-name>/<repo-name>/blob/show;ref_cta:Sign up;ref_loc:header logged out " >
Sign & nbsp ; up
</ a >
</ div >
</ div >
</ div >
</ header >
</ div >
< div id = " start-of-content " class = " show-on-focus " ></ div >
< div data - pjax - replace id = " js-flash-container " >
< template class = " js-flash-template " >
< div class = " flash flash-full { { className }} " >
< div class = " px-2 " >
< button class = " flash-close js-flash-close " type = " button " aria - label = " Dismiss this message " >
< svg class = " octicon octicon-x " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
< div > {{ message }} </ div >
</ div >
</ div >
</ template >
</ div >
< include - fragment class = " js-notification-shelf-include-fragment " data - base - src = " https://github.com/notifications/beta/shelf " ></ include - fragment >
< div
class = " application-main "
data - commit - hovercards - enabled
data - discussion - hovercards - enabled
data - issue - and - pr - hovercards - enabled
>
< div itemscope itemtype = " http://schema.org/SoftwareSourceCode " class = " " >
< main id = " js-repo-pjax-container " data - pjax - container >
< div class = " bg-gray-light pt-3 hide-full-screen mb-5 " >
< div class = " d-flex mb-3 px-3 px-md-4 px-lg-5 " >
< div class = " flex-auto min-width-0 width-fit mr-3 " >
< h1 class = " d-flex flex-wrap flex-items-center break-word f3 text-normal " >
< svg class = " octicon octicon-repo text-gray mr-2 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8zM5 12.25v3.25a.25.25 0 00.4.2l1.45-1.087a.25.25 0 01.3 0L8.6 15.7a.25.25 0 00.4-.2v-3.25a.25.25 0 00-.25-.25h-3.5a.25.25 0 00-.25.25z " ></ path ></ svg >
< span class = " author flex-self-stretch " itemprop = " author " >
< a class = " url fn " rel = " author " data - hovercard - type = " user " data - hovercard - url = " /users/lbuchs/hovercard " data - octo - click = " hovercard-link-click " data - octo - dimensions = " link_type:self " href = " /lbuchs " > lbuchs </ a >
</ span >
< span class = " mx-1 flex-self-stretch color-text-secondary " >/</ span >
< strong itemprop = " name " class = " mr-2 flex-self-stretch " >
< a data - pjax = " #js-repo-pjax-container " class = " " href = " /lbuchs/WebAuthn " > WebAuthn </ a >
</ strong >
</ h1 >
</ div >
< ul class = " pagehead-actions flex-shrink-0 d-none d-md-inline " style = " padding: 2px 0; " >
< li >
< a class = " tooltipped tooltipped-s btn btn-sm btn-with-count " aria - label = " You must be signed in to watch a repository " rel = " nofollow " data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 598d5928985ed1f030381dfc3bb71ab863948ce6a1e9bd0b182df6eaf085d392 " href = " /login?return_to=%2Flbuchs%2FWebAuthn " >
< svg class = " octicon octicon-eye " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.679 7.932c.412-.621 1.242-1.75 2.366-2.717C5.175 4.242 6.527 3.5 8 3.5c1.473 0 2.824.742 3.955 1.715 1.124.967 1.954 2.096 2.366 2.717a.119.119 0 010 .136c-.412.621-1.242 1.75-2.366 2.717C10.825 11.758 9.473 12.5 8 12.5c-1.473 0-2.824-.742-3.955-1.715C2.92 9.818 2.09 8.69 1.679 8.068a.119.119 0 010-.136zM8 2c-1.981 0-3.67.992-4.933 2.078C1.797 5.169.88 6.423.43 7.1a1.619 1.619 0 000 1.798c.45.678 1.367 1.932 2.637 3.024C4.329 13.008 6.019 14 8 14c1.981 0 3.67-.992 4.933-2.078 1.27-1.091 2.187-2.345 2.637-3.023a1.619 1.619 0 000-1.798c-.45-.678-1.367-1.932-2.637-3.023C11.671 2.992 9.981 2 8 2zm0 8a2 2 0 100-4 2 2 0 000 4z " ></ path ></ svg >
Watch
</ a > < a class = " social-count " href = " /lbuchs/WebAuthn/watchers "
aria - label = " 19 users are watching this repository " >
19
</ a >
</ li >
< li >
< a class = " btn btn-sm btn-with-count tooltipped tooltipped-s " aria - label = " You must be signed in to star a repository " rel = " nofollow " data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"star button","repository_id":149437753,"auth_type":"LOG_IN","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " a7420bb34426895414d50cee42729e8f317b98fd52602d3e35eb79262f2d0d1e " href = " /login?return_to=%2Flbuchs%2FWebAuthn " >
< svg class = " octicon octicon-star v-align-text-bottom mr-1 " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z " ></ path ></ svg >
< span >
Star
</ span ></ a >
< a class = " social-count js-social-count " href = " /lbuchs/WebAuthn/stargazers "
aria - label = " 85 users starred this repository " >
85
</ a >
</ li >
< li >
< a class = " btn btn-sm btn-with-count tooltipped tooltipped-s " aria - label = " You must be signed in to fork a repository " rel = " nofollow " data - hydro - click = " { "event_type":"authentication.click","payload": { "location_in_page":"repo details fork button","repository_id":149437753,"auth_type":"LOG_IN","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 9c144c74f6c62b1b64fba74b857324d9e810ba028560e6ec736bf01ed5ded1f4 " href = " /login?return_to=%2Flbuchs%2FWebAuthn " >
< svg class = " octicon octicon-repo-forked " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.251 2.251 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878zm3.75 7.378a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm3-8.75a.75.75 0 100-1.5.75.75 0 000 1.5z " ></ path ></ svg >
Fork
</ a >
< a href = " /lbuchs/WebAuthn/network/members " class = " social-count "
aria - label = " 19 users forked this repository " >
19
</ a >
</ li >
</ ul >
</ div >
< nav aria - label = " Repository " data - pjax = " #js-repo-pjax-container " class = " js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5 bg-gray-light " >
< ul class = " UnderlineNav-body list-style-none " >
< li class = " d-flex " >
< a class = " js-selected-navigation-item selected UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i0code-tab " data - hotkey = " g c " data - ga - click = " Repository, Navigation click, Code tab " aria - current = " page " data - selected - links = " repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments /lbuchs/WebAuthn " href = " /lbuchs/WebAuthn " >
< svg class = " octicon octicon-code UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M4.72 3.22a.75.75 0 011.06 1.06L2.06 8l3.72 3.72a.75.75 0 11-1.06 1.06L.47 8.53a.75.75 0 010-1.06l4.25-4.25zm6.56 0a.75.75 0 10-1.06 1.06L13.94 8l-3.72 3.72a.75.75 0 101.06 1.06l4.25-4.25a.75.75 0 000-1.06l-4.25-4.25z " ></ path ></ svg >
< span data - content = " Code " > Code </ span >
< span title = " Not available " class = " Counter " ></ span >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i1issues-tab " data - hotkey = " g i " data - ga - click = " Repository, Navigation click, Issues tab " data - selected - links = " repo_issues repo_labels repo_milestones /lbuchs/WebAuthn/issues " href = " /lbuchs/WebAuthn/issues " >
< svg class = " octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM0 8a8 8 0 1116 0A8 8 0 010 8zm9 3a1 1 0 11-2 0 1 1 0 012 0zm-.25-6.25a.75.75 0 00-1.5 0v3.5a.75.75 0 001.5 0v-3.5z " ></ path ></ svg >
< span data - content = " Issues " > Issues </ span >
< span title = " 8 " class = " Counter " > 8 </ span >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i2pull-requests-tab " data - hotkey = " g p " data - ga - click = " Repository, Navigation click, Pull requests tab " data - selected - links = " repo_pulls checks /lbuchs/WebAuthn/pulls " href = " /lbuchs/WebAuthn/pulls " >
< svg class = " octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M7.177 3.073L9.573.677A.25.25 0 0110 .854v4.792a.25.25 0 01-.427.177L7.177 3.427a.25.25 0 010-.354zM3.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122v5.256a2.251 2.251 0 11-1.5 0V5.372A2.25 2.25 0 011.5 3.25zM11 2.5h-1V4h1a1 1 0 011 1v5.628a2.251 2.251 0 101.5 0V5A2.5 2.5 0 0011 2.5zm1 10.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0zM3.75 12a.75.75 0 100 1.5.75.75 0 000-1.5z " ></ path ></ svg >
< span data - content = " Pull requests " > Pull requests </ span >
< span title = " 0 " hidden = " hidden " class = " Counter " > 0 </ span >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i3actions-tab " data - hotkey = " g a " data - ga - click = " Repository, Navigation click, Actions tab " data - selected - links = " repo_actions /lbuchs/WebAuthn/actions " href = " /lbuchs/WebAuthn/actions " >
< svg class = " octicon octicon-play UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.5 8a6.5 6.5 0 1113 0 6.5 6.5 0 01-13 0zM8 0a8 8 0 100 16A8 8 0 008 0zM6.379 5.227A.25.25 0 006 5.442v5.117a.25.25 0 00.379.214l4.264-2.559a.25.25 0 000-.428L6.379 5.227z " ></ path ></ svg >
< span data - content = " Actions " > Actions </ span >
< span title = " Not available " class = " Counter " ></ span >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i4projects-tab " data - hotkey = " g b " data - ga - click = " Repository, Navigation click, Projects tab " data - selected - links = " repo_projects new_repo_project repo_project /lbuchs/WebAuthn/projects " href = " /lbuchs/WebAuthn/projects " >
< svg class = " octicon octicon-project UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.75 0A1.75 1.75 0 000 1.75v12.5C0 15.216.784 16 1.75 16h12.5A1.75 1.75 0 0016 14.25V1.75A1.75 1.75 0 0014.25 0H1.75zM1.5 1.75a.25.25 0 01.25-.25h12.5a.25.25 0 01.25.25v12.5a.25.25 0 01-.25.25H1.75a.25.25 0 01-.25-.25V1.75zM11.75 3a.75.75 0 00-.75.75v7.5a.75.75 0 001.5 0v-7.5a.75.75 0 00-.75-.75zm-8.25.75a.75.75 0 011.5 0v5.5a.75.75 0 01-1.5 0v-5.5zM8 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 3z " ></ path ></ svg >
< span data - content = " Projects " > Projects </ span >
< span title = " 0 " hidden = " hidden " class = " Counter " > 0 </ span >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i5security-tab " data - hotkey = " g s " data - ga - click = " Repository, Navigation click, Security tab " data - selected - links = " security overview alerts policy token_scanning code_scanning /lbuchs/WebAuthn/security " href = " /lbuchs/WebAuthn/security " >
< svg class = " octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M7.467.133a1.75 1.75 0 011.066 0l5.25 1.68A1.75 1.75 0 0115 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.7 1.7 0 01-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 011.217-1.667l5.25-1.68zm.61 1.429a.25.25 0 00-.153 0l-5.25 1.68a.25.25 0 00-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.2.2 0 00.154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.25.25 0 00-.174-.237l-5.25-1.68zM9 10.5a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.75a.75.75 0 10-1.5 0v3a.75.75 0 001.5 0v-3z " ></ path ></ svg >
< span data - content = " Security " > Security </ span >
< include - fragment src = " /lbuchs/WebAuthn/security/overall-count " accept = " text/fragment+html " ></ include - fragment >
</ a >
</ li >
< li class = " d-flex " >
< a class = " js-selected-navigation-item UnderlineNav-item hx_underlinenav-item no-wrap js-responsive-underlinenav-item " data - tab - item = " i6insights-tab " data - ga - click = " Repository, Navigation click, Insights tab " data - selected - links = " repo_graphs repo_contributors dependency_graph dependabot_updates pulse people /lbuchs/WebAuthn/pulse " href = " /lbuchs/WebAuthn/pulse " >
< svg class = " octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.5 1.75a.75.75 0 00-1.5 0v12.5c0 .414.336.75.75.75h14.5a.75.75 0 000-1.5H1.5V1.75zm14.28 2.53a.75.75 0 00-1.06-1.06L10 7.94 7.53 5.47a.75.75 0 00-1.06 0L3.22 8.72a.75.75 0 001.06 1.06L7 7.06l2.47 2.47a.75.75 0 001.06 0l5.25-5.25z " ></ path ></ svg >
< span data - content = " Insights " > Insights </ span >
< span title = " Not available " class = " Counter " ></ span >
</ a >
</ li >
</ ul > < div class = " position-absolute right-0 pr-3 pr-md-4 pr-lg-5 js-responsive-underlinenav-overflow " style = " visibility:hidden; " >
< details class = " details-overlay details-reset position-relative " >
< summary role = " button " >
< div class = " UnderlineNav-item mr-0 border-0 " >
< svg class = " octicon octicon-kebab-horizontal " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path d = " M8 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm13 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3z " ></ path ></ svg >
< span class = " sr-only " > More </ span >
</ div >
</ summary > < div >
< details - menu role = " menu " class = " dropdown-menu dropdown-menu-sw " >
< ul >
< li data - menu - item = " i0code-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn " href = " /lbuchs/WebAuthn " >
Code
</ a > </ li >
< li data - menu - item = " i1issues-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/issues " href = " /lbuchs/WebAuthn/issues " >
Issues
</ a > </ li >
< li data - menu - item = " i2pull-requests-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/pulls " href = " /lbuchs/WebAuthn/pulls " >
Pull requests
</ a > </ li >
< li data - menu - item = " i3actions-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/actions " href = " /lbuchs/WebAuthn/actions " >
Actions
</ a > </ li >
< li data - menu - item = " i4projects-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/projects " href = " /lbuchs/WebAuthn/projects " >
Projects
</ a > </ li >
< li data - menu - item = " i5security-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/security " href = " /lbuchs/WebAuthn/security " >
Security
</ a > </ li >
< li data - menu - item = " i6insights-tab " hidden >
< a role = " menuitem " class = " js-selected-navigation-item dropdown-item " data - selected - links = " /lbuchs/WebAuthn/pulse " href = " /lbuchs/WebAuthn/pulse " >
Insights
</ a > </ li >
</ ul >
</ details - menu >
</ div ></ details > </ div >
</ nav >
</ div >
< div class = " container-xl clearfix new-discussion-timeline px-3 px-md-4 px-lg-5 " >
< div class = " repository-content " >
< a class = " d-none js-permalink-shortcut " data - hotkey = " y " href = " /lbuchs/WebAuthn/blob/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php " > Permalink </ a >
<!-- blob contrib key : blob_contributors : v22 : 362 c2f001e0a021defec58b1d88f2bcc162f20859abcd28e71ea63851dfca542 -->
< div class = " d-flex flex-items-start flex-shrink-0 pb-3 flex-wrap flex-md-nowrap flex-justify-between flex-md-justify-start " >
< div class = " position-relative " >
< details class = " details-reset details-overlay mr-0 mb-0 " id = " branch-select-menu " >
< summary class = " btn css-truncate "
data - hotkey = " w "
title = " Switch branches or tags " >
< svg class = " octicon octicon-git-branch text-gray " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M11.75 2.5a.75.75 0 100 1.5.75.75 0 000-1.5zm-2.25.75a2.25 2.25 0 113 2.122V6A2.5 2.5 0 0110 8.5H6a1 1 0 00-1 1v1.128a2.251 2.251 0 11-1.5 0V5.372a2.25 2.25 0 111.5 0v1.836A2.492 2.492 0 016 7h4a1 1 0 001-1v-.628A2.25 2.25 0 019.5 3.25zM4.25 12a.75.75 0 100 1.5.75.75 0 000-1.5zM3.5 3.25a.75.75 0 111.5 0 .75.75 0 01-1.5 0z " ></ path ></ svg >
< span class = " css-truncate-target " data - menu - button > master </ span >
< span class = " dropdown-caret " ></ span >
</ summary >
< details - menu class = " SelectMenu SelectMenu--hasFilter " src = " /lbuchs/WebAuthn/refs/master/src/Attestation/Format/U2f.php?source_action=show&source_controller=blob " preload >
< div class = " SelectMenu-modal " >
< include - fragment class = " SelectMenu-loading " aria - label = " Menu is loading " >
< svg class = " octicon octicon-octoface anim-pulse " height = " 32 " viewBox = " 0 0 24 24 " version = " 1.1 " width = " 32 " aria - hidden = " true " >< path d = " M7.75 11c-.69 0-1.25.56-1.25 1.25v1.5a1.25 1.25 0 102.5 0v-1.5C9 11.56 8.44 11 7.75 11zm1.27 4.5a.469.469 0 01.48-.5h5a.47.47 0 01.48.5c-.116 1.316-.759 2.5-2.98 2.5s-2.864-1.184-2.98-2.5zm7.23-4.5c-.69 0-1.25.56-1.25 1.25v1.5a1.25 1.25 0 102.5 0v-1.5c0-.69-.56-1.25-1.25-1.25z " ></ path >< path fill - rule = " evenodd " d = " M21.255 3.82a1.725 1.725 0 00-2.141-1.195c-.557.16-1.406.44-2.264.866-.78.386-1.647.93-2.293 1.677A18.442 18.442 0 0012 5c-.93 0-1.784.059-2.569.17-.645-.74-1.505-1.28-2.28-1.664a13.876 13.876 0 00-2.265-.866 1.725 1.725 0 00-2.141 1.196 23.645 23.645 0 00-.69 3.292c-.125.97-.191 2.07-.066 3.112C1.254 11.882 1 13.734 1 15.527 1 19.915 3.13 23 12 23c8.87 0 11-3.053 11-7.473 0-1.794-.255-3.647-.99-5.29.127-1.046.06-2.15-.066-3.125a23.652 23.652 0 00-.689-3.292zM20.5 14c.5 3.5-1.5 6.5-8.5 6.5s-9-3-8.5-6.5c.583-4 3-6 8.5-6s7.928 2 8.5 6z " ></ path ></ svg >
</ include - fragment >
</ div >
</ details - menu >
</ details >
</ div >
< h2 id = " blob-path " class = " breadcrumb flex-auto min-width-0 text-normal mx-0 mx-md-3 width-full width-md-auto flex-order-1 flex-md-order-none mt-3 mt-md-0 " >
< span class = " js-repo-root text-bold " >< span class = " js-path-segment d-inline-block wb-break-all " >< a data - pjax = " true " href = " /lbuchs/WebAuthn " >< span > WebAuthn </ span ></ a ></ span ></ span >< span class = " separator " >/</ span >< span class = " js-path-segment d-inline-block wb-break-all " >< a data - pjax = " true " href = " /lbuchs/WebAuthn/tree/master/src " >< span > src </ span ></ a ></ span >< span class = " separator " >/</ span >< span class = " js-path-segment d-inline-block wb-break-all " >< a data - pjax = " true " href = " /lbuchs/WebAuthn/tree/master/src/Attestation " >< span > Attestation </ span ></ a ></ span >< span class = " separator " >/</ span >< span class = " js-path-segment d-inline-block wb-break-all " >< a data - pjax = " true " href = " /lbuchs/WebAuthn/tree/master/src/Attestation/Format " >< span > Format </ span ></ a ></ span >< span class = " separator " >/</ span >< strong class = " final-path " > U2f . php </ strong >
< span class = " separator " >/</ span >< details class = " details-reset details-overlay d-inline " id = " jumpto-symbol-select-menu " >
< summary class = " btn-link link-gray css-truncate " aria - haspopup = " true " data - hotkey = " r " data - hydro - click = " { "event_type":"code_navigation.click_on_blob_definitions","payload": { "action":"click_on_blob_definitions","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " ee69c967beb835fc4d88a91ec7718da59239a1c95613365bbff302162d0d1a1f " >
< svg class = " octicon octicon-code " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M4.72 3.22a.75.75 0 011.06 1.06L2.06 8l3.72 3.72a.75.75 0 11-1.06 1.06L.47 8.53a.75.75 0 010-1.06l4.25-4.25zm6.56 0a.75.75 0 10-1.06 1.06L13.94 8l-3.72 3.72a.75.75 0 101.06 1.06l4.25-4.25a.75.75 0 000-1.06l-4.25-4.25z " ></ path ></ svg >
< span data - menu - button > Jump to </ span >
< span class = " dropdown-caret " ></ span >
</ summary >
< details - menu class = " SelectMenu SelectMenu--hasFilter " role = " menu " >
< div class = " SelectMenu-modal " >
< header class = " SelectMenu-header " >
< span class = " SelectMenu-title " > Code definitions </ span >
< button class = " SelectMenu-closeButton " type = " button " data - toggle - for = " jumpto-symbol-select-menu " >
< svg aria - label = " Close menu " class = " octicon octicon-x " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " role = " img " >< path fill - rule = " evenodd " d = " M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
</ header >
< div class = " SelectMenu-filter " >
< input
class = " SelectMenu-input form-control js-filterable-field "
id = " jumpto-symbols-filter-field "
type = " text "
autocomplete = " off "
spellcheck = " false "
autofocus
placeholder = " Filter definitions "
aria - label = " Filter definitions " >
</ div >
< div class = " SelectMenu-list " >
< div data - filterable - for = " jumpto-symbols-filter-field " data - filterable - type = " substring " >
< a class = " SelectMenu-item d-flex flex-justify-between css-truncate " role = " menuitemradio " aria - checked = " false " rel = " nofollow " data - hydro - click = " { "event_type":"code_navigation.navigate_to_blob_definition","payload": { "action":"navigate_to_blob_definition","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 09e4c2798380756490d8fe4e59d22d3ae7cb1c2ab57d684941467baf3ecbcc0e " href = " /lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php#L9 " >
< svg class = " octicon octicon-check SelectMenu-icon SelectMenu-icon--check " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z " ></ path ></ svg >
< span class = " flex-auto css-truncate-target " data - menu - button - text > U2f </ span >
< span class = " flex-auto d-flex flex-justify-end " > Class </ span >
</ a > < a class = " SelectMenu-item d-flex flex-justify-between css-truncate " role = " menuitemradio " aria - checked = " false " rel = " nofollow " data - hydro - click = " { "event_type":"code_navigation.navigate_to_blob_definition","payload": { "action":"navigate_to_blob_definition","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 09e4c2798380756490d8fe4e59d22d3ae7cb1c2ab57d684941467baf3ecbcc0e " href = " /lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php#L14 " >
< svg class = " octicon octicon-check SelectMenu-icon SelectMenu-icon--check " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z " ></ path ></ svg >
< span class = " flex-auto css-truncate-target " data - menu - button - text > __construct </ span >
< span class = " flex-auto d-flex flex-justify-end " > Function </ span >
</ a > < a class = " SelectMenu-item d-flex flex-justify-between css-truncate " role = " menuitemradio " aria - checked = " false " rel = " nofollow " data - hydro - click = " { "event_type":"code_navigation.navigate_to_blob_definition","payload": { "action":"navigate_to_blob_definition","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 09e4c2798380756490d8fe4e59d22d3ae7cb1c2ab57d684941467baf3ecbcc0e " href = " /lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php#L45 " >
< svg class = " octicon octicon-check SelectMenu-icon SelectMenu-icon--check " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z " ></ path ></ svg >
< span class = " flex-auto css-truncate-target " data - menu - button - text > getCertificatePem </ span >
< span class = " flex-auto d-flex flex-justify-end " > Function </ span >
</ a > < a class = " SelectMenu-item d-flex flex-justify-between css-truncate " role = " menuitemradio " aria - checked = " false " rel = " nofollow " data - hydro - click = " { "event_type":"code_navigation.navigate_to_blob_definition","payload": { "action":"navigate_to_blob_definition","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 09e4c2798380756490d8fe4e59d22d3ae7cb1c2ab57d684941467baf3ecbcc0e " href = " /lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php#L55 " >
< svg class = " octicon octicon-check SelectMenu-icon SelectMenu-icon--check " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z " ></ path ></ svg >
< span class = " flex-auto css-truncate-target " data - menu - button - text > validateAttestation </ span >
< span class = " flex-auto d-flex flex-justify-end " > Function </ span >
</ a > < a class = " SelectMenu-item d-flex flex-justify-between css-truncate " role = " menuitemradio " aria - checked = " false " rel = " nofollow " data - hydro - click = " { "event_type":"code_navigation.navigate_to_blob_definition","payload": { "action":"navigate_to_blob_definition","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 09e4c2798380756490d8fe4e59d22d3ae7cb1c2ab57d684941467baf3ecbcc0e " href = " /lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php#L81 " >
< svg class = " octicon octicon-check SelectMenu-icon SelectMenu-icon--check " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z " ></ path ></ svg >
< span class = " flex-auto css-truncate-target " data - menu - button - text > validateRootCertificate </ span >
< span class = " flex-auto d-flex flex-justify-end " > Function </ span >
</ a > </ div >
</ div >
< footer class = " SelectMenu-footer " >
< div class = " d-flex flex-justify-between " >
Code navigation index up - to - date
< svg class = " octicon octicon-dot-fill text-green " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8 4a4 4 0 100 8 4 4 0 000-8z " ></ path ></ svg >
</ div >
</ footer >
</ div >
</ details - menu >
</ details >
</ h2 >
< a href = " /lbuchs/WebAuthn/find/master "
class = " js-pjax-capture-input btn mr-2 d-none d-md-block "
data - pjax
data - hotkey = " t " >
Go to file
</ a >
< details id = " blob-more-options-details " class = " details-overlay details-reset position-relative " >
< summary role = " button " type = " button " class = " btn " >
< svg aria - label = " More options " class = " octicon octicon-kebab-horizontal " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " role = " img " >< path d = " M8 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm13 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3z " ></ path ></ svg >
</ summary > < div >
< ul class = " dropdown-menu dropdown-menu-sw " >
< li class = " d-block d-md-none " >
< a class = " dropdown-item d-flex flex-items-baseline " data - hydro - click = " { "event_type":"repository.click","payload": { "target":"FIND_FILE_BUTTON","repository_id":149437753,"originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} " data - hydro - click - hmac = " 584a2d97f3fc6b2c52184e8813afb9d4e785ab04da743d5288e40cf51f994efb " data - ga - click = " Repository, find file, location:repo overview " data - hotkey = " t " data - pjax = " true " href = " /lbuchs/WebAuthn/find/master " >
< span class = " flex-auto " > Go to file </ span >
< span class = " text-small text-gray " aria - hidden = " true " > T </ span >
</ a > </ li >
< li data - toggle - for = " blob-more-options-details " >
< button type = " button " data - toggle - for = " jumpto-line-details-dialog " class = " btn-link dropdown-item " >
< span class = " d-flex flex-items-baseline " >
< span class = " flex-auto " > Go to line </ span >
< span class = " text-small text-gray " aria - hidden = " true " > L </ span >
</ span >
</ button >
</ li >
< li data - toggle - for = " blob-more-options-details " >
< button type = " button " data - toggle - for = " jumpto-symbol-select-menu " class = " btn-link dropdown-item " >
< span class = " d-flex flex-items-baseline " >
< span class = " flex-auto " > Go to definition </ span >
< span class = " text-small text-gray " aria - hidden = " true " > R </ span >
</ span >
</ button >
</ li >
< li class = " dropdown-divider " role = " none " ></ li >
< li >
< clipboard - copy value = " src/Attestation/Format/U2f.php " class = " dropdown-item cursor-pointer " data - toggle - for = " blob-more-options-details " >
Copy path
</ clipboard - copy >
</ li >
</ ul >
</ div ></ details > </ div >
< div class = " Box d-flex flex-column flex-shrink-0 mb-3 " >
< div class = " Box-header Box-header--blue Details js-details-container " >
< div class = " d-flex flex-items-center " >
< span class = " flex-shrink-0 ml-n1 mr-n1 mt-n1 mb-n1 " >
< a rel = " author " data - skip - pjax = " true " data - hovercard - type = " user " data - hovercard - url = " /users/lbuchs/hovercard " data - octo - click = " hovercard-link-click " data - octo - dimensions = " link_type:self " href = " /lbuchs " >< img class = " avatar avatar-user " src = " https://avatars3.githubusercontent.com/u/37619779?s=48&v=4 " width = " 24 " height = " 24 " alt = " @lbuchs " /></ a >
</ span >
< div class = " flex-1 d-flex flex-items-center ml-3 min-width-0 " >
< div class = " css-truncate css-truncate-overflow " >
< a class = " text-bold link-gray-dark " rel = " author " data - hovercard - type = " user " data - hovercard - url = " /users/lbuchs/hovercard " data - octo - click = " hovercard-link-click " data - octo - dimensions = " link_type:self " href = " /lbuchs " > lbuchs </ a >
< span >
< a data - pjax = " true " title = " Bugfix u2f " class = " link-gray " href = " /lbuchs/WebAuthn/commit/e62a6615894daaf061f91bc274064c5773074f81 " > Bugfix u2f </ a >
</ span >
</ div >
< span class = " ml-2 " >
< include - fragment accept = " text/fragment+html " src = " /lbuchs/WebAuthn/commit/e62a6615894daaf061f91bc274064c5773074f81/rollup?direction=e " class = " d-inline " ></ include - fragment >
</ span >
</ div >
< div class = " ml-3 d-flex flex-shrink-0 flex-items-center flex-justify-end text-gray no-wrap " >
< span class = " d-none d-md-inline " >
< span > Latest commit </ span >
< a class = " text-small text-mono link-gray " href = " /lbuchs/WebAuthn/commit/e62a6615894daaf061f91bc274064c5773074f81 " data - pjax > e62a661 </ a >
< span itemprop = " dateModified " >< relative - time datetime = " 2021-01-04T09:21:11Z " class = " no-wrap " > Jan 4 , 2021 </ relative - time ></ span >
</ span >
< a data - pjax href = " /lbuchs/WebAuthn/commits/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php " class = " ml-3 no-wrap link-gray-dark no-underline " >
< svg class = " octicon octicon-history text-gray " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.643 3.143L.427 1.927A.25.25 0 000 2.104V5.75c0 .138.112.25.25.25h3.646a.25.25 0 00.177-.427L2.715 4.215a6.5 6.5 0 11-1.18 4.458.75.75 0 10-1.493.154 8.001 8.001 0 101.6-5.684zM7.75 4a.75.75 0 01.75.75v2.992l2.028.812a.75.75 0 01-.557 1.392l-2.5-1A.75.75 0 017 8.25v-3.5A.75.75 0 017.75 4z " ></ path ></ svg >
< span class = " d-none d-sm-inline " >
< strong > History </ strong >
</ span >
</ a >
</ div >
</ div >
</ div >
< div class = " Box-body d-flex flex-items-center flex-auto border-bottom-0 flex-wrap " >
< details class = " details-reset details-overlay details-overlay-dark lh-default text-gray-dark float-left mr-3 " id = " blob_contributors_box " >
< summary class = " link-gray-dark " >
< svg class = " octicon octicon-people text-gray " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M5.5 3.5a2 2 0 100 4 2 2 0 000-4zM2 5.5a3.5 3.5 0 115.898 2.549 5.507 5.507 0 013.034 4.084.75.75 0 11-1.482.235 4.001 4.001 0 00-7.9 0 .75.75 0 01-1.482-.236A5.507 5.507 0 013.102 8.05 3.49 3.49 0 012 5.5zM11 4a.75.75 0 100 1.5 1.5 1.5 0 01.666 2.844.75.75 0 00-.416.672v.352a.75.75 0 00.574.73c1.2.289 2.162 1.2 2.522 2.372a.75.75 0 101.434-.44 5.01 5.01 0 00-2.56-3.012A3 3 0 0011 4z " ></ path ></ svg >
< strong > 2 </ strong >
contributors
</ summary >
< details - dialog
class = " Box Box--overlay d-flex flex-column anim-fade-in fast "
aria - label = " Users who have contributed to this file "
src = " /lbuchs/WebAuthn/contributors-list/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php " preload >
< div class = " Box-header " >
< button class = " Box-btn-octicon btn-octicon float-right " type = " button " aria - label = " Close dialog " data - close - dialog >
< svg class = " octicon octicon-x " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
< h3 class = " Box-title " >
Users who have contributed to this file
</ h3 >
</ div >
< include - fragment >
< svg viewBox = " 0 0 16 16 " fill = " none " style = " box-sizing: content-box; color: var(--color-icon-primary); " class = " my-3 mx-auto d-block " width = " 32 " height = " 32 " >
< circle cx = " 8 " cy = " 8 " r = " 7 " stroke = " currentColor " stroke - opacity = " 0.25 " stroke - width = " 2 " vector - effect = " non-scaling-stroke " />
< path d = " M15 8a7.002 7.002 0 00-7-7 " stroke = " currentColor " stroke - width = " 2 " stroke - linecap = " round " vector - effect = " non-scaling-stroke " >
< animateTransform attributeName = " transform " type = " rotate " from = " 0 8 8 " to = " 360 8 8 " dur = " 1s " repeatCount = " indefinite " />
</ path >
</ svg >
</ include - fragment >
</ details - dialog >
</ details >
< span class = " " >
< a class = " avatar-link " data - hovercard - type = " user " data - hovercard - url = " /users/lbuchs/hovercard " data - octo - click = " hovercard-link-click " data - octo - dimensions = " link_type:self " href = " /lbuchs/WebAuthn/commits/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php?author=lbuchs " >
< img class = " avatar mr-2 avatar-user " src = " https://avatars3.githubusercontent.com/u/37619779?s=48&v=4 " width = " 24 " height = " 24 " alt = " @lbuchs " />
</ a > < a class = " avatar-link " data - hovercard - type = " user " data - hovercard - url = " /users/BenjaminHae/hovercard " data - octo - click = " hovercard-link-click " data - octo - dimensions = " link_type:self " href = " /lbuchs/WebAuthn/commits/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php?author=BenjaminHae " >
< img class = " avatar mr-2 avatar-user " src = " https://avatars0.githubusercontent.com/u/7386033?s=48&v=4 " width = " 24 " height = " 24 " alt = " @BenjaminHae " />
</ a >
</ span >
</ div >
</ div >
< div class = " Box mt-3 position-relative
" >
< div class = " Box-header py-2 d-flex flex-column flex-shrink-0 flex-md-row flex-md-items-center " >
< div class = " text-mono f6 flex-auto pr-3 flex-order-2 flex-md-order-1 mt-2 mt-md-0 " >
93 lines ( 74 sloc )
< span class = " file-info-divider " ></ span >
3.43 KB
</ div >
< div class = " d-flex py-1 py-md-0 flex-auto flex-order-1 flex-md-order-2 flex-sm-grow-0 flex-justify-between " >
< div class = " BtnGroup " >
< a href = " /lbuchs/WebAuthn/raw/master/src/Attestation/Format/U2f.php " id = " raw-url " role = " button " class = " btn btn-sm BtnGroup-item " > Raw </ a >
< a href = " /lbuchs/WebAuthn/blame/master/src/Attestation/Format/U2f.php " data - hotkey = " b " role = " button " class = " btn js-update-url-with-hash btn-sm BtnGroup-item " > Blame </ a >
</ div >
< div >
< a class = " btn-octicon tooltipped tooltipped-nw js-remove-unless-platform "
data - platforms = " windows,mac "
href = " https://desktop.github.com "
aria - label = " Open this file in GitHub Desktop "
data - ga - click = " Repository, open with desktop " >
< svg class = " octicon octicon-device-desktop " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M1.75 2.5h12.5a.25.25 0 01.25.25v7.5a.25.25 0 01-.25.25H1.75a.25.25 0 01-.25-.25v-7.5a.25.25 0 01.25-.25zM14.25 1H1.75A1.75 1.75 0 000 2.75v7.5C0 11.216.784 12 1.75 12h3.727c-.1 1.041-.52 1.872-1.292 2.757A.75.75 0 004.75 16h6.5a.75.75 0 00.565-1.243c-.772-.885-1.193-1.716-1.292-2.757h3.727A1.75 1.75 0 0016 10.25v-7.5A1.75 1.75 0 0014.25 1zM9.018 12H6.982a5.72 5.72 0 01-.765 2.5h3.566a5.72 5.72 0 01-.765-2.5z " ></ path ></ svg >
</ a >
< a href = " /login?return_to=%2Flbuchs%2FWebAuthn%2Fblob%2Fmaster%2Fsrc%2FAttestation%2FFormat%2FU2f.php " class = " btn-octicon disabled tooltipped tooltipped-nw "
aria - label = " You must be signed in to make or propose changes " >
< svg class = " octicon octicon-pencil " height = " 16 " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 000-.354l-1.086-1.086zM11.189 6.25L9.75 4.81l-6.286 6.287a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.249.249 0 00.108-.064l6.286-6.286z " ></ path ></ svg >
</ a >
< a href = " /login?return_to=%2Flbuchs%2FWebAuthn%2Fblob%2Fmaster%2Fsrc%2FAttestation%2FFormat%2FU2f.php " class = " btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw "
aria - label = " You must be signed in to make or propose changes " >
< svg class = " octicon octicon-trashcan " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M6.5 1.75a.25.25 0 01.25-.25h2.5a.25.25 0 01.25.25V3h-3V1.75zm4.5 0V3h2.25a.75.75 0 010 1.5H2.75a.75.75 0 010-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75zM4.496 6.675a.75.75 0 10-1.492.15l.66 6.6A1.75 1.75 0 005.405 15h5.19c.9 0 1.652-.681 1.741-1.576l.66-6.6a.75.75 0 00-1.492-.149l-.66 6.6a.25.25 0 01-.249.225h-5.19a.25.25 0 01-.249-.225l-.66-6.6z " ></ path ></ svg >
</ a >
</ div >
</ div >
</ div >
< div itemprop = " text " class = " Box-body p-0 blob-wrapper data type-php gist-border-0 " >
< table class = " highlight tab-size js-file-line-container " data - tab - size = " 8 " data - paste - markdown - skip >
< tr >
< td id = " L1 " class = " blob-num js-line-number " data - line - number = " 1 " ></ td >
< td id = " LC1 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - ent >& lt ; ? php </ span ></ td >
</ tr >
< tr >
< td id = " L2 " class = " blob-num js-line-number " data - line - number = " 2 " ></ td >
< td id = " LC2 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L3 " class = " blob-num js-line-number " data - line - number = " 3 " ></ td >
< td id = " LC3 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L4 " class = " blob-num js-line-number " data - line - number = " 4 " ></ td >
< td id = " LC4 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - k > namespace </ span > lbuchs\ < span class = pl - v > WebAuthn </ span > \ < span class = pl - v > Attestation </ span > \ < span class = pl - v > Format </ span > ; </ td >
</ tr >
< tr >
< td id = " L5 " class = " blob-num js-line-number " data - line - number = " 5 " ></ td >
< td id = " LC5 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - k > use </ span > lbuchs\ < span class = pl - v > WebAuthn </ span > \ < span class = pl - v > Attestation </ span > \ < span class = pl - v > AuthenticatorData </ span > ; </ td >
</ tr >
< tr >
< td id = " L6 " class = " blob-num js-line-number " data - line - number = " 6 " ></ td >
< td id = " LC6 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - k > use </ span > lbuchs\ < span class = pl - v > WebAuthn </ span > \ < span class = pl - v > WebAuthnException </ span > ; </ td >
</ tr >
< tr >
< td id = " L7 " class = " blob-num js-line-number " data - line - number = " 7 " ></ td >
< td id = " LC7 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - k > use </ span > lbuchs\ < span class = pl - v > WebAuthn </ span > \ < span class = pl - v > Binary </ span > \ < span class = pl - v > ByteBuffer </ span > ; </ td >
</ tr >
< tr >
< td id = " L8 " class = " blob-num js-line-number " data - line - number = " 8 " ></ td >
< td id = " LC8 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L9 " class = " blob-num js-line-number " data - line - number = " 9 " ></ td >
< td id = " LC9 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - k > class </ span > < span class = pl - v > U2f </ span > < span class = pl - k > extends </ span > < span class = pl - v > FormatBase </ span > { </ td >
</ tr >
< tr >
< td id = " L10 " class = " blob-num js-line-number " data - line - number = " 10 " ></ td >
< td id = " LC10 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > private </ span > < span class = pl - c1 >< span class = pl - c1 > $ </ span > _alg </ span > = -< span class = pl - c1 > 7 </ span > ; </ td >
</ tr >
< tr >
< td id = " L11 " class = " blob-num js-line-number " data - line - number = " 11 " ></ td >
< td id = " LC11 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > private </ span > < span class = pl - c1 >< span class = pl - c1 > $ </ span > _signature </ span > ; </ td >
</ tr >
< tr >
< td id = " L12 " class = " blob-num js-line-number " data - line - number = " 12 " ></ td >
< td id = " LC12 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > private </ span > < span class = pl - c1 >< span class = pl - c1 > $ </ span > _x5c </ span > ; </ td >
</ tr >
< tr >
< td id = " L13 " class = " blob-num js-line-number " data - line - number = " 13 " ></ td >
< td id = " LC13 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L14 " class = " blob-num js-line-number " data - line - number = " 14 " ></ td >
< td id = " LC14 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > public </ span > < span class = pl - k > function </ span > < span class = pl - en > __construct </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - v > AttestionObject </ span ></ span > , < span class = pl - smi > AuthenticatorData </ span > < span class = pl - s1 >< span class = pl - c1 > $ </ span > authenticatorData </ span > ) { </ td >
</ tr >
< tr >
< td id = " L15 " class = " blob-num js-line-number " data - line - number = " 15 " ></ td >
< td id = " LC15 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - smi > parent </ span >::< span class = pl - en > __construct </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - v > AttestionObject </ span ></ span > , < span class = pl - s1 >< span class = pl - c1 > $ </ span > authenticatorData </ span > ); </ td >
</ tr >
< tr >
< td id = " L16 " class = " blob-num js-line-number " data - line - number = " 16 " ></ td >
< td id = " LC16 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L17 " class = " blob-num js-line-number " data - line - number = " 17 " ></ td >
< td id = " LC17 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >// check u2f data </ span ></ td >
</ tr >
< tr >
< td id = " L18 " class = " blob-num js-line-number " data - line - number = " 18 " ></ td >
< td id = " LC18 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > attStmt </ span > = < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _attestationObject </ span > [ < span class = pl - s >& #39;attStmt'</span>];</td>
</ tr >
< tr >
< td id = " L19 " class = " blob-num js-line-number " data - line - number = " 19 " ></ td >
< td id = " LC19 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L20 " class = " blob-num js-line-number " data - line - number = " 20 " ></ td >
< td id = " LC20 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( < span class = pl - en > \array_key_exists </ span > ( < span class = pl - s >& #39;alg'</span>, <span class=pl-s1><span class=pl-c1>$</span>attStmt</span>) && <span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'alg'</span>] !== <span class=pl-s1><span class=pl-c1>$</span><span class=pl-smi>this</span></span>-><span class=pl-c1>_alg</span>) {</td>
</ tr >
< tr >
< td id = " L21 " class = " blob-num js-line-number " data - line - number = " 21 " ></ td >
< td id = " LC21 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;u2f only accepts algorithm -7 ("ES256"), but got '</span> . <span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'alg'</span>], <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>INVALID_DATA</span>);</td>
</ tr >
< tr >
< td id = " L22 " class = " blob-num js-line-number " data - line - number = " 22 " ></ td >
< td id = " LC22 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L23 " class = " blob-num js-line-number " data - line - number = " 23 " ></ td >
< td id = " LC23 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L24 " class = " blob-num js-line-number " data - line - number = " 24 " ></ td >
< td id = " LC24 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( !< span class = pl - en > \array_key_exists </ span > ( < span class = pl - s >& #39;sig'</span>, <span class=pl-s1><span class=pl-c1>$</span>attStmt</span>) || !<span class=pl-en>\is_object</span>(<span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'sig'</span>]) || !(<span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'sig'</span>] instanceof <span class=pl-v>ByteBuffer</span>)) {</td>
</ tr >
< tr >
< td id = " L25 " class = " blob-num js-line-number " data - line - number = " 25 " ></ td >
< td id = " LC25 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;no signature found'</span>, <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>INVALID_DATA</span>);</td>
</ tr >
< tr >
< td id = " L26 " class = " blob-num js-line-number " data - line - number = " 26 " ></ td >
< td id = " LC26 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L27 " class = " blob-num js-line-number " data - line - number = " 27 " ></ td >
< td id = " LC27 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L28 " class = " blob-num js-line-number " data - line - number = " 28 " ></ td >
< td id = " LC28 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( !< span class = pl - en > \array_key_exists </ span > ( < span class = pl - s >& #39;x5c'</span>, <span class=pl-s1><span class=pl-c1>$</span>attStmt</span>) || !<span class=pl-en>\is_array</span>(<span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'x5c'</span>]) || <span class=pl-en>\count</span>(<span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'x5c'</span>]) !== <span class=pl-c1>1</span>) {</td>
</ tr >
< tr >
< td id = " L29 " class = " blob-num js-line-number " data - line - number = " 29 " ></ td >
< td id = " LC29 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;invalid x5c certificate'</span>, <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>INVALID_DATA</span>);</td>
</ tr >
< tr >
< td id = " L30 " class = " blob-num js-line-number " data - line - number = " 30 " ></ td >
< td id = " LC30 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L31 " class = " blob-num js-line-number " data - line - number = " 31 " ></ td >
< td id = " LC31 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L32 " class = " blob-num js-line-number " data - line - number = " 32 " ></ td >
< td id = " LC32 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( !< span class = pl - en > \is_object </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > attStmt </ span > [ < span class = pl - s >& #39;x5c'</span>][<span class=pl-c1>0</span>]) || !(<span class=pl-s1><span class=pl-c1>$</span>attStmt</span>[<span class=pl-s>'x5c'</span>][<span class=pl-c1>0</span>] instanceof <span class=pl-v>ByteBuffer</span>)) {</td>
</ tr >
< tr >
< td id = " L33 " class = " blob-num js-line-number " data - line - number = " 33 " ></ td >
< td id = " LC33 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;invalid x5c certificate'</span>, <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>INVALID_DATA</span>);</td>
</ tr >
< tr >
< td id = " L34 " class = " blob-num js-line-number " data - line - number = " 34 " ></ td >
< td id = " LC34 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L35 " class = " blob-num js-line-number " data - line - number = " 35 " ></ td >
< td id = " LC35 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L36 " class = " blob-num js-line-number " data - line - number = " 36 " ></ td >
< td id = " LC36 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _signature </ span > = < span class = pl - s1 >< span class = pl - c1 > $ </ span > attStmt </ span > [ < span class = pl - s >& #39;sig'</span>]-><span class=pl-en>getBinaryString</span>();</td>
</ tr >
< tr >
< td id = " L37 " class = " blob-num js-line-number " data - line - number = " 37 " ></ td >
< td id = " LC37 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _x5c </ span > = < span class = pl - s1 >< span class = pl - c1 > $ </ span > attStmt </ span > [ < span class = pl - s >& #39;x5c'</span>][<span class=pl-c1>0</span>]-><span class=pl-en>getBinaryString</span>();</td>
</ tr >
< tr >
< td id = " L38 " class = " blob-num js-line-number " data - line - number = " 38 " ></ td >
< td id = " LC38 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L39 " class = " blob-num js-line-number " data - line - number = " 39 " ></ td >
< td id = " LC39 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L40 " class = " blob-num js-line-number " data - line - number = " 40 " ></ td >
< td id = " LC40 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L41 " class = " blob-num js-line-number " data - line - number = " 41 " ></ td >
< td id = " LC41 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >/*</ span ></ td >
</ tr >
< tr >
< td id = " L42 " class = " blob-num js-line-number " data - line - number = " 42 " ></ td >
< td id = " LC42 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * returns the key certificate in PEM format </ span ></ td >
</ tr >
< tr >
< td id = " L43 " class = " blob-num js-line-number " data - line - number = " 43 " ></ td >
< td id = " LC43 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * @ return string </ span ></ td >
</ tr >
< tr >
< td id = " L44 " class = " blob-num js-line-number " data - line - number = " 44 " ></ td >
< td id = " LC44 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > */</ span ></ td >
</ tr >
< tr >
< td id = " L45 " class = " blob-num js-line-number " data - line - number = " 45 " ></ td >
< td id = " LC45 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > public </ span > < span class = pl - k > function </ span > < span class = pl - en > getCertificatePem </ span > () { </ td >
</ tr >
< tr >
< td id = " L46 " class = " blob-num js-line-number " data - line - number = " 46 " ></ td >
< td id = " LC46 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > pem </ span > = < span class = pl - s >& #39;-----BEGIN CERTIFICATE-----'</span> . <span class=pl-s>"\n"</span>;</td>
</ tr >
< tr >
< td id = " L47 " class = " blob-num js-line-number " data - line - number = " 47 " ></ td >
< td id = " LC47 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > pem </ span > .= < span class = pl - en > \chunk_split </ span > ( < span class = pl - en > \base64_encode </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _x5c </ span > ), < span class = pl - c1 > 64 </ span > , < span class = pl - s >& quot ; \n & quot ; </ span > ); </ td >
</ tr >
< tr >
< td id = " L48 " class = " blob-num js-line-number " data - line - number = " 48 " ></ td >
< td id = " LC48 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > pem </ span > .= < span class = pl - s >& #39;-----END CERTIFICATE-----'</span> . <span class=pl-s>"\n"</span>;</td>
</ tr >
< tr >
< td id = " L49 " class = " blob-num js-line-number " data - line - number = " 49 " ></ td >
< td id = " LC49 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > return </ span > < span class = pl - s1 >< span class = pl - c1 > $ </ span > pem </ span > ; </ td >
</ tr >
< tr >
< td id = " L50 " class = " blob-num js-line-number " data - line - number = " 50 " ></ td >
< td id = " LC50 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L51 " class = " blob-num js-line-number " data - line - number = " 51 " ></ td >
< td id = " LC51 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L52 " class = " blob-num js-line-number " data - line - number = " 52 " ></ td >
< td id = " LC52 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >/**</ span ></ td >
</ tr >
< tr >
< td id = " L53 " class = " blob-num js-line-number " data - line - number = " 53 " ></ td >
< td id = " LC53 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * @ param string $clientDataHash </ span ></ td >
</ tr >
< tr >
< td id = " L54 " class = " blob-num js-line-number " data - line - number = " 54 " ></ td >
< td id = " LC54 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > */</ span ></ td >
</ tr >
< tr >
< td id = " L55 " class = " blob-num js-line-number " data - line - number = " 55 " ></ td >
< td id = " LC55 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > public </ span > < span class = pl - k > function </ span > < span class = pl - en > validateAttestation </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > clientDataHash </ span > ) { </ td >
</ tr >
< tr >
< td id = " L56 " class = " blob-num js-line-number " data - line - number = " 56 " ></ td >
< td id = " LC56 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > publicKey </ span > = < span class = pl - en > \openssl_pkey_get_public </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - en > getCertificatePem </ span > ()); </ td >
</ tr >
< tr >
< td id = " L57 " class = " blob-num js-line-number " data - line - number = " 57 " ></ td >
< td id = " LC57 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L58 " class = " blob-num js-line-number " data - line - number = " 58 " ></ td >
< td id = " LC58 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > publicKey </ span > === < span class = pl - c1 > false </ span > ) { </ td >
</ tr >
< tr >
< td id = " L59 " class = " blob-num js-line-number " data - line - number = " 59 " ></ td >
< td id = " LC59 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;invalid public key: '</span> . <span class=pl-en>\openssl_error_string</span>(), <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>INVALID_PUBLIC_KEY</span>);</td>
</ tr >
< tr >
< td id = " L60 " class = " blob-num js-line-number " data - line - number = " 60 " ></ td >
< td id = " LC60 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L61 " class = " blob-num js-line-number " data - line - number = " 61 " ></ td >
< td id = " LC61 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L62 " class = " blob-num js-line-number " data - line - number = " 62 " ></ td >
< td id = " LC62 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >// Let verificationData be the concatenation of ( 0x00 || rpIdHash || clientDataHash || credentialId || publicKeyU2F ) </ span ></ td >
</ tr >
< tr >
< td id = " L63 " class = " blob-num js-line-number " data - line - number = " 63 " ></ td >
< td id = " LC63 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > = < span class = pl - s >& quot ; \x00 & quot ; </ span > ; </ td >
</ tr >
< tr >
< td id = " L64 " class = " blob-num js-line-number " data - line - number = " 64 " ></ td >
< td id = " LC64 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > .= < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _authenticatorData </ span >-& gt ; < span class = pl - en > getRpIdHash </ span > (); </ td >
</ tr >
< tr >
< td id = " L65 " class = " blob-num js-line-number " data - line - number = " 65 " ></ td >
< td id = " LC65 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > .= < span class = pl - s1 >< span class = pl - c1 > $ </ span > clientDataHash </ span > ; </ td >
</ tr >
< tr >
< td id = " L66 " class = " blob-num js-line-number " data - line - number = " 66 " ></ td >
< td id = " LC66 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > .= < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _authenticatorData </ span >-& gt ; < span class = pl - en > getCredentialId </ span > (); </ td >
</ tr >
< tr >
< td id = " L67 " class = " blob-num js-line-number " data - line - number = " 67 " ></ td >
< td id = " LC67 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > .= < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _authenticatorData </ span >-& gt ; < span class = pl - en > getPublicKeyU2F </ span > (); </ td >
</ tr >
< tr >
< td id = " L68 " class = " blob-num js-line-number " data - line - number = " 68 " ></ td >
< td id = " LC68 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L69 " class = " blob-num js-line-number " data - line - number = " 69 " ></ td >
< td id = " LC69 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > coseAlgorithm </ span > = < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - en > _getCoseAlgorithm </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _alg </ span > ); </ td >
</ tr >
< tr >
< td id = " L70 " class = " blob-num js-line-number " data - line - number = " 70 " ></ td >
< td id = " LC70 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L71 " class = " blob-num js-line-number " data - line - number = " 71 " ></ td >
< td id = " LC71 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >// check certificate </ span ></ td >
</ tr >
< tr >
< td id = " L72 " class = " blob-num js-line-number " data - line - number = " 72 " ></ td >
< td id = " LC72 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > return </ span > < span class = pl - en > \openssl_verify </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > dataToVerify </ span > , < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - c1 > _signature </ span > , < span class = pl - s1 >< span class = pl - c1 > $ </ span > publicKey </ span > , < span class = pl - s1 >< span class = pl - c1 > $ </ span > coseAlgorithm </ span >-& gt ; < span class = pl - c1 > openssl </ span > ) === < span class = pl - c1 > 1 </ span > ; </ td >
</ tr >
< tr >
< td id = " L73 " class = " blob-num js-line-number " data - line - number = " 73 " ></ td >
< td id = " LC73 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L74 " class = " blob-num js-line-number " data - line - number = " 74 " ></ td >
< td id = " LC74 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L75 " class = " blob-num js-line-number " data - line - number = " 75 " ></ td >
< td id = " LC75 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - c >/**</ span ></ td >
</ tr >
< tr >
< td id = " L76 " class = " blob-num js-line-number " data - line - number = " 76 " ></ td >
< td id = " LC76 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * validates the certificate against root certificates </ span ></ td >
</ tr >
< tr >
< td id = " L77 " class = " blob-num js-line-number " data - line - number = " 77 " ></ td >
< td id = " LC77 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * @ param array $rootCas </ span ></ td >
</ tr >
< tr >
< td id = " L78 " class = " blob-num js-line-number " data - line - number = " 78 " ></ td >
< td id = " LC78 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * @ return boolean </ span ></ td >
</ tr >
< tr >
< td id = " L79 " class = " blob-num js-line-number " data - line - number = " 79 " ></ td >
< td id = " LC79 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > * @ throws WebAuthnException </ span ></ td >
</ tr >
< tr >
< td id = " L80 " class = " blob-num js-line-number " data - line - number = " 80 " ></ td >
< td id = " LC80 " class = " blob-code blob-code-inner js-file-line " >< span class = pl - c > */</ span ></ td >
</ tr >
< tr >
< td id = " L81 " class = " blob-num js-line-number " data - line - number = " 81 " ></ td >
< td id = " LC81 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > public </ span > < span class = pl - k > function </ span > < span class = pl - en > validateRootCertificate </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > rootCas </ span > ) { </ td >
</ tr >
< tr >
< td id = " L82 " class = " blob-num js-line-number " data - line - number = " 82 " ></ td >
< td id = " LC82 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > chainC </ span > = < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - en > _createX5cChainFile </ span > (); </ td >
</ tr >
< tr >
< td id = " L83 " class = " blob-num js-line-number " data - line - number = " 83 " ></ td >
< td id = " LC83 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > chainC </ span > ) { </ td >
</ tr >
< tr >
< td id = " L84 " class = " blob-num js-line-number " data - line - number = " 84 " ></ td >
< td id = " LC84 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > rootCas </ span > [] = < span class = pl - s1 >< span class = pl - c1 > $ </ span > chainC </ span > ; </ td >
</ tr >
< tr >
< td id = " L85 " class = " blob-num js-line-number " data - line - number = " 85 " ></ td >
< td id = " LC85 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L86 " class = " blob-num js-line-number " data - line - number = " 86 " ></ td >
< td id = " LC86 " class = " blob-code blob-code-inner js-file-line " >
</ td >
</ tr >
< tr >
< td id = " L87 " class = " blob-num js-line-number " data - line - number = " 87 " ></ td >
< td id = " LC87 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - s1 >< span class = pl - c1 > $ </ span > v </ span > = < span class = pl - en > \openssl_x509_checkpurpose </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span >< span class = pl - smi > this </ span ></ span >-& gt ; < span class = pl - en > getCertificatePem </ span > (), -< span class = pl - c1 > 1 </ span > , < span class = pl - s1 >< span class = pl - c1 > $ </ span > rootCas </ span > ); </ td >
</ tr >
< tr >
< td id = " L88 " class = " blob-num js-line-number " data - line - number = " 88 " ></ td >
< td id = " LC88 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > if </ span > ( < span class = pl - s1 >< span class = pl - c1 > $ </ span > v </ span > === -< span class = pl - c1 > 1 </ span > ) { </ td >
</ tr >
< tr >
< td id = " L89 " class = " blob-num js-line-number " data - line - number = " 89 " ></ td >
< td id = " LC89 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > throw </ span > < span class = pl - k > new </ span > < span class = pl - v > WebAuthnException </ span > ( < span class = pl - s >& #39;error on validating root certificate: '</span> . <span class=pl-en>\openssl_error_string</span>(), <span class=pl-v>WebAuthnException</span>::<span class=pl-c1>CERTIFICATE_NOT_TRUSTED</span>);</td>
</ tr >
< tr >
< td id = " L90 " class = " blob-num js-line-number " data - line - number = " 90 " ></ td >
< td id = " LC90 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L91 " class = " blob-num js-line-number " data - line - number = " 91 " ></ td >
< td id = " LC91 " class = " blob-code blob-code-inner js-file-line " > < span class = pl - k > return </ span > < span class = pl - s1 >< span class = pl - c1 > $ </ span > v </ span > ; </ td >
</ tr >
< tr >
< td id = " L92 " class = " blob-num js-line-number " data - line - number = " 92 " ></ td >
< td id = " LC92 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
< tr >
< td id = " L93 " class = " blob-num js-line-number " data - line - number = " 93 " ></ td >
< td id = " LC93 " class = " blob-code blob-code-inner js-file-line " > } </ td >
</ tr >
</ table >
< details class = " details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none " aria - hidden = " true " >
< summary class = " btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1 " aria - label = " Inline file action toolbar " >
< svg class = " octicon octicon-kebab-horizontal " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path d = " M8 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm13 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3z " ></ path ></ svg >
</ summary >
< details - menu >
< ul class = " BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2 " style = " width:185px " >
< li >
< clipboard - copy role = " menuitem " class = " dropdown-item " id = " js-copy-lines " style = " cursor:pointer; " >
Copy lines
</ clipboard - copy >
</ li >
< li >
< clipboard - copy role = " menuitem " class = " dropdown-item " id = " js-copy-permalink " style = " cursor:pointer; " >
Copy permalink
</ clipboard - copy >
</ li >
< li >< a class = " dropdown-item js-update-url-with-hash " id = " js-view-git-blame " role = " menuitem " href = " /lbuchs/WebAuthn/blame/e62a6615894daaf061f91bc274064c5773074f81/src/Attestation/Format/U2f.php " > View git blame </ a ></ li >
< li >< a class = " dropdown-item " id = " js-new-issue " role = " menuitem " href = " /lbuchs/WebAuthn/issues/new " > Reference in new issue </ a ></ li >
</ ul >
</ details - menu >
</ details >
</ div >
</ div >
< details class = " details-reset details-overlay details-overlay-dark " id = " jumpto-line-details-dialog " >
< summary data - hotkey = " l " aria - label = " Jump to line " ></ summary >
< details - dialog class = " Box Box--overlay d-flex flex-column anim-fade-in fast linejump " aria - label = " Jump to line " >
<!-- ' " ` --><!-- </textarea></xmp> --></option></form><form class= " js - jump - to - line - form Box - body d - flex " action= " " accept-charset= " UTF - 8 " method= " get " >
< input class = " form-control flex-auto mr-3 linejump-input js-jump-to-line-field " type = " text " placeholder = " Jump to line… " aria - label = " Jump to line " autofocus >
< button type = " submit " class = " btn " data - close - dialog > Go </ button >
</ form > </ details - dialog >
</ details >
< div class = " Popover anim-scale-in js-tagsearch-popover "
hidden
data - tagsearch - url = " /lbuchs/WebAuthn/find-definition "
data - tagsearch - ref = " master "
data - tagsearch - path = " src/Attestation/Format/U2f.php "
data - tagsearch - lang = " PHP "
data - hydro - click = " { "event_type":"code_navigation.click_on_symbol","payload": { "action":"click_on_symbol","repository_id":149437753,"ref":"master","language":"PHP","originating_url":"https://github.com/lbuchs/WebAuthn/blob/master/src/Attestation/Format/U2f.php","user_id":null}} "
data - hydro - click - hmac = " 8624216e48f425d935124bbdbf398afde9f9355fa3c38555f17245b4353a60e8 " >
< div class = " Popover-message Popover-message--large Popover-message--top-left TagsearchPopover mt-1 mb-4 mx-auto Box box-shadow-large " >
< div class = " TagsearchPopover-content js-tagsearch-popover-content overflow-auto " style = " will-change:transform; " >
</ div >
</ div >
</ div >
</ div >
</ div >
</ main >
</ div >
</ div >
< div class = " footer container-xl width-full p-responsive " role = " contentinfo " >
< div class = " position-relative d-flex flex-row-reverse flex-lg-row flex-wrap flex-lg-nowrap flex-justify-center flex-lg-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light " >
< ul class = " list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0 " >
< li class = " mr-3 mr-lg-0 " >& copy ; 2021 GitHub , Inc .</ li >
< li class = " mr-3 mr-lg-0 " >< a data - ga - click = " Footer, go to terms, text:terms " href = " https://github.com/site/terms " > Terms </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a data - ga - click = " Footer, go to privacy, text:privacy " href = " https://github.com/site/privacy " > Privacy </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a data - ga - click = " Footer, go to security, text:security " href = " https://github.com/security " > Security </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a href = " https://githubstatus.com/ " data - ga - click = " Footer, go to status, text:status " > Status </ a ></ li >
< li >< a data - ga - click = " Footer, go to help, text:help " href = " https://docs.github.com " > Help </ a ></ li >
</ ul >
< a aria - label = " Homepage " title = " GitHub " class = " footer-octicon d-none d-lg-block mx-lg-4 " href = " https://github.com " >
< svg height = " 24 " class = " octicon octicon-mark-github " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 24 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z " ></ path ></ svg >
</ a >
< ul class = " list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0 " >
< li class = " mr-3 mr-lg-0 " >< a data - ga - click = " Footer, go to contact, text:contact " href = " https://github.com/contact " > Contact GitHub </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a href = " https://github.com/pricing " data - ga - click = " Footer, go to Pricing, text:Pricing " > Pricing </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a href = " https://docs.github.com " data - ga - click = " Footer, go to api, text:api " > API </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a href = " https://services.github.com " data - ga - click = " Footer, go to training, text:training " > Training </ a ></ li >
< li class = " mr-3 mr-lg-0 " >< a href = " https://github.blog " data - ga - click = " Footer, go to blog, text:blog " > Blog </ a ></ li >
< li >< a data - ga - click = " Footer, go to about, text:about " href = " https://github.com/about " > About </ a ></ li >
</ ul >
</ div >
< div class = " d-flex flex-justify-center pb-6 " >
< span class = " f6 text-gray-light " ></ span >
</ div >
</ div >
< div id = " ajax-error-message " class = " ajax-error-message flash flash-error " >
< svg class = " octicon octicon-alert " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z " ></ path ></ svg >
< button type = " button " class = " flash-close js-ajax-error-dismiss " aria - label = " Dismiss error " >
< svg class = " octicon octicon-x " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
You can’ t perform that action at this time .
</ div >
< div class = " js-stale-session-flash flash flash-warn flash-banner " hidden
>
< svg class = " octicon octicon-alert " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z " ></ path ></ svg >
< span class = " js-stale-session-flash-signed-in " hidden > You signed in with another tab or window . < a href = " " > Reload </ a > to refresh your session .</ span >
< span class = " js-stale-session-flash-signed-out " hidden > You signed out in another tab or window . < a href = " " > Reload </ a > to refresh your session .</ span >
</ div >
< template id = " site-details-dialog " >
< details class = " details-reset details-overlay details-overlay-dark lh-default text-gray-dark hx_rsm " open >
< summary role = " button " aria - label = " Close dialog " ></ summary >
< details - dialog class = " Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal " >
< button class = " Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0 " type = " button " aria - label = " Close dialog " data - close - dialog >
< svg class = " octicon octicon-x " viewBox = " 0 0 16 16 " version = " 1.1 " width = " 16 " height = " 16 " aria - hidden = " true " >< path fill - rule = " evenodd " d = " M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z " ></ path ></ svg >
</ button >
< div class = " octocat-spinner my-6 js-details-dialog-spinner " ></ div >
</ details - dialog >
</ details >
</ template >
< div class = " Popover js-hovercard-content position-absolute " style = " display: none; outline: none; " tabindex = " 0 " >
< div class = " Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large " style = " width:360px; " >
</ div >
</ div >
</ body >
</ html >