Будет ли этот код цифровой подписи работать с квалифицированным цифровым сертификатом? - PullRequest
0 голосов
/ 20 апреля 2020

Меня недавно спросили, будет ли наш существующий код подписи работать с Европейским квалифицированным цифровым сертификатом вместо сертификата подписи RSA, который мы обычно используем. Насколько я могу сказать, это должно быть, но я не нашел ничего, что действительно подтвердило бы эту теорию.

Если не считать, как получить квалифицированный сертификат и действительно проверить его, я не уверен, как это сделать. ответить на этот вопрос окончательно. У кого-нибудь есть опыт с этим?

Код, указанный ниже, показан ниже. Это приложение на C ++, основанное на Windows и использующее для подписи API-интерфейс Cryptographi c от Microsoft.

int SignData(
    const std::string &data,        // Data to be signed
    const char *containerName,      // Name of key container to use
    std::string &signature)         // Returns the signature
{
    HCRYPTPROV hProv = NULL;
    HCRYPTHASH hHash = NULL;
    HCRYPTKEY hKey = NULL;
    DWORD dwLength;
    int status = 0;

    // Attempt to open the key container as a LocalMachine key.
    if (CryptAcquireContext(
        &hProv,
        containerName,
        NULL,
        PROV_RSA_FULL,
        CRYPT_MACHINE_KEYSET | CRYPT_SILENT))
    {
        // Create a SHA-1 hash context.
        if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
        {
            // Calculate hash of the buffer.
            if (CryptHashData(hHash, (const BYTE *)data.data(), (DWORD)data.size(), 0))
            {
                // Determine the size of the signature and allocate memory.
                if (CryptSignHash(hHash, AT_SIGNATURE, 0, 0, NULL, &dwLength))
                {
                    signature.resize(dwLength);

                    // Sign the hash object.
                    if (!CryptSignHash(hHash, AT_SIGNATURE, 0, 0, (BYTE*)&signature[0], &dwLength))
                        status = HandleCryptError("CryptSignHash failed");
                }
                else
                    status = HandleCryptError("CryptSignHash failed");
            }
            else
                status = HandleCryptError("CryptHashData failed");
        }
        else
            status = HandleCryptError("CryptCreateHash failed");
    }
    else
        status = HandleCryptError("CryptAcquireContext failed");

    return status;
}
...