Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit 7e00caa

Browse files
Merge pull request #23 from talha-API/main
Adding Support for AES GCM 128 & 192 decryption
2 parents 0dc447e + 998f8e9 commit 7e00caa

File tree

4 files changed

+47
-27
lines changed

4 files changed

+47
-27
lines changed

src/Developer/Encryption/JWE/JweHeader.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public function __construct($alg, $enc, $kid, $cty)
1313
{
1414
$this->alg = $alg;
1515
$this->enc = $enc;
16-
$this->kid = $kid;
16+
if(!is_null($kid)) $this->kid = $kid;
1717
if(!is_null($cty)) $this->cty = $cty;
1818
}
1919

@@ -36,7 +36,7 @@ public static function parseJweHeader($encodedHeader)
3636

3737
$alg = $headerObj["alg"];
3838
$enc = $headerObj["enc"];
39-
$kid = $headerObj["kid"];
39+
$kid = (isset($headerObj["kid"])) ? $headerObj["kid"] : null;
4040
$cty = (isset($headerObj["cty"])) ? $headerObj["cty"] : null;
4141
return new JweHeader($alg, $enc, $kid, $cty);
4242
}

src/Developer/Encryption/JWE/JweObject.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,22 @@ public function decrypt($config)
8181
$this->getRawHeader(),
8282
EncodingUtils::base64UrlDecode($this->getCipherText())
8383
);
84+
case "A128GCM":
85+
return AESGCM::decrypt(
86+
EncodingUtils::base64UrlDecode($this->getIv()),
87+
$cek,
88+
EncodingUtils::base64UrlDecode($this->getAuthTag()),
89+
$this->getRawHeader(),
90+
EncodingUtils::base64UrlDecode($this->getCipherText())
91+
);
92+
case "A192GCM":
93+
return AESGCM::decrypt(
94+
EncodingUtils::base64UrlDecode($this->getIv()),
95+
$cek,
96+
EncodingUtils::base64UrlDecode($this->getAuthTag()),
97+
$this->getRawHeader(),
98+
EncodingUtils::base64UrlDecode($this->getCipherText())
99+
);
84100
case "A128CBC-HS256":
85101
return AESCBC::decrypt(
86102
EncodingUtils::base64UrlDecode($this->getIv()),

tests/Developer/Encryption/JWE/JweObjectTest.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
class JweObjectTest extends TestCase
1515
{
16-
public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIsGcmEncrypted()
16+
public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIs256GcmEncrypted()
1717
{
1818
$jweObject = JweObject::parse("eyJraWQiOiI3NjFiMDAzYzFlYWRlM2E1NDkwZTUwMDBkMzc4ODdiYWE1ZTZlYzBlMjI2YzA3NzA2ZTU5OTQ1MWZjMDMyYTc5IiwiY3R5IjoiYXBwbGljYXRpb25cL2pzb24iLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.8c6vxeZOUBS8A9SXYUSrRnfl1ht9xxciB7TAEv84etZhQQ2civQKso-htpa2DWFBSUm-UYlxb6XtXNXZxuWu-A0WXjwi1K5ZAACc8KUoYnqPldEtC9Q2bhbQgc_qZF_GxeKrOZfuXc9oi45xfVysF_db4RZ6VkLvY2YpPeDGEMX_nLEjzqKaDz_2m0Ae_nknr0p_Nu0m5UJgMzZGR4Sk1DJWa9x-WJLEyo4w_nRDThOjHJshOHaOU6qR5rdEAZr_dwqnTHrjX9Qm9N9gflPGMaJNVa4mvpsjz6LJzjaW3nJ2yCoirbaeJyCrful6cCiwMWMaDMuiBDPKa2ovVTy0Sw.w0Nkjxl0T9HHNu4R.suRZaYu6Ui05Z3-vsw.akknMr3Dl4L0VVTGPUszcA");
1919

@@ -26,6 +26,34 @@ public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIsGcmEncrypt
2626

2727
$this->assertEquals("{\"foo\":\"bar\"}", $decryptedPayload);
2828
}
29+
30+
public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIs192GcmEncrypted()
31+
{
32+
$jweObject = JweObject::parse("eyJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.FWC8PVaZoR2TRKwKO4syhSJReezVIvtkxU_yKh4qODNvlVr8t8ttvySJ-AjM8xdI6vNyIg9jBMWASG4cE49jT9FYuQ72fP4R-Td4vX8wpB8GonQj40yLqZyfRLDrMgPR20RcQDW2ThzLXsgI55B5l5fpwQ9Nhmx8irGifrFWOcJ_k1dUSBdlsHsYxkjRKMENu5x4H6h12gGZ21aZSPtwAj9msMYnKLdiUbdGmGG_P8a6gPzc9ih20McxZk8fHzXKujjukr_1p5OO4o1N4d3qa-YI8Sns2fPtf7xPHnwi1wipmCC6ThFLU80r3173RXcpyZkF8Y3UacOS9y1f8eUfVQ.JRE7kZLN4Im1Rtdb.eW_lJ-U330n0QHqZnQ._r5xYVvMCrvICwLz4chjdw");
33+
34+
$mockConfig = Phake::mock(JweConfig::class);
35+
36+
Phake::when($mockConfig)->getDecryptionKey()
37+
->thenReturn(DecryptionKey::load("./resources/Keys/Pkcs8/test_key_pkcs8-2048.pem"));
38+
39+
$decryptedPayload = $jweObject->decrypt($mockConfig);
40+
41+
$this->assertEquals("{\"foo\":\"bar\"}", $decryptedPayload);
42+
}
43+
44+
public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIs128GcmEncrypted()
45+
{
46+
$jweObject = JweObject::parse("eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.WtvYljbsjdEv-Ttxx1p6PgyIrOsLpj1FMF9NQNhJUAHlKchAo5QImgEgIdgJE7HC2KfpNcHiQVqKKZq_y201FVzpicDkNzlPJr5kIH4Lq-oC5iP0agWeou9yK5vIxFRP__F_B8HSuojBJ3gDYT_KdYffUIHkm_UysNj4PW2RIRlafJ6RKYanVzk74EoKZRG7MIr3pTU6LIkeQUW41qYG8hz6DbGBOh79Nkmq7Oceg0ZwCn1_MruerP-b15SGFkuvOshStT5JJp7OOq82gNAOkMl4fylEj2-vADjP7VSK8GlqrA7u9Tn-a4Q28oy0GOKr1Z-HJgn_CElknwkUTYsWbg.PKl6_kvZ4_4MjmjW.AH6pGFkn7J49hBQcwg.zdyD73TcuveImOy4CRnVpw");
47+
48+
$mockConfig = Phake::mock(JweConfig::class);
49+
50+
Phake::when($mockConfig)->getDecryptionKey()
51+
->thenReturn(DecryptionKey::load("./resources/Keys/Pkcs8/test_key_pkcs8-2048.pem"));
52+
53+
$decryptedPayload = $jweObject->decrypt($mockConfig);
54+
55+
$this->assertEquals("{\"foo\":\"bar\"}", $decryptedPayload);
56+
}
2957

3058
public function testDecrypt_ShouldReturnDecryptedPayload_WhenPayloadIsCbcEncrypted()
3159
{

tests/Developer/Interceptors/PsrHttpMessageJweInterceptorTest.php

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -142,30 +142,6 @@ public function testInterceptResponse_ShouldDoNothing_WhenNoPayload()
142142
$this->assertEquals(0, sizeof($response->getHeaders()));
143143
}
144144

145-
public function testInterceptResponse_ShouldThrowAnExceptionWhenEncryptionNotSupported()
146-
{
147-
$this->expectException(EncryptionException::class);
148-
$this->expectExceptionMessage('Encryption method A192GCM not supported');
149-
150-
// GIVEN
151-
$encryptedPayload = "{" .
152-
"\"encryptedPayload\":\"eyJraWQiOiI3NjFiMDAzYzFlYWRlM2E1NDkwZTUwMDBkMzc4ODdiYWE1ZTZlYzBlMjI2YzA3NzA2ZTU5OTQ1MWZjMDMyYTc5IiwiY3R5IjoiYXBwbGljYXRpb25cL2pzb24iLCJlbmMiOiJBMTkyR0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.peSgTt_lPbcNStWh-gI3yMzhOGtFCwExFwLxKeHwjzsXvHB0Fml5XnG0jRbJSfOHzKx02d0NVBzoDDRSAnafuabbbMKcoaUK-jZNHSg4BHdyBZpCO82kzvWeEm3TTNHIMBTfM00EmdFB03z_a0PaWsT-FIOzu4Sd5Z_nsNLhP9941CtVS-YtZ9WkgDezGipxA7ejQ3X5gFVy2RH1gL8OTbzIYCwBcrfSjAiCQgunNbLxPPlfZHB_6prPK7_50NS6FvuMnAhiqUiiAka8DHMdeGBWOie2Q0FV_bsRDHx_6CY8kQA3F_NXz1dELIclJhdZFfRt1y-TEfwOIj4nDi2JnA.8BYMB5MkH2ZNyFGS._xb3uDsUQcPT5fQyZw.O0MzJ5OvNyj_QMuqaloTWA\"}";
153-
154-
$decryptionKey = DecryptionKey::load("./resources/Keys/Pkcs8/test_key_pkcs8-2048.pem");
155-
156-
$config = JweConfigBuilder::aJweEncryptionConfig()
157-
->withDecryptionKey($decryptionKey)
158-
->withDecryptionPath("$.encryptedPayload", "$.foo")
159-
->build();
160-
161-
$headers = ['Content-Type' => 'application/json'];
162-
$response = new Response(200, $headers, $encryptedPayload);
163-
164-
// WHEN
165-
$instanceUnderTest = new PsrHttpMessageJweInterceptor($config);
166-
$instanceUnderTest->interceptResponse($response);
167-
}
168-
169145
public function testInterceptResponse_ShouldThrowEncryptionException_WhenDecryptionFails()
170146
{
171147
$this->expectException(EncryptionException::class);

0 commit comments

Comments
 (0)