From b94e10be4e514334fbbba1cec6016c87505bd7bd Mon Sep 17 00:00:00 2001 From: Brent Shaffer Date: Tue, 31 Mar 2026 12:32:30 -0700 Subject: [PATCH] chore: add tests for JWK ASN1 fix --- tests/JWKTest.php | 36 ++++++++++++++++++++++++++++------ tests/data/rsa-jwk2-public.pub | 9 +++++++++ tests/data/rsa-jwkset-2.json | 11 +++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 tests/data/rsa-jwk2-public.pub create mode 100644 tests/data/rsa-jwkset-2.json diff --git a/tests/JWKTest.php b/tests/JWKTest.php index db385c87..7569d5fa 100644 --- a/tests/JWKTest.php +++ b/tests/JWKTest.php @@ -9,8 +9,15 @@ class JWKTest extends TestCase { private static $keys; - private static $privKey1; - private static $privKey2; + + public static function setUpBeforeClass(): void + { + $jwkSet = json_decode( + file_get_contents(__DIR__ . '/data/rsa-jwkset.json'), + true + ); + self::$keys = JWK::parseKeySet($jwkSet); + } public function testMissingKty() { @@ -84,16 +91,33 @@ public function testParseKeyWithEmptyDValue() $this->assertTrue(\is_array($keys)); } - public function testParseJwkKeySet() + /** @dataProvider provideParseJwkKeySet */ + public function testParseJwkKeySet($jwkFile, $keyId, $pubkeyFile) { $jwkSet = json_decode( - file_get_contents(__DIR__ . '/data/rsa-jwkset.json'), + file_get_contents(__DIR__ . '/data/' . $jwkFile), true ); $keys = JWK::parseKeySet($jwkSet); $this->assertTrue(\is_array($keys)); - $this->assertArrayHasKey('jwk1', $keys); - self::$keys = $keys; + $this->assertArrayHasKey($keyId, $keys); + + // verify public key + $keyMaterial = $keys[$keyId]->getKeyMaterial(); + $publicKey = openssl_pkey_get_details($keyMaterial)['key']; + + $this->assertEquals( + file_get_contents(__DIR__ . '/data/' . $pubkeyFile), + $publicKey + ); + } + + public function provideParseJwkKeySet() + { + return [ + ['rsa-jwkset.json', 'jwk1', 'rsa1-public.pub'], + ['rsa-jwkset-2.json', 'jwk2', 'rsa-jwk2-public.pub'], + ]; } public function testParseJwkKey_empty() diff --git a/tests/data/rsa-jwk2-public.pub b/tests/data/rsa-jwk2-public.pub new file mode 100644 index 00000000..cdc87c98 --- /dev/null +++ b/tests/data/rsa-jwk2-public.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyKqGRQyJtqxRm/Mo2YTC +CAkPSDb7uNgC7tXjgVzNv2/XB8r4vMibBpZFPbwyVUk0wGhPk8qLjrIj/K8IMu/I +Ytkq87pc1/1FAOub7e3xUrMx66GCq8QG94xROSfDWuMy7twILwjbkzNEU6bNibM0 +IQbCvdybFPhq4YHvlwOjfuMl2mNUma8wT1/l2MZenV1dmeLTg/kYGe9PGmn9JiY4 +t01Nj1FJQj9rH863KAa3LadQ4l8aBOpaIZwjANo3GCJJd4uSB67G+p0wuuDDYbiU +GtN55degXjDKrv3v5bLgpPMX6ynvt2bi0olb/QZfovTnUaLfsZpCXTk/CvUXr2Q2 +KwIDAQAB +-----END PUBLIC KEY----- diff --git a/tests/data/rsa-jwkset-2.json b/tests/data/rsa-jwkset-2.json new file mode 100644 index 00000000..433a778c --- /dev/null +++ b/tests/data/rsa-jwkset-2.json @@ -0,0 +1,11 @@ +{ + "keys": [ + { + "kty": "RSA", + "e": "AQAB", + "kid": "jwk2", + "alg": "RS256", + "n": "yKqGRQyJtqxRm_Mo2YTCCAkPSDb7uNgC7tXjgVzNv2_XB8r4vMibBpZFPbwyVUk0wGhPk8qLjrIj_K8IMu_IYtkq87pc1_1FAOub7e3xUrMx66GCq8QG94xROSfDWuMy7twILwjbkzNEU6bNibM0IQbCvdybFPhq4YHvlwOjfuMl2mNUma8wT1_l2MZenV1dmeLTg_kYGe9PGmn9JiY4t01Nj1FJQj9rH863KAa3LadQ4l8aBOpaIZwjANo3GCJJd4uSB67G-p0wuuDDYbiUGtN55degXjDKrv3v5bLgpPMX6ynvt2bi0olb_QZfovTnUaLfsZpCXTk_CvUXr2Q2Kw" + } + ] +} \ No newline at end of file