1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types = 1); |
4
|
|
|
|
5
|
|
|
namespace Sop\JWX\JWT\Parameter; |
6
|
|
|
|
7
|
|
|
use Sop\JWX\Parameter\Parameter; |
8
|
|
|
|
9
|
|
|
/** |
10
|
|
|
* Represents a header parameter. |
11
|
|
|
* |
12
|
|
|
* @see https://tools.ietf.org/html/rfc7519#section-5 |
13
|
|
|
* @see http://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-header-parameters |
14
|
|
|
*/ |
15
|
|
|
class JWTParameter extends Parameter |
16
|
|
|
{ |
17
|
|
|
// registered parameter names |
18
|
|
|
const PARAM_ALGORITHM = 'alg'; |
19
|
|
|
const PARAM_JWK_SET_URL = 'jku'; |
20
|
|
|
const PARAM_JSON_WEB_KEY = 'jwk'; |
21
|
|
|
const PARAM_KEY_ID = 'kid'; |
22
|
|
|
const PARAM_X509_URL = 'x5u'; |
23
|
|
|
const PARAM_X509_CERTIFICATE_CHAIN = 'x5c'; |
24
|
|
|
const PARAM_X509_CERTIFICATE_SHA1_THUMBPRINT = 'x5t'; |
25
|
|
|
const PARAM_X509_CERTIFICATE_SHA256_THUMBPRINT = 'x5t#S256'; |
26
|
|
|
const PARAM_TYPE = 'typ'; |
27
|
|
|
const PARAM_CONTENT_TYPE = 'cty'; |
28
|
|
|
const PARAM_CRITICAL = 'crit'; |
29
|
|
|
const PARAM_ENCRYPTION_ALGORITHM = 'enc'; |
30
|
|
|
const PARAM_COMPRESSION_ALGORITHM = 'zip'; |
31
|
|
|
const PARAM_EPHEMERAL_PUBLIC_KEY = 'epk'; |
32
|
|
|
const PARAM_AGREEMENT_PARTYUINFO = 'apu'; |
33
|
|
|
const PARAM_AGREEMENT_PARTYVINFO = 'apv'; |
34
|
|
|
const PARAM_INITIALIZATION_VECTOR = 'iv'; |
35
|
|
|
const PARAM_AUTHENTICATION_TAG = 'tag'; |
36
|
|
|
const PARAM_PBES2_SALT_INPUT = 'p2s'; |
37
|
|
|
const PARAM_PBES2_COUNT = 'p2c'; |
38
|
|
|
const PARAM_BASE64URL_ENCODE_PAYLOAD = 'b64'; |
39
|
|
|
|
40
|
|
|
// shorthand aliases for parameter names |
41
|
|
|
const P_ALG = self::PARAM_ALGORITHM; |
42
|
|
|
const P_JKU = self::PARAM_JWK_SET_URL; |
43
|
|
|
const P_JWK = self::PARAM_JSON_WEB_KEY; |
44
|
|
|
const P_KID = self::PARAM_KEY_ID; |
45
|
|
|
const P_X5U = self::PARAM_X509_URL; |
46
|
|
|
const P_X5C = self::PARAM_X509_CERTIFICATE_CHAIN; |
47
|
|
|
const P_X5T = self::PARAM_X509_CERTIFICATE_SHA1_THUMBPRINT; |
48
|
|
|
const P_X5TS256 = self::PARAM_X509_CERTIFICATE_SHA256_THUMBPRINT; |
49
|
|
|
const P_TYP = self::PARAM_TYPE; |
50
|
|
|
const P_CTY = self::PARAM_CONTENT_TYPE; |
51
|
|
|
const P_CRIT = self::PARAM_CRITICAL; |
52
|
|
|
const P_ENC = self::PARAM_ENCRYPTION_ALGORITHM; |
53
|
|
|
const P_ZIP = self::PARAM_COMPRESSION_ALGORITHM; |
54
|
|
|
const P_EPK = self::PARAM_EPHEMERAL_PUBLIC_KEY; |
55
|
|
|
const P_APU = self::PARAM_AGREEMENT_PARTYUINFO; |
56
|
|
|
const P_APV = self::PARAM_AGREEMENT_PARTYVINFO; |
57
|
|
|
const P_IV = self::PARAM_INITIALIZATION_VECTOR; |
58
|
|
|
const P_TAG = self::PARAM_AUTHENTICATION_TAG; |
59
|
|
|
const P_P2S = self::PARAM_PBES2_SALT_INPUT; |
60
|
|
|
const P_P2C = self::PARAM_PBES2_COUNT; |
61
|
|
|
const P_B64 = self::PARAM_BASE64URL_ENCODE_PAYLOAD; |
62
|
|
|
|
63
|
|
|
/** |
64
|
|
|
* Mapping from registered JWT parameter name to class name. |
65
|
|
|
* |
66
|
|
|
* @internal |
67
|
|
|
* |
68
|
|
|
* @var array |
69
|
|
|
*/ |
70
|
|
|
const MAP_NAME_TO_CLASS = [ |
71
|
|
|
self::P_ALG => AlgorithmParameter::class, |
72
|
|
|
self::P_JKU => JWKSetURLParameter::class, |
73
|
|
|
self::P_JWK => JSONWebKeyParameter::class, |
74
|
|
|
self::P_KID => KeyIDParameter::class, |
75
|
|
|
self::P_X5U => X509URLParameter::class, |
76
|
|
|
self::P_X5C => X509CertificateChainParameter::class, |
77
|
|
|
self::P_X5T => X509CertificateSHA1ThumbprintParameter::class, |
78
|
|
|
self::P_X5TS256 => X509CertificateSHA256ThumbprintParameter::class, |
79
|
|
|
self::P_TYP => TypeParameter::class, |
80
|
|
|
self::P_CTY => ContentTypeParameter::class, |
81
|
|
|
self::P_CRIT => CriticalParameter::class, |
82
|
|
|
self::P_ENC => EncryptionAlgorithmParameter::class, |
83
|
|
|
self::P_ZIP => CompressionAlgorithmParameter::class, |
84
|
|
|
self::P_IV => InitializationVectorParameter::class, |
85
|
|
|
self::P_TAG => AuthenticationTagParameter::class, |
86
|
|
|
self::P_P2S => PBES2SaltInputParameter::class, |
87
|
|
|
self::P_P2C => PBES2CountParameter::class, |
88
|
|
|
self::P_B64 => B64PayloadParameter::class, |
89
|
|
|
]; |
90
|
|
|
|
91
|
|
|
/** |
92
|
|
|
* Constructor. |
93
|
|
|
* |
94
|
|
|
* @param string $name Parameter name |
95
|
|
|
* @param mixed $value Parameter value |
96
|
|
|
*/ |
97
|
168 |
|
public function __construct(string $name, $value) |
98
|
|
|
{ |
99
|
168 |
|
$this->_name = $name; |
100
|
168 |
|
$this->_value = $value; |
101
|
168 |
|
} |
102
|
|
|
|
103
|
|
|
/** |
104
|
|
|
* Initialize from a name and a value. |
105
|
|
|
* |
106
|
|
|
* Returns a parameter specific object if one is implemented. |
107
|
|
|
* |
108
|
|
|
* @param string $name Parameter name |
109
|
|
|
* @param mixed $value Parameter value |
110
|
|
|
* |
111
|
|
|
* @return self |
112
|
|
|
*/ |
113
|
53 |
|
public static function fromNameAndValue(string $name, $value): self |
114
|
|
|
{ |
115
|
53 |
|
if (array_key_exists($name, self::MAP_NAME_TO_CLASS)) { |
116
|
52 |
|
$cls = self::MAP_NAME_TO_CLASS[$name]; |
117
|
52 |
|
return $cls::fromJSONValue($value); |
118
|
|
|
} |
119
|
1 |
|
return new self($name, $value); |
120
|
|
|
} |
121
|
|
|
|
122
|
|
|
/** |
123
|
|
|
* Initialize from a JSON value. |
124
|
|
|
* |
125
|
|
|
* @param mixed $value |
126
|
|
|
* |
127
|
|
|
* @return JWTParameter |
128
|
|
|
*/ |
129
|
1 |
|
public static function fromJSONValue($value): Parameter |
130
|
|
|
{ |
131
|
1 |
|
throw new \BadMethodCallException( |
132
|
1 |
|
__FUNCTION__ . ' must be implemented in a derived class.'); |
133
|
|
|
} |
134
|
|
|
} |
135
|
|
|
|