Процесс переделки библиотеки

This commit is contained in:
Artem Vasilev 2022-10-20 20:06:50 +03:00
parent aa94495fe7
commit 895acf2a85
16 changed files with 507 additions and 0 deletions

87
src/Certificate.php Executable file
View File

@ -0,0 +1,87 @@
<?php
namespace Webmasterskaya\CryptoPro;
class Certificate
{
/**
* возвращает флаг действительности сертификата
*
* @return void
*/
public function isValid()
{
}
/**
* возвращает указанное внутренее свойство у сертификата в формате Cades
*
* @return void
*/
public function getCadesProp()
{
}
/**
* возвращает сертификат в формате base64
*
* @return void
*/
public function exportBase64()
{
}
/**
* возвращает информацию об алгоритме сертификата
*
* @return void
*/
public function getAlgorithm()
{
}
/**
* возвращает расшифрованную информацию о владельце сертификата
*
* @return void
*/
public function getOwnerInfo()
{
}
/**
* возвращает расшифрованную информацию об издателе сертификата
*
* @return void
*/
public function getIssuerInfo()
{
}
/**
* возвращает ОИД'ы сертификата
*
* @return void
*/
public function getExtendedKeyUsage()
{
}
/**
* возвращает расшифрованные ОИД'ы
*
* @return void
*/
public function getDecodedExtendedKeyUsage()
{
}
/**
* проверяет наличие ОИД'а (ОИД'ов) у сертификата
*
* @return void
*/
public function hasExtendedKeyUsage()
{
}
}

View File

@ -4,5 +4,112 @@ namespace Webmasterskaya\CryptoPro;
class CryptoPro class CryptoPro
{ {
/**
* возвращает список сертификатов, доступных пользователю в системе
*
* @return void
*/
public static function getUserCertificates(bool $resetCache = false)
{
}
/**
* возвращает список сертификатов, доступных пользователю в системе, в том числе просроченные и без закрытого ключа
*
* @return void
*/
public static function getAllUserCertificates(bool $resetCache = false)
{
}
/**
* возвращает список сертификатов, из закрытых ключей и/или сертификаты не установленные всистеме*
*
* @return void
*/
public static function getContainerCertificates(bool $resetCache = false)
{
}
/**
* возвращает список сертификатов, из закрытых ключей и/или сертификаты не установленные всистеме*, в том числе просроченные и без закрытого ключа
*
* @return void
*/
public static function getAllContainerCertificates(bool $resetCache = false)
{
}
/**
* возвращает сертификат по отпечатку
*
* @return void
*/
public static function getCertificate()
{
}
/**
* создает совмещенную (присоединенную) подпись сообщения
*
* @return void
*/
public static function createAttachedSignature()
{
}
/**
* создает отсоединенную (открепленную) подпись сообщения
*
* @return void
*/
public static function createDetachedSignature()
{
}
/**
* добавляет совмещенную (присоединенную) подпись к раннее подписанному документу (реализует метод coSign)
*
* @return void
*/
public static function addAttachedSignature()
{
}
/**
* добавляет отсоединенную (открепленную) подпись к раннее подписанному документу (реализует метод coSign)
*
* @return void
*/
public static function addDetachedSignature()
{
}
/**
* создает XML подпись для документа в формате XML
*
* @return void
*/
public static function createXMLSignature()
{
}
/**
* создает хеш сообщения по ГОСТ Р 34.11-2012 256 бит
*
* @return void
*/
public static function createHash()
{
}
/**
* возвращает информацию о CSP и плагине
*
* @return void
*/
public static function getSystemInfo()
{
}
} }

View File

