Статус: Участник
Группы: Участники
Зарегистрирован: 10.09.2010(UTC) Сообщений: 12 Откуда: Москва
|
Доброго времени суток. Используется Debian, 64-х битный сервер Имеется код для шифрования и подписи сообщения (код на С): Код:
CERT_KEY_CONTEXT PrivateKeyInfo;
HCRYPTPROV prov;
PCCERT_CONTEXT Ecert;
PCCERT_CONTEXT myCert;
HCERTSTORE Hstore;
HCERTSTORE store;
DWORD cbSignature=0;
DWORD cbEncryptedBlob;
DWORD size=0;
DWORD len;
DWORD allLen = 0;
CRYPT_ALGORITHM_IDENTIFIER EncryptAlgorithm;
CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
CRYPT_ENCRYPT_MESSAGE_PARA EncryptParams;
CRYPT_SIGN_MESSAGE_PARA SignParams;
BYTE* pbEncryptedBlob = NULL;
BYTE* pbSignature;
BYTE* params;
BYTE* data;
FILE* in;
ALG_ID ke_alg = CALG_PRO_EXPORT;
if (!CryptAcquireContext(&prov,NULL,NULL,75,CRYPT_VERIFYCONTEXT))
{}
if (!CryptGetProvParam(prov,PP_ENUMCONTAINERS,NULL,&size,CRYPT_FIRST))
{}
params = (BYTE*) malloc(size);
if (!CryptGetProvParam(prov,PP_ENUMCONTAINERS,params,&size,CRYPT_FIRST))
{
HandleError("Unable to Gep Prov Param",1);
}
if (!CryptAcquireContext(&prov,(char*)params,NULL,75,0))
{}
in = fopen(argv[5],"rb");
data = malloc(sizeof(BYTE)*4096);
len = (DWORD)fread(data, 1, 4096, in); // считывание сертификата получателя
fclose(in);
char buff[33];
if (!(Hstore = CertOpenStore((LPCSTR) CERT_STORE_PROV_MEMORY,ENC_TYPE,prov,0,NULL)))
{}
if (!CertAddEncodedCertificateToStore(Hstore,ENC_TYPE,data,len,CERT_STORE_ADD_NEW,&Ecert))
{}
free(data);
in = fopen(argv[4],"rb");
data = malloc(sizeof(BYTE)*4096); // считывание сертификата отправителя
len = (DWORD)fread(data, 1, 4096, in);
fclose(in);
store = CertOpenSystemStore(prov,"My");
if ((!CertAddEncodedCertificateToStore(store,ENC_TYPE,data,len,CERT_STORE_ADD_USE_EXISTING,&myCert) || !myCert))
{}
free(data);
memset(&PrivateKeyInfo, 0, sizeof(CERT_KEY_CONTEXT));
PrivateKeyInfo.hCryptProv = prov;
PrivateKeyInfo.dwKeySpec = AT_KEYEXCHANGE;
PrivateKeyInfo.cbSize = sizeof(PrivateKeyInfo);
if (!CertSetCertificateContextProperty(myCert,CERT_KEY_CONTEXT_PROP_ID,0,&PrivateKeyInfo))
{} // Проставить флаг привязки (хотя он, как выяснится, ни на что не влияет)
memset(&EncryptAlgorithm, 0, sizeof(CRYPT_ALGORITHM_IDENTIFIER));
EncryptAlgorithm.pszObjId = szOID_CP_GOST_28147;
memset(&EncryptParams, 0, sizeof(CRYPT_ENCRYPT_MESSAGE_PARA));
EncryptParams.cbSize = sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
EncryptParams.dwMsgEncodingType = ENC_TYPE;
EncryptParams.hCryptProv = prov;
EncryptParams.ContentEncryptionAlgorithm = EncryptAlgorithm;
memset(&HashAlgorithm, 0, sizeof(CRYPT_ALGORITHM_IDENTIFIER));
HashAlgorithm.pszObjId = szOID_CP_GOST_28147;
memset(&SignParams, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA));
SignParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SignParams.dwMsgEncodingType = ENC_TYPE;
SignParams.pSigningCert = myCert;
SignParams.HashAlgorithm = HashAlgorithm; //Далее куча нулей - тоже ни на что не влияет
SignParams.pvHashAuxInfo = NULL;
SignParams.cMsgCert = 0;
SignParams.rgpMsgCert = NULL;
SignParams.cMsgCrl = 0;
SignParams.rgpMsgCrl = NULL;
SignParams.cAuthAttr = 0;
SignParams.rgAuthAttr = 0;
SignParams.cUnauthAttr = 0;
SignParams.rgUnauthAttr = 0;
SignParams.dwFlags = 0;
SignParams.dwInnerContentType = 0;
in = fopen(argv[1],"r");
data = malloc(sizeof(BYTE)*4096);
len = (DWORD)fread(data, 1, 4096, in); //Считываем данные. они точно туда влезают
const BYTE **arr = malloc(sizeof(BYTE*));
arr[0] = data;
if (!CryptSignMessage(&SignParams,1,1,arr,&len,NULL,&cbSignature))
{
char buff[33];
int a = GetLastError();
itoa(a,buff,10);
HandleError(buff,0);
HandleError("Unable to get Sign size",1);
}
Далее, собственно, не очень важно.. CryptSignMessage выпадает с ошибкой: 87L (неправильный параметр) Сертификат - один: Код:
# ./certmgr -list
Certmgr 0.9 prerelease (c) "CryptoPro", 2007-2010.
program for managing certificate(CRL) and stores
=============================================================================
1-------
Issuer : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject : CN="ROOTKEY C=RU S=Moscow E=me@mail.ru"
Serial : 0xD59200000200ABA11734
PrivateKey Link: Yes. Container: HDIMAGE\\ROOT.000\06B2
=============================================================================
Контейнер выбирается правильный (проследил) Пробовал делать findcertificate в store (в My по сути) - ничего не меняется Наиболее смущает то, что этот же код под виндой - работает. (нормально все шифрует) Сертификат в сведениях (смотрел под виндой) - написано, что для шифрования и идентификации (вроде то, что нужно) Сертификат делал через крипто-прошный сервис Может ли быть такое, что это из-за того, что не установлен сертификат УЦ (под виндой - все установлено.. + там ключ генерировался не мной + там подписывал сертификат другой УЦ)? Если проблема в этом, то как его установить? или в чем может быть проблема? P.S. Если шифрование поставить выше подписи (CryptEncryptMessage), то шифруется нормально.. но с подписью проблема остается *Цепочка сертификатов и просто отдельно сертификат - в аттаче* Отредактировано пользователем 16 сентября 2010 г. 2:42:13(UTC)
| Причина: Не указана Вложение(я):  321.cer (1kb) загружен 15 раз(а). certnew.p7b (2kb) загружен 16 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|