106 lines
2.3 KiB
PHP
106 lines
2.3 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
/*
|
||
|
* The MIT License (MIT)
|
||
|
*
|
||
|
* Copyright (c) 2014-2019 Spomky-Labs
|
||
|
*
|
||
|
* This software may be modified and distributed under the terms
|
||
|
* of the MIT license. See the LICENSE file for details.
|
||
|
*/
|
||
|
|
||
|
namespace Webauthn;
|
||
|
|
||
|
use Assert\Assertion;
|
||
|
use Base64Url\Base64Url;
|
||
|
use JsonSerializable;
|
||
|
|
||
|
class PublicKeyCredentialDescriptor implements JsonSerializable
|
||
|
{
|
||
|
public const CREDENTIAL_TYPE_PUBLIC_KEY = 'public-key';
|
||
|
|
||
|
public const AUTHENTICATOR_TRANSPORT_USB = 'usb';
|
||
|
public const AUTHENTICATOR_TRANSPORT_NFC = 'nfc';
|
||
|
public const AUTHENTICATOR_TRANSPORT_BLE = 'ble';
|
||
|
public const AUTHENTICATOR_TRANSPORT_INTERNAL = 'internal';
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $type;
|
||
|
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $id;
|
||
|
|
||
|
/**
|
||
|
* @var string[]
|
||
|
*/
|
||
|
protected $transports;
|
||
|
|
||
|
/**
|
||
|
* @param string[] $transports
|
||
|
*/
|
||
|
public function __construct(string $type, string $id, array $transports = [])
|
||
|
{
|
||
|
$this->type = $type;
|
||
|
$this->id = $id;
|
||
|
$this->transports = $transports;
|
||
|
}
|
||
|
|
||
|
public function getType(): string
|
||
|
{
|
||
|
return $this->type;
|
||
|
}
|
||
|
|
||
|
public function getId(): string
|
||
|
{
|
||
|
return $this->id;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return string[]
|
||
|
*/
|
||
|
public function getTransports(): array
|
||
|
{
|
||
|
return $this->transports;
|
||
|
}
|
||
|
|
||
|
public static function createFromString(string $data): self
|
||
|
{
|
||
|
$data = json_decode($data, true);
|
||
|
Assertion::eq(JSON_ERROR_NONE, json_last_error(), 'Invalid data');
|
||
|
Assertion::isArray($data, 'Invalid data');
|
||
|
|
||
|
return self::createFromArray($data);
|
||
|
}
|
||
|
|
||
|
public static function createFromArray(array $json): self
|
||
|
{
|
||
|
Assertion::keyExists($json, 'type', 'Invalid input. "type" is missing.');
|
||
|
Assertion::keyExists($json, 'id', 'Invalid input. "id" is missing.');
|
||
|
|
||
|
return new self(
|
||
|
$json['type'],
|
||
|
Base64Url::decode($json['id']),
|
||
|
$json['transports'] ?? []
|
||
|
);
|
||
|
}
|
||
|
|
||
|
public function jsonSerialize(): array
|
||
|
{
|
||
|
$json = [
|
||
|
'type' => $this->type,
|
||
|
'id' => Base64Url::encode($this->id),
|
||
|
];
|
||
|
if (0 !== \count($this->transports)) {
|
||
|
$json['transports'] = $this->transports;
|
||
|
}
|
||
|
|
||
|
return $json;
|
||
|
}
|
||
|
}
|