bn_lib.c 21.3 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9
 */

10
#include <assert.h>
B
Bodo Möller 已提交
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_0_9_8
19 20
/*-
 * For a 32 bit machine
21 22 23 24 25 26 27 28
 * 2 -   4 ==  128
 * 3 -   8 ==  256
 * 4 -  16 ==  512
 * 5 -  32 == 1024
 * 6 -  64 == 2048
 * 7 - 128 == 4096
 * 8 - 256 == 8192
 */
29 30 31 32 33 34 35 36
static int bn_limit_bits = 0;
static int bn_limit_num = 8;    /* (1<<bn_limit_bits) */
static int bn_limit_bits_low = 0;
static int bn_limit_num_low = 8; /* (1<<bn_limit_bits_low) */
static int bn_limit_bits_high = 0;
static int bn_limit_num_high = 8; /* (1<<bn_limit_bits_high) */
static int bn_limit_bits_mont = 0;
static int bn_limit_num_mont = 8; /* (1<<bn_limit_bits_mont) */
37

U
Ulf Möller 已提交
38
void BN_set_params(int mult, int high, int low, int mont)
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
{
    if (mult >= 0) {
        if (mult > (int)(sizeof(int) * 8) - 1)
            mult = sizeof(int) * 8 - 1;
        bn_limit_bits = mult;
        bn_limit_num = 1 << mult;
    }
    if (high >= 0) {
        if (high > (int)(sizeof(int) * 8) - 1)
            high = sizeof(int) * 8 - 1;
        bn_limit_bits_high = high;
        bn_limit_num_high = 1 << high;
    }
    if (low >= 0) {
        if (low > (int)(sizeof(int) * 8) - 1)
            low = sizeof(int) * 8 - 1;
        bn_limit_bits_low = low;
        bn_limit_num_low = 1 << low;
    }
    if (mont >= 0) {
        if (mont > (int)(sizeof(int) * 8) - 1)
            mont = sizeof(int) * 8 - 1;
        bn_limit_bits_mont = mont;
        bn_limit_num_mont = 1 << mont;
    }
}
65

U
Ulf Möller 已提交
66
int BN_get_params(int which)
67 68
{
    if (which == 0)
K
KaoruToda 已提交
69
        return bn_limit_bits;
70
    else if (which == 1)
K
KaoruToda 已提交
71
        return bn_limit_bits_high;
72
    else if (which == 2)
K
KaoruToda 已提交
73
        return bn_limit_bits_low;
74
    else if (which == 3)
K
KaoruToda 已提交
75
        return bn_limit_bits_mont;
76
    else
K
KaoruToda 已提交
77
        return 0;
78
}
79
#endif
80

B
Bodo Möller 已提交
81
const BIGNUM *BN_value_one(void)
82 83 84 85
{
    static const BN_ULONG data_one = 1L;
    static const BIGNUM const_one =
        { (BN_ULONG *)&data_one, 1, 1, 0, BN_FLG_STATIC_DATA };
86

K
KaoruToda 已提交
87
    return &const_one;
88
}
89

U
Ulf Möller 已提交
90
int BN_num_bits_word(BN_ULONG l)
91
{
92 93 94 95 96 97 98 99 100
    BN_ULONG x, mask;
    int bits = (l != 0);

#if BN_BITS2 > 32
    x = l >> 32;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 32 & mask;
    l ^= (x ^ l) & mask;
101
#endif
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132

    x = l >> 16;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 16 & mask;
    l ^= (x ^ l) & mask;

    x = l >> 8;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 8 & mask;
    l ^= (x ^ l) & mask;

    x = l >> 4;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 4 & mask;
    l ^= (x ^ l) & mask;

    x = l >> 2;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 2 & mask;
    l ^= (x ^ l) & mask;

    x = l >> 1;
    mask = (0 - x) & BN_MASK2;
    mask = (0 - (mask >> (BN_BITS2 - 1)));
    bits += 1 & mask;

    return bits;
133
}
134

