From 24909c1e7000ade9a25c210a2e4ac163c7b60762 Mon Sep 17 00:00:00 2001 From: Andrei Ciovica Date: Fri, 8 Dec 2023 13:59:41 +0200 Subject: [PATCH] Remove phpseclib2_compat dependency --- composer.json | 1 - .../ApplePayDecodingServiceFactory.php | 4 +- src/ApplePay/Decoding/Asn1Wrapper.php | 53 +++++++------------ .../SignatureVerifierFactory.php | 8 +-- tests/Decoding/Asn1WrapperTest.php | 11 ++-- .../EccSignatureVerifierTest.php | 1 - 6 files changed, 25 insertions(+), 53 deletions(-) diff --git a/composer.json b/composer.json index e7527ab..0e8691a 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,6 @@ "php": "^7.4|^8.0", "ext-openssl": "*", "phpseclib/phpseclib": "^3.0", - "phpseclib/phpseclib2_compat": "^1.0", "spomky-labs/php-aes-gcm": "^1.2", "symfony/process": "^4.1|^5.0" }, diff --git a/src/ApplePay/ApplePayDecodingServiceFactory.php b/src/ApplePay/ApplePayDecodingServiceFactory.php index 9e831a5..7ec5c18 100644 --- a/src/ApplePay/ApplePayDecodingServiceFactory.php +++ b/src/ApplePay/ApplePayDecodingServiceFactory.php @@ -10,7 +10,6 @@ use PayU\ApplePay\Decoding\PKCS7SignatureValidatorSettings; use PayU\ApplePay\Decoding\SignatureVerifier\SignatureVerifierFactory; use PayU\ApplePay\Decoding\TemporaryFile\TemporaryFileService; -use phpseclib\File\ASN1; class ApplePayDecodingServiceFactory { @@ -21,8 +20,7 @@ public function make() { $decoderFactory = new ApplePayDecoderFactory(); $signatureVerifierFactory = new SignatureVerifierFactory(); - $asn1 = new ASN1(); - $asn1Wrapper = new Asn1Wrapper($asn1); + $asn1Wrapper = new Asn1Wrapper(); $temporaryFileService = new TemporaryFileService(); $openSslService = new OpenSslService(); $pkcs7SignatureValidatorSettings = new PKCS7SignatureValidatorSettings(); diff --git a/src/ApplePay/Decoding/Asn1Wrapper.php b/src/ApplePay/Decoding/Asn1Wrapper.php index 04d6010..a7276aa 100644 --- a/src/ApplePay/Decoding/Asn1Wrapper.php +++ b/src/ApplePay/Decoding/Asn1Wrapper.php @@ -2,69 +2,56 @@ namespace PayU\ApplePay\Decoding; -use phpseclib\File\ASN1; +use phpseclib3\File\ASN1; class Asn1Wrapper { /** @var array */ private $asn1; - /** @var ASN1 */ - private $asn1Parser; - - public function __construct(ASN1 $asn1) + public function loadFromString($value): void { - $this->asn1Parser = $asn1; - } - - public function loadFromString($value) { - $this->asn1 = $this->asn1Parser->decodeBER($value); + $this->asn1 = ASN1::decodeBER($value); } - public function getSignature() { + public function getSignature() + { return $this->asn1[0]['content'][1]['content'][0]['content'][4]['content'][0]['content'][5]['content']; } - public function getSignedAttributes() { + public function getSignedAttributes(): string + { $signedAttributes = $this->asn1[0]['content'][1]['content'][0]['content'][4]['content'][0]['content'][3]; // ['content']; - $signedAttr = $this->asn1Parser->asn1map($signedAttributes, [ - 'type' => ASN1::TYPE_ANY, - 'implicit' => true - ])->element; + $signedAttr = ASN1::asn1map($signedAttributes, ['type' => ASN1::TYPE_ANY, 'implicit' => true])->element; $signedAttr[0] = chr(0x31); return $signedAttr; } - public function getDigestMessage() { + public function getDigestMessage() + { $object = $this->asn1[0]['content'][1]['content'][0]['content'][4]['content'][0]['content'][3]; + return $object['content'][3]['content'][1]['content'][0]['content']; } - public function getLeafCertificatePublicKey() { + public function getLeafCertificatePublicKey(): string + { $content = $this->asn1[0]['content'][1]['content'][0]['content'][3] // certificates tag - ['content'][0] // leaf certificate index - ['content'][0] // cert_info tag - ['content'][6]; // key tag, all contents, including headers + ['content'][0] // leaf certificate index + ['content'][0] // cert_info tag + ['content'][6]; // key tag, all contents, including headers - $publicKey = $this->asn1Parser->asn1map($content, [ - 'type' => ASN1::TYPE_ANY, - 'implicit' => true - ])->element; + $publicKey = ASN1::asn1map($content, ['type' => ASN1::TYPE_ANY, 'implicit' => true])->element; return trim($publicKey); } - /** - * @return string - */ - public function getSigningTime() { + public function getSigningTime(): string + { $timeAttribute = $this->asn1[0]['content'][1]['content'][0]['content'][4]['content'][0]['content'][3]['content'][1]['content'][1]['content'][0]; - $signTime = $this->asn1Parser->asn1map($timeAttribute, [ - 'type' => ASN1::TYPE_UTC_TIME - ]); - return $signTime; + return ASN1::asn1map($timeAttribute, ['type' => ASN1::TYPE_UTC_TIME]); } } \ No newline at end of file diff --git a/src/ApplePay/Decoding/SignatureVerifier/SignatureVerifierFactory.php b/src/ApplePay/Decoding/SignatureVerifier/SignatureVerifierFactory.php index 5586580..f88981e 100644 --- a/src/ApplePay/Decoding/SignatureVerifier/SignatureVerifierFactory.php +++ b/src/ApplePay/Decoding/SignatureVerifier/SignatureVerifierFactory.php @@ -5,17 +5,12 @@ use Exception; use PayU\ApplePay\Decoding\Asn1Wrapper; use PayU\ApplePay\Decoding\OpenSSL\OpenSslService; -use phpseclib\File\ASN1; class SignatureVerifierFactory { const ECC = 'EC_v1'; const RSA = 'rsa'; - public function __construct() - { - } - /** * @param $version * @return mixed|EccSignatureVerifier @@ -25,8 +20,7 @@ public function make($version) { switch ($version) { case self::ECC: - $asn1 = new ASN1(); - $asn1Wrapper = new Asn1Wrapper($asn1); + $asn1Wrapper = new Asn1Wrapper(); $openSslService = new OpenSslService(); return new EccSignatureVerifier($asn1Wrapper, $openSslService); case self::RSA: diff --git a/tests/Decoding/Asn1WrapperTest.php b/tests/Decoding/Asn1WrapperTest.php index 013de6c..d80a7b2 100644 --- a/tests/Decoding/Asn1WrapperTest.php +++ b/tests/Decoding/Asn1WrapperTest.php @@ -2,7 +2,6 @@ namespace PayU\ApplePay\Decoding; -use phpseclib\File\ASN1; use PHPUnit\Framework\TestCase; class Asn1WrapperTest extends TestCase @@ -10,19 +9,15 @@ class Asn1WrapperTest extends TestCase /** @var Asn1Wrapper */ private $asn1Wrapper; - /** - * @var string - base64 encoded pkcs7 certificate - */ - private $certificateToTest = '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'; + private string $certificateToTest = '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'; protected function setUp(): void { - $asn1 = new ASN1(); - $this->asn1Wrapper = new Asn1Wrapper($asn1); + $this->asn1Wrapper = new Asn1Wrapper(); $this->asn1Wrapper->loadFromString(base64_decode($this->certificateToTest)); } - public function testParsingOK() + public function testParsingOK(): void { $expectedSigningTime = 'Mon, 11 Dec 2017 16:10:25 +0000'; $expectedSignature = 'MEUCIEZvNK+I5N/EE6yYCHJqijamwaHHhW9pQAlsCSFocosWAiEAmzl1jc20RxbfVtiD1Z7C5u2UtmKCDHO2s5Eab0fnyys='; diff --git a/tests/Decoding/SignatureVerifier/EccSignatureVerifierTest.php b/tests/Decoding/SignatureVerifier/EccSignatureVerifierTest.php index 93cfc2c..7c64be0 100644 --- a/tests/Decoding/SignatureVerifier/EccSignatureVerifierTest.php +++ b/tests/Decoding/SignatureVerifier/EccSignatureVerifierTest.php @@ -30,7 +30,6 @@ protected function setUp(): void ->disableOriginalConstructor() ->getMock(); - $this->asn1WrapperMock->method('loadFromString')->willReturn(true); $this->asn1WrapperMock->method('getDigestMessage')->willReturn(hash('sha256', 'dummy_valuedummy_valuedummy_value', true)); $this->asn1WrapperMock->method('getLeafCertificatePublicKey')->willReturn('dummyValue');