@ -0,0 +1,70 @@
<?php
namespace Webmasterskaya\CryptoPro\Helpers;
use Webmasterskaya\CryptoPro\Tags\TagsCodes;
use Webmasterskaya\CryptoPro\Tags\TagsOIDs;
use Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface;
class CertificateHelper
{
public static function parseCertInfo(TagsTranslationsInterface $tagsTranslations, string $rawInfo)
{
$extractedEntities = [];
preg_match_all('/([а-яА-Яa-zA-Z0-9\s.]+)=(?:("[^"]+?")|(.+?))(?:,|$)/', $rawInfo, $extractedEntities, PREG_SET_ORDER, 0);
if (!empty($extractedEntities))
{
return array_map(function ($extractedEntity) use ($tagsTranslations) {
$title = trim($extractedEntity[1]);
// Проверяем наличие OID в заголовке
$oidIdentifierMatch = [];
$oidIdentifier = null;
if (preg_match('/^OID\.(.*)/', $title, $oidIdentifierMatch) === 1)
{
$oidIdentifier = trim($oidIdentifierMatch[1]);
}
// Если нашли OID в заголовке, пытаемся его расшифровать
if (!empty($oidIdentifier))
{
$titleCode = TagsOIDs::codeByOid($oidIdentifier);
if (empty($titleCode))
{
$titleCode = 'OID.' . $oidIdentifier;
}
}
else
{
$titleCode = TagsCodes::codeByName($title);
if (empty($titleCode))
{
$titleCode = $title;
}
}
// Получаем человекочитаемый заголовок
$title = $tagsTranslations::translationByCode($titleCode);
// Вырезаем лишние кавычки
$description = preg_replace(
'/"{2}/g', '"',
preg_replace(
'/^"(.*)"/', "$1",
trim($extractedEntity[2] ?? $extractedEntity[3])
)
);
return ['title' => $title, 'description' => $description, 'code' => $titleCode];
}, $extractedEntities);
}
return [];
}
}

View File

@ -0,0 +1,8 @@
<?php
namespace Webmasterskaya\CryptoPro\Helpers\Messages;
class HumanReadableCPErrors
{
}

20
src/Tags/AbstractTagsCodes.php Executable file
View File

@ -0,0 +1,20 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
use Webmasterskaya\CryptoPro\Traits\ReversMapInterface;
use Webmasterskaya\CryptoPro\Traits\ReversMapTrait;
abstract class AbstractTagsCodes implements TagsCodesInterface, ReversMapInterface
{
protected const MAP = [];
use ReversMapTrait;
public static function codeByName($name)
{
$reverseMap = self::reverseMap();
return $reverseMap[strtolower($name)] ?? null;
}
}

25
src/Tags/AbstractTagsOIDs.php Executable file
View File

