14.04.2006 11:50:54Добавление сертификата в подписываемое сообщение. Его извлечение? Ответов: 8
Андрей
Ситуация:
Добавляю в подписываемое сообщение сертификат:
param.cMsgCert = IncludeCert;
param.rgpMsgCert = &pUserCert;

Хотелось бы его научиться извлекать из сообщения, чтобы в дальнейшем проверить на нем подпись, установить в хранилище и т.п.. Каким образом можно его извлечь?
 
Ответы:
14.04.2006 12:32:06Kirill Sobolev
CertOpenStore(..,CERT_STORE_PROV_PKCS7,..)
в этом временном хранилище и будут все сертификаты, которые Вы добавили
14.04.2006 17:52:55Андрей
Не получается, почему-то...
Открываю так.
hCertStore = CertOpenStore(CERT_STORE_PROV_PKCS7,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
NULL,
CERT_STORE_OPEN_EXISTING_FLAG,
certBuf);
GetLastError говорит, что "Ошибка при создании подписи. Слишком большое значение ASN1".

Когда пытаюсь открывать так
hCertStore = CertOpenStore(CERT_STORE_PROV_FILENAME,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
NULL,
CERT_STORE_OPEN_EXISTING_FLAG,
fileName);
GetLastError говорит, что "Ошибка при создании подписи. Не найден указанный файл", хотя все пути точно существуют и правильные. С чем это может быть связано?
17.04.2006 9:48:44Kirill Sobolev
CERT_STORE_PROV_PKCS7 : что есть certBuf?
CERT_STORE_PROV_FILENAME: fileName дб юникодный.
17.04.2006 10:30:44Андрей
certBuf - это считанный файл с подпиьсю в формате PKSC#7. Т.е. там и сам подписанный файл, и добавленный сертификат.

Насчет имени файла - проверю.
17.04.2006 10:32:02Kirill Sobolev
Я имел ввиду что это такое в коде :)
Объявление, инициализация и т.д.
17.04.2006 16:45:36Андрей
Понятно:). Это вот что:
BYTE *certBuf = NULL;
Инициализируется по указателю в функции:

int GetFileDataPointer (const char *inFile, size_t *Len,
unsigned char **Buffer)
{

HANDLE hFile;
hFile = CreateFile(inFile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

DWORD nBytesRead;
DWORD Length;
unsigned char *lpBuffer;

Length = GetFileSize(hFile, NULL);


lpBuffer = new unsigned char[GetFileSize(hFile, NULL)+1];
BOOL bResult = ReadFile(hFile, lpBuffer, GetFileSize(hFile, NULL), &nBytesRead, NULL) ;
CloseHandle(hFile);
*len = (size_t)Length;
*buffer = lpBuffer;

return bResult;
}

Получаю
GetFileDataPointer (fileName, &mem_len, &certBuf);

Вообще, все нормально с получением, по-моему.
Сертификат добавляется корректно в подписанный файл.

Открываю:
CertOpenStore(CERT_STORE_PROV_PKCS7,
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
NULL,
CERT_STORE_READONLY_FLAG, certBuf );
17.04.2006 16:55:08Kirill Sobolev
Не совсем нормально. У Вас это указатель на массив байтов, а нужен pointer to a CRYPT_DATA_BLOB structure that represents the encoded message.
Т.е.
CRYPT_DATA_BLOB lpBuffer;
lpBuffer.cbData = GetFileSize(hFile, NULL);
lpBuffer.pbData = new unsigned char[GetFileSize(hFile, NULL)+1];
BOOL bResult = ReadFile(hFile, lpBuffer.pbData, lpBuffer.cbData, &nBytesRead, NULL);
и потом уже
CertOpenStore(CERT_STORE_PROV_PKCS7,
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
NULL,
CERT_STORE_READONLY_FLAG, certBuf );
Но можно и проще, если у Вас есть hFile, то
сделайте CertOpenStore(CERT_STORE_PROV_FILE,
PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
NULL,
CERT_STORE_READONLY_FLAG, hFile);
17.04.2006 17:47:17Андрей
Спасибо! Так работает.
Но по хэндлу файла не работает, т.к. там для serialized store только.