wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Tue May 30 01:44:10 2017 +0000
Revision:
11:cee25a834751
wolfSSL 3.11.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 11:cee25a834751 1 /* wolfmath.c
wolfSSL 11:cee25a834751 2 *
wolfSSL 11:cee25a834751 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 11:cee25a834751 4 *
wolfSSL 11:cee25a834751 5 * This file is part of wolfSSL.
wolfSSL 11:cee25a834751 6 *
wolfSSL 11:cee25a834751 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 11:cee25a834751 8 * it under the terms of the GNU General Public License as published by
wolfSSL 11:cee25a834751 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 11:cee25a834751 10 * (at your option) any later version.
wolfSSL 11:cee25a834751 11 *
wolfSSL 11:cee25a834751 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 11:cee25a834751 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 11:cee25a834751 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 11:cee25a834751 15 * GNU General Public License for more details.
wolfSSL 11:cee25a834751 16 *
wolfSSL 11:cee25a834751 17 * You should have received a copy of the GNU General Public License
wolfSSL 11:cee25a834751 18 * along with this program; if not, write to the Free Software
wolfSSL 11:cee25a834751 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 11:cee25a834751 20 */
wolfSSL 11:cee25a834751 21
wolfSSL 11:cee25a834751 22
wolfSSL 11:cee25a834751 23 /* common functions for either math library */
wolfSSL 11:cee25a834751 24
wolfSSL 11:cee25a834751 25 #ifdef HAVE_CONFIG_H
wolfSSL 11:cee25a834751 26 #include <config.h>
wolfSSL 11:cee25a834751 27 #endif
wolfSSL 11:cee25a834751 28
wolfSSL 11:cee25a834751 29 /* in case user set USE_FAST_MATH there */
wolfSSL 11:cee25a834751 30 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 11:cee25a834751 31
wolfSSL 11:cee25a834751 32 #ifdef USE_FAST_MATH
wolfSSL 11:cee25a834751 33 #include <wolfssl/wolfcrypt/tfm.h>
wolfSSL 11:cee25a834751 34 #else
wolfSSL 11:cee25a834751 35 #include <wolfssl/wolfcrypt/integer.h>
wolfSSL 11:cee25a834751 36 #endif
wolfSSL 11:cee25a834751 37
wolfSSL 11:cee25a834751 38 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 11:cee25a834751 39 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 11:cee25a834751 40
wolfSSL 11:cee25a834751 41 #if defined(USE_FAST_MATH) || !defined(NO_BIG_INT)
wolfSSL 11:cee25a834751 42
wolfSSL 11:cee25a834751 43 #ifdef WOLFSSL_ASYNC_CRYPT
wolfSSL 11:cee25a834751 44 #include <wolfssl/wolfcrypt/async.h>
wolfSSL 11:cee25a834751 45 #endif
wolfSSL 11:cee25a834751 46
wolfSSL 11:cee25a834751 47 #ifdef NO_INLINE
wolfSSL 11:cee25a834751 48 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 11:cee25a834751 49 #else
wolfSSL 11:cee25a834751 50 #define WOLFSSL_MISC_INCLUDED
wolfSSL 11:cee25a834751 51 #include <wolfcrypt/src/misc.c>
wolfSSL 11:cee25a834751 52 #endif
wolfSSL 11:cee25a834751 53
wolfSSL 11:cee25a834751 54
wolfSSL 11:cee25a834751 55 int get_digit_count(mp_int* a)
wolfSSL 11:cee25a834751 56 {
wolfSSL 11:cee25a834751 57 if (a == NULL)
wolfSSL 11:cee25a834751 58 return 0;
wolfSSL 11:cee25a834751 59
wolfSSL 11:cee25a834751 60 return a->used;
wolfSSL 11:cee25a834751 61 }
wolfSSL 11:cee25a834751 62
wolfSSL 11:cee25a834751 63 mp_digit get_digit(mp_int* a, int n)
wolfSSL 11:cee25a834751 64 {
wolfSSL 11:cee25a834751 65 if (a == NULL)
wolfSSL 11:cee25a834751 66 return 0;
wolfSSL 11:cee25a834751 67
wolfSSL 11:cee25a834751 68 return (n >= a->used || n < 0) ? 0 : a->dp[n];
wolfSSL 11:cee25a834751 69 }
wolfSSL 11:cee25a834751 70
wolfSSL 11:cee25a834751 71 int get_rand_digit(WC_RNG* rng, mp_digit* d)
wolfSSL 11:cee25a834751 72 {
wolfSSL 11:cee25a834751 73 return wc_RNG_GenerateBlock(rng, (byte*)d, sizeof(mp_digit));
wolfSSL 11:cee25a834751 74 }
wolfSSL 11:cee25a834751 75
wolfSSL 11:cee25a834751 76 #ifdef WC_RSA_BLINDING
wolfSSL 11:cee25a834751 77 int mp_rand(mp_int* a, int digits, WC_RNG* rng)
wolfSSL 11:cee25a834751 78 {
wolfSSL 11:cee25a834751 79 int ret;
wolfSSL 11:cee25a834751 80 mp_digit d;
wolfSSL 11:cee25a834751 81
wolfSSL 11:cee25a834751 82 if (rng == NULL)
wolfSSL 11:cee25a834751 83 return MISSING_RNG_E;
wolfSSL 11:cee25a834751 84
wolfSSL 11:cee25a834751 85 if (a == NULL)
wolfSSL 11:cee25a834751 86 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 87
wolfSSL 11:cee25a834751 88 mp_zero(a);
wolfSSL 11:cee25a834751 89 if (digits <= 0) {
wolfSSL 11:cee25a834751 90 return MP_OKAY;
wolfSSL 11:cee25a834751 91 }
wolfSSL 11:cee25a834751 92
wolfSSL 11:cee25a834751 93 /* first place a random non-zero digit */
wolfSSL 11:cee25a834751 94 do {
wolfSSL 11:cee25a834751 95 ret = get_rand_digit(rng, &d);
wolfSSL 11:cee25a834751 96 if (ret != 0) {
wolfSSL 11:cee25a834751 97 return ret;
wolfSSL 11:cee25a834751 98 }
wolfSSL 11:cee25a834751 99 } while (d == 0);
wolfSSL 11:cee25a834751 100
wolfSSL 11:cee25a834751 101 if ((ret = mp_add_d(a, d, a)) != MP_OKAY) {
wolfSSL 11:cee25a834751 102 return ret;
wolfSSL 11:cee25a834751 103 }
wolfSSL 11:cee25a834751 104
wolfSSL 11:cee25a834751 105 while (--digits > 0) {
wolfSSL 11:cee25a834751 106 if ((ret = mp_lshd(a, 1)) != MP_OKAY) {
wolfSSL 11:cee25a834751 107 return ret;
wolfSSL 11:cee25a834751 108 }
wolfSSL 11:cee25a834751 109 if ((ret = get_rand_digit(rng, &d)) != 0) {
wolfSSL 11:cee25a834751 110 return ret;
wolfSSL 11:cee25a834751 111 }
wolfSSL 11:cee25a834751 112 if ((ret = mp_add_d(a, d, a)) != MP_OKAY) {
wolfSSL 11:cee25a834751 113 return ret;
wolfSSL 11:cee25a834751 114 }
wolfSSL 11:cee25a834751 115 }
wolfSSL 11:cee25a834751 116
wolfSSL 11:cee25a834751 117 return ret;
wolfSSL 11:cee25a834751 118 }
wolfSSL 11:cee25a834751 119 #endif /* WC_RSA_BLINDING */
wolfSSL 11:cee25a834751 120
wolfSSL 11:cee25a834751 121
wolfSSL 11:cee25a834751 122 #ifdef HAVE_WOLF_BIGINT
wolfSSL 11:cee25a834751 123 void wc_bigint_init(WC_BIGINT* a)
wolfSSL 11:cee25a834751 124 {
wolfSSL 11:cee25a834751 125 if (a != NULL) {
wolfSSL 11:cee25a834751 126 a->buf = NULL;
wolfSSL 11:cee25a834751 127 a->len = 0;
wolfSSL 11:cee25a834751 128 a->heap = NULL;
wolfSSL 11:cee25a834751 129 }
wolfSSL 11:cee25a834751 130 }
wolfSSL 11:cee25a834751 131
wolfSSL 11:cee25a834751 132 int wc_bigint_alloc(WC_BIGINT* a, word32 sz)
wolfSSL 11:cee25a834751 133 {
wolfSSL 11:cee25a834751 134 int err = MP_OKAY;
wolfSSL 11:cee25a834751 135
wolfSSL 11:cee25a834751 136 if (a == NULL)
wolfSSL 11:cee25a834751 137 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 138
wolfSSL 11:cee25a834751 139 if (sz > 0) {
wolfSSL 11:cee25a834751 140 if (a->buf && sz > a->len) {
wolfSSL 11:cee25a834751 141 wc_bigint_free(a);
wolfSSL 11:cee25a834751 142 }
wolfSSL 11:cee25a834751 143 if (a->buf == NULL) {
wolfSSL 11:cee25a834751 144 a->buf = (byte*)XMALLOC(sz, a->heap, DYNAMIC_TYPE_WOLF_BIGINT);
wolfSSL 11:cee25a834751 145 }
wolfSSL 11:cee25a834751 146 if (a->buf == NULL) {
wolfSSL 11:cee25a834751 147 err = MP_MEM;
wolfSSL 11:cee25a834751 148 }
wolfSSL 11:cee25a834751 149 else {
wolfSSL 11:cee25a834751 150 XMEMSET(a->buf, 0, sz);
wolfSSL 11:cee25a834751 151 }
wolfSSL 11:cee25a834751 152 }
wolfSSL 11:cee25a834751 153 a->len = sz;
wolfSSL 11:cee25a834751 154
wolfSSL 11:cee25a834751 155 return err;
wolfSSL 11:cee25a834751 156 }
wolfSSL 11:cee25a834751 157
wolfSSL 11:cee25a834751 158 /* assumes input is big endian format */
wolfSSL 11:cee25a834751 159 int wc_bigint_from_unsigned_bin(WC_BIGINT* a, const byte* in, word32 inlen)
wolfSSL 11:cee25a834751 160 {
wolfSSL 11:cee25a834751 161 int err;
wolfSSL 11:cee25a834751 162
wolfSSL 11:cee25a834751 163 if (a == NULL || in == NULL || inlen == 0)
wolfSSL 11:cee25a834751 164 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 165
wolfSSL 11:cee25a834751 166 err = wc_bigint_alloc(a, inlen);
wolfSSL 11:cee25a834751 167 if (err == 0) {
wolfSSL 11:cee25a834751 168 XMEMCPY(a->buf, in, inlen);
wolfSSL 11:cee25a834751 169 }
wolfSSL 11:cee25a834751 170
wolfSSL 11:cee25a834751 171 return err;
wolfSSL 11:cee25a834751 172 }
wolfSSL 11:cee25a834751 173
wolfSSL 11:cee25a834751 174 int wc_bigint_to_unsigned_bin(WC_BIGINT* a, byte* out, word32* outlen)
wolfSSL 11:cee25a834751 175 {
wolfSSL 11:cee25a834751 176 word32 sz;
wolfSSL 11:cee25a834751 177
wolfSSL 11:cee25a834751 178 if (a == NULL || out == NULL || outlen == NULL || *outlen == 0)
wolfSSL 11:cee25a834751 179 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 180
wolfSSL 11:cee25a834751 181 /* trim to fit into output buffer */
wolfSSL 11:cee25a834751 182 sz = a->len;
wolfSSL 11:cee25a834751 183 if (a->len > *outlen) {
wolfSSL 11:cee25a834751 184 WOLFSSL_MSG("wc_bigint_export: Truncating output");
wolfSSL 11:cee25a834751 185 sz = *outlen;
wolfSSL 11:cee25a834751 186 }
wolfSSL 11:cee25a834751 187
wolfSSL 11:cee25a834751 188 if (a->buf) {
wolfSSL 11:cee25a834751 189 XMEMCPY(out, a->buf, sz);
wolfSSL 11:cee25a834751 190 }
wolfSSL 11:cee25a834751 191
wolfSSL 11:cee25a834751 192 *outlen = sz;
wolfSSL 11:cee25a834751 193
wolfSSL 11:cee25a834751 194 return MP_OKAY;
wolfSSL 11:cee25a834751 195 }
wolfSSL 11:cee25a834751 196
wolfSSL 11:cee25a834751 197 void wc_bigint_zero(WC_BIGINT* a)
wolfSSL 11:cee25a834751 198 {
wolfSSL 11:cee25a834751 199 if (a && a->buf) {
wolfSSL 11:cee25a834751 200 ForceZero(a->buf, a->len);
wolfSSL 11:cee25a834751 201 }
wolfSSL 11:cee25a834751 202 }
wolfSSL 11:cee25a834751 203
wolfSSL 11:cee25a834751 204 void wc_bigint_free(WC_BIGINT* a)
wolfSSL 11:cee25a834751 205 {
wolfSSL 11:cee25a834751 206 if (a) {
wolfSSL 11:cee25a834751 207 if (a->buf) {
wolfSSL 11:cee25a834751 208 XFREE(a->buf, a->heap, DYNAMIC_TYPE_WOLF_BIGINT);
wolfSSL 11:cee25a834751 209 }
wolfSSL 11:cee25a834751 210 a->buf = NULL;
wolfSSL 11:cee25a834751 211 a->len = 0;
wolfSSL 11:cee25a834751 212 }
wolfSSL 11:cee25a834751 213 }
wolfSSL 11:cee25a834751 214
wolfSSL 11:cee25a834751 215 int wc_mp_to_bigint(mp_int* src, WC_BIGINT* dst)
wolfSSL 11:cee25a834751 216 {
wolfSSL 11:cee25a834751 217 int err;
wolfSSL 11:cee25a834751 218 word32 sz;
wolfSSL 11:cee25a834751 219
wolfSSL 11:cee25a834751 220 if (src == NULL || dst == NULL)
wolfSSL 11:cee25a834751 221 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 222
wolfSSL 11:cee25a834751 223 sz = mp_unsigned_bin_size(src);
wolfSSL 11:cee25a834751 224 err = wc_bigint_alloc(dst, sz);
wolfSSL 11:cee25a834751 225 if (err == MP_OKAY)
wolfSSL 11:cee25a834751 226 err = mp_to_unsigned_bin(src, dst->buf);
wolfSSL 11:cee25a834751 227
wolfSSL 11:cee25a834751 228 return err;
wolfSSL 11:cee25a834751 229 }
wolfSSL 11:cee25a834751 230
wolfSSL 11:cee25a834751 231 int wc_bigint_to_mp(WC_BIGINT* src, mp_int* dst)
wolfSSL 11:cee25a834751 232 {
wolfSSL 11:cee25a834751 233 int err;
wolfSSL 11:cee25a834751 234
wolfSSL 11:cee25a834751 235 if (src == NULL || dst == NULL)
wolfSSL 11:cee25a834751 236 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 237
wolfSSL 11:cee25a834751 238 if (src->buf == NULL)
wolfSSL 11:cee25a834751 239 return BAD_FUNC_ARG;
wolfSSL 11:cee25a834751 240
wolfSSL 11:cee25a834751 241 err = mp_read_unsigned_bin(dst, src->buf, src->len);
wolfSSL 11:cee25a834751 242 wc_bigint_free(src);
wolfSSL 11:cee25a834751 243
wolfSSL 11:cee25a834751 244 return err;
wolfSSL 11:cee25a834751 245 }
wolfSSL 11:cee25a834751 246
wolfSSL 11:cee25a834751 247 #endif /* HAVE_WOLF_BIGINT */
wolfSSL 11:cee25a834751 248
wolfSSL 11:cee25a834751 249 #endif /* USE_FAST_MATH || !NO_BIG_INT */
wolfSSL 11:cee25a834751 250