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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline migel  
#1 Оставлено : 30 января 2019 г. 15:30:44(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Здравствуйте.
Возникла проблем при работе с EnvelopedCMS в разном окружении.
Пытаемся использовать CryptoPro в Windows x64 и Linux (Centos7 amd64)
libcapi20.so.4.0.4
Среда исполнения
Mono JIT compiler version 5.16.0.220 (tarball Mon Nov 26 17:05:57 UTC 2018)
Написана обертка над найтивными библиотеками.
Проблема в том что:
при вызове CryptMsgOpenToEncode с параметрами
Код:

                    var msgHandle = Crypt32.CryptMsgOpenToEncode(CryptEncoding.PKCS_7_OR_X509_ASN_ENCODING,
                                                                    CryptMSGOpenFlags.CMSG_EMPTY_FLAG,
                                                                    CryptMSGType.CMSG_ENVELOPED,
                                                                    encodeDataHandle,
                                                                    contentTypePtr,
                                                                    IntPtr.Zero);

где contentTypePtr => "1.2.840.113549.1.7.1";

содержимое полученного сообщения отличается по длине в Windows и Linux (+4 octets).
На обоих платформах выполняется предварительное кодирование содержимого согласно
RFC 2315 <#section-8>. Data content type RSA Data must be OCTET encoded string
Соответсвенно:
содержимое при декодировании и расшифровке сообщения полученного в Linux
возвращает содержимое в ASN.1 кодировке (4 байта asn tag OCTET_STRING+...).
При кодировании сообщения в Windows такого не происходит.
Примеры сообщений в присоединении cms.zip (2kb) загружен 5 раз(а).
Offline migel  
#2 Оставлено : 31 января 2019 г. 18:13:55(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Наверное плохо спросил.
Дополнительная информация.
Кодируется один и тот же блок
Код:

            byte[] data = new byte[256];
            data[0] = 0xDE;
            data[1] = 0xAD;
            data[2] = 0xBE;
            data[3] = 0xEF;
            //... остальное 0