135
int BN_num_bits(const BIGNUM *a)
136 137 138
{
    int i = a->top - 1;
    bn_check_top(a);
139

140 141 142 143
    if (BN_is_zero(a))
        return 0;
    return ((i * BN_BITS2) + BN_num_bits_word(a->d[i]));
}
144

P
Pauli 已提交
145
static void bn_free_d(BIGNUM *a, int clear)
R
Rich Salz 已提交
146
{
F
FdaSilvaYY 已提交
147
    if (BN_get_flags(a, BN_FLG_SECURE))
P
Pauli 已提交
148 149 150
        OPENSSL_secure_clear_free(a->d, a->dmax * sizeof(a->d[0]));
    else if (clear != 0)
        OPENSSL_clear_free(a->d, a->dmax * sizeof(a->d[0]));
R
Rich Salz 已提交
151 152 153 154 155
    else
        OPENSSL_free(a->d);
}


U
Ulf Möller 已提交
156
void BN_clear_free(BIGNUM *a)
157 158 159
{
    if (a == NULL)
        return;
P
Pauli 已提交
160 161
    if (a->d != NULL && !BN_get_flags(a, BN_FLG_STATIC_DATA))
        bn_free_d(a, 1);
162 163
    if (BN_get_flags(a, BN_FLG_MALLOCED)) {
        OPENSSL_cleanse(a, sizeof(*a));
164
        OPENSSL_free(a);
165
    }
166
}
167

U
Ulf Möller 已提交
168
void BN_free(BIGNUM *a)
169 170 171
{
    if (a == NULL)
        return;
R
Rich Salz 已提交
172
    if (!BN_get_flags(a, BN_FLG_STATIC_DATA))
P
Pauli 已提交
173
        bn_free_d(a, 0);
174 175 176
    if (a->flags & BN_FLG_MALLOCED)
        OPENSSL_free(a);
}
177

R
Rich Salz 已提交
178
void bn_init(BIGNUM *a)
179
{
R
Rich Salz 已提交
180 181 182
    static BIGNUM nilbn;

    *a = nilbn;
183 184
    bn_check_top(a);
}
185

U
Ulf Möller 已提交
186
BIGNUM *BN_new(void)
187 188 189
{
    BIGNUM *ret;

R
Rich Salz 已提交
190
    if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) {
191
        BNerr(BN_F_BN_NEW, ERR_R_MALLOC_FAILURE);
K
KaoruToda 已提交
192
        return NULL;
193 194 195
    }
    ret->flags = BN_FLG_MALLOCED;
    bn_check_top(ret);
K
KaoruToda 已提交
196
    return ret;
197
}
198

R
Rich Salz 已提交
199 200 201
 BIGNUM *BN_secure_new(void)
 {
     BIGNUM *ret = BN_new();
202
     if (ret != NULL)
R
Rich Salz 已提交
203
         ret->flags |= BN_FLG_SECURE;
K
KaoruToda 已提交
204
     return ret;
R
Rich Salz 已提交
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 214 215 216 217 218

    if (words > (INT_MAX / (4 * BN_BITS2))) {
        BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_BIGNUM_TOO_LONG);
        return NULL;
    }
    if (BN_get_flags(b, BN_FLG_STATIC_DATA)) {
        BNerr(BN_F_BN_EXPAND_INTERNAL, BN_R_EXPAND_ON_STATIC_BIGNUM_DATA);
K
KaoruToda 已提交
219
        return NULL;
220
    }
F
FdaSilvaYY 已提交
221
    if (BN_get_flags(b, BN_FLG_SECURE))
222
        a = OPENSSL_secure_zalloc(words * sizeof(*a));
R
Rich Salz 已提交
223
    else
224 225
        a = OPENSSL_zalloc(words * sizeof(*a));
    if (a == NULL) {
226
        BNerr(BN_F_BN_EXPAND_INTERNAL, ERR_R_MALLOC_FAILURE);
K
KaoruToda 已提交
227
        return NULL;
228
    }
229

230
    assert(b->top <= words);
231 232
    if (b->top > 0)
        memcpy(a, b->d, sizeof(*a) * b->top);
233

234
    return a;
235 236 237 238 239 240 241 242 243
}

