📄 random.cpp
字号:
#include "random.h"#include "sha1.h"#include <stdlib.h>#include <string.h>char random_cpp[]="$Id: random.cpp,v 1.3 2002/10/29 07:11:46 crypt Rel-1.6-3 $";RNGRESULT SHA1RandomAllocate( sSHA1Random **sRandom ){ *sRandom = ( sSHA1Random * ) malloc( sizeof ( sSHA1Random ) ); if ( *sRandom == 0 ) return RNG_MALLOC_ERROR; SHA1RandomInit( *sRandom ); return RNG_OK;}void SHA1RandomInit( sSHA1Random *sRandom ){ memset( sRandom , 0 , sizeof ( *sRandom ) );}void SHA1RandomUpdate( sSHA1Random *sRandom , byte *seedBuffer , int seedBufferSize ){ SHA1Context *SHA_ctx; SHA1Allocate( (void**)&SHA_ctx ); memset( sRandom , 0 , sizeof ( *sRandom ) ); SHA1Init( SHA_ctx , 0 , 0 ); SHA1Process( SHA_ctx , seedBuffer , seedBufferSize ); SHA1Final( SHA_ctx , sRandom->state ); SHA1Free( (void**)&SHA_ctx ); }//// SHA1RandomUpdateEx...// Main difference is, it uses SHA1Process with current sRandom->state.//void SHA1RandomUpdateEx( sSHA1Random *sRandom , byte *seedBuffer , int seedBufferSize ){ SHA1Context *SHA_ctx; SHA1Allocate( (void**)&SHA_ctx ); SHA1Init( SHA_ctx , 0 , 0 ); SHA1Process( SHA_ctx , sRandom->state , sizeof( sRandom->state ) ); SHA1Process( SHA_ctx , seedBuffer , seedBufferSize ); SHA1Final( SHA_ctx , sRandom->state ); SHA1Free( (void**)&SHA_ctx ); }static void SHA1RandomReGenerate ( sSHA1Random *sRandom ){ int i; SHA1Context *SHA_ctx;/* Generate new data */ SHA1Allocate( (void**)&SHA_ctx ); SHA1Init( SHA_ctx , 0 , 0 ); SHA1Process( SHA_ctx , sRandom->state , sizeof(sRandom->state) ); SHA1Final( SHA_ctx, sRandom->data ); /* FinalDigest array must be >= 20 bytes */ SHA1Free( (void**)&SHA_ctx );/* Increment current state */ for (i = sizeof(sRandom->state) ; i-- ; ) if (sRandom->state[i]++) break; sRandom->residue = sizeof( sRandom->data );}void SHA1RandomGenerateBytes( sSHA1Random *sRandom, unsigned char *buffer , unsigned int bufferSize){ while ( bufferSize > sRandom->residue ) { memcpy( buffer , &( sRandom->data[ sizeof(sRandom->data) - sRandom->residue ] ), sRandom->residue ); bufferSize -= sRandom->residue; buffer += sRandom->residue; SHA1RandomReGenerate( sRandom ); } memcpy( buffer , & ( sRandom->data[ sizeof(sRandom->data) - sRandom->residue ] ), bufferSize ); sRandom->residue -= bufferSize;}void SHA1RandomFinal( sSHA1Random **sRandom ){ free( *sRandom ); *sRandom = 0;}extern "C" RNGRESULT SHA1RandomGenerate( byte *byteBuffer , size_t byteBufferSize , byte *seedBuffer , size_t seedBufferSize ){ sSHA1Random *sRandom; RNGRESULT result; result = SHA1RandomAllocate ( &sRandom ); if ( result != RNG_OK ) return result; SHA1RandomInit( sRandom ); SHA1RandomUpdate( sRandom , seedBuffer , seedBufferSize ); SHA1RandomGenerateBytes( sRandom , byteBuffer , byteBufferSize ); SHA1RandomFinal ( &sRandom ); return RNG_OK;}void SHA1RandomGenerateBytesEx( sSHA1Random *sRandom, byte *buffer , size_t bufferSize, byte *seedBuffer , size_t seedBufferSize ){ SHA1RandomUpdate( sRandom , seedBuffer , seedBufferSize ); while ( bufferSize > sRandom->residue ) { memcpy( buffer , & ( sRandom->data[ sizeof(sRandom->data) - sRandom->residue ] ), sRandom->residue ); bufferSize -= sRandom->residue; buffer += sRandom->residue; SHA1RandomReGenerate( sRandom ); SHA1RandomUpdateEx( sRandom , seedBuffer , seedBufferSize ); } memcpy( buffer , & ( sRandom->data[ sizeof(sRandom->data) - sRandom->residue ] ), bufferSize ); sRandom->residue -= bufferSize;}//// Main difference in random generation is,// SHA1RandomGenerateBytesEx does not use // the SHA1RandomReGenerate ( the function simple increments sRandom->state ),// SHA1RandomGenerateBytesEx processes current state first and // then processes all seed again.extern "C" RNGRESULT SHA1RandomGenerateKey( byte *byteBuffer , size_t byteBufferSize , byte *seedBuffer , size_t seedBufferSize ){ sSHA1Random *sRandom; RNGRESULT result; result = SHA1RandomAllocate ( &sRandom ); if ( result != RNG_OK ) return result; SHA1RandomInit( sRandom ); SHA1RandomGenerateBytesEx( sRandom , byteBuffer , byteBufferSize, seedBuffer , seedBufferSize ); SHA1RandomFinal ( &sRandom ); return RNG_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -