Skip to content

Commit 7cb8a26

Browse files
feat: support octet typed JWK (#587)
1 parent d9a140a commit 7cb8a26

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

Diff for: src/JWK.php

+6
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ public static function parseKey(array $jwk, ?string $defaultAlg = null): ?Key
172172
// This library works internally with EdDSA keys (Ed25519) encoded in standard base64.
173173
$publicKey = JWT::convertBase64urlToBase64($jwk['x']);
174174
return new Key($publicKey, $jwk['alg']);
175+
case 'oct':
176+
if (!isset($jwk['k'])) {
177+
throw new UnexpectedValueException('k not set');
178+
}
179+
180+
return new Key(JWT::urlsafeB64Decode($jwk['k']), $jwk['alg']);
175181
default:
176182
break;
177183
}

Diff for: tests/JWKTest.php

+25
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,31 @@ public function testDecodeByMultiJwkKeySet()
170170
$this->assertSame('bar', $result->sub);
171171
}
172172

173+
public function testDecodeByOctetJwkKeySet()
174+
{
175+
$jwkSet = json_decode(
176+
file_get_contents(__DIR__ . '/data/octet-jwkset.json'),
177+
true
178+
);
179+
$keys = JWK::parseKeySet($jwkSet);
180+
$payload = ['sub' => 'foo', 'exp' => strtotime('+10 seconds')];
181+
foreach ($keys as $keyId => $key) {
182+
$msg = JWT::encode($payload, $key->getKeyMaterial(), $key->getAlgorithm(), $keyId);
183+
$result = JWT::decode($msg, $keys);
184+
185+
$this->assertSame('foo', $result->sub);
186+
}
187+
}
188+
189+
public function testOctetJwkMissingK()
190+
{
191+
$this->expectException(UnexpectedValueException::class);
192+
$this->expectExceptionMessage('k not set');
193+
194+
$badJwk = ['kty' => 'oct', 'alg' => 'HS256'];
195+
$keys = JWK::parseKeySet(['keys' => [$badJwk]]);
196+
}
197+
173198
public function testParseKey()
174199
{
175200
// Use a known module and exponent, and ensure it parses as expected

Diff for: tests/data/octet-jwkset.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"keys": [
3+
{
4+
"kty": "oct",
5+
"alg": "HS256",
6+
"kid": "jwk1",
7+
"k": "xUNfVvQ-WdmXB9qp6qK0SrG-yKW4AJqmcSP66Gm2TrE"
8+
},
9+
{
10+
"kty": "oct",
11+
"alg": "HS384",
12+
"kid": "jwk2",
13+
"k": "z7990HoD72QDX9JKqeQc3l7EtXutco72j2YulZMjeakFVDbFGXGDFG4awOF7eu9l"
14+
},
15+
{
16+
"kty": "oct",
17+
"alg": "HS512",
18+
"kid": "jwk3",
19+
"k": "EmYGSDG5W1UjkPIL7LelG-QMVtsXn7bz5lUxBrkqq3kdFEzkLWVGrXKpZxRe7YcApCe0d4s9lXRQtn5Nzaf49w"
20+
}
21+
]
22+
}

0 commit comments

Comments
 (0)