@simplewebauthn/server 13.1.0 → 13.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/registration/verifications/tpm/constants.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAkB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAsC5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAUlD,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAiFhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/D,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/registration/verifications/tpm/constants.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAkB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAsC5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAUlD,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAgChE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/D,CAAC"}
@@ -93,86 +93,37 @@ export const TPM_ECC_CURVE = {
93
93
  * https://trustedcomputinggroup.org/wp-content/uploads/TCG-TPM-Vendor-ID-Registry-Version-1.02-Revision-1.00.pdf
94
94
  */
95
95
  export const TPM_MANUFACTURERS = {
96
- 'id:414D4400': {
97
- name: 'AMD',
98
- id: 'AMD',
99
- },
100
- 'id:41544D4C': {
101
- name: 'Atmel',
102
- id: 'ATML',
103
- },
104
- 'id:4252434D': {
105
- name: 'Broadcom',
106
- id: 'BRCM',
107
- },
108
- 'id:49424d00': {
109
- name: 'IBM',
110
- id: 'IBM',
111
- },
112
- 'id:49424D00': {
113
- name: 'IBM',
114
- id: 'IBM',
115
- },
116
- 'id:49465800': {
117
- name: 'Infineon',
118
- id: 'IFX',
119
- },
120
- 'id:494E5443': {
121
- name: 'Intel',
122
- id: 'INTC',
123
- },
124
- 'id:4C454E00': {
125
- name: 'Lenovo',
126
- id: 'LEN',
127
- },
128
- 'id:4E534D20': {
129
- name: 'National Semiconductor',
130
- id: 'NSM',
131
- },
132
- 'id:4E545A00': {
133
- name: 'Nationz',
134
- id: 'NTZ',
135
- },
136
- 'id:4E544300': {
137
- name: 'Nuvoton Technology',
138
- id: 'NTC',
139
- },
140
- 'id:51434F4D': {
141
- name: 'Qualcomm',
142
- id: 'QCOM',
143
- },
144
- 'id:534D5343': {
145
- name: 'SMSC',
146
- id: 'SMSC',
147
- },
148
- 'id:53544D20': {
149
- name: 'ST Microelectronics',
150
- id: 'STM',
151
- },
152
- 'id:534D534E': {
153
- name: 'Samsung',
154
- id: 'SMSN',
155
- },
156
- 'id:534E5300': {
157
- name: 'Sinosun',
158
- id: 'SNS',
159
- },
160
- 'id:54584E00': {
161
- name: 'Texas Instruments',
162
- id: 'TXN',
163
- },
164
- 'id:57454300': {
165
- name: 'Winbond',
166
- id: 'WEC',
167
- },
168
- 'id:524F4343': {
169
- name: 'Fuzhouk Rockchip',
170
- id: 'ROCC',
171
- },
172
- 'id:FFFFF1D0': {
173
- name: 'FIDO Alliance',
174
- id: 'FIDO',
175
- },
96
+ 'id:414D4400': { name: 'AMD', id: 'AMD' },
97
+ 'id:414E5400': { name: 'Ant Group', id: 'ANT' },
98
+ 'id:41544D4C': { name: 'Atmel', id: 'ATML' },
99
+ 'id:4252434D': { name: 'Broadcom', id: 'BRCM' },
100
+ 'id:4353434F': { name: 'Cisco', id: 'CSCO' },
101
+ 'id:464C5953': { name: 'Flyslice Technologies', id: 'FLYS' },
102
+ 'id:524F4343': { name: 'Fuzhou Rockchip', id: 'ROCC' },
103
+ 'id:474F4F47': { name: 'Google', id: 'GOOG' },
104
+ 'id:48504900': { name: 'HPI', id: 'HPI' },
105
+ 'id:48504500': { name: 'HPE', id: 'HPE' },
106
+ 'id:48495349': { name: 'Huawei', id: 'HISI' },
107
+ 'id:49424d00': { name: 'IBM', id: 'IBM' },
108
+ 'id:49424D00': { name: 'IBM', id: 'IBM' }, // Same ID for IBM as above, except the "D" is capitalized as per TPM spec
109
+ 'id:49465800': { name: 'Infineon', id: 'IFX' },
110
+ 'id:494E5443': { name: 'Intel', id: 'INTC' },
111
+ 'id:4C454E00': { name: 'Lenovo', id: 'LEN' },
112
+ 'id:4D534654': { name: 'Microsoft', id: 'MSFT' },
113
+ 'id:4E534D20': { name: 'National Semiconductor', id: 'NSM' },
114
+ 'id:4E545A00': { name: 'Nationz', id: 'NTZ' },
115
+ 'id:4E534700': { name: 'NSING', id: 'NSG' },
116
+ 'id:4E544300': { name: 'Nuvoton Technology', id: 'NTC' },
117
+ 'id:51434F4D': { name: 'Qualcomm', id: 'QCOM' },
118
+ 'id:534D534E': { name: 'Samsung', id: 'SMSN' },
119
+ 'id:53454345': { name: 'SecEdge', id: 'SECE' },
120
+ 'id:534E5300': { name: 'Sinosun', id: 'SNS' },
121
+ 'id:534D5343': { name: 'SMSC', id: 'SMSC' },
122
+ 'id:53544D20': { name: 'STMicroelectronics', id: 'STM' },
123
+ 'id:54584E00': { name: 'Texas Instruments', id: 'TXN' },
124
+ 'id:57454300': { name: 'Winbond', id: 'WEC' },
125
+ 'id:5345414C': { name: 'Wisekey', id: 'SEAL' },
126
+ 'id:FFFFF1D0': { name: 'FIDO Alliance', id: 'FIDO' }, // FIDO Conformance
176
127
  };
177
128
  /**
178
129
  * Match TPM public area curve ID's to `crv` numbers used in COSE public keys
@@ -1 +1 @@
1
- {"version":3,"file":"verifyAttestationAndroidKey.d.ts","sourceRoot":"","sources":["../../../src/registration/verifications/verifyAttestationAndroidKey.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAUtF;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC,CA+HlB"}
1
+ {"version":3,"file":"verifyAttestationAndroidKey.d.ts","sourceRoot":"","sources":["../../../src/registration/verifications/verifyAttestationAndroidKey.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAUtF;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC,CA0JlB"}
@@ -18,44 +18,55 @@ export async function verifyAttestationAndroidKey(options) {
18
18
  const sig = attStmt.get('sig');
19
19
  const alg = attStmt.get('alg');
20
20
  if (!x5c) {
21
- throw new Error('No attestation certificate provided in attestation statement (AndroidKey)');
21
+ throw new Error('No attestation certificate provided in attestation statement (Android Key)');
22
22
  }
23
23
  if (!sig) {
24
- throw new Error('No attestation signature provided in attestation statement (AndroidKey)');
24
+ throw new Error('No attestation signature provided in attestation statement (Android Key)');
25
25
  }
26
26
  if (!alg) {
27
- throw new Error(`Attestation statement did not contain alg (AndroidKey)`);
27
+ throw new Error(`Attestation statement did not contain alg (Android Key)`);
28
28
  }
29
29
  if (!isCOSEAlg(alg)) {
30
- throw new Error(`Attestation statement contained invalid alg ${alg} (AndroidKey)`);
30
+ throw new Error(`Attestation statement contained invalid alg ${alg} (Android Key)`);
31
31
  }
32
- // Check that credentialPublicKey matches the public key in the attestation certificate
32
+ /**
33
+ * Verify that the public key in the first certificate in x5c matches the credentialPublicKey in
34
+ * the attestedCredentialData in authenticatorData.
35
+ */
33
36
  // Find the public cert in the certificate as PKCS
34
37
  const parsedCert = AsnParser.parse(x5c[0], Certificate);
35
38
  const parsedCertPubKey = new Uint8Array(parsedCert.tbsCertificate.subjectPublicKeyInfo.subjectPublicKey);
36
39
  // Convert the credentialPublicKey to PKCS
37
40
  const credPubKeyPKCS = convertCOSEtoPKCS(credentialPublicKey);
38
41
  if (!isoUint8Array.areEqual(credPubKeyPKCS, parsedCertPubKey)) {
39
- throw new Error('Credential public key does not equal leaf cert public key (AndroidKey)');
42
+ throw new Error('Credential public key does not equal leaf cert public key (Android Key)');
40
43
  }
44
+ /**
45
+ * Verify that the attestationChallenge field in the attestation certificate extension data is
46
+ * identical to clientDataHash.
47
+ */
41
48
  // Find Android KeyStore Extension in certificate extensions
42
49
  const extKeyStore = parsedCert.tbsCertificate.extensions?.find((ext) => ext.extnID === id_ce_keyDescription);
43
50
  if (!extKeyStore) {
44
- throw new Error('Certificate did not contain extKeyStore (AndroidKey)');
51
+ throw new Error('Certificate did not contain extKeyStore (Android Key)');
45
52
  }
46
53
  const parsedExtKeyStore = AsnParser.parse(extKeyStore.extnValue, KeyDescription);
47
54
  // Verify extKeyStore values
48
55
  const { attestationChallenge, teeEnforced, softwareEnforced } = parsedExtKeyStore;
49
56
  if (!isoUint8Array.areEqual(new Uint8Array(attestationChallenge.buffer), clientDataHash)) {
50
- throw new Error('Attestation challenge was not equal to client data hash (AndroidKey)');
57
+ throw new Error('Attestation challenge was not equal to client data hash (Android Key)');
51
58
  }
52
- // Ensure that the key is strictly bound to the caller app identifier (shouldn't contain the
53
- // [600] tag)
59
+ /**
60
+ * The AuthorizationList.allApplications field is not present on either authorization list
61
+ * (softwareEnforced nor teeEnforced), since PublicKeyCredential MUST be scoped to the RP ID.
62
+ *
63
+ * (i.e. These shouldn't contain the [600] tag)
64
+ */
54
65
  if (teeEnforced.allApplications !== undefined) {
55
- throw new Error('teeEnforced contained "allApplications [600]" tag (AndroidKey)');
66
+ throw new Error('teeEnforced contained "allApplications [600]" tag (Android Key)');
56
67
  }
57
68
  if (softwareEnforced.allApplications !== undefined) {
58
- throw new Error('teeEnforced contained "allApplications [600]" tag (AndroidKey)');
69
+ throw new Error('teeEnforced contained "allApplications [600]" tag (Android Key)');
59
70
  }
60
71
  const statement = await MetadataService.getStatement(aaguid);
61
72
  if (statement) {
@@ -69,19 +80,36 @@ export async function verifyAttestationAndroidKey(options) {
69
80
  }
70
81
  catch (err) {
71
82
  const _err = err;
72
- throw new Error(`${_err.message} (AndroidKey)`);
83
+ throw new Error(`${_err.message} (Android Key)`);
73
84
  }
74
85
  }
75
86
  else {
87
+ /**
88
+ * Verify that x5c contains a full certificate path.
89
+ */
90
+ const x5cNoRootPEM = x5c.slice(0, -1).map(convertCertBufferToPEM);
91
+ const x5cRootPEM = x5c.slice(-1).map(convertCertBufferToPEM);
76
92
  try {
77
- // Try validating the certificate path using the root certificates set via SettingsService
78
- await validateCertificatePath(x5c.map(convertCertBufferToPEM), rootCertificates);
93
+ await validateCertificatePath(x5cNoRootPEM, x5cRootPEM);
79
94
  }
80
95
  catch (err) {
81
96
  const _err = err;
82
- throw new Error(`${_err.message} (AndroidKey)`);
97
+ throw new Error(`${_err.message} (Android Key)`);
98
+ }
99
+ /**
100
+ * Make sure the root certificate is one of the Google Hardware Attestation Root certificates
101
+ *
102
+ * https://developer.android.com/privacy-and-security/security-key-attestation#root_certificate
103
+ */
104
+ if (rootCertificates.length > 0 && rootCertificates.indexOf(x5cRootPEM[0]) < 0) {
105
+ throw new Error('x5c root certificate was not a known root certificate (Android Key)');
83
106
  }
84
107
  }
108
+ /**
109
+ * Verify that sig is a valid signature over the concatenation of authenticatorData and
110
+ * clientDataHash using the public key in the first certificate in x5c with the algorithm
111
+ * specified in alg.
112
+ */
85
113
  const signatureBase = isoUint8Array.concat([authData, clientDataHash]);
86
114
  return verifySignature({
87
115
  signature: sig,
@@ -22,4 +22,28 @@ export declare const Google_Hardware_Attestation_Root_1 = "-----BEGIN CERTIFICAT
22
22
  * 1E:F1:A0:4B:8B:A5:8A:B9:45:89:AC:49:8C:89:82:A7:83:F2:4E:A7:30:7E:01:59:A0:C3:A7:3B:37:7D:87:CC
23
23
  */
24
24
  export declare const Google_Hardware_Attestation_Root_2 = "-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz\nNzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu\nXKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U\nh6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno\nL/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok\nQBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA\nD32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI\nmMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW\nFua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91\noeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o\njm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB\nZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH\nex0SdDrx+tWUDqG8At2JHA==\n-----END CERTIFICATE-----\n";
25
+ /**
26
+ * Google Hardware Attestation Root 3
27
+ *
28
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
29
+ * (third entry)
30
+ *
31
+ * Valid until 2036-11-13 @ 15:10 PST
32
+ *
33
+ * SHA256 Fingerprint
34
+ * AB:66:41:17:8A:36:E1:79:AA:0C:1C:DD:DF:9A:16:EB:45:FA:20:94:3E:2B:8C:D7:C7:C0:5C:26:CF:8B:48:7A
35
+ */
36
+ export declare const Google_Hardware_Attestation_Root_3 = "\n-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx\nMDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG\nzWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan\n63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T\nQH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ\nerGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL\nZez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a\n0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH\n7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b\nHQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w\nlZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2\nOb3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7\nmD/vFDkzF+wm7cyWpQpCVQ==\n-----END CERTIFICATE-----\n";
37
+ /**
38
+ * Google Hardware Attestation Root 4
39
+ *
40
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
41
+ * (fourth entry)
42
+ *
43
+ * Valid until 2042-03-15 @ 11:07 PDT
44
+ *
45
+ * SHA256 Fingerprint
46
+ * CE:DB:1C:B6:DC:89:6A:E5:EC:79:73:48:BC:E9:28:67:53:C2:B3:8E:E7:1C:E0:FB:E3:4A:9A:12:48:80:0D:FC
47
+ */
48
+ export declare const Google_Hardware_Attestation_Root_4 = "\n-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw\nNzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7\n174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC\nW/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G\ntkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx\noSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG\n1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF\nmr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz\nlHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw\nn6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu\nzbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo\nvaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn\nw1IdYIg2Wxg7yHcQZemFQg==\n-----END CERTIFICATE-----\n";
25
49
  //# sourceMappingURL=android-key.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"android-key.d.ts","sourceRoot":"","sources":["../../../src/services/defaultRootCerts/android-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,u6DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,60DA8B9C,CAAC"}
1
+ {"version":3,"file":"android-key.d.ts","sourceRoot":"","sources":["../../../src/services/defaultRootCerts/android-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,u6DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,60DA8B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,+0DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,+0DA+B9C,CAAC"}
@@ -83,3 +83,89 @@ ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
83
83
  ex0SdDrx+tWUDqG8At2JHA==
84
84
  -----END CERTIFICATE-----
85
85
  `;
86
+ /**
87
+ * Google Hardware Attestation Root 3
88
+ *
89
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
90
+ * (third entry)
91
+ *
92
+ * Valid until 2036-11-13 @ 15:10 PST
93
+ *
94
+ * SHA256 Fingerprint
95
+ * AB:66:41:17:8A:36:E1:79:AA:0C:1C:DD:DF:9A:16:EB:45:FA:20:94:3E:2B:8C:D7:C7:C0:5C:26:CF:8B:48:7A
96
+ */
97
+ export const Google_Hardware_Attestation_Root_3 = `
98
+ -----BEGIN CERTIFICATE-----
99
+ MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
100
+ BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx
101
+ MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
102
+ AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
103
+ Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
104
+ tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
105
+ nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
106
+ C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
107
+ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
108
+ JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
109
+ sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
110
+ igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
111
+ RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
112
+ aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
113
+ AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
114
+ IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
115
+ VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG
116
+ zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan
117
+ 63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T
118
+ QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ
119
+ erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL
120
+ Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a
121
+ 0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH
122
+ 7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b
123
+ HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w
124
+ lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2
125
+ Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7
126
+ mD/vFDkzF+wm7cyWpQpCVQ==
127
+ -----END CERTIFICATE-----
128
+ `;
129
+ /**
130
+ * Google Hardware Attestation Root 4
131
+ *
132
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
133
+ * (fourth entry)
134
+ *
135
+ * Valid until 2042-03-15 @ 11:07 PDT
136
+ *
137
+ * SHA256 Fingerprint
138
+ * CE:DB:1C:B6:DC:89:6A:E5:EC:79:73:48:BC:E9:28:67:53:C2:B3:8E:E7:1C:E0:FB:E3:4A:9A:12:48:80:0D:FC
139
+ */
140
+ export const Google_Hardware_Attestation_Root_4 = `
141
+ -----BEGIN CERTIFICATE-----
142
+ MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
143
+ BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw
144
+ NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
145
+ AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
146
+ Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
147
+ tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
148
+ nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
149
+ C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
150
+ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
151
+ JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
152
+ sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
153
+ igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
154
+ RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
155
+ aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
156
+ AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
157
+ IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
158
+ VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7
159
+ 174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC
160
+ W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G
161
+ tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx
162
+ oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG
163
+ 1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF
164
+ mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz
165
+ lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw
166
+ n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu
167
+ zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo
168
+ vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn
169
+ w1IdYIg2Wxg7yHcQZemFQg==
170
+ -----END CERTIFICATE-----
171
+ `;
@@ -1,4 +1,4 @@
1
- import { AttestationFormat } from '../helpers/decodeAttestationObject.js';
1
+ import type { AttestationFormat } from '../helpers/decodeAttestationObject.js';
2
2
  export type RootCertIdentifier = AttestationFormat | 'mds';
3
3
  interface SettingsService {
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"settingsService.d.ts","sourceRoot":"","sources":["../../src/services/settingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAW1E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAE3D,UAAU,eAAe;IACvB;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,kBAAkB,CAAC;QAC/B,YAAY,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;KACvC,GAAG,IAAI,CAAC;IAET;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,kBAAkB,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;CACzE;AAkCD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,eAA2C,CAAC"}
1
+ {"version":3,"file":"settingsService.d.ts","sourceRoot":"","sources":["../../src/services/settingsService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAa/E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAE3D,UAAU,eAAe;IACvB;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,kBAAkB,CAAC;QAC/B,YAAY,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;KACvC,GAAG,IAAI,CAAC;IAET;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,kBAAkB,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;CACzE;AAkCD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,eAA2C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { convertCertBufferToPEM } from '../helpers/convertCertBufferToPEM.js';
2
2
  import { GlobalSign_Root_CA } from './defaultRootCerts/android-safetynet.js';
3
- import { Google_Hardware_Attestation_Root_1, Google_Hardware_Attestation_Root_2, } from './defaultRootCerts/android-key.js';
3
+ import { Google_Hardware_Attestation_Root_1, Google_Hardware_Attestation_Root_2, Google_Hardware_Attestation_Root_3, Google_Hardware_Attestation_Root_4, } from './defaultRootCerts/android-key.js';
4
4
  import { Apple_WebAuthn_Root_CA } from './defaultRootCerts/apple.js';
5
5
  import { GlobalSign_Root_CA_R3 } from './defaultRootCerts/mds.js';
6
6
  class BaseSettingsService {
@@ -53,6 +53,8 @@ SettingsService.setRootCertificates({
53
53
  certificates: [
54
54
  Google_Hardware_Attestation_Root_1,
55
55
  Google_Hardware_Attestation_Root_2,
56
+ Google_Hardware_Attestation_Root_3,
57
+ Google_Hardware_Attestation_Root_4,
56
58
  ],
57
59
  });
58
60
  SettingsService.setRootCertificates({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplewebauthn/server",
3
- "version": "13.1.0",
3
+ "version": "13.1.1",
4
4
  "description": "SimpleWebAuthn for Servers",
5
5
  "keywords": [
6
6
  "typescript",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/registration/verifications/tpm/constants.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAkB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAsC5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAUlD,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAiFhE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/D,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/registration/verifications/tpm/constants.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAkB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAsC5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAUlD,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAgChE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/D,CAAC"}
@@ -96,86 +96,37 @@ exports.TPM_ECC_CURVE = {
96
96
  * https://trustedcomputinggroup.org/wp-content/uploads/TCG-TPM-Vendor-ID-Registry-Version-1.02-Revision-1.00.pdf
97
97
  */
98
98
  exports.TPM_MANUFACTURERS = {
99
- 'id:414D4400': {
100
- name: 'AMD',
101
- id: 'AMD',
102
- },
103
- 'id:41544D4C': {
104
- name: 'Atmel',
105
- id: 'ATML',
106
- },
107
- 'id:4252434D': {
108
- name: 'Broadcom',
109
- id: 'BRCM',
110
- },
111
- 'id:49424d00': {
112
- name: 'IBM',
113
- id: 'IBM',
114
- },
115
- 'id:49424D00': {
116
- name: 'IBM',
117
- id: 'IBM',
118
- },
119
- 'id:49465800': {
120
- name: 'Infineon',
121
- id: 'IFX',
122
- },
123
- 'id:494E5443': {
124
- name: 'Intel',
125
- id: 'INTC',
126
- },
127
- 'id:4C454E00': {
128
- name: 'Lenovo',
129
- id: 'LEN',
130
- },
131
- 'id:4E534D20': {
132
- name: 'National Semiconductor',
133
- id: 'NSM',
134
- },
135
- 'id:4E545A00': {
136
- name: 'Nationz',
137
- id: 'NTZ',
138
- },
139
- 'id:4E544300': {
140
- name: 'Nuvoton Technology',
141
- id: 'NTC',
142
- },
143
- 'id:51434F4D': {
144
- name: 'Qualcomm',
145
- id: 'QCOM',
146
- },
147
- 'id:534D5343': {
148
- name: 'SMSC',
149
- id: 'SMSC',
150
- },
151
- 'id:53544D20': {
152
- name: 'ST Microelectronics',
153
- id: 'STM',
154
- },
155
- 'id:534D534E': {
156
- name: 'Samsung',
157
- id: 'SMSN',
158
- },
159
- 'id:534E5300': {
160
- name: 'Sinosun',
161
- id: 'SNS',
162
- },
163
- 'id:54584E00': {
164
- name: 'Texas Instruments',
165
- id: 'TXN',
166
- },
167
- 'id:57454300': {
168
- name: 'Winbond',
169
- id: 'WEC',
170
- },
171
- 'id:524F4343': {
172
- name: 'Fuzhouk Rockchip',
173
- id: 'ROCC',
174
- },
175
- 'id:FFFFF1D0': {
176
- name: 'FIDO Alliance',
177
- id: 'FIDO',
178
- },
99
+ 'id:414D4400': { name: 'AMD', id: 'AMD' },
100
+ 'id:414E5400': { name: 'Ant Group', id: 'ANT' },
101
+ 'id:41544D4C': { name: 'Atmel', id: 'ATML' },
102
+ 'id:4252434D': { name: 'Broadcom', id: 'BRCM' },
103
+ 'id:4353434F': { name: 'Cisco', id: 'CSCO' },
104
+ 'id:464C5953': { name: 'Flyslice Technologies', id: 'FLYS' },
105
+ 'id:524F4343': { name: 'Fuzhou Rockchip', id: 'ROCC' },
106
+ 'id:474F4F47': { name: 'Google', id: 'GOOG' },
107
+ 'id:48504900': { name: 'HPI', id: 'HPI' },
108
+ 'id:48504500': { name: 'HPE', id: 'HPE' },
109
+ 'id:48495349': { name: 'Huawei', id: 'HISI' },
110
+ 'id:49424d00': { name: 'IBM', id: 'IBM' },
111
+ 'id:49424D00': { name: 'IBM', id: 'IBM' }, // Same ID for IBM as above, except the "D" is capitalized as per TPM spec
112
+ 'id:49465800': { name: 'Infineon', id: 'IFX' },
113
+ 'id:494E5443': { name: 'Intel', id: 'INTC' },
114
+ 'id:4C454E00': { name: 'Lenovo', id: 'LEN' },
115
+ 'id:4D534654': { name: 'Microsoft', id: 'MSFT' },
116
+ 'id:4E534D20': { name: 'National Semiconductor', id: 'NSM' },
117
+ 'id:4E545A00': { name: 'Nationz', id: 'NTZ' },
118
+ 'id:4E534700': { name: 'NSING', id: 'NSG' },
119
+ 'id:4E544300': { name: 'Nuvoton Technology', id: 'NTC' },
120
+ 'id:51434F4D': { name: 'Qualcomm', id: 'QCOM' },
121
+ 'id:534D534E': { name: 'Samsung', id: 'SMSN' },
122
+ 'id:53454345': { name: 'SecEdge', id: 'SECE' },
123
+ 'id:534E5300': { name: 'Sinosun', id: 'SNS' },
124
+ 'id:534D5343': { name: 'SMSC', id: 'SMSC' },
125
+ 'id:53544D20': { name: 'STMicroelectronics', id: 'STM' },
126
+ 'id:54584E00': { name: 'Texas Instruments', id: 'TXN' },
127
+ 'id:57454300': { name: 'Winbond', id: 'WEC' },
128
+ 'id:5345414C': { name: 'Wisekey', id: 'SEAL' },
129
+ 'id:FFFFF1D0': { name: 'FIDO Alliance', id: 'FIDO' }, // FIDO Conformance
179
130
  };
180
131
  /**
181
132
  * Match TPM public area curve ID's to `crv` numbers used in COSE public keys
@@ -1 +1 @@
1
- {"version":3,"file":"verifyAttestationAndroidKey.d.ts","sourceRoot":"","sources":["../../../src/registration/verifications/verifyAttestationAndroidKey.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAUtF;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC,CA+HlB"}
1
+ {"version":3,"file":"verifyAttestationAndroidKey.d.ts","sourceRoot":"","sources":["../../../src/registration/verifications/verifyAttestationAndroidKey.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAUtF;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,OAAO,CAAC,CA0JlB"}
@@ -21,44 +21,55 @@ async function verifyAttestationAndroidKey(options) {
21
21
  const sig = attStmt.get('sig');
22
22
  const alg = attStmt.get('alg');
23
23
  if (!x5c) {
24
- throw new Error('No attestation certificate provided in attestation statement (AndroidKey)');
24
+ throw new Error('No attestation certificate provided in attestation statement (Android Key)');
25
25
  }
26
26
  if (!sig) {
27
- throw new Error('No attestation signature provided in attestation statement (AndroidKey)');
27
+ throw new Error('No attestation signature provided in attestation statement (Android Key)');
28
28
  }
29
29
  if (!alg) {
30
- throw new Error(`Attestation statement did not contain alg (AndroidKey)`);
30
+ throw new Error(`Attestation statement did not contain alg (Android Key)`);
31
31
  }
32
32
  if (!(0, cose_js_1.isCOSEAlg)(alg)) {
33
- throw new Error(`Attestation statement contained invalid alg ${alg} (AndroidKey)`);
33
+ throw new Error(`Attestation statement contained invalid alg ${alg} (Android Key)`);
34
34
  }
35
- // Check that credentialPublicKey matches the public key in the attestation certificate
35
+ /**
36
+ * Verify that the public key in the first certificate in x5c matches the credentialPublicKey in
37
+ * the attestedCredentialData in authenticatorData.
38
+ */
36
39
  // Find the public cert in the certificate as PKCS
37
40
  const parsedCert = asn1_schema_1.AsnParser.parse(x5c[0], asn1_x509_1.Certificate);
38
41
  const parsedCertPubKey = new Uint8Array(parsedCert.tbsCertificate.subjectPublicKeyInfo.subjectPublicKey);
39
42
  // Convert the credentialPublicKey to PKCS
40
43
  const credPubKeyPKCS = (0, convertCOSEtoPKCS_js_1.convertCOSEtoPKCS)(credentialPublicKey);
41
44
  if (!index_js_1.isoUint8Array.areEqual(credPubKeyPKCS, parsedCertPubKey)) {
42
- throw new Error('Credential public key does not equal leaf cert public key (AndroidKey)');
45
+ throw new Error('Credential public key does not equal leaf cert public key (Android Key)');
43
46
  }
47
+ /**
48
+ * Verify that the attestationChallenge field in the attestation certificate extension data is
49
+ * identical to clientDataHash.
50
+ */
44
51
  // Find Android KeyStore Extension in certificate extensions
45
52
  const extKeyStore = parsedCert.tbsCertificate.extensions?.find((ext) => ext.extnID === asn1_android_1.id_ce_keyDescription);
46
53
  if (!extKeyStore) {
47
- throw new Error('Certificate did not contain extKeyStore (AndroidKey)');
54
+ throw new Error('Certificate did not contain extKeyStore (Android Key)');
48
55
  }
49
56
  const parsedExtKeyStore = asn1_schema_1.AsnParser.parse(extKeyStore.extnValue, asn1_android_1.KeyDescription);
50
57
  // Verify extKeyStore values
51
58
  const { attestationChallenge, teeEnforced, softwareEnforced } = parsedExtKeyStore;
52
59
  if (!index_js_1.isoUint8Array.areEqual(new Uint8Array(attestationChallenge.buffer), clientDataHash)) {
53
- throw new Error('Attestation challenge was not equal to client data hash (AndroidKey)');
60
+ throw new Error('Attestation challenge was not equal to client data hash (Android Key)');
54
61
  }
55
- // Ensure that the key is strictly bound to the caller app identifier (shouldn't contain the
56
- // [600] tag)
62
+ /**
63
+ * The AuthorizationList.allApplications field is not present on either authorization list
64
+ * (softwareEnforced nor teeEnforced), since PublicKeyCredential MUST be scoped to the RP ID.
65
+ *
66
+ * (i.e. These shouldn't contain the [600] tag)
67
+ */
57
68
  if (teeEnforced.allApplications !== undefined) {
58
- throw new Error('teeEnforced contained "allApplications [600]" tag (AndroidKey)');
69
+ throw new Error('teeEnforced contained "allApplications [600]" tag (Android Key)');
59
70
  }
60
71
  if (softwareEnforced.allApplications !== undefined) {
61
- throw new Error('teeEnforced contained "allApplications [600]" tag (AndroidKey)');
72
+ throw new Error('teeEnforced contained "allApplications [600]" tag (Android Key)');
62
73
  }
63
74
  const statement = await metadataService_js_1.MetadataService.getStatement(aaguid);
64
75
  if (statement) {
@@ -72,19 +83,36 @@ async function verifyAttestationAndroidKey(options) {
72
83
  }
73
84
  catch (err) {
74
85
  const _err = err;
75
- throw new Error(`${_err.message} (AndroidKey)`);
86
+ throw new Error(`${_err.message} (Android Key)`);
76
87
  }
77
88
  }
78
89
  else {
90
+ /**
91
+ * Verify that x5c contains a full certificate path.
92
+ */
93
+ const x5cNoRootPEM = x5c.slice(0, -1).map(convertCertBufferToPEM_js_1.convertCertBufferToPEM);
94
+ const x5cRootPEM = x5c.slice(-1).map(convertCertBufferToPEM_js_1.convertCertBufferToPEM);
79
95
  try {
80
- // Try validating the certificate path using the root certificates set via SettingsService
81
- await (0, validateCertificatePath_js_1.validateCertificatePath)(x5c.map(convertCertBufferToPEM_js_1.convertCertBufferToPEM), rootCertificates);
96
+ await (0, validateCertificatePath_js_1.validateCertificatePath)(x5cNoRootPEM, x5cRootPEM);
82
97
  }
83
98
  catch (err) {
84
99
  const _err = err;
85
- throw new Error(`${_err.message} (AndroidKey)`);
100
+ throw new Error(`${_err.message} (Android Key)`);
101
+ }
102
+ /**
103
+ * Make sure the root certificate is one of the Google Hardware Attestation Root certificates
104
+ *
105
+ * https://developer.android.com/privacy-and-security/security-key-attestation#root_certificate
106
+ */
107
+ if (rootCertificates.length > 0 && rootCertificates.indexOf(x5cRootPEM[0]) < 0) {
108
+ throw new Error('x5c root certificate was not a known root certificate (Android Key)');
86
109
  }
87
110
  }
111
+ /**
112
+ * Verify that sig is a valid signature over the concatenation of authenticatorData and
113
+ * clientDataHash using the public key in the first certificate in x5c with the algorithm
114
+ * specified in alg.
115
+ */
88
116
  const signatureBase = index_js_1.isoUint8Array.concat([authData, clientDataHash]);
89
117
  return (0, verifySignature_js_1.verifySignature)({
90
118
  signature: sig,
@@ -22,4 +22,28 @@ export declare const Google_Hardware_Attestation_Root_1 = "-----BEGIN CERTIFICAT
22
22
  * 1E:F1:A0:4B:8B:A5:8A:B9:45:89:AC:49:8C:89:82:A7:83:F2:4E:A7:30:7E:01:59:A0:C3:A7:3B:37:7D:87:CC
23
23
  */
24
24
  export declare const Google_Hardware_Attestation_Root_2 = "-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJANUP8luj8tazMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMTkxMTIyMjAzNzU4WhcNMzQxMTE4MjAz\nNzU4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBOMaBc8oumXb2voc7XCWnu\nXKhBBK3e2KMGz39t7lA3XXRe2ZLLAkLM5y3J7tURkf5a1SutfdOyXAmeE6SRo83U\nh6WszodmMkxK5GM4JGrnt4pBisu5igXEydaW7qq2CdC6DOGjG+mEkN8/TA6p3cno\nL/sPyz6evdjLlSeJ8rFBH6xWyIZCbrcpYEJzXaUOEaxxXxgYz5/cTiVKN2M1G2ok\nQBUIYSY6bjEL4aUN5cfo7ogP3UvliEo3Eo0YgwuzR2v0KR6C1cZqZJSTnghIC/vA\nD32KdNQ+c3N+vl2OTsUVMC1GiWkngNx1OO1+kXW+YTnnTUOtOIswUP/Vqd5SYgAI\nmMAfY8U9/iIgkQj6T2W6FsScy94IN9fFhE1UtzmLoBIuUFsVXJMTz+Jucth+IqoW\nFua9v1R93/k98p41pjtFX+H8DslVgfP097vju4KDlqN64xV1grw3ZLl4CiOe/A91\noeLm2UHOq6wn3esB4r2EIQKb6jTVGu5sYCcdWpXr0AUVqcABPdgL+H7qJguBw09o\njm6xNIrw2OocrDKsudk/okr/AwqEyPKw9WnMlQgLIKw1rODG2NvU9oR3GVGdMkUB\nZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH\nex0SdDrx+tWUDqG8At2JHA==\n-----END CERTIFICATE-----\n";
25
+ /**
26
+ * Google Hardware Attestation Root 3
27
+ *
28
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
29
+ * (third entry)
30
+ *
31
+ * Valid until 2036-11-13 @ 15:10 PST
32
+ *
33
+ * SHA256 Fingerprint
34
+ * AB:66:41:17:8A:36:E1:79:AA:0C:1C:DD:DF:9A:16:EB:45:FA:20:94:3E:2B:8C:D7:C7:C0:5C:26:CF:8B:48:7A
35
+ */
36
+ export declare const Google_Hardware_Attestation_Root_3 = "\n-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx\nMDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG\nzWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan\n63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T\nQH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ\nerGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL\nZez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a\n0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH\n7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b\nHQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w\nlZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2\nOb3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7\nmD/vFDkzF+wm7cyWpQpCVQ==\n-----END CERTIFICATE-----\n";
37
+ /**
38
+ * Google Hardware Attestation Root 4
39
+ *
40
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
41
+ * (fourth entry)
42
+ *
43
+ * Valid until 2042-03-15 @ 11:07 PDT
44
+ *
45
+ * SHA256 Fingerprint
46
+ * CE:DB:1C:B6:DC:89:6A:E5:EC:79:73:48:BC:E9:28:67:53:C2:B3:8E:E7:1C:E0:FB:E3:4A:9A:12:48:80:0D:FC
47
+ */
48
+ export declare const Google_Hardware_Attestation_Root_4 = "\n-----BEGIN CERTIFICATE-----\nMIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV\nBAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw\nNzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS\nSxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7\ntv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj\nnar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq\nC4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ\noVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O\nJtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg\nsTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi\nigHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M\nRPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E\naDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um\nAGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud\nIwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7\n174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC\nW/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G\ntkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx\noSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG\n1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF\nmr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz\nlHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw\nn6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu\nzbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo\nvaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn\nw1IdYIg2Wxg7yHcQZemFQg==\n-----END CERTIFICATE-----\n";
25
49
  //# sourceMappingURL=android-key.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"android-key.d.ts","sourceRoot":"","sources":["../../../src/services/defaultRootCerts/android-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,u6DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,60DA8B9C,CAAC"}
1
+ {"version":3,"file":"android-key.d.ts","sourceRoot":"","sources":["../../../src/services/defaultRootCerts/android-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,u6DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,60DA8B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,+0DA+B9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,+0DA+B9C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Google_Hardware_Attestation_Root_2 = exports.Google_Hardware_Attestation_Root_1 = void 0;
3
+ exports.Google_Hardware_Attestation_Root_4 = exports.Google_Hardware_Attestation_Root_3 = exports.Google_Hardware_Attestation_Root_2 = exports.Google_Hardware_Attestation_Root_1 = void 0;
4
4
  /**
5
5
  * Google Hardware Attestation Root 1
6
6
  *
@@ -86,3 +86,89 @@ ZutL8VuFkERQGt6vQ2OCw0sV47VMkuYbacK/xyZFiRcrPJPb41zgbQj9XAEyLKCH
86
86
  ex0SdDrx+tWUDqG8At2JHA==
87
87
  -----END CERTIFICATE-----
88
88
  `;
89
+ /**
90
+ * Google Hardware Attestation Root 3
91
+ *
92
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
93
+ * (third entry)
94
+ *
95
+ * Valid until 2036-11-13 @ 15:10 PST
96
+ *
97
+ * SHA256 Fingerprint
98
+ * AB:66:41:17:8A:36:E1:79:AA:0C:1C:DD:DF:9A:16:EB:45:FA:20:94:3E:2B:8C:D7:C7:C0:5C:26:CF:8B:48:7A
99
+ */
100
+ exports.Google_Hardware_Attestation_Root_3 = `
101
+ -----BEGIN CERTIFICATE-----
102
+ MIIFHDCCAwSgAwIBAgIJAMNrfES5rhgxMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
103
+ BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjExMTE3MjMxMDQyWhcNMzYxMTEzMjMx
104
+ MDQyWjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
105
+ AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
106
+ Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
107
+ tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
108
+ nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
109
+ C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
110
+ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
111
+ JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
112
+ sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
113
+ igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
114
+ RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
115
+ aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
116
+ AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
117
+ IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
118
+ VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQBTNNZe5cuf8oiq+jV0itTG
119
+ zWVhSTjOBEk2FQvh11J3o3lna0o7rd8RFHnN00q4hi6TapFhh4qaw/iG6Xg+xOan
120
+ 63niLWIC5GOPFgPeYXM9+nBb3zZzC8ABypYuCusWCmt6Tn3+Pjbz3MTVhRGXuT/T
121
+ QH4KGFY4PhvzAyXwdjTOCXID+aHud4RLcSySr0Fq/L+R8TWalvM1wJJPhyRjqRCJ
122
+ erGtfBagiALzvhnmY7U1qFcS0NCnKjoO7oFedKdWlZz0YAfu3aGCJd4KHT0MsGiL
123
+ Zez9WP81xYSrKMNEsDK+zK5fVzw6jA7cxmpXcARTnmAuGUeI7VVDhDzKeVOctf3a
124
+ 0qQLwC+d0+xrETZ4r2fRGNw2YEs2W8Qj6oDcfPvq9JySe7pJ6wcHnl5EZ0lwc4xH
125
+ 7Y4Dx9RA1JlfooLMw3tOdJZH0enxPXaydfAD3YifeZpFaUzicHeLzVJLt9dvGB0b
126
+ HQLE4+EqKFgOZv2EoP686DQqbVS1u+9k0p2xbMA105TBIk7npraa8VM0fnrRKi7w
127
+ lZKwdH+aNAyhbXRW9xsnODJ+g8eF452zvbiKKngEKirK5LGieoXBX7tZ9D1GNBH2
128
+ Ob3bKOwwIWdEFle/YF/h6zWgdeoaNGDqVBrLr2+0DtWoiB1aDEjLWl9FmyIUyUm7
129
+ mD/vFDkzF+wm7cyWpQpCVQ==
130
+ -----END CERTIFICATE-----
131
+ `;
132
+ /**
133
+ * Google Hardware Attestation Root 4
134
+ *
135
+ * Downloaded from https://developer.android.com/training/articles/security-key-attestation#root_certificate
136
+ * (fourth entry)
137
+ *
138
+ * Valid until 2042-03-15 @ 11:07 PDT
139
+ *
140
+ * SHA256 Fingerprint
141
+ * CE:DB:1C:B6:DC:89:6A:E5:EC:79:73:48:BC:E9:28:67:53:C2:B3:8E:E7:1C:E0:FB:E3:4A:9A:12:48:80:0D:FC
142
+ */
143
+ exports.Google_Hardware_Attestation_Root_4 = `
144
+ -----BEGIN CERTIFICATE-----
145
+ MIIFHDCCAwSgAwIBAgIJAPHBcqaZ6vUdMA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
146
+ BAUTEGY5MjAwOWU4NTNiNmIwNDUwHhcNMjIwMzIwMTgwNzQ4WhcNNDIwMzE1MTgw
147
+ NzQ4WjAbMRkwFwYDVQQFExBmOTIwMDllODUzYjZiMDQ1MIICIjANBgkqhkiG9w0B
148
+ AQEFAAOCAg8AMIICCgKCAgEAr7bHgiuxpwHsK7Qui8xUFmOr75gvMsd/dTEDDJdS
149
+ Sxtf6An7xyqpRR90PL2abxM1dEqlXnf2tqw1Ne4Xwl5jlRfdnJLmN0pTy/4lj4/7
150
+ tv0Sk3iiKkypnEUtR6WfMgH0QZfKHM1+di+y9TFRtv6y//0rb+T+W8a9nsNL/ggj
151
+ nar86461qO0rOs2cXjp3kOG1FEJ5MVmFmBGtnrKpa73XpXyTqRxB/M0n1n/W9nGq
152
+ C4FSYa04T6N5RIZGBN2z2MT5IKGbFlbC8UrW0DxW7AYImQQcHtGl/m00QLVWutHQ
153
+ oVJYnFPlXTcHYvASLu+RhhsbDmxMgJJ0mcDpvsC4PjvB+TxywElgS70vE0XmLD+O
154
+ JtvsBslHZvPBKCOdT0MS+tgSOIfga+z1Z1g7+DVagf7quvmag8jfPioyKvxnK/Eg
155
+ sTUVi2ghzq8wm27ud/mIM7AY2qEORR8Go3TVB4HzWQgpZrt3i5MIlCaY504LzSRi
156
+ igHCzAPlHws+W0rB5N+er5/2pJKnfBSDiCiFAVtCLOZ7gLiMm0jhO2B6tUXHI/+M
157
+ RPjy02i59lINMRRev56GKtcd9qO/0kUJWdZTdA2XoS82ixPvZtXQpUpuL12ab+9E
158
+ aDK8Z4RHJYYfCT3Q5vNAXaiWQ+8PTWm2QgBR/bkwSWc+NpUFgNPN9PvQi8WEg5Um
159
+ AGMCAwEAAaNjMGEwHQYDVR0OBBYEFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMB8GA1Ud
160
+ IwQYMBaAFDZh4QB8iAUJUYtEbEf/GkzJ6k8SMA8GA1UdEwEB/wQFMAMBAf8wDgYD
161
+ VR0PAQH/BAQDAgIEMA0GCSqGSIb3DQEBCwUAA4ICAQB8cMqTllHc8U+qCrOlg3H7
162
+ 174lmaCsbo/bJ0C17JEgMLb4kvrqsXZs01U3mB/qABg/1t5Pd5AORHARs1hhqGIC
163
+ W/nKMav574f9rZN4PC2ZlufGXb7sIdJpGiO9ctRhiLuYuly10JccUZGEHpHSYM2G
164
+ tkgYbZba6lsCPYAAP83cyDV+1aOkTf1RCp/lM0PKvmxYN10RYsK631jrleGdcdkx
165
+ oSK//mSQbgcWnmAEZrzHoF1/0gso1HZgIn0YLzVhLSA/iXCX4QT2h3J5z3znluKG
166
+ 1nv8NQdxei2DIIhASWfu804CA96cQKTTlaae2fweqXjdN1/v2nqOhngNyz1361mF
167
+ mr4XmaKH/ItTwOe72NI9ZcwS1lVaCvsIkTDCEXdm9rCNPAY10iTunIHFXRh+7KPz
168
+ lHGewCq/8TOohBRn0/NNfh7uRslOSZ/xKbN9tMBtw37Z8d2vvnXq/YWdsm1+JLVw
169
+ n6yYD/yacNJBlwpddla8eaVMjsF6nBnIgQOf9zKSe06nSTqvgwUHosgOECZJZ1Eu
170
+ zbH4yswbt02tKtKEFhx+v+OTge/06V+jGsqTWLsfrOCNLuA8H++z+pUENmpqnnHo
171
+ vaI47gC+TNpkgYGkkBT6B/m/U01BuOBBTzhIlMEZq9qkDWuM2cA5kW5V3FJUcfHn
172
+ w1IdYIg2Wxg7yHcQZemFQg==
173
+ -----END CERTIFICATE-----
174
+ `;
@@ -1,4 +1,4 @@
1
- import { AttestationFormat } from '../helpers/decodeAttestationObject.js';
1
+ import type { AttestationFormat } from '../helpers/decodeAttestationObject.js';
2
2
  export type RootCertIdentifier = AttestationFormat | 'mds';
3
3
  interface SettingsService {
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"settingsService.d.ts","sourceRoot":"","sources":["../../src/services/settingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAW1E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAE3D,UAAU,eAAe;IACvB;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,kBAAkB,CAAC;QAC/B,YAAY,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;KACvC,GAAG,IAAI,CAAC;IAET;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,kBAAkB,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;CACzE;AAkCD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,eAA2C,CAAC"}
1
+ {"version":3,"file":"settingsService.d.ts","sourceRoot":"","sources":["../../src/services/settingsService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAa/E,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAE3D,UAAU,eAAe;IACvB;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,kBAAkB,CAAC;QAC/B,YAAY,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;KACvC,GAAG,IAAI,CAAC;IAET;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,kBAAkB,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;CACzE;AAkCD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,EAAE,eAA2C,CAAC"}
@@ -56,6 +56,8 @@ exports.SettingsService.setRootCertificates({
56
56
  certificates: [
57
57
  android_key_js_1.Google_Hardware_Attestation_Root_1,
58
58
  android_key_js_1.Google_Hardware_Attestation_Root_2,
59
+ android_key_js_1.Google_Hardware_Attestation_Root_3,
60
+ android_key_js_1.Google_Hardware_Attestation_Root_4,
59
61
  ],
60
62
  });
61
63
  exports.SettingsService.setRootCertificates({