1219 lines
26 KiB
C
1219 lines
26 KiB
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"))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "RC2", "ECB"))
|
|
{
|
|
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 CFB
|
|
//
|
|
*pData = CRYPT_MODE_CFB;
|
|
|
|
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", "CFB"))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "RC2", "CFB"))
|
|
{
|
|
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 TestRC4(int cArg, CHAR *bbuf, DWORD bsize)
|
|
{
|
|
|
|
//
|
|
// Generate a RC4 key
|
|
//
|
|
|
|
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RC4, 0, &hKey)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptGenKey FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
//
|
|
// Encrypt and Decrypt
|
|
//
|
|
BLen = bsize;
|
|
BLen2 = bsize + 8;
|
|
if (TEncrypt(hKey, 0, TRUE, 0, bbuf, &BLen, BLen2, cArg, "RC4", ""))
|
|
{
|
|
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);
|
|
|
|
}
|
|
|
|
#ifdef TEST_VERSION
|
|
BOOL TestDES(int cArg, CHAR *bbuf, DWORD bsize)
|
|
{
|
|
|
|
//
|
|
// Generate a DES key
|
|
//
|
|
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_DES, 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, "DES", "CBC"))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "DES", "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, "DES", "ECB"))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "DES", "ECB"))
|
|
{
|
|
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 CFB
|
|
//
|
|
*pData = CRYPT_MODE_CFB;
|
|
|
|
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, "DES", "CFB"))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (TDecrypt(hKey, 0, TRUE, 0, bbuf, &BLen, cArg, "DES", "CFB"))
|
|
{
|
|
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);
|
|
|
|
}
|
|
#endif
|
|
|
|
|
|
BOOL TestHash(int cArg, CHAR *bbuf, DWORD bsize)
|
|
{
|
|
|
|
if (cArg > 1)
|
|
printf("Hash, compare with MD4 & MD5 ");
|
|
|
|
BHashLen1 = 50;
|
|
BHashSignLen1 = MAXKEYLEN;
|
|
if (Hash(cArg, bbuf, bsize, pHashData1, &BHashLen1, pHashSignData1,
|
|
&BHashSignLen1, CALG_MD4))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(bbuf, bRanbuf, bsize) != 0)
|
|
{
|
|
printf("Data corrupted check 1 in Hash test\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
BHashLen2 = 50;
|
|
BHashSignLen2 = MAXKEYLEN;
|
|
if (Hash(cArg, bbuf, bsize, pHashData2, &BHashLen2, pHashSignData2,
|
|
&BHashSignLen2, CALG_MD4))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(bbuf, bRanbuf, bsize) != 0)
|
|
{
|
|
printf("Data corrupted check 2 in Hash test\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (BHashLen1 != BHashLen2)
|
|
{
|
|
printf("Hash lengths don't match MD4 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(pHashData1, pHashData2, BHashLen1) != 0)
|
|
{
|
|
printf("Hash data doesn't compare MD4 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (BHashSignLen1 != BHashSignLen2)
|
|
{
|
|
printf("Hash signatures lengths don't match MD4 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(pHashSignData1, pHashSignData2, BHashLen1) != 0)
|
|
{
|
|
printf("Hash signature data doesn't compare MD4 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
BHashLen1 = 50;
|
|
BHashSignLen1 = MAXKEYLEN;
|
|
if (Hash(cArg, bbuf, bsize, pHashData1, &BHashLen1, pHashSignData1,
|
|
&BHashSignLen1, CALG_MD5))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(bbuf, bRanbuf, bsize) != 0)
|
|
{
|
|
printf("Data corrupted check 3 in Hash test\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
BHashLen2 = 50;
|
|
BHashSignLen2 = MAXKEYLEN;
|
|
if (Hash(cArg, bbuf, bsize, pHashData2, &BHashLen2, pHashSignData2,
|
|
&BHashSignLen2, CALG_MD5))
|
|
{
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(bbuf, bRanbuf, bsize) != 0)
|
|
{
|
|
printf("Data corrupted check 4 in Hash test\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (BHashLen1 != BHashLen2)
|
|
{
|
|
printf("Hash lengths don't match MD5 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(pHashData1, pHashData2, BHashLen1) != 0)
|
|
{
|
|
printf("Hash data doesn't compare MD5 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (BHashSignLen1 != BHashSignLen2)
|
|
{
|
|
printf("Hash signatures lengths don't match MD5 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (memcmp(pHashSignData1, pHashSignData2, BHashSignLen1) != 0)
|
|
{
|
|
printf("Hash signature data doesn't compare MD5 FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (cArg > 1)
|
|
printf("SUCCEED\n");
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
BOOL Hash(int cArg, CHAR *bbuf, DWORD bsize, BYTE *pHashOut,
|
|
DWORD *pHashLenOut, BYTE *pSigData, DWORD *pdwSigLen, DWORD Algid)
|
|
{
|
|
|
|
if (RCRYPT_FAILED(CryptCreateHash(hMe, Algid, 0, 0, &hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptCreateHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptCreateHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptHashData(hHash, bbuf, bsize, 0)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptUpDataHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptHashData FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptSignHash(hHash, AT_SIGNATURE, 0, 0, pSigData,
|
|
pdwSigLen)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptSignHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptSignHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptDestroyHash(hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptDestroyHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptDestroyHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptCreateHash(hMe, Algid, 0, 0, &hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptCreateHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptCreateHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptHashData(hHash, bbuf, bsize, 0)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptUpDataHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptHashData FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_SIGNATURE, &hKey2)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("cguk failed = %x", GetLastError());
|
|
else
|
|
printf("CryptGetUserKey FAIL\n");
|
|
return (TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptVerifySignature(hHash, pSigData, *pdwSigLen,
|
|
hKey2, 0, 0)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptVerifySignature failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptVerifySignature FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
if (RCRYPT_FAILED(CryptDestroyKey(hKey2)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptDestroyKey failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptDestroyKey FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptDestroyHash(hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptDestroyHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptDestroyHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptCreateHash(hMe, Algid, 0, 0, &hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptCreateHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptCreateHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptHashData(hHash, bbuf, bsize, 0)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptUpDataHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptHashData FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptGetHashParam(hHash, HP_HASHVAL, pHashOut,
|
|
pHashLenOut, 0)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptGetHashParam failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptGetHashParam FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
if (RCRYPT_FAILED(CryptDestroyHash(hHash)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptDestroyHash failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptDestroyHash FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
BOOL Logon(int cArg)
|
|
{
|
|
|
|
strcpy(pszMyName, "stress");
|
|
|
|
if (cArg > 1)
|
|
printf("CryptAcquireContext ");
|
|
|
|
if (RCRYPT_FAILED(CryptAcquireContext(&hMe, pszMyName,
|
|
MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("FAIL Error = %x\n", GetLastError());
|
|
return(TRUE);
|
|
}
|
|
else
|
|
{
|
|
if (cArg > 1)
|
|
printf("SUCCEED\n");
|
|
}
|
|
|
|
if (cArg > 1)
|
|
printf("CryptGenKeys ");
|
|
|
|
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RSA_SIGN,
|
|
CRYPT_EXPORTABLE, &hClientKey)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("FAIL Error = %x\n", GetLastError());
|
|
return(TRUE);
|
|
}
|
|
|
|
CryptDestroyKey(hClientKey);
|
|
|
|
if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RSA_KEYX,
|
|
CRYPT_EXPORTABLE, &hClientKey)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("FAIL Error = %x\n", GetLastError());
|
|
return(TRUE);
|
|
}
|
|
if (cArg > 1)
|
|
printf("SUCCEED\n");
|
|
|
|
CryptDestroyKey(hClientKey);
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL TEncrypt(HCRYPTKEY hTKey, HCRYPTHASH hTHash, BOOL FinalFlag,
|
|
DWORD dwFlags, BYTE *Tbuf, DWORD *pBLen, DWORD pdwBufLen,
|
|
int cArg, CHAR *szAlgid, CHAR *szmode)
|
|
{
|
|
if (cArg > 1)
|
|
printf("CryptEncrypt %s-%s ", szAlgid, szmode);
|
|
if (RCRYPT_FAILED(CryptEncrypt(hTKey, hTHash, FinalFlag, dwFlags,
|
|
Tbuf, pBLen, pdwBufLen)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptEncrypt FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
if (cArg > 1)
|
|
printf("SUCCEED\n");
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
BOOL TDecrypt(HCRYPTKEY hTKey, HCRYPTHASH hTHash, BOOL FinalFlag,
|
|
DWORD dwFlags, BYTE *Tbuf, DWORD *pBLen, int cArg,
|
|
CHAR *szAlgid, CHAR *szmode)
|
|
{
|
|
|
|
if (cArg > 1)
|
|
printf("CryptDecrypt %s-%s ", szAlgid, szmode);
|
|
if (RCRYPT_FAILED(CryptDecrypt(hTKey, hTHash, FinalFlag, dwFlags,
|
|
Tbuf, pBLen)))
|
|
{
|
|
if (cArg > 1)
|
|
printf("failed = %x\n", GetLastError());
|
|
else
|
|
printf("CryptDecrypt FAIL\n");
|
|
return(TRUE);
|
|
}
|
|
if (cArg > 1)
|
|
printf("SUCCEED\n");
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|