Skip to content

Commit 5812291

Browse files
committed
EC key creation improvement
EC key creation is now faster when OpenSSL supports EC keys.
1 parent add9218 commit 5812291

File tree

4 files changed

+42
-32
lines changed

4 files changed

+42
-32
lines changed

performance/KeyFactory/KeyFactory.php

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
use Base64Url\Base64Url;
1717
use Jose\Component\Core\JWK;
18-
use Jose\Component\KeyManagement\JWKFactory;
18+
use Jose\Component\Core\Util\Ecc\NistCurve;
1919

2020
/**
2121
* @Revs(100)
@@ -26,9 +26,19 @@ final class KeyFactory
2626
/**
2727
* @Subject()
2828
*/
29-
public function usingTheFactoryMethod()
29+
public function usingThePurePhpMethod()
3030
{
31-
JWKFactory::createECKey('P-256');
31+
$nistCurve = NistCurve::curve256();
32+
$privateKey = $nistCurve->createPrivateKey();
33+
$publicKey = $nistCurve->createPublicKey($privateKey);
34+
35+
JWK::create([
36+
'kty' => 'EC',
37+
'crv' => $curve,
38+
'd' => Base64Url::encode(gmp_export($privateKey->getSecret())),
39+
'x' => Base64Url::encode(gmp_export($publicKey->getPoint()->getX())),
40+
'y' => Base64Url::encode(gmp_export($publicKey->getPoint()->getY())),
41+
]);
3242
}
3343

3444
/**
@@ -48,12 +58,12 @@ public function usingOpenSSL()
4858

4959
$details = openssl_pkey_get_details($res);
5060

51-
$jwk = JWK::create([
61+
JWK::create([
5262
'kty' => 'EC',
5363
'crv' => 'P-256',
54-
'x' => Base64Url::encode(bin2hex($details['ec']['x'])),
55-
'y' => Base64Url::encode(bin2hex($details['ec']['y'])),
56-
'd' => Base64Url::encode(bin2hex($details['ec']['d'])),
64+
'x' => Base64Url::encode($details['ec']['x']),
65+
'y' => Base64Url::encode($details['ec']['y']),
66+
'd' => Base64Url::encode($details['ec']['d']),
5767
]);
5868
}
5969
}

src/Component/Core/Util/Ecc/NistCurve.php

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ class NistCurve
4949
*/
5050
public static function curve256(): Curve
5151
{
52-
$p = gmp_init('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff', 16);
53-
$a = gmp_init('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc', 16);
54-
$b = gmp_init('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b', 16);
55-
$x = gmp_init('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296', 16);
56-
$y = gmp_init('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5', 16);
57-
$n = gmp_init('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551', 16);
52+
$p = gmp_init('ffffffff00000001000000000000000000000000ffffffffffffffffffffffff', 16);
53+
$a = gmp_init('ffffffff00000001000000000000000000000000fffffffffffffffffffffffc', 16);
54+
$b = gmp_init('5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b', 16);
55+
$x = gmp_init('6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296', 16);
56+
$y = gmp_init('4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5', 16);
57+
$n = gmp_init('ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551', 16);
5858
$generator = Point::create($x, $y, $n);
5959

6060
return new Curve(256, $p, $a, $b, $generator);
@@ -67,12 +67,12 @@ public static function curve256(): Curve
6767
*/
6868
public static function curve384(): Curve
6969
{
70-
$p = gmp_init('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff', 16);
71-
$a = gmp_init('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc', 16);
72-
$b = gmp_init('0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef', 16);
73-
$x = gmp_init('0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7', 16);
74-
$y = gmp_init('0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f', 16);
75-
$n = gmp_init('0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973', 16);
70+
$p = gmp_init('fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff', 16);
71+
$a = gmp_init('fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc', 16);
72+
$b = gmp_init('b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef', 16);
73+
$x = gmp_init('aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7', 16);
74+
$y = gmp_init('3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f', 16);
75+
$n = gmp_init('ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973', 16);
7676
$generator = Point::create($x, $y, $n);
7777

7878
return new Curve(384, $p, $a, $b, $generator);
@@ -85,12 +85,12 @@ public static function curve384(): Curve
8585
*/
8686
public static function curve521(): Curve
8787
{
88-
$p = gmp_init('0x000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16);
89-
$a = gmp_init('0x000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc', 16);
90-
$b = gmp_init('0x00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00', 16);
91-
$x = gmp_init('0x000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66', 16);
92-
$y = gmp_init('0x0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650', 16);
93-
$n = gmp_init('0x000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409', 16);
88+
$p = gmp_init('000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16);
89+
$a = gmp_init('000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc', 16);
90+
$b = gmp_init('00000051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00', 16);
91+
$x = gmp_init('000000c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66', 16);
92+
$y = gmp_init('0000011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650', 16);
93+
$n = gmp_init('000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409', 16);
9494
$generator = Point::create($x, $y, $n);
9595

9696
return new Curve(521, $p, $a, $b, $generator);

src/Component/Encryption/Algorithm/KeyEncryption/ECDHES.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ private function getCurve(string $crv): Curve
232232
*/
233233
private function convertBase64ToGmp(string $value): \GMP
234234
{
235-
$value = unpack('H*', Base64Url::decode($value));
235+
$value = unpack('H*', Base64Url::decode($value));;
236236

237237
return gmp_init($value[1], 16);
238238
}
@@ -363,9 +363,9 @@ private static function createECKeyUsingOpenSSL(string $curve): array
363363
return [
364364
'kty' => 'EC',
365365
'crv' => $curve,
366-
'x' => Base64Url::encode(bin2hex($details['ec']['x'])),
367-
'y' => Base64Url::encode(bin2hex($details['ec']['y'])),
368-
'd' => Base64Url::encode(bin2hex($details['ec']['d'])),
366+
'd' => Base64Url::encode($details['ec']['d']),
367+
'x' => Base64Url::encode($details['ec']['x']),
368+
'y' => Base64Url::encode($details['ec']['y']),
369369
];
370370
}
371371

src/Component/KeyManagement/JWKFactory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ public static function createRSAKey(int $size, array $values = []): JWK
6464
*/
6565
public static function createECKey(string $curve, array $values = []): JWK
6666
{
67-
/*try {
67+
try {
6868
$jwk = self::createECKeyUsingOpenSSL($curve);
69-
} catch (\Exception $e) {*/
69+
} catch (\Exception $e) {
7070
$jwk = self::createECKeyUsingPurePhp($curve);
71-
//}
71+
}
7272
$values = array_merge($values, $jwk);
7373

7474
return JWK::create($values);

0 commit comments

Comments
 (0)