logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы«<234
Опции
К последнему сообщению К первому непрочитанному
Offline Юрий  
#61 Оставлено : 22 ноября 2013 г. 11:32:02(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 657
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 2 раз
Поблагодарили: 83 раз в 65 постах
Автор: dmishin Перейти к цитате
Юрий, подскажите каким методом добраться до нужного узла после выполнения CryptDecodeObject?

Вызвав ещё раз CryptDecodeObject :) И так до победного конца.
С уважением,
Юрий Строжевский
Offline dmishin  
#62 Оставлено : 25 ноября 2013 г. 12:25:30(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Под линуксом и CryptDecodeObject выдает ошибку: 0x00000057
Хотя под виндой все ок...

Остается только попробовать собрать массив из того что выдает CryptMsgGetParam(CMSG_SIGNER_AUTH_ATTR_PARAM)

Отредактировано пользователем 25 ноября 2013 г. 12:31:34(UTC)  | Причина: Не указана

Offline Юрий  
#63 Оставлено : 25 ноября 2013 г. 12:37:16(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 657
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 2 раз
Поблагодарили: 83 раз в 65 постах
Автор: dmishin Перейти к цитате
Под линуксом и CryptDecodeObject выдает ошибку: 0x00000057
Хотя под виндой все ок...

Остается только попробовать собрать массив из того что выдает CryptMsgGetParam(CMSG_SIGNER_AUTH_ATTR_PARAM)

Смотря что декодировать. Там тоже реализован ограниченный набор декодируемых структур.
Проще декодировать примитивные ASN.1 типы и обрабатывать уже их.
С уважением,
Юрий Строжевский
Offline dmishin  
#64 Оставлено : 25 ноября 2013 г. 12:54:21(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
И так получил третью реализацию, которая не работает под линуксом:

1. Получаю подписанные атрибуты:
CryptMsgGetParam(msgObject, CMSG_SIGNER_AUTH_ATTR_PARAM, 0, msgAuthAttr, &msgParamLen)
2. Пытаюсь запаковать в ASN.1:
CryptEncodeObject(MY_ENCODING_TYPE, PKCS_ATTRIBUTES, msgAuthAttr, msgAuthAttrData, &msgAuthAttrLen)


Получаю 0x80092002. Что означает что скорее всего под линуксом не реализовано...
Offline dmishin  
#65 Оставлено : 25 ноября 2013 г. 12:55:38(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Юрий Перейти к цитате
Автор: dmishin Перейти к цитате
Под линуксом и CryptDecodeObject выдает ошибку: 0x00000057
Хотя под виндой все ок...

Остается только попробовать собрать массив из того что выдает CryptMsgGetParam(CMSG_SIGNER_AUTH_ATTR_PARAM)

Смотря что декодировать. Там тоже реализован ограниченный набор декодируемых структур.
Проще декодировать примитивные ASN.1 типы и обрабатывать уже их.


Просто исходное сообщение не декодируется. Т.е. корневой элемент.
Offline dmishin  
#66 Оставлено : 25 ноября 2013 г. 13:02:58(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Юрий Перейти к цитате

Проще декодировать примитивные ASN.1 типы и обрабатывать уже их.


Остался еще вариант с реализацией ASN.1 парсера для получения нужного узла.
У меня варианты кончились.

Отредактировано пользователем 26 ноября 2013 г. 7:05:47(UTC)  | Причина: Не указана

Offline Юрий  
#67 Оставлено : 25 ноября 2013 г. 13:06:38(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 657
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 2 раз
Поблагодарили: 83 раз в 65 постах
Автор: dmishin Перейти к цитате
Автор: Юрий Перейти к цитате
Автор: dmishin Перейти к цитате
Под линуксом и CryptDecodeObject выдает ошибку: 0x00000057
Хотя под виндой все ок...

Остается только попробовать собрать массив из того что выдает CryptMsgGetParam(CMSG_SIGNER_AUTH_ATTR_PARAM)

Смотря что декодировать. Там тоже реализован ограниченный набор декодируемых структур.
Проще декодировать примитивные ASN.1 типы и обрабатывать уже их.


Просто исходное сообщение не декодируется. Т.е. корневой элемент.

Да нет, простейшие типы ASN.1 прекрасно декодируются/кодируются в Linux. Так что-то ошибочно у вас в коде.
С уважением,
Юрий Строжевский
Offline dmishin  
#68 Оставлено : 25 ноября 2013 г. 13:28:16(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Юрий Перейти к цитате
Автор: dmishin Перейти к цитате
Автор: Юрий Перейти к цитате
Автор: dmishin Перейти к цитате
Под линуксом и CryptDecodeObject выдает ошибку: 0x00000057
Хотя под виндой все ок...

