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

Уведомление

Icon
Error

7 Страницы«<23456>»
Опции
К последнему сообщению К первому непрочитанному
Offline Максим Коллегин  
#31 Оставлено : 5 февраля 2018 г. 15:13:49(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Структура CMSG_ENVELOPED_ENCODE_INFO заполняеся очень странно, попробую исправить.
Знания в базе знаний, поддержка в техподдержке
Offline po_saa  
#32 Оставлено : 5 февраля 2018 г. 15:35:14(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: maxdm Перейти к цитате
Структура CMSG_ENVELOPED_ENCODE_INFO заполняеся очень странно, попробую исправить.


у меня сомнения по поводу

EnvelopedEncodeInfo.hCryptProv = IntPtr.Zero; //hProv;//здесь должно быть NULL так как не используется (см. MSDN) This member is not used and should be set to NULL.


и

CertInfoPointersPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(CertInfoPointersArray[0]) * CertBlobs.Length); //указатель на массив указателей структур CERT_INFO
EnvelopedEncodeInfo.rgpRecipients = CertInfoPointersPtr;

в MSDN написано вроде что должен быть указатель на массив указателей

но сами структуры выдраны из CryptoAPI

функция обратного вызова тоже оттуда



.... и вообще сомнения насчет всего кода функции шифрования.
хорошо бы где-то подробный алгоритм хотя бы - что и в каком порядке заполнять, какие функции вызывать и пояснения зачем (то есть "что делаем")

