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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vyacheslav  
#1 Оставлено : 12 апреля 2010 г. 18:13:32(UTC)
vyacheslav

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

Группы: Участники
Зарегистрирован: 27.12.2007(UTC)
Сообщений: 16
Откуда: Chelyabinsk

Добрый день!
Необходимо получить информацию о сертификате при проверке подписи CryptVerifyDetachedMessageSignature.
Подпись проверяется, в pCert приходит указатель, но в структуре CERT_CONTEXT заполнено только поле
dwCertEncodingType = 168850432
Cert_info = 0 , и соответственно, когда пытаюсь его разобрать получаю ошибку.
Подскажите пожалуйста, как правильно получить информацию о сертификате в детачет подписи?

Код:



           Crypto.CERT_CONTEXT Cert;
           IntPtr pCert;
            Crypto.CERT_CONTEXT* pCertContext = &Cert;

            pCert = new IntPtr((void*)pCertContext);

                res = Crypto.CryptVerifyDetachedMessageSignature(
                ref VerifyParams,
                0,
                pbDetachedSignBlob,  // детачед подпись
                cbDetachedSignBlob,  // размер подписи
                1,  // кол-во блоков данных
                rgpbToBeSigned,
                rgcbToBeSigned,
                //IntPtr.Zero          // Pointer to signer certificate.
                 pCert
                );

                Cert = (Crypto.CERT_CONTEXT)Marshal.PtrToStructure(pCert, typeof(Скнзещ.CERT_CONTEXT)); 

                    IntPtr pCertInfo;
                    pCertInfo = Cert.pCertInfo;
                    
                    Crypto.CERT_INFO cert_info = new Crypto.CERT_INFO();

////////  здесь ошибка   ex.Message = "В экземпляре объекта не задана ссылка на объект."
  cert_info = (Crypto.CERT_INFO)Marshal.PtrToStructure(pCertInfo, typeof(Crypto.CERT_INFO));
Offline Kirill Sobolev  
#2 Оставлено : 13 апреля 2010 г. 16:16:29(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
MSDN про последний параметр:
Цитата:
ppSignerCert
A pointer to a pointer to a CERT_CONTEXT structure of a signer certificate. When you have finished using the certificate context, free it by calling the CertFreeCertificateContext function. A pointer to a CERT_CONTEXT structure will not be returned if this parameter is NULL.

Так что надо будет преобразовать еще раз.
И значение 168850432 как раз очень похоже на указатель.
Техническую поддержку оказываем тут
Наша база знаний
Offline vyacheslav  
#3 Оставлено : 13 апреля 2010 г. 19:03:43(UTC)
vyacheslav

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

Группы: Участники
Зарегистрирован: 27.12.2007(UTC)
Сообщений: 16
Откуда: Chelyabinsk

Спасибо большое, помогло! Получил массив, декодировал его как utf-8 строку.
Получилось чтото непонятное, вроде и значения все встречаются , те что должны быть в полях CN, OU и других, носамих обозначений полей нет. Где формат посмотреть этой строки?

"0��1\v0\tURU10\n\t�&���,dru10\n\t�&���,d\vmechelgroup10\n\t�&���,dCHMK1\v0\tU\b7410U\a\vChelyabinsk1\r0\vU\nCHMK110/U\v\f(Пользователи и группы10\rU\v\fЧМК1\v0\tU\vUK1\f0\nU\vOIR10U\nvejgandtve"
Offline Kirill Sobolev  
#4 Оставлено : 13 апреля 2010 г. 19:16:03(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Это на ASN.1 похоже... какой массив и как декодировали?
Техническую поддержку оказываем тут
Наша база знаний
Offline vyacheslav  
#5 Оставлено : 14 апреля 2010 г. 10:00:01(UTC)
vyacheslav

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

Группы: Участники
Зарегистрирован: 27.12.2007(UTC)
Сообщений: 16
Откуда: Chelyabinsk

Получаю поле subject так:

Код:
pCert = (IntPtr)Marshal.PtrToStructure(ppCert, typeof(IntPtr));                     
Cert = (Crypto.CERT_CONTEXT)Marshal.PtrToStructure(pCert, typeof(Crypto.CERT_CONTEXT)); 
IntPtr pCertInfo;
pCertInfo = Cert.pCertInfo;
Crypto.CERT_INFO cert_info = new Crypto.CERT_INFO();
cert_info = (Crypto.CERT_INFO)Marshal.PtrToStructure(pCertInfo, typeof(Crypto.CERT_INFO));
byte[] bSubj = new byte[cert_info.Subject.cbData];
Marshal.Copy(cert_info.Subject.pbData, bSubj, 0, cert_info.Subject.cbData);
encoding = System.Text.Encoding.GetEncoding("UTF-8");
string s1;
s1 = encoding.GetString(bSubj);
Offline vyacheslav  
#6 Оставлено : 14 апреля 2010 г. 19:18:26(UTC)
vyacheslav

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

Группы: Участники
Зарегистрирован: 27.12.2007(UTC)
Сообщений: 16
Откуда: Chelyabinsk

В общем добрался до common name так:

Код:
     StringBuilder Buffer = new StringBuilder(255);
                     UInt32 cchString = 255;

                     System.UInt32 nChars = Crypto.CertGetNameString(pCert,
                                                          Crypto.CERT_NAME_FRIENDLY_DISPLAY_TYPE,
                                                          0,
                                                          IntPtr.Zero,
                                                          Buffer,
                                                          cchString);
                                          // use Buffer.ToString() to use the cert's name string
                     //  */                

                     string cert_name = Buffer.ToString();
Offline Kirill Sobolev  
#7 Оставлено : 14 апреля 2010 г. 21:14:28(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
До субъекта целиком можно добраться аналогичным способом с помощью функции CertNameToStr (она как раз и декодирует ASN.1 имя в строку).
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.