?? rand.c
字號:
/* * 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -