Пример создания и проверки отделенной подписи формата CAdES-BES по хэш-значению данных.
HTML
<script language="javascript" src="cadesplugin_api.js"></script>
Приведенный пример использует синхронную версию плагина. Также см. пример работы с асинхронными обьектами.
JavaScript
function GetCertificateBySubjectName(certSubjectName) { var oStore = cadesplugin.CreateObject("CAdESCOM.Store"); oStore.Open(cadesplugin.CAPICOM_CURRENT_USER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var oCertificates = oStore.Certificates.Find( cadesplugin.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, cadesplugin.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, cadesplugin.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 = cadesplugin.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"); } }