16.08.2007 7:59:36Как работает CCertEncodeAltName? Ответов: 3
Сергей
Доброе время суток! Подскажите пожайлуста, последовательность вызова методов этого интерфейса.
Вот так не работает:
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();
 
Ответы:
16.08.2007 13:45:46Kirill Sobolev
GetNameChoice используется уже для существующих данных.
Вы сами должны задать в SetNameEntry какие данные кодируются.
17.08.2007 7:36:45Сергей
Может я не в ту сторону иду?
Задача такова что нужно расшифровать значение расширения сертификата:

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);
}
17.08.2007 13:46:19Kirill Sobolev
Наверное.
А почему Вы думаете что ext.GetValue(3,1) - это Altname? В примере на CryptoAPI у Вас совсем не altname декодируется, для него даже константы другие.