From 9bc4c64a45242c115996e5de41e3ce91a6a6016f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20B=C3=B6ser?= Date: Wed, 19 Nov 2025 21:47:26 +0100 Subject: [PATCH 1/2] add support for brainpoolP256r1 --- src/Library/Core/Util/ECKey.php | 5 +- src/Library/Core/Util/Ecc/BrainpoolCurve.php | 48 +++++++++++++++++++ .../Algorithm/KeyEncryption/AbstractECDH.php | 6 ++- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/Library/Core/Util/Ecc/BrainpoolCurve.php diff --git a/src/Library/Core/Util/ECKey.php b/src/Library/Core/Util/ECKey.php index 6c3bc696..02e9a872 100644 --- a/src/Library/Core/Util/ECKey.php +++ b/src/Library/Core/Util/ECKey.php @@ -32,6 +32,7 @@ public static function convertPublicKeyToPEM(JWK $jwk): string { $der = match ($jwk->get('crv')) { 'P-256' => self::p256PublicKey(), + 'BP-256' => self::p256PublicKey(), 'secp256k1' => self::p256KPublicKey(), 'P-384' => self::p384PublicKey(), 'P-521' => self::p521PublicKey(), @@ -48,6 +49,7 @@ public static function convertPrivateKeyToPEM(JWK $jwk): string { $der = match ($jwk->get('crv')) { 'P-256' => self::p256PrivateKey($jwk), + 'BP-256' => self::p256PrivateKey($jwk), 'secp256k1' => self::p256KPrivateKey($jwk), 'P-384' => self::p384PrivateKey($jwk), 'P-521' => self::p521PrivateKey($jwk), @@ -77,7 +79,7 @@ public static function createECKey(string $curve, array $values = []): JWK private static function getNistCurveSize(string $curve): int { return match ($curve) { - 'P-256', 'secp256k1' => 256, + 'P-256', 'BP-256', 'secp256k1' => 256, 'P-384' => 384, 'P-521' => 521, default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported.', $curve)), @@ -130,6 +132,7 @@ private static function getOpensslCurveName(string $curve): string { return match ($curve) { 'P-256' => 'prime256v1', + 'BP-256' => 'brainpoolP256r1', 'secp256k1' => 'secp256k1', 'P-384' => 'secp384r1', 'P-521' => 'secp521r1', diff --git a/src/Library/Core/Util/Ecc/BrainpoolCurve.php b/src/Library/Core/Util/Ecc/BrainpoolCurve.php new file mode 100644 index 00000000..2e81d3a7 --- /dev/null +++ b/src/Library/Core/Util/Ecc/BrainpoolCurve.php @@ -0,0 +1,48 @@ +getCurve($crv); if (function_exists('openssl_pkey_derive')) { try { @@ -158,7 +160,7 @@ protected function getKeysFromPublicKey( throw new InvalidArgumentException('Invalid key parameter "crv"'); } $private_key = match ($crv) { - 'P-256', 'P-384', 'P-521' => $senderKey ?? ECKey::createECKey($crv), + 'P-256', 'P-384', 'P-521', 'BP-256' => $senderKey ?? ECKey::createECKey($crv), 'X25519' => $senderKey ?? $this->createOKPKey('X25519'), default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $crv)), }; @@ -221,6 +223,7 @@ private function checkKey(JWK $key, bool $is_private): void case 'P-256': case 'P-384': case 'P-521': + case 'BP-256': if (! $key->has('y')) { throw new InvalidArgumentException('The key parameter "y" is missing.'); } @@ -244,6 +247,7 @@ private function getCurve(string $crv): Curve 'P-256' => NistCurve::curve256(), 'P-384' => NistCurve::curve384(), 'P-521' => NistCurve::curve521(), + 'BP-256' => BrainpoolCurve::curve256(), default => throw new InvalidArgumentException(sprintf('The curve "%s" is not supported', $crv)), }; } From 5552240fea3fd88b245163c274d597d8ebfa075a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20B=C3=B6ser?= Date: Thu, 20 Nov 2025 17:16:49 +0100 Subject: [PATCH 2/2] fixed some styling --- .gitignore | 1 + src/Library/Core/Util/ECKey.php | 2 ++ .../Encryption/Algorithm/KeyEncryption/AbstractECDH.php | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1553eeb6..42b4c153 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ infection.txt .castor.stub.php /tmp* /.ci-tools/coverage +/var/cache diff --git a/src/Library/Core/Util/ECKey.php b/src/Library/Core/Util/ECKey.php index 02e9a872..371b9a61 100644 --- a/src/Library/Core/Util/ECKey.php +++ b/src/Library/Core/Util/ECKey.php @@ -7,10 +7,12 @@ use InvalidArgumentException; use Jose\Component\Core\JWK; use RuntimeException; + use function extension_loaded; use function is_array; use function is_string; use function sprintf; + use const OPENSSL_KEYTYPE_EC; use const STR_PAD_LEFT; diff --git a/src/Library/Encryption/Algorithm/KeyEncryption/AbstractECDH.php b/src/Library/Encryption/Algorithm/KeyEncryption/AbstractECDH.php index e78b7674..61f8fbb9 100644 --- a/src/Library/Encryption/Algorithm/KeyEncryption/AbstractECDH.php +++ b/src/Library/Encryption/Algorithm/KeyEncryption/AbstractECDH.php @@ -8,16 +8,17 @@ use InvalidArgumentException; use Jose\Component\Core\JWK; use Jose\Component\Core\Util\Base64UrlSafe; +use Jose\Component\Core\Util\Ecc\BrainpoolCurve; use Jose\Component\Core\Util\Ecc\Curve; use Jose\Component\Core\Util\Ecc\EcDH; use Jose\Component\Core\Util\Ecc\NistCurve; -use Jose\Component\Core\Util\Ecc\BrainpoolCurve; use Jose\Component\Core\Util\Ecc\PrivateKey; use Jose\Component\Core\Util\ECKey; use Jose\Component\Encryption\Algorithm\KeyEncryption\Util\ConcatKDF; use Override; use RuntimeException; use Throwable; + use function array_key_exists; use function extension_loaded; use function function_exists;