@ -0,0 +1,25 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
use Webmasterskaya\CryptoPro\Traits\ReversMapInterface;
use Webmasterskaya\CryptoPro\Traits\ReversMapTrait;
abstract class AbstractTagsOIDs implements TagsOIDsInterface, ReversMapInterface
{
protected const MAP = [];
use ReversMapTrait;
public static function codeByOid($oid)
{
return self::MAP[$oid] ?? null;
}
public static function oidByCode($code)
{
$reverseMap = self::reverseMap();
return $reverseMap[strtolower($code)] ?? null;
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
abstract class AbstractTagsTranslations implements TagsTranslationsInterface
{
protected const MAP = [];
public static function translationByCode($code)
{
return self::MAP[$code] ?? $code;
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
class IssuerTagsTranslations extends AbstractTagsTranslations
{
protected const MAP
= [
'UN' => 'Неструктурированное имя',
'CN' => 'Удостоверяющий центр',
'C' => 'Страна',
'S' => 'Регион',
'STREET' => 'Адрес',
'O' => 'Компания',
'OU' => 'Тип',
'T' => 'Должность',
'OGRN' => 'ОГРН',
'OGRNIP' => 'ОГРНИП',
'SNILS' => 'СНИЛС',
'INN' => 'ИНН',
'INNLE' => 'ИНН рганизации',
'E' => 'Email',
'L' => 'Город',
];
}

View File

@ -0,0 +1,27 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
class SubjectTagsTranslations extends AbstractTagsTranslations
{
protected const MAP
= [
'UN' => 'Неструктурированное имя',
'CN' => 'Владелец',
'SN' => 'Фамилия',
'G' => 'Имя Отчество',
'C' => 'Страна',
'S' => 'Регион',
'STREET' => 'Адрес',
'O' => 'Компания',
'OU' => 'Отдел/подразделение',
'T' => 'Должность',
'OGRN' => 'ОГРН',
'OGRNIP' => 'ОГРНИП',
'SNILS' => 'СНИЛС',
'INN' => 'ИНН',
'INNLE' => 'ИНН рганизации',
'E' => 'Email',
'L' => 'Город',
];
}

27
src/Tags/TagsCodes.php Executable file
View File

@ -0,0 +1,27 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
class TagsCodes extends AbstractTagsCodes
{
protected const MAP
= [
'UN' => ['UN', 'unstructuredName'],
'CN' => ['CN', 'commonName'],
'SN' => ['SN', 'surname'],
'G' => ['G', 'givenName', 'gn'],
'C' => ['C', 'countryName'],
'S' => ['S', 'ST', 'stateOrProvinceName'],
'STREET' => ['STREET', 'streetAddress'],
'O' => ['O', 'organizationName'],
'OU' => ['OU', 'organizationalUnitName'],
'T' => ['T', 'TITLE'],
'OGRN' => ['OGRN', 'ОГРН'],
'OGRNIP' => ['OGRNIP', 'ОГРНИП'],
'SNILS' => ['СНИЛС', 'SNILS'],
'INN' => ['ИНН', 'ИННФЛ', 'ИНН ФЛ', 'INN'],
'INNLE' => ['ИННЮЛ', 'ИНН ЮЛ', 'INNLE', 'INN LE', 'ИНН организации'],
'E' => ['E', 'email', 'emailAddress', 'pkcs9email'],
'L' => ['L', 'localityName'],
];
}

View File

@ -0,0 +1,8 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
interface TagsCodesInterface
{
public static function codeByName($name);
}

27
src/Tags/TagsOIDs.php Executable file
View File

@ -0,0 +1,27 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
class TagsOIDs extends AbstractTagsOIDs
{
protected const MAP
= [
'1.2.840.113549.1.9.2' => 'UN',
'2.5.4.3' => 'CN',
'2.5.4.4' => 'SN',
'2.5.4.42' => 'G',
'2.5.4.6' => 'C',
'2.5.4.8' => 'S',
'2.5.4.9' => 'STREET',
'2.5.4.10' => 'O',
'2.5.4.11' => 'OU',
'2.5.4.12' => 'T',
'1.2.643.100.1' => 'OGRN',
'1.2.643.100.5' => 'OGRNIP',
'1.2.643.100.3' => 'SNILS',
'1.2.643.3.131.1.1' => 'INN',
'1.2.643.100.4' => 'INNLE',
'1.2.840.113549.1.9.1' => 'E',
'2.5.4.7' => 'L',
];
}

10
src/Tags/TagsOIDsInterface.php Executable file
View File

@ -0,0 +1,10 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
interface TagsOIDsInterface
{
public static function codeByOid($oid);
public static function oidByCode($code);
}

View File

@ -0,0 +1,8 @@
<?php
namespace Webmasterskaya\CryptoPro\Tags;
interface TagsTranslationsInterface
{
public static function translationByCode($code);
}

View File

@ -0,0 +1,8 @@
<?php
namespace Webmasterskaya\CryptoPro\Traits;
interface ReversMapInterface
{
public static function reverseMap();
}

37
src/Traits/ReversMapTrait.php Executable file
View File

@ -0,0 +1,37 @@
<?php
namespace Webmasterskaya\CryptoPro\Traits;
trait ReversMapTrait
{
public static function reverseMap()
{
static $reverseMap;
if (!isset($reverseMap))
{
$reverseMap = [];
foreach (self::MAP as $key => $values)
{
if (is_object($values))
{
$values = (array) $values;
}
if (!is_array($values))
{
$reverseMap[strtolower((string) $values)] = $key;
}
else
{
foreach ($values as $value)
{
$reverseMap[strtolower($value)] = $key;
}
}
}
}
return $reverseMap;
}
}