Refactor project structure
This commit is contained in:
66
core/anslicensing/rand.cpp
Normal file
66
core/anslicensing/rand.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include "precomp.h"
|
||||
|
||||
#include "bigint.h"
|
||||
#include "rand.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
random::random()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if ( !CryptAcquireContext( (HCRYPTPROV *)&m_hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) )
|
||||
m_hCryptProv = NULL;
|
||||
#else
|
||||
::srand(time(NULL));
|
||||
#endif
|
||||
}
|
||||
|
||||
random::~random()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if ( m_hCryptProv )
|
||||
CryptReleaseContext( (HCRYPTPROV)m_hCryptProv, 0L );
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned random::rand( unsigned max )
|
||||
{
|
||||
unsigned rnd;
|
||||
|
||||
#ifdef _WIN32
|
||||
if ( m_hCryptProv )
|
||||
CryptGenRandom( (HCRYPTPROV)m_hCryptProv, sizeof( unsigned ), (BYTE *)&rnd );
|
||||
#else
|
||||
rnd = ::rand();
|
||||
#endif
|
||||
|
||||
return rnd % max;
|
||||
}
|
||||
|
||||
bigint random::rand( bigint & max )
|
||||
{
|
||||
unsigned n = ( max.bits() + ( ( sizeof( unsigned ) << 3 ) - 1 ) ) / ( sizeof( unsigned ) << 3 );
|
||||
unsigned * buf = (unsigned*)malloc(n * sizeof(unsigned));
|
||||
if ( !buf ) return max - 1;
|
||||
|
||||
bigint rnd;
|
||||
|
||||
#ifdef _WIN32
|
||||
if ( m_hCryptProv )
|
||||
CryptGenRandom( (HCRYPTPROV)m_hCryptProv, n * sizeof( unsigned ), (BYTE *)buf );
|
||||
#else
|
||||
for (unsigned i = 0; i < n; i++)
|
||||
*((unsigned *)buf + i) = ::rand();
|
||||
#endif
|
||||
|
||||
rnd.load( buf, n );
|
||||
|
||||
free(buf);
|
||||
|
||||
return rnd % max;
|
||||
}
|
||||
Reference in New Issue
Block a user