Skip to content

Commit fc3a89c

Browse files
committed
add signed JSON with verified boot key fingerprints
1 parent acf2c1f commit fc3a89c

4 files changed

Lines changed: 60 additions & 2 deletions

File tree

nginx/nginx.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,8 @@ http {
11321132
location = /allowed_signers.sig {}
11331133
location = /allowed_signers.asc {}
11341134

1135+
location = /attestation.json.sig {}
1136+
11351137
location = /manifest.webmanifest {
11361138
include security-headers.conf;
11371139
add_header Cross-Origin-Resource-Policy "same-origin" always;

static/articles/attestation-compatibility-guide.html

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,57 @@ <h1><a href="#attestation-compatibility-guide">Attestation compatibility guide</
9595
the attestation metadata, you can enforce that <code>verifiedBootState</code> is
9696
either <code>Verified</code> or <code>SelfSigned</code>. For the
9797
<code>SelfSigned</code> case, you can check that <code>verifiedBootKey</code> matches
98-
one of the official GrapheneOS verified boot keys. These are the base16-encoded
99-
verified boot key fingerprints for the official GrapheneOS releases:</p>
98+
one of the official GrapheneOS verified boot keys.</p>
99+
100+
<p>The current list of base16 encoded verified boot fingerprints is available as a
101+
signed JSON object from <code>https://grapheneos.org/attestation.json</code> with an
102+
OpenSSH signature at <code>https://grapheneos.org/attestation.json.sig</code>. Only
103+
devices receiving proper security updates for the kernel, drivers and firmware are
104+
included in the list. The following schema is used:</p>
105+
106+
<pre>{
107+
"$schema": "https://json-schema.org/draft/2020-12/schema",
108+
"title": "Trusted keys for Android hardware attestation",
109+
"type": "object",
110+
"properties": {
111+
"verifiedBootKeys": {
112+
"type": "array",
113+
"items": {
114+
"type": "string"
115+
}
116+
},
117+
"timestamp": {
118+
"type": "number"
119+
}
120+
},
121+
"required": [
122+
"verifiedBootKeys",
123+
"timestamp"
124+
]
125+
}</pre>
126+
127+
<p>The public key is available at
128+
<code>https://grapheneos.org/allowed_signers</code>.</p>
129+
130+
<p>Other locations to obtain the signing key:</p>
131+
132+
<ul>
133+
<li><a href="https://bsky.app/profile/grapheneos.org/post/3kleyygkptm2x">Bluesky</a></li>
134+
<li><a href="https://x.com/GrapheneOS/status/1757758688952009209">X</a></li>
135+
<li><a href="https://github.com/GrapheneOS/grapheneos.org/blob/main/static/allowed_signers">GitHub</a></li>
136+
</ul>
137+
138+
<p>The signature can be verified with the following OpenSSH command:</p>
139+
140+
<pre>ssh-keygen -Y verify -f allowed_signers -I contact@grapheneos.org -n "attestation keys" -s attestation.json.sig &lt; attestation.json</pre>
141+
142+
<p>The timestamp will be updated to the latest Unix time integer whenever a change is
143+
made to the file and should be checked to protect against downgrade attacks.</p>
144+
145+
<p>When this key is rotated, the new <code>allowed_signers</code> file will be signed
146+
with the previous key at <code>https://grapheneos.org/allowed_signers.sig</code>.</p>
147+
148+
<p>This is the current list:</p>
100149

101150
<ul>
102151
<li><code>d8f879d10419eddc9fcda6280718be763f6bf12299e1f72df3ea8ad8a8eb7f80</code>: Pixel 10a</li>

static/attestation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"verifiedBootKeys":["d8f879d10419eddc9fcda6280718be763f6bf12299e1f72df3ea8ad8a8eb7f80","55a2d44103e56d5ec65496399c417987ba77730e6488fc60ba058d09fc3caee3","141d7fc32af7958a416f2661b37cf6f27bfb376fb5ce616aeaa27a82c7a04f74","4e8ee8f717754052198ca6d2d3aaa232e2461b4293c0d6f297e519cc778de093","3f7415ea26f5df5b14ea6d153256071a7a1af9ce7b0970b7311cc463c7ea02c7","0508de44ee00bfb49ece32c418af1896391abde0f05b64f41bc9a2dfb589445b","af4d2c6e62be0fec54f0271b9776ff061dd8392d9f51cf6ab1551d346679e24c","55d3c2323db91bb91f20d38d015e85112d038f6b6b5738fe352c1a80dba57023","f729cab861da1b83fdfab402fc9480758f2ae78ee0b61c1f2137dd1ab7076e86","9e6a8f3e0d761a780179f93acd5721ba1ab7c8c537c7761073c0a754b0e932de","096b8bd6d44527a24ac1564b308839f67e78202185cbff9cfdcb10e63250bc5e","896db2d09d84e1d6bb747002b8a114950b946e5825772a9d48ba7eb01d118c1c","cd7479653aa88208f9f03034810ef9b7b0af8a9d41e2000e458ac403a2acb233","ee0c9dfef6f55a878538b0dbf7e78e3bc3f1a13c8c44839b095fe26dd5fe2842","94df136e6c6aa08dc26580af46f36419b5f9baf46039db076f5295b91aaff230","508d75dea10c5cbc3e7632260fc0b59f6055a8a49dd84e693b6d8899edbb01e4","bc1c0dd95664604382bb888412026422742eb333071ea0b2d19036217d49182f","3efe5392be3ac38afb894d13de639e521675e62571a8a9b3ef9fc8c44fd17fa1","08c860350a9600692d10c8512f7b8e80707757468e8fbfeea2a870c0a83d6031","439b76524d94c40652ce1bf0d8243773c634d2f99ba3160d8d02aa5e29ff925c","f0a890375d1405e62ebfd87e8d3f475f948ef031bbf9ddd516d5f600a23677e8"],"timestamp":1776709772}

static/attestation.json.sig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN SSH SIGNATURE-----
2+
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAghSD+bkKg/zdvSt9ILNhJUDhzDi
3+
Kvj2KjkY+jFuDF0kQAAAAQYXR0ZXN0YXRpb24ga2V5cwAAAAAAAAAGc2hhNTEyAAAAUwAA
4+
AAtzc2gtZWQyNTUxOQAAAECSUpZv5uOOEWBITvkRiZnNok6mpNi0k/eQJ28n7a5+LAW2yx
5+
0QcjdN12c+aUhYFf6me+eRgiEHWJewzQKySYsP
6+
-----END SSH SIGNATURE-----

0 commit comments

Comments
 (0)