diff --git a/src/AbstractAlgorithmInfo.php b/src/AbstractAlgorithmInfo.php new file mode 100755 index 0000000..45976e5 --- /dev/null +++ b/src/AbstractAlgorithmInfo.php @@ -0,0 +1,34 @@ +algorithm = $algorithm; + $this->oid = $oid; + } + + /** + * @param $name + * + * @return string|void + */ + public function __get($name) + { + switch ($name) + { + case 'algorithm': + case 'oid': + return $this->{$name}; + } + } +} \ No newline at end of file diff --git a/src/AlgorithmInfoInterface.php b/src/AlgorithmInfoInterface.php new file mode 100755 index 0000000..3561204 --- /dev/null +++ b/src/AlgorithmInfoInterface.php @@ -0,0 +1,8 @@ +_cadesCertificate->IsValid(); + $isValid = (bool) $isValid->get_Result(); + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при проверке сертификата')); + } + + return $isValid; } /** * возвращает указанное внутренее свойство у сертификата в формате Cades * - * @return void + * @param string $propName наименование свойства + * + * @throws \Exception + * @return mixed */ - public function getCadesProp() + public function getCadesProp(string $propName) { + try + { + if (method_exists($this->_cadesCertificate, 'get_' . $propName)) + { + $propertyValue = call_user_func([$this->_cadesCertificate, 'get_' . $propName]); + } + else + { + throw new \Exception(); + } + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при обращении к свойству сертификата')); + } + + return $propertyValue; } /** @@ -62,54 +102,160 @@ class Certificate /** * возвращает информацию об алгоритме сертификата * - * @return void + * @throws \Exception + * @return AlgorithmInfoInterface */ public function getAlgorithm() { + try + { + $cadesPublicKey = $this->_cadesCertificate->PublicKey(); + $cadesPublicKeyAlgorithm = $cadesPublicKey->get_Algorithm(); + $algorithmInfo = new class( + $cadesPublicKeyAlgorithm->get_FriendlyName(), + $cadesPublicKeyAlgorithm->get_Value()) extends AbstractAlgorithmInfo { + }; + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при получении алгоритма')); + } + + return $algorithmInfo; } /** * возвращает расшифрованную информацию о владельце сертификата * - * @return void + * @throws \Exception + * @return array|array[] */ public function getOwnerInfo() { + return $this->getInfo(SubjectTagsTranslations::class, 'SubjectName'); + } + + /** + * @param string $tags + * @param string $entitiesPath + * + * @throws \Exception + * @return array|array[] + */ + protected function getInfo(string $tags, string $entitiesPath) + { + if (!is_subclass_of($tags, TagsTranslationsInterface::class)) + { + throw new \TypeError( + sprintf( + 'Argument 1 passed to %s::getInfo() must be an instance of \Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface, instance of %s given.', + get_called_class(), $tags + ) + ); + } + + { + try + { + $entities = $this->getCadesProp($entitiesPath); + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при извлечении информации из сертификата')); + } + } + + return CertificateHelper::parseCertInfo($tags, $entities); } /** * возвращает расшифрованную информацию об издателе сертификата * - * @return void + * @throws \Exception + * @return array|array[] */ public function getIssuerInfo() { + return $this->getInfo(IssuerTagsTranslations::class, 'IssuerName'); } /** * возвращает ОИД'ы сертификата * - * @return void + * @return array */ public function getExtendedKeyUsage() { + $OIDs = []; + + try + { + $cadesExtendedKeysUsage = $this->_cadesCertificate->ExtendedKeyUsage(); + $cadesExtendedKeysUsage = $cadesExtendedKeysUsage->get_EKUs(); + $cadesExtendedKeysUsageCount = $cadesExtendedKeysUsage->get_Count(); + + if ($cadesExtendedKeysUsageCount > 0) + { + while ($cadesExtendedKeysUsageCount) + { + $cadesExtendedKeyUsage = $cadesExtendedKeysUsage->get_Item($cadesExtendedKeysUsageCount); + $OIDs[] = $cadesExtendedKeyUsage->get_OID(); + + $cadesExtendedKeysUsageCount--; + } + } + } + catch (\Throwable $e) + { + throw new \Exception(ErrorMessageHelper::getErrorMessage($e, "Ошибка при получении ОИД'ов")); + } + + return $OIDs; } /** * возвращает расшифрованные ОИД'ы * - * @return void + * @return array */ public function getDecodedExtendedKeyUsage() { + $certOIDs = $this->getExtendedKeyUsage(); + + $decodedOIDs = []; + + foreach ($certOIDs as $OID) + { + $decodedOIDs[$OID] = OIDsDictionary::MAP[$OID] ?? null; + } + + return $decodedOIDs; } /** * проверяет наличие ОИД'а (ОИД'ов) у сертификата * - * @return void + * @param string|array $OIDs + * + * @throws \Exception + * @return bool */ - public function hasExtendedKeyUsage() + public function hasExtendedKeyUsage($OIDs) { + $certOIDs = $this->getExtendedKeyUsage(); + + if (is_string($OIDs)) + { + $OIDs = [$OIDs]; + } + + if (!is_array($OIDs)) + { + $OIDs = (array) $OIDs; + } + + return ArrayHelper::every($OIDs, function ($oidToCheck) use ($certOIDs) { + return in_array($oidToCheck, $certOIDs); + }); } } \ No newline at end of file diff --git a/src/Constants/OIDsDictionary.php b/src/Constants/OIDsDictionary.php new file mode 100755 index 0000000..7317067 --- /dev/null +++ b/src/Constants/OIDsDictionary.php @@ -0,0 +1,62 @@ + 'Пользователь Центра Регистрации', + '1.2.643.2.39.1.1' => 'Использование в программных продуктах системы "1С:Предприятие 8"', + '1.2.643.3.131.1.1' => 'ИНН', + '1.2.643.3.141.1.1' => 'РНС ФСС', + '1.2.643.3.141.1.2' => 'КП ФСС', + '1.2.643.3.2.100.65.13.11' => 'Использование в системе АИС "Госзакупки" Сахалинской области.', + '1.2.643.3.8.100.1' => 'Сертификат типа "ekey-ГОСТ"', + '1.2.643.3.8.100.1.1' => 'Общее использование в системах ИОК без права заверения финансовых документов', + '1.2.643.3.8.100.1.10' => + 'Для участия в электронных торгах и подписания государственного контракта в информационных системах Тендерного комитета города Москвы уполномоченными лицами участников размещения государственного заказа города Москвы', + '1.2.643.3.8.100.1.11' => + 'Подписание электронных документов в автоматизированной информационной системе размещения государственного и муниципального заказа Саратовской области', + '1.2.643.3.8.100.1.12' => 'Использование в системе государственного заказа Иркутской области', + '1.2.643.3.8.100.1.13' => + 'Использование в электронной торговой площадке агентства государственного заказа Красноярского края', + '1.2.643.3.8.100.1.14' => 'Использование в электронной торговой площадке "Тендер"', + '1.2.643.3.8.100.1.2' => 'Передача отчетности по ТКС', + '1.2.643.3.8.100.1.3' => 'Оформление взаимных обязательств, соглашений, договоров, актов и т.п.', + '1.2.643.3.8.100.1.4' => 'Внутрикорпоративный документооборот', + '1.2.643.3.8.100.1.5' => 'Использование в системах электронной торговли', + '1.2.643.3.8.100.1.6' => 'Использование в торгово-закупочной системе "ЭЛЕКТРА"', + '1.2.643.3.8.100.1.7' => 'Использование в системе Портал государственных закупок Ставропольского края.', + '1.2.643.3.8.100.1.8' => 'Использование в Единой системе электронной торговли B2B-Center и B2G.', + '1.2.643.3.8.100.1.9' => + 'Для участия в электронных торгах и подписания государственного контракта в электронной площадке ОАО «ЕЭТП» уполномоченными лицами участников размещения государственного или муниципального заказа', + '1.2.643.5.1.24.2.1.3' => + 'Формирование документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости со стороны заявителя', + '1.2.643.5.1.24.2.1.3.1' => + 'Формирование кадастровым инженером документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости со стороны заявителя', + '1.2.643.5.1.24.2.2.2' => 'Формирование документов как результата оказания услуги со стороны органов регистрации прав', + '1.2.643.5.1.24.2.2.3' => + 'Формирование документов для получения государственных услуг в сфере государственной регистрации прав на недвижимое имущество и сделок с ним со стороны заявителя', + '1.2.643.6.2.1.7.1' => + 'Использование единоличным исполнительным органом юридического лица или уполномоченными представителями юридического лица в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских и иных прав и обязанностей в сфере негосударственного пенсионного обеспечения, негосударственного пенсионного страхования, в сфере деятельности паевых инвестиционных фондов, акционерных инвестиционных фондов, профессиональных участников рынка ценных бумаг, а также связанной с обслуживанием указанной деятельности услуг кредитных и иных организаций', + '1.2.643.6.2.1.7.2' => + 'Использование физическим лицом в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских прав и обязанностей в отношении инвестиционных паев паевых инвестиционных фондов, в том числе отношения, связанные с учетом и/или фиксацией прав на инвестиционные паи паевых инвестиционных фондов', + '1.2.643.6.3' => + 'Использование в электронных торговых системах и в программном обеспечении, связанным с обменом электронных сообщений', + '1.2.643.6.3.1.1' => 'Использование на электронных площадок отобранных для проведения аукционах в электронной форме', + '1.2.643.6.3.1.2.1' => 'Тип участника - Юридическое лицо', + '1.2.643.6.3.1.2.2' => 'Тип участника - Физическое лицо', + '1.2.643.6.3.1.2.3' => 'Тип участника - Индивидуальный предприниматель', + '1.2.643.6.3.1.3.1' => 'Участник размещения заказа', + '1.2.643.6.3.1.4.1' => 'Администратор организации', + '1.2.643.6.3.1.4.2' => 'Уполномоченный специалист', + '1.2.643.6.3.1.4.3' => 'Специалист с правом подписи контракта', + '1.2.840.113549.1.9.2' => 'Неструктурированное имя', + '1.3.6.1.4.1.24138.1.1.8.1' => 'Обеспечение юридической значимости в Системе "Электронная Торговая Площадка"', + '1.3.6.1.4.1.29919.21' => 'Использование в системе Портал государственных закупок Ростовской области "Рефери".', + '1.3.6.1.5.5.7.3.2' => 'Проверка подлинности клиента', + '1.3.6.1.5.5.7.3.4' => 'Защищенная электронная почта', + '1.3.643.3.8.100.15' => 'Использование в ЭТП "uTender"', + ]; +} \ No newline at end of file diff --git a/src/Helpers/ArrayHelper.php b/src/Helpers/ArrayHelper.php new file mode 100755 index 0000000..d4d4a51 --- /dev/null +++ b/src/Helpers/ArrayHelper.php @@ -0,0 +1,32 @@ +