Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

8 Страницы<1234>»
Опции
К последнему сообщению К первому непрочитанному
Offline slavw  
#11 Оставлено : 10 февраля 2015 г. 13:24:38(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
ну и сама функция GetHashStream().. больше мне пока добавить нечего...

procedure GetHashStream(Container: WideString; DataStream: TStream; CertStream, KeyStream, HashStream, SignStream: TStream);
var
hProv: HCRYPTPROV;
DataLen: DWORD;
hHash: HCRYPTHASH;
hKey: HCRYPTKEY;
dwKeySpec: DWORD;
InStream, OutStream: TBytesStream;
begin
dwKeySpec:=AT_KEYEXCHANGE; //AT_SIGNATURE
InStream:=TBytesStream.Create;
OutStream:=TBytesStream.Create;
try

CopyStream(DataStream,InStream);

CryptCheck(CryptAcquireContext(@hProv, @Container[1], nil, PROV_GOST_2001_DH, 0), 'CryptAcquireContext');
try

if (CertStream<>nil) or (KeyStream<>nil) then
begin

CryptCheck(CryptGetUserKey(hProv, dwKeySpec, @hKey), 'CryptGetUserKey');
try

//получение сертификата

if CertStream<>nil then
begin
CryptCheck(CryptGetKeyParam(hKey, KP_CERTIFICATE, nil, @DataLen, 0), 'CryptGetKeyParam');
OutStream.Size:=DataLen;
CryptCheck(CryptGetKeyParam(hKey, KP_CERTIFICATE, OutStream.Memory, @DataLen, 0), 'CryptGetKeyParam');
CopyStream(OutStream,CertStream);
end;

//получение открытого ключа

if KeyStream<>nil then
begin
CryptCheck(CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, nil, @DataLen), 'CryptExportKey');
OutStream.Size:=DataLen;
CryptCheck(CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, OutStream.Memory, @DataLen), 'CryptExportKey');
CopyStream(OutStream,KeyStream);
end;

finally
CryptCheck(CryptDestroyKey(hKey),'CryptDestroyKey');
end;

end;

if (HashStream<>nil) or (SignStream<>nil) then
begin

CryptCheck(CryptCreateHash(hProv, CALG_GR3411, 0, 0, @hHash), 'CryptCreateHash');
try

CryptCheck(CryptHashData(hHash, InStream.Memory, InStream.Size, 0), 'CryptHashData');

//получение хеша

if HashStream<>nil then
begin
CryptCheck(CryptGetHashParam(hHash, HP_HASHVAL, nil, @DataLen, 0), 'CryptGetHashParam');
OutStream.Size:=DataLen;
CryptCheck(CryptGetHashParam(hHash, HP_HASHVAL, OutStream.Memory, @DataLen, 0), 'CryptGetHashParam');
CopyStream(OutStream,HashStream);
end;

//подпись хеша

if SignStream<>nil then
begin
CryptCheck(CryptSignHash(hHash, dwKeySpec, nil, 0, nil, @DataLen), 'CryptSignHash');
OutStream.Size:=DataLen;
CryptCheck(CryptSignHash(hHash, dwKeySpec, nil, 0, OutStream.Memory, @DataLen), 'CryptSignHash');
CopyStream(OutStream,SignStream,True); //с обязательным переворачиванием
end;

finally
CryptCheck(CryptDestroyHash(hHash), 'CryptDestroyHash');
end;

end;

finally
CryptCheck(CryptReleaseContext(hProv, 0), 'CryptReleaseContext');
end;

finally
InStream.Free;
OutStream.Free;
end;

end;
thanks 2 пользователей поблагодарили slavw за этот пост.
MCR оставлено 11.02.2015(UTC), vgs оставлено 20.03.2015(UTC)
Offline slavw  
#12 Оставлено : 11 февраля 2015 г. 11:30:04(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
замечание: Если одно канонизированное XML1 вставить в другое канонизированное XML2, то XML2(XML1) уже может перестать быть канонизированным (зависит от содержания XML1).
thanks 1 пользователь поблагодарил slavw за этот пост.
MCR оставлено 11.02.2015(UTC)
Offline smev  
#13 Оставлено : 20 февраля 2015 г. 6:10:21(UTC)
smev

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Владивосток

Всем привет

Пытался я прогонять XML файл через утилтку мистера "slavw".
Заноняю туда тег soapenv:Body со всеми его элементами в программку.
Получаю канонизированный вид документа.
Этот какнонизированный документ пишу в файл в кодировке UTF 8
Загружаю этот файлик и вычисляю Hash

Hash не соответствует тому что написано в запросе тега ds:DigestValue.
Запрос прилагаю к сообщению.

Функция расчета Hash правильная и проверялась на пустом занчении. Все правильно работает, нареканий нет!

Скажите еще варианты как мне "победить" эту канонизацию СМЭВ.
Бьюсь уже неделю Brick wall
Вложение(я):
smev.xml (6kb) загружен 38 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline slavw  
#14 Оставлено : 20 февраля 2015 г. 7:54:11(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
я две недели бился.. мы поймем друг друга...
скопировал из файла блок <soapenv:Body>.....</soapenv:Body> и проверил программой c14n
сразу ругается на неизвестный "soapenv"
блок <Body> должен быть самодостаточный, все используемые пространства имен должны быть объявлены внутри него...
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" должно быть в <soapenv:Body>
вот так:
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SigID-55585b9a-fb5f-1e11-3f4e">

