From bdd545acf0a69d1d31ebb056c40b223735a55829 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Tue, 15 Nov 2022 12:52:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=83=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Переименовал класс с константами CADESCOM_ENCODE в CADESCOM_ENCODING_TYPE * Добавил класс с константами CAPICOM_STORE_OPEN_MODE * Добавил метод получения информации о криптопровайдере и плагине * Добавил метод проверки соответствия установленных версий криптопровайдера и плагина * Исправил используемые в классе константы --- composer.lock | 14 +-- ..._ENCODE.php => CADESCOM_ENCODING_TYPE.php} | 2 +- src/Constants/CAPICOM_STORE_OPEN_MODE.php | 36 ++++++ src/CryptoPro.php | 113 ++++++++++++++++-- 4 files changed, 144 insertions(+), 21 deletions(-) rename src/Constants/{CADESCOM_ENCODE.php => CADESCOM_ENCODING_TYPE.php} (94%) create mode 100755 src/Constants/CAPICOM_STORE_OPEN_MODE.php diff --git a/composer.lock b/composer.lock index 8ecd181..88669c0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f3e18e3b232f3c425afb730e38714eea", + "content-hash": "41cee9532212142277f16725a26986f3", "packages": [], "packages-dev": [ { @@ -68,16 +68,16 @@ }, { "name": "webmasterskaya/crypto-pro-php-stubs", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/webmasterskaya/crypto-pro-php-stubs.git", - "reference": "72a6e1160ab96c12888333d89e35059233cb9eb0" + "reference": "0bf897d4a4d9b092999aa310e8ab2b8d26acd530" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmasterskaya/crypto-pro-php-stubs/zipball/72a6e1160ab96c12888333d89e35059233cb9eb0", - "reference": "72a6e1160ab96c12888333d89e35059233cb9eb0", + "url": "https://api.github.com/repos/webmasterskaya/crypto-pro-php-stubs/zipball/0bf897d4a4d9b092999aa310e8ab2b8d26acd530", + "reference": "0bf897d4a4d9b092999aa310e8ab2b8d26acd530", "shasum": "" }, "require": { @@ -116,7 +116,7 @@ "issues": "https://github.com/webmasterskaya/crypto-pro-php-stubs/issues", "source": "https://github.com/webmasterskaya/crypto-pro-php-stubs" }, - "time": "2022-11-10T08:45:00+00:00" + "time": "2022-11-15T09:19:03+00:00" } ], "aliases": [], @@ -125,7 +125,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">7.2 <8.0", + "php": ">=7.2 <8.0", "ext-mbstring": "*" }, "platform-dev": [], diff --git a/src/Constants/CADESCOM_ENCODE.php b/src/Constants/CADESCOM_ENCODING_TYPE.php similarity index 94% rename from src/Constants/CADESCOM_ENCODE.php rename to src/Constants/CADESCOM_ENCODING_TYPE.php index 4326d98..84ebe27 100755 --- a/src/Constants/CADESCOM_ENCODE.php +++ b/src/Constants/CADESCOM_ENCODING_TYPE.php @@ -5,7 +5,7 @@ namespace Webmasterskaya\CryptoPro\Constants; /** * Тип перечисления CADESCOM_ENCODING_TYPE указывает используемый тип кодирования. */ -class CADESCOM_ENCODE +class CADESCOM_ENCODING_TYPE { /** * Данные сохраняются в виде строки в кодировке Base64. diff --git a/src/Constants/CAPICOM_STORE_OPEN_MODE.php b/src/Constants/CAPICOM_STORE_OPEN_MODE.php new file mode 100755 index 0000000..2a7e925 --- /dev/null +++ b/src/Constants/CAPICOM_STORE_OPEN_MODE.php @@ -0,0 +1,36 @@ +Open() для указания способа открытия хранилища сертификатов. + */ +class CAPICOM_STORE_OPEN_MODE +{ + /** + * Откройте хранилище в режиме только для чтения. + */ + const READ_ONLY = 0; + + /** + * Откройте хранилище в режиме чтения и записи. + */ + const READ_WRITE = 1; + + /** + * Откройте хранилище в режиме чтения и записи, если у пользователя есть разрешения на чтение и запись. + * Если у пользователя нет разрешений на чтение и запись, откройте хранилище в режиме только для чтения. + */ + const MAXIMUM_ALLOWED = 2; + + /** + * Открывать только существующие магазины; не создавайте новое хранилище. + */ + const EXISTING_ONLY = 128; + + /** + * Включите архивные сертификаты при использовании хранилища. + */ + const INCLUDE_ARCHIVED = 256; + +} \ No newline at end of file diff --git a/src/CryptoPro.php b/src/CryptoPro.php index 438ca62..5786d40 100755 --- a/src/CryptoPro.php +++ b/src/CryptoPro.php @@ -5,12 +5,13 @@ namespace Webmasterskaya\CryptoPro; use Webmasterskaya\CryptoPro\Constants\CADESCOM_ATTRIBUTE; use Webmasterskaya\CryptoPro\Constants\CADESCOM_CADES_TYPE; use Webmasterskaya\CryptoPro\Constants\CADESCOM_CONTENT_ENCODING_TYPE; -use Webmasterskaya\CryptoPro\Constants\CADESCOM_ENCODE; +use Webmasterskaya\CryptoPro\Constants\CADESCOM_ENCODING_TYPE; use Webmasterskaya\CryptoPro\Constants\CADESCOM_HASH_ALGORITHM; use Webmasterskaya\CryptoPro\Constants\CADESCOM_STORE_LOCATION; use Webmasterskaya\CryptoPro\Constants\CAPICOM_CERTIFICATE_FIND_TYPE; use Webmasterskaya\CryptoPro\Constants\CAPICOM_CERTIFICATE_INCLUDE_OPTION; use Webmasterskaya\CryptoPro\Constants\CAPICOM_PROPID; +use Webmasterskaya\CryptoPro\Constants\CAPICOM_STORE_OPEN_MODE; use Webmasterskaya\CryptoPro\Helpers\CertificateHelper; use Webmasterskaya\CryptoPro\Helpers\ErrorMessageHelper; @@ -54,7 +55,7 @@ class CryptoPro { $certificates = self::getCertificatesFromStore( CADESCOM_STORE_LOCATION::CURRENT_USER_STORE, - self::CP_MY_STORE, + static::CP_MY_STORE, false ); } @@ -98,7 +99,7 @@ class CryptoPro { $certificates = self::getCertificatesFromStore( CADESCOM_STORE_LOCATION::CONTAINER_STORE, - self::CP_MY_STORE, + static::CP_MY_STORE, false ); } @@ -298,7 +299,7 @@ class CryptoPro $cadesSigner, CADESCOM_CADES_TYPE::PKCS7_TYPE, false, - CADESCOM_ENCODE::BASE64 + CADESCOM_ENCODING_TYPE::BASE64 ); } catch (\Throwable $e) @@ -362,7 +363,6 @@ class CryptoPro $cadesAuthAttrs->Add($cadesAttrs); $cadesSigner->set_Options(CAPICOM_CERTIFICATE_INCLUDE_OPTION::WHOLE_CHAIN); - } catch (\Throwable $e) { @@ -372,8 +372,10 @@ class CryptoPro try { $cadesHashedData->set_Algorithm(CADESCOM_HASH_ALGORITHM::HASH_CP_GOST_3411_2012_256); + $cadesHashedData->set_DataEncoding(CADESCOM_CONTENT_ENCODING_TYPE::BASE64_TO_BINARY); $cadesHashedData->SetHashValue($messageHash); + $cadesSignedData->set_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE::BASE64_TO_BINARY); // Для получения объекта отсоединенной (открепленной) подписи, необходимо задать любой контент. // Этот баг описан на форуме. // https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=78553#post78553 @@ -391,7 +393,7 @@ class CryptoPro $cadesHashedData, $cadesSigner, CADESCOM_CADES_TYPE::PKCS7_TYPE, - CADESCOM_ENCODE::BASE64 + CADESCOM_ENCODING_TYPE::BASE64 ); } catch (\Throwable $e) @@ -476,7 +478,7 @@ class CryptoPro $signature = $cadesSignedData->CoSignCades( $cadesSigner, CADESCOM_CADES_TYPE::PKCS7_TYPE, - CADESCOM_ENCODE::BASE64 + CADESCOM_ENCODING_TYPE::BASE64 ); } catch (\Throwable $e) @@ -550,8 +552,10 @@ class CryptoPro try { $cadesHashedData->set_Algorithm(CADESCOM_HASH_ALGORITHM::HASH_CP_GOST_3411_2012_256); + $cadesHashedData->set_DataEncoding(CADESCOM_CONTENT_ENCODING_TYPE::BASE64_TO_BINARY); $cadesHashedData->SetHashValue($messageHash); + $cadesSignedData->set_ContentEncoding(CADESCOM_CONTENT_ENCODING_TYPE::BASE64_TO_BINARY); // Для получения объекта отсоединенной (открепленной) подписи, необходимо задать любой контент. // Этот баг описан на форуме. // https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=78553#post78553 @@ -574,7 +578,7 @@ class CryptoPro $cadesSigner, $cadesHashedData, CADESCOM_CADES_TYPE::PKCS7_TYPE, - CADESCOM_ENCODE::BASE64 + CADESCOM_ENCODING_TYPE::BASE64 ); } catch (\Throwable $e) @@ -609,7 +613,7 @@ class CryptoPro try { $cadesHashedData->set_Algorithm(CADESCOM_HASH_ALGORITHM::HASH_CP_GOST_3411_2012_256); - $cadesHashedData->set_DataEncoding(BASE64_TO_BINARY); + $cadesHashedData->set_DataEncoding(CADESCOM_CONTENT_ENCODING_TYPE::BASE64_TO_BINARY); $cadesHashedData->Hash($messageBase64); } catch (\Throwable $e) @@ -630,12 +634,95 @@ class CryptoPro } /** - * возвращает информацию о CSP и плагине + * Возвращает информацию о CSP и плагине * - * @return void + * @throws \Exception + * @return array */ public static function getSystemInfo() { + try + { + $about = new \About(); + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при получении информации о системе')); + } + + try + { + $cadesVersion = $about->PluginVersion(); + + if ($cadesVersion instanceof \Version) + { + $cadesVersion = $cadesVersion->toString(); + } + + if (!$cadesVersion) + { + $cadesVersion = $about->get_Version(); + } + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при получении информации о плагине')); + } + + try + { + $cspVersion = $about->CSPVersion(); + $cspVersion = $cspVersion->toString(); + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при получении информации о CSP')); + } + + return [ + 'cadesVersion' => $cadesVersion, + 'cspVersion' => $cspVersion, + ]; + } + + /** + * Проверяет корректность настроек средств ЭП + * + * @throws \Exception + * @return true + */ + public static function isValidSystemSetup() + { + $systemInfo = static::getSystemInfo(); + + $extractedCadesVersion = []; + + if (!preg_match('/(\d+)\.(\d+)\.(\d+)/', $systemInfo['cadesVersion'], $extractedCadesVersion)) + { + throw new \Exception('Ошибка чтеня версии плагина'); + } + + list(, $cadesVersionMajor, $cadesVersionMinor, $cadesVersionPatch) = $extractedCadesVersion; + + if ((int) $cadesVersionMajor < 2 + || ((int) $cadesVersionMajor === 2 && (int) $cadesVersionMinor === 0 && (int) $cadesVersionPatch < 12438)) + { + throw new \Exception('Не поддерживаемая версия плагина'); + } + + if (!preg_match('/(\d+)\.(\d+)\.(\d+)/', $systemInfo['cspVersion'], $extractedCSPVersion)) + { + throw new \Exception('Ошибка чтеня версии CSP'); + } + + list(, $cspVersionMajor, $cspVersionMinor, $cspVersionPatch) = $extractedCSPVersion; + + if ((int) $cspVersionMajor < 4) + { + throw new \Exception('Не поддерживаемая версия CSP'); + } + + return true; } /** @@ -679,7 +766,7 @@ class CryptoPro try { - $cadesStore->Open($storeLocation, $storeName, STORE_OPEN_MAXIMUM_ALLOWED); + $cadesStore->Open($storeLocation, $storeName, CAPICOM_STORE_OPEN_MODE::MAXIMUM_ALLOWED); } catch (\Throwable $e) { @@ -772,7 +859,7 @@ class CryptoPro try { - $cadesStore->Open($storeLocation, $storeName, STORE_OPEN_MAXIMUM_ALLOWED); + $cadesStore->Open($storeLocation, $storeName, CAPICOM_STORE_OPEN_MODE::MAXIMUM_ALLOWED); } catch (\Throwable $e) {