Skip to content

Commit 1666512

Browse files
sethmoocopybara-github
authored andcommitted
Add missing tags
As noted by #87, we were missing tags 508 and 405. Oops! Fixes #87 PiperOrigin-RevId: 943503422
1 parent 4057431 commit 1666512

9 files changed

Lines changed: 299 additions & 0 deletions

File tree

src/main/kotlin/CertPrinter.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,16 @@ object CertPrinter {
213213
appendIndentedLine("originationExpireDateTime: $originationExpireDateTime")
214214
}
215215
if (usageExpireDateTime != null) appendIndentedLine("usageExpireDateTime: $usageExpireDateTime")
216+
if (usageCountLimit != null) appendIndentedLine("usageCountLimit: $usageCountLimit")
216217
if (noAuthRequired != null) appendIndentedLine("noAuthRequired: $noAuthRequired")
217218
if (userAuthType != null) appendIndentedLine("userAuthType: $userAuthType")
218219
if (authTimeout != null) appendIndentedLine("authTimeout: $authTimeout")
219220
if (trustedUserPresenceRequired != null) {
220221
appendIndentedLine("trustedUserPresenceRequired: $trustedUserPresenceRequired")
221222
}
223+
if (trustedConfirmationRequired != null) {
224+
appendIndentedLine("trustedConfirmationRequired: $trustedConfirmationRequired")
225+
}
222226
if (unlockedDeviceRequired != null) {
223227
appendIndentedLine("unlockedDeviceRequired: $unlockedDeviceRequired")
224228
}

