Convert rand_bytes_ex and rand_priv_bytes_ex to public functions
authorMatt Caswell <matt@openssl.org>
Wed, 15 Jan 2020 16:34:55 +0000 (16:34 +0000)
committerMatt Caswell <matt@openssl.org>
Mon, 20 Jan 2020 14:54:31 +0000 (14:54 +0000)
These were initially added as internal functions only. However they will
also need to be used by libssl as well. Therefore it make sense to move
them into the public API.

Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/10864)

13 files changed:
crypto/bn/bn_rand.c
crypto/rand/rand_lib.c
doc/internal/man3/rand_bytes_ex.pod [deleted file]
doc/man3/RAND_bytes.pod
include/crypto/rand.h
include/openssl/rand.h
providers/implementations/ciphers/cipher_aes_cbc_hmac_sha1_hw.c
providers/implementations/ciphers/cipher_aes_cbc_hmac_sha256_hw.c
providers/implementations/ciphers/cipher_des.c
providers/implementations/ciphers/cipher_tdes.c
providers/implementations/ciphers/cipher_tdes_wrap.c
providers/implementations/ciphers/ciphercommon_gcm.c
util/libcrypto.num

index d61b08dba24baf298ef8cb90a4fdd5ac38b072e8..2428a49efd58333c750c024947f56fbce68e1fa4 100644 (file)
@@ -47,8 +47,8 @@ static int bnrand(BNRAND_FLAG flag, BIGNUM *rnd, int bits, int top, int bottom,
     }
 
     /* make a random number and set the top and bottom bits */
-    b = flag == NORMAL ? rand_bytes_ex(libctx, buf, bytes)
-                       : rand_priv_bytes_ex(libctx, buf, bytes);
+    b = flag == NORMAL ? RAND_bytes_ex(libctx, buf, bytes)
+                       : RAND_priv_bytes_ex(libctx, buf, bytes);
     if (b <= 0)
         goto err;
 
