Skip to content

Commit

Permalink
Исправления и улучшения (#3)
Browse files Browse the repository at this point in the history
* Переименовал класс с константами CADESCOM_ENCODE в CADESCOM_ENCODING_TYPE

* Добавил класс с константами CAPICOM_STORE_OPEN_MODE

* Добавил метод получения информации о криптопровайдере и плагине

* Добавил метод проверки соответствия установленных версий криптопровайдера и плагина

* Исправил используемые в классе константы
  • Loading branch information
kernusr authored Nov 15, 2022
1 parent 612031c commit bdd545a
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 21 deletions.
14 changes: 7 additions & 7 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
/**
* Тип перечисления CADESCOM_ENCODING_TYPE указывает используемый тип кодирования.
*/
class CADESCOM_ENCODE
class CADESCOM_ENCODING_TYPE
{
/**
* Данные сохраняются в виде строки в кодировке Base64.
Expand Down
36 changes: 36 additions & 0 deletions src/Constants/CAPICOM_STORE_OPEN_MODE.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace Webmasterskaya\CryptoPro\Constants;

/**
* Тип перечисления CAPICOM_STORE_OPEN_MODE используется с методом \CPStore->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;

}
113 changes: 100 additions & 13 deletions src/CryptoPro.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
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;

Expand Down Expand Up @@ -54,7 +55,7 @@ public static function getAllUserCertificates(bool $resetCache = false)
{
$certificates = self::getCertificatesFromStore(
CADESCOM_STORE_LOCATION::CURRENT_USER_STORE,
self::CP_MY_STORE,
static::CP_MY_STORE,
false
);
}
Expand Down Expand Up @@ -98,7 +99,7 @@ public static function getAllContainerCertificates(bool $resetCache = false)
{
$certificates = self::getCertificatesFromStore(
CADESCOM_STORE_LOCATION::CONTAINER_STORE,
self::CP_MY_STORE,
static::CP_MY_STORE,
false
);
}
Expand Down Expand Up @@ -298,7 +299,7 @@ public static function createAttachedSignature(string $thumbprint, string $unenc
$cadesSigner,
CADESCOM_CADES_TYPE::PKCS7_TYPE,
false,
CADESCOM_ENCODE::BASE64
CADESCOM_ENCODING_TYPE::BASE64
);
}
catch (\Throwable $e)
Expand Down Expand Up @@ -362,7 +363,6 @@ public static function createDetachedSignature(string $thumbprint, string $messa
$cadesAuthAttrs->Add($cadesAttrs);

$cadesSigner->set_Options(CAPICOM_CERTIFICATE_INCLUDE_OPTION::WHOLE_CHAIN);

}
catch (\Throwable $e)
{
Expand All @@ -372,8 +372,10 @@ public static function createDetachedSignature(string $thumbprint, string $messa
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
Expand All @@ -391,7 +393,7 @@ public static function createDetachedSignature(string $thumbprint, string $messa
$cadesHashedData,
$cadesSigner,
CADESCOM_CADES_TYPE::PKCS7_TYPE,
CADESCOM_ENCODE::BASE64
CADESCOM_ENCODING_TYPE::BASE64
);
}
catch (\Throwable $e)
Expand Down Expand Up @@ -476,7 +478,7 @@ public static function addAttachedSignature(string $thumbprint, string $signedMe
$signature = $cadesSignedData->CoSignCades(
$cadesSigner,
CADESCOM_CADES_TYPE::PKCS7_TYPE,
CADESCOM_ENCODE::BASE64
CADESCOM_ENCODING_TYPE::BASE64
);
}
catch (\Throwable $e)
Expand Down Expand Up @@ -550,8 +552,10 @@ public static function addDetachedSignature(string $thumbprint, string $signedMe
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
Expand All @@ -574,7 +578,7 @@ public static function addDetachedSignature(string $thumbprint, string $signedMe
$cadesSigner,
$cadesHashedData,
CADESCOM_CADES_TYPE::PKCS7_TYPE,
CADESCOM_ENCODE::BASE64
CADESCOM_ENCODING_TYPE::BASE64
);
}
catch (\Throwable $e)
Expand Down Expand Up @@ -609,7 +613,7 @@ public static function createHash(string $unencryptedMessage)
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)
Expand All @@ -630,12 +634,95 @@ public static function createHash(string $unencryptedMessage)
}

/**
* возвращает информацию о 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;
}

/**
Expand Down Expand Up @@ -679,7 +766,7 @@ protected static function getCertificatesFromStore(int $storeLocation, string $s

try
{
$cadesStore->Open($storeLocation, $storeName, STORE_OPEN_MAXIMUM_ALLOWED);
$cadesStore->Open($storeLocation, $storeName, CAPICOM_STORE_OPEN_MODE::MAXIMUM_ALLOWED);
}
catch (\Throwable $e)
{
Expand Down Expand Up @@ -772,7 +859,7 @@ protected static function getCadesCertificateFromStore(string $thumbprint, int $

try
{
$cadesStore->Open($storeLocation, $storeName, STORE_OPEN_MAXIMUM_ALLOWED);
$cadesStore->Open($storeLocation, $storeName, CAPICOM_STORE_OPEN_MODE::MAXIMUM_ALLOWED);
}
catch (\Throwable $e)
{
Expand Down

0 comments on commit bdd545a

Please sign in to comment.