/*
 * This is an internal function that should not be used in applications. It
 * ensures that 'b' has enough room for a 'words' word number and initialises
 * any unused part of b->d with leading zeros. It is mostly used by the
 * various BIGNUM routines. If there is an error, NULL is returned. If not,
 * 'b' is returned.
 */
244

245
BIGNUM *bn_expand2(BIGNUM *b, int words)
246 247 248 249 250
{
    if (words > b->dmax) {
        BN_ULONG *a = bn_expand_internal(b, words);
        if (!a)
            return NULL;
P
Pauli 已提交
251 252
        if (b->d != NULL)
            bn_free_d(b, 1);
253 254 255
        b->d = a;
        b->dmax = words;
    }
G
Geoff Thorpe 已提交
256

257 258
    return b;
}
259

260
BIGNUM *BN_dup(const BIGNUM *a)
261 262 263 264 265 266 267
{
    BIGNUM *t;

    if (a == NULL)
        return NULL;
    bn_check_top(a);

R
Rich Salz 已提交
268
    t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
269 270 271 272 273 274 275 276 277
    if (t == NULL)
        return NULL;
    if (!BN_copy(t, a)) {
        BN_free(t);
        return NULL;
    }
    bn_check_top(t);
    return t;
}
278

279
BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
280 281
{
    bn_check_top(b);
282

283
    if (a == b)
284
        return a;
285
    if (bn_wexpand(a, b->top) == NULL)
286
        return NULL;
287

288 289
    if (b->top > 0)
        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);
290

291
    a->neg = b->neg;
292 293
    a->top = b->top;
    a->flags |= b->flags & BN_FLG_FIXED_TOP;
294
    bn_check_top(a);
295
    return a;
296
}
297

B
Billy Brumley 已提交
298 299
#define FLAGS_DATA(flags) ((flags) & (BN_FLG_STATIC_DATA \
                                    | BN_FLG_CONSTTIME   \
300 301
                                    | BN_FLG_SECURE      \
                                    | BN_FLG_FIXED_TOP))
B
Billy Brumley 已提交
302 303
#define FLAGS_STRUCT(flags) ((flags) & (BN_FLG_MALLOCED))

B
Bodo Möller 已提交
304
void BN_swap(BIGNUM *a, BIGNUM *b)
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
{
    int flags_old_a, flags_old_b;
    BN_ULONG *tmp_d;
    int tmp_top, tmp_dmax, tmp_neg;

    bn_check_top(a);
    bn_check_top(b);

    flags_old_a = a->flags;
    flags_old_b = b->flags;

    tmp_d = a->d;
    tmp_top = a->top;
    tmp_dmax = a->dmax;
    tmp_neg = a->neg;

    a->d = b->d;
    a->top = b->top;
    a->dmax = b->dmax;
    a->neg = b->neg;

    b->d = tmp_d;
    b->top = tmp_top;
    b->dmax = tmp_dmax;
    b->neg = tmp_neg;

B
Billy Brumley 已提交
331 332
    a->flags = FLAGS_STRUCT(flags_old_a) | FLAGS_DATA(flags_old_b);
    b->flags = FLAGS_STRUCT(flags_old_b) | FLAGS_DATA(flags_old_a);
333 334 335
    bn_check_top(a);
    bn_check_top(b);
}
B
Bodo Möller 已提交
336

U
Ulf Möller 已提交
337
void BN_clear(BIGNUM *a)
338
{
339 340
    if (a == NULL)
        return;
341 342
    bn_check_top(a);
    if (a->d != NULL)
343
        OPENSSL_cleanse(a->d, sizeof(*a->d) * a->dmax);
344
    a->neg = 0;
345 346
    a->top = 0;
    a->flags &= ~BN_FLG_FIXED_TOP;
347
}
348

349
BN_ULONG BN_get_word(const BIGNUM *a)
350 351 352 353 354 355 356 357
{
    if (a->top > 1)
        return BN_MASK2;
    else if (a->top == 1)
        return a->d[0];
    /* a->top == 0 */
    return 0;
}
358

