| ||||
| ||||
Доброе время суток! Подскажите пожайлуста, последовательность вызова методов этого интерфейса. Вот так не работает: CERTENCODELib.CCertEncodeAltNameClass enc_an = new CERTENCODELib.CCertEncodeAltNameClass(); enc_an.Reset(1); int index_name = 0; int index_choice = enc_an.GetNameChoice(index_name); //здесь ошибка Неудается найти указанный файл (0х80070002) enc_an.SetNameEntry(index_name,index_choice,"Тест"); string r = enc_an.Encode(); | ||||
Ответы: | ||||
| ||||
GetNameChoice используется уже для существующих данных. Вы сами должны задать в SetNameEntry какие данные кодируются. | ||||
| ||||
Может я не в ту сторону иду? Задача такова что нужно расшифровать значение расширения сертификата: CERTENCODELib.CCertEncodeAltName enc = new CERTENCODELib.CCertEncodeAltNameClass(); CAPICOM.UtilitiesClass utilites = new CAPICOM.UtilitiesClass(); CERTADMINLib.IEnumCERTVIEWEXTENSION ext = cvr.EnumCertViewExtension(0); ext.Reset(); int indexExt = ext.Next(); while(indexExt!=-1) { DataRow row = dt.NewRow(); row["OID"]=ext.GetName(); //row["OID_Value"] изначально ="HgIAMA==" row["OID_Value"]=ext.GetValue(3,1).ToString(); row["OID_Value"]=utilites.Base64Decode(); row["OID_Value"]= utilites.BinaryToHex(row["OID_Value"].ToString()); enc.Decode(row["OID_Value"].ToString()); //Здесь ошибка CCertEncodeAltName::Decode Встречено неверное значение тега ASN1. 0x8009310b (ASN: 267) if(enc.GetNameCount()>0) row["OID_Value"] = enc.GetName(0); //row["OID_Value"] Должно быть = "0" dt.Rows.Add(row); indexExt = ext.Next(); } Как выполнить сие преобразование на .NET (используя CAPICOM), если на чистом API то проходит только так: char in_data[]="HgIAMA=="; BYTE *pEncoded=NULL; BYTE *pDecoded=NULL; DWORD cbEncoded = 0; DWORD cbDecoded = 0; if(CryptStringToBinary(in_data,sizeof(in_data),CRYPT_STRING_BASE64,NULL,&cbEncoded,NULL,NULL)) { if(cbEncoded>0) { pEncoded = (BYTE*) LocalAlloc(LMEM_FIXED,cbEncoded); if(CryptStringToBinary(in_data,sizeof(in_data),CRYPT_STRING_BASE64,pEncoded,&cbEncoded,NULL,NULL)) { } } } if(pEncoded) { if(CryptDecodeObject(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,X509_UNICODE_NAME_VALUE,pEncoded,cbEncoded, 0,NULL,&cbDecoded)) { if(cbDecoded>0) { pDecoded = (BYTE*) LocalAlloc(LMEM_FIXED,cbDecoded); if(CryptDecodeObject(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,X509_UNICODE_NAME_VALUE,pEncoded,cbEncoded, 0,pDecoded,&cbDecoded)) { CERT_NAME_VALUE *var = (CERT_NAME_VALUE*) pDecoded; MessageBoxW(0,(wchar_t*)var->Value.pbData,L"Декодировано",0); } LocalFree((HLOCAL) pDecoded); } } else { char *msg; DWORD err = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,err,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&msg,0,NULL); MessageBox(0,msg,"Ошибка",0); LocalFree((HLOCAL)msg); } LocalFree((HLOCAL)pEncoded); } | ||||
| ||||
Наверное. А почему Вы думаете что ext.GetValue(3,1) - это Altname? В примере на CryptoAPI у Вас совсем не altname декодируется, для него даже константы другие. | ||||