Хм... Спасибо,
Slavik17, я бы и не подумал... Казалось, что все сложнее должно быть...
Теперь,
Цитата:var HashedData = ObjCreator("CAdESCOM.HashedData");
HashedData.Hash("");
var str = HashedData.Value;
var strHash = "";
var b;
var s = new Array(str.length);
for (var i=0; i<str.length; i+=1) {
switch (str.substr(i, 1)) {
case 'A':
b=10;
break;
case 'B':
b=11;
break;
case 'C':
b=12;
break;
case 'D':
b=13;
break;
case 'E':
b=14;
break;
case 'F':
b=15;
break;
default :
b=str.substr(i, 1);
}
s=b;
}
for (var i=0; i<s.length; i+=2) {
b = s*16+parseInt(s[i+1]);
strHash += String.fromCharCode(b);
}
var base64Hash = JSZipBase64.encode(strHash);
window.alert("base64Hash: "+base64Hash);
выводится коорректный результат для пустой строки (я надеюсь, что это действительно корректно):
Цитата:base64Hash: mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=
Однако с фрагментом XML что я привел так гладко не вышло...
Когда я его привел к каноническому виду, если конечно не ошибся:
Код:<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod><Reference URI="#body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>JJDTZ3V8kaKUx2rP8LeYTyh4zAO7MdGyT677Qhdv3HQ=</DigestValue></Reference></SignedInfo>
Получаю
Цитата:MzA4MDMwQ0Q1NjVCRTU5OTE2NUIxRDhCMzI2NDQ0RkU5RTAyMkM2RDNCNDVFMDEyMzFCMDE2NjY2RTEyMUM5RA==
и (используя Ваш,
Slavik17, совет)
Цитата:MMKAMMONVlvDpcKZFlsdwosyZETDvsKeAixtO0XDoBIxwrAWZm4SHMKd
в то время как должно получиться
Цитата:49RkjMMIYfJq1zWFjZi0oxpt2xaK+Ky5Zcqrf4W86XBGgHTOmYUrc1cfYjSwoWuyC7tTTGnBjHQ0mkLA383r6A==
Как я так понимаю, алгоритм
ГОСТ Р 34.11-2001 которым нужно рассчитать электронную подпись не есть кеш по алгоритму
ГОСТ Р 34.11-94...
Значит я ошибаюсь когда пытаюсь рассчитать
SignatureValue используя
CAdESCOM.HashedData...
Но что тогда использовать ?
Не
CAdESCOM.CPSigner же, который, вроде бы, применяется к
Body для получения
BinarySecurityToken , то есть получения сертификата (подписи данных, или как оно в терминологии СМЭВ называется)...
А
CAdESCOM.HashedData, как теперь стало ясно, то же применяется к [i]Body , для получения [i]DigestValue (что сейчас проверяю на практике, еще с канонизаций (Canonicalization) xml нужно разобраться)...
Есть предположение, что нужно смотреть в сторону
CAdESCOM.RawSignature, однако в документации эта страница не открывается и методом научного тыка с этим классом разобраться пока не получается...
Или, как вы, Slavik17, заметили, этот объект не работает и следует использовать что-то другое ?
Примеры, у меня так же не вышло, поэтому надеюсь кто-нибудь подскажет как рассчитать подпись по
ГОСТ Р 34.11-2001...
Отредактировано пользователем 2 апреля 2013 г. 15:34:07(UTC)
| Причина: дополнение вопроса