Отредактировано пользователем 5 февраля 2018 г. 15:55:20(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#33 Оставлено : 5 февраля 2018 г. 16:29:17(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
hProv везде должен быть ноль.
Вот так можно заполнить единственный элемент PCERT_INFO:

Код:
                IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;
                EnvelopedEncodeInfo.rgpRecipients = certInfo;

CryptMsgOpenToEncode стала выполняться успешно. Дальше попробуйте сами.
Знания в базе знаний, поддержка в техподдержке
Offline po_saa  
#34 Оставлено : 5 февраля 2018 г. 16:38:51(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: maxdm Перейти к цитате
hProv везде должен быть ноль.
Вот так можно заполнить единственный элемент PCERT_INFO:

Код:
                IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;
                EnvelopedEncodeInfo.rgpRecipients = certInfo;

CryptMsgOpenToEncode стала выполняться успешно. Дальше попробуйте сами.


CryptMsgOpenToEncode и раньше выполнялась успешно

я написал выше

bResult = Win32.CryptMsgUpdate(
сбоит

Отредактировано пользователем 5 февраля 2018 г. 16:41:19(UTC)  | Причина: Не указана

Offline po_saa  
#35 Оставлено : 5 февраля 2018 г. 16:42:30(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: po_saa Перейти к цитате
Автор: maxdm Перейти к цитате
hProv везде должен быть ноль.
Вот так можно заполнить единственный элемент PCERT_INFO:

Код:
                IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;
                EnvelopedEncodeInfo.rgpRecipients = certInfo;

CryptMsgOpenToEncode стала выполняться успешно. Дальше попробуйте сами.


CryptMsgOpenToEncode и раньше выполнялась успешно

я написал выше

bResult = Win32.CryptMsgUpdate(
сбоит
не отрабатывает скорее всего шифрование и в файл ничего не пишется


Offline Максим Коллегин  
#36 Оставлено : 5 февраля 2018 г. 18:35:49(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
А зачем вы сделали class из структуры CMSG_STREAM_INFO?
Это основная причина ошибки. Аккуратнее нужно работать с p\invoke.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
po_saa оставлено 06.02.2018(UTC)
Offline po_saa  
#37 Оставлено : 6 февраля 2018 г. 9:20:09(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: maxdm Перейти к цитате
А зачем вы сделали class из структуры CMSG_STREAM_INFO?
Это основная причина ошибки. Аккуратнее нужно работать с p\invoke.


да, Переделка CMSG_STREAM_INFO - стала вызываться CallBack процедура
по всей видимости, шифрует, но сертификатов КриптоПРО не видит
(процедуру

Код:
IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;


подставил) но результата это не дало

Ни одна из приведенных операций присвоения CertInfoPointersPtr не даёт списка сертификатов в КриптоПРО при расшифровке

Код:
                // Заполнить структуру CMSG_ENVELOPED_ENCODE_INFO
                EnvelopedEncodeInfo = new Win32.CMSG_ENVELOPED_ENCODE_INFO();
                EnvelopedEncodeInfo.cbSize = (uint)Marshal.SizeOf(EnvelopedEncodeInfo);
                EnvelopedEncodeInfo.hCryptProv = IntPtr.Zero; //hProv;//здесь должно быть NULL так как не используется (см. MSDN) This member is not used and should be set to NULL.
                EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = Win32.szOID_CP_GOST_GOST89;

                EnvelopedEncodeInfo.cRecipients = (uint)CertBlobs.Length;  //это количество сертификатов. Если открыть, почему-то не отрабатывает CryptMsgOpenToEncode

                //Если rgpRecipients не NULL, rgCmsRecipients должен быть NULL.

                //Ни одна из приведенных операций не даёт списка сертификатов в КриптоПРО при расшифровке
                //CertInfoArraysPtr = Marshal.AllocHGlobal(
                //    Marshal.SizeOf(certInfoStructuresArray[0]) * CertBlobs.Length);   //указатель на массив структур CERT_INFO

                //CertInfoPointersPtr = Marshal.AllocHGlobal(
                //    Marshal.SizeOf(CertInfoPointersArray[0]) * CertBlobs.Length);   //указатель на массив указателей структур CERT_INFO

                IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;

                EnvelopedEncodeInfo.rgpRecipients = certInfo;// CertInfoPointersPtr;

Отредактировано пользователем 6 февраля 2018 г. 9:25:31(UTC)  | Причина: Не указана

Offline po_saa  
#38 Оставлено : 6 февраля 2018 г. 9:27:26(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: po_saa Перейти к цитате
Автор: maxdm Перейти к цитате
А зачем вы сделали class из структуры CMSG_STREAM_INFO?
Это основная причина ошибки. Аккуратнее нужно работать с p\invoke.


да, Переделка CMSG_STREAM_INFO - стала вызываться CallBack процедура
по всей видимости, шифрует, но сертификатов КриптоПРО не видит

soourki_01.01.2017.zip.enc (293kb) загружен 3 раз(а).

(процедуру

Код:
IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;


подставил) но результата это не дало

Ни одна из приведенных операций присвоения CertInfoPointersPtr не даёт списка сертификатов в КриптоПРО при расшифровке

Код:
                // Заполнить структуру CMSG_ENVELOPED_ENCODE_INFO
                EnvelopedEncodeInfo = new Win32.CMSG_ENVELOPED_ENCODE_INFO();
                EnvelopedEncodeInfo.cbSize = (uint)Marshal.SizeOf(EnvelopedEncodeInfo);
                EnvelopedEncodeInfo.hCryptProv = IntPtr.Zero; //hProv;//здесь должно быть NULL так как не используется (см. MSDN) This member is not used and should be set to NULL.
                EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = Win32.szOID_CP_GOST_GOST89;

                EnvelopedEncodeInfo.cRecipients = (uint)CertBlobs.Length;  //это количество сертификатов. Если открыть, почему-то не отрабатывает CryptMsgOpenToEncode

                //Если rgpRecipients не NULL, rgCmsRecipients должен быть NULL.

                //Ни одна из приведенных операций не даёт списка сертификатов в КриптоПРО при расшифровке
                //CertInfoArraysPtr = Marshal.AllocHGlobal(
                //    Marshal.SizeOf(certInfoStructuresArray[0]) * CertBlobs.Length);   //указатель на массив структур CERT_INFO

                //CertInfoPointersPtr = Marshal.AllocHGlobal(
                //    Marshal.SizeOf(CertInfoPointersArray[0]) * CertBlobs.Length);   //указатель на массив указателей структур CERT_INFO

                IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;

                EnvelopedEncodeInfo.rgpRecipients = certInfo;// CertInfoPointersPtr;


Offline po_saa  
#39 Оставлено : 6 февраля 2018 г. 9:38:47(UTC)
po_saa

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: maxdm Перейти к цитате
А зачем вы сделали class из структуры CMSG_STREAM_INFO?
Это основная причина ошибки. Аккуратнее нужно работать с p\invoke.


почему-то, когда раскомментирую

// Заполнить структуру CMSG_ENVELOPED_ENCODE_INFO
EnvelopedEncodeInfo = new Win32.CMSG_ENVELOPED_ENCODE_INFO();
EnvelopedEncodeInfo.cbSize = (uint)Marshal.SizeOf(EnvelopedEncodeInfo);
EnvelopedEncodeInfo.hCryptProv = IntPtr.Zero; //hProv;//здесь должно быть NULL так как не используется (см. MSDN) This member is not used and should be set to NULL.
EnvelopedEncodeInfo.ContentEncryptionAlgorithm.pszObjId = Win32.szOID_CP_GOST_GOST89;

EnvelopedEncodeInfo.cRecipients = (uint)CertBlobs.Length; //это количество сертификатов. Если открыть, почему-то не отрабатывает CryptMsgOpenToEncode

валится процедура

Код:
                hMsg = Win32.CryptMsgOpenToEncode(
                    Win32.X509_ASN_ENCODING | Win32.PKCS_7_ASN_ENCODING,
                    0,
                    Win32.CMSG_ENVELOPED,
                    ref EnvelopedEncodeInfo,
                    null,
                    ref StreamInfo
                );


возвращает 0

если без

EnvelopedEncodeInfo.cRecipients = (uint)CertBlobs.Length; //это количество сертификатов. Если открыть, почему-то не отрабатывает CryptMsgOpenToEncode

то hMsg возвращается, но сертификатов КриптоПРО при расшифровке не видит

Отредактировано пользователем 6 февраля 2018 г. 10:01:23(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#40 Оставлено : 6 февраля 2018 г. 17:41:30(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,377
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Советую написать сначала нужный код на С, потом перенести на C#. Ну или ждать, что поможет кто-то из форумчан.
У меня сейчас к сожалению нет времени этим заниматься.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
7 Страницы«<23456>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.