@@ -60,7 +60,7 @@ static int bnrand(BNRAND_FLAG flag, BIGNUM *rnd, int bits, int top, int bottom,
         unsigned char c;
 
         for (i = 0; i < bytes; i++) {
-            if (rand_bytes_ex(libctx, &c, 1) <= 0)
+            if (RAND_bytes_ex(libctx, &c, 1) <= 0)
                 goto err;
             if (c >= 128 && i > 0)
                 buf[i] = buf[i - 1];
@@ -280,7 +280,7 @@ int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range,
         goto err;
     }
     for (done = 0; done < num_k_bytes;) {
-        if (!rand_priv_bytes_ex(libctx, random_bytes, sizeof(random_bytes)))
+        if (!RAND_priv_bytes_ex(libctx, random_bytes, sizeof(random_bytes)))
             goto err;
 
         if (!EVP_DigestInit_ex(mdctx, md, NULL)
index 0be9db1c5fc9b55fa278ccef18c7164bd163de13..86952739c08cad48d8d430d54f5e042c91562a49 100644 (file)
@@ -851,7 +851,7 @@ void RAND_add(const void *buf, int num, double randomness)
  * the default method, then just call RAND_bytes().  Otherwise make
  * sure we're instantiated and use the private DRBG.
  */
-int rand_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
+int RAND_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
 {
     RAND_DRBG *drbg;
     const RAND_METHOD *meth = RAND_get_rand_method();
@@ -872,10 +872,10 @@ int rand_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
 
 int RAND_priv_bytes(unsigned char *buf, int num)
 {
-    return rand_priv_bytes_ex(NULL, buf, num);
+    return RAND_priv_bytes_ex(NULL, buf, num);
 }
 
-int rand_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
+int RAND_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
 {
     RAND_DRBG *drbg;
     const RAND_METHOD *meth = RAND_get_rand_method();
@@ -896,7 +896,7 @@ int rand_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num)
 
 int RAND_bytes(unsigned char *buf, int num)
 {
-    return rand_bytes_ex(NULL, buf, num);
+    return RAND_bytes_ex(NULL, buf, num);
 }
 
 #if !defined(OPENSSL_NO_DEPRECATED_1_1_0) && !defined(FIPS_MODE)
diff --git a/doc/internal/man3/rand_bytes_ex.pod b/doc/internal/man3/rand_bytes_ex.pod
deleted file mode 100644 (file)
index e1bb0f0..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-=pod
-
-=head1 NAME
-
-rand_bytes_ex, rand_priv_bytes_ex
-- internal random number routines
-
-=head1 SYNOPSIS
-
- #include "crypto/rand.h"
-
- int rand_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
- int rand_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
-
-=head1 DESCRIPTION
-
-rand_bytes_ex() and rand_priv_bytes_ex() are the equivalent of RAND_bytes() and
-RAND_priv_bytes() in the public API except that they both take an additional
-I<ctx> parameter.
-The DRBG used for the operation is the public or private DRBG associated with
-the specified I<ctx>. The parameter can be NULL, in which case
-the default library ctx is used.
-If the default RAND_METHOD has been changed then for compatibility reasons the
-RAND_METHOD will be used in preference and the DRBG of the library context
-ignored.
-
-=head1 RETURN VALUES
-
-rand_bytes_ex() and rand_bytes_priv_ex() return 0 or less on error or 1 on
-success.
-
-=head1 COPYRIGHT
-
-Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
-
-Licensed under the Apache License 2.0 (the "License").  You may not use
-this file except in compliance with the License.  You can obtain a copy
-in the file LICENSE in the source distribution or at
-L<https://www.openssl.org/source/license.html>.
-
-=cut
index fb1e1c9a223bb7511568f351dfa19f32dd22ce20..5da46925207e95f43f4facedc8ee48ada97ef5fa 100644 (file)
@@ -2,7 +2,8 @@
 
 =head1 NAME
 
-RAND_bytes, RAND_priv_bytes, RAND_pseudo_bytes - generate random data
+RAND_bytes, RAND_priv_bytes, RAND_bytes_ex, RAND_priv_bytes_ex,
+RAND_pseudo_bytes - generate random data
 
 =head1 SYNOPSIS
 
@@ -11,6 +12,9 @@ RAND_bytes, RAND_priv_bytes, RAND_pseudo_bytes - generate random data
  int RAND_bytes(unsigned char *buf, int num);
  int RAND_priv_bytes(unsigned char *buf, int num);
 
+ int RAND_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
+ int RAND_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
+
 Deprecated since OpenSSL 1.1.0, can be hidden entirely by defining
 B<OPENSSL_API_COMPAT> with a suitable version value, see
 L<openssl_user_macros(7)>:
@@ -29,6 +33,15 @@ instance so that a compromise of the "public" PRNG instance will not
 affect the secrecy of these private values, as described in L<RAND(7)>
 and L<RAND_DRBG(7)>.
 
+RAND_bytes_ex() and RAND_priv_bytes_ex() are the same as RAND_bytes() and
+RAND_priv_bytes() except that they both take an additional I<ctx> parameter.
+The DRBG used for the operation is the public or private DRBG associated with
+the specified I<ctx>. The parameter can be NULL, in which case
+the default library context is used (see L<OPENSSL_CTX(3)>.
+If the default RAND_METHOD has been changed then for compatibility reasons the
+RAND_METHOD will be used in preference and the DRBG of the library context
+ignored.
+
 =head1 NOTES
 
 Always check the error return value of RAND_bytes() and
@@ -64,6 +77,10 @@ RAND_pseudo_bytes() was deprecated in OpenSSL 1.1.0; use RAND_bytes() instead.
 
 The RAND_priv_bytes() function was added in OpenSSL 1.1.1.
 
+=item *
+
+The RAND_bytes_ex() and RAND_priv_bytes_ex() functions were added in OpenSSL 3.0
+
 =back
 
 =head1 COPYRIGHT
index 81bcb60508a9b7283194fce569ae6b5f83867a9a..16fa737554bcd449549967fb93e943df455b21f2 100644 (file)
@@ -186,10 +186,4 @@ void rand_pool_cleanup(void);
  */
 void rand_pool_keep_random_devices_open(int keep);
 
-/* Equivalent of RAND_priv_bytes() but additionally taking an OPENSSL_CTX */
-int rand_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
-
-/* Equivalent of RAND_bytes() but additionally taking an OPENSSL_CTX */
-int rand_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
-
 #endif
index 1cffab7c54c29ba4cb9f6462cb538c790b8a4ca8..574592a69f56a28e5eb6ca5905c197243f10451d 100644 (file)
@@ -47,6 +47,13 @@ RAND_METHOD *RAND_OpenSSL(void);
 # endif
 int RAND_bytes(unsigned char *buf, int num);
 int RAND_priv_bytes(unsigned char *buf, int num);
+
+/* Equivalent of RAND_priv_bytes() but additionally taking an OPENSSL_CTX */
+int RAND_priv_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
+
+/* Equivalent of RAND_bytes() but additionally taking an OPENSSL_CTX */
+int RAND_bytes_ex(OPENSSL_CTX *ctx, unsigned char *buf, int num);
+
 DEPRECATEDIN_1_1_0(int RAND_pseudo_bytes(unsigned char *buf, int num))
 
 void RAND_seed(const void *buf, int num);
index 57e59c30c3331bb436b9a4ac18e5da5225cdc139..04f60216ae731140f4330ee5b2281d3a99e6904c 100644 (file)
@@ -23,7 +23,7 @@ int cipher_capable_aes_cbc_hmac_sha1(void)
 }
 #else
 
-# include "crypto/rand.h"
+# include <openssl/rand.h>
 # include "crypto/evp.h"
 # include "internal/constant_time.h"
 
@@ -135,7 +135,7 @@ static size_t tls1_multi_block_encrypt(void *vctx,
 #  endif
 
     /* ask for IVs in bulk */
-    if (rand_bytes_ex(ctx->base.libctx, (IVs = blocks[0].c), 16 * x4) <= 0)
+    if (RAND_bytes_ex(ctx->base.libctx, (IVs = blocks[0].c), 16 * x4) <= 0)
         return 0;
 
     mctx = (SHA1_MB_CTX *) (storage + 32 - ((size_t)storage % 32)); /* align */
index 26bc8f7c495248bcca310ab1fe560a90155b3915..5cfa76fde57d6f5275cc9084798adf106b2d9c00 100644 (file)
@@ -23,7 +23,7 @@ int cipher_capable_aes_cbc_hmac_sha256(void)
 }
 #else
 
-# include "crypto/rand.h"
+# include <openssl/rand.h>
 # include "crypto/evp.h"
 # include "internal/constant_time.h"
 
@@ -139,7 +139,7 @@ static size_t tls1_multi_block_encrypt(void *vctx,
 #  endif
 
     /* ask for IVs in bulk */
-    if (rand_bytes_ex(ctx->base.libctx, (IVs = blocks[0].c), 16 * x4) <= 0)
+    if (RAND_bytes_ex(ctx->base.libctx, (IVs = blocks[0].c), 16 * x4) <= 0)
         return 0;
 
     mctx = (SHA256_MB_CTX *) (storage + 32 - ((size_t)storage % 32)); /* align */
index 200c365282ef10595efd03d7068956bce8e535b1..74539d3da4dd7c1b6b84e6b26d81dfb364c7c07c 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "prov/ciphercommon.h"
 #include "cipher_des.h"
-#include "crypto/rand.h"
+#include <openssl/rand.h>
 #include "prov/implementations.h"
 #include "prov/providercommonerr.h"
 
@@ -81,7 +81,7 @@ static int des_generatekey(PROV_CIPHER_CTX *ctx, void *ptr)
     DES_cblock *deskey = ptr;
     size_t kl = ctx->keylen;
 
-    if (kl == 0 || rand_priv_bytes_ex(ctx->libctx, ptr, kl) <= 0)
+    if (kl == 0 || RAND_priv_bytes_ex(ctx->libctx, ptr, kl) <= 0)
         return 0;
     DES_set_odd_parity(deskey);
     return 1;
index e6dab582ca57a1b4fa7b30f6f05385e04020ce8e..80afcd5fd906f484d474461c5451bc31320c2e69 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "prov/ciphercommon.h"
 #include "cipher_tdes.h"
-#include "crypto/rand.h"
+#include <openssl/rand.h>
 #include "prov/implementations.h"
 #include "prov/providercommonerr.h"
 
@@ -71,7 +71,7 @@ static int tdes_generatekey(PROV_CIPHER_CTX *ctx, void *ptr)
     DES_cblock *deskey = ptr;
     size_t kl = ctx->keylen;
 
-    if (kl == 0 || rand_priv_bytes_ex(ctx->libctx, ptr, kl) <= 0)
+    if (kl == 0 || RAND_priv_bytes_ex(ctx->libctx, ptr, kl) <= 0)
         return 0;
     DES_set_odd_parity(deskey);
     if (kl >= 16)
index a6f4e4efe420ee74ca1697d424054895775a21d9..9db60ad2c716161c4398638bab3769929e68a7bc 100644 (file)
@@ -14,9 +14,9 @@
 #include "internal/deprecated.h"
 
 #include <openssl/sha.h>
+#include <openssl/rand.h>
 #include "cipher_tdes_default.h"
 #include "crypto/evp.h"
-#include "crypto/rand.h"
 #include "prov/implementations.h"
 #include "prov/providercommonerr.h"
 
@@ -98,7 +98,7 @@ static int des_ede3_wrap(PROV_CIPHER_CTX *ctx, unsigned char *out,
     memcpy(out + inl + ivlen, sha1tmp, icvlen);
     OPENSSL_cleanse(sha1tmp, SHA_DIGEST_LENGTH);
     /* Generate random IV */
-    if (rand_bytes_ex(ctx->libctx, ctx->iv, ivlen) <= 0)
+    if (RAND_bytes_ex(ctx->libctx, ctx->iv, ivlen) <= 0)
         return 0;
     memcpy(out, ctx->iv, ivlen);
     /* Encrypt everything after IV in place */
index a6928e1ba36f7802aed5af08b4c3fe02c82b2cfa..a64462a5c114659b99e1ca06535efd409373e0b3 100644 (file)
@@ -12,7 +12,7 @@
 #include "prov/ciphercommon.h"
 #include "prov/ciphercommon_gcm.h"
 #include "prov/providercommonerr.h"
-#include "crypto/rand.h"
+#include <openssl/rand.h>
 #include "prov/provider_ctx.h"
 
 static int gcm_tls_init(PROV_GCM_CTX *dat, unsigned char *aad, size_t aad_len);
@@ -338,7 +338,7 @@ static int gcm_iv_generate(PROV_GCM_CTX *ctx, int offset)
         return 0;
 
     /* Use DRBG to generate random iv */
-    if (rand_bytes_ex(ctx->libctx, ctx->iv + offset, sz) <= 0)
+    if (RAND_bytes_ex(ctx->libctx, ctx->iv + offset, sz) <= 0)
         return 0;
     ctx->iv_state = IV_STATE_BUFFERED;
     ctx->iv_gen_rand = 1;
@@ -452,7 +452,7 @@ static int gcm_tls_iv_set_fixed(PROV_GCM_CTX *ctx, unsigned char *iv,
     if (len > 0)
         memcpy(ctx->iv, iv, len);
     if (ctx->enc
-        && rand_bytes_ex(ctx->libctx, ctx->iv + len, ctx->ivlen - len) <= 0)
+        && RAND_bytes_ex(ctx->libctx, ctx->iv + len, ctx->ivlen - len) <= 0)
             return 0;
     ctx->iv_gen = 1;
     ctx->iv_state = IV_STATE_BUFFERED;
index c1f3978fbc1566010a63640a491ecfb468b6ec0e..ce012446219cb3a9981d3f98835f6751ab3cb0a3 100644 (file)
@@ -4918,3 +4918,5 @@ OSSL_SELF_TEST_get_callback             ? 3_0_0   EXIST::FUNCTION:
 ASN1_TIME_dup                           ?      3_0_0   EXIST::FUNCTION:
 ASN1_UTCTIME_dup                        ?      3_0_0   EXIST::FUNCTION:
 ASN1_GENERALIZEDTIME_dup                ?      3_0_0   EXIST::FUNCTION:
+RAND_priv_bytes_ex                      ?      3_0_0   EXIST::FUNCTION:
+RAND_bytes_ex                           ?      3_0_0   EXIST::FUNCTION: