| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/bn/bn_lib.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 <assert.h> | - | ||||||||||||||||||||||||
| 11 | #include <limits.h> | - | ||||||||||||||||||||||||
| 12 | #include "internal/cryptlib.h" | - | ||||||||||||||||||||||||
| 13 | #include "bn_lcl.h" | - | ||||||||||||||||||||||||
| 14 | #include <openssl/opensslconf.h> | - | ||||||||||||||||||||||||
| 15 | #include "internal/constant_time_locl.h" | - | ||||||||||||||||||||||||
| 16 | - | |||||||||||||||||||||||||
| 17 | /* This stuff appears to be completely unused, so is deprecated */ | - | ||||||||||||||||||||||||
| 18 | #if OPENSSL_API_COMPAT < 0x00908000L | - | ||||||||||||||||||||||||
| 19 | /*- | - | ||||||||||||||||||||||||
| 20 | * For a 32 bit machine | - | ||||||||||||||||||||||||
| 21 | * 2 - 4 == 128 | - | ||||||||||||||||||||||||
| 22 | * 3 - 8 == 256 | - | ||||||||||||||||||||||||
| 23 | * 4 - 16 == 512 | - | ||||||||||||||||||||||||
| 24 | * 5 - 32 == 1024 | - | ||||||||||||||||||||||||
| 25 | * 6 - 64 == 2048 | - | ||||||||||||||||||||||||
| 26 | * 7 - 128 == 4096 | - | ||||||||||||||||||||||||
| 27 | * 8 - 256 == 8192 | - | ||||||||||||||||||||||||
| 28 | */ | - | ||||||||||||||||||||||||
| 29 | static int bn_limit_bits = 0; | - | ||||||||||||||||||||||||
| 30 | static int bn_limit_num = 8; /* (1<<bn_limit_bits) */ | - | ||||||||||||||||||||||||
| 31 | static int bn_limit_bits_low = 0; | - | ||||||||||||||||||||||||
| 32 | static int bn_limit_num_low = 8; /* (1<<bn_limit_bits_low) */ | - | ||||||||||||||||||||||||
| 33 | static int bn_limit_bits_high = 0; | - | ||||||||||||||||||||||||
| 34 | static int bn_limit_num_high = 8; /* (1<<bn_limit_bits_high) */ | - | ||||||||||||||||||||||||
| 35 | static int bn_limit_bits_mont = 0; | - | ||||||||||||||||||||||||
| 36 | static int bn_limit_num_mont = 8; /* (1<<bn_limit_bits_mont) */ | - | ||||||||||||||||||||||||
| 37 | - | |||||||||||||||||||||||||
| 38 | void BN_set_params(int mult, int high, int low, int mont) | - | ||||||||||||||||||||||||
| 39 | { | - | ||||||||||||||||||||||||
| 40 | if (mult >= 0) {
| 0 | ||||||||||||||||||||||||
| 41 | if (mult > (int)(sizeof(int) * 8) - 1)
| 0 | ||||||||||||||||||||||||
| 42 | mult = sizeof(int) * 8 - 1; never executed: mult = sizeof(int) * 8 - 1; | 0 | ||||||||||||||||||||||||
| 43 | bn_limit_bits = mult; | - | ||||||||||||||||||||||||
| 44 | bn_limit_num = 1 << mult; | - | ||||||||||||||||||||||||
| 45 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 46 | if (high >= 0) {
| 0 | ||||||||||||||||||||||||
| 47 | if (high > (int)(sizeof(int) * 8) - 1)
| 0 | ||||||||||||||||||||||||
| 48 | high = sizeof(int) * 8 - 1; never executed: high = sizeof(int) * 8 - 1; | 0 | ||||||||||||||||||||||||
| 49 | bn_limit_bits_high = high; | - | ||||||||||||||||||||||||
| 50 | bn_limit_num_high = 1 << high; | - | ||||||||||||||||||||||||
| 51 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 52 | if (low >= 0) {
| 0 | ||||||||||||||||||||||||
| 53 | if (low > (int)(sizeof(int) * 8) - 1)
| 0 | ||||||||||||||||||||||||
| 54 | low = sizeof(int) * 8 - 1; never executed: low = sizeof(int) * 8 - 1; | 0 | ||||||||||||||||||||||||
| 55 | bn_limit_bits_low = low; | - | ||||||||||||||||||||||||
| 56 | bn_limit_num_low = 1 << low; | - | ||||||||||||||||||||||||
| 57 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 58 | if (mont >= 0) {
| 0 | ||||||||||||||||||||||||
| 59 | if (mont > (int)(sizeof(int) * 8) - 1)
| 0 | ||||||||||||||||||||||||
| 60 | mont = sizeof(int) * 8 - 1; never executed: mont = sizeof(int) * 8 - 1; | 0 | ||||||||||||||||||||||||
| 61 | bn_limit_bits_mont = mont; | - | ||||||||||||||||||||||||
| 62 | bn_limit_num_mont = 1 << mont; | - | ||||||||||||||||||||||||
| 63 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 64 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 65 | - | |||||||||||||||||||||||||
| 66 | int BN_get_params(int which) | - | ||||||||||||||||||||||||
| 67 | { | - | ||||||||||||||||||||||||
| 68 | if (which == 0)
| 0 | ||||||||||||||||||||||||
| 69 | return bn_limit_bits; never executed: return bn_limit_bits; | 0 | ||||||||||||||||||||||||
| 70 | else if (which == 1)
| 0 | ||||||||||||||||||||||||
| 71 | return bn_limit_bits_high; never executed: return bn_limit_bits_high; | 0 | ||||||||||||||||||||||||
| 72 | else if (which == 2)
| 0 | ||||||||||||||||||||||||
| 73 | return bn_limit_bits_low; never executed: return bn_limit_bits_low; | 0 | ||||||||||||||||||||||||
| 74 | else if (which == 3)
| 0 | ||||||||||||||||||||||||
| 75 | return bn_limit_bits_mont; never executed: return bn_limit_bits_mont; | 0 | ||||||||||||||||||||||||
| 76 | else | - | ||||||||||||||||||||||||
| 77 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 78 | } | - | ||||||||||||||||||||||||
| 79 | #endif | - | ||||||||||||||||||||||||
| 80 | - | |||||||||||||||||||||||||
| 81 | const BIGNUM *BN_value_one(void) | - | ||||||||||||||||||||||||
| 82 | { | - | ||||||||||||||||||||||||
| 83 | static const BN_ULONG data_one = 1L; | - | ||||||||||||||||||||||||
| 84 | static const BIGNUM const_one = | - | ||||||||||||||||||||||||
| 85 | { (BN_ULONG *)&data_one, 1, 1, 0, BN_FLG_STATIC_DATA }; | - | ||||||||||||||||||||||||
| 86 | - | |||||||||||||||||||||||||
| 87 | return &const_one; executed 167455 times by 2 tests: return &const_one;Executed by:
| 167455 | ||||||||||||||||||||||||
| 88 | } | - | ||||||||||||||||||||||||
| 89 | - | |||||||||||||||||||||||||
| 90 | int BN_num_bits_word(BN_ULONG l) | - | ||||||||||||||||||||||||
| 91 | { | - | ||||||||||||||||||||||||
| 92 | BN_ULONG x, mask; | - | ||||||||||||||||||||||||
| 93 | int bits = (l != 0); | - | ||||||||||||||||||||||||
| 94 | - | |||||||||||||||||||||||||
| 95 | #if BN_BITS2 > 32 | - | ||||||||||||||||||||||||
| 96 | x = l >> 32; | - | ||||||||||||||||||||||||
| 97 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 98 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 99 | bits += 32 & mask; | - | ||||||||||||||||||||||||
| 100 | l ^= (x ^ l) & mask; | - | ||||||||||||||||||||||||
| 101 | #endif | - | ||||||||||||||||||||||||
| 102 | - | |||||||||||||||||||||||||
| 103 | x = l >> 16; | - | ||||||||||||||||||||||||
| 104 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 105 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 106 | bits += 16 & mask; | - | ||||||||||||||||||||||||
| 107 | l ^= (x ^ l) & mask; | - | ||||||||||||||||||||||||
| 108 | - | |||||||||||||||||||||||||
| 109 | x = l >> 8; | - | ||||||||||||||||||||||||
| 110 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 111 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 112 | bits += 8 & mask; | - | ||||||||||||||||||||||||
| 113 | l ^= (x ^ l) & mask; | - | ||||||||||||||||||||||||
| 114 | - | |||||||||||||||||||||||||
| 115 | x = l >> 4; | - | ||||||||||||||||||||||||
| 116 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 117 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 118 | bits += 4 & mask; | - | ||||||||||||||||||||||||
| 119 | l ^= (x ^ l) & mask; | - | ||||||||||||||||||||||||
| 120 | - | |||||||||||||||||||||||||
| 121 | x = l >> 2; | - | ||||||||||||||||||||||||
| 122 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 123 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 124 | bits += 2 & mask; | - | ||||||||||||||||||||||||
| 125 | l ^= (x ^ l) & mask; | - | ||||||||||||||||||||||||
| 126 | - | |||||||||||||||||||||||||
| 127 | x = l >> 1; | - | ||||||||||||||||||||||||
| 128 | mask = (0 - x) & BN_MASK2; | - | ||||||||||||||||||||||||
| 129 | mask = (0 - (mask >> (BN_BITS2 - 1))); | - | ||||||||||||||||||||||||
| 130 | bits += 1 & mask; | - | ||||||||||||||||||||||||
| 131 | - | |||||||||||||||||||||||||
| 132 | return bits; executed 27251278 times by 2 tests: return bits;Executed by:
| 27251278 | ||||||||||||||||||||||||
| 133 | } | - | ||||||||||||||||||||||||
| 134 | - | |||||||||||||||||||||||||
| 135 | int BN_num_bits(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 136 | { | - | ||||||||||||||||||||||||
| 137 | int i = a->top - 1; | - | ||||||||||||||||||||||||
| 138 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 139 | - | |||||||||||||||||||||||||
| 140 | if (BN_is_zero(a))
| 11962-23356888 | ||||||||||||||||||||||||
| 141 | return 0; executed 11962 times by 1 test: return 0;Executed by:
| 11962 | ||||||||||||||||||||||||
| 142 | return ((i * BN_BITS2) + BN_num_bits_word(a->d[i])); executed 23356888 times by 2 tests: return ((i * (8 * 8)) + BN_num_bits_word(a->d[i]));Executed by:
| 23356888 | ||||||||||||||||||||||||
| 143 | } | - | ||||||||||||||||||||||||
| 144 | - | |||||||||||||||||||||||||
| 145 | static void bn_free_d(BIGNUM *a) | - | ||||||||||||||||||||||||
| 146 | { | - | ||||||||||||||||||||||||
| 147 | if (BN_get_flags(a, BN_FLG_SECURE))
| 74763-4855179 | ||||||||||||||||||||||||
| 148 | OPENSSL_secure_free(a->d); executed 74763 times by 2 tests: CRYPTO_secure_free(a->d, __FILE__, 148);Executed by:
| 74763 | ||||||||||||||||||||||||
| 149 | else | - | ||||||||||||||||||||||||
| 150 | OPENSSL_free(a->d); executed 4855179 times by 2 tests: CRYPTO_free(a->d, __FILE__, 150);Executed by:
| 4855179 | ||||||||||||||||||||||||
| 151 | } | - | ||||||||||||||||||||||||
| 152 | - | |||||||||||||||||||||||||
| 153 | - | |||||||||||||||||||||||||
| 154 | void BN_clear_free(BIGNUM *a) | - | ||||||||||||||||||||||||
| 155 | { | - | ||||||||||||||||||||||||
| 156 | if (a == NULL)
| 346187-1926437 | ||||||||||||||||||||||||
| 157 | return; executed 346187 times by 2 tests: return;Executed by:
| 346187 | ||||||||||||||||||||||||
| 158 | if (a->d != NULL && !BN_get_flags(a, BN_FLG_STATIC_DATA)) {
| 2-1763832 | ||||||||||||||||||||||||
| 159 | OPENSSL_cleanse(a->d, a->dmax * sizeof(a->d[0])); | - | ||||||||||||||||||||||||
| 160 | bn_free_d(a); | - | ||||||||||||||||||||||||
| 161 | } executed 1763830 times by 2 tests: end of blockExecuted by:
| 1763830 | ||||||||||||||||||||||||
| 162 | if (BN_get_flags(a, BN_FLG_MALLOCED)) {
| 198408-1728029 | ||||||||||||||||||||||||
| 163 | OPENSSL_cleanse(a, sizeof(*a)); | - | ||||||||||||||||||||||||
| 164 | OPENSSL_free(a); | - | ||||||||||||||||||||||||
| 165 | } executed 198408 times by 2 tests: end of blockExecuted by:
| 198408 | ||||||||||||||||||||||||
| 166 | } executed 1926437 times by 2 tests: end of blockExecuted by:
| 1926437 | ||||||||||||||||||||||||
| 167 | - | |||||||||||||||||||||||||
| 168 | void BN_free(BIGNUM *a) | - | ||||||||||||||||||||||||
| 169 | { | - | ||||||||||||||||||||||||
| 170 | if (a == NULL)
| 325716-1181122 | ||||||||||||||||||||||||
| 171 | return; executed 325716 times by 2 tests: return;Executed by:
| 325716 | ||||||||||||||||||||||||
| 172 | if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
| 4455-1176667 | ||||||||||||||||||||||||
| 173 | bn_free_d(a); executed 1176667 times by 2 tests: bn_free_d(a);Executed by:
| 1176667 | ||||||||||||||||||||||||
| 174 | if (a->flags & BN_FLG_MALLOCED)
| 1156-1179966 | ||||||||||||||||||||||||
| 175 | OPENSSL_free(a); executed 1179966 times by 2 tests: CRYPTO_free(a, __FILE__, 175);Executed by:
| 1179966 | ||||||||||||||||||||||||
| 176 | } executed 1181122 times by 2 tests: end of blockExecuted by:
| 1181122 | ||||||||||||||||||||||||
| 177 | - | |||||||||||||||||||||||||
| 178 | void bn_init(BIGNUM *a) | - | ||||||||||||||||||||||||
| 179 | { | - | ||||||||||||||||||||||||
| 180 | static BIGNUM nilbn; | - | ||||||||||||||||||||||||
| 181 | - | |||||||||||||||||||||||||
| 182 | *a = nilbn; | - | ||||||||||||||||||||||||
| 183 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 184 | } executed 5213480 times by 2 tests: end of blockExecuted by:
| 5213480 | ||||||||||||||||||||||||
| 185 | - | |||||||||||||||||||||||||
| 186 | BIGNUM *BN_new(void) | - | ||||||||||||||||||||||||
| 187 | { | - | ||||||||||||||||||||||||
| 188 | BIGNUM *ret; | - | ||||||||||||||||||||||||
| 189 | - | |||||||||||||||||||||||||
| 190 | if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) {
| 0-1378374 | ||||||||||||||||||||||||
| 191 | BNerr(BN_F_BN_NEW, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||||||||
| 192 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 193 | } | - | ||||||||||||||||||||||||
| 194 | ret->flags = BN_FLG_MALLOCED; | - | ||||||||||||||||||||||||
| 195 | bn_check_top(ret); | - | ||||||||||||||||||||||||
| 196 | return ret; executed 1378374 times by 2 tests: return ret;Executed by:
| 1378374 | ||||||||||||||||||||||||
| 197 | } | - | ||||||||||||||||||||||||
| 198 | - | |||||||||||||||||||||||||
| 199 | BIGNUM *BN_secure_new(void) | - | ||||||||||||||||||||||||
| 200 | { | - | ||||||||||||||||||||||||
| 201 | BIGNUM *ret = BN_new(); | - | ||||||||||||||||||||||||
| 202 | if (ret != NULL)
| 0-75262 | ||||||||||||||||||||||||
| 203 | ret->flags |= BN_FLG_SECURE; executed 75262 times by 1 test: ret->flags |= 0x08;Executed by:
| 75262 | ||||||||||||||||||||||||
| 204 | return ret; executed 75262 times by 1 test: return ret;Executed by:
| 75262 | ||||||||||||||||||||||||
| 205 | } | - | ||||||||||||||||||||||||
| 206 | - | |||||||||||||||||||||||||
| 207 | /* This is used by bn_expand2() */ | - | ||||||||||||||||||||||||
| 208 | /* The caller MUST check that words > b->dmax before calling this */ | - | ||||||||||||||||||||||||
| 209 | static BN_ULONG *bn_expand_internal(const BIGNUM *b, int words) | - | ||||||||||||||||||||||||
| 210 | { | - | ||||||||||||||||||||||||
| 211 | BN_ULONG *a = NULL; | - | ||||||||||||||||||||||||
| 212 | - | |||||||||||||||||||||||||
| 213 | if (words > (INT_MAX / (4 * BN_BITS2))) {
| 3-4889508 | ||||||||||||||||||||||||
| 214 | BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_BIGNUM_TOO_LONG); | - | ||||||||||||||||||||||||
| 215 | return NULL; executed 3 times by 1 test: return ((void *)0) ;Executed by:
| 3 | ||||||||||||||||||||||||
| 216 | } | - | ||||||||||||||||||||||||
| 217 | if (BN_get_flags(b, BN_FLG_STATIC_DATA)) {
| 0-4889508 | ||||||||||||||||||||||||
| 218 | BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA); | - | ||||||||||||||||||||||||
| 219 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 220 | } | - | ||||||||||||||||||||||||
| 221 | if (BN_get_flags(b, BN_FLG_SECURE))
| 74760-4814748 | ||||||||||||||||||||||||
| 222 | a = OPENSSL_secure_zalloc(words * sizeof(*a)); executed 74760 times by 2 tests: a = CRYPTO_secure_zalloc(words * sizeof(*a), __FILE__, 222);Executed by:
| 74760 | ||||||||||||||||||||||||
| 223 | else | - | ||||||||||||||||||||||||
| 224 | a = OPENSSL_zalloc(words * sizeof(*a)); executed 4814748 times by 2 tests: a = CRYPTO_zalloc(words * sizeof(*a), __FILE__, 224);Executed by:
| 4814748 | ||||||||||||||||||||||||
| 225 | if (a == NULL) {
| 0-4889508 | ||||||||||||||||||||||||
| 226 | BNerr(BN_F_BN_EXPAND_INTERNAL, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||||||||
| 227 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 228 | } | - | ||||||||||||||||||||||||
| 229 | - | |||||||||||||||||||||||||
| 230 | assert(b->top <= words); | - | ||||||||||||||||||||||||
| 231 | if (b->top > 0)
| 430883-4458625 | ||||||||||||||||||||||||
| 232 | memcpy(a, b->d, sizeof(*a) * b->top); executed 430883 times by 2 tests: memcpy(a, b->d, sizeof(*a) * b->top);Executed by:
| 430883 | ||||||||||||||||||||||||
| 233 | - | |||||||||||||||||||||||||
| 234 | return a; executed 4889508 times by 2 tests: return a;Executed by:
| 4889508 | ||||||||||||||||||||||||
| 235 | } | - | ||||||||||||||||||||||||
| 236 | - | |||||||||||||||||||||||||
| 237 | /* | - | ||||||||||||||||||||||||
| 238 | * This is an internal function that should not be used in applications. It | - | ||||||||||||||||||||||||
| 239 | * ensures that 'b' has enough room for a 'words' word number and initialises | - | ||||||||||||||||||||||||
| 240 | * any unused part of b->d with leading zeros. It is mostly used by the | - | ||||||||||||||||||||||||
| 241 | * various BIGNUM routines. If there is an error, NULL is returned. If not, | - | ||||||||||||||||||||||||
| 242 | * 'b' is returned. | - | ||||||||||||||||||||||||
| 243 | */ | - | ||||||||||||||||||||||||
| 244 | - | |||||||||||||||||||||||||
| 245 | BIGNUM *bn_expand2(BIGNUM *b, int words) | - | ||||||||||||||||||||||||
| 246 | { | - | ||||||||||||||||||||||||
| 247 | if (words > b->dmax) {
| 0-4889511 | ||||||||||||||||||||||||
| 248 | BN_ULONG *a = bn_expand_internal(b, words); | - | ||||||||||||||||||||||||
| 249 | if (!a)
| 3-4889508 | ||||||||||||||||||||||||
| 250 | return NULL; executed 3 times by 1 test: return ((void *)0) ;Executed by:
| 3 | ||||||||||||||||||||||||
| 251 | if (b->d) {
| 1989445-2900063 | ||||||||||||||||||||||||
| 252 | OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0])); | - | ||||||||||||||||||||||||
| 253 | bn_free_d(b); | - | ||||||||||||||||||||||||
| 254 | } executed 1989445 times by 2 tests: end of blockExecuted by:
| 1989445 | ||||||||||||||||||||||||
| 255 | b->d = a; | - | ||||||||||||||||||||||||
| 256 | b->dmax = words; | - | ||||||||||||||||||||||||
| 257 | } executed 4889508 times by 2 tests: end of blockExecuted by:
| 4889508 | ||||||||||||||||||||||||
| 258 | - | |||||||||||||||||||||||||
| 259 | return b; executed 4889508 times by 2 tests: return b;Executed by:
| 4889508 | ||||||||||||||||||||||||
| 260 | } | - | ||||||||||||||||||||||||
| 261 | - | |||||||||||||||||||||||||
| 262 | BIGNUM *BN_dup(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 263 | { | - | ||||||||||||||||||||||||
| 264 | BIGNUM *t; | - | ||||||||||||||||||||||||
| 265 | - | |||||||||||||||||||||||||
| 266 | if (a == NULL)
| 0-46612 | ||||||||||||||||||||||||
| 267 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 268 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 269 | - | |||||||||||||||||||||||||
| 270 | t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
| 1-46611 | ||||||||||||||||||||||||
| 271 | if (t == NULL)
| 0-46612 | ||||||||||||||||||||||||
| 272 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 273 | if (!BN_copy(t, a)) {
| 0-46612 | ||||||||||||||||||||||||
| 274 | BN_free(t); | - | ||||||||||||||||||||||||
| 275 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 276 | } | - | ||||||||||||||||||||||||
| 277 | bn_check_top(t); | - | ||||||||||||||||||||||||
| 278 | return t; executed 46612 times by 2 tests: return t;Executed by:
| 46612 | ||||||||||||||||||||||||
| 279 | } | - | ||||||||||||||||||||||||
| 280 | - | |||||||||||||||||||||||||
| 281 | BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b) | - | ||||||||||||||||||||||||
| 282 | { | - | ||||||||||||||||||||||||
| 283 | bn_check_top(b); | - | ||||||||||||||||||||||||
| 284 | - | |||||||||||||||||||||||||
| 285 | if (a == b)
| 1712-3248124 | ||||||||||||||||||||||||
| 286 | return a; executed 1712 times by 1 test: return a;Executed by:
| 1712 | ||||||||||||||||||||||||
| 287 | if (bn_wexpand(a, b->top) == NULL)
| 0-3248124 | ||||||||||||||||||||||||
| 288 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 289 | - | |||||||||||||||||||||||||
| 290 | if (b->top > 0)
| 79989-3168135 | ||||||||||||||||||||||||
| 291 | memcpy(a->d, b->d, sizeof(b->d[0]) * b->top); executed 3168135 times by 2 tests: memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);Executed by:
| 3168135 | ||||||||||||||||||||||||
| 292 | - | |||||||||||||||||||||||||
| 293 | a->neg = b->neg; | - | ||||||||||||||||||||||||
| 294 | a->top = b->top; | - | ||||||||||||||||||||||||
| 295 | a->flags |= b->flags & BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 296 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 297 | return a; executed 3248124 times by 2 tests: return a;Executed by:
| 3248124 | ||||||||||||||||||||||||
| 298 | } | - | ||||||||||||||||||||||||
| 299 | - | |||||||||||||||||||||||||
| 300 | #define FLAGS_DATA(flags) ((flags) & (BN_FLG_STATIC_DATA \ | - | ||||||||||||||||||||||||
| 301 | | BN_FLG_CONSTTIME \ | - | ||||||||||||||||||||||||
| 302 | | BN_FLG_SECURE \ | - | ||||||||||||||||||||||||
| 303 | | BN_FLG_FIXED_TOP)) | - | ||||||||||||||||||||||||
| 304 | #define FLAGS_STRUCT(flags) ((flags) & (BN_FLG_MALLOCED)) | - | ||||||||||||||||||||||||
| 305 | - | |||||||||||||||||||||||||
| 306 | void BN_swap(BIGNUM *a, BIGNUM *b) | - | ||||||||||||||||||||||||
| 307 | { | - | ||||||||||||||||||||||||
| 308 | int flags_old_a, flags_old_b; | - | ||||||||||||||||||||||||
| 309 | BN_ULONG *tmp_d; | - | ||||||||||||||||||||||||
| 310 | int tmp_top, tmp_dmax, tmp_neg; | - | ||||||||||||||||||||||||
| 311 | - | |||||||||||||||||||||||||
| 312 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 313 | bn_check_top(b); | - | ||||||||||||||||||||||||
| 314 | - | |||||||||||||||||||||||||
| 315 | flags_old_a = a->flags; | - | ||||||||||||||||||||||||
| 316 | flags_old_b = b->flags; | - | ||||||||||||||||||||||||
| 317 | - | |||||||||||||||||||||||||
| 318 | tmp_d = a->d; | - | ||||||||||||||||||||||||
| 319 | tmp_top = a->top; | - | ||||||||||||||||||||||||
| 320 | tmp_dmax = a->dmax; | - | ||||||||||||||||||||||||
| 321 | tmp_neg = a->neg; | - | ||||||||||||||||||||||||
| 322 | - | |||||||||||||||||||||||||
| 323 | a->d = b->d; | - | ||||||||||||||||||||||||
| 324 | a->top = b->top; | - | ||||||||||||||||||||||||
| 325 | a->dmax = b->dmax; | - | ||||||||||||||||||||||||
| 326 | a->neg = b->neg; | - | ||||||||||||||||||||||||
| 327 | - | |||||||||||||||||||||||||
| 328 | b->d = tmp_d; | - | ||||||||||||||||||||||||
| 329 | b->top = tmp_top; | - | ||||||||||||||||||||||||
| 330 | b->dmax = tmp_dmax; | - | ||||||||||||||||||||||||
| 331 | b->neg = tmp_neg; | - | ||||||||||||||||||||||||
| 332 | - | |||||||||||||||||||||||||
| 333 | a->flags = FLAGS_STRUCT(flags_old_a) | FLAGS_DATA(flags_old_b); | - | ||||||||||||||||||||||||
| 334 | b->flags = FLAGS_STRUCT(flags_old_b) | FLAGS_DATA(flags_old_a); | - | ||||||||||||||||||||||||
| 335 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 336 | bn_check_top(b); | - | ||||||||||||||||||||||||
| 337 | } executed 2 times by 1 test: end of blockExecuted by:
| 2 | ||||||||||||||||||||||||
| 338 | - | |||||||||||||||||||||||||
| 339 | void BN_clear(BIGNUM *a) | - | ||||||||||||||||||||||||
| 340 | { | - | ||||||||||||||||||||||||
| 341 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 342 | if (a->d != NULL)
| 0 | ||||||||||||||||||||||||
| 343 | OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax); never executed: OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax); | 0 | ||||||||||||||||||||||||
| 344 | a->neg = 0; | - | ||||||||||||||||||||||||
| 345 | a->top = 0; | - | ||||||||||||||||||||||||
| 346 | a->flags &= ~BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 347 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 348 | - | |||||||||||||||||||||||||
| 349 | BN_ULONG BN_get_word(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 350 | { | - | ||||||||||||||||||||||||
| 351 | if (a->top > 1)
| 582-879 | ||||||||||||||||||||||||
| 352 | return BN_MASK2; executed 582 times by 1 test: return (0xffffffffffffffffL);Executed by:
| 582 | ||||||||||||||||||||||||
| 353 | else if (a->top == 1)
| 3-876 | ||||||||||||||||||||||||
| 354 | return a->d[0]; executed 876 times by 1 test: return a->d[0];Executed by:
| 876 | ||||||||||||||||||||||||
| 355 | /* a->top == 0 */ | - | ||||||||||||||||||||||||
| 356 | return 0; executed 3 times by 1 test: return 0;Executed by:
| 3 | ||||||||||||||||||||||||
| 357 | } | - | ||||||||||||||||||||||||
| 358 | - | |||||||||||||||||||||||||
| 359 | int BN_set_word(BIGNUM *a, BN_ULONG w) | - | ||||||||||||||||||||||||
| 360 | { | - | ||||||||||||||||||||||||
| 361 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 362 | if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL)
| 0-97681932 | ||||||||||||||||||||||||
| 363 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 364 | a->neg = 0; | - | ||||||||||||||||||||||||
| 365 | a->d[0] = w; | - | ||||||||||||||||||||||||
| 366 | a->top = (w ? 1 : 0);
| 174034-97507898 | ||||||||||||||||||||||||
| 367 | a->flags &= ~BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 368 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 369 | return 1; executed 97681932 times by 2 tests: return 1;Executed by:
| 97681932 | ||||||||||||||||||||||||
| 370 | } | - | ||||||||||||||||||||||||
| 371 | - | |||||||||||||||||||||||||
| 372 | BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret) | - | ||||||||||||||||||||||||
| 373 | { | - | ||||||||||||||||||||||||
| 374 | unsigned int i, m; | - | ||||||||||||||||||||||||
| 375 | unsigned int n; | - | ||||||||||||||||||||||||
| 376 | BN_ULONG l; | - | ||||||||||||||||||||||||
| 377 | BIGNUM *bn = NULL; | - | ||||||||||||||||||||||||
| 378 | - | |||||||||||||||||||||||||
| 379 | if (ret == NULL)
| 228973-323799 | ||||||||||||||||||||||||
| 380 | ret = bn = BN_new(); executed 228973 times by 2 tests: ret = bn = BN_new();Executed by:
| 228973 | ||||||||||||||||||||||||
| 381 | if (ret == NULL)
| 0-552772 | ||||||||||||||||||||||||
| 382 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 383 | bn_check_top(ret); | - | ||||||||||||||||||||||||
| 384 | /* Skip leading zero's. */ | - | ||||||||||||||||||||||||
| 385 | for ( ; len > 0 && *s == 0; s++, len--)
| 11110-1060628 | ||||||||||||||||||||||||
| 386 | continue; executed 518966 times by 2 tests: continue;Executed by:
| 518966 | ||||||||||||||||||||||||
| 387 | n = len; | - | ||||||||||||||||||||||||
| 388 | if (n == 0) {
| 11107-541665 | ||||||||||||||||||||||||
| 389 | ret->top = 0; | - | ||||||||||||||||||||||||
| 390 | return ret; executed 11107 times by 1 test: return ret;Executed by:
| 11107 | ||||||||||||||||||||||||
| 391 | } | - | ||||||||||||||||||||||||
| 392 | i = ((n - 1) / BN_BYTES) + 1; | - | ||||||||||||||||||||||||
| 393 | m = ((n - 1) % (BN_BYTES)); | - | ||||||||||||||||||||||||
| 394 | if (bn_wexpand(ret, (int)i) == NULL) {
| 3-541662 | ||||||||||||||||||||||||
| 395 | BN_free(bn); | - | ||||||||||||||||||||||||
| 396 | return NULL; executed 3 times by 1 test: return ((void *)0) ;Executed by:
| 3 | ||||||||||||||||||||||||
| 397 | } | - | ||||||||||||||||||||||||
| 398 | ret->top = i; | - | ||||||||||||||||||||||||
| 399 | ret->neg = 0; | - | ||||||||||||||||||||||||
| 400 | l = 0; | - | ||||||||||||||||||||||||
| 401 | while (n--) {
| 541662-28215531 | ||||||||||||||||||||||||
| 402 | l = (l << 8L) | *(s++); | - | ||||||||||||||||||||||||
| 403 | if (m-- == 0) {
| 3668371-24547160 | ||||||||||||||||||||||||
| 404 | ret->d[--i] = l; | - | ||||||||||||||||||||||||
| 405 | l = 0; | - | ||||||||||||||||||||||||
| 406 | m = BN_BYTES - 1; | - | ||||||||||||||||||||||||
| 407 | } executed 3668371 times by 2 tests: end of blockExecuted by:
| 3668371 | ||||||||||||||||||||||||
| 408 | } executed 28215531 times by 2 tests: end of blockExecuted by:
| 28215531 | ||||||||||||||||||||||||
| 409 | /* | - | ||||||||||||||||||||||||
| 410 | * need to call this due to clear byte at top if avoiding having the top | - | ||||||||||||||||||||||||
| 411 | * bit set (-ve number) | - | ||||||||||||||||||||||||
| 412 | */ | - | ||||||||||||||||||||||||
| 413 | bn_correct_top(ret); | - | ||||||||||||||||||||||||
| 414 | return ret; executed 541662 times by 2 tests: return ret;Executed by:
| 541662 | ||||||||||||||||||||||||
| 415 | } | - | ||||||||||||||||||||||||
| 416 | - | |||||||||||||||||||||||||
| 417 | /* ignore negative */ | - | ||||||||||||||||||||||||
| 418 | static int bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) | - | ||||||||||||||||||||||||
| 419 | { | - | ||||||||||||||||||||||||
| 420 | int n; | - | ||||||||||||||||||||||||
| 421 | size_t i, lasti, j, atop, mask; | - | ||||||||||||||||||||||||
| 422 | BN_ULONG l; | - | ||||||||||||||||||||||||
| 423 | - | |||||||||||||||||||||||||
| 424 | /* | - | ||||||||||||||||||||||||
| 425 | * In case |a| is fixed-top, BN_num_bytes can return bogus length, | - | ||||||||||||||||||||||||
| 426 | * but it's assumed that fixed-top inputs ought to be "nominated" | - | ||||||||||||||||||||||||
| 427 | * even for padded output, so it works out... | - | ||||||||||||||||||||||||
| 428 | */ | - | ||||||||||||||||||||||||
| 429 | n = BN_num_bytes(a); | - | ||||||||||||||||||||||||
| 430 | if (tolen == -1) {
| 6501-60919 | ||||||||||||||||||||||||
| 431 | tolen = n; | - | ||||||||||||||||||||||||
| 432 | } else if (tolen < n) { /* uncommon/unlike case */ executed 60919 times by 2 tests: end of blockExecuted by:
| 78-60919 | ||||||||||||||||||||||||
| 433 | BIGNUM temp = *a; | - | ||||||||||||||||||||||||
| 434 | - | |||||||||||||||||||||||||
| 435 | bn_correct_top(&temp); | - | ||||||||||||||||||||||||
| 436 | n = BN_num_bytes(&temp); | - | ||||||||||||||||||||||||
| 437 | if (tolen < n)
| 0-78 | ||||||||||||||||||||||||
| 438 | return -1; executed 78 times by 1 test: return -1;Executed by:
| 78 | ||||||||||||||||||||||||
| 439 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 440 | - | |||||||||||||||||||||||||
| 441 | /* Swipe through whole available data and don't give away padded zero. */ | - | ||||||||||||||||||||||||
| 442 | atop = a->dmax * BN_BYTES; | - | ||||||||||||||||||||||||
| 443 | if (atop == 0) {
| 807-66535 | ||||||||||||||||||||||||
| 444 | OPENSSL_cleanse(to, tolen); | - | ||||||||||||||||||||||||
| 445 | return tolen; executed 807 times by 1 test: return tolen;Executed by:
| 807 | ||||||||||||||||||||||||
| 446 | } | - | ||||||||||||||||||||||||
| 447 | - | |||||||||||||||||||||||||
| 448 | lasti = atop - 1; | - | ||||||||||||||||||||||||
| 449 | atop = a->top * BN_BYTES; | - | ||||||||||||||||||||||||
| 450 | for (i = 0, j = 0, to += tolen; j < (size_t)tolen; j++) {
| 66535-3658384 | ||||||||||||||||||||||||
| 451 | l = a->d[i / BN_BYTES]; | - | ||||||||||||||||||||||||
| 452 | mask = 0 - ((j - atop) >> (8 * sizeof(i) - 1)); | - | ||||||||||||||||||||||||
| 453 | *--to = (unsigned char)(l >> (8 * (i % BN_BYTES)) & mask); | - | ||||||||||||||||||||||||
| 454 | i += (i - lasti) >> (8 * sizeof(i) - 1); /* stay on last limb */ | - | ||||||||||||||||||||||||
| 455 | } executed 3658384 times by 2 tests: end of blockExecuted by:
| 3658384 | ||||||||||||||||||||||||
| 456 | - | |||||||||||||||||||||||||
| 457 | return tolen; executed 66535 times by 2 tests: return tolen;Executed by:
| 66535 | ||||||||||||||||||||||||
| 458 | } | - | ||||||||||||||||||||||||
| 459 | - | |||||||||||||||||||||||||
| 460 | int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen) | - | ||||||||||||||||||||||||
| 461 | { | - | ||||||||||||||||||||||||
| 462 | if (tolen < 0)
| 0-6501 | ||||||||||||||||||||||||
| 463 | return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
| 464 | return bn2binpad(a, to, tolen); executed 6501 times by 2 tests: return bn2binpad(a, to, tolen);Executed by:
| 6501 | ||||||||||||||||||||||||
| 465 | } | - | ||||||||||||||||||||||||
| 466 | - | |||||||||||||||||||||||||
| 467 | int BN_bn2bin(const BIGNUM *a, unsigned char *to) | - | ||||||||||||||||||||||||
| 468 | { | - | ||||||||||||||||||||||||
| 469 | return bn2binpad(a, to, -1); executed 60919 times by 2 tests: return bn2binpad(a, to, -1);Executed by:
| 60919 | ||||||||||||||||||||||||
| 470 | } | - | ||||||||||||||||||||||||
| 471 | - | |||||||||||||||||||||||||
| 472 | BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret) | - | ||||||||||||||||||||||||
| 473 | { | - | ||||||||||||||||||||||||
| 474 | unsigned int i, m; | - | ||||||||||||||||||||||||
| 475 | unsigned int n; | - | ||||||||||||||||||||||||
| 476 | BN_ULONG l; | - | ||||||||||||||||||||||||
| 477 | BIGNUM *bn = NULL; | - | ||||||||||||||||||||||||
| 478 | - | |||||||||||||||||||||||||
| 479 | if (ret == NULL)
| 0-15 | ||||||||||||||||||||||||
| 480 | ret = bn = BN_new(); executed 15 times by 1 test: ret = bn = BN_new();Executed by:
| 15 | ||||||||||||||||||||||||
| 481 | if (ret == NULL)
| 0-15 | ||||||||||||||||||||||||
| 482 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 483 | bn_check_top(ret); | - | ||||||||||||||||||||||||
| 484 | s += len; | - | ||||||||||||||||||||||||
| 485 | /* Skip trailing zeroes. */ | - | ||||||||||||||||||||||||
| 486 | for ( ; len > 0 && s[-1] == 0; s--, len--)
| 0-15 | ||||||||||||||||||||||||
| 487 | continue; never executed: continue; | 0 | ||||||||||||||||||||||||
| 488 | n = len; | - | ||||||||||||||||||||||||
| 489 | if (n == 0) {
| 0-15 | ||||||||||||||||||||||||
| 490 | ret->top = 0; | - | ||||||||||||||||||||||||
| 491 | return ret; never executed: return ret; | 0 | ||||||||||||||||||||||||
| 492 | } | - | ||||||||||||||||||||||||
| 493 | i = ((n - 1) / BN_BYTES) + 1; | - | ||||||||||||||||||||||||
| 494 | m = ((n - 1) % (BN_BYTES)); | - | ||||||||||||||||||||||||
| 495 | if (bn_wexpand(ret, (int)i) == NULL) {
| 0-15 | ||||||||||||||||||||||||
| 496 | BN_free(bn); | - | ||||||||||||||||||||||||
| 497 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 498 | } | - | ||||||||||||||||||||||||
| 499 | ret->top = i; | - | ||||||||||||||||||||||||
| 500 | ret->neg = 0; | - | ||||||||||||||||||||||||
| 501 | l = 0; | - | ||||||||||||||||||||||||
| 502 | while (n--) {
| 15-1404 | ||||||||||||||||||||||||
| 503 | s--; | - | ||||||||||||||||||||||||
| 504 | l = (l << 8L) | *s; | - | ||||||||||||||||||||||||
| 505 | if (m-- == 0) {
| 177-1227 | ||||||||||||||||||||||||
| 506 | ret->d[--i] = l; | - | ||||||||||||||||||||||||
| 507 | l = 0; | - | ||||||||||||||||||||||||
| 508 | m = BN_BYTES - 1; | - | ||||||||||||||||||||||||
| 509 | } executed 177 times by 1 test: end of blockExecuted by:
| 177 | ||||||||||||||||||||||||
| 510 | } executed 1404 times by 1 test: end of blockExecuted by:
| 1404 | ||||||||||||||||||||||||
| 511 | /* | - | ||||||||||||||||||||||||
| 512 | * need to call this due to clear byte at top if avoiding having the top | - | ||||||||||||||||||||||||
| 513 | * bit set (-ve number) | - | ||||||||||||||||||||||||
| 514 | */ | - | ||||||||||||||||||||||||
| 515 | bn_correct_top(ret); | - | ||||||||||||||||||||||||
| 516 | return ret; executed 15 times by 1 test: return ret;Executed by:
| 15 | ||||||||||||||||||||||||
| 517 | } | - | ||||||||||||||||||||||||
| 518 | - | |||||||||||||||||||||||||
| 519 | int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen) | - | ||||||||||||||||||||||||
| 520 | { | - | ||||||||||||||||||||||||
| 521 | int i; | - | ||||||||||||||||||||||||
| 522 | BN_ULONG l; | - | ||||||||||||||||||||||||
| 523 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 524 | i = BN_num_bytes(a); | - | ||||||||||||||||||||||||
| 525 | if (tolen < i)
| 0-24 | ||||||||||||||||||||||||
| 526 | return -1; never executed: return -1; | 0 | ||||||||||||||||||||||||
| 527 | /* Add trailing zeroes if necessary */ | - | ||||||||||||||||||||||||
| 528 | if (tolen > i)
| 4-20 | ||||||||||||||||||||||||
| 529 | memset(to + i, 0, tolen - i); executed 4 times by 1 test: memset(to + i, 0, tolen - i);Executed by:
| 4 | ||||||||||||||||||||||||
| 530 | to += i; | - | ||||||||||||||||||||||||
| 531 | while (i--) {
| 24-1884 | ||||||||||||||||||||||||
| 532 | l = a->d[i / BN_BYTES]; | - | ||||||||||||||||||||||||
| 533 | to--; | - | ||||||||||||||||||||||||
| 534 | *to = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff; | - | ||||||||||||||||||||||||
| 535 | } executed 1884 times by 1 test: end of blockExecuted by:
| 1884 | ||||||||||||||||||||||||
| 536 | return tolen; executed 24 times by 1 test: return tolen;Executed by:
| 24 | ||||||||||||||||||||||||
| 537 | } | - | ||||||||||||||||||||||||
| 538 | - | |||||||||||||||||||||||||
| 539 | int BN_ucmp(const BIGNUM *a, const BIGNUM *b) | - | ||||||||||||||||||||||||
| 540 | { | - | ||||||||||||||||||||||||
| 541 | int i; | - | ||||||||||||||||||||||||
| 542 | BN_ULONG t1, t2, *ap, *bp; | - | ||||||||||||||||||||||||
| 543 | - | |||||||||||||||||||||||||
| 544 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 545 | bn_check_top(b); | - | ||||||||||||||||||||||||
| 546 | - | |||||||||||||||||||||||||
| 547 | i = a->top - b->top; | - | ||||||||||||||||||||||||
| 548 | if (i != 0)
| 5553445-17957942 | ||||||||||||||||||||||||
| 549 | return i; executed 5553445 times by 2 tests: return i;Executed by:
| 5553445 | ||||||||||||||||||||||||
| 550 | ap = a->d; | - | ||||||||||||||||||||||||
| 551 | bp = b->d; | - | ||||||||||||||||||||||||
| 552 | for (i = a->top - 1; i >= 0; i--) {
| 277374-18873871 | ||||||||||||||||||||||||
| 553 | t1 = ap[i]; | - | ||||||||||||||||||||||||
| 554 | t2 = bp[i]; | - | ||||||||||||||||||||||||
| 555 | if (t1 != t2)
| 1193303-17680568 | ||||||||||||||||||||||||
| 556 | return ((t1 > t2) ? 1 : -1); executed 17680568 times by 2 tests: return ((t1 > t2) ? 1 : -1);Executed by:
| 5030131-17680568 | ||||||||||||||||||||||||
| 557 | } executed 1193303 times by 2 tests: end of blockExecuted by:
| 1193303 | ||||||||||||||||||||||||
| 558 | return 0; executed 277374 times by 2 tests: return 0;Executed by:
| 277374 | ||||||||||||||||||||||||
| 559 | } | - | ||||||||||||||||||||||||
| 560 | - | |||||||||||||||||||||||||
| 561 | int BN_cmp(const BIGNUM *a, const BIGNUM *b) | - | ||||||||||||||||||||||||
| 562 | { | - | ||||||||||||||||||||||||
| 563 | int i; | - | ||||||||||||||||||||||||
| 564 | int gt, lt; | - | ||||||||||||||||||||||||
| 565 | BN_ULONG t1, t2; | - | ||||||||||||||||||||||||
| 566 | - | |||||||||||||||||||||||||
| 567 | if ((a == NULL) || (b == NULL)) {
| 3-3486604 | ||||||||||||||||||||||||
| 568 | if (a != NULL)
| 3 | ||||||||||||||||||||||||
| 569 | return -1; executed 3 times by 1 test: return -1;Executed by:
| 3 | ||||||||||||||||||||||||
| 570 | else if (b != NULL)
| 1-2 | ||||||||||||||||||||||||
| 571 | return 1; executed 1 time by 1 test: return 1;Executed by:
| 1 | ||||||||||||||||||||||||
| 572 | else | - | ||||||||||||||||||||||||
| 573 | return 0; executed 2 times by 1 test: return 0;Executed by:
| 2 | ||||||||||||||||||||||||
| 574 | } | - | ||||||||||||||||||||||||
| 575 | - | |||||||||||||||||||||||||
| 576 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 577 | bn_check_top(b); | - | ||||||||||||||||||||||||
| 578 | - | |||||||||||||||||||||||||
| 579 | if (a->neg != b->neg) {
| 14-3486587 | ||||||||||||||||||||||||
| 580 | if (a->neg)
| 4-10 | ||||||||||||||||||||||||
| 581 | return -1; executed 4 times by 1 test: return -1;Executed by:
| 4 | ||||||||||||||||||||||||
| 582 | else | - | ||||||||||||||||||||||||
| 583 | return 1; executed 10 times by 1 test: return 1;Executed by:
| 10 | ||||||||||||||||||||||||
| 584 | } | - | ||||||||||||||||||||||||
| 585 | if (a->neg == 0) {
| 3351-3483236 | ||||||||||||||||||||||||
| 586 | gt = 1; | - | ||||||||||||||||||||||||
| 587 | lt = -1; | - | ||||||||||||||||||||||||
| 588 | } else { executed 3483236 times by 2 tests: end of blockExecuted by:
| 3483236 | ||||||||||||||||||||||||
| 589 | gt = -1; | - | ||||||||||||||||||||||||
| 590 | lt = 1; | - | ||||||||||||||||||||||||
| 591 | } executed 3351 times by 1 test: end of blockExecuted by:
| 3351 | ||||||||||||||||||||||||
| 592 | - | |||||||||||||||||||||||||
| 593 | if (a->top > b->top)
| 816003-2670584 | ||||||||||||||||||||||||
| 594 | return gt; executed 816003 times by 2 tests: return gt;Executed by:
| 816003 | ||||||||||||||||||||||||
| 595 | if (a->top < b->top)
| 44279-2626305 | ||||||||||||||||||||||||
| 596 | return lt; executed 44279 times by 1 test: return lt;Executed by:
| 44279 | ||||||||||||||||||||||||
| 597 | for (i = a->top - 1; i >= 0; i--) {
| 122509-3358288 | ||||||||||||||||||||||||
| 598 | t1 = a->d[i]; | - | ||||||||||||||||||||||||
| 599 | t2 = b->d[i]; | - | ||||||||||||||||||||||||
| 600 | if (t1 > t2)
| 909111-2449177 | ||||||||||||||||||||||||
| 601 | return gt; executed 909111 times by 2 tests: return gt;Executed by:
| 909111 | ||||||||||||||||||||||||
| 602 | if (t1 < t2)
| 854492-1594685 | ||||||||||||||||||||||||
| 603 | return lt; executed 1594685 times by 2 tests: return lt;Executed by:
| 1594685 | ||||||||||||||||||||||||
| 604 | } executed 854492 times by 2 tests: end of blockExecuted by:
| 854492 | ||||||||||||||||||||||||
| 605 | return 0; executed 122509 times by 2 tests: return 0;Executed by:
| 122509 | ||||||||||||||||||||||||
| 606 | } | - | ||||||||||||||||||||||||
| 607 | - | |||||||||||||||||||||||||
| 608 | int BN_set_bit(BIGNUM *a, int n) | - | ||||||||||||||||||||||||
| 609 | { | - | ||||||||||||||||||||||||
| 610 | int i, j, k; | - | ||||||||||||||||||||||||
| 611 | - | |||||||||||||||||||||||||
| 612 | if (n < 0)
| 0-170758 | ||||||||||||||||||||||||
| 613 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 614 | - | |||||||||||||||||||||||||
| 615 | i = n / BN_BITS2; | - | ||||||||||||||||||||||||
| 616 | j = n % BN_BITS2; | - | ||||||||||||||||||||||||
| 617 | if (a->top <= i) {
| 620-170138 | ||||||||||||||||||||||||
| 618 | if (bn_wexpand(a, i + 1) == NULL)
| 0-170138 | ||||||||||||||||||||||||
| 619 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 620 | for (k = a->top; k < i + 1; k++)
| 170138-1585657 | ||||||||||||||||||||||||
| 621 | a->d[k] = 0; executed 1585657 times by 2 tests: a->d[k] = 0;Executed by:
| 1585657 | ||||||||||||||||||||||||
| 622 | a->top = i + 1; | - | ||||||||||||||||||||||||
| 623 | a->flags &= ~BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 624 | } executed 170138 times by 2 tests: end of blockExecuted by:
| 170138 | ||||||||||||||||||||||||
| 625 | - | |||||||||||||||||||||||||
| 626 | a->d[i] |= (((BN_ULONG)1) << j); | - | ||||||||||||||||||||||||
| 627 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 628 | return 1; executed 170758 times by 2 tests: return 1;Executed by:
| 170758 | ||||||||||||||||||||||||
| 629 | } | - | ||||||||||||||||||||||||
| 630 | - | |||||||||||||||||||||||||
| 631 | int BN_clear_bit(BIGNUM *a, int n) | - | ||||||||||||||||||||||||
| 632 | { | - | ||||||||||||||||||||||||
| 633 | int i, j; | - | ||||||||||||||||||||||||
| 634 | - | |||||||||||||||||||||||||
| 635 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 636 | if (n < 0)
| 0-2 | ||||||||||||||||||||||||
| 637 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 638 | - | |||||||||||||||||||||||||
| 639 | i = n / BN_BITS2; | - | ||||||||||||||||||||||||
| 640 | j = n % BN_BITS2; | - | ||||||||||||||||||||||||
| 641 | if (a->top <= i)
| 0-2 | ||||||||||||||||||||||||
| 642 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 643 | - | |||||||||||||||||||||||||
| 644 | a->d[i] &= (~(((BN_ULONG)1) << j)); | - | ||||||||||||||||||||||||
| 645 | bn_correct_top(a); | - | ||||||||||||||||||||||||
| 646 | return 1; executed 2 times by 1 test: return 1;Executed by:
| 2 | ||||||||||||||||||||||||
| 647 | } | - | ||||||||||||||||||||||||
| 648 | - | |||||||||||||||||||||||||
| 649 | int BN_is_bit_set(const BIGNUM *a, int n) | - | ||||||||||||||||||||||||
| 650 | { | - | ||||||||||||||||||||||||
| 651 | int i, j; | - | ||||||||||||||||||||||||
| 652 | - | |||||||||||||||||||||||||
| 653 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 654 | if (n < 0)
| 627-20344838 | ||||||||||||||||||||||||
| 655 | return 0; executed 627 times by 1 test: return 0;Executed by:
| 627 | ||||||||||||||||||||||||
| 656 | i = n / BN_BITS2; | - | ||||||||||||||||||||||||
| 657 | j = n % BN_BITS2; | - | ||||||||||||||||||||||||
| 658 | if (a->top <= i)
| 3521-20341317 | ||||||||||||||||||||||||
| 659 | return 0; executed 3521 times by 2 tests: return 0;Executed by:
| 3521 | ||||||||||||||||||||||||
| 660 | return (int)(((a->d[i]) >> j) & ((BN_ULONG)1)); executed 20341317 times by 2 tests: return (int)(((a->d[i]) >> j) & ((unsigned long)1));Executed by:
| 20341317 | ||||||||||||||||||||||||
| 661 | } | - | ||||||||||||||||||||||||
| 662 | - | |||||||||||||||||||||||||
| 663 | int BN_mask_bits(BIGNUM *a, int n) | - | ||||||||||||||||||||||||
| 664 | { | - | ||||||||||||||||||||||||
| 665 | int b, w; | - | ||||||||||||||||||||||||
| 666 | - | |||||||||||||||||||||||||
| 667 | bn_check_top(a); | - | ||||||||||||||||||||||||
| 668 | if (n < 0)
| 0-106 | ||||||||||||||||||||||||
| 669 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 670 | - | |||||||||||||||||||||||||
| 671 | w = n / BN_BITS2; | - | ||||||||||||||||||||||||
| 672 | b = n % BN_BITS2; | - | ||||||||||||||||||||||||
| 673 | if (w >= a->top)
| 0-106 | ||||||||||||||||||||||||
| 674 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 675 | if (b == 0)
| 0-106 | ||||||||||||||||||||||||
| 676 | a->top = w; never executed: a->top = w; | 0 | ||||||||||||||||||||||||
| 677 | else { | - | ||||||||||||||||||||||||
| 678 | a->top = w + 1; | - | ||||||||||||||||||||||||
| 679 | a->d[w] &= ~(BN_MASK2 << b); | - | ||||||||||||||||||||||||
| 680 | } executed 106 times by 1 test: end of blockExecuted by:
| 106 | ||||||||||||||||||||||||
| 681 | bn_correct_top(a); | - | ||||||||||||||||||||||||
| 682 | return 1; executed 106 times by 1 test: return 1;Executed by:
| 106 | ||||||||||||||||||||||||
| 683 | } | - | ||||||||||||||||||||||||
| 684 | - | |||||||||||||||||||||||||
| 685 | void BN_set_negative(BIGNUM *a, int b) | - | ||||||||||||||||||||||||
| 686 | { | - | ||||||||||||||||||||||||
| 687 | if (b && !BN_is_zero(a))
| 44-273582 | ||||||||||||||||||||||||
| 688 | a->neg = 1; executed 4233 times by 1 test: a->neg = 1;Executed by:
| 4233 | ||||||||||||||||||||||||
| 689 | else | - | ||||||||||||||||||||||||
| 690 | a->neg = 0; executed 273626 times by 2 tests: a->neg = 0;Executed by:
| 273626 | ||||||||||||||||||||||||
| 691 | } | - | ||||||||||||||||||||||||
| 692 | - | |||||||||||||||||||||||||
| 693 | int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n) | - | ||||||||||||||||||||||||
| 694 | { | - | ||||||||||||||||||||||||
| 695 | int i; | - | ||||||||||||||||||||||||
| 696 | BN_ULONG aa, bb; | - | ||||||||||||||||||||||||
| 697 | - | |||||||||||||||||||||||||
| 698 | aa = a[n - 1]; | - | ||||||||||||||||||||||||
| 699 | bb = b[n - 1]; | - | ||||||||||||||||||||||||
| 700 | if (aa != bb)
| 104887-591616 | ||||||||||||||||||||||||
| 701 | return ((aa > bb) ? 1 : -1); executed 591616 times by 1 test: return ((aa > bb) ? 1 : -1);Executed by:
| 278925-591616 | ||||||||||||||||||||||||
| 702 | for (i = n - 2; i >= 0; i--) {
| 45640-759648 | ||||||||||||||||||||||||
| 703 | aa = a[i]; | - | ||||||||||||||||||||||||
| 704 | bb = b[i]; | - | ||||||||||||||||||||||||
| 705 | if (aa != bb)
| 59247-700401 | ||||||||||||||||||||||||
| 706 | return ((aa > bb) ? 1 : -1); executed 59247 times by 1 test: return ((aa > bb) ? 1 : -1);Executed by:
| 23228-59247 | ||||||||||||||||||||||||
| 707 | } executed 700401 times by 1 test: end of blockExecuted by:
| 700401 | ||||||||||||||||||||||||
| 708 | return 0; executed 45640 times by 1 test: return 0;Executed by:
| 45640 | ||||||||||||||||||||||||
| 709 | } | - | ||||||||||||||||||||||||
| 710 | - | |||||||||||||||||||||||||
| 711 | /* | - | ||||||||||||||||||||||||
| 712 | * Here follows a specialised variants of bn_cmp_words(). It has the | - | ||||||||||||||||||||||||
| 713 | * capability of performing the operation on arrays of different sizes. The | - | ||||||||||||||||||||||||
| 714 | * sizes of those arrays is expressed through cl, which is the common length | - | ||||||||||||||||||||||||
| 715 | * ( basically, min(len(a),len(b)) ), and dl, which is the delta between the | - | ||||||||||||||||||||||||
| 716 | * two lengths, calculated as len(a)-len(b). All lengths are the number of | - | ||||||||||||||||||||||||
| 717 | * BN_ULONGs... | - | ||||||||||||||||||||||||
| 718 | */ | - | ||||||||||||||||||||||||
| 719 | - | |||||||||||||||||||||||||
| 720 | int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl) | - | ||||||||||||||||||||||||
| 721 | { | - | ||||||||||||||||||||||||
| 722 | int n, i; | - | ||||||||||||||||||||||||
| 723 | n = cl - 1; | - | ||||||||||||||||||||||||
| 724 | - | |||||||||||||||||||||||||
| 725 | if (dl < 0) {
| 40010-677866 | ||||||||||||||||||||||||
| 726 | for (i = dl; i < 0; i++) {
| 3985-66274 | ||||||||||||||||||||||||
| 727 | if (b[n - i] != 0)
| 30249-36025 | ||||||||||||||||||||||||
| 728 | return -1; /* a < b */ executed 36025 times by 1 test: return -1;Executed by:
| 36025 | ||||||||||||||||||||||||
| 729 | } executed 30249 times by 1 test: end of blockExecuted by:
| 30249 | ||||||||||||||||||||||||
| 730 | } executed 3985 times by 1 test: end of blockExecuted by:
| 3985 | ||||||||||||||||||||||||
| 731 | if (dl > 0) {
| 38964-642887 | ||||||||||||||||||||||||
| 732 | for (i = dl; i > 0; i--) {
| 8644-145592 | ||||||||||||||||||||||||
| 733 | if (a[n + i] != 0)
| 30320-115272 | ||||||||||||||||||||||||
| 734 | return 1; /* a > b */ executed 30320 times by 1 test: return 1;Executed by:
| 30320 | ||||||||||||||||||||||||
| 735 | } executed 115272 times by 1 test: end of blockExecuted by:
| 115272 | ||||||||||||||||||||||||
| 736 | } executed 8644 times by 1 test: end of blockExecuted by:
| 8644 | ||||||||||||||||||||||||
| 737 | return bn_cmp_words(a, b, cl); executed 651531 times by 1 test: return bn_cmp_words(a, b, cl);Executed by:
| 651531 | ||||||||||||||||||||||||
| 738 | } | - | ||||||||||||||||||||||||
| 739 | - | |||||||||||||||||||||||||
| 740 | /* | - | ||||||||||||||||||||||||
| 741 | * Constant-time conditional swap of a and b. | - | ||||||||||||||||||||||||
| 742 | * a and b are swapped if condition is not 0. The code assumes that at most one bit of condition is set. | - | ||||||||||||||||||||||||
| 743 | * nwords is the number of words to swap. The code assumes that at least nwords are allocated in both a and b, | - | ||||||||||||||||||||||||
| 744 | * and that no more than nwords are used by either a or b. | - | ||||||||||||||||||||||||
| 745 | * a and b cannot be the same number | - | ||||||||||||||||||||||||
| 746 | */ | - | ||||||||||||||||||||||||
| 747 | void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords) | - | ||||||||||||||||||||||||
| 748 | { | - | ||||||||||||||||||||||||
| 749 | BN_ULONG t; | - | ||||||||||||||||||||||||
| 750 | int i; | - | ||||||||||||||||||||||||
| 751 | - | |||||||||||||||||||||||||
| 752 | bn_wcheck_size(a, nwords); | - | ||||||||||||||||||||||||
| 753 | bn_wcheck_size(b, nwords); | - | ||||||||||||||||||||||||
| 754 | - | |||||||||||||||||||||||||
| 755 | assert(a != b); | - | ||||||||||||||||||||||||
| 756 | assert((condition & (condition - 1)) == 0); | - | ||||||||||||||||||||||||
| 757 | assert(sizeof(BN_ULONG) >= sizeof(int)); | - | ||||||||||||||||||||||||
| 758 | - | |||||||||||||||||||||||||
| 759 | condition = ((condition - 1) >> (BN_BITS2 - 1)) - 1; | - | ||||||||||||||||||||||||
| 760 | - | |||||||||||||||||||||||||
| 761 | t = (a->top ^ b->top) & condition; | - | ||||||||||||||||||||||||
| 762 | a->top ^= t; | - | ||||||||||||||||||||||||
| 763 | b->top ^= t; | - | ||||||||||||||||||||||||
| 764 | - | |||||||||||||||||||||||||
| 765 | t = (a->neg ^ b->neg) & condition; | - | ||||||||||||||||||||||||
| 766 | a->neg ^= t; | - | ||||||||||||||||||||||||
| 767 | b->neg ^= t; | - | ||||||||||||||||||||||||
| 768 | - | |||||||||||||||||||||||||
| 769 | /*- | - | ||||||||||||||||||||||||
| 770 | * Idea behind BN_FLG_STATIC_DATA is actually to | - | ||||||||||||||||||||||||
| 771 | * indicate that data may not be written to. | - | ||||||||||||||||||||||||
| 772 | * Intention is actually to treat it as it's | - | ||||||||||||||||||||||||
| 773 | * read-only data, and some (if not most) of it does | - | ||||||||||||||||||||||||
| 774 | * reside in read-only segment. In other words | - | ||||||||||||||||||||||||
| 775 | * observation of BN_FLG_STATIC_DATA in | - | ||||||||||||||||||||||||
| 776 | * BN_consttime_swap should be treated as fatal | - | ||||||||||||||||||||||||
| 777 | * condition. It would either cause SEGV or | - | ||||||||||||||||||||||||
| 778 | * effectively cause data corruption. | - | ||||||||||||||||||||||||
| 779 | * BN_FLG_MALLOCED refers to BN structure itself, | - | ||||||||||||||||||||||||
| 780 | * and hence must be preserved. Remaining flags are | - | ||||||||||||||||||||||||
| 781 | * BN_FLG_CONSTIME and BN_FLG_SECURE. Latter must be | - | ||||||||||||||||||||||||
| 782 | * preserved, because it determines how x->d was | - | ||||||||||||||||||||||||
| 783 | * allocated and hence how to free it. This leaves | - | ||||||||||||||||||||||||
| 784 | * BN_FLG_CONSTTIME that one can do something about. | - | ||||||||||||||||||||||||
| 785 | * To summarize it's sufficient to mask and swap | - | ||||||||||||||||||||||||
| 786 | * BN_FLG_CONSTTIME alone. BN_FLG_STATIC_DATA should | - | ||||||||||||||||||||||||
| 787 | * be treated as fatal. | - | ||||||||||||||||||||||||
| 788 | */ | - | ||||||||||||||||||||||||
| 789 | t = ((a->flags ^ b->flags) & BN_FLG_CONSTTIME) & condition; | - | ||||||||||||||||||||||||
| 790 | a->flags ^= t; | - | ||||||||||||||||||||||||
| 791 | b->flags ^= t; | - | ||||||||||||||||||||||||
| 792 | - | |||||||||||||||||||||||||
| 793 | #define BN_CONSTTIME_SWAP(ind) \ | - | ||||||||||||||||||||||||
| 794 | do { \ | - | ||||||||||||||||||||||||
| 795 | t = (a->d[ind] ^ b->d[ind]) & condition; \ | - | ||||||||||||||||||||||||
| 796 | a->d[ind] ^= t; \ | - | ||||||||||||||||||||||||
| 797 | b->d[ind] ^= t; \ | - | ||||||||||||||||||||||||
| 798 | } while (0) | - | ||||||||||||||||||||||||
| 799 | - | |||||||||||||||||||||||||
| 800 | switch (nwords) { | - | ||||||||||||||||||||||||
| 801 | default: executed 8 times by 1 test: default:Executed by:
| 8 | ||||||||||||||||||||||||
| 802 | for (i = 10; i < nwords; i++)
| 8-38 | ||||||||||||||||||||||||
| 803 | BN_CONSTTIME_SWAP(i); executed 38 times by 1 test: end of blockExecuted by:
| 38 | ||||||||||||||||||||||||
| 804 | /* Fallthrough */ | - | ||||||||||||||||||||||||
| 805 | case 10: code before this statement executed 8 times by 1 test: case 10:Executed by:
executed 651 times by 1 test: case 10:Executed by:
| 8-651 | ||||||||||||||||||||||||
| 806 | BN_CONSTTIME_SWAP(9); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 807 | case 9: code before this statement executed 659 times by 1 test: case 9:Executed by:
executed 1045899 times by 1 test: case 9:Executed by:
| 659-1045899 | ||||||||||||||||||||||||
| 808 | BN_CONSTTIME_SWAP(8); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 809 | case 8: code before this statement executed 1046558 times by 1 test: case 8:Executed by:
executed 115648 times by 1 test: case 8:Executed by:
| 115648-1046558 | ||||||||||||||||||||||||
| 810 | BN_CONSTTIME_SWAP(7); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 811 | case 7: code before this statement executed 1162206 times by 1 test: case 7:Executed by:
executed 277790 times by 1 test: case 7:Executed by:
| 277790-1162206 | ||||||||||||||||||||||||
| 812 | BN_CONSTTIME_SWAP(6); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 813 | case 6: code before this statement executed 1439996 times by 1 test: case 6:Executed by:
executed 451358 times by 1 test: case 6:Executed by:
| 451358-1439996 | ||||||||||||||||||||||||
| 814 | BN_CONSTTIME_SWAP(5); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 815 | case 5: code before this statement executed 1891354 times by 1 test: case 5:Executed by:
executed 279640 times by 2 tests: case 5:Executed by:
| 279640-1891354 | ||||||||||||||||||||||||
| 816 | BN_CONSTTIME_SWAP(4); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 817 | case 4: code before this statement executed 2170994 times by 2 tests: case 4:Executed by:
executed 738108 times by 2 tests: case 4:Executed by:
| 738108-2170994 | ||||||||||||||||||||||||
| 818 | BN_CONSTTIME_SWAP(3); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 819 | case 3: code before this statement executed 2909102 times by 2 tests: case 3:Executed by:
executed 595031 times by 1 test: case 3:Executed by:
| 595031-2909102 | ||||||||||||||||||||||||
| 820 | BN_CONSTTIME_SWAP(2); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 821 | case 2: code before this statement executed 3504133 times by 2 tests: case 2:Executed by:
executed 93368 times by 1 test: case 2:Executed by:
| 93368-3504133 | ||||||||||||||||||||||||
| 822 | BN_CONSTTIME_SWAP(1); /* Fallthrough */ | - | ||||||||||||||||||||||||
| 823 | case 1: code before this statement executed 3597501 times by 2 tests: case 1:Executed by:
executed 3597501 times by 2 tests: case 1:Executed by:
| 3597501 | ||||||||||||||||||||||||
| 824 | BN_CONSTTIME_SWAP(0); | - | ||||||||||||||||||||||||
| 825 | } executed 3597501 times by 2 tests: end of blockExecuted by:
| 3597501 | ||||||||||||||||||||||||
| 826 | #undef BN_CONSTTIME_SWAP | - | ||||||||||||||||||||||||
| 827 | } | - | ||||||||||||||||||||||||
| 828 | - | |||||||||||||||||||||||||
| 829 | /* Bits of security, see SP800-57 */ | - | ||||||||||||||||||||||||
| 830 | - | |||||||||||||||||||||||||
| 831 | int BN_security_bits(int L, int N) | - | ||||||||||||||||||||||||
| 832 | { | - | ||||||||||||||||||||||||
| 833 | int secbits, bits; | - | ||||||||||||||||||||||||
| 834 | if (L >= 15360)
| 0-11236 | ||||||||||||||||||||||||
| 835 | secbits = 256; never executed: secbits = 256; | 0 | ||||||||||||||||||||||||
| 836 | else if (L >= 7680)
| 0-11236 | ||||||||||||||||||||||||
| 837 | secbits = 192; never executed: secbits = 192; | 0 | ||||||||||||||||||||||||
| 838 | else if (L >= 3072)
| 8-11228 | ||||||||||||||||||||||||
| 839 | secbits = 128; executed 8 times by 1 test: secbits = 128;Executed by:
| 8 | ||||||||||||||||||||||||
| 840 | else if (L >= 2048)
| 2463-8765 | ||||||||||||||||||||||||
| 841 | secbits = 112; executed 8765 times by 1 test: secbits = 112;Executed by:
| 8765 | ||||||||||||||||||||||||
| 842 | else if (L >= 1024)
| 7-2456 | ||||||||||||||||||||||||
| 843 | secbits = 80; executed 2456 times by 1 test: secbits = 80;Executed by:
| 2456 | ||||||||||||||||||||||||
| 844 | else | - | ||||||||||||||||||||||||
| 845 | return 0; executed 7 times by 1 test: return 0;Executed by:
| 7 | ||||||||||||||||||||||||
| 846 | if (N == -1)
| 2042-9187 | ||||||||||||||||||||||||
| 847 | return secbits; executed 9187 times by 1 test: return secbits;Executed by:
| 9187 | ||||||||||||||||||||||||
| 848 | bits = N / 2; | - | ||||||||||||||||||||||||
| 849 | if (bits < 80)
| 0-2042 | ||||||||||||||||||||||||
| 850 | return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
| 851 | return bits >= secbits ? secbits : bits; executed 2042 times by 1 test: return bits >= secbits ? secbits : bits;Executed by:
| 0-2042 | ||||||||||||||||||||||||
| 852 | } | - | ||||||||||||||||||||||||
| 853 | - | |||||||||||||||||||||||||
| 854 | void BN_zero_ex(BIGNUM *a) | - | ||||||||||||||||||||||||
| 855 | { | - | ||||||||||||||||||||||||
| 856 | a->neg = 0; | - | ||||||||||||||||||||||||
| 857 | a->top = 0; | - | ||||||||||||||||||||||||
| 858 | a->flags &= ~BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 859 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 860 | - | |||||||||||||||||||||||||
| 861 | int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w) | - | ||||||||||||||||||||||||
| 862 | { | - | ||||||||||||||||||||||||
| 863 | return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0)); executed 3905302 times by 2 tests: return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));Executed by:
| 1-3905302 | ||||||||||||||||||||||||
| 864 | } | - | ||||||||||||||||||||||||
| 865 | - | |||||||||||||||||||||||||
| 866 | int BN_is_zero(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 867 | { | - | ||||||||||||||||||||||||
| 868 | return a->top == 0; executed 52453965 times by 2 tests: return a->top == 0;Executed by:
| 52453965 | ||||||||||||||||||||||||
| 869 | } | - | ||||||||||||||||||||||||
| 870 | - | |||||||||||||||||||||||||
| 871 | int BN_is_one(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 872 | { | - | ||||||||||||||||||||||||
| 873 | return BN_abs_is_word(a, 1) && !a->neg; executed 3786971 times by 2 tests: return BN_abs_is_word(a, 1) && !a->neg;Executed by:
| 0-3786971 | ||||||||||||||||||||||||
| 874 | } | - | ||||||||||||||||||||||||
| 875 | - | |||||||||||||||||||||||||
| 876 | int BN_is_word(const BIGNUM *a, const BN_ULONG w) | - | ||||||||||||||||||||||||
| 877 | { | - | ||||||||||||||||||||||||
| 878 | return BN_abs_is_word(a, w) && (!w || !a->neg); executed 30470 times by 1 test: return BN_abs_is_word(a, w) && (!w || !a->neg);Executed by:
| 1-30470 | ||||||||||||||||||||||||
| 879 | } | - | ||||||||||||||||||||||||
| 880 | - | |||||||||||||||||||||||||
| 881 | int BN_is_odd(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 882 | { | - | ||||||||||||||||||||||||
| 883 | return (a->top > 0) && (a->d[0] & 1); executed 5599741 times by 2 tests: return (a->top > 0) && (a->d[0] & 1);Executed by:
| 439-5599741 | ||||||||||||||||||||||||
| 884 | } | - | ||||||||||||||||||||||||
| 885 | - | |||||||||||||||||||||||||
| 886 | int BN_is_negative(const BIGNUM *a) | - | ||||||||||||||||||||||||
| 887 | { | - | ||||||||||||||||||||||||
| 888 | return (a->neg != 0); executed 44625 times by 2 tests: return (a->neg != 0);Executed by:
| 44625 | ||||||||||||||||||||||||
| 889 | } | - | ||||||||||||||||||||||||
| 890 | - | |||||||||||||||||||||||||
| 891 | int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont, | - | ||||||||||||||||||||||||
| 892 | BN_CTX *ctx) | - | ||||||||||||||||||||||||
| 893 | { | - | ||||||||||||||||||||||||
| 894 | return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx); executed 180462 times by 2 tests: return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);Executed by:
| 180462 | ||||||||||||||||||||||||
| 895 | } | - | ||||||||||||||||||||||||
| 896 | - | |||||||||||||||||||||||||
| 897 | void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags) | - | ||||||||||||||||||||||||
| 898 | { | - | ||||||||||||||||||||||||
| 899 | dest->d = b->d; | - | ||||||||||||||||||||||||
| 900 | dest->top = b->top; | - | ||||||||||||||||||||||||
| 901 | dest->dmax = b->dmax; | - | ||||||||||||||||||||||||
| 902 | dest->neg = b->neg; | - | ||||||||||||||||||||||||
| 903 | dest->flags = ((dest->flags & BN_FLG_MALLOCED) | - | ||||||||||||||||||||||||
| 904 | | (b->flags & ~BN_FLG_MALLOCED) | - | ||||||||||||||||||||||||
| 905 | | BN_FLG_STATIC_DATA | flags); | - | ||||||||||||||||||||||||
| 906 | } executed 2427751 times by 1 test: end of blockExecuted by:
| 2427751 | ||||||||||||||||||||||||
| 907 | - | |||||||||||||||||||||||||
| 908 | BN_GENCB *BN_GENCB_new(void) | - | ||||||||||||||||||||||||
| 909 | { | - | ||||||||||||||||||||||||
| 910 | BN_GENCB *ret; | - | ||||||||||||||||||||||||
| 911 | - | |||||||||||||||||||||||||
| 912 | if ((ret = OPENSSL_malloc(sizeof(*ret))) == NULL) {
| 0-23 | ||||||||||||||||||||||||
| 913 | BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE); | - | ||||||||||||||||||||||||
| 914 | return NULL; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
| 915 | } | - | ||||||||||||||||||||||||
| 916 | - | |||||||||||||||||||||||||
| 917 | return ret; executed 23 times by 1 test: return ret;Executed by:
| 23 | ||||||||||||||||||||||||
| 918 | } | - | ||||||||||||||||||||||||
| 919 | - | |||||||||||||||||||||||||
| 920 | void BN_GENCB_free(BN_GENCB *cb) | - | ||||||||||||||||||||||||
| 921 | { | - | ||||||||||||||||||||||||
| 922 | if (cb == NULL)
| 1-23 | ||||||||||||||||||||||||
| 923 | return; executed 1 time by 1 test: return;Executed by:
| 1 | ||||||||||||||||||||||||
| 924 | OPENSSL_free(cb); | - | ||||||||||||||||||||||||
| 925 | } executed 23 times by 1 test: end of blockExecuted by:
| 23 | ||||||||||||||||||||||||
| 926 | - | |||||||||||||||||||||||||
| 927 | void BN_set_flags(BIGNUM *b, int n) | - | ||||||||||||||||||||||||
| 928 | { | - | ||||||||||||||||||||||||
| 929 | b->flags |= n; | - | ||||||||||||||||||||||||
| 930 | } executed 71162 times by 2 tests: end of blockExecuted by:
| 71162 | ||||||||||||||||||||||||
| 931 | - | |||||||||||||||||||||||||
| 932 | int BN_get_flags(const BIGNUM *b, int n) | - | ||||||||||||||||||||||||
| 933 | { | - | ||||||||||||||||||||||||
| 934 | return b->flags & n; executed 31803222 times by 2 tests: return b->flags & n;Executed by:
| 31803222 | ||||||||||||||||||||||||
| 935 | } | - | ||||||||||||||||||||||||
| 936 | - | |||||||||||||||||||||||||
| 937 | /* Populate a BN_GENCB structure with an "old"-style callback */ | - | ||||||||||||||||||||||||
| 938 | void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *), | - | ||||||||||||||||||||||||
| 939 | void *cb_arg) | - | ||||||||||||||||||||||||
| 940 | { | - | ||||||||||||||||||||||||
| 941 | BN_GENCB *tmp_gencb = gencb; | - | ||||||||||||||||||||||||
| 942 | tmp_gencb->ver = 1; | - | ||||||||||||||||||||||||
| 943 | tmp_gencb->arg = cb_arg; | - | ||||||||||||||||||||||||
| 944 | tmp_gencb->cb.cb_1 = callback; | - | ||||||||||||||||||||||||
| 945 | } never executed: end of block | 0 | ||||||||||||||||||||||||
| 946 | - | |||||||||||||||||||||||||
| 947 | /* Populate a BN_GENCB structure with a "new"-style callback */ | - | ||||||||||||||||||||||||
| 948 | void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *), | - | ||||||||||||||||||||||||
| 949 | void *cb_arg) | - | ||||||||||||||||||||||||
| 950 | { | - | ||||||||||||||||||||||||
| 951 | BN_GENCB *tmp_gencb = gencb; | - | ||||||||||||||||||||||||
| 952 | tmp_gencb->ver = 2; | - | ||||||||||||||||||||||||
| 953 | tmp_gencb->arg = cb_arg; | - | ||||||||||||||||||||||||
| 954 | tmp_gencb->cb.cb_2 = callback; | - | ||||||||||||||||||||||||
| 955 | } executed 23 times by 1 test: end of blockExecuted by:
| 23 | ||||||||||||||||||||||||
| 956 | - | |||||||||||||||||||||||||
| 957 | void *BN_GENCB_get_arg(BN_GENCB *cb) | - | ||||||||||||||||||||||||
| 958 | { | - | ||||||||||||||||||||||||
| 959 | return cb->arg; executed 5332 times by 1 test: return cb->arg;Executed by:
| 5332 | ||||||||||||||||||||||||
| 960 | } | - | ||||||||||||||||||||||||
| 961 | - | |||||||||||||||||||||||||
| 962 | BIGNUM *bn_wexpand(BIGNUM *a, int words) | - | ||||||||||||||||||||||||
| 963 | { | - | ||||||||||||||||||||||||
| 964 | return (words <= a->dmax) ? a : bn_expand2(a, words); executed 244086374 times by 2 tests: return (words <= a->dmax) ? a : bn_expand2(a, words);Executed by:
| 3485680-244086374 | ||||||||||||||||||||||||
| 965 | } | - | ||||||||||||||||||||||||
| 966 | - | |||||||||||||||||||||||||
| 967 | void bn_correct_top(BIGNUM *a) | - | ||||||||||||||||||||||||
| 968 | { | - | ||||||||||||||||||||||||
| 969 | BN_ULONG *ftl; | - | ||||||||||||||||||||||||
| 970 | int tmp_top = a->top; | - | ||||||||||||||||||||||||
| 971 | - | |||||||||||||||||||||||||
| 972 | if (tmp_top > 0) {
| 218082-195880464 | ||||||||||||||||||||||||
| 973 | for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) {
| 459604-634226577 | ||||||||||||||||||||||||
| 974 | ftl--; | - | ||||||||||||||||||||||||
| 975 | if (*ftl != 0)
| 195420860-438805717 | ||||||||||||||||||||||||
| 976 | break; executed 195420860 times by 2 tests: break;Executed by:
| 195420860 | ||||||||||||||||||||||||
| 977 | } executed 438805717 times by 2 tests: end of blockExecuted by:
| 438805717 | ||||||||||||||||||||||||
| 978 | a->top = tmp_top; | - | ||||||||||||||||||||||||
| 979 | } executed 195880464 times by 2 tests: end of blockExecuted by:
| 195880464 | ||||||||||||||||||||||||
| 980 | if (a->top == 0)
| 677686-195420860 | ||||||||||||||||||||||||
| 981 | a->neg = 0; executed 677686 times by 2 tests: a->neg = 0;Executed by:
| 677686 | ||||||||||||||||||||||||
| 982 | a->flags &= ~BN_FLG_FIXED_TOP; | - | ||||||||||||||||||||||||
| 983 | bn_pollute(a); | - | ||||||||||||||||||||||||
| 984 | } executed 196098546 times by 2 tests: end of blockExecuted by:
| 196098546 | ||||||||||||||||||||||||
| Source code | Switch to Preprocessed file |