больше замечаний нет... остальное в порядке... еще посмотрите чем оканчиваются строки у вас #13#10 или #10 ?
попробуйте совсем убрать все отступы слева и переносы строк... если получится, то уже потом можете сделать "красивый" xml с отступами и переносами...

если не получится... давайте тогда уже новый файл, если в нем ошибок с каноникализацией не будет, я вычислю хэш вашего нового <Body> и сверим....

ps: не убирайте xmlns:soapenv= из <soapenv:Envelope> оно должно быть объявлено и там и в <Body>... пусть это вас не смущает...

Отредактировано пользователем 20 февраля 2015 г. 7:57:32(UTC)  | Причина: Не указана

Offline smev  
#15 Оставлено : 20 февраля 2015 г. 10:03:03(UTC)
smev

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Владивосток

Спасибо за ответ

да я заметил что в тег <soapenv:Body> надо добавить xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
я добавлял это и отправлял на вашу утилиту.
после получал канинизированный текст и на вычисление хеш

а вы можете попробовать рассчитать хеш, я вам пришлю файлы

smev.xml - исходный полный запрос там вся информация
smevbody.xml - полученный тег </soapenv:Body> (символы 0D 0A там присутствуют)
потом берем текст файлика smevbody.xml и подаем на твою утилитку
получаем файлик smevtemp.xml (табуляций и символов 0D 0A отсутствуют там вовсе!)

по идее если поссчитать хеш от этого файла , все должно получиться......
но это не так....

непонятно какую "канонизацию" делают в СМЭВе ?

Вложение(я):
smev.xml (6kb) загружен 33 раз(а).
smevbody.xml (3kb) загружен 29 раз(а).
smevtemp.xml (2kb) загружен 30 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline slavw  
#16 Оставлено : 20 февраля 2015 г. 10:28:25(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
в исходном тексте smevbody.xml надо убрать все 0D
если хочешь их там оставить, тогда не надо их убирать из smevtemp.xml а все 0D заменить на &#xD;
канонический вид не удаляет символы 0D а заменяет их!!!!!
если исходный текст <Body> содержит символы 0D 0A и табуляцию, то и канонический вид ДОЛЖЕН их содержать, но в преобразованном виде для 0D ---> &#xD;
(в программе c14n не надо ставить галочку "PreserveWhitespace", и символы 0D она удаляет перед канонизацией, если бы она этого не делала, увидели бы &#xD вместо 0D)
на счет табуляции не знаю.. не делал...

поэтому, что бы исключить эти ошибки... для начала убери из ИСХОДНОГО текста все отступы и табуляции и переносы строк... и именно в таком виде формируй исходный xml.... лишний пробел в исходном тексте xml сразу все испортит...

то что у вас в файле smevtemp и должно и быть исходным текстом, который вы отправляете.... а не smevbody..
вставьте содержимое smevtemp.xml в smev.xml вместо <Body> и отправляйте


ой.. наоборот: в программе надо ОСТАВИТЬ галочку "PreserveWhitespace" ошибся...

Отредактировано пользователем 20 февраля 2015 г. 10:49:44(UTC)  | Причина: ошибся

Offline slavw  
#17 Оставлено : 20 февраля 2015 г. 10:43:22(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
там еще появился <ns6:FilePFR xmlns:ns6="http://data.service.pfr.socit.ru"/>
замените на
<ns6:FilePFR xmlns:ns6="http://data.service.pfr.socit.ru"></ns6:FilePFR>

именно ваш канонический вид должен быть в запросе!!!!!!!!!! не исходный!!!!!!
Offline slavw  
#18 Оставлено : 20 февраля 2015 г. 10:53:07(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
я вас ща запутаю кажется...
короче уберите нафиг отовсюду, везде из исходного текста xml табуляцию, пробелы, переносы строк (и #13 и #10)
приведите исходный текст в канонический вид и именно его и отправляйте...


перед каноникализацией вы проводите дополнительные действия: убираете отступы строк и переводы строк... этого делать нельзя!

Отредактировано пользователем 20 февраля 2015 г. 11:01:22(UTC)  | Причина: Не указана

Offline slavw  
#19 Оставлено : 20 февраля 2015 г. 13:02:19(UTC)
slavw

Статус: Активный участник

Группы: Участники
Зарегистрирован: 23.01.2015(UTC)
Сообщений: 46
Российская Федерация

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 22 раз в 12 постах
у вас не должно быть файлов smev.xml smevbody.xml smevtemp.xml
у вас должен быть один файл который будет содержать каноническую форму и <Body> и <SignedInfo> ,
после этого вы забываете про каноникализацию...
вычисляете хеш <Body>, подписываете <SignedInfo> и отправляете...
если не получится... показываете xml.. посмотрим...
Offline smev  
#20 Оставлено : 27 февраля 2015 г. 7:22:20(UTC)
smev

Статус: Новичок

Группы: Участники
Зарегистрирован: 20.02.2015(UTC)
Сообщений: 8
Российская Федерация
Откуда: Владивосток

Спасибо автору за проделанную работу. Респект и уважуха :)

И так после 2 недель Brick wall я разобрался как рассчитывать хеш DigestValue

Но столкнулся с проблемой вычисления подписи тега SignatureValue

Я делаю как по описанию,

беру содержимое SignedInfo
канонизирую его "уже известным образом"
вычисляю хеш

в результате получаю результат "неверная ЭП"

Подскажите как поссчитать SignatureValue ?

Отредактировано пользователем 27 февраля 2015 г. 7:24:02(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
8 Страницы<1234>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.