359
int BN_set_word(BIGNUM *a, BN_ULONG w)
360 361 362
{
    bn_check_top(a);
    if (bn_expand(a, (int)sizeof(BN_ULONG) * 8) == NULL)
K
KaoruToda 已提交
363
        return 0;
364 365 366
    a->neg = 0;
    a->d[0] = w;
    a->top = (w ? 1 : 0);
367
    a->flags &= ~BN_FLG_FIXED_TOP;
368
    bn_check_top(a);
369
    return 1;
370
}
371

372
BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret)
373 374 375 376 377 378 379 380 381
{
    unsigned int i, m;
    unsigned int n;
    BN_ULONG l;
    BIGNUM *bn = NULL;

    if (ret == NULL)
        ret = bn = BN_new();
    if (ret == NULL)
K
KaoruToda 已提交
382
        return NULL;
383
    bn_check_top(ret);
R
Rich Salz 已提交
384
    /* Skip leading zero's. */
R
Rich Salz 已提交
385
    for ( ; len > 0 && *s == 0; s++, len--)
R
Rich Salz 已提交
386
        continue;
387 388 389
    n = len;
    if (n == 0) {
        ret->top = 0;
K
KaoruToda 已提交
390
        return ret;
391 392 393 394
    }
    i = ((n - 1) / BN_BYTES) + 1;
    m = ((n - 1) % (BN_BYTES));
    if (bn_wexpand(ret, (int)i) == NULL) {
R
Rich Salz 已提交
395
        BN_free(bn);
396 397 398 399
        return NULL;
    }
    ret->top = i;
    ret->neg = 0;
R
Rich Salz 已提交
400
    l = 0;
401 402 403 404 405 406 407 408 409 410 411 412 413
    while (n--) {
        l = (l << 8L) | *(s++);
        if (m-- == 0) {
            ret->d[--i] = l;
            l = 0;
            m = BN_BYTES - 1;
        }
    }
    /*
     * need to call this due to clear byte at top if avoiding having the top
     * bit set (-ve number)
     */
    bn_correct_top(ret);
K
KaoruToda 已提交
414
    return ret;
415
}
416 417

/* ignore negative */
D
Dr. Stephen Henson 已提交
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 423
    BN_ULONG l;

424 425 426 427 428
    /*
     * In case |a| is fixed-top, BN_num_bytes can return bogus length,
     * but it's assumed that fixed-top inputs ought to be "nominated"
     * even for padded output, so it works out...
     */
429
    n = BN_num_bytes(a);
430
    if (tolen == -1) {
431
        tolen = n;
432 433
    } else if (tolen < n) {     /* uncommon/unlike case */
        BIGNUM temp = *a;
434

435 436 437 438 439 440 441 442 443
        bn_correct_top(&temp);
        n = BN_num_bytes(&temp);
        if (tolen < n)
            return -1;
    }

    /* Swipe through whole available data and don't give away padded zero. */
    atop = a->dmax * BN_BYTES;
    if (atop == 0) {
444 445
        OPENSSL_cleanse(to, tolen);
        return tolen;
D
Dr. Stephen Henson 已提交
446
    }
447

448 449 450
    lasti = atop - 1;
    atop = a->top * BN_BYTES;
    for (i = 0, j = 0, to += tolen; j < (size_t)tolen; j++) {
451
        l = a->d[i / BN_BYTES];
452 453 454
        mask = 0 - ((j - atop) >> (8 * sizeof(i) - 1));
        *--to = (unsigned char)(l >> (8 * (i % BN_BYTES)) & mask);
        i += (i - lasti) >> (8 * sizeof(i) - 1); /* stay on last limb */
455
    }
456

D
Dr. Stephen Henson 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
    return tolen;
}

int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen)
{
    if (tolen < 0)
        return -1;
    return bn2binpad(a, to, tolen);
}

int BN_bn2bin(const BIGNUM *a, unsigned char *to)
{
    return bn2binpad(a, to, -1);
}

BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret)
{
    unsigned int i, m;
    unsigned int n;
    BN_ULONG l;
    BIGNUM *bn = NULL;

    if (ret == NULL)
        ret = bn = BN_new();
    if (ret == NULL)
K
KaoruToda 已提交
482
        return NULL;
D
Dr. Stephen Henson 已提交
483
    bn_check_top(ret);
K
Kurt Roeckx 已提交
484
    s += len;
D
Dr. Stephen Henson 已提交
485
    /* Skip trailing zeroes. */
K
Kurt Roeckx 已提交
486
    for ( ; len > 0 && s[-1] == 0; s--, len--)
D
Dr. Stephen Henson 已提交
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
        continue;
    n = len;
    if (n == 0) {
        ret->top = 0;
        return ret;
    }
    i = ((n - 1) / BN_BYTES) + 1;
    m = ((n - 1) % (BN_BYTES));
    if (bn_wexpand(ret, (int)i) == NULL) {
        BN_free(bn);
        return NULL;
    }
    ret->top = i;
    ret->neg = 0;
    l = 0;
    while (n--) {
K
Kurt Roeckx 已提交
503 504
        s--;
        l = (l << 8L) | *s;
D
Dr. Stephen Henson 已提交
505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
        if (m-- == 0) {
            ret->d[--i] = l;
            l = 0;
            m = BN_BYTES - 1;
        }
    }
    /*
     * need to call this due to clear byte at top if avoiding having the top
     * bit set (-ve number)
     */
    bn_correct_top(ret);
    return ret;
}

int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen)
{
    int i;
    BN_ULONG l;
    bn_check_top(a);
    i = BN_num_bytes(a);
    if (tolen < i)
        return -1;
    /* Add trailing zeroes if necessary */
    if (tolen > i)
        memset(to + i, 0, tolen - i);
K
Kurt Roeckx 已提交
530
    to += i;
D
Dr. Stephen Henson 已提交
531 532
    while (i--) {
        l = a->d[i / BN_BYTES];
K
Kurt Roeckx 已提交
533 534
        to--;
        *to = (unsigned char)(l >> (8 * (i % BN_BYTES))) & 0xff;
D
Dr. Stephen Henson 已提交
535 536
    }
    return tolen;
537
}
538

539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
BIGNUM *BN_native2bn(const unsigned char *s, int len, BIGNUM *ret)
{
#ifdef B_ENDIAN
    return BN_bin2bn(s, len, ret);
#else
    return BN_lebin2bn(s, len, ret);
#endif
}

int BN_bn2nativepad(const BIGNUM *a, unsigned char *to, int tolen)
{
#ifdef B_ENDIAN
    return BN_bn2binpad(a, to, tolen);
#else
    return BN_bn2lebinpad(a, to, tolen);
#endif
}

557
int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
558 559 560 561 562 563 564 565 566
{
    int i;
    BN_ULONG t1, t2, *ap, *bp;

    bn_check_top(a);
    bn_check_top(b);

    i = a->top - b->top;
    if (i != 0)
K
KaoruToda 已提交
567
        return i;
568 569 570 571 572 573 574 575
    ap = a->d;
    bp = b->d;
    for (i = a->top - 1; i >= 0; i--) {
        t1 = ap[i];
        t2 = bp[i];
        if (t1 != t2)
            return ((t1 > t2) ? 1 : -1);
    }
K
KaoruToda 已提交
576
    return 0;
577
}
578

579
int BN_cmp(const BIGNUM *a, const BIGNUM *b)
580 581 582 583 584 585 586
{
    int i;
    int gt, lt;
    BN_ULONG t1, t2;

    if ((a == NULL) || (b == NULL)) {
        if (a != NULL)
K
KaoruToda 已提交
587
            return -1;
588
        else if (b != NULL)
589
            return 1;
590
        else
K
KaoruToda 已提交
591
            return 0;
592 593 594 595 596 597 598
    }

    bn_check_top(a);
    bn_check_top(b);

    if (a->neg != b->neg) {
        if (a->neg)
K
KaoruToda 已提交
599
            return -1;
600
        else
601
            return 1;
602 603 604 605 606 607 608 609 610 611
    }
    if (a->neg == 0) {
        gt = 1;
        lt = -1;
    } else {
        gt = -1;
        lt = 1;
    }

    if (a->top > b->top)
K
KaoruToda 已提交
612
        return gt;
613
    if (a->top < b->top)
K
KaoruToda 已提交
614
        return lt;
615 616 617 618
    for (i = a->top - 1; i >= 0; i--) {
        t1 = a->d[i];
        t2 = b->d[i];
        if (t1 > t2)
K
KaoruToda 已提交
619
            return gt;
620
        if (t1 < t2)
K
KaoruToda 已提交
621
            return lt;
622
    }
K
KaoruToda 已提交
623
    return 0;
624
}
625

