Skip to content

Commit 949247b

Browse files
authored
Merge pull request #698 from web-token/fix/jwe-builder-shared-header-after-recipient
fix(encryption): read the recipient header from the builder state
2 parents b8d4766 + 892925a commit 949247b

3 files changed

Lines changed: 84 additions & 9 deletions

File tree

‎.ci-tools/phpstan-baseline.neon‎

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4473,7 +4473,7 @@ parameters:
44734473
-
44744474
rawMessage: Cannot access offset 'header' on mixed.
44754475
identifier: offsetAccess.nonOffsetAccessible
4476-
count: 1
4476+
count: 3
44774477
path: ../src/Library/Encryption/JWEBuilder.php
44784478

44794479
-
@@ -4494,12 +4494,6 @@ parameters:
44944494
count: 1
44954495
path: ../src/Library/Encryption/JWEBuilder.php
44964496

4497-
-
4498-
rawMessage: 'Cannot call method getHeader() on mixed.'
4499-
identifier: method.nonObject
4500-
count: 2
4501-
path: ../src/Library/Encryption/JWEBuilder.php
4502-
45034497
-
45044498
rawMessage: 'Method Jose\Component\Encryption\JWEBuilder::checkAndSetContentEncryptionAlgorithm() has parameter $completeHeader with no value type specified in iterable type array.'
45054499
identifier: missingType.iterableValue

‎src/Library/Encryption/JWEBuilder.php‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public function withSharedProtectedHeader(array $sharedProtectedHeader): self
125125
{
126126
$this->checkDuplicatedHeaderParameters($sharedProtectedHeader, $this->sharedHeader);
127127
foreach ($this->recipients as $recipient) {
128-
$this->checkDuplicatedHeaderParameters($sharedProtectedHeader, $recipient->getHeader());
128+
$this->checkDuplicatedHeaderParameters($sharedProtectedHeader, $recipient['header']);
129129
}
130130
$clone = clone $this;
131131
$clone->sharedProtectedHeader = $sharedProtectedHeader;
@@ -142,7 +142,7 @@ public function withSharedHeader(array $sharedHeader): self
142142
{
143143
$this->checkDuplicatedHeaderParameters($this->sharedProtectedHeader, $sharedHeader);
144144
foreach ($this->recipients as $recipient) {
145-
$this->checkDuplicatedHeaderParameters($sharedHeader, $recipient->getHeader());
145+
$this->checkDuplicatedHeaderParameters($sharedHeader, $recipient['header']);
146146
}
147147
$clone = clone $this;
148148
$clone->sharedHeader = $sharedHeader;

‎tests/Component/Encryption/EncrypterTest.php‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,87 @@ public function duplicatedHeader(): void
7070
]);
7171
}
7272

73+
#[Test]
74+
public function sharedHeaderCanBeSetAfterTheRecipientHasBeenAdded(): void
75+
{
76+
$jweBuilder = $this->getJWEBuilderFactory()
77+
->create(['RSA-OAEP-256', 'A256CBC-HS512']);
78+
$jweDecrypter = $this->getJWEDecrypterFactory()
79+
->create(['RSA-OAEP-256', 'A256CBC-HS512']);
80+
81+
$jwe = $jweBuilder
82+
->create()
83+
->withPayload('FOO')
84+
->withSharedProtectedHeader([
85+
'enc' => 'A256CBC-HS512',
86+
'alg' => 'RSA-OAEP-256',
87+
])
88+
->addRecipient($this->getRSARecipientKey())
89+
->withSharedHeader([
90+
'cty' => 'text/plain',
91+
])
92+
->build();
93+
94+
$token = $this->getJWESerializerManager()
95+
->serialize('jwe_json_flattened', $jwe, 0);
96+
$loaded = $this->getJWESerializerManager()
97+
->unserialize($token);
98+
99+
static::assertSame('text/plain', $loaded->getSharedHeaderParameter('cty'));
100+
static::assertTrue($jweDecrypter->decryptUsingKeySet($loaded, $this->getPrivateKeySet(), 0));
101+
static::assertSame('FOO', $loaded->getPayload());
102+
}
103+
104+
#[Test]
105+
public function duplicatedHeaderWhenTheSharedHeaderIsSetAfterTheRecipient(): void
106+
{
107+
$this->expectException(InvalidArgumentException::class);
108+
$this->expectExceptionMessage('The header contains duplicated entries: cty.');
109+
110+
$jweBuilder = $this->getJWEBuilderFactory()
111+
->create(['RSA-OAEP-256', 'A256CBC-HS512']);
112+
113+
$jweBuilder
114+
->create()
115+
->withPayload('FOO')
116+
->withSharedProtectedHeader([
117+
'enc' => 'A256CBC-HS512',
118+
'alg' => 'RSA-OAEP-256',
119+
])
120+
->addRecipient($this->getRSARecipientKey(), [
121+
'cty' => 'text/plain',
122+
])
123+
->withSharedHeader([
124+
'cty' => 'application/json',
125+
]);
126+
}
127+
128+
#[Test]
129+
public function duplicatedHeaderWhenTheSharedProtectedHeaderIsSetAfterTheRecipient(): void
130+
{
131+
$this->expectException(InvalidArgumentException::class);
132+
$this->expectExceptionMessage('The header contains duplicated entries: cty.');
133+
134+
$jweBuilder = $this->getJWEBuilderFactory()
135+
->create(['RSA-OAEP-256', 'A256CBC-HS512']);
136+
137+
$jweBuilder
138+
->create()
139+
->withPayload('FOO')
140+
->withSharedProtectedHeader([
141+
'enc' => 'A256CBC-HS512',
142+
'alg' => 'RSA-OAEP-256',
143+
])
144+
->addRecipient($this->getRSARecipientKey(), [
145+
'cty' => 'text/plain',
146+
])
147+
->withSharedProtectedHeader([
148+
'enc' => 'A256CBC-HS512',
149+
'alg' => 'RSA-OAEP-256',
150+
'cty' => 'application/json',
151+
]);
152+
}
153+
73154
#[Test]
74155
public function createCompactJWEUsingFactory(): void
75156
{

0 commit comments

Comments
 (0)