Skip to content

Commit fb6d524

Browse files
Spomkyclaude
andauthored
Update signature tests for the protected-header "alg" requirement (web-token#651)
Following the algorithm-confusion fix (GHSA-jc38-x7x8-2xc8), JWSVerifier reads "alg" only from the integrity-protected header and rejects a JWS whose "alg" is absent from it. Three existing tests asserted the previous behaviour where "alg" could come from the unprotected header (RFC 7520 §4.7 / §4.8 examples); they now assert that such tokens are rejected, and the expected exception message is updated accordingly. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 1e231cb commit fb6d524

3 files changed

Lines changed: 25 additions & 6 deletions

File tree

tests/Component/Signature/RFC7520/MultipleSignaturesTest.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
namespace Jose\Tests\Component\Signature\RFC7520;
66

7+
use InvalidArgumentException;
78
use Jose\Component\Core\JWK;
9+
use Jose\Component\Signature\JWS;
10+
use Jose\Component\Signature\JWSVerifier;
811
use Jose\Tests\Component\Signature\SignatureTestCase;
912
use PHPUnit\Framework\Attributes\Test;
1013

@@ -81,9 +84,9 @@ public function multipleSignatures(): void
8184

8285
static::assertSame(3, $jws->countSignatures());
8386

84-
static::assertTrue($jwsVerifier->verifyWithKey($jws, $ecdsa_private_key, 0));
8587
static::assertTrue($jwsVerifier->verifyWithKey($jws, $rsa_private_key, 1));
8688
static::assertTrue($jwsVerifier->verifyWithKey($jws, $symmetric_key, 2));
89+
$this->assertUnprotectedAlgIsRejected($jwsVerifier, $jws, $ecdsa_private_key, 0);
8790

8891
/** @see https://tools.ietf.org/html/rfc7520#section-4.8.5 */
8992
$expected_json = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"bilbo.baggins@hobbiton.example"},"signature":"MIsjqtVlOpa71KE-Mss8_Nq2YH4FGhiocsqrgi5NvyG53uoimic1tcMdSg-qptrzZc7CG6Svw2Y13TDIqHzTUrL_lR2ZFcryNFiHkSw129EghGpwkpxaTn_THJTCglNbADko1MZBCdwzJxwqZc-1RlpO2HibUYyXSwO97BSe0_evZKdjvvKSgsIqjytKSeAMbhMBdMma622_BG5t4sdbuCHtFjp9iJmkio47AIwqkZV1aIZsv33uPUqBBCXbYoQJwt7mxPftHmNlGoOSMxR_3thmXTCm4US-xiNOyhbm8afKK64jU6_TPtQHiJeQJxz9G3Tx-083B745_AfYOnlC9w"},{"header":{"alg":"ES512","kid":"bilbo.baggins@hobbiton.example"},"signature":"ARcVLnaJJaUWG8fG-8t5BREVAuTY8n8YHjwDO1muhcdCoFZFFjfISu0Cdkn9Ybdlmi54ho0x924DUz8sK7ZXkhc7AFM8ObLfTvNCrqcI3Jkl2U5IX3utNhODH6v7xgy1Qahsn0fyb4zSAkje8bAWz4vIfj5pCMYxxm4fgV3q7ZYhm5eD"},{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]}';
@@ -94,7 +97,21 @@ public function multipleSignatures(): void
9497
static::assertSame($payload, $loaded_json->getPayload());
9598

9699
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $rsa_private_key, 0));
97-
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $ecdsa_private_key, 1));
98100
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $symmetric_key, 2));
101+
$this->assertUnprotectedAlgIsRejected($jwsVerifier, $loaded_json, $ecdsa_private_key, 1);
102+
}
103+
104+
private function assertUnprotectedAlgIsRejected(
105+
JWSVerifier $jwsVerifier,
106+
JWS $jws,
107+
JWK $key,
108+
int $signature
109+
): void {
110+
try {
111+
$jwsVerifier->verifyWithKey($jws, $key, $signature);
112+
static::fail('A signature whose "alg" is not in the protected header must be rejected.');
113+
} catch (InvalidArgumentException $e) {
114+
static::assertSame('No "alg" parameter set in the protected header.', $e->getMessage());
115+
}
99116
}
100117
}

tests/Component/Signature/SignerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ public function flattenedJSONWithUnencodedDetachedPayload(): void
930930
public function signAndLoadWithoutAlgParameterInTheHeader(): void
931931
{
932932
$this->expectException(InvalidArgumentException::class);
933-
$this->expectExceptionMessage('No "alg" parameter set in the header.');
933+
$this->expectExceptionMessage('No "alg" parameter set in the protected header.');
934934

935935
$payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
936936
$jws = 'eyJraWQiOiJiaWxiby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUifQ.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg';

tests/SignatureAlgorithm/HMAC/HMACFromRFC7520Test.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Jose\Tests\SignatureAlgorithm\HMAC;
66

7+
use InvalidArgumentException;
78
use Jose\Component\Core\AlgorithmManager;
89
use Jose\Component\Core\JWK;
910
use Jose\Component\Signature\Algorithm\HS256;
@@ -302,9 +303,10 @@ public function hS256WithoutProtectedHeader(): void
302303
);
303304

304305
$loaded_flattened_json = $jsonFlattenedSerializer->unserialize($expected_flattened_json);
305-
static::assertTrue($jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0));
306-
307306
$loaded_json = $jsonGeneralSerializer->unserialize($expected_json);
308-
static::assertTrue($jwsVerifier->verifyWithKey($loaded_json, $key, 0));
307+
308+
$this->expectException(InvalidArgumentException::class);
309+
$this->expectExceptionMessage('No "alg" parameter set in the protected header.');
310+
$jwsVerifier->verifyWithKey($loaded_flattened_json, $key, 0);
309311
}
310312
}

0 commit comments

Comments
 (0)