1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
| // Header
{
"typ": "JWT",
"alg": "ES256", // NIST P-256,
"x5c": [
"<cert_GMS>",
"<intermediate_1>",
"<intermediate_n>"
] // see RFC-7515, 4.1.6>
}
// body (Android) {
"iss": "<String>", // GMS-ID or Domain
"sub": "<String>", // pubkey_mTLS_fingerprint (SHA256)
"iat": "<NumericDate>",
"exp": "<int>", // expiration date
"jti": "<UUID>", // random UUID - for blacklisting before expiration
"type": "android",
"userIdentifier": "<String>", // KVNR
"deviceHealth": { //see DSR-RFC-06
"integrityVerdict": {
"appIntegrity": {
"appRecognitionVerdict": "<String>", // PLAY_RECOGNIZED, UNRECOGNIZED_VERSION, UNEVALUATED
"packageName": "<String>", // e.g. com.package.name
"certificateSha256Digest": "<String>", // e.g. 6a6a1474b5cbbb2b1aa57e0bc3
"versionCode": "<String>" // e.g. 42
},
"deviceIntegrity": {
"deviceRecognitionVerdict": [
"<String>",
"<String>"
] // MEETS_DEVICE_INTEGRITY, MEETS_BASIC_INTEGRITY, MEETS_STRONG_INTEGRITY, MEETS_VIRTUAL_INTEGRITY, empty string
},
"accountDetails": {
"appLicensingVerdict": "<String>" // LICENSED, UNLICENSED, or UNEVALUATED
}
},
"keyIdAttestation": {
"attestationVersion": "<int>", // 1, 2, 3, 4, 100, 200
"attestationSecurityLevel": "<int>", // Software (0),TrustedEnvironment (1), StrongBox (2),
"keyStore": {
"type": "<String>", // KEY_MASTER, KEY_MINT
"version": "<int>",
"securityLevel": "<int>" // Software (0),TrustedEnvironment (1), StrongBox (2),
},
// attestation challenge is not forwarded!
"softwareEnforced": { // content is optional
// see DSR-RFC-06
},
"teeEnforced": { // content is optional
// see DSR-RFC-06
}
},
"deviceAttributes": { //see DSR-RFC-06
"build": {
"version": {
"sdkInit": "<int>", // Build.VERSION.SDK_INIT,
"securityPatch": "<String>" // Build.VERSION.SECURITY_PATCH
},
"manufacturer": "<String>",
"product": "<String>",
"model": "<String>",
"board": "<String>"
},
"ro": {
"crypto": {
"state": "<boolean>" // ro.crypto.state
},
"product": {
"firstAPILevel": "<int>" //ro.product.first_api_level
}
},
"packageManager": {
"featureVerifiedBoot": "<boolean>" // PackageManager.FEATURE_VERIFIED_BOOT
},
"keyguardManager": {
"isDeviceSecure": "<boolean / null>" // KeyguardManager.isDeviceSecure()
},
"biometricManager": {
"deviceCredential": "<boolean / null>", // BiometricManager.canAuthenticate(BiometricManager.Authenticators.DEVICE_CREDENTIAL) or BiometricManager.canAuthenticate(Authenticators#DEVICE_CREDENTIAL)
"biometricStrong": "<boolean / null>" // BiometricManager.canAuthenticate(Authenticators#BIOMETRIC_STRONG)
},
"devicePolicyManager": {
"passwordComplexity": "<int>" //DevicePolicyManager.getPasswordComplexity(), PASSWORD_COMPLEXITY_NONE, PASSWORD_COMPLEXITY_LOW, PASSWORD_COMPLEXITY_MEDIUM, or PASSWORD_COMPLEXITY_HIGH
}
}
},
"cnf": { // confirmation claim, RFC-8705
"x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" // X.509 Certificate SHA-256 Thumbprint
}
}
// body (Apple)
{
"iss": "<String>", // GMS-ID or Domain
"sub": "<String>", // pubkey_mTLS_fingerprint (SHA256)
"iat": "<NumericDate>",
"exp": "<int>", // expiration date
"jti": "<UUID>", // random UUID - for blacklisting before expiration
"type": "apple",
"userIdentifier": "<String>", // KVNR
"deviceHealth": { // see DSR-RFC-06
"assertion": {
"rpID": "<int>", // A hash of your app’s App ID, which is the concatenation of your 10-digit team identifier, a period, and your app’s CFBundleIdentifier value.
"counter": "<int>", // A value that reports the number of times your app has used the attested key to sign an assertion.
"riskMetric": "<int>" // indicates the number of attested keys associated with a given device over the lifetime of the device. Look for this value to be a low number.
},
"deviceAttributes": { //see DSR-RFC-06
"UIDevice": {
"systemName": "<String>", // UIDevice.systemName
"systemVersion": "<String>", // UIDevice.systemVersion
"identifierForVendor": "<UUID>" // UIDevice.identifierForVendor
},
"appVersion": "<String>"
}
},
"cnf": { // confirmation claim, RFC-8705
"x5t#S256": "bwcK0esc3ACC3DB2Y5_lESsXE8o9ltc05O89jdN-dg2" // X.509 Certificate SHA-256 Thumbprint
}
}
// Signature
{..}
|