U
Ulf Möller 已提交
626
int BN_set_bit(BIGNUM *a, int n)
627 628 629 630 631 632 633 634 635 636
{
    int i, j, k;

    if (n < 0)
        return 0;

    i = n / BN_BITS2;
    j = n % BN_BITS2;
    if (a->top <= i) {
        if (bn_wexpand(a, i + 1) == NULL)
K
KaoruToda 已提交
637
            return 0;
638 639 640
        for (k = a->top; k < i + 1; k++)
            a->d[k] = 0;
        a->top = i + 1;
641
        a->flags &= ~BN_FLG_FIXED_TOP;
642 643 644 645
    }

    a->d[i] |= (((BN_ULONG)1) << j);
    bn_check_top(a);
646
    return 1;
647
}
648

U
Ulf Möller 已提交
649
int BN_clear_bit(BIGNUM *a, int n)
650 651
{
    int i, j;
652

653 654 655
    bn_check_top(a);
    if (n < 0)
        return 0;
656

657 658 659
    i = n / BN_BITS2;
    j = n % BN_BITS2;
    if (a->top <= i)
K
KaoruToda 已提交
660
        return 0;
661

662 663
    a->d[i] &= (~(((BN_ULONG)1) << j));
    bn_correct_top(a);
664
    return 1;
665
}
666

667
int BN_is_bit_set(const BIGNUM *a, int n)
668 669 670 671 672 673 674 675 676 677 678 679
{
    int i, j;

    bn_check_top(a);
    if (n < 0)
        return 0;
    i = n / BN_BITS2;
    j = n % BN_BITS2;
    if (a->top <= i)
        return 0;
    return (int)(((a->d[i]) >> j) & ((BN_ULONG)1));
}
680

U
Ulf Möller 已提交
681
int BN_mask_bits(BIGNUM *a, int n)
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699
{
    int b, w;

    bn_check_top(a);
    if (n < 0)
        return 0;

    w = n / BN_BITS2;
    b = n % BN_BITS2;
    if (w >= a->top)
        return 0;
    if (b == 0)
        a->top = w;
    else {
        a->top = w + 1;
        a->d[w] &= ~(BN_MASK2 << b);
    }
    bn_correct_top(a);
700
    return 1;
701
}
702

703
void BN_set_negative(BIGNUM *a, int b)
704 705 706 707 708 709
{
    if (b && !BN_is_zero(a))
        a->neg = 1;
    else
        a->neg = 0;
}
710

711
int bn_cmp_words(const BN_ULONG *a, const BN_ULONG *b, int n)
712 713 714 715
{
    int i;
    BN_ULONG aa, bb;

716 717 718
    if (n == 0)
        return 0;

719 720 721 722 723 724 725 726 727 728
    aa = a[n - 1];
    bb = b[n - 1];
    if (aa != bb)
        return ((aa > bb) ? 1 : -1);
    for (i = n - 2; i >= 0; i--) {
        aa = a[i];
        bb = b[i];
        if (aa != bb)
            return ((aa > bb) ? 1 : -1);
    }
K
KaoruToda 已提交
729
    return 0;
730 731 732 733
}

/*
 * Here follows a specialised variants of bn_cmp_words().  It has the
D
Dmitry-Me 已提交
734
 * capability of performing the operation on arrays of different sizes. The
735
 * sizes of those arrays is expressed through cl, which is the common length
D
Dmitry-Me 已提交
736
 * ( basically, min(len(a),len(b)) ), and dl, which is the delta between the
737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
 * two lengths, calculated as len(a)-len(b). All lengths are the number of
 * BN_ULONGs...
 */

