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 block Executed 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 block Executed by:
| 198408 | ||||||||||||||||||||||||
166 | } executed 1926437 times by 2 tests: end of block Executed 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 block Executed 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 block Executed 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 block Executed by:
| 1989445 | ||||||||||||||||||||||||
255 | b->d = a; | - | ||||||||||||||||||||||||
256 | b->dmax = words; | - | ||||||||||||||||||||||||
257 | } executed 4889508 times by 2 tests: end of block Executed 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 block Executed 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 block Executed by:
| 3668371 | ||||||||||||||||||||||||
408 | } executed 28215531 times by 2 tests: end of block Executed 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 block Executed 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 block Executed 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 block Executed by:
| 177 | ||||||||||||||||||||||||
510 | } executed 1404 times by 1 test: end of block Executed 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 block Executed 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 block Executed 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 block Executed by:
| 3483236 | ||||||||||||||||||||||||
589 | gt = -1; | - | ||||||||||||||||||||||||
590 | lt = 1; | - | ||||||||||||||||||||||||
591 | } executed 3351 times by 1 test: end of block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed by:
| 30249 | ||||||||||||||||||||||||
730 | } executed 3985 times by 1 test: end of block Executed 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 block Executed by:
| 115272 | ||||||||||||||||||||||||
736 | } executed 8644 times by 1 test: end of block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed 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 block Executed by:
| 438805717 | ||||||||||||||||||||||||
978 | a->top = tmp_top; | - | ||||||||||||||||||||||||
979 | } executed 195880464 times by 2 tests: end of block Executed 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 block Executed by:
| 196098546 | ||||||||||||||||||||||||
Source code | Switch to Preprocessed file |