Skip to content

Commit 3c2d70f

Browse files
authored
chore: add tests and docs for rsa with passphrase (#335)
1 parent ae3188c commit 3c2d70f

File tree

4 files changed

+98
-8
lines changed

4 files changed

+98
-8
lines changed

README.md

+34
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,40 @@ $decoded_array = (array) $decoded;
110110
echo "Decode:\n" . print_r($decoded_array, true) . "\n";
111111
```
112112

113+
Example with a passphrase
114+
-------------------------
115+
116+
```php
117+
// Your passphrase
118+
$passphrase = '[YOUR_PASSPHRASE]';
119+
120+
// Your private key file with passphrase
121+
// Can be generated with "ssh-keygen -t rsa -m pem"
122+
$privateKeyFile = '/path/to/key-with-passphrase.pem';
123+
124+
// Create a private key of type "resource"
125+
$privateKey = openssl_pkey_get_private(
126+
file_get_contents($privateKeyFile),
127+
$passphrase
128+
);
129+
130+
$payload = array(
131+
"iss" => "example.org",
132+
"aud" => "example.com",
133+
"iat" => 1356999524,
134+
"nbf" => 1357000000
135+
);
136+
137+
$jwt = JWT::encode($payload, $privateKey, 'RS256');
138+
echo "Encode:\n" . print_r($jwt, true) . "\n";
139+
140+
// Get public key from the private key, or pull from from a file.
141+
$publicKey = openssl_pkey_get_details($privateKey)['key'];
142+
143+
$decoded = JWT::decode($jwt, $publicKey, array('RS256'));
144+
echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
145+
```
146+
113147
Using JWKs
114148
----------
115149

src/JWT.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,14 @@ public static function decode($jwt, $key, array $allowed_algs = array())
153153
/**
154154
* Converts and signs a PHP object or array into a JWT string.
155155
*
156-
* @param object|array $payload PHP object or array
157-
* @param string $key The secret key.
158-
* If the algorithm used is asymmetric, this is the private key
159-
* @param string $alg The signing algorithm.
160-
* Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
161-
* 'HS512', 'RS256', 'RS384', and 'RS512'
162-
* @param mixed $keyId
163-
* @param array $head An array with header elements to attach
156+
* @param object|array $payload PHP object or array
157+
* @param string|resource $key The secret key.
158+
* If the algorithm used is asymmetric, this is the private key
159+
* @param string $alg The signing algorithm.
160+
* Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
161+
* 'HS512', 'RS256', 'RS384', and 'RS512'
162+
* @param mixed $keyId
163+
* @param array $head An array with header elements to attach
164164
*
165165
* @return string A signed JWT
166166
*

tests/JWTTest.php

+14
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,20 @@ public function testRSEncodeDecode()
285285
$this->assertEquals($decoded, 'abc');
286286
}
287287

288+
public function testRSEncodeDecodeWithPassphrase()
289+
{
290+
$privateKey = openssl_pkey_get_private(
291+
file_get_contents(__DIR__ . '/rsa-with-passphrase.pem'),
292+
'passphrase'
293+
);
294+
295+
$jwt = JWT::encode('abc', $privateKey, 'RS256');
296+
$keyDetails = openssl_pkey_get_details($privateKey);
297+
$pubKey = $keyDetails['key'];
298+
$decoded = JWT::decode($jwt, $pubKey, array('RS256'));
299+
$this->assertEquals($decoded, 'abc');
300+
}
301+
288302
/**
289303
* @runInSeparateProcess
290304
* @dataProvider provideEncodeDecode

tests/rsa-with-passphrase.pem

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
Proc-Type: 4,ENCRYPTED
3+
DEK-Info: AES-128-CBC,D8AA4EC8D8B5883F09ACB308FB026C94
4+
5+
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
42+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)