Files
Sun1602/Server/AuthSystem/MatrixLib/src/random.cpp
T
2022-10-26 12:25:11 +08:00

62 lines
1.5 KiB
C++

//====================================================
//
// matrix.c / Generate Matrix Card
//
// Copyright by The9 Corp. 2007.2
//
//====================================================
#include "../include/main.h"
#include "../include/SHA1.h"
extern void SHA1_Prepare();
extern void SHA1_ProcessVoidSizet(const void* buffer, size_t size);
extern void SHA1_Finish(SHA1_Digest digest);
extern void SHA1_HashDigestVoidSizet(SHA1_Digest *digest, const void *data, size_t size);
void Random_Process();
typedef SHA1_Digest DIGEST;
static size_t m_used;
static DIGEST m_data;
static DIGEST m_key0;
static DIGEST m_key1;
//------------------------------------------------------------------------------
void Random_Init(const unsigned char data[], size_t size)
{
const unsigned char* d = (const unsigned char*)data;
SHA1_HashDigestVoidSizet(&m_key0, d, size / 2);
memset(&m_data, 0, sizeof (m_data));
SHA1_HashDigestVoidSizet(&m_key1, d + (size / 2), size - (size / 2));
Random_Process();
}
void Random_Read(unsigned long data[], size_t size)
{
size_t i;
for (i = 0; i < size; i++)
{
if (m_used == sizeof (m_data))
{
Random_Process();
}
((unsigned char *)(data))[i]= m_data[m_used++];
}
}
void Random_Process()
{
SHA1_Prepare();
SHA1_ProcessVoidSizet(m_key0, SHA1_SIZE);
SHA1_ProcessVoidSizet(m_data, SHA1_SIZE);
SHA1_ProcessVoidSizet(m_key1, SHA1_SIZE);
SHA1_Finish(m_data);
m_used = 0;
}