Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Структура CMSG_ENVELOPED_ENCODE_INFO заполняеся очень странно, попробую исправить. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
hProv везде должен быть ноль. Вот так можно заполнить единственный элемент PCERT_INFO: Код: IntPtr certInfo = certsCollection[0].Handle + Marshal.SizeOf(new Win32.CERT_CONTEXT()) - IntPtr.Size - IntPtr.Size;
EnvelopedEncodeInfo.rgpRecipients = certInfo;
CryptMsgOpenToEncode стала выполняться успешно. Дальше попробуйте сами. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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( сбоит не отрабатывает скорее всего шифрование и в файл ничего не пишется
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
А зачем вы сделали class из структуры CMSG_STREAM_INFO? Это основная причина ошибки. Аккуратнее нужно работать с p\invoke.
|
|
1 пользователь поблагодарил Максим Коллегин за этот пост.
|
po_saa оставлено 06.02.2018(UTC)
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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;
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,393 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 717 раз в 621 постах
|
Советую написать сначала нужный код на С, потом перенести на C#. Ну или ждать, что поможет кто-то из форумчан. У меня сейчас к сожалению нет времени этим заниматься. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close