rand_t * rand_open(void) { int i; rand_t *r; u_char seed[256]; #if (VOS_WIN32 == VOS_OS_VER) HCRYPTPROV hcrypt = 0; CryptAcquireContext(&hcrypt, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); CryptGenRandom(hcrypt, sizeof(seed), seed); CryptReleaseContext(hcrypt, 0); #elif ((VOS_VXWORKS == VOS_OS_VER)||(VOS_RTOSCK == VOS_OS_VER)) for (i = 0; i < 256; i++) { seed[i] = VOS_Rand(0xff); } #else struct timeval *tv = (struct timeval *)seed; int fd; if ((fd = open("/dev/arandom", O_RDONLY)) != -1 || (fd = open("/dev/urandom", O_RDONLY)) != -1) { read(fd, seed + sizeof(*tv), sizeof(seed) - sizeof(*tv)); close(fd); } gettimeofday(tv, NULL); #endif if ((r = malloc(sizeof(*r))) != NULL) { for (i = 0; i < 256; i++) r->s[i] = i; r->i = r->j = 0; rand_addrandom(r, seed, 128); rand_addrandom(r, seed + 128, 128); r->tmp = NULL; r->tmplen = 0; } return (r); }
BST_INT32 RAND_poll( BST_VOID ) { BST_UINT32 ulRnd; BST_UINT32 i; ulRnd = 0; BST_UINT8 ucBuf[ENTROPY_NEEDED]; for ( i = 0; i < BST_OS_SIZEOF(ucBuf); i++ ) { if ( 0 == (i % 4) ) { ulRnd = VOS_Rand(0xff);/*此处调用rtos平台的随机数生成函数*/ } ucBuf[i] = ulRnd; ulRnd >>= 8; } RAND_add( ucBuf, BST_OS_SIZEOF(ucBuf), (double)ENTROPY_NEEDED ); BST_OS_MEMSET( ucBuf, 0, BST_OS_SIZEOF(ucBuf) ); return 1; }