| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/bn/bn_rand.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||||||||||||||
| 2 | * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. | - | ||||||||||||||||||
| 3 | * | - | ||||||||||||||||||
| 4 | * Licensed under the OpenSSL license (the "License"). You may not use | - | ||||||||||||||||||
| 5 | * this file except in compliance with the License. You can obtain a copy | - | ||||||||||||||||||
| 6 | * in the file LICENSE in the source distribution or at | - | ||||||||||||||||||
| 7 | * https://www.openssl.org/source/license.html | - | ||||||||||||||||||
| 8 | */ | - | ||||||||||||||||||
| 9 | - | |||||||||||||||||||
| 10 | #include <stdio.h> | - | ||||||||||||||||||
| 11 | #include <time.h> | - | ||||||||||||||||||
| 12 | #include "internal/cryptlib.h" | - | ||||||||||||||||||
| 13 | #include "bn_lcl.h" | - | ||||||||||||||||||
| 14 | #include <openssl/rand.h> | - | ||||||||||||||||||
| 15 | #include <openssl/sha.h> | - | ||||||||||||||||||
| 16 | - | |||||||||||||||||||
| 17 | typedef enum bnrand_flag_e { | - | ||||||||||||||||||
| 18 | NORMAL, TESTING, PRIVATE | - | ||||||||||||||||||
| 19 | } BNRAND_FLAG; | - | ||||||||||||||||||
| 20 | - | |||||||||||||||||||
| 21 | static int bnrand(BNRAND_FLAG flag, BIGNUM *rnd, int bits, int top, int bottom) | - | ||||||||||||||||||
| 22 | { | - | ||||||||||||||||||
| 23 | unsigned char *buf = NULL; | - | ||||||||||||||||||
| 24 | int b, ret = 0, bit, bytes, mask; | - | ||||||||||||||||||
| 25 | - | |||||||||||||||||||
| 26 | if (bits == 0) {
| 2-137416 | ||||||||||||||||||
| 27 | if (top != BN_RAND_TOP_ANY || bottom != BN_RAND_BOTTOM_ANY)
| 0-2 | ||||||||||||||||||
| 28 | goto toosmall; executed 2 times by 1 test: goto toosmall;Executed by:
| 2 | ||||||||||||||||||
| 29 | BN_zero(rnd); | - | ||||||||||||||||||
| 30 | return 1; never executed: return 1; | 0 | ||||||||||||||||||
| 31 | } | - | ||||||||||||||||||
| 32 | if (bits < 0 || (bits == 1 && top > 0))
| 0-137416 | ||||||||||||||||||
| 33 | goto toosmall; executed 1 time by 1 test: goto toosmall;Executed by:
| 1 | ||||||||||||||||||
| 34 | - | |||||||||||||||||||
| 35 | bytes = (bits + 7) / 8; | - | ||||||||||||||||||
| 36 | bit = (bits - 1) % 8; | - | ||||||||||||||||||
| 37 | mask = 0xff << (bit + 1); | - | ||||||||||||||||||
| 38 | - | |||||||||||||||||||
| 39 | buf = OPENSSL_malloc(bytes); | - | ||||||||||||||||||
| 40 | if (buf == NULL) {
| 0-137415 | ||||||||||||||||||
| 41 | BNerr(BN_F_BNRAND, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||
| 42 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 43 | } | - | ||||||||||||||||||
| 44 | - | |||||||||||||||||||
| 45 | /* make a random number and set the top and bottom bits */ | - | ||||||||||||||||||
| 46 | b = flag == NORMAL ? RAND_bytes(buf, bytes) : RAND_priv_bytes(buf, bytes);
| 734-136681 | ||||||||||||||||||
| 47 | if (b <= 0)
| 0-137415 | ||||||||||||||||||
| 48 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 49 | - | |||||||||||||||||||
| 50 | if (flag == TESTING) {
| 1807-135608 | ||||||||||||||||||
| 51 | /* | - | ||||||||||||||||||
| 52 | * generate patterns that are more likely to trigger BN library bugs | - | ||||||||||||||||||
| 53 | */ | - | ||||||||||||||||||
| 54 | int i; | - | ||||||||||||||||||
| 55 | unsigned char c; | - | ||||||||||||||||||
| 56 | - | |||||||||||||||||||
| 57 | for (i = 0; i < bytes; i++) {
| 1807-148234 | ||||||||||||||||||
| 58 | if (RAND_bytes(&c, 1) <= 0)
| 0-148234 | ||||||||||||||||||
| 59 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 60 | if (c >= 128 && i > 0)
| 864-74246 | ||||||||||||||||||
| 61 | buf[i] = buf[i - 1]; executed 73382 times by 1 test: buf[i] = buf[i - 1];Executed by:
| 73382 | ||||||||||||||||||
| 62 | else if (c < 42)
| 24287-50565 | ||||||||||||||||||
| 63 | buf[i] = 0; executed 24287 times by 1 test: buf[i] = 0;Executed by:
| 24287 | ||||||||||||||||||
| 64 | else if (c < 84)
| 24281-26284 | ||||||||||||||||||
| 65 | buf[i] = 255; executed 24281 times by 1 test: buf[i] = 255;Executed by:
| 24281 | ||||||||||||||||||
| 66 | } executed 148234 times by 1 test: end of blockExecuted by:
| 148234 | ||||||||||||||||||
| 67 | } executed 1807 times by 1 test: end of blockExecuted by:
| 1807 | ||||||||||||||||||
| 68 | - | |||||||||||||||||||
| 69 | if (top >= 0) {
| 49342-88073 | ||||||||||||||||||
| 70 | if (top) {
| 3385-45957 | ||||||||||||||||||
| 71 | if (bit == 0) {
| 0-3385 | ||||||||||||||||||
| 72 | buf[0] = 1; | - | ||||||||||||||||||
| 73 | buf[1] |= 0x80; | - | ||||||||||||||||||
| 74 | } else { never executed: end of block | 0 | ||||||||||||||||||
| 75 | buf[0] |= (3 << (bit - 1)); | - | ||||||||||||||||||
| 76 | } executed 3385 times by 1 test: end of blockExecuted by:
| 3385 | ||||||||||||||||||
| 77 | } else { | - | ||||||||||||||||||
| 78 | buf[0] |= (1 << bit); | - | ||||||||||||||||||
| 79 | } executed 45957 times by 1 test: end of blockExecuted by:
| 45957 | ||||||||||||||||||
| 80 | } | - | ||||||||||||||||||
| 81 | buf[0] &= ~mask; | - | ||||||||||||||||||
| 82 | if (bottom) /* set bottom bit if requested */
| 3598-133817 | ||||||||||||||||||
| 83 | buf[bytes - 1] |= 1; executed 3598 times by 1 test: buf[bytes - 1] |= 1;Executed by:
| 3598 | ||||||||||||||||||
| 84 | if (!BN_bin2bn(buf, bytes, rnd))
| 0-137415 | ||||||||||||||||||
| 85 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 86 | ret = 1; | - | ||||||||||||||||||
| 87 | err: code before this statement executed 137415 times by 2 tests: err:Executed by:
| 137415 | ||||||||||||||||||
| 88 | OPENSSL_clear_free(buf, bytes); | - | ||||||||||||||||||
| 89 | bn_check_top(rnd); | - | ||||||||||||||||||
| 90 | return ret; executed 137415 times by 2 tests: return ret;Executed by:
| 137415 | ||||||||||||||||||
| 91 | - | |||||||||||||||||||
| 92 | toosmall: | - | ||||||||||||||||||
| 93 | BNerr(BN_F_BNRAND, BN_R_BITS_TOO_SMALL); | - | ||||||||||||||||||
| 94 | return 0; executed 3 times by 1 test: return 0;Executed by:
| 3 | ||||||||||||||||||
| 95 | } | - | ||||||||||||||||||
| 96 | - | |||||||||||||||||||
| 97 | int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) | - | ||||||||||||||||||
| 98 | { | - | ||||||||||||||||||
| 99 | return bnrand(NORMAL, rnd, bits, top, bottom); executed 737 times by 1 test: return bnrand(NORMAL, rnd, bits, top, bottom);Executed by:
| 737 | ||||||||||||||||||
| 100 | } | - | ||||||||||||||||||
| 101 | - | |||||||||||||||||||
| 102 | int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom) | - | ||||||||||||||||||
| 103 | { | - | ||||||||||||||||||
| 104 | return bnrand(TESTING, rnd, bits, top, bottom); executed 1807 times by 1 test: return bnrand(TESTING, rnd, bits, top, bottom);Executed by:
| 1807 | ||||||||||||||||||
| 105 | } | - | ||||||||||||||||||
| 106 | - | |||||||||||||||||||
| 107 | int BN_priv_rand(BIGNUM *rnd, int bits, int top, int bottom) | - | ||||||||||||||||||
| 108 | { | - | ||||||||||||||||||
| 109 | return bnrand(PRIVATE, rnd, bits, top, bottom); executed 124517 times by 1 test: return bnrand(PRIVATE, rnd, bits, top, bottom);Executed by:
| 124517 | ||||||||||||||||||
| 110 | } | - | ||||||||||||||||||
| 111 | - | |||||||||||||||||||
| 112 | /* random number r: 0 <= r < range */ | - | ||||||||||||||||||
| 113 | static int bnrand_range(BNRAND_FLAG flag, BIGNUM *r, const BIGNUM *range) | - | ||||||||||||||||||
| 114 | { | - | ||||||||||||||||||
| 115 | int n; | - | ||||||||||||||||||
| 116 | int count = 100; | - | ||||||||||||||||||
| 117 | - | |||||||||||||||||||
| 118 | if (range->neg || BN_is_zero(range)) {
| 0-9242 | ||||||||||||||||||
| 119 | BNerr(BN_F_BNRAND_RANGE, BN_R_INVALID_RANGE); | - | ||||||||||||||||||
| 120 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 121 | } | - | ||||||||||||||||||
| 122 | - | |||||||||||||||||||
| 123 | n = BN_num_bits(range); /* n > 0 */ | - | ||||||||||||||||||
| 124 | - | |||||||||||||||||||
| 125 | /* BN_is_bit_set(range, n - 1) always holds */ | - | ||||||||||||||||||
| 126 | - | |||||||||||||||||||
| 127 | if (n == 1)
| 0-9242 | ||||||||||||||||||
| 128 | BN_zero(r); never executed: (BN_set_word((r),0)); | 0 | ||||||||||||||||||
| 129 | else if (!BN_is_bit_set(range, n - 2) && !BN_is_bit_set(range, n - 3)) {
| 248-8651 | ||||||||||||||||||
| 130 | /* | - | ||||||||||||||||||
| 131 | * range = 100..._2, so 3*range (= 11..._2) is exactly one bit longer | - | ||||||||||||||||||
| 132 | * than range | - | ||||||||||||||||||
| 133 | */ | - | ||||||||||||||||||
| 134 | do { | - | ||||||||||||||||||
| 135 | if (!bnrand(flag, r, n + 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY))
| 0-320 | ||||||||||||||||||
| 136 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 137 | - | |||||||||||||||||||
| 138 | /* | - | ||||||||||||||||||
| 139 | * If r < 3*range, use r := r MOD range (which is either r, r - | - | ||||||||||||||||||
| 140 | * range, or r - 2*range). Otherwise, iterate once more. Since | - | ||||||||||||||||||
| 141 | * 3*range = 11..._2, each iteration succeeds with probability >= | - | ||||||||||||||||||
| 142 | * .75. | - | ||||||||||||||||||
| 143 | */ | - | ||||||||||||||||||
| 144 | if (BN_cmp(r, range) >= 0) {
| 83-237 | ||||||||||||||||||
| 145 | if (!BN_sub(r, r, range))
| 0-237 | ||||||||||||||||||
| 146 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 147 | if (BN_cmp(r, range) >= 0)
| 97-140 | ||||||||||||||||||
| 148 | if (!BN_sub(r, r, range))
| 0-140 | ||||||||||||||||||
| 149 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 150 | } executed 237 times by 2 tests: end of blockExecuted by:
| 237 | ||||||||||||||||||
| 151 | - | |||||||||||||||||||
| 152 | if (!--count) {
| 0-320 | ||||||||||||||||||
| 153 | BNerr(BN_F_BNRAND_RANGE, BN_R_TOO_MANY_ITERATIONS); | - | ||||||||||||||||||
| 154 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 155 | } | - | ||||||||||||||||||
| 156 | - | |||||||||||||||||||
| 157 | } executed 320 times by 2 tests: end of blockExecuted by:
| 320 | ||||||||||||||||||
| 158 | while (BN_cmp(r, range) >= 0);
| 72-248 | ||||||||||||||||||
| 159 | } else { executed 248 times by 2 tests: end of blockExecuted by:
| 248 | ||||||||||||||||||
| 160 | do { | - | ||||||||||||||||||
| 161 | /* range = 11..._2 or range = 101..._2 */ | - | ||||||||||||||||||
| 162 | if (!bnrand(flag, r, n, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY))
| 0-10037 | ||||||||||||||||||
| 163 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 164 | - | |||||||||||||||||||
| 165 | if (!--count) {
| 0-10037 | ||||||||||||||||||
| 166 | BNerr(BN_F_BNRAND_RANGE, BN_R_TOO_MANY_ITERATIONS); | - | ||||||||||||||||||
| 167 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 168 | } | - | ||||||||||||||||||
| 169 | } executed 10037 times by 1 test: end of blockExecuted by:
| 10037 | ||||||||||||||||||
| 170 | while (BN_cmp(r, range) >= 0);
| 1043-8994 | ||||||||||||||||||
| 171 | } executed 8994 times by 1 test: end of blockExecuted by:
| 8994 | ||||||||||||||||||
| 172 | - | |||||||||||||||||||
| 173 | bn_check_top(r); | - | ||||||||||||||||||
| 174 | return 1; executed 9242 times by 2 tests: return 1;Executed by:
| 9242 | ||||||||||||||||||
| 175 | } | - | ||||||||||||||||||
| 176 | - | |||||||||||||||||||
| 177 | int BN_rand_range(BIGNUM *r, const BIGNUM *range) | - | ||||||||||||||||||
| 178 | { | - | ||||||||||||||||||
| 179 | return bnrand_range(NORMAL, r, range); never executed: return bnrand_range(NORMAL, r, range); | 0 | ||||||||||||||||||
| 180 | } | - | ||||||||||||||||||
| 181 | - | |||||||||||||||||||
| 182 | int BN_priv_rand_range(BIGNUM *r, const BIGNUM *range) | - | ||||||||||||||||||
| 183 | { | - | ||||||||||||||||||
| 184 | return bnrand_range(PRIVATE, r, range); executed 9242 times by 2 tests: return bnrand_range(PRIVATE, r, range);Executed by:
| 9242 | ||||||||||||||||||
| 185 | } | - | ||||||||||||||||||
| 186 | - | |||||||||||||||||||
| 187 | int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom) | - | ||||||||||||||||||
| 188 | { | - | ||||||||||||||||||
| 189 | return BN_rand(rnd, bits, top, bottom); never executed: return BN_rand(rnd, bits, top, bottom); | 0 | ||||||||||||||||||
| 190 | } | - | ||||||||||||||||||
| 191 | - | |||||||||||||||||||
| 192 | int BN_pseudo_rand_range(BIGNUM *r, const BIGNUM *range) | - | ||||||||||||||||||
| 193 | { | - | ||||||||||||||||||
| 194 | return BN_rand_range(r, range); never executed: return BN_rand_range(r, range); | 0 | ||||||||||||||||||
| 195 | } | - | ||||||||||||||||||
| 196 | - | |||||||||||||||||||
| 197 | /* | - | ||||||||||||||||||
| 198 | * BN_generate_dsa_nonce generates a random number 0 <= out < range. Unlike | - | ||||||||||||||||||
| 199 | * BN_rand_range, it also includes the contents of |priv| and |message| in | - | ||||||||||||||||||
| 200 | * the generation so that an RNG failure isn't fatal as long as |priv| | - | ||||||||||||||||||
| 201 | * remains secret. This is intended for use in DSA and ECDSA where an RNG | - | ||||||||||||||||||
| 202 | * weakness leads directly to private key exposure unless this function is | - | ||||||||||||||||||
| 203 | * used. | - | ||||||||||||||||||
| 204 | */ | - | ||||||||||||||||||
| 205 | int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range, | - | ||||||||||||||||||
| 206 | const BIGNUM *priv, const unsigned char *message, | - | ||||||||||||||||||
| 207 | size_t message_len, BN_CTX *ctx) | - | ||||||||||||||||||
| 208 | { | - | ||||||||||||||||||
| 209 | SHA512_CTX sha; | - | ||||||||||||||||||
| 210 | /* | - | ||||||||||||||||||
| 211 | * We use 512 bits of random data per iteration to ensure that we have at | - | ||||||||||||||||||
| 212 | * least |range| bits of randomness. | - | ||||||||||||||||||
| 213 | */ | - | ||||||||||||||||||
| 214 | unsigned char random_bytes[64]; | - | ||||||||||||||||||
| 215 | unsigned char digest[SHA512_DIGEST_LENGTH]; | - | ||||||||||||||||||
| 216 | unsigned done, todo; | - | ||||||||||||||||||
| 217 | /* We generate |range|+8 bytes of random output. */ | - | ||||||||||||||||||
| 218 | const unsigned num_k_bytes = BN_num_bytes(range) + 8; | - | ||||||||||||||||||
| 219 | unsigned char private_bytes[96]; | - | ||||||||||||||||||
| 220 | unsigned char *k_bytes; | - | ||||||||||||||||||
| 221 | int ret = 0; | - | ||||||||||||||||||
| 222 | - | |||||||||||||||||||
| 223 | k_bytes = OPENSSL_malloc(num_k_bytes); | - | ||||||||||||||||||
| 224 | if (k_bytes == NULL)
| 0-427 | ||||||||||||||||||
| 225 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 226 | - | |||||||||||||||||||
| 227 | /* We copy |priv| into a local buffer to avoid exposing its length. */ | - | ||||||||||||||||||
| 228 | todo = sizeof(priv->d[0]) * priv->top; | - | ||||||||||||||||||
| 229 | if (todo > sizeof(private_bytes)) {
| 0-427 | ||||||||||||||||||
| 230 | /* | - | ||||||||||||||||||
| 231 | * No reasonable DSA or ECDSA key should have a private key this | - | ||||||||||||||||||
| 232 | * large and we don't handle this case in order to avoid leaking the | - | ||||||||||||||||||
| 233 | * length of the private key. | - | ||||||||||||||||||
| 234 | */ | - | ||||||||||||||||||
| 235 | BNerr(BN_F_BN_GENERATE_DSA_NONCE, BN_R_PRIVATE_KEY_TOO_LARGE); | - | ||||||||||||||||||
| 236 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 237 | } | - | ||||||||||||||||||
| 238 | memcpy(private_bytes, priv->d, todo); | - | ||||||||||||||||||
| 239 | memset(private_bytes + todo, 0, sizeof(private_bytes) - todo); | - | ||||||||||||||||||
| 240 | - | |||||||||||||||||||
| 241 | for (done = 0; done < num_k_bytes;) {
| 427-432 | ||||||||||||||||||
| 242 | if (RAND_priv_bytes(random_bytes, sizeof(random_bytes)) != 1)
| 0-432 | ||||||||||||||||||
| 243 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 244 | SHA512_Init(&sha); | - | ||||||||||||||||||
| 245 | SHA512_Update(&sha, &done, sizeof(done)); | - | ||||||||||||||||||
| 246 | SHA512_Update(&sha, private_bytes, sizeof(private_bytes)); | - | ||||||||||||||||||
| 247 | SHA512_Update(&sha, message, message_len); | - | ||||||||||||||||||
| 248 | SHA512_Update(&sha, random_bytes, sizeof(random_bytes)); | - | ||||||||||||||||||
| 249 | SHA512_Final(digest, &sha); | - | ||||||||||||||||||
| 250 | - | |||||||||||||||||||
| 251 | todo = num_k_bytes - done; | - | ||||||||||||||||||
| 252 | if (todo > SHA512_DIGEST_LENGTH)
| 5-427 | ||||||||||||||||||
| 253 | todo = SHA512_DIGEST_LENGTH; executed 5 times by 1 test: todo = 64;Executed by:
| 5 | ||||||||||||||||||
| 254 | memcpy(k_bytes + done, digest, todo); | - | ||||||||||||||||||
| 255 | done += todo; | - | ||||||||||||||||||
| 256 | } executed 432 times by 1 test: end of blockExecuted by:
| 432 | ||||||||||||||||||
| 257 | - | |||||||||||||||||||
| 258 | if (!BN_bin2bn(k_bytes, num_k_bytes, out))
| 0-427 | ||||||||||||||||||
| 259 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 260 | if (BN_mod(out, out, range, ctx) != 1)
| 0-427 | ||||||||||||||||||
| 261 | goto err; never executed: goto err; | 0 | ||||||||||||||||||
| 262 | ret = 1; | - | ||||||||||||||||||
| 263 | - | |||||||||||||||||||
| 264 | err: code before this statement executed 427 times by 1 test: err:Executed by:
| 427 | ||||||||||||||||||
| 265 | OPENSSL_free(k_bytes); | - | ||||||||||||||||||
| 266 | OPENSSL_cleanse(private_bytes, sizeof(private_bytes)); | - | ||||||||||||||||||
| 267 | return ret; executed 427 times by 1 test: return ret;Executed by:
| 427 | ||||||||||||||||||
| 268 | } | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |