- Timestamp:
- Feb 7, 2019, 8:36:33 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/wolfssl-3.12.2/wolfcrypt/src/wolfmath.c
r352 r372 30 30 #include <wolfssl/wolfcrypt/settings.h> 31 31 32 #ifdef USE_FAST_MATH33 #include <wolfssl/wolfcrypt/tfm.h>34 #else35 32 #include <wolfssl/wolfcrypt/integer.h> 36 #endif37 33 38 34 #include <wolfssl/wolfcrypt/error-crypt.h> … … 92 88 } 93 89 90 #ifndef WC_NO_RNG 94 91 int get_rand_digit(WC_RNG* rng, mp_digit* d) 95 92 { … … 100 97 int mp_rand(mp_int* a, int digits, WC_RNG* rng) 101 98 { 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 } 110 113 111 114 mp_zero(a); 112 115 if (digits <= 0) { 113 ret urn MP_OKAY;116 ret = MP_OKAY; goto exit; 114 117 } 115 118 116 119 /* first place a random non-zero digit */ 117 120 do { 118 ret = get_rand_digit(rng, &d);121 ret = get_rand_digit(rng, d); 119 122 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; 126 129 } 127 130 128 131 while (--digits > 0) { 129 132 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 143 exit: 144 FREE_VAR(d, rng ? rng->heap : NULL); 139 145 140 146 return ret; 141 147 } 142 148 #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 */ 154 int 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 } 143 184 144 185 … … 236 277 } 237 278 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 */ 283 int 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 238 311 int wc_mp_to_bigint(mp_int* src, WC_BIGINT* dst) 239 312 { 240 int err;241 word32 sz;242 243 313 if (src == NULL || dst == NULL) 244 314 return BAD_FUNC_ARG; 245 315 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); 252 317 } 253 318
Note:
See TracChangeset
for help on using the changeset viewer.