Код:

                  var msgHandle = Crypt32.CryptMsgOpenToEncode(CryptEncoding.PKCS_7_OR_X509_ASN_ENCODING,
                                                                    CryptMSGOpenFlags.CMSG_EMPTY_FLAG,
                                                                    CryptMSGType.CMSG_ENVELOPED,
                                                                    encodeDataHandle,
                                                                    contentTypePtr,
                                                                    IntPtr.Zero);
                    byte[] encodedContent;
                    // see RFC 2315 <#section-8>. Data content type RSA Data must be OCTET encoded string
                    // Пришлось ставить подпорку
                    if (Environment.OSVersion.Platform != PlatformID.Unix // Вот тут
                        && 
                        string.Compare(this.ContentInfo.ContentType, PartsOid.Data, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        byte[] content = this.ContentInfo.Content;
                        var dataBlob = new CRYPTOAPI_BLOB();

                        var handle = GCHandle.Alloc(content, GCHandleType.Pinned);
                        try
                        {
                            dataBlob.cbData = (uint)content.Length;
                            dataBlob.pbData = handle.AddrOfPinnedObject();

// кодируем посредством CryptEncodeObject
                            EncodeObject(EncodeObjectType.X509_OCTET_STRING,
                                                        dataBlob, 
                                                        out encodedContent);
                        }
                        finally
                        {
                            handle.Free();
                        }
                    }
                    else
                    {
                        encodedContent = this.ContentInfo.Content;
                    }

                    if (encodedContent.Length > 0)
                    {
                        Crypt32.CryptMsgUpdate(_cryptMsgHandle, encodedContent, (uint)encodedContent.Length, true);
                    }

Поэтому сформулирую вопрос четче:
Какие дополнительные настройки CryptMsg нужно сделать для одинакового кодирования CMSG содержимого в Windows и Linux?
Offline Максим Коллегин  
#3 Оставлено : 1 февраля 2019 г. 11:47:09(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Постараемся ответить в ближайшие дни. Попробуйте пока последний CSP 5.0
Знания в базе знаний, поддержка в техподдержке
Offline Дима  
#4 Оставлено : 6 февраля 2019 г. 10:19:01(UTC)
Дима

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Добрый день.
Похоже, что разница в интеллектуальной обработке типа вложенных данных szOID_RSA_data = "1.2.840.113549.1.7.1"

В описании кодирования
CryptMsgOpenToEncode (https://docs.microsoft.com/en-us/windows/desktop/api/wincrypt/nf-wincrypt-cryptmsgopentoencode) указано, что:
If pszInnerContentObjID is NULL, then the inner content type is assumed not to have been previously encoded and is therefore encoded as an octet string and given the type CMSG_DATA.


При получении содержимого после декодирования тоже есть интеллект в случае, если тип содержимого – данные, согласно описанию CryptMsgGetParam (https://docs.microsoft.com/en-us/windows/desktop/api/wincrypt/nf-wincrypt-cryptmsggetparam):
CMSG_CONTENT_PARAM:
Returns the whole PKCS #7 message from a message opened to encode. Retrieves the inner content of a message opened to decode. If the message is enveloped, the inner type is data, and CryptMsgControl has been called to decrypt the message, the decrypted content is returned. If the inner type is not data, the encoded BLOB that requires further decoding is returned. If the message is not enveloped and the inner content is DATA, the returned data is the octets of the inner content. This type is applicable to both encode and decode.
For decoding, if the type is CMSG_DATA, the content's octets are returned; else, the encoded inner content is returned.


Скорее всего, отличие в том, на Linux происходит лишнее оборачивание данных в OCTET STRING.

Можно попробовать
-- при кодировании установить pszInnerContentObjID в NULL
-- при декодировании использовать CMSG_CONTENT_PARAM


Мы, в свою очередь, проверим реализацию на Линукс.

Спасибо за пример!
Offline migel  
#5 Оставлено : 6 февраля 2019 г. 15:14:00(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Автор: Дима Перейти к цитате
Добрый день.
Похоже, что разница в интеллектуальной обработке типа вложенных данных szOID_RSA_data = "1.2.840.113549.1.7.1"
...

Дык, "по делам евонным увидите вы все..." Pray
Основная задача состоит в том чтобы обеспечить единую кодовую базу для разных систем, а так как все это делается не только для внутреннего употребления но и для обмена с внешними системами, то все это оборачивается подкладыванием подпорок и костылей.
Так что хотелось бы единообразия все таки.

Offline Дима  
#6 Оставлено : 7 февраля 2019 г. 14:43:27(UTC)
Дима

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Добрый день!
Не могли бы Вы поделиться комплектным примером?
Т.е., кодом, который можно скомпилировать и запустить?
Спасибо
Offline migel  
#7 Оставлено : 7 февраля 2019 г. 15:06:50(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Автор: Дима Перейти к цитате
Добрый день!
Не могли бы Вы поделиться комплектным примером?
Т.е., кодом, который можно скомпилировать и запустить?
Спасибо

В течении суток подготовлю пример с исходниками
Offline migel  
#8 Оставлено : 12 февраля 2019 г. 14:37:59(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Вот как и обещал, хоть и с опозданием, тестовый пример кода обвязки достаточно много
Основной метод - program.cs\main EnvelopedCMS_Test.zip (125kb) загружен 6 раз(а).
Пароль через личку.
thanks 1 пользователь поблагодарил migel за этот пост.
Дима оставлено 13.02.2019(UTC)
Offline Дима  
#9 Оставлено : 13 февраля 2019 г. 16:43:56(UTC)
Дима

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Спасибо, пароль подошёл
Offline migel  
#10 Оставлено : 11 июля 2019 г. 15:55:38(UTC)
migel

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 5 раз в 5 постах
Автор: Дима Перейти к цитате
Спасибо, пароль подошёл


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