| ||||
| ||||
Ситуация: Добавляю в подписываемое сообщение сертификат: param.cMsgCert = IncludeCert; param.rgpMsgCert = &pUserCert; Хотелось бы его научиться извлекать из сообщения, чтобы в дальнейшем проверить на нем подпись, установить в хранилище и т.п.. Каким образом можно его извлечь? | ||||
Ответы: | ||||
| ||||
CertOpenStore(..,CERT_STORE_PROV_PKCS7,..) в этом временном хранилище и будут все сертификаты, которые Вы добавили | ||||
| ||||
Не получается, почему-то... Открываю так. 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 говорит, что "Ошибка при создании подписи. Не найден указанный файл", хотя все пути точно существуют и правильные. С чем это может быть связано? | ||||
| ||||
CERT_STORE_PROV_PKCS7 : что есть certBuf? CERT_STORE_PROV_FILENAME: fileName дб юникодный. | ||||
| ||||
certBuf - это считанный файл с подпиьсю в формате PKSC#7. Т.е. там и сам подписанный файл, и добавленный сертификат. Насчет имени файла - проверю. | ||||
| ||||
Я имел ввиду что это такое в коде :) Объявление, инициализация и т.д. | ||||
| ||||
Понятно:). Это вот что: 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 ); | ||||
| ||||
Не совсем нормально. У Вас это указатель на массив байтов, а нужен 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); | ||||
| ||||
Спасибо! Так работает. Но по хэндлу файла не работает, т.к. там для serialized store только. | ||||