Развернуть все
Свернуть все

Создание и проверка отделенной подписи по хэш-значению данных

Пример создания и проверки отделенной подписи формата CAdES-BES по хэш-значению данных.

HTML
<script language="javascript" src="cadesplugin_api.js"></script>

Приведенный пример использует синхронную версию плагина. Также см. пример работы с асинхронными обьектами.

JavaScript
    var CADESCOM_CADES_BES = 1;
    var CAPICOM_CURRENT_USER_STORE = 2;
    var CAPICOM_MY_STORE = "My";
    var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
    var CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
    var CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100;


    function GetCertificateBySubjectName(certSubjectName) {
        var oStore = cadesplugin.CreateObject("CAdESCOM.Store");
        oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
            CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

        var oCertificates = oStore.Certificates.Find(
            CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
        if (oCertificates.Count == 0) {
            alert("Certificate not found: " + certSubjectName);
            return;
        }
        var oCertificate = oCertificates.Item(1);
        oStore.Close();
        return oCertificate;
    }

    function InitializeHashedData(hashAlg, sHashValue) {
        // Создаем объект CAdESCOM.HashedData
        var oHashedData = cadesplugin.CreateObject("CAdESCOM.HashedData");

        // Инициализируем объект заранее вычисленным хэш-значением
        // Алгоритм хэширования нужно указать до того, как будет передано хэш-значение
        oHashedData.Algorithm = hashAlg;
        oHashedData.SetHashValue(sHashValue);

        return oHashedData;
    }

    function CreateSignature(oCertificate, oHashedData) {

        // Создаем объект CAdESCOM.CPSigner
        var oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
        oSigner.Certificate = oCertificate;
        oSigner.CheckCertificate = true;

        // Создаем объект CAdESCOM.CadesSignedData
        var oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");

        var sSignedMessage = "";

        // Вычисляем значение подписи
        try {
            sSignedMessage = oSignedData.SignHash(oHashedData, oSigner, CADESCOM_CADES_BES);
        } catch (err) {
            alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
            return;
        }

        return sSignedMessage;
    }

    function VerifySignature(oHashedData, sSignedMessage) {
        // Создаем объект CAdESCOM.CadesSignedData
        var oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");

        // Проверяем подпись
        try {
            oSignedData.VerifyHash(oHashedData, sSignedMessage, CADESCOM_CADES_BES);
        } catch (err) {
            alert("Failed to verify signature. Error: " + cadesplugin.getLastError(err));
            return false;
        }

        return true;
    }

    function run() {
        var oCertName = document.getElementById("CertName");
        var sCertName = oCertName.value; // Здесь следует заполнить SubjectName сертификата
        if ("" == sCertName) {
            alert("Введите имя сертификата (CN).");
            return;
        }
        // Ищем сертификат для подписи
        var oCertificate = GetCertificateBySubjectName(sCertName);

        // Предварительно вычисленное хэш-значение исходных данных
        // Хэш-значение должно быть представлено в виде строки шестнадцатеричных цифр,
        // группами по 2 цифры на байт, с пробелами или без пробелов.
        // Например, хэш-значение в таком формате возвращают объекты
        // CAPICOM.HashedData и CADESCOM.HashedData.
        var sHashValue = "92CD0CB36B10BFB88DEF198F80B7D2E667DBDA064D346405C25EEF77FFE375D7";

        // Алгоритм хэширования, при помощи которого было вычислено хэш-значение
        // Полный список поддерживаемых алгоритмов указан в перечислении CADESCOM_HASH_ALGORITHM
        var hashAlg = CADESCOM_HASH_ALGORITHM_CP_GOST_3411; // ГОСТ Р 34.11-94

        // Создаем объект CAdESCOM.HashedData
        var oHashedData = InitializeHashedData(hashAlg, sHashValue);

        // Создаем подписанное сообщение
        // Такая подпись должна проверяться в КриптоАРМ и cryptcp.exe
        var sSignedMessage = CreateSignature(oCertificate, oHashedData);

        document.getElementById("signature").innerHTML = sSignedMessage;

        var verifyResult = VerifySignature(oHashedData, sSignedMessage);
        if (verifyResult) {
            alert("Signature verified");
        }
    }