1
1
package com .yubico .webauthn .attestation
2
2
3
+ import com .yubico .internal .util .BinaryUtil
4
+ import com .yubico .internal .util .CertificateParser
3
5
import com .yubico .webauthn .TestAuthenticator
4
6
import com .yubico .webauthn .data .ByteArray
5
7
import org .bouncycastle .asn1 .DEROctetString
@@ -10,6 +12,7 @@ import org.scalatest.matchers.should.Matchers
10
12
import org .scalatestplus .junit .JUnitRunner
11
13
12
14
import java .security .cert .X509Certificate
15
+ import scala .jdk .OptionConverters .RichOptional
13
16
14
17
@ RunWith (classOf [JUnitRunner ])
15
18
class CertificateUtilSpec extends AnyFunSpec with Matchers {
@@ -39,6 +42,36 @@ class CertificateUtilSpec extends AnyFunSpec with Matchers {
39
42
result should equal(ByteArray .fromHex(" 00010203" ))
40
43
}
41
44
42
- }
45
+ it(" correctly parses the serial number from a real YubiKey enterprise attestation certificate." ) {
46
+ val cert = CertificateParser .parsePem(""" -----BEGIN CERTIFICATE-----
47
+ |MIIC8zCCAdugAwIBAgIJAKr/KiUzkKrgMA0GCSqGSIb3DQEBCwUAMC8xLTArBgNV
48
+ |BAMMJFl1YmljbyBGSURPIFJvb3QgQ0EgU2VyaWFsIDQ1MDIwMzU1NjAgFw0yNDA1
49
+ |MDEwMDAwMDBaGA8yMDYwMDQzMDAwMDAwMFowcDELMAkGA1UEBhMCU0UxEjAQBgNV
50
+ |BAoMCVl1YmljbyBBQjEiMCAGA1UECwwZQXV0aGVudGljYXRvciBBdHRlc3RhdGlv
51
+ |bjEpMCcGA1UEAwwgWXViaWNvIEZpZG8gRUUgKFNlcmlhbD0yODI5OTAwMykwWTAT
52
+ |BgcqhkjOPQIBBggqhkjOPQMBBwNCAATImNkI1cwqkW5B3qNrY3pc8zBLhvGyfyfS
53
+ |WCLrODSe8xaRPcZoXYGGwZ0Ua/Hp5nxyD+w1hjS9O9gx8mSDvp+zo4GZMIGWMBMG
54
+ |CisGAQQBgsQKDQEEBQQDBQcBMBUGCysGAQQBguUcAQECBAYEBAGvzvswIgYJKwYB
55
+ |BAGCxAoCBBUxLjMuNi4xLjQuMS40MTQ4Mi4xLjcwEwYLKwYBBAGC5RwCAQEEBAMC
56
+ |AiQwIQYLKwYBBAGC5RwBAQQEEgQQuQ59wTFuT+6iWlamZqZw/jAMBgNVHRMBAf8E
57
+ |AjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAFEMXw1HUDC/TfMFxp2ZrmgQLa5fmzs2Jh
58
+ |C22TUAuY26CYT5dmMUsS5aJd96MtC5gKS57h1auGr2Y4FMxQS9FJHzXAzAtYJfKh
59
+ |j1uS2BSTXf9GULdFKcWvvv50kJ2VmXLge3UgHDBJ8LwrDlZFyISeMZ8jSbmrNu2c
60
+ |8uNBBSfqdor+5H91L1brC9yYneHdxYk6YiEvDBxWjiMa9DQuySh/4a21nasgt0cB
61
+ |prEbfFOLRDm7GDsRTPyefZjZ84yi4Ao+15x+7DM0UwudEVtjOWB2BJtJyxIkXXNF
62
+ |iWFZaxezq0Xt2Kl2sYnMR97ynw/U4TzZDjgb56pN81oKz8Od9B/u
63
+ |-----END CERTIFICATE-----""" .stripMargin)
64
+
65
+ val result =
66
+ CertificateUtil
67
+ .parseFidoSerNumExtension(cert)
68
+ .toScala
69
+ .map(new ByteArray (_))
43
70
71
+ result should equal(Some (ByteArray .fromHex(" 01AFCEFB" )))
72
+
73
+ // For YubiKeys, the sernum octet string represents a big-endian integer
74
+ BinaryUtil .getUint32(result.get.getBytes) should be(28299003 )
75
+ }
76
+ }
44
77
}
0 commit comments