int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, int cl, int dl)
{
    int n, i;
    n = cl - 1;

    if (dl < 0) {
        for (i = dl; i < 0; i++) {
            if (b[n - i] != 0)
                return -1;      /* a < b */
        }
    }
    if (dl > 0) {
        for (i = dl; i > 0; i--) {
            if (a[n + i] != 0)
                return 1;       /* a > b */
        }
    }
    return bn_cmp_words(a, b, cl);
}

B
Billy Brumley 已提交
761
/*-
762
 * Constant-time conditional swap of a and b.
B
Billy Brumley 已提交
763 764 765 766
 * a and b are swapped if condition is not 0.
 * nwords is the number of words to swap.
 * Assumes that at least nwords are allocated in both a and b.
 * Assumes that no more than nwords are used by either a or b.
D
Dr. Stephen Henson 已提交
767 768
 */
void BN_consttime_swap(BN_ULONG condition, BIGNUM *a, BIGNUM *b, int nwords)
769 770 771
{
    BN_ULONG t;
    int i;
D
Dr. Stephen Henson 已提交
772

B
Billy Brumley 已提交
773 774 775
    if (a == b)
        return;

776 777
    bn_wcheck_size(a, nwords);
    bn_wcheck_size(b, nwords);
D
Dr. Stephen Henson 已提交
778

B
Billy Brumley 已提交
779
    condition = ((~condition & ((condition - 1))) >> (BN_BITS2 - 1)) - 1;
D
Dr. Stephen Henson 已提交
780

781 782 783
    t = (a->top ^ b->top) & condition;
    a->top ^= t;
    b->top ^= t;
D
Dr. Stephen Henson 已提交
784

785 786 787 788
    t = (a->neg ^ b->neg) & condition;
    a->neg ^= t;
    b->neg ^= t;

789
    /*-
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
     * BN_FLG_STATIC_DATA: indicates that data may not be written to. Intention
     * is actually to treat it as it's read-only data, and some (if not most)
     * of it does reside in read-only segment. In other words observation of
     * BN_FLG_STATIC_DATA in BN_consttime_swap should be treated as fatal
     * condition. It would either cause SEGV or effectively cause data
     * corruption.
     *
     * BN_FLG_MALLOCED: refers to BN structure itself, and hence must be
     * preserved.
     *
     * BN_FLG_SECURE: must be preserved, because it determines how x->d was
     * allocated and hence how to free it.
     *
     * BN_FLG_CONSTTIME: sufficient to mask and swap
     *
     * BN_FLG_FIXED_TOP: indicates that we haven't called bn_correct_top() on
     * the data, so the d array may be padded with additional 0 values (i.e.
     * top could be greater than the minimal value that it could be). We should
     * be swapping it
809
     */
810 811 812 813

#define BN_CONSTTIME_SWAP_FLAGS (BN_FLG_CONSTTIME | BN_FLG_FIXED_TOP)

    t = ((a->flags ^ b->flags) & BN_CONSTTIME_SWAP_FLAGS) & condition;
814 815 816
    a->flags ^= t;
    b->flags ^= t;

B
Billy Brumley 已提交
817 818 819 820 821 822
    /* conditionally swap the data */
    for (i = 0; i < nwords; i++) {
        t = (a->d[i] ^ b->d[i]) & condition;
        a->d[i] ^= t;
        b->d[i] ^= t;
    }
D
Dr. Stephen Henson 已提交
823
}
824

B
Billy Brumley 已提交
825 826
#undef BN_CONSTTIME_SWAP_FLAGS

827 828 829
/* Bits of security, see SP800-57 */

int BN_security_bits(int L, int N)
830 831 832 833
{
    int secbits, bits;
    if (L >= 15360)
        secbits = 256;
834
    else if (L >= 7680)
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
        secbits = 192;
    else if (L >= 3072)
        secbits = 128;
    else if (L >= 2048)
        secbits = 112;
    else if (L >= 1024)
        secbits = 80;
    else
        return 0;
    if (N == -1)
        return secbits;
    bits = N / 2;
    if (bits < 80)
        return 0;
    return bits >= secbits ? secbits : bits;
}
851 852

