Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Получение информации о сертификате при проверке подписи CryptVerifyDetachedMessageSignature
Статус: Участник
Группы: Участники
Зарегистрирован: 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));
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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 как раз очень похоже на указатель. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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"
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Это на ASN.1 похоже... какой массив и как декодировали? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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);
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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();
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
До субъекта целиком можно добраться аналогичным способом с помощью функции CertNameToStr (она как раз и декодирует ASN.1 имя в строку). |
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Получение информации о сертификате при проверке подписи CryptVerifyDetachedMessageSignature
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close