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

Вычисление подписи по хэш-значению

Пример работы с объектами CAdESCOM.RawSignature и CAdESCOM.HashedData

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

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

JavaScript
    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);

        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.RawSignature
        var oRawSignature = cadesplugin.CreateObject("CAdESCOM.RawSignature");

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

        return sRawSignature;
    }

    function VerifySignature(oHashedData, oCertificate, sRawSignature) {
        // Создаем объект CAdESCOM.RawSignature
        var oRawSignature = cadesplugin.CreateObject("CAdESCOM.RawSignature");

        // Проверяем подпись
        try {
            oRawSignature.VerifyHash(oHashedData, oCertificate, sRawSignature);
        } 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);

        // Вычисляем подпись
        var sRawSignature = CreateSignature(oCertificate, oHashedData);

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

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