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 ([email protected]).
*
*/
+
+#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));