I don't think we want to do this yet. RAND_bytes and RAND_pseudo_bytes will not be going away.
On Mon, Apr 21, 2014 at 9:24 PM, Jean-Philippe Ouellet <jean-phili...@ouellet.biz> wrote: > Here's another pass. > > This replaces RAND_{,pseudo_}bytes() calls with equivelant arc4random_buf(3) > calls for apps/ and ssl/ (crypto/ still has a bunch). > > There was one that was commented out (in ssl/s3_pkt.c) which I wasn't sure > about, so I made the accoring transformation and left it commented out. > > Feedback appreciated > > > Index: apps/enc.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/enc.c,v > retrieving revision 1.25 > diff -u -p -r1.25 enc.c > --- apps/enc.c 19 Apr 2014 16:18:22 -0000 1.25 > +++ apps/enc.c 22 Apr 2014 03:19:29 -0000 > @@ -476,8 +476,8 @@ enc_main(int argc, char **argv) > "invalid hex salt > value\n"); > goto end; > } > - } else if (RAND_pseudo_bytes(salt, > sizeof salt) < 0) > - goto end; > + } else > + arc4random_buf(salt, sizeof > salt); > /* > * If -P option then don't bother > * writing > Index: apps/passwd.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/passwd.c,v > retrieving revision 1.14 > diff -u -p -r1.14 passwd.c > --- apps/passwd.c 18 Apr 2014 04:17:16 -0000 1.14 > +++ apps/passwd.c 22 Apr 2014 03:19:29 -0000 > @@ -7,6 +7,7 @@ > #if !defined(OPENSSL_NO_DES) || !defined(NO_MD5CRYPT_1) > > #include <assert.h> > +#include <stdlib.h> > #include <string.h> > > #include "apps.h" > @@ -399,8 +400,7 @@ do_passwd(int passed_salt, char **salt_p > if (*salt_malloc_p == NULL) > goto err; > } > - if (RAND_pseudo_bytes((unsigned char *) *salt_p, 2) < > 0) > - goto err; > + arc4random_buf(*salt_p, 2); > (*salt_p)[0] = cov_2char[(*salt_p)[0] & 0x3f]; /* 6 > bits */ > (*salt_p)[1] = cov_2char[(*salt_p)[1] & 0x3f]; /* 6 > bits */ > (*salt_p)[2] = 0; > @@ -416,8 +416,7 @@ do_passwd(int passed_salt, char **salt_p > if (*salt_malloc_p == NULL) > goto err; > } > - if (RAND_pseudo_bytes((unsigned char *) *salt_p, 8) < > 0) > - goto err; > + arc4random_buf(*salt_p, 8); > > for (i = 0; i < 8; i++) > (*salt_p)[i] = cov_2char[(*salt_p)[i] & > 0x3f]; /* 6 bits */ > Index: apps/rand.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/rand.c,v > retrieving revision 1.14 > diff -u -p -r1.14 rand.c > --- apps/rand.c 18 Apr 2014 19:54:57 -0000 1.14 > +++ apps/rand.c 22 Apr 2014 03:19:29 -0000 > @@ -57,6 +57,7 @@ > > #include <ctype.h> > #include <stdio.h> > +#include <stdlib.h> > #include <string.h> > > #include <openssl/bio.h> > @@ -186,9 +187,7 @@ rand_main(int argc, char **argv) > chunk = num; > if (chunk > (int) sizeof(buf)) > chunk = sizeof buf; > - r = RAND_bytes(buf, chunk); > - if (r <= 0) > - goto err; > + arc4random_buf(buf, chunk); > if (!hex) > BIO_write(out, buf, chunk); > else { > Index: apps/s_cb.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/s_cb.c,v > retrieving revision 1.16 > diff -u -p -r1.16 s_cb.c > --- apps/s_cb.c 18 Apr 2014 14:37:41 -0000 1.16 > +++ apps/s_cb.c 22 Apr 2014 03:19:30 -0000 > @@ -730,11 +730,7 @@ generate_cookie_callback(SSL * ssl, unsi > > /* Initialize a random secret */ > if (!cookie_initialized) { > - if (!RAND_bytes(cookie_secret, COOKIE_SECRET_LENGTH)) { > - BIO_printf(bio_err, > - "error setting random cookie secret\n"); > - return 0; > - } > + arc4random_buf(cookie_secret, COOKIE_SECRET_LENGTH); > cookie_initialized = 1; > } > /* Read peer information */ > Index: apps/s_server.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/s_server.c,v > retrieving revision 1.36 > diff -u -p -r1.36 s_server.c > --- apps/s_server.c 19 Apr 2014 16:46:08 -0000 1.36 > +++ apps/s_server.c 22 Apr 2014 03:19:30 -0000 > @@ -2556,7 +2556,7 @@ generate_session_id(const SSL * ssl, uns > { > unsigned int count = 0; > do { > - RAND_pseudo_bytes(id, *id_len); > + arc4random_buf(id, *id_len); > /* > * Prefix the session_id with the required prefix. NB: If our > * prefix is too long, clip it - but there will be worse > Index: apps/speed.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/speed.c,v > retrieving revision 1.33 > diff -u -p -r1.33 speed.c > --- apps/speed.c 18 Apr 2014 18:01:06 -0000 1.33 > +++ apps/speed.c 22 Apr 2014 03:19:30 -0000 > @@ -1877,7 +1877,7 @@ speed_main(int argc, char **argv) > print_result(D_EVP, j, count, d); > } > } > - RAND_pseudo_bytes(buf, 36); > + arc4random_buf(buf, 36); > #ifndef OPENSSL_NO_RSA > for (j = 0; j < RSA_NUM; j++) { > int ret; > @@ -1951,7 +1951,7 @@ speed_main(int argc, char **argv) > } > #endif > > - RAND_pseudo_bytes(buf, 20); > + arc4random_buf(buf, 20); > #ifndef OPENSSL_NO_DSA > for (j = 0; j < DSA_NUM; j++) { > unsigned int kk; > Index: apps/ts.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/apps/ts.c,v > retrieving revision 1.9 > diff -u -p -r1.9 ts.c > --- apps/ts.c 18 Apr 2014 19:54:57 -0000 1.9 > +++ apps/ts.c 22 Apr 2014 03:19:30 -0000 > @@ -610,8 +610,7 @@ create_nonce(int bits) > /* Generating random byte sequence. */ > if (len > (int) sizeof(buf)) > goto err; > - if (RAND_bytes(buf, len) <= 0) > - goto err; > + arc4random_buf(buf, len); > > /* Find the first non-zero byte and creating ASN1_INTEGER object. */ > for (i = 0; i < len && !buf[i]; ++i); > Index: ssl/d1_clnt.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/d1_clnt.c,v > retrieving revision 1.15 > diff -u -p -r1.15 d1_clnt.c > --- ssl/d1_clnt.c 21 Apr 2014 16:34:43 -0000 1.15 > +++ ssl/d1_clnt.c 22 Apr 2014 03:19:59 -0000 > @@ -114,6 +114,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #ifndef OPENSSL_NO_KRB5 > #include "kssl_lcl.h" > @@ -964,8 +966,7 @@ dtls1_send_client_key_exchange(SSL *s) > > tmp_buf[0] = s->client_version >> 8; > tmp_buf[1] = s->client_version&0xff; > - if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= > 0) > - goto err; > + arc4random_buf(&(tmp_buf[2]), sizeof tmp_buf - 2); > > s->session->master_key_length = sizeof tmp_buf; > > @@ -1087,8 +1088,7 @@ dtls1_send_client_key_exchange(SSL *s) > n += 2; > } > > - if (RAND_bytes(tmp_buf, sizeof tmp_buf) <= 0) > - goto err; > + arc4random_buf(tmp_buf, sizeof tmp_buf); > > /* 20010420 VRS. Tried it this way; failed. > ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); > Index: ssl/d1_enc.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/d1_enc.c,v > retrieving revision 1.3 > diff -u -p -r1.3 d1_enc.c > --- ssl/d1_enc.c 14 Apr 2014 14:16:33 -0000 1.3 > +++ ssl/d1_enc.c 22 Apr 2014 03:19:59 -0000 > @@ -114,6 +114,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #ifndef OPENSSL_NO_COMP > #include <openssl/comp.h> > @@ -159,10 +161,9 @@ dtls1_enc(SSL *s, int send) > /* we can't write into the input stream */ > fprintf(stderr, "%s:%d: rec->data != > rec->input\n", > __FILE__, __LINE__); > - else if (EVP_CIPHER_block_size(ds->cipher) > 1) { > - if (RAND_bytes(rec->input, > EVP_CIPHER_block_size(ds->cipher)) <= 0) > - return -1; > - } > + else if (EVP_CIPHER_block_size(ds->cipher) > 1) > + arc4random_buf(rec->input, > + EVP_CIPHER_block_size(ds->cipher)); > } > } else { > if (EVP_MD_CTX_md(s->read_hash)) { > Index: ssl/d1_pkt.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/d1_pkt.c,v > retrieving revision 1.15 > diff -u -p -r1.15 d1_pkt.c > --- ssl/d1_pkt.c 17 Apr 2014 23:35:40 -0000 1.15 > +++ ssl/d1_pkt.c 22 Apr 2014 03:19:59 -0000 > @@ -114,6 +114,7 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > #include <errno.h> > #include "ssl_locl.h" > #include <openssl/evp.h> > @@ -1522,7 +1523,7 @@ do_dtls1_write(SSL *s, int type, const u > /* ssl3_enc can only have an error on read */ > if (bs) /* bs != 0 in case of CBC */ > { > - RAND_pseudo_bytes(p, bs); > + arc4random_buf(p, bs); > /* master IV and last CBC residue stand for > * the rest of randomness */ > wr->length += bs; > Index: ssl/d1_srvr.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/d1_srvr.c,v > retrieving revision 1.17 > diff -u -p -r1.17 d1_srvr.c > --- ssl/d1_srvr.c 21 Apr 2014 16:34:43 -0000 1.17 > +++ ssl/d1_srvr.c 22 Apr 2014 03:19:59 -0000 > @@ -114,6 +114,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include <openssl/buffer.h> > #include <openssl/rand.h> > @@ -1574,7 +1576,7 @@ dtls1_send_newsession_ticket(SSL *s) > return -1; > } > } else { > - RAND_pseudo_bytes(iv, 16); > + arc4random_buf(iv, 16); > EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, > tctx->tlsext_tick_aes_key, iv); > HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16, > Index: ssl/s23_clnt.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/s23_clnt.c,v > retrieving revision 1.23 > diff -u -p -r1.23 s23_clnt.c > --- ssl/s23_clnt.c 19 Apr 2014 17:07:35 -0000 1.23 > +++ ssl/s23_clnt.c 22 Apr 2014 03:19:59 -0000 > @@ -110,6 +110,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include <openssl/buffer.h> > #include <openssl/rand.h> > @@ -268,9 +270,10 @@ ssl_fill_hello_random(SSL *s, int server > unsigned long Time = (unsigned long)time(NULL); > unsigned char *p = result; > l2n(Time, p); > - return RAND_pseudo_bytes(p, len - 4); > + arc4random_buf(p, len - 4); > } else > - return RAND_pseudo_bytes(result, len); > + arc4random_buf(result, len); > + return 1; > } > > static int > Index: ssl/s3_clnt.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/s3_clnt.c,v > retrieving revision 1.41 > diff -u -p -r1.41 s3_clnt.c > --- ssl/s3_clnt.c 21 Apr 2014 16:34:43 -0000 1.41 > +++ ssl/s3_clnt.c 22 Apr 2014 03:19:59 -0000 > @@ -149,6 +149,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include "kssl_lcl.h" > #include <openssl/buffer.h> > @@ -2035,8 +2037,7 @@ ssl3_send_client_key_exchange(SSL *s) > > tmp_buf[0] = s->client_version >> 8; > tmp_buf[1] = s->client_version & 0xff; > - if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= > 0) > - goto err; > + arc4random_buf(&(tmp_buf[2]), sizeof tmp_buf - 2); > > s->session->master_key_length = sizeof tmp_buf; > > @@ -2160,8 +2161,7 @@ ssl3_send_client_key_exchange(SSL *s) > > tmp_buf[0] = s->client_version >> 8; > tmp_buf[1] = s->client_version&0xff; > - if (RAND_bytes(&(tmp_buf[2]), sizeof tmp_buf - 2) <= > 0) > - goto err; > + arc4random_buf(&(tmp_buf[2]), sizeof tmp_buf - 2); > > /* 20010420 VRS. Tried it this way; failed. > ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL); > @@ -2457,7 +2457,7 @@ ssl3_send_client_key_exchange(SSL *s) > > EVP_PKEY_encrypt_init(pkey_ctx); > /* Generate session key */ > - RAND_bytes(premaster_secret, 32); > + arc4random_buf(premaster_secret, 32); > /* If we have client certificate, use its secret as > peer key */ > if (s->s3->tmp.cert_req && s->cert->key->privatekey) { > if (EVP_PKEY_derive_set_peer(pkey_ctx, > s->cert->key->privatekey) <=0) { > Index: ssl/s3_pkt.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/s3_pkt.c,v > retrieving revision 1.32 > diff -u -p -r1.32 s3_pkt.c > --- ssl/s3_pkt.c 19 Apr 2014 19:40:11 -0000 1.32 > +++ ssl/s3_pkt.c 22 Apr 2014 03:19:59 -0000 > @@ -109,8 +109,10 @@ > * > */ > > -#include <stdio.h> > #include <errno.h> > +#include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include <openssl/evp.h> > #include <openssl/buffer.h> > @@ -756,9 +758,8 @@ do_ssl3_write(SSL *s, int type, const un > wr->data = p; > > if (eivlen) { > - /* if (RAND_pseudo_bytes(p, eivlen) <= 0) > - goto err; > - */ > + /* XXX why was this commented out? */ > + /* arc4random_buf(p, eivlen); */ > wr->length += eivlen; > } > > Index: ssl/s3_srvr.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/s3_srvr.c,v > retrieving revision 1.44 > diff -u -p -r1.44 s3_srvr.c > --- ssl/s3_srvr.c 21 Apr 2014 16:34:43 -0000 1.44 > +++ ssl/s3_srvr.c 22 Apr 2014 03:19:59 -0000 > @@ -152,6 +152,8 @@ > #define NETSCAPE_HANG_BUG > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include "kssl_lcl.h" > #include <openssl/buffer.h> > @@ -2216,12 +2218,7 @@ ssl3_get_client_key_exchange(SSL *s) > i = SSL_MAX_MASTER_KEY_LENGTH; > p[0] = s->client_version >> 8; > p[1] = s->client_version & 0xff; > - /* > - * Should be RAND_bytes, but we cannot work around a > - * failure. > - */ > - if (RAND_pseudo_bytes(p+2, i-2) <= 0) > - goto err; > + arc4random_buf(p + 2, i - 2); > } > > s->session->master_key_length = > @@ -3340,7 +3337,7 @@ ssl3_send_newsession_ticket(SSL *s) > return -1; > } > } else { > - RAND_pseudo_bytes(iv, 16); > + arc4random_buf(iv, 16); > EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, > tctx->tlsext_tick_aes_key, iv); > HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16, > Index: ssl/ssl_lib.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/ssl_lib.c,v > retrieving revision 1.39 > diff -u -p -r1.39 ssl_lib.c > --- ssl/ssl_lib.c 21 Apr 2014 16:34:43 -0000 1.39 > +++ ssl/ssl_lib.c 22 Apr 2014 03:19:59 -0000 > @@ -143,6 +143,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #include "kssl_lcl.h" > #include <openssl/objects.h> > @@ -1781,10 +1783,9 @@ SSL_CTX_new(const SSL_METHOD *meth) > ret->tlsext_servername_callback = 0; > ret->tlsext_servername_arg = NULL; > /* Setup RFC4507 ticket keys */ > - if ((RAND_pseudo_bytes(ret->tlsext_tick_key_name, 16) <= 0) > - || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) > - || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) > - ret->options |= SSL_OP_NO_TICKET; > + arc4random_buf(ret->tlsext_tick_key_name, 16); > + arc4random_buf(ret->tlsext_tick_hmac_key, 16); > + arc4random_buf(ret->tlsext_tick_aes_key, 16); > > ret->tlsext_status_cb = 0; > ret->tlsext_status_arg = NULL; > Index: ssl/ssl_sess.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/ssl_sess.c,v > retrieving revision 1.25 > diff -u -p -r1.25 ssl_sess.c > --- ssl/ssl_sess.c 21 Apr 2014 16:34:43 -0000 1.25 > +++ ssl/ssl_sess.c 22 Apr 2014 03:19:59 -0000 > @@ -136,6 +136,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include <openssl/lhash.h> > #include <openssl/rand.h> > #ifndef OPENSSL_NO_ENGINE > @@ -258,11 +260,10 @@ def_generate_session_id(const SSL *ssl, > unsigned int *id_len) > { > unsigned int retry = 0; > - do > - if (RAND_pseudo_bytes(id, *id_len) <= 0) > - return 0; > - while (SSL_has_matching_session_id(ssl, id, *id_len) && > - (++retry < MAX_SESS_ID_ATTEMPTS)); > + do { > + arc4random_buf(id, *id_len); > + } while (SSL_has_matching_session_id(ssl, id, *id_len) && > + (++retry < MAX_SESS_ID_ATTEMPTS)); > if (retry < MAX_SESS_ID_ATTEMPTS) > return 1; > /* else - woops a session_id match */ > Index: ssl/t1_enc.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/t1_enc.c,v > retrieving revision 1.26 > diff -u -p -r1.26 t1_enc.c > --- ssl/t1_enc.c 21 Apr 2014 16:34:43 -0000 1.26 > +++ ssl/t1_enc.c 22 Apr 2014 03:19:59 -0000 > @@ -136,6 +136,8 @@ > */ > > #include <stdio.h> > +#include <stdlib.h> > + > #include "ssl_locl.h" > #ifndef OPENSSL_NO_COMP > #include <openssl/comp.h> > @@ -692,8 +694,8 @@ tls1_enc(SSL *s, int send) > fprintf(stderr, > "%s:%d: rec->data != > rec->input\n", > __FILE__, __LINE__); > - else if (RAND_bytes(rec->input, ivlen) <= 0) > - return -1; > + else > + arc4random_buf(rec->input, ivlen); > } > } > } else { > Index: ssl/tls_srp.c > =================================================================== > RCS file: /cvs/src/lib/libssl/src/ssl/tls_srp.c,v > retrieving revision 1.7 > diff -u -p -r1.7 tls_srp.c > --- ssl/tls_srp.c 19 Apr 2014 17:05:00 -0000 1.7 > +++ ssl/tls_srp.c 22 Apr 2014 03:19:59 -0000 > @@ -56,6 +56,9 @@ > * Hudson (t...@cryptsoft.com). > * > */ > + > +#include <stdlib.h> > + > #include "ssl_locl.h" > #ifndef OPENSSL_NO_SRP > > @@ -244,8 +247,7 @@ SSL_srp_server_param_with_username(SSL * > (s->srp_ctx.s == NULL) || (s->srp_ctx.v == NULL)) > return SSL3_AL_FATAL; > > - if (RAND_bytes(b, sizeof(b)) <= 0) > - return SSL3_AL_FATAL; > + arc4random_buf(b, sizeof(b)); > s->srp_ctx.b = BN_bin2bn(b, sizeof(b), NULL); > OPENSSL_cleanse(b, sizeof(b)); > > @@ -415,7 +417,7 @@ SRP_Calc_A_param(SSL *s) > !SRP_check_known_gN_param(s->srp_ctx.g, s->srp_ctx.N)) > return -1; > > - RAND_bytes(rnd, sizeof(rnd)); > + arc4random_buf(rnd, sizeof(rnd)); > s->srp_ctx.a = BN_bin2bn(rnd, sizeof(rnd), s->srp_ctx.a); > OPENSSL_cleanse(rnd, sizeof(rnd)); > >