#undef UNICODE					// ## Not Yet
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <windows.h>
#include <wincrypt.h>

CHAR			pszMyName[64];
HCRYPTKEY		hClientKey;
HCRYPTPROV		hMe;
HCRYPTKEY		hKey2;

BOOL Logon(int cArg);

int __cdecl main(int cArg, char *rgszArg[])
{

        // Logon to provider
	if (!Logon(cArg))
	    goto exit;

exit:
    return(0);

}

BOOL Logon(int cArg)
{
	HCRYPTKEY	hTestKey;

	pszMyName[0] = 0;

	if (RCRYPT_FAILED(CryptAcquireContext(&hMe, pszMyName, MS_DEF_PROV,
                          PROV_RSA_FULL, 0)))
	{
            if (cArg > 1)
		printf("\nUser doesn't exists, try to create it	");

	    if (RCRYPT_FAILED(CryptAcquireContext(&hMe, pszMyName,
                              MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)))
            {
	        if (cArg > 1)
                    printf("FAIL Error = %x\n", GetLastError());
                return(FALSE);
	    }
	    else
	    {
	    if (cArg > 1)
                printf("SUCCEED\n");
            }
        }
	else
        {
            if (cArg > 1)
		printf("CryptAcquireContext for user: %s\n", pszMyName);
        }

	
	if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_SIGNATURE, &hTestKey)))
	{

            if (cArg > 1)
                printf("Create signature key for %s:	", pszMyName);
    
	    if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RSA_SIGN,
                                          CRYPT_EXPORTABLE, &hClientKey)))
	    {
	        if (cArg > 1)
                    printf("FAIL Error = %x\n", GetLastError());
	        return(FALSE);
	    }
	    if (cArg > 1)
                printf("SUCCEED\n");
        }
	else
		CryptDestroyKey(hTestKey);
		
	if (RCRYPT_FAILED(CryptGetUserKey(hMe, AT_KEYEXCHANGE, &hTestKey)))
	{
            if (cArg > 1 )
                printf("Create key exchange for %s:		", pszMyName);

	    if (RCRYPT_FAILED(CryptGenKey(hMe, CALG_RSA_KEYX,
                                          CRYPT_EXPORTABLE, &hKey2)))
	    {
	        if (cArg > 1)
                    printf("FAIL Error = %x\n", GetLastError());
	        return(FALSE);
	    }
            if (cArg > 1)
                printf("SUCCEED\n");
        }
	else
		CryptDestroyKey(hTestKey);

        if (cArg > 1)
            printf("Init completed\n");

	return(TRUE);
       
}