📄 stress.c
字号:
#undef UNICODE // ## Not Yet
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <windows.h>
#include <wincrypt.h>
#define NTAG_MULTIPHASE 0x80000000
#define DES_TEST 0x00000008
#define UTILITY_BUF_SIZE 1024
#define UTILITY_BUF_SIZE_2 1050
#define EXPORT_BUFFER_LEN 32768
#define MAXKEYLEN 128
HCRYPTPROV hMe;
CHAR pszMyName[64];
OFSTRUCT ImageInfoBuf;
HFILE hFile;
BYTE buf[UTILITY_BUF_SIZE];
BYTE buf2[UTILITY_BUF_SIZE];
DWORD BLen, BLen2, i;
HCRYPTKEY hKey = 0;
HCRYPTKEY hKey2 = 0;
HCRYPTKEY hMyPubKey;
HCRYPTKEY hClientKey;
WORD wRandomSize;
DWORD dRandom;
BYTE *pTmp;
DWORD count;
BYTE *bRanbuf;
BYTE *bcryptbuf;
DWORD i;
BYTE pData[8];
BYTE pHashData1[50];
DWORD BHashLen1;
BYTE pHashData2[50];
DWORD BHashLen2;
BYTE pHashSignData1[MAXKEYLEN];
DWORD BHashSignLen1;
BYTE pHashSignData2[MAXKEYLEN];
DWORD BHashSignLen2;
HCRYPTHASH hHash = 0;
BOOL Logon(int cArg);
BOOL TEncrypt(HCRYPTKEY hTKey, HCRYPTHASH hTHash, BOOL FinalFlag,
DWORD dwFlags, BYTE *Tbuf, DWORD *pBLen, DWORD pdwBufLen,
int cArg, CHAR *szAlgid, CHAR *szmode);
BOOL TDecrypt(HCRYPTKEY hTKey, HCRYPTHASH hTHash, BOOL FinalFlag,
DWORD dwFlags, BYTE *Tbuf, DWORD *pBLen, int cArg,
CHAR *szAlgid, CHAR *szmode);
BOOL TestRC2(int cArg, CHAR *bbuf, DWORD bsize);
BOOL TestRC4(int cArg, CHAR *bbuf, DWORD bsize);
#ifdef TEST_VERSION
BOOL TestDES(int cArg, CHAR *bbuf, DWORD bsize);
#endif
BOOL TestHash(int cArg, CHAR *bbuf, DWORD bsize);
BOOL TestExchange(int cArg, CHAR *bbuf, DWORD bsize);
BOOL Hash(int cArg, CHAR *bbuf, DWORD bsize, BYTE *pHashOut,
DWORD *pHashLenOut, BYTE *pSigData, DWORD *pdwSigLen, DWORD Algid);
int __cdecl main(int cArg, char *rgszArg[])
{
// Make sure keys don't exist to start
strcpy(pszMyName, "stress");
CryptAcquireContext(&hMe, pszMyName, MS_DEF_PROV, PROV_RSA_FULL,
CRYPT_DELETEKEYSET);
while (TRUE)
{
// Logon to provider
if (Logon(cArg))
exit(0);
pTmp = (BYTE *) &wRandomSize;
while (1)
{
if (RCRYPT_FAILED(CryptGenRandom(hMe, 2, pTmp)))
{
if (cArg > 1)
printf("GenRandom failed = %x\n", GetLastError());
else
printf("FAIL\n");
return(TRUE);
}
if (wRandomSize != 0)
break;
}
dRandom = (DWORD) (wRandomSize + (wRandomSize % 8));
if ((bRanbuf = VirtualAlloc(0, dRandom, MEM_COMMIT |
MEM_RESERVE, PAGE_READWRITE)) == 0)
{
if (cArg > 1)
{
printf("malloc failed = %x\n", GetLastError());
}
else
printf("malloc FAIL\n");
return(TRUE);
}
if (RCRYPT_FAILED(CryptGenRandom(hMe, dRandom, bRanbuf)))
{
if (cArg > 1)
printf("GenRandom failed = %x\n", GetLastError());
else
printf("FAIL\n");
return(TRUE);
}
if ((bcryptbuf = VirtualAlloc(0, dRandom + 8, MEM_COMMIT |
MEM_RESERVE, PAGE_READWRITE)) == 0)
{
if (cArg > 1)
{
printf("malloc failed = %x\n", GetLastError());
}
else
printf("malloc FAIL\n");
return(TRUE);
}
if (cArg > 1)
{
printf("bytes generated %x\n", wRandomSize);
}
memcpy(bcryptbuf, bRanbuf, dRandom);
if (TestRC2(cArg, bcryptbuf, dRandom))
exit(0);
if (TestRC4(cArg, bcryptbuf, dRandom))
exit(0);
#ifdef TEST_VERSION
if (TestDES(cArg, bcryptbuf, dRandom))
exit(0);
#endif
if (TestHash(cArg, bcryptbuf, dRandom))
exit(0);
if (TestExchange(cArg, bcryptbuf, dRandom))
exit(0);
if (VirtualFree(bRanbuf, 0, MEM_RELEASE) != TRUE)
{
if (cArg > 1)
printf("VirtulaFree failed: %x\n", GetLastError());
}
if (VirtualFree(bcryptbuf, 0, MEM_RELEASE) != TRUE)
{
if (cArg > 1)
printf("VirtulaFree failed: %x\n", GetLastError());
}
if (cArg > 1)
printf("CryptReleaseContext ");
if (RCRYPT_FAILED(CryptReleaseContext(hMe, 0)))
{
printf("FAIL Error = %x\n", GetLastError());
return(TRUE);
}
else
if (cArg > 1)
printf("SUCCEED\n");
if (cArg > 1)
printf("CryptAcquireContext Delete ");
strcpy(pszMyName, "stress");
if (RCRYPT_FAILED(CryptAcquireContext(&hMe, pszMyName,
MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET)))
{
if (cArg > 1)
printf("FAIL Error = %x\n", GetLastError());
return(FALSE);
}
else
{
if (cArg > 1)
{
printf("SUCCEED\n");
printf("\n");
}
}
}
exit(0);
}
BOOL TestExchange(int cArg, CHAR *bbuf, DWORD bsize)
{
BYTE ExpBuf[EXPORT_BUFFER_LEN];
BYTE SigBuf[UTILITY_BUF_SIZE];
DWORD ExpBufLen, SigBufLen;
HCRYPTKEY hKey2;
HCRYPTHASH hHash;
PUBLICKEYSTRUC *pPubKey;
RSAPUBKEY *pRSAKey;
//
// Generate a RC4 key
//
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RC4, CRYPT_EXPORTABLE, &hKey)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptGenKey FAIL\n");
return(TRUE);
}
//
// Look for our own exchange key
//
if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_KEYEXCHANGE, &hKey2)))
{
if (cArg > 1)
printf("cguk failed = %x", GetLastError());
else
printf("CryptGetUserKey FAIL\n");
return (TRUE);
}
//
// Export it in PUBLICKEYBLOB form
//
if (cArg > 1)
printf("CryptExportKey (PKB) ");
ExpBufLen = EXPORT_BUFFER_LEN;
if (RCRYPT_FAILED(CryptExportKey(hKey2, 0, PUBLICKEYBLOB, 0,
ExpBuf, &ExpBufLen)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptExportKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
CryptDestroyKey(hKey2);
pPubKey = (PUBLICKEYSTRUC *)ExpBuf;
pRSAKey = (RSAPUBKEY *)(ExpBuf + sizeof(PUBLICKEYSTRUC));
if (pPubKey->aiKeyAlg != CALG_RSA_KEYX)
{
printf("Pub key fails check\n");
return(TRUE);
}
if (pRSAKey->pubexp != 0x10001)
{
printf("RSA key fails check\n");
return(TRUE);
}
//
// Import it in PUBLICKEYBLOB form
//
if (cArg > 1)
printf("CryptImportKey (PKB) ");
if (RCRYPT_FAILED(CryptImportKey(hMe, ExpBuf, ExpBufLen, 0, 0, &hKey2)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptImportKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
//
// Encrypt and Decrypt
//
BLen = bsize;
BLen2 = bsize + 8;
if (TEncrypt(hKey, 0, TRUE, 0, bbuf, &BLen, BLen2, cArg, "RC4", ""))
{
return(TRUE);
}
//
// Export the key in SIMPLEBLOB form
//
if (cArg > 1)
printf("CryptExportKey ");
ExpBufLen = EXPORT_BUFFER_LEN;
if (RCRYPT_FAILED(CryptExportKey(hKey, hKey2, SIMPLEBLOB, 0,
ExpBuf, &ExpBufLen)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptExportKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
//
// Nuke the old key
//
if (RCRYPT_FAILED(CryptDestroyKey(hKey)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyKey FAIL\n");
return(TRUE);
}
if (RCRYPT_FAILED(CryptDestroyKey(hKey2)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyKey FAIL\n");
return(TRUE);
}
//
// Sign the blob with the key exchange key
//
if (cArg > 1)
printf("CryptCreateHash ");
if (RCRYPT_FAILED(CryptCreateHash(hMe, CALG_SHA, 0, 0, &hHash)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptCreateHash FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (cArg > 1)
printf("CryptHashData ");
if (RCRYPT_FAILED(CryptHashData(hHash, ExpBuf, ExpBufLen, 0)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptHashData FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (cArg > 1)
printf("CryptSignHash (KEYX) ");
SigBufLen = UTILITY_BUF_SIZE;
if (RCRYPT_FAILED(CryptSignHash(hHash, AT_KEYEXCHANGE, NULL, 0,
SigBuf, &SigBufLen)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptSignHash FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (RCRYPT_FAILED(CryptDestroyHash(hHash)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyHash FAIL\n");
return(TRUE);
}
if (cArg > 1)
printf("CryptCreateHash ");
if (RCRYPT_FAILED(CryptCreateHash(hMe, CALG_SHA, 0, 0, &hHash)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptCreateHash FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (cArg > 1)
printf("CryptHashData ");
if (RCRYPT_FAILED(CryptHashData(hHash, ExpBuf, ExpBufLen, 0)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptHashData FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_KEYEXCHANGE, &hKey2)))
{
if (cArg > 1)
printf("cguk failed = %x", GetLastError());
else
printf("CryptGetUserKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("CryptVerifySignature (KEYX) ");
if (RCRYPT_FAILED(CryptVerifySignature(hHash, SigBuf, SigBufLen, hKey2,
0, 0)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptVerifySignature FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (RCRYPT_FAILED(CryptDestroyKey(hKey2)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyKey FAIL\n");
return(TRUE);
}
if (RCRYPT_FAILED(CryptDestroyHash(hHash)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyHash FAIL\n");
return(TRUE);
}
if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_KEYEXCHANGE, &hKey2)))
{
if (cArg > 1)
printf("cguk failed = %x", GetLastError());
else
printf("CryptGetUserKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("CryptImportKey ");
if (RCRYPT_FAILED(CryptImportKey(hMe, ExpBuf, ExpBufLen, 0, 0,
&hKey)))
{
if (cArg > 1)
printf("failed = %x", GetLastError());
else
printf("CryptImportKey FAIL\n");
return (TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (RCRYPT_FAILED(CryptDestroyKey(hKey2)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyKey FAIL\n");
return(TRUE);
}
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "RC4", ""))
{
return(TRUE);
}
if (cArg > 1)
printf("Compare data ");
if (memcmp(bbuf, bRanbuf, bsize) != 0)
{
printf("FAIL\n");
return(TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
if (RCRYPT_FAILED(CryptDestroyKey(hKey)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptDestroyKey FAIL\n");
return(TRUE);
}
return(FALSE);
}
BOOL TestRC2(int cArg, CHAR *bbuf, DWORD bsize)
{
//
// Generate a RC2 key
//
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RC2, 0, &hKey)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptGenKey FAIL\n");
return(TRUE);
}
//
// Encrypt and Decrypt using CBC default mode
//
BLen = bsize;
BLen2 = bsize + 8;
if (TEncrypt(hKey, 0, TRUE, 0, bbuf, &BLen, BLen2, cArg, "RC2", "CBC"))
{
return(TRUE);
}
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "RC2", "CBC"))
{
return(TRUE);
}
if (cArg > 1)
printf("Compare data ");
if (memcmp(bbuf, bRanbuf, bsize) != 0)
{
printf("FAIL\n");
return(TRUE);
}
if (cArg > 1)
printf("SUCCEED\n");
//
// Change mode to ECB
//
*pData = CRYPT_MODE_ECB;
if (RCRYPT_FAILED(CryptSetKeyParam(hKey, KP_MODE, pData, 0)))
{
if (cArg > 1)
printf("failed = %x\n", GetLastError());
else
printf("CryptSetKeyParam FAIL\n");
return(TRUE);
}
BLen = bsize;
BLen2 = bsize + 8;
if (TEncrypt(hKey, 0, TRUE, 0, bbuf, &BLen, BLen2, cArg, "RC2", "ECB"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -