rand.c

来自「Linux下的飞鸽传书」· C语言 代码 · 共 79 行

C
79
字号
/* *  Copyright (C) 2006 Takeharu KATO * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifdef HAVE_CONFIG_H#  include <config.h>#endif#include <stdlib.h>#include <string.h>#include <errno.h>#include <glib.h>#include <openssl/rand.h>#include "common.h"static intcheck_random_seed(void){  int rc;  unsigned short seed_in;  int retry;#if defined(HAVE_RAND_POLL)  RAND_poll();#endif  /*  HAVE_RAND_POLL  */  for (rc=RAND_status(),retry=CRYPT_RND_MAX_RETRY;(!rc)&&(retry);rc=RAND_status(),--retry) {    seed_in = rand() & 0xffff;          RAND_seed(&seed_in, sizeof(seed_in));  }  rc = (rc)?(0):(-EBUSY);  return rc;}int add_timing_entropy(void) {  /*  FIXME add implementation */}intgenerate_rand(unsigned char *buf,size_t len){  int rc=-EAGAIN;  int retry=CRYPT_RND_MAX_RETRY;  if (check_random_seed()) {    err_out("Can not seed random\n");    g_assert_not_reached();  }  do{    memset(buf,0,len);        rc = RAND_bytes(buf,len);    if (rc == 1) {      rc=0;      break;    }  }while( (rc) && (retry) );  return rc;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?