Skip to content

Commit

Permalink
bug(cryptopro-cades): Некорректно устанавливается флаг hasPrivateKey …
Browse files Browse the repository at this point in the history
…при пропуске поиска закрытого ключа сертификата. (#49)

* bug(cryptopro-cades): Поправил корректное определение наличия контейнера закрытого ключа в системе.
feat(cryptopro-cades): Добавил необязательные параметры функциям получения списка сертификатов, подписи, подписи хэша файла для гибкости работы с ними.

* bug(cryptopro-cades): Поиск ключа по Skid всегда вызывал поиск по всем носителям с проверкой закрытого ключа, даже если не требуется. Добавил параметры вызова функции поиска сертификата для гибкости.

* bug(cryptopro-cades): Некорректно устанавливается флаг hasPrivateKey при пропуске поиска закрытого ключа сертификата.

---------

Co-authored-by: va4es2 <[email protected]>
  • Loading branch information
va4es2 and va4es2 authored May 2, 2024
1 parent 99558e3 commit 7d19701
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 23 deletions.
38 changes: 18 additions & 20 deletions packages/cryptopro-cades/src/Certificate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,27 +171,25 @@ export class Certificate {
cert.Export(CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64),
);

if (checkPrivateKey) {
try {
certificate.hasPrivateKey = await unwrap(cert.HasPrivateKey());

const oPrivateKey = await unwrap(cert.PrivateKey);

certificate.providerName = await unwrap(oPrivateKey.ProviderName);
certificate.providerType = await unwrap(oPrivateKey.ProviderType);

if (certificate.hasPrivateKey) {
await unwrap(cert.FindPrivateKey());
}
} catch (error) {
// ошибка не критична, просто создаем ошибку (в дебаге оно залогируется само)
CryptoError.createCadesError(
error,
`Ошибка получения информации о приватном ключе сертификата ${certificate.thumbprint}.`,
);

certificate.hasPrivateKey = false;
try {
certificate.hasPrivateKey = await unwrap(cert.HasPrivateKey());

const oPrivateKey = await unwrap(cert.PrivateKey);

certificate.providerName = await unwrap(oPrivateKey.ProviderName);
certificate.providerType = await unwrap(oPrivateKey.ProviderType);

if (checkPrivateKey && certificate.hasPrivateKey) {
await unwrap(cert.FindPrivateKey());
}
} catch (error) {
// ошибка не критична, просто создаем ошибку (в дебаге оно залогируется само)
CryptoError.createCadesError(
error,
`Ошибка получения информации о приватном ключе сертификата ${certificate.thumbprint}.`,
);

certificate.hasPrivateKey = false;
}

parseCertificate(certificate);
Expand Down
4 changes: 2 additions & 2 deletions packages/cryptopro-cades/src/api/findCertificateBySkid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import { getCertificates } from './../api';
* Поиск в хранилищах сертификата.
* @param {string} subjectKeyId -идентификатор ключа субъекта.
* @param {STORE_TYPE} storeType в каком хранилище требуется поискать сертификат (из токена, реестра, все...).
* @param {boolean} [checkPrivateKey=false] проводить проверку наличия закрытого ключа.
* @param {boolean} [checkPrivateKey=true] проводить проверку наличия закрытого ключа.
* @throws {CryptoError} в случае ошибки.
* @returns {@Promise<Certificate | undefined>} сертификат.
*/
export async function findCertificateBySkid(
subjectKeyId: string,
storeType: STORE_TYPE = STORE_TYPE.ALL,
checkPrivateKey: boolean = false,
checkPrivateKey: boolean = true,
): Promise<Certificate | undefined> {
if (!subjectKeyId) {
const errorMessage =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import { unwrap } from './internal/unwrap';
/**
* Поиск в хранилищах сертификата.
* @param {string} thumbprint -отпечаток искомого сертификата.
* @param {boolean} [checkPrivateKey=true] проводить проверку наличия закрытого ключа.
* @throws {CryptoError} в случае ошибки.
* @returns {Promise<Certificate | undefined>} сертификат.
*/
export async function findCertificateByThumbprint(
thumbprint: string,
checkPrivateKey: boolean = true,
): Promise<Certificate | undefined> {
if (!thumbprint) {
const errorMessage = 'Не указан отпечаток искомого сертификата.';
Expand All @@ -35,7 +37,7 @@ export async function findCertificateByThumbprint(
);
const cert = await unwrap(certFind.Item(1));

return cert ? await Certificate.CreateFrom(cert) : undefined;
return cert ? await Certificate.CreateFrom(cert, checkPrivateKey) : undefined;
} catch (err) {
throw CryptoError.createCadesError(err, 'Ошибка получения сертификата.');
} finally {
Expand Down

0 comments on commit 7d19701

Please sign in to comment.