1<?php
2
3namespace Firebase\JWT;
4
5use OpenSSLAsymmetricKey;
6use OpenSSLCertificate;
7use TypeError;
8use InvalidArgumentException;
9
10class Key
11{
12    /** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */
13    private $keyMaterial;
14    /** @var string */
15    private $algorithm;
16
17    /**
18     * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
19     * @param string $algorithm
20     */
21    public function __construct(
22        $keyMaterial,
23        string $algorithm
24    ) {
25        if (
26            !is_string($keyMaterial)
27            && !$keyMaterial instanceof OpenSSLAsymmetricKey
28            && !$keyMaterial instanceof OpenSSLCertificate
29            && !is_resource($keyMaterial)
30        ) {
31            throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey');
32        }
33
34        if (empty($keyMaterial)) {
35            throw new InvalidArgumentException('Key material must not be empty');
36        }
37
38        if (empty($algorithm)) {
39            throw new InvalidArgumentException('Algorithm must not be empty');
40        }
41
42        // TODO: Remove in PHP 8.0 in favor of class constructor property promotion
43        $this->keyMaterial = $keyMaterial;
44        $this->algorithm = $algorithm;
45    }
46
47    /**
48     * Return the algorithm valid for this key
49     *
50     * @return string
51     */
52    public function getAlgorithm(): string
53    {
54        return $this->algorithm;
55    }
56
57    /**
58     * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate
59     */
60    public function getKeyMaterial()
61    {
62        return $this->keyMaterial;
63    }
64}
65