FidoAaguidExtension   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 33
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 17
c 1
b 1
f 0
dl 0
loc 33
ccs 17
cts 17
cp 1
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A getFidoAaguidExtensionValue() 0 16 4
A checkAaguidExtension() 0 10 3
1
<?php
2
3
namespace MadWizard\WebAuthn\Attestation\Fido;
4
5
use Exception;
6
use MadWizard\WebAuthn\Attestation\Identifier\Aaguid;
7
use MadWizard\WebAuthn\Exception\ParseException;
8
use MadWizard\WebAuthn\Exception\VerificationException;
9
use MadWizard\WebAuthn\Format\ByteBuffer;
10
use MadWizard\WebAuthn\Pki\CertificateDetailsInterface;
11
use Sop\ASN1\Type\UnspecifiedType;
12
13
final class FidoAaguidExtension
14
{
15
    private const OID_FIDO_GEN_CE_AAGUID = '1.3.6.1.4.1.45724.1.1.4';
16
17 7
    public static function checkAaguidExtension(CertificateDetailsInterface $cert, Aaguid $validAaguid): void
18
    {
19 7
        $aaguid = self::getFidoAaguidExtensionValue($cert);
20
21 5
        if ($aaguid === null) {
22 2
            return;
23
        }
24
25 3
        if (!$validAaguid->equals($aaguid)) {
26 1
            throw new VerificationException('AAGUID in certificate extension does not match the AAGUID in the authenticator data.');
27
        }
28 2
    }
29
30 7
    private static function getFidoAaguidExtensionValue(CertificateDetailsInterface $cert): ?Aaguid
31
    {
32 7
        $extension = $cert->getExtensionData(self::OID_FIDO_GEN_CE_AAGUID);
33 7
        if ($extension === null) {
34 2
            return null;
35
        }
36
37 5
        if ($extension->isCritical()) {
38 1
            throw new VerificationException('FIDO AAGUID extension must not be critical.');
39
        }
40
41
        try {
42 4
            $rawAaguid = UnspecifiedType::fromDER($extension->getValue()->getBinaryString())->asOctetString()->string();
43 3
            return new Aaguid(new ByteBuffer($rawAaguid));
44 1
        } catch (Exception $e) {
45 1
            throw new ParseException('Failed to parse AAGUID extension', 0, $e);
46
        }
47
    }
48
}
49