void BN_zero_ex(BIGNUM *a)
853 854
{
    a->neg = 0;
855 856
    a->top = 0;
    a->flags &= ~BN_FLG_FIXED_TOP;
857
}
858 859

int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
860 861 862
{
    return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
}
863 864

int BN_is_zero(const BIGNUM *a)
865 866 867
{
    return a->top == 0;
}
868 869

int BN_is_one(const BIGNUM *a)
870 871 872
{
    return BN_abs_is_word(a, 1) && !a->neg;
}
873 874

int BN_is_word(const BIGNUM *a, const BN_ULONG w)
875 876 877
{
    return BN_abs_is_word(a, w) && (!w || !a->neg);
}
878 879

int BN_is_odd(const BIGNUM *a)
880 881 882
{
    return (a->top > 0) && (a->d[0] & 1);
}
883 884

int BN_is_negative(const BIGNUM *a)
885 886 887
{
    return (a->neg != 0);
}
888

889 890 891 892 893
int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
                     BN_CTX *ctx)
{
    return BN_mod_mul_montgomery(r, a, &(mont->RR), mont, ctx);
}
894

895
void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags)
896 897 898 899 900 901 902
{
    dest->d = b->d;
    dest->top = b->top;
    dest->dmax = b->dmax;
    dest->neg = b->neg;
    dest->flags = ((dest->flags & BN_FLG_MALLOCED)
                   | (b->flags & ~BN_FLG_MALLOCED)
903
                   | BN_FLG_STATIC_DATA | flags);
904
}
905 906

BN_GENCB *BN_GENCB_new(void)
907 908
{
    BN_GENCB *ret;
909

R
Rich Salz 已提交
910
    if ((ret = OPENSSL_malloc(sizeof(*ret))) == NULL) {
911
        BNerr(BN_F_BN_GENCB_NEW, ERR_R_MALLOC_FAILURE);
K
KaoruToda 已提交
912
        return NULL;
913
    }
914

915 916
    return ret;
}
917 918

void BN_GENCB_free(BN_GENCB *cb)
919 920 921 922 923
{
    if (cb == NULL)
        return;
    OPENSSL_free(cb);
}
924 925

void BN_set_flags(BIGNUM *b, int n)
926 927 928
{
    b->flags |= n;
}
929 930

int BN_get_flags(const BIGNUM *b, int n)
931 932 933
{
    return b->flags & n;
}
934 935

/* Populate a BN_GENCB structure with an "old"-style callback */
936 937 938 939 940 941 942 943
void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
                      void *cb_arg)
{
    BN_GENCB *tmp_gencb = gencb;
    tmp_gencb->ver = 1;
    tmp_gencb->arg = cb_arg;
    tmp_gencb->cb.cb_1 = callback;
}
944 945

/* Populate a BN_GENCB structure with a "new"-style callback */
946 947 948 949 950 951 952 953
void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
                  void *cb_arg)
{
    BN_GENCB *tmp_gencb = gencb;
    tmp_gencb->ver = 2;
    tmp_gencb->arg = cb_arg;
    tmp_gencb->cb.cb_2 = callback;
}
954 955

void *BN_GENCB_get_arg(BN_GENCB *cb)
956 957 958
{
    return cb->arg;
}
959 960

BIGNUM *bn_wexpand(BIGNUM *a, int words)
961 962 963
{
    return (words <= a->dmax) ? a : bn_expand2(a, words);
}
964 965

void bn_correct_top(BIGNUM *a)
966 967 968 969 970
{
    BN_ULONG *ftl;
    int tmp_top = a->top;

    if (tmp_top > 0) {
K
Kurt Roeckx 已提交
971 972 973
        for (ftl = &(a->d[tmp_top]); tmp_top > 0; tmp_top--) {
            ftl--;
            if (*ftl != 0)
974
                break;
K
Kurt Roeckx 已提交
975
        }
976 977
        a->top = tmp_top;
    }
R
Rich Salz 已提交
978 979
    if (a->top == 0)
        a->neg = 0;
980
    a->flags &= ~BN_FLG_FIXED_TOP;
981 982
    bn_pollute(a);
}