A library for setting up Secure Socket Layer (SSL) connections and verifying remote hosts using certificates. Contains only the source files for mbed platform implementation of the library.

Dependents:   HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL HTTPClient-SSL

Committer:
Mike Fiore
Date:
Mon Mar 23 16:51:07 2015 -0500
Revision:
6:cf58d49e1a86
Parent:
0:b86d15c6ba29
fix whitespace in sha512.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 0:b86d15c6ba29 1 /* dh.c
Vanger 0:b86d15c6ba29 2 *
Vanger 0:b86d15c6ba29 3 * Copyright (C) 2006-2014 wolfSSL Inc.
Vanger 0:b86d15c6ba29 4 *
Vanger 0:b86d15c6ba29 5 * This file is part of CyaSSL.
Vanger 0:b86d15c6ba29 6 *
Vanger 0:b86d15c6ba29 7 * CyaSSL is free software; you can redistribute it and/or modify
Vanger 0:b86d15c6ba29 8 * it under the terms of the GNU General Public License as published by
Vanger 0:b86d15c6ba29 9 * the Free Software Foundation; either version 2 of the License, or
Vanger 0:b86d15c6ba29 10 * (at your option) any later version.
Vanger 0:b86d15c6ba29 11 *
Vanger 0:b86d15c6ba29 12 * CyaSSL is distributed in the hope that it will be useful,
Vanger 0:b86d15c6ba29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Vanger 0:b86d15c6ba29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Vanger 0:b86d15c6ba29 15 * GNU General Public License for more details.
Vanger 0:b86d15c6ba29 16 *
Vanger 0:b86d15c6ba29 17 * You should have received a copy of the GNU General Public License
Vanger 0:b86d15c6ba29 18 * along with this program; if not, write to the Free Software
Vanger 0:b86d15c6ba29 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Vanger 0:b86d15c6ba29 20 */
Vanger 0:b86d15c6ba29 21
Vanger 0:b86d15c6ba29 22 #ifdef HAVE_CONFIG_H
Vanger 0:b86d15c6ba29 23 #include <config.h>
Vanger 0:b86d15c6ba29 24 #endif
Vanger 0:b86d15c6ba29 25
Vanger 0:b86d15c6ba29 26 #include <cyassl/ctaocrypt/settings.h>
Vanger 0:b86d15c6ba29 27
Vanger 0:b86d15c6ba29 28 #ifndef NO_DH
Vanger 0:b86d15c6ba29 29
Vanger 0:b86d15c6ba29 30 #include <cyassl/ctaocrypt/dh.h>
Vanger 0:b86d15c6ba29 31 #include <cyassl/ctaocrypt/error-crypt.h>
Vanger 0:b86d15c6ba29 32
Vanger 0:b86d15c6ba29 33 #ifndef USER_MATH_LIB
Vanger 0:b86d15c6ba29 34 #include <math.h>
Vanger 0:b86d15c6ba29 35 #define XPOW(x,y) pow((x),(y))
Vanger 0:b86d15c6ba29 36 #define XLOG(x) log((x))
Vanger 0:b86d15c6ba29 37 #else
Vanger 0:b86d15c6ba29 38 /* user's own math lib */
Vanger 0:b86d15c6ba29 39 #endif
Vanger 0:b86d15c6ba29 40
Vanger 0:b86d15c6ba29 41
Vanger 0:b86d15c6ba29 42 #ifndef min
Vanger 0:b86d15c6ba29 43
Vanger 0:b86d15c6ba29 44 static INLINE word32 min(word32 a, word32 b)
Vanger 0:b86d15c6ba29 45 {
Vanger 0:b86d15c6ba29 46 return a > b ? b : a;
Vanger 0:b86d15c6ba29 47 }
Vanger 0:b86d15c6ba29 48
Vanger 0:b86d15c6ba29 49 #endif /* min */
Vanger 0:b86d15c6ba29 50
Vanger 0:b86d15c6ba29 51
Vanger 0:b86d15c6ba29 52 void InitDhKey(DhKey* key)
Vanger 0:b86d15c6ba29 53 {
Vanger 0:b86d15c6ba29 54 (void)key;
Vanger 0:b86d15c6ba29 55 /* TomsFastMath doesn't use memory allocation */
Vanger 0:b86d15c6ba29 56 #ifndef USE_FAST_MATH
Vanger 0:b86d15c6ba29 57 key->p.dp = 0;
Vanger 0:b86d15c6ba29 58 key->g.dp = 0;
Vanger 0:b86d15c6ba29 59 #endif
Vanger 0:b86d15c6ba29 60 }
Vanger 0:b86d15c6ba29 61
Vanger 0:b86d15c6ba29 62
Vanger 0:b86d15c6ba29 63 void FreeDhKey(DhKey* key)
Vanger 0:b86d15c6ba29 64 {
Vanger 0:b86d15c6ba29 65 (void)key;
Vanger 0:b86d15c6ba29 66 /* TomsFastMath doesn't use memory allocation */
Vanger 0:b86d15c6ba29 67 #ifndef USE_FAST_MATH
Vanger 0:b86d15c6ba29 68 mp_clear(&key->p);
Vanger 0:b86d15c6ba29 69 mp_clear(&key->g);
Vanger 0:b86d15c6ba29 70 #endif
Vanger 0:b86d15c6ba29 71 }
Vanger 0:b86d15c6ba29 72
Vanger 0:b86d15c6ba29 73
Vanger 0:b86d15c6ba29 74 static word32 DiscreteLogWorkFactor(word32 n)
Vanger 0:b86d15c6ba29 75 {
Vanger 0:b86d15c6ba29 76 /* assuming discrete log takes about the same time as factoring */
Vanger 0:b86d15c6ba29 77 if (n<5)
Vanger 0:b86d15c6ba29 78 return 0;
Vanger 0:b86d15c6ba29 79 else
Vanger 0:b86d15c6ba29 80 return (word32)(2.4 * XPOW((double)n, 1.0/3.0) *
Vanger 0:b86d15c6ba29 81 XPOW(XLOG((double)n), 2.0/3.0) - 5);
Vanger 0:b86d15c6ba29 82 }
Vanger 0:b86d15c6ba29 83
Vanger 0:b86d15c6ba29 84
Vanger 0:b86d15c6ba29 85 static int GeneratePrivate(DhKey* key, RNG* rng, byte* priv, word32* privSz)
Vanger 0:b86d15c6ba29 86 {
Vanger 0:b86d15c6ba29 87 int ret;
Vanger 0:b86d15c6ba29 88 word32 sz = mp_unsigned_bin_size(&key->p);
Vanger 0:b86d15c6ba29 89 sz = min(sz, 2 * DiscreteLogWorkFactor(sz * CYASSL_BIT_SIZE) /
Vanger 0:b86d15c6ba29 90 CYASSL_BIT_SIZE + 1);
Vanger 0:b86d15c6ba29 91
Vanger 0:b86d15c6ba29 92 ret = RNG_GenerateBlock(rng, priv, sz);
Vanger 0:b86d15c6ba29 93 if (ret != 0)
Vanger 0:b86d15c6ba29 94 return ret;
Vanger 0:b86d15c6ba29 95
Vanger 0:b86d15c6ba29 96 priv[0] |= 0x0C;
Vanger 0:b86d15c6ba29 97
Vanger 0:b86d15c6ba29 98 *privSz = sz;
Vanger 0:b86d15c6ba29 99
Vanger 0:b86d15c6ba29 100 return 0;
Vanger 0:b86d15c6ba29 101 }
Vanger 0:b86d15c6ba29 102
Vanger 0:b86d15c6ba29 103
Vanger 0:b86d15c6ba29 104 static int GeneratePublic(DhKey* key, const byte* priv, word32 privSz,
Vanger 0:b86d15c6ba29 105 byte* pub, word32* pubSz)
Vanger 0:b86d15c6ba29 106 {
Vanger 0:b86d15c6ba29 107 int ret = 0;
Vanger 0:b86d15c6ba29 108
Vanger 0:b86d15c6ba29 109 mp_int x;
Vanger 0:b86d15c6ba29 110 mp_int y;
Vanger 0:b86d15c6ba29 111
Vanger 0:b86d15c6ba29 112 if (mp_init_multi(&x, &y, 0, 0, 0, 0) != MP_OKAY)
Vanger 0:b86d15c6ba29 113 return MP_INIT_E;
Vanger 0:b86d15c6ba29 114
Vanger 0:b86d15c6ba29 115 if (mp_read_unsigned_bin(&x, priv, privSz) != MP_OKAY)
Vanger 0:b86d15c6ba29 116 ret = MP_READ_E;
Vanger 0:b86d15c6ba29 117
Vanger 0:b86d15c6ba29 118 if (ret == 0 && mp_exptmod(&key->g, &x, &key->p, &y) != MP_OKAY)
Vanger 0:b86d15c6ba29 119 ret = MP_EXPTMOD_E;
Vanger 0:b86d15c6ba29 120
Vanger 0:b86d15c6ba29 121 if (ret == 0 && mp_to_unsigned_bin(&y, pub) != MP_OKAY)
Vanger 0:b86d15c6ba29 122 ret = MP_TO_E;
Vanger 0:b86d15c6ba29 123
Vanger 0:b86d15c6ba29 124 if (ret == 0)
Vanger 0:b86d15c6ba29 125 *pubSz = mp_unsigned_bin_size(&y);
Vanger 0:b86d15c6ba29 126
Vanger 0:b86d15c6ba29 127 mp_clear(&y);
Vanger 0:b86d15c6ba29 128 mp_clear(&x);
Vanger 0:b86d15c6ba29 129
Vanger 0:b86d15c6ba29 130 return ret;
Vanger 0:b86d15c6ba29 131 }
Vanger 0:b86d15c6ba29 132
Vanger 0:b86d15c6ba29 133
Vanger 0:b86d15c6ba29 134 int DhGenerateKeyPair(DhKey* key, RNG* rng, byte* priv, word32* privSz,
Vanger 0:b86d15c6ba29 135 byte* pub, word32* pubSz)
Vanger 0:b86d15c6ba29 136 {
Vanger 0:b86d15c6ba29 137 int ret = GeneratePrivate(key, rng, priv, privSz);
Vanger 0:b86d15c6ba29 138
Vanger 0:b86d15c6ba29 139 return (ret != 0) ? ret : GeneratePublic(key, priv, *privSz, pub, pubSz);
Vanger 0:b86d15c6ba29 140 }
Vanger 0:b86d15c6ba29 141
Vanger 0:b86d15c6ba29 142 int DhAgree(DhKey* key, byte* agree, word32* agreeSz, const byte* priv,
Vanger 0:b86d15c6ba29 143 word32 privSz, const byte* otherPub, word32 pubSz)
Vanger 0:b86d15c6ba29 144 {
Vanger 0:b86d15c6ba29 145 int ret = 0;
Vanger 0:b86d15c6ba29 146
Vanger 0:b86d15c6ba29 147 mp_int x;
Vanger 0:b86d15c6ba29 148 mp_int y;
Vanger 0:b86d15c6ba29 149 mp_int z;
Vanger 0:b86d15c6ba29 150
Vanger 0:b86d15c6ba29 151 if (mp_init_multi(&x, &y, &z, 0, 0, 0) != MP_OKAY)
Vanger 0:b86d15c6ba29 152 return MP_INIT_E;
Vanger 0:b86d15c6ba29 153
Vanger 0:b86d15c6ba29 154 if (mp_read_unsigned_bin(&x, priv, privSz) != MP_OKAY)
Vanger 0:b86d15c6ba29 155 ret = MP_READ_E;
Vanger 0:b86d15c6ba29 156
Vanger 0:b86d15c6ba29 157 if (ret == 0 && mp_read_unsigned_bin(&y, otherPub, pubSz) != MP_OKAY)
Vanger 0:b86d15c6ba29 158 ret = MP_READ_E;
Vanger 0:b86d15c6ba29 159
Vanger 0:b86d15c6ba29 160 if (ret == 0 && mp_exptmod(&y, &x, &key->p, &z) != MP_OKAY)
Vanger 0:b86d15c6ba29 161 ret = MP_EXPTMOD_E;
Vanger 0:b86d15c6ba29 162
Vanger 0:b86d15c6ba29 163 if (ret == 0 && mp_to_unsigned_bin(&z, agree) != MP_OKAY)
Vanger 0:b86d15c6ba29 164 ret = MP_TO_E;
Vanger 0:b86d15c6ba29 165
Vanger 0:b86d15c6ba29 166 if (ret == 0)
Vanger 0:b86d15c6ba29 167 *agreeSz = mp_unsigned_bin_size(&z);
Vanger 0:b86d15c6ba29 168
Vanger 0:b86d15c6ba29 169 mp_clear(&z);
Vanger 0:b86d15c6ba29 170 mp_clear(&y);
Vanger 0:b86d15c6ba29 171 mp_clear(&x);
Vanger 0:b86d15c6ba29 172
Vanger 0:b86d15c6ba29 173 return ret;
Vanger 0:b86d15c6ba29 174 }
Vanger 0:b86d15c6ba29 175
Vanger 0:b86d15c6ba29 176
Vanger 0:b86d15c6ba29 177 #endif /* NO_DH */
Vanger 0:b86d15c6ba29 178