Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1994-1998 Microsoft Corporation
Module Name:
tssec.c
Abstract:
Contains code that generates random keys.
Author:
Madan Appiah (madana) 1-Jan-1998 Modified by Nadim Abdo 31-Aug-2001 to use system RNG
Environment:
User Mode - Win32
Revision History:
--*/
#include <seccom.h>
#include <stdlib.h>
#ifdef OS_WINCE
#include <rng.h>
#endif
#ifndef OS_WINCE
#include <randlib.h>
#endif
VOID TSRNG_Initialize( ) { #ifndef OS_WINCE
InitializeRNG(NULL); #else
TSInitializeRNG(); #endif
}
VOID TSRNG_Shutdown( ) { #ifndef OS_WINCE
ShutdownRNG(NULL); #endif
}
//
// function definitions
//
BOOL TSRNG_GenerateRandomBits( LPBYTE pbRandomBits, DWORD cbLen ) /*++
Routine Description:
This function returns random bits
Arguments:
pbRandomBits - pointer to a buffer where a random key is returned.
cbLen - length of the random key required.
Return Value:
TRUE - if a random key is generated successfully. FALSE - otherwise.
--*/ { #ifndef OS_WINCE
BOOL fRet; fRet = NewGenRandom(NULL, NULL, pbRandomBits, cbLen);
return fRet; #else
GenerateRandomBits(pbRandomBits, cbLen); return( TRUE ); #endif
}
BOOL TSCAPI_GenerateRandomBits( LPBYTE pbRandomBits, DWORD cbLen ) /*++
Routine Description:
This function generates random number using CAPI in user mode
Arguments:
pbRandomBits - pointer to a buffer where a random key is returned.
cbLen - length of the random key required.
Return Value:
TRUE - if a random number is generated successfully. FALSE - otherwise.
--*/ { HCRYPTPROV hProv; BOOL rc = FALSE; DWORD dwExtraFlags = CRYPT_VERIFYCONTEXT; DWORD dwError;
// Get handle to the default provider.
if(!CryptAcquireContext(&hProv, NULL, 0, PROV_RSA_FULL, dwExtraFlags)) {
// Could not acquire a crypt context, get the reason of failure
dwError = GetLastError();
// If we get this error, it means the caller is impersonating a user (in Remote Assistance)
// we revert back to the old way of generating random bits
if (dwError == ERROR_FILE_NOT_FOUND) { rc = TSRNG_GenerateRandomBits(pbRandomBits, cbLen); goto done; }
// Since default keyset should always exist, we can't hit this code path
if (dwError == NTE_BAD_KEYSET) { //
//create a new keyset
//
if(!CryptAcquireContext(&hProv, NULL, 0, PROV_RSA_FULL, dwExtraFlags | CRYPT_NEWKEYSET)) { //printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done; } } else { goto done; } } if (CryptGenRandom(hProv, cbLen, pbRandomBits)) { rc = TRUE; }
CryptReleaseContext(hProv, 0);
done: return rc; }
|