Exemplo n.º 1
0
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;
}