src/main/kotlin/Extension.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,13 @@ enum class KeyMintTag(val value: Int) {
259259
ACTIVE_DATE_TIME(400),
260260
ORIGINATION_EXPIRE_DATE_TIME(401),
261261
USAGE_EXPIRE_DATE_TIME(402),
262+
USAGE_COUNT_LIMIT(405),
262263
NO_AUTH_REQUIRED(503),
263264
USER_AUTH_TYPE(504),
264265
AUTH_TIMEOUT(505),
265266
ALLOW_WHILE_ON_BODY(506),
266267
TRUSTED_USER_PRESENCE_REQUIRED(507),
268+
TRUSTED_CONFIRMATION_REQUIRED(508),
267269
UNLOCKED_DEVICE_REQUIRED(509),
268270
CREATION_DATE_TIME(701),
269271
ORIGIN(702),
@@ -285,6 +287,14 @@ enum class KeyMintTag(val value: Int) {
285287
ATTESTATION_ID_SECOND_IMEI(723),
286288
MODULE_HASH(724);
287289

290+
// The following tags are intentionally unsupported:
291+
// 7 (callerNonce): Used in symmetric ciphers only
292+
// 8 (minMacLength): Used in symmetric ciphers only
293+
// 303 (rollbackResistance): Not usable by 3p apps (framework API is hidden)
294+
// 305 (earlyBootOnly): Not usable by 3p apps
295+
// 502 (userSecureId): Not usable by 3p apps (framework API is hidden)
296+
// 720 (deviceUniqueAttestation): Not widely used.
297+
288298
companion object {
289299
fun from(value: Int) =
290300
values().firstOrNull { it.value == value }
@@ -317,10 +327,12 @@ data class AuthorizationList(
317327
val activeDateTime: BigInteger? = null,
318328
val originationExpireDateTime: BigInteger? = null,
319329
val usageExpireDateTime: BigInteger? = null,
330+
val usageCountLimit: BigInteger? = null,
320331
val noAuthRequired: Boolean? = null,
321332
val userAuthType: BigInteger? = null,
322333
val authTimeout: BigInteger? = null,
323334
val trustedUserPresenceRequired: Boolean? = null,
335+
val trustedConfirmationRequired: Boolean? = null,
324336
val unlockedDeviceRequired: Boolean? = null,
325337
val creationDateTime: BigInteger? = null,
326338
val origin: Origin? = null,
@@ -367,6 +379,7 @@ data class AuthorizationList(
367379
usageExpireDateTime?.toAsn1()?.let {
368380
add(it.toTaggedObject(KeyMintTag.USAGE_EXPIRE_DATE_TIME))
369381
}
382+
usageCountLimit?.toAsn1()?.let { add(it.toTaggedObject(KeyMintTag.USAGE_COUNT_LIMIT)) }
370383
if (noAuthRequired != null) {
371384
check(noAuthRequired) { "noAuthRequired must be null or true" }
372385
add(DERNull.INSTANCE.toTaggedObject(KeyMintTag.NO_AUTH_REQUIRED))
@@ -377,6 +390,10 @@ data class AuthorizationList(
377390
check(trustedUserPresenceRequired) { "trustedUserPresenceRequired must be null or true" }
378391
add(DERNull.INSTANCE.toTaggedObject(KeyMintTag.TRUSTED_USER_PRESENCE_REQUIRED))
379392
}
393+
if (trustedConfirmationRequired != null) {
394+
check(trustedConfirmationRequired) { "trustedConfirmationRequired must be null or true" }
395+
add(DERNull.INSTANCE.toTaggedObject(KeyMintTag.TRUSTED_CONFIRMATION_REQUIRED))
396+
}
380397
if (unlockedDeviceRequired != null) {
381398
check(unlockedDeviceRequired) { "unlockedDeviceRequired must be null or true" }
382399
add(DERNull.INSTANCE.toTaggedObject(KeyMintTag.UNLOCKED_DEVICE_REQUIRED))
@@ -489,11 +506,14 @@ data class AuthorizationList(
489506
activeDateTime = converter.parseInt(KeyMintTag.ACTIVE_DATE_TIME),
490507
originationExpireDateTime = converter.parseInt(KeyMintTag.ORIGINATION_EXPIRE_DATE_TIME),
491508
usageExpireDateTime = converter.parseInt(KeyMintTag.USAGE_EXPIRE_DATE_TIME),
509+
usageCountLimit = converter.parseInt(KeyMintTag.USAGE_COUNT_LIMIT),
492510
noAuthRequired = if (objects.containsKey(KeyMintTag.NO_AUTH_REQUIRED)) true else null,
493511
userAuthType = converter.parseInt(KeyMintTag.USER_AUTH_TYPE),
494512
authTimeout = converter.parseInt(KeyMintTag.AUTH_TIMEOUT),
495513
trustedUserPresenceRequired =
496514
if (objects.containsKey(KeyMintTag.TRUSTED_USER_PRESENCE_REQUIRED)) true else null,
515+
trustedConfirmationRequired =
516+
if (objects.containsKey(KeyMintTag.TRUSTED_CONFIRMATION_REQUIRED)) true else null,
497517
unlockedDeviceRequired =
498518
if (objects.containsKey(KeyMintTag.UNLOCKED_DEVICE_REQUIRED)) true else null,
499519
creationDateTime = converter.parseInt(KeyMintTag.CREATION_DATE_TIME),

src/test/kotlin/CertPrinterTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,24 @@
1616

1717
package com.android.keyattestation.verifier
1818

19+
import kotlin.io.path.Path
20+
import com.android.keyattestation.verifier.testing.TestUtils.TESTDATA_PATH
21+
import com.android.keyattestation.verifier.testing.TestUtils.readCertPath
1922
import com.google.common.truth.Truth.assertThat
23+
2024
import com.google.protobuf.ByteString
2125
import java.io.ByteArrayInputStream
2226
import java.math.BigInteger
2327
import java.security.cert.CertificateFactory
2428
import java.security.cert.X509Certificate
29+
import kotlin.io.path.reader
2530
import org.junit.Test
2631
import org.junit.runner.RunWith
2732
import org.junit.runners.JUnit4
2833

2934
@RunWith(JUnit4::class)
3035
class CertPrinterTest {
36+
private val testData = Path("testdata")
3137

3238
@Test
3339
fun prettyPrint_certWithKeyDescription_containsExpectedFields() {
@@ -172,4 +178,21 @@ class CertPrinterTest {
172178
.trimMargin()
173179
assertThat(infoString).isEqualTo(expectedString)
174180
}
181+
182+
@Test
183+
fun prettyPrint_certWithTrustedConfirmationRequired_containsExpectedFields() {
184+
val cert = readCertPath(testData.resolve("tegu/sdk37/TEE_TRUSTED_CONF.pem").reader()).leafCert()
185+
val certString = CertPrinter.prettyString(cert)
186+
187+
assertThat(certString).contains("trustedConfirmationRequired: true")
188+
}
189+
190+
@Test
191+
fun prettyPrint_certWithUsageCountLimit_containsExpectedFields() {
192+
val cert =
193+
readCertPath(testData.resolve("tegu/sdk37/TEE_MAX_USAGE_COUNT.pem").reader()).leafCert()
194+
val certString = CertPrinter.prettyString(cert)
195+
196+
assertThat(certString).contains("usageCountLimit: 42")
197+
}
175198
}

src/test/kotlin/ExtensionTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,12 @@ class ExtensionTest {
124124
activeDateTime = 5.toBigInteger(),
125125
originationExpireDateTime = 6.toBigInteger(),
126126
usageExpireDateTime = 7.toBigInteger(),
127+
usageCountLimit = 8.toBigInteger(),
127128
noAuthRequired = true,
128129
userAuthType = 1.toBigInteger(),
129130
authTimeout = 9.toBigInteger(),
130131
trustedUserPresenceRequired = true,
132+
trustedConfirmationRequired = true,
131133
creationDateTime = 10.toBigInteger(),
132134
origin = Origin.GENERATED,
133135
rollbackResistant = true,

testdata/complete_authlist.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
"activeDateTime": "1000",
2020
"originationExpireDateTime": "2000",
2121
"usageExpireDateTime": "3000",
22+
"usageCountLimit": "10",
2223
"noAuthRequired": true,
2324
"userAuthType": "1",
2425
"authTimeout": "60",
2526
"allowWhileOnBody": true,
2627
"trustedUserPresenceRequired": true,
28+
"trustedConfirmationRequired": true,
2729
"unlockedDeviceRequired": true,
2830
"creationDateTime": "123456789",
2931
"origin": "GENERATED",
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"attestationVersion": "500",
3+
"attestationSecurityLevel": "TRUSTED_ENVIRONMENT",
4+
"keyMintVersion": "500",
5+
"keyMintSecurityLevel": "TRUSTED_ENVIRONMENT",
6+
"attestationChallenge": "NWMwOTZmMGYtZTk5OC00MDU5LWJkZWMtYmUzNmQ5MjhiZDhk",
7+
"uniqueId": "",
8+
"softwareEnforced": {
9+
"usageCountLimit": "42",
10+
"creationDateTime": "1783361716745",
11+
"attestationApplicationId": {
12+
"packages": [
13+
{ "name": "com.google.android.attestation", "version": "1" }
14+
],
15+
"signatures": ["EDk47kU35Z6O55L2VFBPuDRvxrNG0LvEQV/DOfz8jsE="]
16+
},
17+
"moduleHash": "al4AdvgYUvh6qnkfO7Wmn25Qtfs9I+pp4bbUBMm7N+4=",
18+
"areTagsOrdered": true
19+
},
20+
"hardwareEnforced": {
21+
"purposes": ["2", "3"],
22+
"algorithms": "3",
23+
"keySize": "256",
24+
"digests": ["4"],
25+
"ecCurve": "1",
26+
"noAuthRequired": true,
27+
"origin": "GENERATED",
28+
"rootOfTrust": {
29+
"verifiedBootKey": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
30+
"deviceLocked": false,
31+
"verifiedBootState": "UNVERIFIED",
32+
"verifiedBootHash": "UXikZWsan/XtVtixCSRIFR1OcFjTW3kzCaiHo2z23zY="
33+
},
34+
"osVersion": "170000",
35+
"osPatchLevel": "202608",
36+
"attestationIdBrand": "google",
37+
"attestationIdDevice": "tegu",
38+
"attestationIdProduct": "tegu",
39+
"attestationIdManufacturer": "Google",
40+
"attestationIdModel": "Pixel 9a",
41+
"vendorPatchLevel": "20260805",
42+
"bootPatchLevel": "20260805",
43+
"areTagsOrdered": true
44+
}
45+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDGzCCAsGgAwIBAgIBATAKBggqhkjOPQQDAjA5MQwwCgYDVQQKEwNURUUxKTAn
3+
BgNVBAMTIDliNWU3YzMzMDI1MmZhMGM2OThhM2YyM2QzMWE0YTY0MB4XDTcwMDEw
4+
MTAwMDAwMFoXDTQ4MDEwMTAwMDAwMFowHzEdMBsGA1UEAxMUQW5kcm9pZCBLZXlz
5+
dG9yZSBLZXkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARFwvPOP50WwOCp4naL
6+
xQPlmgz1ZknhHT6kIt133jk66CW+Waxas3A7b4XhPFYwVrs7M8gir1/1uBRD7KYQ
7+
oxlRo4IB0jCCAc4wDgYDVR0PAQH/BAQDAgeAMIIBugYKKwYBBAHWeQIBEQSCAaow
8+
ggGmAgIB9AoBAQICAfQKAQEEJDVjMDk2ZjBmLWU5OTgtNDA1OS1iZGVjLWJlMzZk
9+
OTI4YmQ4ZAQAMIGMv4MVAwIBKr+FPQgCBgGfOKRCCb+FRU8ETTBLMSUwIwQeY29t
10+
Lmdvb2dsZS5hbmRyb2lkLmF0dGVzdGF0aW9uAgEBMSIEIBA5OO5FN+WejueS9lRQ
11+
T7g0b8azRtC7xEFfwzn8/I7Bv4VUIgQgal4AdvgYUvh6qnkfO7Wmn25Qtfs9I+pp
12+
4bbUBMm7N+4wgd6hCDEGAgECAgEDogMCAQOjBAICAQClBTEDAgEEqgMCAQG/g3cC
13+
BQC/hT4DAgEAv4VATDBKBCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
14+
AAEBAAoBAgQgUXikZWsan/XtVtixCSRIFR1OcFjTW3kzCaiHo2z23za/hUEFAgMC
15+
mBC/hUIFAgMDF3C/hUYIBAZnb29nbGW/hUcGBAR0ZWd1v4VIBgQEdGVndb+FTAgE
16+
Bkdvb2dsZb+FTQoECFBpeGVsIDlhv4VOBgIEATUnxb+FTwYCBAE1J8UwCgYIKoZI
17+
zj0EAwIDSAAwRQIhAOU1RMOy63BMRqKPcs04Z7R+x/2Y57rFXyKyfvMi4w5dAiBW
18+
n7K6FqPSni9aeceAa4E2WOW3xQkT6oY6DGpzR13Dag==
19+
-----END CERTIFICATE-----
20+
-----BEGIN CERTIFICATE-----
21+
MIIB4DCCAYagAwIBAgIRAJtefDMCUvoMaYo/I9MaSmQwCgYIKoZIzj0EAwIwKTET
22+
MBEGA1UEChMKR29vZ2xlIExMQzESMBAGA1UEAxMJRHJvaWQgQ0EzMB4XDTI2MDcw
23+
NDE4MDQ1MVoXDTI2MDcxODIwMjIwNFowOTEMMAoGA1UEChMDVEVFMSkwJwYDVQQD
24+
EyA5YjVlN2MzMzAyNTJmYTBjNjk4YTNmMjNkMzFhNGE2NDBZMBMGByqGSM49AgEG
25+
CCqGSM49AwEHA0IABEi/O1zevCLR+M8NUjl28JJZEGWN5lHtH4fsaDSIPRXMXDBF
26+
TmxqCQC6miw8HKcX221Z98Y27mdWYPWiLqD6TIOjfzB9MB0GA1UdDgQWBBTAgFTi
27+
pHNqqPjhN1h228Yafkjm3TAfBgNVHSMEGDAWgBT4fpA9v89ERJ4Y363a5PfjP43h
28+
ojAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICBDAaBgorBgEEAdZ5AgEe
29+
BAyiARhAA2ZHb29nbGUwCgYIKoZIzj0EAwIDSAAwRQIhAPg3pTn1EQjFNZm0TfYs
30+
2MQsn9WQXZEt5Kp3pt0Qp9RiAiAHRml/xPm148ozwgffSYiubn/dYAece2MkbZy4
31+
p4MtCw==
32+
-----END CERTIFICATE-----
33+
-----BEGIN CERTIFICATE-----
34+
MIIC7zCCAnWgAwIBAgITLs5V2cvAv404tD1I6pmGCOQyIDAKBggqhkjOPQQDAzAp
35+
MRMwEQYDVQQKEwpHb29nbGUgTExDMRIwEAYDVQQDEwlEcm9pZCBDQTIwHhcNMjYw
36+
NzA0MDczNDE2WhcNMjYwOTEyMDczNDE1WjApMRMwEQYDVQQKEwpHb29nbGUgTExD
37+
MRIwEAYDVQQDEwlEcm9pZCBDQTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASs
38+
dB6wBxJ7d9ZXIAyKBnb0cc/h2tGXyTC1AV0SvxXPAJntU83bXFTNq0ggOP04Cm5d
39+
lFAHlwTKHnFbIRBdAkxHo4IBejCCAXYwDgYDVR0PAQH/BAQDAgIEMA8GA1UdEwEB
40+
/wQFMAMBAf8wHQYDVR0OBBYEFPh+kD2/z0REnhjfrdrk9+M/jeGiMB8GA1UdIwQY
41+
MBaAFEUgMj4fpvmPHNXDRy7UelD+O6jgMIGNBggrBgEFBQcBAQSBgDB+MHwGCCsG
42+
AQUFBzAChnBodHRwOi8vcHJpdmF0ZWNhLWNvbnRlbnQtNjllMzUyMjktMDAwMC0y
43+
OGZmLWI1MDYtMTRjMTRlZjVhYzU4LnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vMDFk
44+
MWQxYmNiNzMyNjg1NzlhNWYvY2EuY3J0MIGCBgNVHR8EezB5MHegdaBzhnFodHRw
45+
Oi8vcHJpdmF0ZWNhLWNvbnRlbnQtNjllMzUyMjktMDAwMC0yOGZmLWI1MDYtMTRj
46+
MTRlZjVhYzU4LnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vMDFkMWQxYmNiNzMyNjg1
47+
NzlhNWYvY3JsLmNybDAKBggqhkjOPQQDAwNoADBlAjEA1PPAlofqbh/K1r+sM+iE
48+
P6OKvoJgi8AJ9njDe7dgmBrnrsMhlaF6zhCmFfGeJxy+AjAsiI5c4mNvSxqBVcl1
49+
jqJcSLVFCA5gnPxOuYrmx6wsPvRDu6dkf9ZiFLKvnScrcq8=
50+
-----END CERTIFICATE-----
51+
-----BEGIN CERTIFICATE-----
52+
MIICZTCCAeugAwIBAgIRALGEywXsUP3JhfDsUyl8+CMwCgYIKoZIzj0EAwMwUjEc
53+
MBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET
54+
MBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjYwMjA5MTk1NzEw
55+
WhcNMjkwMjA4MTk1NzEwWjApMRMwEQYDVQQKEwpHb29nbGUgTExDMRIwEAYDVQQD
56+
EwlEcm9pZCBDQTIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAT19+tRAlmwuauVyRrg
57+
HqykkymaEkOS1IYSoXAQyBRvUNEnY5FGqmi44dOWcqMxu0uIbB3in5TD3GsR1NBm
58+
i3f//mI0aiARbBtdP3YaIff8yy076NY9dPMnBiCMIwjRR2Cjga0wgaowRwYDVR0f
59+
BEAwPjA8oDqgOIY2aHR0cHM6Ly9hbmRyb2lkLmdvb2dsZWFwaXMuY29tL2F0dGVz
60+
dGF0aW9uL2tleV9jYTEuY3JsMB0GA1UdDgQWBBRFIDI+H6b5jxzVw0cu1HpQ/juo
61+
4DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRS
62+
Mrss+0ZDm9zWgakOZWbgNEHqQDAKBggqhkjOPQQDAwNoADBlAjBfOXmY1+SCcT/o
63+
WL17AuVS7uoxMXssLksjChHT+VhTMpWu9J42x3G20hHVGTj+3ZICMQDBYZjd7+vf
64+
uyLVCZkTX7wlvjcRJjvrEWyxvkZE5vlq8c3lwH9JyNBP3OeTd3o8IJs=
65+
-----END CERTIFICATE-----
66+
-----BEGIN CERTIFICATE-----
67+
MIICIjCCAaigAwIBAgIRAISp0Cl7DrWK5/8OgN52BgUwCgYIKoZIzj0EAwMwUjEc
68+
MBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET
69+
MBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjUwNzE3MjIzMjE4
70+
WhcNMzUwNzE1MjIzMjE4WjBSMRwwGgYDVQQDDBNLZXkgQXR0ZXN0YXRpb24gQ0Ex
71+
MRAwDgYDVQQLDAdBbmRyb2lkMRMwEQYDVQQKDApHb29nbGUgTExDMQswCQYDVQQG
72+
EwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABCPaI3FO3z5bBQo8cuiEas4HjqCt
73+
G/mLFfRT0MsIssPBEEU5Cfbt6sH5yOAxqEi5QagpU1yX4HwnGb7OtBYpDTB57uH5
74+
Eczm34A5FNijV3s0/f0UPl7zbJcTx6xwqMIRq6NCMEAwDwYDVR0TAQH/BAUwAwEB
75+
/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFFIyuyz7RkOb3NaBqQ5lZuA0QepA
76+
MAoGCCqGSM49BAMDA2gAMGUCMETfjPO/HwqReR2CS7p0ZWoD/LHs6hDi422opifH
77+
EUaYLxwGlT9SLdjkVpz0UUOR5wIxAIoGyxGKRHVTpqpGRFiJtQEOOTp/+s1GcxeY
78+
uR2zh/80lQyu9vAFCj6E4AXc+osmRg==
79+
-----END CERTIFICATE-----
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"attestationVersion": "500",
3+
"attestationSecurityLevel": "TRUSTED_ENVIRONMENT",
4+
"keyMintVersion": "500",
5+
"keyMintSecurityLevel": "TRUSTED_ENVIRONMENT",
6+
"attestationChallenge": "YjE2MzFkYWItMmU2Yy00NjVmLThhN2YtMjRhNjE1MmE1MThh",
7+
"uniqueId": "",
8+
"softwareEnforced": {
9+
"creationDateTime": "1782942965900",
10+
"attestationApplicationId": {
11+
"packages": [
12+
{ "name": "com.google.android.attestation", "version": "1" }
13+
],
14+
"signatures": ["EDk47kU35Z6O55L2VFBPuDRvxrNG0LvEQV/DOfz8jsE="]
15+
},
16+
"moduleHash": "al4AdvgYUvh6qnkfO7Wmn25Qtfs9I+pp4bbUBMm7N+4=",
17+
"areTagsOrdered": true
18+
},
19+
"hardwareEnforced": {
20+
"purposes": ["2", "3"],
21+
"algorithms": "3",
22+
"keySize": "256",
23+
"digests": ["4"],
24+
"ecCurve": "1",
25+
"noAuthRequired": true,
26+
"trustedConfirmationRequired": true,
27+
"origin": "GENERATED",
28+
"rootOfTrust": {
29+
"verifiedBootKey": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
30+
"deviceLocked": false,
31+
"verifiedBootState": "UNVERIFIED",
32+
"verifiedBootHash": "UXikZWsan/XtVtixCSRIFR1OcFjTW3kzCaiHo2z23zY="
33+
},
34+
"osVersion": "170000",
35+
"osPatchLevel": "202608",
36+
"attestationIdBrand": "google",
37+
"attestationIdDevice": "tegu",
38+
"attestationIdProduct": "tegu",
39+
"attestationIdManufacturer": "Google",
40+
"attestationIdModel": "Pixel 9a",
41+
"vendorPatchLevel": "20260805",
42+
"bootPatchLevel": "20260805",
43+
"areTagsOrdered": true
44+
}
45+
}

0 commit comments

Comments
 (0)