/*
 * dlls/advapi32/crypt.c
 */
#include <time.h>
#include <stdlib.h>

#include "windef.h"
#include "winerror.h"
#include "wincrypt.h"
#include "debugtools.h"

DEFAULT_DEBUG_CHANNEL(advapi);

/******************************************************************************
 * CryptAcquireContextA (ADVAPI32.@)
 * Acquire a crypto provider context handle.
 * 
 * PARAMS
 * phProv: Pointer to HCRYPTPROV for the output.
 * pszContainer: FIXME (unknown)
 * pszProvider: FIXME (unknown)
 * dwProvType: Crypto provider type to get a handle.
 * dwFlags: flags for the operation
 *
 * RETURNS TRUE on success, FALSE on failure.
 */

BOOL WINAPI
CryptAcquireContextA( HCRYPTPROV *phProv, LPCSTR pszContainer,
		      LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
{
    FIXME("(%p, %s, %s, %ld, %08lx): stub!\n", phProv, pszContainer,
	  pszProvider, dwProvType, dwFlags);
    return FALSE;
}

/******************************************************************************
 * CryptSetKeyParam (ADVAPI32.@)
 */
BOOL WINAPI
CryptSetKeyParam( HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
{
    FIXME("(%lx, %lx, %p, %lx): stub!\n", hKey, dwParam, pbData, dwFlags);
    return FALSE;
}


/******************************************************************************
 * CryptGenRandom (ADVAPI32.@)
 */
BOOL WINAPI
CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
{
   DWORD i;

   FIXME("(0x%lx, %ld, %p): stub!\n", hProv, dwLen, pbBuffer);
   /*
    FIXME: Currently this function is just a stub, it is missing functionality in 
           the following (major) ways:
      (1) It makes no use of the passed in HCRYPTPROV handle. (ie. it doesn't
          use a cryptographic service provider (CSP)
      (2) It doesn't use the values in the passed in pbBuffer to further randomize
          its internal seed.
      (3) MSDN mentions that this function produces "cryptographically random"
          data, which is "... far more random than the data generated by the typical
          random number generator such as the one shipped with your C compiler".
          We are currently using the C runtime rand() function. ^_^

      See MSDN documentation for CryptGenRandom for more information.
    */

   if (dwLen <= 0)
      return FALSE; 
  
   srand(time(NULL));
   for (i=0; i<dwLen; i++)
   {
      *pbBuffer = (BYTE)(rand() % 256);
      pbBuffer++;
   }

   return TRUE;
}


/******************************************************************************
 * CryptReleaseContext (ADVAPI32.@)
 */
BOOL WINAPI
CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags)
{
   FIXME("(0x%lx, 0x%lx): stub!\n", hProv, dwFlags);
   return FALSE;
}
