Ignore:
Timestamp:
Feb 7, 2019, 8:36:33 AM (5 years ago)
Author:
coas-nagasima
Message:

wolfsslを3.15.7にバージョンアップ

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_arm/trunk/wolfssl-3.12.2/wolfcrypt/src/wolfmath.c

    r352 r372  
    3030#include <wolfssl/wolfcrypt/settings.h>
    3131
    32 #ifdef USE_FAST_MATH
    33     #include <wolfssl/wolfcrypt/tfm.h>
    34 #else
    3532    #include <wolfssl/wolfcrypt/integer.h>
    36 #endif
    3733
    3834#include <wolfssl/wolfcrypt/error-crypt.h>
     
    9288}
    9389
     90#ifndef WC_NO_RNG
    9491int get_rand_digit(WC_RNG* rng, mp_digit* d)
    9592{
     
    10097int mp_rand(mp_int* a, int digits, WC_RNG* rng)
    10198{
    102     int ret;
    103     mp_digit d;
    104 
    105     if (rng == NULL)
    106         return MISSING_RNG_E;
    107 
    108     if (a == NULL)
    109         return BAD_FUNC_ARG;
     99    int ret = 0;
     100    DECLARE_VAR(d, mp_digit, 1, rng ? rng->heap : NULL);
     101
     102    if (rng == NULL) {
     103        ret = MISSING_RNG_E; goto exit;
     104    }
     105
     106    if (a == NULL
     107    #ifdef WOLFSSL_ASYNC_CRYPT
     108        || d == NULL
     109    #endif
     110    ) {
     111        ret = BAD_FUNC_ARG; goto exit;
     112    }
    110113
    111114    mp_zero(a);
    112115    if (digits <= 0) {
    113         return MP_OKAY;
     116        ret = MP_OKAY; goto exit;
    114117    }
    115118
    116119    /* first place a random non-zero digit */
    117120    do {
    118         ret = get_rand_digit(rng, &d);
     121        ret = get_rand_digit(rng, d);
    119122        if (ret != 0) {
    120             return ret;
    121         }
    122     } while (d == 0);
    123 
    124     if ((ret = mp_add_d(a, d, a)) != MP_OKAY) {
    125         return ret;
     123            goto exit;
     124        }
     125    } while (*d == 0);
     126
     127    if ((ret = mp_add_d(a, *d, a)) != MP_OKAY) {
     128        goto exit;
    126129    }
    127130
    128131    while (--digits > 0) {
    129132        if ((ret = mp_lshd(a, 1)) != MP_OKAY) {
    130             return ret;
    131         }
    132         if ((ret = get_rand_digit(rng, &d)) != 0) {
    133             return ret;
    134         }
    135         if ((ret = mp_add_d(a, d, a)) != MP_OKAY) {
    136             return ret;
    137         }
    138     }
     133            goto exit;
     134        }
     135        if ((ret = get_rand_digit(rng, d)) != 0) {
     136            goto exit;
     137        }
     138        if ((ret = mp_add_d(a, *d, a)) != MP_OKAY) {
     139            goto exit;
     140        }
     141    }
     142
     143exit:
     144    FREE_VAR(d, rng ? rng->heap : NULL);
    139145
    140146    return ret;
    141147}
    142148#endif /* WC_RSA_BLINDING */
     149#endif
     150
     151/* export an mp_int as unsigned char or hex string
     152 * encType is WC_TYPE_UNSIGNED_BIN or WC_TYPE_HEX_STR
     153 * return MP_OKAY on success */
     154int wc_export_int(mp_int* mp, byte* buf, word32* len, word32 keySz,
     155    int encType)
     156{
     157    int err;
     158
     159    if (mp == NULL)
     160        return BAD_FUNC_ARG;
     161
     162    /* check buffer size */
     163    if (*len < keySz) {
     164        *len = keySz;
     165        return BUFFER_E;
     166    }
     167
     168    *len = keySz;
     169    XMEMSET(buf, 0, *len);
     170
     171    if (encType == WC_TYPE_HEX_STR) {
     172    #ifdef WC_MP_TO_RADIX
     173        err = mp_tohex(mp, (char*)buf);
     174    #else
     175        err = NOT_COMPILED_IN;
     176    #endif
     177    }
     178    else {
     179        err = mp_to_unsigned_bin(mp, buf + (keySz - mp_unsigned_bin_size(mp)));
     180    }
     181
     182    return err;
     183}
    143184
    144185
     
    236277}
    237278
     279/* sz: make sure the buffer is at least that size and zero padded.
     280 *     A `sz == 0` will use the size of `src`.
     281 *     The calulcates sz is stored into dst->len in `wc_bigint_alloc`.
     282 */
     283int wc_mp_to_bigint_sz(mp_int* src, WC_BIGINT* dst, word32 sz)
     284{
     285    int err;
     286    word32 x, y;
     287
     288    if (src == NULL || dst == NULL)
     289        return BAD_FUNC_ARG;
     290
     291    /* get size of source */
     292    x = mp_unsigned_bin_size(src);
     293    if (sz < x)
     294        sz = x;
     295
     296    /* make sure destination is allocated and large enough */
     297    err = wc_bigint_alloc(dst, sz);
     298    if (err == MP_OKAY) {
     299
     300        /* leading zero pad */
     301        y = sz - x;
     302        XMEMSET(dst->buf, 0, y);
     303
     304        /* export src as unsigned bin to destination buf */
     305        err = mp_to_unsigned_bin(src, dst->buf + y);
     306    }
     307
     308    return err;
     309}
     310
    238311int wc_mp_to_bigint(mp_int* src, WC_BIGINT* dst)
    239312{
    240     int err;
    241     word32 sz;
    242 
    243313    if (src == NULL || dst == NULL)
    244314        return BAD_FUNC_ARG;
    245315
    246     sz = mp_unsigned_bin_size(src);
    247     err = wc_bigint_alloc(dst, sz);
    248     if (err == MP_OKAY)
    249         err = mp_to_unsigned_bin(src, dst->buf);
    250 
    251     return err;
     316    return wc_mp_to_bigint_sz(src, dst, 0);
    252317}
    253318
Note: See TracChangeset for help on using the changeset viewer.