Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.05.2014(UTC) Сообщений: 35 Откуда: Москва Сказал(а) «Спасибо»: 2 раз
|
Вот код который отвечает за подпись Код: byte[] cert = Convert.FromBase64String(certbase64);
var nutil = new Crypt32();
if (!nutil.LoadAdminCertificate(AdminCertSerial))
throw new ApplicationException("Unable load admin certificate, serial:" + AdminCertSerial);
var revokeRequest = nutil.GetHoldRequest(cert, (uint) period);
byte[] s = Encoding.Unicode.GetBytes(revokeRequest);
byte[] s1 = Encoding.Default.GetBytes(revokeRequest);
byte[] signedData = nutil.DataSign(s, false, false);
var signedBase64 = Convert.ToBase64String(signedData);
var revokeClient = new RevokeRequestSoapPortClient("RevokeRequestSoapPort");
if (revokeClient.ClientCredentials != null)
revokeClient.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser,
StoreName.My, X509FindType.FindBySerialNumber, AdminCertSerial);
return revokeClient.SubmitHoldRequest(signedBase64);
Код:String^ Crypt32::GetHoldRequest(array<unsigned char>^ certificateBinary, unsigned int period)
{
//CString csTemp;
DWORD dwReason = CRL_REASON_CERTIFICATE_HOLD;
UCHAR* chEncodinCert = new UCHAR[certificateBinary->Length];
for (int i = 0; i < certificateBinary->Length; i++)
chEncodinCert[i] = certificateBinary[i];
//Создадим контекст сертификата
PCCERT_CONTEXT pCert=CertCreateCertificateContext(X509_ASN_ENCODING, chEncodinCert,certificateBinary->Length);
//Получим номер сертификата
Text::StringBuilder^ sb = gcnew Text::StringBuilder();
for (DWORD i=0;i<pCert->pCertInfo->SerialNumber.cbData;i++)
{
int t = pCert->pCertInfo->SerialNumber.pbData[pCert->pCertInfo->SerialNumber.cbData-i-1];
sb->Append(t.ToString("X2"));
}
CertFreeCertificateContext(pCert);
return String::Format("SN={0}, RR={1}, RC={2}, HD=0-0-0-{3}-0-0",sb->ToString(),dwReason,"Hold with hgg",period);
}
Код: bool Crypt32::CreateDataSign(std::string algorithmPublicKey, unsigned char *pchData,DWORD dwLenData,unsigned char **pchSign, DWORD *pdwLenSign, BOOL bSignDetach, bool bIncludeCert)
{
if (!_adminCertLoaded)
throw gcnew ApplicationException("Admin certificate not found");
//Получить подпись от некотрых данных
// Создаем и заполняем структуру для создания ц.п.
CRYPT_SIGN_MESSAGE_PARA SigParams;
std::string csAlgIDHash = "";
if (algorithmPublicKey == szOID_CP_GOST_R3410EL) // ГОСТ
csAlgIDHash = szOID_CP_GOST_R3411;
else if (algorithmPublicKey == szOID_RSA_RSA) // RSA
csAlgIDHash = szOID_RSA_SHA1RSA;
else
csAlgIDHash = szOID_CP_GOST_R3411; // По умолчанию ГОСТ
csAlgIDHash = szOID_CP_GOST_R3411_2001;
PCCERT_CONTEXT p = _certificateContext;
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SigParams.pSigningCert = _certificateContext;
SigParams.HashAlgorithm.pszObjId = (LPSTR)csAlgIDHash.c_str(); //szOID_CP_GOST_R3411;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = bIncludeCert ? 1 : 0;
SigParams.rgpMsgCert = bIncludeCert ? &(p) : NULL;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
const BYTE* MessageArray[] = {(UCHAR*)pchData};
DWORD MessageSizeArray[1];
MessageSizeArray[0] = dwLenData;
// Получаем длину буфера подписи
if(!CryptSignMessage(
&SigParams, // указатель на SigParams
bSignDetach, // подпись создается отдельно
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
NULL, // буфер для подписи (UCHAR*)*pchSign
pdwLenSign)) // размер буфера
{
DWORD dwError=GetLastError();
free(*pchSign);
return false;
}
// выделяем память под подпись
*pchSign = new BYTE[*pdwLenSign];
if(*pchSign==NULL)
{
return false;
}
// формируем подпись
if(!CryptSignMessage(
&SigParams, // указатель на SigParams
bSignDetach, // подпись создается отдельно
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
*pchSign, // буфер для подписи
pdwLenSign)) // размер буфера
{
delete [] *pchSign;
return false;
}
return true;
}
Отредактировано пользователем 3 июня 2014 г. 11:07:18(UTC)
| Причина: Не указана
|