Skip to content

Commit 8a6c2a7

Browse files
authored
fix: skip parsing valid unsupported curves (#638)
1 parent f7ae571 commit 8a6c2a7

3 files changed

Lines changed: 85 additions & 1 deletion

File tree

src/JWK.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ class JWK
3131
// 'P-521' => '1.3.132.0.35', // Len: 132 (not supported)
3232
];
3333

34+
// Known standard curves from the IANA JOSE registry which are not supported
35+
private const KNOWN_UNSUPPORTED_EC_CURVES = [
36+
'P-521', // RFC 7518
37+
'Ed25519', // RFC 8037
38+
'Ed448', // RFC 8037
39+
'X25519', // RFC 8037
40+
'X448' // RFC 8037
41+
];
42+
3443
// For keys with "kty" equal to "OKP" (Octet Key Pair), the "crv" parameter must contain the key subtype.
3544
// This library supports the following subtypes:
3645
private const OKP_SUBTYPES = [
@@ -142,7 +151,10 @@ public static function parseKey(#[\SensitiveParameter] array $jwk, ?string $defa
142151
}
143152

144153
if (!isset(self::EC_CURVES[$jwk['crv']])) {
145-
throw new DomainException('Unrecognised or unsupported EC curve');
154+
if (!\in_array($jwk['crv'], self::KNOWN_UNSUPPORTED_EC_CURVES)) {
155+
throw new DomainException('Unrecognised EC curve');
156+
}
157+
return null;
146158
}
147159

148160
if (empty($jwk['x']) || empty($jwk['y'])) {

tests/JWKTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Firebase\JWT;
44

5+
use DomainException;
56
use InvalidArgumentException;
67
use PHPUnit\Framework\TestCase;
78
use UnexpectedValueException;
@@ -136,6 +137,38 @@ public function testParseJwkKeySet_empty()
136137
JWK::parseKeySet(['keys' => []]);
137138
}
138139

140+
public function testParseJwkKeySetWithValidButUnsupportedCurveDoesNotThrowException()
141+
{
142+
$jwkSet = json_decode(
143+
file_get_contents(__DIR__ . '/data/unsupported-alg-keyset.json'),
144+
true
145+
);
146+
147+
$this->assertCount(3, $jwkSet['keys']);
148+
149+
$keys = JWK::parseKeySet($jwkSet);
150+
151+
$this->assertCount(2, $keys);
152+
$this->assertArrayHasKey('jwk1', $keys);
153+
$this->assertArrayHasKey('jwk2', $keys);
154+
$this->assertArrayNotHasKey('unsupported-ec-curve', $keys);
155+
}
156+
157+
public function testParseJwkKeySetWithInvalidCurveThrowsException()
158+
{
159+
$this->expectException(DomainException::class);
160+
$this->expectExceptionMessage('Unrecognised EC curve');
161+
162+
$jwkSet = json_decode(
163+
file_get_contents(__DIR__ . '/data/unsupported-alg-keyset.json'),
164+
true
165+
);
166+
167+
$jwkSet['keys'][2]['crv'] = 'invalid-curve';
168+
169+
$keys = JWK::parseKeySet($jwkSet);
170+
}
171+
139172
/**
140173
* @depends testParseJwkKeySet
141174
*/
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{
2+
"keys": [
3+
{
4+
"kid": "jwk1",
5+
"kty": "RSA",
6+
"alg": "RSA-OAEP",
7+
"use": "enc",
8+
"n": "vZi3klbtMtzknokuHuU4WyAs7HFnCG-QUSa2Y-PfbwqONlW7ZruTd9lKv6xVzQKqAldhrF2Ljm1dujMkdMSHYHW7L7WD718k0QX-duH_Z3kediGVgVVIikV5y17wYliHcM9x2lUV1EzVhfI3BQrhu-yHkmzvhuHAosr-kDELD483ReMYbG4f79DHoTl-NAg1ZgKhmUc2aPhut9NrJAIE7Q6mf2EnOeHP9e7KzQPOJW7-_ACnRb2E3iXBqpeX4-uNN5h2zCM1jzgN1m8v3xlqJnz4cydIAJ6Np1fCLief31UK6Tiz84xOgjEhCowjK_i1zrm7ciq-Sgs1heMIfKQ5JQ",
9+
"e": "AQAB",
10+
"x5c": [
11+
"MIICnzCCAYcCBgGEr+Dy7jANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAhlbnRyb3BpYTAeFw0yMjExMjUxNzM5MjVaFw0zMjExMjUxNzQxMDVaMBMxETAPBgNVBAMMCGVudHJvcGlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvZi3klbtMtzknokuHuU4WyAs7HFnCG+QUSa2Y+PfbwqONlW7ZruTd9lKv6xVzQKqAldhrF2Ljm1dujMkdMSHYHW7L7WD718k0QX+duH/Z3kediGVgVVIikV5y17wYliHcM9x2lUV1EzVhfI3BQrhu+yHkmzvhuHAosr+kDELD483ReMYbG4f79DHoTl+NAg1ZgKhmUc2aPhut9NrJAIE7Q6mf2EnOeHP9e7KzQPOJW7+/ACnRb2E3iXBqpeX4+uNN5h2zCM1jzgN1m8v3xlqJnz4cydIAJ6Np1fCLief31UK6Tiz84xOgjEhCowjK/i1zrm7ciq+Sgs1heMIfKQ5JQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAKbEduhsT1yxsCymFBHYDNdSXEtZnCSf/NGan9+wyOZtaDyYYtuAipiX43mahkXP/3RlPyDn6UfMXTsdzeD8tml1sZ1bVqD39VsbPZOr6HSvh1JlX40Bn8mLEU/FoQ4OfgrQzdgSLehFLbZ5P0RWwUcZjV+OpdxkOcC7pSb6y1W+3UfsfVhejTUHncan5ZInMI7GWdMRGVuN4JMuAbgnp2v6XqL1di3gTBJl83vFE8GRdwCoyJJiOzXUqcIjWfUsC6PLeHKtPqPlxtHHyvgJdAuGYVLameBoeDJISu3nxkng/RfSU0iwX1hf/1eHOhva0HG5FjMHQNYGJ+V7wYpxOr"
12+
],
13+
"x5t": "1Nd1lnfuVZjpEjnFppIrEcpJhW4",
14+
"x5t#S256": "8NRLcvxX_jloFTT5EZMkchtgkJylb_v0ZwK1HJSQXW4"
15+
},
16+
{
17+
"kid": "jwk2",
18+
"kty": "RSA",
19+
"alg": "RS256",
20+
"use": "sig",
21+
"n": "tI59R8YidctuCz_3-51aP86L4hGbsF8JeuEuQNmArQ1Xj22jwEUSr-YDPb5u6XViyWzLJI6_z5j3vK7O5XVOQGa09LkcHDdPWeuWq3Twy8ZTTqf8miMgIVLNhNYUmMwTFvvg9tVl-sF4XjcxEUdknvdjgDbkHQgfVEycGcinh-u66ZSXFrYcwD1sGSDPA8RzYDpb9wkedDGQU-s7UZFWRPVbFpg9HiK90f7YNJDbR_xZxwMQftsrTlsArfXptdgx295OrF11BQ_CguftLxUC-6C8W-XxXZb49mzDpznR6ITBo3YfkvWnqL4KplNzG6p9l_3ZVqbCuMUiZYv5dV5iYw",
22+
"e": "AQAB",
23+
"x5c": [
24+
"MIICnzCCAYcCBgGEr+DwPzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAhlbnRyb3BpYTAeFw0yMjExMjUxNzM5MjVaFw0zMjExMjUxNzQxMDVaMBMxETAPBgNVBAMMCGVudHJvcGlhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtI59R8YidctuCz/3+51aP86L4hGbsF8JeuEuQNmArQ1Xj22jwEUSr+YDPb5u6XViyWzLJI6/z5j3vK7O5XVOQGa09LkcHDdPWeuWq3Twy8ZTTqf8miMgIVLNhNYUmMwTFvvg9tVl+sF4XjcxEUdknvdjgDbkHQgfVEycGcinh+u66ZSXFrYcwD1sGSDPA8RzYDpb9wkedDGQU+s7UZFWRPVbFpg9HiK90f7YNJDbR/xZxwMQftsrTlsArfXptdgx295OrF11BQ/CguftLxUC+6C8W+XxXZb49mzDpznR6ITBo3YfkvWnqL4KplNzG6p9l/3ZVqbCuMUiZYv5dV5iYwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQArE6mZeWH4haqOGRjtoPHcjO9J4giO9VR6Cxay4bcgrnJYVuIAn5y6umaLjUaP8IthQMMhDcXh3dkoXkaUvlZFtelB29JXZjwPW66rmrPW/5iVqst6qUghyMI80pQyw4UPZKE09atchMiWwtmJ63BbzAYXizzt4FnWJqX6vcSr5cXRrtcYn4WWxaYVAUqSN5koust3vN7YOKhTk0XBpay+dirfa3ENwLbq4KjhImmHwcZa3RpRgkHInbG2U8u6nZDTsOmyIDgVnG8/LZmBHINQ9vhpiLTiERzk0zRk1WtwojHoe9A5MfEgqC3MW5KMVOYlfE+d0QnvCJ3KKaOj8xwE"
25+
],
26+
"x5t": "GQ1-KNU1SgsG8tFXiqNjTt-x1IQ",
27+
"x5t#S256": "6L5_LevQpy2vP_VUiqOBM3hGIXVIx1EmzsTQPPh0jWc"
28+
},
29+
{
30+
"kid": "unsupported-ec-curve",
31+
"kty": "EC",
32+
"alg": "ES512",
33+
"use": "sig",
34+
"crv": "P-521",
35+
"x": "ANCPjd7cPxRHok4a444BTEa0NjIGBfeXlQK6OtdTUjJojmeWznop8koQh4P9sN4NuU2nm49PglN2Jq7GF3eANSDr",
36+
"y": "Aag3LtKNyL4NJualANsYqnITNQE2H00ZXzogOq_3QbcPwspG8St_dHTFoKEiOSl-Y9776_kJHBPtdlh1H7SY5AbZ"
37+
}
38+
]
39+
}

0 commit comments

Comments
 (0)