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

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

Committer:
wolfSSL
Date:
Tue Aug 22 10:48:22 2017 +0000
Revision:
13:f67a6c6013ca
wolfSSL3.12.0 with TLS1.3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 13:f67a6c6013ca 1 /* dh.c
wolfSSL 13:f67a6c6013ca 2 *
wolfSSL 13:f67a6c6013ca 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 13:f67a6c6013ca 4 *
wolfSSL 13:f67a6c6013ca 5 * This file is part of wolfSSL.
wolfSSL 13:f67a6c6013ca 6 *
wolfSSL 13:f67a6c6013ca 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 13:f67a6c6013ca 8 * it under the terms of the GNU General Public License as published by
wolfSSL 13:f67a6c6013ca 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 13:f67a6c6013ca 10 * (at your option) any later version.
wolfSSL 13:f67a6c6013ca 11 *
wolfSSL 13:f67a6c6013ca 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 13:f67a6c6013ca 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 13:f67a6c6013ca 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 13:f67a6c6013ca 15 * GNU General Public License for more details.
wolfSSL 13:f67a6c6013ca 16 *
wolfSSL 13:f67a6c6013ca 17 * You should have received a copy of the GNU General Public License
wolfSSL 13:f67a6c6013ca 18 * along with this program; if not, write to the Free Software
wolfSSL 13:f67a6c6013ca 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 13:f67a6c6013ca 20 */
wolfSSL 13:f67a6c6013ca 21
wolfSSL 13:f67a6c6013ca 22
wolfSSL 13:f67a6c6013ca 23 #ifdef HAVE_CONFIG_H
wolfSSL 13:f67a6c6013ca 24 #include <config.h>
wolfSSL 13:f67a6c6013ca 25 #endif
wolfSSL 13:f67a6c6013ca 26
wolfSSL 13:f67a6c6013ca 27 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 13:f67a6c6013ca 28
wolfSSL 13:f67a6c6013ca 29 #ifndef NO_DH
wolfSSL 13:f67a6c6013ca 30
wolfSSL 13:f67a6c6013ca 31 #include <wolfssl/wolfcrypt/dh.h>
wolfSSL 13:f67a6c6013ca 32 #include <wolfssl/wolfcrypt/error-crypt.h>
wolfSSL 13:f67a6c6013ca 33 #include <wolfssl/wolfcrypt/logging.h>
wolfSSL 13:f67a6c6013ca 34
wolfSSL 13:f67a6c6013ca 35 #ifdef NO_INLINE
wolfSSL 13:f67a6c6013ca 36 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 13:f67a6c6013ca 37 #else
wolfSSL 13:f67a6c6013ca 38 #define WOLFSSL_MISC_INCLUDED
wolfSSL 13:f67a6c6013ca 39 #include <wolfcrypt/src/misc.c>
wolfSSL 13:f67a6c6013ca 40 #endif
wolfSSL 13:f67a6c6013ca 41
wolfSSL 13:f67a6c6013ca 42
wolfSSL 13:f67a6c6013ca 43 #if !defined(USER_MATH_LIB) && !defined(WOLFSSL_DH_CONST)
wolfSSL 13:f67a6c6013ca 44 #include <math.h>
wolfSSL 13:f67a6c6013ca 45 #define XPOW(x,y) pow((x),(y))
wolfSSL 13:f67a6c6013ca 46 #define XLOG(x) log((x))
wolfSSL 13:f67a6c6013ca 47 #else
wolfSSL 13:f67a6c6013ca 48 /* user's own math lib */
wolfSSL 13:f67a6c6013ca 49 #endif
wolfSSL 13:f67a6c6013ca 50
wolfSSL 13:f67a6c6013ca 51 #ifdef HAVE_FFDHE_2048
wolfSSL 13:f67a6c6013ca 52 static const byte dh_ffdhe2048_p[] = {
wolfSSL 13:f67a6c6013ca 53 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
wolfSSL 13:f67a6c6013ca 54 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
wolfSSL 13:f67a6c6013ca 55 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
wolfSSL 13:f67a6c6013ca 56 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
wolfSSL 13:f67a6c6013ca 57 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
wolfSSL 13:f67a6c6013ca 58 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
wolfSSL 13:f67a6c6013ca 59 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
wolfSSL 13:f67a6c6013ca 60 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
wolfSSL 13:f67a6c6013ca 61 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
wolfSSL 13:f67a6c6013ca 62 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
wolfSSL 13:f67a6c6013ca 63 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
wolfSSL 13:f67a6c6013ca 64 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
wolfSSL 13:f67a6c6013ca 65 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
wolfSSL 13:f67a6c6013ca 66 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
wolfSSL 13:f67a6c6013ca 67 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
wolfSSL 13:f67a6c6013ca 68 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
wolfSSL 13:f67a6c6013ca 69 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
wolfSSL 13:f67a6c6013ca 70 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
wolfSSL 13:f67a6c6013ca 71 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
wolfSSL 13:f67a6c6013ca 72 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
wolfSSL 13:f67a6c6013ca 73 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
wolfSSL 13:f67a6c6013ca 74 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
wolfSSL 13:f67a6c6013ca 75 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
wolfSSL 13:f67a6c6013ca 76 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
wolfSSL 13:f67a6c6013ca 77 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
wolfSSL 13:f67a6c6013ca 78 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
wolfSSL 13:f67a6c6013ca 79 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
wolfSSL 13:f67a6c6013ca 80 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
wolfSSL 13:f67a6c6013ca 81 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
wolfSSL 13:f67a6c6013ca 82 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
wolfSSL 13:f67a6c6013ca 83 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97,
wolfSSL 13:f67a6c6013ca 84 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
wolfSSL 13:f67a6c6013ca 85 };
wolfSSL 13:f67a6c6013ca 86 static const byte dh_ffdhe2048_g[] = { 0x02 };
wolfSSL 13:f67a6c6013ca 87
wolfSSL 13:f67a6c6013ca 88 const DhParams* wc_Dh_ffdhe2048_Get(void)
wolfSSL 13:f67a6c6013ca 89 {
wolfSSL 13:f67a6c6013ca 90 static const DhParams ffdhe2048 = {
wolfSSL 13:f67a6c6013ca 91 dh_ffdhe2048_p, sizeof(dh_ffdhe2048_p),
wolfSSL 13:f67a6c6013ca 92 dh_ffdhe2048_g, sizeof(dh_ffdhe2048_g)
wolfSSL 13:f67a6c6013ca 93 };
wolfSSL 13:f67a6c6013ca 94 return &ffdhe2048;
wolfSSL 13:f67a6c6013ca 95 }
wolfSSL 13:f67a6c6013ca 96 #endif
wolfSSL 13:f67a6c6013ca 97
wolfSSL 13:f67a6c6013ca 98 #ifdef HAVE_FFDHE_3072
wolfSSL 13:f67a6c6013ca 99 static const byte dh_ffdhe3072_p[] = {
wolfSSL 13:f67a6c6013ca 100 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
wolfSSL 13:f67a6c6013ca 101 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
wolfSSL 13:f67a6c6013ca 102 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
wolfSSL 13:f67a6c6013ca 103 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
wolfSSL 13:f67a6c6013ca 104 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
wolfSSL 13:f67a6c6013ca 105 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
wolfSSL 13:f67a6c6013ca 106 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
wolfSSL 13:f67a6c6013ca 107 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
wolfSSL 13:f67a6c6013ca 108 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
wolfSSL 13:f67a6c6013ca 109 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
wolfSSL 13:f67a6c6013ca 110 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
wolfSSL 13:f67a6c6013ca 111 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
wolfSSL 13:f67a6c6013ca 112 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
wolfSSL 13:f67a6c6013ca 113 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
wolfSSL 13:f67a6c6013ca 114 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
wolfSSL 13:f67a6c6013ca 115 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
wolfSSL 13:f67a6c6013ca 116 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
wolfSSL 13:f67a6c6013ca 117 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
wolfSSL 13:f67a6c6013ca 118 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
wolfSSL 13:f67a6c6013ca 119 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
wolfSSL 13:f67a6c6013ca 120 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
wolfSSL 13:f67a6c6013ca 121 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
wolfSSL 13:f67a6c6013ca 122 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
wolfSSL 13:f67a6c6013ca 123 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
wolfSSL 13:f67a6c6013ca 124 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
wolfSSL 13:f67a6c6013ca 125 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
wolfSSL 13:f67a6c6013ca 126 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
wolfSSL 13:f67a6c6013ca 127 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
wolfSSL 13:f67a6c6013ca 128 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
wolfSSL 13:f67a6c6013ca 129 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
wolfSSL 13:f67a6c6013ca 130 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
wolfSSL 13:f67a6c6013ca 131 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
wolfSSL 13:f67a6c6013ca 132 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
wolfSSL 13:f67a6c6013ca 133 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
wolfSSL 13:f67a6c6013ca 134 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
wolfSSL 13:f67a6c6013ca 135 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
wolfSSL 13:f67a6c6013ca 136 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
wolfSSL 13:f67a6c6013ca 137 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
wolfSSL 13:f67a6c6013ca 138 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
wolfSSL 13:f67a6c6013ca 139 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
wolfSSL 13:f67a6c6013ca 140 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
wolfSSL 13:f67a6c6013ca 141 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
wolfSSL 13:f67a6c6013ca 142 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
wolfSSL 13:f67a6c6013ca 143 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
wolfSSL 13:f67a6c6013ca 144 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
wolfSSL 13:f67a6c6013ca 145 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
wolfSSL 13:f67a6c6013ca 146 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0xC6, 0x2E, 0x37,
wolfSSL 13:f67a6c6013ca 147 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
wolfSSL 13:f67a6c6013ca 148 };
wolfSSL 13:f67a6c6013ca 149 static const byte dh_ffdhe3072_g[] = { 0x02 };
wolfSSL 13:f67a6c6013ca 150
wolfSSL 13:f67a6c6013ca 151 const DhParams* wc_Dh_ffdhe3072_Get(void)
wolfSSL 13:f67a6c6013ca 152 {
wolfSSL 13:f67a6c6013ca 153 static const DhParams ffdhe3072 = {
wolfSSL 13:f67a6c6013ca 154 dh_ffdhe3072_p, sizeof(dh_ffdhe3072_p),
wolfSSL 13:f67a6c6013ca 155 dh_ffdhe3072_g, sizeof(dh_ffdhe3072_g)
wolfSSL 13:f67a6c6013ca 156 };
wolfSSL 13:f67a6c6013ca 157 return &ffdhe3072;
wolfSSL 13:f67a6c6013ca 158 }
wolfSSL 13:f67a6c6013ca 159 #endif
wolfSSL 13:f67a6c6013ca 160
wolfSSL 13:f67a6c6013ca 161 #ifdef HAVE_FFDHE_4096
wolfSSL 13:f67a6c6013ca 162 static const byte dh_ffdhe4096_p[] = {
wolfSSL 13:f67a6c6013ca 163 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
wolfSSL 13:f67a6c6013ca 164 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
wolfSSL 13:f67a6c6013ca 165 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
wolfSSL 13:f67a6c6013ca 166 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
wolfSSL 13:f67a6c6013ca 167 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
wolfSSL 13:f67a6c6013ca 168 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
wolfSSL 13:f67a6c6013ca 169 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
wolfSSL 13:f67a6c6013ca 170 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
wolfSSL 13:f67a6c6013ca 171 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
wolfSSL 13:f67a6c6013ca 172 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
wolfSSL 13:f67a6c6013ca 173 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
wolfSSL 13:f67a6c6013ca 174 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
wolfSSL 13:f67a6c6013ca 175 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
wolfSSL 13:f67a6c6013ca 176 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
wolfSSL 13:f67a6c6013ca 177 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
wolfSSL 13:f67a6c6013ca 178 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
wolfSSL 13:f67a6c6013ca 179 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
wolfSSL 13:f67a6c6013ca 180 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
wolfSSL 13:f67a6c6013ca 181 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
wolfSSL 13:f67a6c6013ca 182 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
wolfSSL 13:f67a6c6013ca 183 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
wolfSSL 13:f67a6c6013ca 184 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
wolfSSL 13:f67a6c6013ca 185 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
wolfSSL 13:f67a6c6013ca 186 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
wolfSSL 13:f67a6c6013ca 187 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
wolfSSL 13:f67a6c6013ca 188 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
wolfSSL 13:f67a6c6013ca 189 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
wolfSSL 13:f67a6c6013ca 190 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
wolfSSL 13:f67a6c6013ca 191 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
wolfSSL 13:f67a6c6013ca 192 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
wolfSSL 13:f67a6c6013ca 193 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
wolfSSL 13:f67a6c6013ca 194 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
wolfSSL 13:f67a6c6013ca 195 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
wolfSSL 13:f67a6c6013ca 196 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
wolfSSL 13:f67a6c6013ca 197 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
wolfSSL 13:f67a6c6013ca 198 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
wolfSSL 13:f67a6c6013ca 199 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
wolfSSL 13:f67a6c6013ca 200 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
wolfSSL 13:f67a6c6013ca 201 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
wolfSSL 13:f67a6c6013ca 202 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
wolfSSL 13:f67a6c6013ca 203 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
wolfSSL 13:f67a6c6013ca 204 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
wolfSSL 13:f67a6c6013ca 205 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
wolfSSL 13:f67a6c6013ca 206 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
wolfSSL 13:f67a6c6013ca 207 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
wolfSSL 13:f67a6c6013ca 208 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
wolfSSL 13:f67a6c6013ca 209 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
wolfSSL 13:f67a6c6013ca 210 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
wolfSSL 13:f67a6c6013ca 211 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
wolfSSL 13:f67a6c6013ca 212 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
wolfSSL 13:f67a6c6013ca 213 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
wolfSSL 13:f67a6c6013ca 214 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
wolfSSL 13:f67a6c6013ca 215 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
wolfSSL 13:f67a6c6013ca 216 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
wolfSSL 13:f67a6c6013ca 217 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
wolfSSL 13:f67a6c6013ca 218 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
wolfSSL 13:f67a6c6013ca 219 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
wolfSSL 13:f67a6c6013ca 220 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
wolfSSL 13:f67a6c6013ca 221 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
wolfSSL 13:f67a6c6013ca 222 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
wolfSSL 13:f67a6c6013ca 223 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
wolfSSL 13:f67a6c6013ca 224 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
wolfSSL 13:f67a6c6013ca 225 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x65, 0x5F, 0x6A,
wolfSSL 13:f67a6c6013ca 226 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
wolfSSL 13:f67a6c6013ca 227 };
wolfSSL 13:f67a6c6013ca 228 static const byte dh_ffdhe4096_g[] = { 0x02 };
wolfSSL 13:f67a6c6013ca 229
wolfSSL 13:f67a6c6013ca 230 const DhParams* wc_Dh_ffdhe4096_Get(void)
wolfSSL 13:f67a6c6013ca 231 {
wolfSSL 13:f67a6c6013ca 232 static const DhParams ffdhe4096 = {
wolfSSL 13:f67a6c6013ca 233 dh_ffdhe4096_p, sizeof(dh_ffdhe4096_p),
wolfSSL 13:f67a6c6013ca 234 dh_ffdhe4096_g, sizeof(dh_ffdhe4096_g)
wolfSSL 13:f67a6c6013ca 235 };
wolfSSL 13:f67a6c6013ca 236 return &ffdhe4096;
wolfSSL 13:f67a6c6013ca 237 }
wolfSSL 13:f67a6c6013ca 238 #endif
wolfSSL 13:f67a6c6013ca 239
wolfSSL 13:f67a6c6013ca 240 #ifdef HAVE_FFDHE_6144
wolfSSL 13:f67a6c6013ca 241 static const byte dh_ffdhe6144_p[] = {
wolfSSL 13:f67a6c6013ca 242 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
wolfSSL 13:f67a6c6013ca 243 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
wolfSSL 13:f67a6c6013ca 244 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
wolfSSL 13:f67a6c6013ca 245 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
wolfSSL 13:f67a6c6013ca 246 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
wolfSSL 13:f67a6c6013ca 247 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
wolfSSL 13:f67a6c6013ca 248 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
wolfSSL 13:f67a6c6013ca 249 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
wolfSSL 13:f67a6c6013ca 250 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
wolfSSL 13:f67a6c6013ca 251 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
wolfSSL 13:f67a6c6013ca 252 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
wolfSSL 13:f67a6c6013ca 253 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
wolfSSL 13:f67a6c6013ca 254 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
wolfSSL 13:f67a6c6013ca 255 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
wolfSSL 13:f67a6c6013ca 256 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
wolfSSL 13:f67a6c6013ca 257 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
wolfSSL 13:f67a6c6013ca 258 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
wolfSSL 13:f67a6c6013ca 259 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
wolfSSL 13:f67a6c6013ca 260 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
wolfSSL 13:f67a6c6013ca 261 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
wolfSSL 13:f67a6c6013ca 262 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
wolfSSL 13:f67a6c6013ca 263 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
wolfSSL 13:f67a6c6013ca 264 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
wolfSSL 13:f67a6c6013ca 265 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
wolfSSL 13:f67a6c6013ca 266 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
wolfSSL 13:f67a6c6013ca 267 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
wolfSSL 13:f67a6c6013ca 268 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
wolfSSL 13:f67a6c6013ca 269 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
wolfSSL 13:f67a6c6013ca 270 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
wolfSSL 13:f67a6c6013ca 271 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
wolfSSL 13:f67a6c6013ca 272 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
wolfSSL 13:f67a6c6013ca 273 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
wolfSSL 13:f67a6c6013ca 274 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
wolfSSL 13:f67a6c6013ca 275 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
wolfSSL 13:f67a6c6013ca 276 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
wolfSSL 13:f67a6c6013ca 277 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
wolfSSL 13:f67a6c6013ca 278 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
wolfSSL 13:f67a6c6013ca 279 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
wolfSSL 13:f67a6c6013ca 280 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
wolfSSL 13:f67a6c6013ca 281 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
wolfSSL 13:f67a6c6013ca 282 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
wolfSSL 13:f67a6c6013ca 283 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
wolfSSL 13:f67a6c6013ca 284 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
wolfSSL 13:f67a6c6013ca 285 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
wolfSSL 13:f67a6c6013ca 286 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
wolfSSL 13:f67a6c6013ca 287 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
wolfSSL 13:f67a6c6013ca 288 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
wolfSSL 13:f67a6c6013ca 289 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
wolfSSL 13:f67a6c6013ca 290 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
wolfSSL 13:f67a6c6013ca 291 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
wolfSSL 13:f67a6c6013ca 292 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
wolfSSL 13:f67a6c6013ca 293 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
wolfSSL 13:f67a6c6013ca 294 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
wolfSSL 13:f67a6c6013ca 295 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
wolfSSL 13:f67a6c6013ca 296 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
wolfSSL 13:f67a6c6013ca 297 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
wolfSSL 13:f67a6c6013ca 298 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
wolfSSL 13:f67a6c6013ca 299 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
wolfSSL 13:f67a6c6013ca 300 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
wolfSSL 13:f67a6c6013ca 301 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
wolfSSL 13:f67a6c6013ca 302 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
wolfSSL 13:f67a6c6013ca 303 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
wolfSSL 13:f67a6c6013ca 304 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02,
wolfSSL 13:f67a6c6013ca 305 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A,
wolfSSL 13:f67a6c6013ca 306 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A,
wolfSSL 13:f67a6c6013ca 307 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6,
wolfSSL 13:f67a6c6013ca 308 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8,
wolfSSL 13:f67a6c6013ca 309 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C,
wolfSSL 13:f67a6c6013ca 310 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A,
wolfSSL 13:f67a6c6013ca 311 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71,
wolfSSL 13:f67a6c6013ca 312 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F,
wolfSSL 13:f67a6c6013ca 313 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77,
wolfSSL 13:f67a6c6013ca 314 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10,
wolfSSL 13:f67a6c6013ca 315 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8,
wolfSSL 13:f67a6c6013ca 316 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3,
wolfSSL 13:f67a6c6013ca 317 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E,
wolfSSL 13:f67a6c6013ca 318 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3,
wolfSSL 13:f67a6c6013ca 319 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4,
wolfSSL 13:f67a6c6013ca 320 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1,
wolfSSL 13:f67a6c6013ca 321 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92,
wolfSSL 13:f67a6c6013ca 322 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6,
wolfSSL 13:f67a6c6013ca 323 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82,
wolfSSL 13:f67a6c6013ca 324 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE,
wolfSSL 13:f67a6c6013ca 325 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C,
wolfSSL 13:f67a6c6013ca 326 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E,
wolfSSL 13:f67a6c6013ca 327 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46,
wolfSSL 13:f67a6c6013ca 328 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A,
wolfSSL 13:f67a6c6013ca 329 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17,
wolfSSL 13:f67a6c6013ca 330 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03,
wolfSSL 13:f67a6c6013ca 331 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04,
wolfSSL 13:f67a6c6013ca 332 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6,
wolfSSL 13:f67a6c6013ca 333 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69,
wolfSSL 13:f67a6c6013ca 334 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1,
wolfSSL 13:f67a6c6013ca 335 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4,
wolfSSL 13:f67a6c6013ca 336 0xA4, 0x0E, 0x32, 0x9C, 0xD0, 0xE4, 0x0E, 0x65,
wolfSSL 13:f67a6c6013ca 337 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
wolfSSL 13:f67a6c6013ca 338 };
wolfSSL 13:f67a6c6013ca 339 static const byte dh_ffdhe6144_g[] = { 0x02 };
wolfSSL 13:f67a6c6013ca 340
wolfSSL 13:f67a6c6013ca 341 const DhParams* wc_Dh_ffdhe6144_Get(void)
wolfSSL 13:f67a6c6013ca 342 {
wolfSSL 13:f67a6c6013ca 343 static const DhParams ffdhe6144 = {
wolfSSL 13:f67a6c6013ca 344 dh_ffdhe6144_p, sizeof(dh_ffdhe6144_p),
wolfSSL 13:f67a6c6013ca 345 dh_ffdhe6144_g, sizeof(dh_ffdhe6144_g)
wolfSSL 13:f67a6c6013ca 346 };
wolfSSL 13:f67a6c6013ca 347 return &ffdhe6144;
wolfSSL 13:f67a6c6013ca 348 }
wolfSSL 13:f67a6c6013ca 349 #endif
wolfSSL 13:f67a6c6013ca 350
wolfSSL 13:f67a6c6013ca 351 #ifdef HAVE_FFDHE_8192
wolfSSL 13:f67a6c6013ca 352 static const byte dh_ffdhe8192_p[] = {
wolfSSL 13:f67a6c6013ca 353 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
wolfSSL 13:f67a6c6013ca 354 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A,
wolfSSL 13:f67a6c6013ca 355 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
wolfSSL 13:f67a6c6013ca 356 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95,
wolfSSL 13:f67a6c6013ca 357 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB,
wolfSSL 13:f67a6c6013ca 358 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
wolfSSL 13:f67a6c6013ca 359 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8,
wolfSSL 13:f67a6c6013ca 360 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A,
wolfSSL 13:f67a6c6013ca 361 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
wolfSSL 13:f67a6c6013ca 362 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0,
wolfSSL 13:f67a6c6013ca 363 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3,
wolfSSL 13:f67a6c6013ca 364 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
wolfSSL 13:f67a6c6013ca 365 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77,
wolfSSL 13:f67a6c6013ca 366 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72,
wolfSSL 13:f67a6c6013ca 367 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
wolfSSL 13:f67a6c6013ca 368 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A,
wolfSSL 13:f67a6c6013ca 369 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61,
wolfSSL 13:f67a6c6013ca 370 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
wolfSSL 13:f67a6c6013ca 371 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68,
wolfSSL 13:f67a6c6013ca 372 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4,
wolfSSL 13:f67a6c6013ca 373 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
wolfSSL 13:f67a6c6013ca 374 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70,
wolfSSL 13:f67a6c6013ca 375 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC,
wolfSSL 13:f67a6c6013ca 376 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
wolfSSL 13:f67a6c6013ca 377 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF,
wolfSSL 13:f67a6c6013ca 378 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83,
wolfSSL 13:f67a6c6013ca 379 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
wolfSSL 13:f67a6c6013ca 380 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05,
wolfSSL 13:f67a6c6013ca 381 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2,
wolfSSL 13:f67a6c6013ca 382 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
wolfSSL 13:f67a6c6013ca 383 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC,
wolfSSL 13:f67a6c6013ca 384 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B,
wolfSSL 13:f67a6c6013ca 385 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
wolfSSL 13:f67a6c6013ca 386 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07,
wolfSSL 13:f67a6c6013ca 387 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE,
wolfSSL 13:f67a6c6013ca 388 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
wolfSSL 13:f67a6c6013ca 389 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70,
wolfSSL 13:f67a6c6013ca 390 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44,
wolfSSL 13:f67a6c6013ca 391 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
wolfSSL 13:f67a6c6013ca 392 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF,
wolfSSL 13:f67a6c6013ca 393 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E,
wolfSSL 13:f67a6c6013ca 394 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
wolfSSL 13:f67a6c6013ca 395 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA,
wolfSSL 13:f67a6c6013ca 396 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E,
wolfSSL 13:f67a6c6013ca 397 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
wolfSSL 13:f67a6c6013ca 398 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C,
wolfSSL 13:f67a6c6013ca 399 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1,
wolfSSL 13:f67a6c6013ca 400 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
wolfSSL 13:f67a6c6013ca 401 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6,
wolfSSL 13:f67a6c6013ca 402 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18,
wolfSSL 13:f67a6c6013ca 403 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
wolfSSL 13:f67a6c6013ca 404 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A,
wolfSSL 13:f67a6c6013ca 405 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A,
wolfSSL 13:f67a6c6013ca 406 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
wolfSSL 13:f67a6c6013ca 407 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4,
wolfSSL 13:f67a6c6013ca 408 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38,
wolfSSL 13:f67a6c6013ca 409 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
wolfSSL 13:f67a6c6013ca 410 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C,
wolfSSL 13:f67a6c6013ca 411 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC,
wolfSSL 13:f67a6c6013ca 412 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
wolfSSL 13:f67a6c6013ca 413 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B,
wolfSSL 13:f67a6c6013ca 414 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1,
wolfSSL 13:f67a6c6013ca 415 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02,
wolfSSL 13:f67a6c6013ca 416 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A,
wolfSSL 13:f67a6c6013ca 417 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A,
wolfSSL 13:f67a6c6013ca 418 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6,
wolfSSL 13:f67a6c6013ca 419 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8,
wolfSSL 13:f67a6c6013ca 420 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C,
wolfSSL 13:f67a6c6013ca 421 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A,
wolfSSL 13:f67a6c6013ca 422 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71,
wolfSSL 13:f67a6c6013ca 423 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F,
wolfSSL 13:f67a6c6013ca 424 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77,
wolfSSL 13:f67a6c6013ca 425 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10,
wolfSSL 13:f67a6c6013ca 426 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8,
wolfSSL 13:f67a6c6013ca 427 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3,
wolfSSL 13:f67a6c6013ca 428 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E,
wolfSSL 13:f67a6c6013ca 429 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3,
wolfSSL 13:f67a6c6013ca 430 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4,
wolfSSL 13:f67a6c6013ca 431 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1,
wolfSSL 13:f67a6c6013ca 432 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92,
wolfSSL 13:f67a6c6013ca 433 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6,
wolfSSL 13:f67a6c6013ca 434 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82,
wolfSSL 13:f67a6c6013ca 435 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE,
wolfSSL 13:f67a6c6013ca 436 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C,
wolfSSL 13:f67a6c6013ca 437 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E,
wolfSSL 13:f67a6c6013ca 438 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46,
wolfSSL 13:f67a6c6013ca 439 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A,
wolfSSL 13:f67a6c6013ca 440 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17,
wolfSSL 13:f67a6c6013ca 441 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03,
wolfSSL 13:f67a6c6013ca 442 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04,
wolfSSL 13:f67a6c6013ca 443 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6,
wolfSSL 13:f67a6c6013ca 444 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69,
wolfSSL 13:f67a6c6013ca 445 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1,
wolfSSL 13:f67a6c6013ca 446 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4,
wolfSSL 13:f67a6c6013ca 447 0xA4, 0x0E, 0x32, 0x9C, 0xCF, 0xF4, 0x6A, 0xAA,
wolfSSL 13:f67a6c6013ca 448 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38,
wolfSSL 13:f67a6c6013ca 449 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64,
wolfSSL 13:f67a6c6013ca 450 0xFD, 0xB2, 0x3F, 0xCE, 0xC9, 0x50, 0x9D, 0x43,
wolfSSL 13:f67a6c6013ca 451 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E,
wolfSSL 13:f67a6c6013ca 452 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF,
wolfSSL 13:f67a6c6013ca 453 0x86, 0xB6, 0x31, 0x42, 0xA3, 0xAB, 0x88, 0x29,
wolfSSL 13:f67a6c6013ca 454 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65,
wolfSSL 13:f67a6c6013ca 455 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02,
wolfSSL 13:f67a6c6013ca 456 0x29, 0x38, 0x88, 0x39, 0xD2, 0xAF, 0x05, 0xE4,
wolfSSL 13:f67a6c6013ca 457 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82,
wolfSSL 13:f67a6c6013ca 458 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C,
wolfSSL 13:f67a6c6013ca 459 0x59, 0x16, 0x0C, 0xC0, 0x46, 0xFD, 0x82, 0x51,
wolfSSL 13:f67a6c6013ca 460 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22,
wolfSSL 13:f67a6c6013ca 461 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74,
wolfSSL 13:f67a6c6013ca 462 0x51, 0xA8, 0xA9, 0x31, 0x09, 0x70, 0x3F, 0xEE,
wolfSSL 13:f67a6c6013ca 463 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C,
wolfSSL 13:f67a6c6013ca 464 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC,
wolfSSL 13:f67a6c6013ca 465 0x99, 0xE9, 0xE3, 0x16, 0x50, 0xC1, 0x21, 0x7B,
wolfSSL 13:f67a6c6013ca 466 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9,
wolfSSL 13:f67a6c6013ca 467 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0,
wolfSSL 13:f67a6c6013ca 468 0xA1, 0xFE, 0x30, 0x75, 0xA5, 0x77, 0xE2, 0x31,
wolfSSL 13:f67a6c6013ca 469 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57,
wolfSSL 13:f67a6c6013ca 470 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8,
wolfSSL 13:f67a6c6013ca 471 0xB6, 0x85, 0x5D, 0xFE, 0x72, 0xB0, 0xA6, 0x6E,
wolfSSL 13:f67a6c6013ca 472 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30,
wolfSSL 13:f67a6c6013ca 473 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E,
wolfSSL 13:f67a6c6013ca 474 0x2F, 0x74, 0x1E, 0xF8, 0xC1, 0xFE, 0x86, 0xFE,
wolfSSL 13:f67a6c6013ca 475 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D,
wolfSSL 13:f67a6c6013ca 476 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D,
wolfSSL 13:f67a6c6013ca 477 0x08, 0x22, 0xE5, 0x06, 0xA9, 0xF4, 0x61, 0x4E,
wolfSSL 13:f67a6c6013ca 478 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C,
wolfSSL 13:f67a6c6013ca 479 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C,
wolfSSL 13:f67a6c6013ca 480 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
wolfSSL 13:f67a6c6013ca 481 };
wolfSSL 13:f67a6c6013ca 482 static const byte dh_ffdhe8192_g[] = { 0x02 };
wolfSSL 13:f67a6c6013ca 483
wolfSSL 13:f67a6c6013ca 484 const DhParams* wc_Dh_ffdhe8192_Get(void)
wolfSSL 13:f67a6c6013ca 485 {
wolfSSL 13:f67a6c6013ca 486 static const DhParams ffdhe8192 = {
wolfSSL 13:f67a6c6013ca 487 dh_ffdhe8192_p, sizeof(dh_ffdhe8192_p),
wolfSSL 13:f67a6c6013ca 488 dh_ffdhe8192_g, sizeof(dh_ffdhe8192_g)
wolfSSL 13:f67a6c6013ca 489 };
wolfSSL 13:f67a6c6013ca 490 return &ffdhe8192;
wolfSSL 13:f67a6c6013ca 491 }
wolfSSL 13:f67a6c6013ca 492 #endif
wolfSSL 13:f67a6c6013ca 493
wolfSSL 13:f67a6c6013ca 494 int wc_InitDhKey_ex(DhKey* key, void* heap, int devId)
wolfSSL 13:f67a6c6013ca 495 {
wolfSSL 13:f67a6c6013ca 496 int ret = 0;
wolfSSL 13:f67a6c6013ca 497
wolfSSL 13:f67a6c6013ca 498 if (key == NULL)
wolfSSL 13:f67a6c6013ca 499 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 500
wolfSSL 13:f67a6c6013ca 501 key->heap = heap; /* for XMALLOC/XFREE in future */
wolfSSL 13:f67a6c6013ca 502
wolfSSL 13:f67a6c6013ca 503 if (mp_init_multi(&key->p, &key->g, NULL, NULL, NULL, NULL) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 504 return MEMORY_E;
wolfSSL 13:f67a6c6013ca 505
wolfSSL 13:f67a6c6013ca 506 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 507 /* handle as async */
wolfSSL 13:f67a6c6013ca 508 ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_DH,
wolfSSL 13:f67a6c6013ca 509 key->heap, devId);
wolfSSL 13:f67a6c6013ca 510 #else
wolfSSL 13:f67a6c6013ca 511 (void)devId;
wolfSSL 13:f67a6c6013ca 512 #endif
wolfSSL 13:f67a6c6013ca 513
wolfSSL 13:f67a6c6013ca 514 return ret;
wolfSSL 13:f67a6c6013ca 515 }
wolfSSL 13:f67a6c6013ca 516
wolfSSL 13:f67a6c6013ca 517 int wc_InitDhKey(DhKey* key)
wolfSSL 13:f67a6c6013ca 518 {
wolfSSL 13:f67a6c6013ca 519 return wc_InitDhKey_ex(key, NULL, INVALID_DEVID);
wolfSSL 13:f67a6c6013ca 520 }
wolfSSL 13:f67a6c6013ca 521
wolfSSL 13:f67a6c6013ca 522
wolfSSL 13:f67a6c6013ca 523 void wc_FreeDhKey(DhKey* key)
wolfSSL 13:f67a6c6013ca 524 {
wolfSSL 13:f67a6c6013ca 525 if (key) {
wolfSSL 13:f67a6c6013ca 526 mp_clear(&key->p);
wolfSSL 13:f67a6c6013ca 527 mp_clear(&key->g);
wolfSSL 13:f67a6c6013ca 528
wolfSSL 13:f67a6c6013ca 529 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 530 wolfAsync_DevCtxFree(&key->asyncDev, WOLFSSL_ASYNC_MARKER_DH);
wolfSSL 13:f67a6c6013ca 531 #endif
wolfSSL 13:f67a6c6013ca 532 }
wolfSSL 13:f67a6c6013ca 533 }
wolfSSL 13:f67a6c6013ca 534
wolfSSL 13:f67a6c6013ca 535
wolfSSL 13:f67a6c6013ca 536 /* if defined to not use floating point values do not compile in */
wolfSSL 13:f67a6c6013ca 537 #ifndef WOLFSSL_DH_CONST
wolfSSL 13:f67a6c6013ca 538 static word32 DiscreteLogWorkFactor(word32 n)
wolfSSL 13:f67a6c6013ca 539 {
wolfSSL 13:f67a6c6013ca 540 /* assuming discrete log takes about the same time as factoring */
wolfSSL 13:f67a6c6013ca 541 if (n < 5)
wolfSSL 13:f67a6c6013ca 542 return 0;
wolfSSL 13:f67a6c6013ca 543 else
wolfSSL 13:f67a6c6013ca 544 return (word32)(2.4 * XPOW((double)n, 1.0/3.0) *
wolfSSL 13:f67a6c6013ca 545 XPOW(XLOG((double)n), 2.0/3.0) - 5);
wolfSSL 13:f67a6c6013ca 546 }
wolfSSL 13:f67a6c6013ca 547 #endif /* WOLFSSL_DH_CONST*/
wolfSSL 13:f67a6c6013ca 548
wolfSSL 13:f67a6c6013ca 549
wolfSSL 13:f67a6c6013ca 550 /* if not using fixed points use DiscreteLogWorkFactor function for unsual size
wolfSSL 13:f67a6c6013ca 551 otherwise round up on size needed */
wolfSSL 13:f67a6c6013ca 552 #ifndef WOLFSSL_DH_CONST
wolfSSL 13:f67a6c6013ca 553 #define WOLFSSL_DH_ROUND(x)
wolfSSL 13:f67a6c6013ca 554 #else
wolfSSL 13:f67a6c6013ca 555 #define WOLFSSL_DH_ROUND(x) \
wolfSSL 13:f67a6c6013ca 556 do { \
wolfSSL 13:f67a6c6013ca 557 if (x % 128) { \
wolfSSL 13:f67a6c6013ca 558 x &= 0xffffff80;\
wolfSSL 13:f67a6c6013ca 559 x += 128; \
wolfSSL 13:f67a6c6013ca 560 } \
wolfSSL 13:f67a6c6013ca 561 } \
wolfSSL 13:f67a6c6013ca 562 while (0)
wolfSSL 13:f67a6c6013ca 563 #endif
wolfSSL 13:f67a6c6013ca 564
wolfSSL 13:f67a6c6013ca 565
wolfSSL 13:f67a6c6013ca 566 static int GeneratePrivateDh(DhKey* key, WC_RNG* rng, byte* priv, word32* privSz)
wolfSSL 13:f67a6c6013ca 567 {
wolfSSL 13:f67a6c6013ca 568 int ret = 0;
wolfSSL 13:f67a6c6013ca 569 word32 sz = mp_unsigned_bin_size(&key->p);
wolfSSL 13:f67a6c6013ca 570
wolfSSL 13:f67a6c6013ca 571 /* Table of predetermined values from the operation
wolfSSL 13:f67a6c6013ca 572 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) / WOLFSSL_BIT_SIZE + 1
wolfSSL 13:f67a6c6013ca 573 Sizes in table checked against RFC 3526
wolfSSL 13:f67a6c6013ca 574 */
wolfSSL 13:f67a6c6013ca 575 WOLFSSL_DH_ROUND(sz); /* if using fixed points only, then round up */
wolfSSL 13:f67a6c6013ca 576 switch (sz) {
wolfSSL 13:f67a6c6013ca 577 case 128: sz = 21; break;
wolfSSL 13:f67a6c6013ca 578 case 256: sz = 29; break;
wolfSSL 13:f67a6c6013ca 579 case 384: sz = 34; break;
wolfSSL 13:f67a6c6013ca 580 case 512: sz = 39; break;
wolfSSL 13:f67a6c6013ca 581 case 640: sz = 42; break;
wolfSSL 13:f67a6c6013ca 582 case 768: sz = 46; break;
wolfSSL 13:f67a6c6013ca 583 case 896: sz = 49; break;
wolfSSL 13:f67a6c6013ca 584 case 1024: sz = 52; break;
wolfSSL 13:f67a6c6013ca 585 default:
wolfSSL 13:f67a6c6013ca 586 #ifndef WOLFSSL_DH_CONST
wolfSSL 13:f67a6c6013ca 587 /* if using floating points and size of p is not in table */
wolfSSL 13:f67a6c6013ca 588 sz = min(sz, 2 * DiscreteLogWorkFactor(sz * WOLFSSL_BIT_SIZE) /
wolfSSL 13:f67a6c6013ca 589 WOLFSSL_BIT_SIZE + 1);
wolfSSL 13:f67a6c6013ca 590 break;
wolfSSL 13:f67a6c6013ca 591 #else
wolfSSL 13:f67a6c6013ca 592 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 593 #endif
wolfSSL 13:f67a6c6013ca 594 }
wolfSSL 13:f67a6c6013ca 595
wolfSSL 13:f67a6c6013ca 596 ret = wc_RNG_GenerateBlock(rng, priv, sz);
wolfSSL 13:f67a6c6013ca 597
wolfSSL 13:f67a6c6013ca 598 if (ret == 0) {
wolfSSL 13:f67a6c6013ca 599 priv[0] |= 0x0C;
wolfSSL 13:f67a6c6013ca 600 *privSz = sz;
wolfSSL 13:f67a6c6013ca 601 }
wolfSSL 13:f67a6c6013ca 602
wolfSSL 13:f67a6c6013ca 603 return ret;
wolfSSL 13:f67a6c6013ca 604 }
wolfSSL 13:f67a6c6013ca 605
wolfSSL 13:f67a6c6013ca 606
wolfSSL 13:f67a6c6013ca 607 static int GeneratePublicDh(DhKey* key, byte* priv, word32 privSz,
wolfSSL 13:f67a6c6013ca 608 byte* pub, word32* pubSz)
wolfSSL 13:f67a6c6013ca 609 {
wolfSSL 13:f67a6c6013ca 610 int ret = 0;
wolfSSL 13:f67a6c6013ca 611 mp_int x;
wolfSSL 13:f67a6c6013ca 612 mp_int y;
wolfSSL 13:f67a6c6013ca 613
wolfSSL 13:f67a6c6013ca 614 if (mp_init_multi(&x, &y, 0, 0, 0, 0) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 615 return MP_INIT_E;
wolfSSL 13:f67a6c6013ca 616
wolfSSL 13:f67a6c6013ca 617 if (mp_read_unsigned_bin(&x, priv, privSz) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 618 ret = MP_READ_E;
wolfSSL 13:f67a6c6013ca 619
wolfSSL 13:f67a6c6013ca 620 if (ret == 0 && mp_exptmod(&key->g, &x, &key->p, &y) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 621 ret = MP_EXPTMOD_E;
wolfSSL 13:f67a6c6013ca 622
wolfSSL 13:f67a6c6013ca 623 if (ret == 0 && mp_to_unsigned_bin(&y, pub) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 624 ret = MP_TO_E;
wolfSSL 13:f67a6c6013ca 625
wolfSSL 13:f67a6c6013ca 626 if (ret == 0)
wolfSSL 13:f67a6c6013ca 627 *pubSz = mp_unsigned_bin_size(&y);
wolfSSL 13:f67a6c6013ca 628
wolfSSL 13:f67a6c6013ca 629 mp_clear(&y);
wolfSSL 13:f67a6c6013ca 630 mp_clear(&x);
wolfSSL 13:f67a6c6013ca 631
wolfSSL 13:f67a6c6013ca 632 return ret;
wolfSSL 13:f67a6c6013ca 633 }
wolfSSL 13:f67a6c6013ca 634
wolfSSL 13:f67a6c6013ca 635 static int wc_DhGenerateKeyPair_Sync(DhKey* key, WC_RNG* rng,
wolfSSL 13:f67a6c6013ca 636 byte* priv, word32* privSz, byte* pub, word32* pubSz)
wolfSSL 13:f67a6c6013ca 637 {
wolfSSL 13:f67a6c6013ca 638 int ret;
wolfSSL 13:f67a6c6013ca 639
wolfSSL 13:f67a6c6013ca 640 if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
wolfSSL 13:f67a6c6013ca 641 pub == NULL || pubSz == NULL) {
wolfSSL 13:f67a6c6013ca 642 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 643 }
wolfSSL 13:f67a6c6013ca 644
wolfSSL 13:f67a6c6013ca 645 ret = GeneratePrivateDh(key, rng, priv, privSz);
wolfSSL 13:f67a6c6013ca 646
wolfSSL 13:f67a6c6013ca 647 return (ret != 0) ? ret : GeneratePublicDh(key, priv, *privSz, pub, pubSz);
wolfSSL 13:f67a6c6013ca 648 }
wolfSSL 13:f67a6c6013ca 649
wolfSSL 13:f67a6c6013ca 650 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 651 static int wc_DhGenerateKeyPair_Async(DhKey* key, WC_RNG* rng,
wolfSSL 13:f67a6c6013ca 652 byte* priv, word32* privSz, byte* pub, word32* pubSz)
wolfSSL 13:f67a6c6013ca 653 {
wolfSSL 13:f67a6c6013ca 654 int ret;
wolfSSL 13:f67a6c6013ca 655
wolfSSL 13:f67a6c6013ca 656 #if defined(HAVE_INTEL_QA)
wolfSSL 13:f67a6c6013ca 657 word32 sz;
wolfSSL 13:f67a6c6013ca 658
wolfSSL 13:f67a6c6013ca 659 /* verify prime is at least 768-bits */
wolfSSL 13:f67a6c6013ca 660 /* QAT HW must have prime at least 768-bits */
wolfSSL 13:f67a6c6013ca 661 sz = mp_unsigned_bin_size(&key->p);
wolfSSL 13:f67a6c6013ca 662 if (sz >= (768/8)) {
wolfSSL 13:f67a6c6013ca 663 mp_int x;
wolfSSL 13:f67a6c6013ca 664
wolfSSL 13:f67a6c6013ca 665 ret = mp_init(&x);
wolfSSL 13:f67a6c6013ca 666 if (ret != MP_OKAY)
wolfSSL 13:f67a6c6013ca 667 return ret;
wolfSSL 13:f67a6c6013ca 668
wolfSSL 13:f67a6c6013ca 669 ret = GeneratePrivateDh(key, rng, priv, privSz);
wolfSSL 13:f67a6c6013ca 670 if (ret == 0)
wolfSSL 13:f67a6c6013ca 671 ret = mp_read_unsigned_bin(&x, priv, *privSz);
wolfSSL 13:f67a6c6013ca 672 if (ret == MP_OKAY)
wolfSSL 13:f67a6c6013ca 673 ret = wc_mp_to_bigint(&x, &x.raw);
wolfSSL 13:f67a6c6013ca 674 if (ret == MP_OKAY)
wolfSSL 13:f67a6c6013ca 675 ret = wc_mp_to_bigint(&key->p, &key->p.raw);
wolfSSL 13:f67a6c6013ca 676 if (ret == MP_OKAY)
wolfSSL 13:f67a6c6013ca 677 ret = wc_mp_to_bigint(&key->g, &key->g.raw);
wolfSSL 13:f67a6c6013ca 678 if (ret == MP_OKAY)
wolfSSL 13:f67a6c6013ca 679 ret = IntelQaDhKeyGen(&key->asyncDev, &key->p.raw, &key->g.raw,
wolfSSL 13:f67a6c6013ca 680 &x.raw, pub, pubSz);
wolfSSL 13:f67a6c6013ca 681 mp_clear(&x);
wolfSSL 13:f67a6c6013ca 682
wolfSSL 13:f67a6c6013ca 683 return ret;
wolfSSL 13:f67a6c6013ca 684 }
wolfSSL 13:f67a6c6013ca 685
wolfSSL 13:f67a6c6013ca 686 #elif defined(HAVE_CAVIUM)
wolfSSL 13:f67a6c6013ca 687 /* TODO: Not implemented - use software for now */
wolfSSL 13:f67a6c6013ca 688
wolfSSL 13:f67a6c6013ca 689 #else /* WOLFSSL_ASYNC_CRYPT_TEST */
wolfSSL 13:f67a6c6013ca 690 WC_ASYNC_TEST* testDev = &key->asyncDev.test;
wolfSSL 13:f67a6c6013ca 691 if (testDev->type == ASYNC_TEST_NONE) {
wolfSSL 13:f67a6c6013ca 692 testDev->type = ASYNC_TEST_DH_GEN;
wolfSSL 13:f67a6c6013ca 693 testDev->dhGen.key = key;
wolfSSL 13:f67a6c6013ca 694 testDev->dhGen.rng = rng;
wolfSSL 13:f67a6c6013ca 695 testDev->dhGen.priv = priv;
wolfSSL 13:f67a6c6013ca 696 testDev->dhGen.privSz = privSz;
wolfSSL 13:f67a6c6013ca 697 testDev->dhGen.pub = pub;
wolfSSL 13:f67a6c6013ca 698 testDev->dhGen.pubSz = pubSz;
wolfSSL 13:f67a6c6013ca 699 return WC_PENDING_E;
wolfSSL 13:f67a6c6013ca 700 }
wolfSSL 13:f67a6c6013ca 701 #endif
wolfSSL 13:f67a6c6013ca 702
wolfSSL 13:f67a6c6013ca 703 /* otherwise use software DH */
wolfSSL 13:f67a6c6013ca 704 ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
wolfSSL 13:f67a6c6013ca 705
wolfSSL 13:f67a6c6013ca 706 return ret;
wolfSSL 13:f67a6c6013ca 707 }
wolfSSL 13:f67a6c6013ca 708 #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_DH */
wolfSSL 13:f67a6c6013ca 709
wolfSSL 13:f67a6c6013ca 710
wolfSSL 13:f67a6c6013ca 711 /* Check DH Public Key for invalid numbers
wolfSSL 13:f67a6c6013ca 712 *
wolfSSL 13:f67a6c6013ca 713 * key DH key group parameters.
wolfSSL 13:f67a6c6013ca 714 * pub Public Key.
wolfSSL 13:f67a6c6013ca 715 * pubSz Public Key size.
wolfSSL 13:f67a6c6013ca 716 *
wolfSSL 13:f67a6c6013ca 717 * returns 0 on success or error code
wolfSSL 13:f67a6c6013ca 718 */
wolfSSL 13:f67a6c6013ca 719 int wc_DhCheckPubKey(DhKey* key, const byte* pub, word32 pubSz)
wolfSSL 13:f67a6c6013ca 720 {
wolfSSL 13:f67a6c6013ca 721 int ret = 0;
wolfSSL 13:f67a6c6013ca 722
wolfSSL 13:f67a6c6013ca 723 mp_int x;
wolfSSL 13:f67a6c6013ca 724 mp_int y;
wolfSSL 13:f67a6c6013ca 725
wolfSSL 13:f67a6c6013ca 726 if (key == NULL || pub == NULL) {
wolfSSL 13:f67a6c6013ca 727 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 728 }
wolfSSL 13:f67a6c6013ca 729
wolfSSL 13:f67a6c6013ca 730 if (mp_init_multi(&x, &y, NULL, NULL, NULL, NULL) != MP_OKAY) {
wolfSSL 13:f67a6c6013ca 731 return MP_INIT_E;
wolfSSL 13:f67a6c6013ca 732 }
wolfSSL 13:f67a6c6013ca 733
wolfSSL 13:f67a6c6013ca 734 if (mp_read_unsigned_bin(&x, pub, pubSz) != MP_OKAY) {
wolfSSL 13:f67a6c6013ca 735 ret = MP_READ_E;
wolfSSL 13:f67a6c6013ca 736 }
wolfSSL 13:f67a6c6013ca 737
wolfSSL 13:f67a6c6013ca 738 /* pub should not be 0 or 1 */
wolfSSL 13:f67a6c6013ca 739 if (ret == 0 && mp_cmp_d(&x, 2) == MP_LT) {
wolfSSL 13:f67a6c6013ca 740 ret = MP_CMP_E;
wolfSSL 13:f67a6c6013ca 741 }
wolfSSL 13:f67a6c6013ca 742
wolfSSL 13:f67a6c6013ca 743 /* pub shouldn't be greater than or equal to p - 1 */
wolfSSL 13:f67a6c6013ca 744 if (ret == 0 && mp_copy(&key->p, &y) != MP_OKAY) {
wolfSSL 13:f67a6c6013ca 745 ret = MP_INIT_E;
wolfSSL 13:f67a6c6013ca 746 }
wolfSSL 13:f67a6c6013ca 747 if (ret == 0 && mp_sub_d(&y, 2, &y) != MP_OKAY) {
wolfSSL 13:f67a6c6013ca 748 ret = MP_SUB_E;
wolfSSL 13:f67a6c6013ca 749 }
wolfSSL 13:f67a6c6013ca 750 if (ret == 0 && mp_cmp(&x, &y) == MP_GT) {
wolfSSL 13:f67a6c6013ca 751 ret = MP_CMP_E;
wolfSSL 13:f67a6c6013ca 752 }
wolfSSL 13:f67a6c6013ca 753
wolfSSL 13:f67a6c6013ca 754 mp_clear(&y);
wolfSSL 13:f67a6c6013ca 755 mp_clear(&x);
wolfSSL 13:f67a6c6013ca 756
wolfSSL 13:f67a6c6013ca 757 return ret;
wolfSSL 13:f67a6c6013ca 758 }
wolfSSL 13:f67a6c6013ca 759
wolfSSL 13:f67a6c6013ca 760
wolfSSL 13:f67a6c6013ca 761 int wc_DhGenerateKeyPair(DhKey* key, WC_RNG* rng,
wolfSSL 13:f67a6c6013ca 762 byte* priv, word32* privSz, byte* pub, word32* pubSz)
wolfSSL 13:f67a6c6013ca 763 {
wolfSSL 13:f67a6c6013ca 764 int ret;
wolfSSL 13:f67a6c6013ca 765
wolfSSL 13:f67a6c6013ca 766 if (key == NULL || rng == NULL || priv == NULL || privSz == NULL ||
wolfSSL 13:f67a6c6013ca 767 pub == NULL || pubSz == NULL) {
wolfSSL 13:f67a6c6013ca 768 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 769 }
wolfSSL 13:f67a6c6013ca 770
wolfSSL 13:f67a6c6013ca 771 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 772 if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
wolfSSL 13:f67a6c6013ca 773 ret = wc_DhGenerateKeyPair_Async(key, rng, priv, privSz, pub, pubSz);
wolfSSL 13:f67a6c6013ca 774 }
wolfSSL 13:f67a6c6013ca 775 else
wolfSSL 13:f67a6c6013ca 776 #endif
wolfSSL 13:f67a6c6013ca 777 {
wolfSSL 13:f67a6c6013ca 778 ret = wc_DhGenerateKeyPair_Sync(key, rng, priv, privSz, pub, pubSz);
wolfSSL 13:f67a6c6013ca 779 }
wolfSSL 13:f67a6c6013ca 780
wolfSSL 13:f67a6c6013ca 781 return ret;
wolfSSL 13:f67a6c6013ca 782 }
wolfSSL 13:f67a6c6013ca 783
wolfSSL 13:f67a6c6013ca 784
wolfSSL 13:f67a6c6013ca 785 static int wc_DhAgree_Sync(DhKey* key, byte* agree, word32* agreeSz,
wolfSSL 13:f67a6c6013ca 786 const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
wolfSSL 13:f67a6c6013ca 787 {
wolfSSL 13:f67a6c6013ca 788 int ret = 0;
wolfSSL 13:f67a6c6013ca 789 mp_int x;
wolfSSL 13:f67a6c6013ca 790 mp_int y;
wolfSSL 13:f67a6c6013ca 791 mp_int z;
wolfSSL 13:f67a6c6013ca 792
wolfSSL 13:f67a6c6013ca 793 if (wc_DhCheckPubKey(key, otherPub, pubSz) != 0) {
wolfSSL 13:f67a6c6013ca 794 WOLFSSL_MSG("wc_DhAgree wc_DhCheckPubKey failed");
wolfSSL 13:f67a6c6013ca 795 return DH_CHECK_PUB_E;
wolfSSL 13:f67a6c6013ca 796 }
wolfSSL 13:f67a6c6013ca 797
wolfSSL 13:f67a6c6013ca 798 if (mp_init_multi(&x, &y, &z, 0, 0, 0) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 799 return MP_INIT_E;
wolfSSL 13:f67a6c6013ca 800
wolfSSL 13:f67a6c6013ca 801 if (mp_read_unsigned_bin(&x, priv, privSz) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 802 ret = MP_READ_E;
wolfSSL 13:f67a6c6013ca 803
wolfSSL 13:f67a6c6013ca 804 if (ret == 0 && mp_read_unsigned_bin(&y, otherPub, pubSz) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 805 ret = MP_READ_E;
wolfSSL 13:f67a6c6013ca 806
wolfSSL 13:f67a6c6013ca 807 if (ret == 0 && mp_exptmod(&y, &x, &key->p, &z) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 808 ret = MP_EXPTMOD_E;
wolfSSL 13:f67a6c6013ca 809
wolfSSL 13:f67a6c6013ca 810 if (ret == 0 && mp_to_unsigned_bin(&z, agree) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 811 ret = MP_TO_E;
wolfSSL 13:f67a6c6013ca 812
wolfSSL 13:f67a6c6013ca 813 if (ret == 0)
wolfSSL 13:f67a6c6013ca 814 *agreeSz = mp_unsigned_bin_size(&z);
wolfSSL 13:f67a6c6013ca 815
wolfSSL 13:f67a6c6013ca 816 mp_clear(&z);
wolfSSL 13:f67a6c6013ca 817 mp_clear(&y);
wolfSSL 13:f67a6c6013ca 818 mp_forcezero(&x);
wolfSSL 13:f67a6c6013ca 819
wolfSSL 13:f67a6c6013ca 820 return ret;
wolfSSL 13:f67a6c6013ca 821 }
wolfSSL 13:f67a6c6013ca 822
wolfSSL 13:f67a6c6013ca 823 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 824 static int wc_DhAgree_Async(DhKey* key, byte* agree, word32* agreeSz,
wolfSSL 13:f67a6c6013ca 825 const byte* priv, word32 privSz, const byte* otherPub, word32 pubSz)
wolfSSL 13:f67a6c6013ca 826 {
wolfSSL 13:f67a6c6013ca 827 int ret;
wolfSSL 13:f67a6c6013ca 828
wolfSSL 13:f67a6c6013ca 829 #ifdef HAVE_CAVIUM
wolfSSL 13:f67a6c6013ca 830 /* TODO: Not implemented - use software for now */
wolfSSL 13:f67a6c6013ca 831 ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
wolfSSL 13:f67a6c6013ca 832
wolfSSL 13:f67a6c6013ca 833 #elif defined(HAVE_INTEL_QA)
wolfSSL 13:f67a6c6013ca 834 ret = wc_mp_to_bigint(&key->p, &key->p.raw);
wolfSSL 13:f67a6c6013ca 835 if (ret == MP_OKAY)
wolfSSL 13:f67a6c6013ca 836 ret = IntelQaDhAgree(&key->asyncDev, &key->p.raw,
wolfSSL 13:f67a6c6013ca 837 agree, agreeSz, priv, privSz, otherPub, pubSz);
wolfSSL 13:f67a6c6013ca 838 #else /* WOLFSSL_ASYNC_CRYPT_TEST */
wolfSSL 13:f67a6c6013ca 839 WC_ASYNC_TEST* testDev = &key->asyncDev.test;
wolfSSL 13:f67a6c6013ca 840 if (testDev->type == ASYNC_TEST_NONE) {
wolfSSL 13:f67a6c6013ca 841 testDev->type = ASYNC_TEST_DH_AGREE;
wolfSSL 13:f67a6c6013ca 842 testDev->dhAgree.key = key;
wolfSSL 13:f67a6c6013ca 843 testDev->dhAgree.agree = agree;
wolfSSL 13:f67a6c6013ca 844 testDev->dhAgree.agreeSz = agreeSz;
wolfSSL 13:f67a6c6013ca 845 testDev->dhAgree.priv = priv;
wolfSSL 13:f67a6c6013ca 846 testDev->dhAgree.privSz = privSz;
wolfSSL 13:f67a6c6013ca 847 testDev->dhAgree.otherPub = otherPub;
wolfSSL 13:f67a6c6013ca 848 testDev->dhAgree.pubSz = pubSz;
wolfSSL 13:f67a6c6013ca 849 return WC_PENDING_E;
wolfSSL 13:f67a6c6013ca 850 }
wolfSSL 13:f67a6c6013ca 851 ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
wolfSSL 13:f67a6c6013ca 852 #endif
wolfSSL 13:f67a6c6013ca 853
wolfSSL 13:f67a6c6013ca 854 return ret;
wolfSSL 13:f67a6c6013ca 855 }
wolfSSL 13:f67a6c6013ca 856 #endif /* WOLFSSL_ASYNC_CRYPT */
wolfSSL 13:f67a6c6013ca 857
wolfSSL 13:f67a6c6013ca 858 int wc_DhAgree(DhKey* key, byte* agree, word32* agreeSz, const byte* priv,
wolfSSL 13:f67a6c6013ca 859 word32 privSz, const byte* otherPub, word32 pubSz)
wolfSSL 13:f67a6c6013ca 860 {
wolfSSL 13:f67a6c6013ca 861 int ret = 0;
wolfSSL 13:f67a6c6013ca 862
wolfSSL 13:f67a6c6013ca 863 if (key == NULL || agree == NULL || agreeSz == NULL || priv == NULL ||
wolfSSL 13:f67a6c6013ca 864 otherPub == NULL) {
wolfSSL 13:f67a6c6013ca 865 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 866 }
wolfSSL 13:f67a6c6013ca 867
wolfSSL 13:f67a6c6013ca 868 #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_DH)
wolfSSL 13:f67a6c6013ca 869 if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_DH) {
wolfSSL 13:f67a6c6013ca 870 ret = wc_DhAgree_Async(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
wolfSSL 13:f67a6c6013ca 871 }
wolfSSL 13:f67a6c6013ca 872 else
wolfSSL 13:f67a6c6013ca 873 #endif
wolfSSL 13:f67a6c6013ca 874 {
wolfSSL 13:f67a6c6013ca 875 ret = wc_DhAgree_Sync(key, agree, agreeSz, priv, privSz, otherPub, pubSz);
wolfSSL 13:f67a6c6013ca 876 }
wolfSSL 13:f67a6c6013ca 877
wolfSSL 13:f67a6c6013ca 878 return ret;
wolfSSL 13:f67a6c6013ca 879 }
wolfSSL 13:f67a6c6013ca 880
wolfSSL 13:f67a6c6013ca 881
wolfSSL 13:f67a6c6013ca 882 /* not in asn anymore since no actual asn types used */
wolfSSL 13:f67a6c6013ca 883 int wc_DhSetKey(DhKey* key, const byte* p, word32 pSz, const byte* g,
wolfSSL 13:f67a6c6013ca 884 word32 gSz)
wolfSSL 13:f67a6c6013ca 885 {
wolfSSL 13:f67a6c6013ca 886 if (key == NULL || p == NULL || g == NULL || pSz == 0 || gSz == 0) {
wolfSSL 13:f67a6c6013ca 887 return BAD_FUNC_ARG;
wolfSSL 13:f67a6c6013ca 888 }
wolfSSL 13:f67a6c6013ca 889
wolfSSL 13:f67a6c6013ca 890 /* may have leading 0 */
wolfSSL 13:f67a6c6013ca 891 if (p[0] == 0) {
wolfSSL 13:f67a6c6013ca 892 pSz--; p++;
wolfSSL 13:f67a6c6013ca 893 }
wolfSSL 13:f67a6c6013ca 894
wolfSSL 13:f67a6c6013ca 895 if (g[0] == 0) {
wolfSSL 13:f67a6c6013ca 896 gSz--; g++;
wolfSSL 13:f67a6c6013ca 897 }
wolfSSL 13:f67a6c6013ca 898
wolfSSL 13:f67a6c6013ca 899 if (mp_init(&key->p) != MP_OKAY)
wolfSSL 13:f67a6c6013ca 900 return MP_INIT_E;
wolfSSL 13:f67a6c6013ca 901 if (mp_read_unsigned_bin(&key->p, p, pSz) != 0) {
wolfSSL 13:f67a6c6013ca 902 mp_clear(&key->p);
wolfSSL 13:f67a6c6013ca 903 return ASN_DH_KEY_E;
wolfSSL 13:f67a6c6013ca 904 }
wolfSSL 13:f67a6c6013ca 905
wolfSSL 13:f67a6c6013ca 906 if (mp_init(&key->g) != MP_OKAY) {
wolfSSL 13:f67a6c6013ca 907 mp_clear(&key->p);
wolfSSL 13:f67a6c6013ca 908 return MP_INIT_E;
wolfSSL 13:f67a6c6013ca 909 }
wolfSSL 13:f67a6c6013ca 910 if (mp_read_unsigned_bin(&key->g, g, gSz) != 0) {
wolfSSL 13:f67a6c6013ca 911 mp_clear(&key->g);
wolfSSL 13:f67a6c6013ca 912 mp_clear(&key->p);
wolfSSL 13:f67a6c6013ca 913 return ASN_DH_KEY_E;
wolfSSL 13:f67a6c6013ca 914 }
wolfSSL 13:f67a6c6013ca 915
wolfSSL 13:f67a6c6013ca 916 return 0;
wolfSSL 13:f67a6c6013ca 917 }
wolfSSL 13:f67a6c6013ca 918
wolfSSL 13:f67a6c6013ca 919 #endif /* NO_DH */
wolfSSL 13:f67a6c6013ca 920