Остается только попробовать собрать массив из того что выдает CryptMsgGetParam(CMSG_SIGNER_AUTH_ATTR_PARAM)

Смотря что декодировать. Там тоже реализован ограниченный набор декодируемых структур.
Проще декодировать примитивные ASN.1 типы и обрабатывать уже их.


Просто исходное сообщение не декодируется. Т.е. корневой элемент.

Да нет, простейшие типы ASN.1 прекрасно декодируются/кодируются в Linux. Так что-то ошибочно у вас в коде.



Как вариант - в сообщении возможно есть ошибка, которую win реализация прощает. Но на всякий случай проверю код.
Offline dmishin  
#69 Оставлено : 25 ноября 2013 г. 15:42:55(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Удалось поэлементно запаковать атрибуты:
for (DWORD i = 0; i < msgAuthAttr->cAttr; i++) {
if(!CryptEncodeObject(MY_ENCODING_TYPE, PKCS_ATTRIBUTE, &(msgAuthAttr->rgAttr[i]), NULL, &encodedAttrLen)) {
HandleError("1");
}
if(!(encodedAttr = (BYTE *)malloc(encodedAttrLen))){
HandleError("Memory Allocation error");
}
if(!CryptEncodeObject(MY_ENCODING_TYPE, PKCS_ATTRIBUTE, &(msgAuthAttr->rgAttr[i]), encodedAttr,&encodedAttrLen)) {
HandleError("2");
}

if(!(encodedAttributes = (BYTE *)realloc(encodedAttributes, encodedAttributesLen + encodedAttrLen))){
HandleError("Memory Allocation error");
}

memmove(encodedAttributes+encodedAttributesLen, encodedAttr, encodedAttrLen);
encodedAttributesLen += encodedAttrLen;
}
Не нашел функцию для генерации заголовка с длиной данных для ASN.1, поэтому подставил пока вручную для проверки.

Получил искомое значение для хеша и валидация прошла успешно.


П.С.
Остается найти или написать генерацию заголовка элемента.

Отредактировано пользователем 25 ноября 2013 г. 15:47:56(UTC)  | Причина: Не указана

Offline dmishin  
#70 Оставлено : 26 ноября 2013 г. 7:48:46(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Заголовки добавил через CryptEncodeObject(X509_OCTET_STRING)
Offline dmishin  
#71 Оставлено : 26 ноября 2013 г. 9:14:19(UTC)
dmishin

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

Группы: Участники
Зарегистрирован: 07.08.2012(UTC)
Сообщений: 123

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Автор: Юрий Перейти к цитате
Linux - постоянный поставщик "умственного секса" на рынке разработки софта (с) Юрий Строжевский :)


CryptStringToBinary(CRYPT_STRING_ANY) под линуксом на бинарной строке ничего не возвращает. Если указать CRYPT_STRING_BINARY, то все ок...

Под виндой естественно все работает...
Offline Dmitry Z  
#72 Оставлено : 13 июня 2019 г. 14:56:28(UTC)
Dmitry Z

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

Группы: Участники
Зарегистрирован: 13.06.2019(UTC)
Сообщений: 1

Тема старая, но по проблеме, обозначенной в заголовке, вышел через гугл только сюда. Т.е. что делать, если нужно проверить подпись по хэшу данных и при этом signedAttrs пустые. По java решение здесь так и не увидел, поэтому напишу то, к которому пришел сам и которое успешно отработало.

Signature signature = Signature.getInstance(getRawSignatureAlgorithmName(signerInfo.signatureAlgorithm));
signature.initVerify(certificate);
signature.update(digestBlob);
signature.verify(signerInfo.signature.value);

Все аналогично проверке подписи по контенту, но, поскольку в метод update вместо файла мы передаем дайджест, то нужно сделать так, чтобы с этого дайджеста не вычислялся новый дайджест во внутренностях. Для этого в метод getInstance вместо строки алгоритма подписи с алгоритмом хэширования передаем строку алгоритма подписи без алгоритма хэширования, т.е. вместо GOST3411withGOST3410EL передаем NONEwithGOST3410EL и аналогично для других алгоритмов согласно разделу "2.7.1. Создание объекта проверки ЭП" из руководства программиста по JCP, которое можно найти в архиве с самим JCP

2.7.1.PNG (207kb) загружен 2 раз(а).

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