Home
> Uncategorized > Arrrgh….
Arrrgh….
Im gonna fix this certificate thing once and for all. Porting this crap to Delphi ASAP!
// Sign void Sign(wchar_t * SignerName, wchar_t * DataFileName, wchar_t * SignatureFileName) { // Variables HCERTSTORE hStoreHandle = NULL; PCCERT_CONTEXT pSignerCert = NULL; HCRYPTPROV hCryptProv = NULL; DWORD dwKeySpec = 0; HCRYPTHASH hHash = NULL; HANDLE hDataFile = NULL; BOOL bResult = FALSE; BYTE rgbFile[BUFSIZE]; DWORD cbRead = 0; DWORD dwSigLen = 0; BYTE * pbSignature = NULL; HANDLE hSignatureFile = NULL; DWORD lpNumberOfBytesWritten = 0; wprintf(L"SIGNING\n\n"); // Open the certificate store. hStoreHandle = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, CERT_PERSONAL_STORE_NAME ); CheckError((BOOL)hStoreHandle, L"CertOpenStore....................... "); // Get signer's certificate with access to private key. do { // Get a certificate that matches the search criteria pSignerCert = CertFindCertificateInStore( hStoreHandle, MY_TYPE, 0, CERT_FIND_SUBJECT_STR, SignerName, pSignerCert ); CheckError((BOOL)pSignerCert, L"CertFindCertificateInStore.......... "); // Get the CSP, and check if we can sign with the private key bResult = CryptAcquireCertificatePrivateKey( pSignerCert, 0, NULL, &hCryptProv, &dwKeySpec, NULL ); CheckError(bResult, L"CryptAcquireCertificatePrivateKey... "); } while ((dwKeySpec & AT_SIGNATURE) != AT_SIGNATURE); // Create the hash object. bResult = CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash ); CheckError(bResult, L"CryptCreateHash..................... "); // Open the file with the content to be signed hDataFile = CreateFileW(DataFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); CheckError((hDataFile != INVALID_HANDLE_VALUE), L"CreateFile.......................... "); // Compute the cryptographic hash of the data. while (bResult = ReadFile(hDataFile, rgbFile, BUFSIZE, &cbRead, NULL)) { if (cbRead == 0) { break; } CheckError(bResult, L"ReadFile............................ "); bResult = CryptHashData( hHash, rgbFile, cbRead, 0 ); CheckError(bResult, L"CryptHashData....................... "); } CheckError(bResult, L"ReadFile............................ "); // Sign the hash object dwSigLen = 0; bResult = CryptSignHash( hHash, AT_SIGNATURE, NULL, 0, NULL, &dwSigLen ); CheckError(bResult, L"CryptSignHash....................... "); pbSignature = (BYTE *)malloc(dwSigLen); CheckError((BOOL)pbSignature, L"malloc.............................. "); bResult = CryptSignHash( hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen ); CheckError(bResult, L"CryptSignHash....................... "); // Create a file to save the signature hSignatureFile = CreateFileW( SignatureFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); CheckError((hSignatureFile != INVALID_HANDLE_VALUE), L"CreateFile.......................... "); // Write the signature to the file bResult = WriteFile( hSignatureFile, (LPCVOID)pbSignature, dwSigLen, &lpNumberOfBytesWritten, NULL ); CheckError(bResult, L"WriteFile........................... "); // Clean up and free memory. free(pbSignature); CloseHandle(hDataFile); CloseHandle(hSignatureFile); bResult = CryptDestroyHash(hHash); CheckError(bResult, L"CryptDestroyHash.................... "); bResult = CertFreeCertificateContext(pSignerCert); CheckError(bResult, L"CertFreeCertificateContext.......... "); bResult = CertCloseStore( hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG ); CheckError(bResult, L"CertCloseStore...................... "); } // End of Sign
Comments (0)
Trackbacks (0)
Leave a comment
Trackback