wolfSSL SSL/TLS library, support up to TLS1.3
Embed:
(wiki syntax)
Show/hide line numbers
keys.c
00001 /* keys.c 00002 * 00003 * Copyright (C) 2006-2017 wolfSSL Inc. 00004 * 00005 * This file is part of wolfSSL. 00006 * 00007 * wolfSSL is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * wolfSSL is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 00020 */ 00021 00022 00023 /* Name change compatibility layer no longer needs to be included here */ 00024 00025 #ifdef HAVE_CONFIG_H 00026 #include <config.h> 00027 #endif 00028 00029 #include <wolfcrypt/settings.h> 00030 00031 #ifndef WOLFCRYPT_ONLY 00032 00033 #include <wolfssl/internal.h> 00034 #include <wolfssl/error-ssl.h> 00035 #if defined(SHOW_SECRETS) || defined(CHACHA_AEAD_TEST) 00036 #if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) 00037 #if MQX_USE_IO_OLD 00038 #include <fio.h> 00039 #else 00040 #include <nio.h> 00041 #endif 00042 #else 00043 #include <stdio.h> 00044 #endif 00045 #endif 00046 00047 00048 int SetCipherSpecs(WOLFSSL* ssl) 00049 { 00050 #ifndef NO_WOLFSSL_CLIENT 00051 if (ssl->options.side == WOLFSSL_CLIENT_END) { 00052 /* server side verified before SetCipherSpecs call */ 00053 if (VerifyClientSuite(ssl) != 1) { 00054 WOLFSSL_MSG("SetCipherSpecs() client has an unusuable suite"); 00055 return UNSUPPORTED_SUITE; 00056 } 00057 } 00058 #endif /* NO_WOLFSSL_CLIENT */ 00059 00060 /* Chacha extensions, 0xcc */ 00061 if (ssl->options.cipherSuite0 == CHACHA_BYTE) { 00062 00063 switch (ssl->options.cipherSuite) { 00064 #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 00065 case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256: 00066 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00067 ssl->specs.cipher_type = aead; 00068 ssl->specs.mac_algorithm = sha256_mac; 00069 ssl->specs.kea = ecc_diffie_hellman_kea; 00070 ssl->specs.sig_algo = rsa_sa_algo; 00071 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00072 ssl->specs.pad_size = PAD_SHA; 00073 ssl->specs.static_ecdh = 0; 00074 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00075 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00076 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00077 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00078 ssl->options.oldPoly = 1; /* use old poly1305 padding */ 00079 00080 break; 00081 #endif 00082 00083 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 00084 case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256: 00085 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00086 ssl->specs.cipher_type = aead; 00087 ssl->specs.mac_algorithm = sha256_mac; 00088 ssl->specs.kea = ecc_diffie_hellman_kea; 00089 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00090 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00091 ssl->specs.pad_size = PAD_SHA; 00092 ssl->specs.static_ecdh = 0; 00093 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00094 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00095 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00096 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00097 ssl->options.oldPoly = 1; /* use old poly1305 padding */ 00098 00099 break; 00100 #endif 00101 00102 #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 00103 case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256: 00104 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00105 ssl->specs.cipher_type = aead; 00106 ssl->specs.mac_algorithm = sha256_mac; 00107 ssl->specs.kea = diffie_hellman_kea; 00108 ssl->specs.sig_algo = rsa_sa_algo; 00109 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00110 ssl->specs.pad_size = PAD_SHA; 00111 ssl->specs.static_ecdh = 0; 00112 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00113 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00114 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00115 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00116 ssl->options.oldPoly = 1; /* use old poly1305 padding */ 00117 00118 break; 00119 #endif 00120 #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 00121 case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256: 00122 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00123 ssl->specs.cipher_type = aead; 00124 ssl->specs.mac_algorithm = sha256_mac; 00125 ssl->specs.kea = ecc_diffie_hellman_kea; 00126 ssl->specs.sig_algo = rsa_sa_algo; 00127 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00128 ssl->specs.pad_size = PAD_SHA; 00129 ssl->specs.static_ecdh = 0; 00130 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00131 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00132 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00133 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00134 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00135 00136 break; 00137 #endif 00138 00139 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 00140 case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256: 00141 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00142 ssl->specs.cipher_type = aead; 00143 ssl->specs.mac_algorithm = sha256_mac; 00144 ssl->specs.kea = ecc_diffie_hellman_kea; 00145 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00146 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00147 ssl->specs.pad_size = PAD_SHA; 00148 ssl->specs.static_ecdh = 0; 00149 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00150 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00151 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00152 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00153 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00154 00155 break; 00156 #endif 00157 00158 #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 00159 case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256: 00160 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00161 ssl->specs.cipher_type = aead; 00162 ssl->specs.mac_algorithm = sha256_mac; 00163 ssl->specs.kea = diffie_hellman_kea; 00164 ssl->specs.sig_algo = rsa_sa_algo; 00165 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00166 ssl->specs.pad_size = PAD_SHA; 00167 ssl->specs.static_ecdh = 0; 00168 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00169 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00170 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00171 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00172 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00173 00174 break; 00175 #endif 00176 00177 #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 00178 case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256: 00179 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00180 ssl->specs.cipher_type = aead; 00181 ssl->specs.mac_algorithm = sha256_mac; 00182 ssl->specs.kea = psk_kea; 00183 ssl->specs.sig_algo = anonymous_sa_algo; 00184 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00185 ssl->specs.pad_size = PAD_SHA; 00186 ssl->specs.static_ecdh = 0; 00187 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00188 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00189 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00190 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00191 00192 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00193 ssl->options.usingPSK_cipher = 1; 00194 break; 00195 #endif 00196 00197 #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 00198 case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256: 00199 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00200 ssl->specs.cipher_type = aead; 00201 ssl->specs.mac_algorithm = sha256_mac; 00202 ssl->specs.kea = ecdhe_psk_kea; 00203 ssl->specs.sig_algo = anonymous_sa_algo; 00204 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00205 ssl->specs.pad_size = PAD_SHA; 00206 ssl->specs.static_ecdh = 0; 00207 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00208 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00209 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00210 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00211 00212 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00213 ssl->options.usingPSK_cipher = 1; 00214 break; 00215 #endif 00216 00217 #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 00218 case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256: 00219 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 00220 ssl->specs.cipher_type = aead; 00221 ssl->specs.mac_algorithm = sha256_mac; 00222 ssl->specs.kea = dhe_psk_kea; 00223 ssl->specs.sig_algo = anonymous_sa_algo; 00224 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00225 ssl->specs.pad_size = PAD_SHA; 00226 ssl->specs.static_ecdh = 0; 00227 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 00228 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 00229 ssl->specs.iv_size = CHACHA20_IV_SIZE; 00230 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 00231 00232 ssl->options.oldPoly = 0; /* use recent padding RFC */ 00233 ssl->options.usingPSK_cipher = 1; 00234 break; 00235 #endif 00236 default: 00237 WOLFSSL_MSG("Unsupported cipher suite, SetCipherSpecs ChaCha"); 00238 return UNSUPPORTED_SUITE; 00239 } 00240 } 00241 00242 /* ECC extensions, or AES-CCM */ 00243 if (ssl->options.cipherSuite0 == ECC_BYTE) { 00244 00245 switch (ssl->options.cipherSuite) { 00246 00247 #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) 00248 00249 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 00250 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 : 00251 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00252 ssl->specs.cipher_type = block; 00253 ssl->specs.mac_algorithm = sha256_mac; 00254 ssl->specs.kea = ecc_diffie_hellman_kea; 00255 ssl->specs.sig_algo = rsa_sa_algo; 00256 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00257 ssl->specs.pad_size = PAD_SHA; 00258 ssl->specs.static_ecdh = 0; 00259 ssl->specs.key_size = AES_128_KEY_SIZE; 00260 ssl->specs.iv_size = AES_IV_SIZE; 00261 ssl->specs.block_size = AES_BLOCK_SIZE; 00262 00263 break; 00264 #endif 00265 00266 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 00267 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 : 00268 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00269 ssl->specs.cipher_type = block; 00270 ssl->specs.mac_algorithm = sha384_mac; 00271 ssl->specs.kea = ecc_diffie_hellman_kea; 00272 ssl->specs.sig_algo = rsa_sa_algo; 00273 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00274 ssl->specs.pad_size = PAD_SHA; 00275 ssl->specs.static_ecdh = 0; 00276 ssl->specs.key_size = AES_256_KEY_SIZE; 00277 ssl->specs.iv_size = AES_IV_SIZE; 00278 ssl->specs.block_size = AES_BLOCK_SIZE; 00279 00280 break; 00281 #endif 00282 00283 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 00284 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA : 00285 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00286 ssl->specs.cipher_type = block; 00287 ssl->specs.mac_algorithm = sha_mac; 00288 ssl->specs.kea = ecc_diffie_hellman_kea; 00289 ssl->specs.sig_algo = rsa_sa_algo; 00290 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00291 ssl->specs.pad_size = PAD_SHA; 00292 ssl->specs.static_ecdh = 0; 00293 ssl->specs.key_size = AES_128_KEY_SIZE; 00294 ssl->specs.block_size = AES_BLOCK_SIZE; 00295 ssl->specs.iv_size = AES_IV_SIZE; 00296 00297 break; 00298 #endif 00299 00300 #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 00301 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA : 00302 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 00303 ssl->specs.cipher_type = block; 00304 ssl->specs.mac_algorithm = sha_mac; 00305 ssl->specs.kea = ecc_diffie_hellman_kea; 00306 ssl->specs.sig_algo = rsa_sa_algo; 00307 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00308 ssl->specs.pad_size = PAD_SHA; 00309 ssl->specs.static_ecdh = 0; 00310 ssl->specs.key_size = DES3_KEY_SIZE; 00311 ssl->specs.block_size = DES_BLOCK_SIZE; 00312 ssl->specs.iv_size = DES_IV_SIZE; 00313 00314 break; 00315 #endif 00316 00317 #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA 00318 case TLS_ECDHE_RSA_WITH_RC4_128_SHA : 00319 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 00320 ssl->specs.cipher_type = stream; 00321 ssl->specs.mac_algorithm = sha_mac; 00322 ssl->specs.kea = ecc_diffie_hellman_kea; 00323 ssl->specs.sig_algo = rsa_sa_algo; 00324 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00325 ssl->specs.pad_size = PAD_SHA; 00326 ssl->specs.static_ecdh = 0; 00327 ssl->specs.key_size = RC4_KEY_SIZE; 00328 ssl->specs.iv_size = 0; 00329 ssl->specs.block_size = 0; 00330 00331 break; 00332 #endif 00333 00334 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 00335 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA : 00336 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00337 ssl->specs.cipher_type = block; 00338 ssl->specs.mac_algorithm = sha_mac; 00339 ssl->specs.kea = ecc_diffie_hellman_kea; 00340 ssl->specs.sig_algo = rsa_sa_algo; 00341 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00342 ssl->specs.pad_size = PAD_SHA; 00343 ssl->specs.static_ecdh = 0; 00344 ssl->specs.key_size = AES_256_KEY_SIZE; 00345 ssl->specs.block_size = AES_BLOCK_SIZE; 00346 ssl->specs.iv_size = AES_IV_SIZE; 00347 00348 break; 00349 #endif 00350 00351 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 00352 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 : 00353 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00354 ssl->specs.cipher_type = aead; 00355 ssl->specs.mac_algorithm = sha256_mac; 00356 ssl->specs.kea = ecc_diffie_hellman_kea; 00357 ssl->specs.sig_algo = rsa_sa_algo; 00358 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00359 ssl->specs.pad_size = PAD_SHA; 00360 ssl->specs.static_ecdh = 0; 00361 ssl->specs.key_size = AES_128_KEY_SIZE; 00362 ssl->specs.block_size = AES_BLOCK_SIZE; 00363 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00364 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00365 00366 break; 00367 #endif 00368 00369 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 00370 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 : 00371 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00372 ssl->specs.cipher_type = aead; 00373 ssl->specs.mac_algorithm = sha384_mac; 00374 ssl->specs.kea = ecc_diffie_hellman_kea; 00375 ssl->specs.sig_algo = rsa_sa_algo; 00376 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00377 ssl->specs.pad_size = PAD_SHA; 00378 ssl->specs.static_ecdh = 0; 00379 ssl->specs.key_size = AES_256_KEY_SIZE; 00380 ssl->specs.block_size = AES_BLOCK_SIZE; 00381 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00382 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00383 00384 break; 00385 #endif 00386 00387 #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256 00388 case TLS_ECDHE_PSK_WITH_NULL_SHA256 : 00389 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 00390 ssl->specs.cipher_type = stream; 00391 ssl->specs.mac_algorithm = sha256_mac; 00392 ssl->specs.kea = ecdhe_psk_kea; 00393 ssl->specs.sig_algo = anonymous_sa_algo; 00394 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00395 ssl->specs.pad_size = PAD_SHA; 00396 ssl->specs.static_ecdh = 0; 00397 ssl->specs.key_size = 0; 00398 ssl->specs.block_size = 0; 00399 ssl->specs.iv_size = 0; 00400 00401 ssl->options.usingPSK_cipher = 1; 00402 break; 00403 #endif 00404 00405 #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 00406 case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 : 00407 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00408 ssl->specs.cipher_type = block; 00409 ssl->specs.mac_algorithm = sha256_mac; 00410 ssl->specs.kea = ecdhe_psk_kea; 00411 ssl->specs.sig_algo = anonymous_sa_algo; 00412 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00413 ssl->specs.pad_size = PAD_SHA; 00414 ssl->specs.static_ecdh = 0; 00415 ssl->specs.key_size = AES_128_KEY_SIZE; 00416 ssl->specs.block_size = AES_BLOCK_SIZE; 00417 ssl->specs.iv_size = AES_IV_SIZE; 00418 00419 ssl->options.usingPSK_cipher = 1; 00420 break; 00421 #endif 00422 00423 #endif /* HAVE_ECC || HAVE_CURVE25519 */ 00424 00425 #if defined(HAVE_ECC) || (defined(HAVE_CURVE25519) && defined(HAVE_ED25519)) 00426 00427 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 00428 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 : 00429 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00430 ssl->specs.cipher_type = block; 00431 ssl->specs.mac_algorithm = sha256_mac; 00432 ssl->specs.kea = ecc_diffie_hellman_kea; 00433 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00434 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00435 ssl->specs.pad_size = PAD_SHA; 00436 ssl->specs.static_ecdh = 0; 00437 ssl->specs.key_size = AES_128_KEY_SIZE; 00438 ssl->specs.iv_size = AES_IV_SIZE; 00439 ssl->specs.block_size = AES_BLOCK_SIZE; 00440 00441 break; 00442 #endif 00443 00444 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 00445 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 : 00446 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00447 ssl->specs.cipher_type = block; 00448 ssl->specs.mac_algorithm = sha384_mac; 00449 ssl->specs.kea = ecc_diffie_hellman_kea; 00450 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00451 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00452 ssl->specs.pad_size = PAD_SHA; 00453 ssl->specs.static_ecdh = 0; 00454 ssl->specs.key_size = AES_256_KEY_SIZE; 00455 ssl->specs.iv_size = AES_IV_SIZE; 00456 ssl->specs.block_size = AES_BLOCK_SIZE; 00457 00458 break; 00459 #endif 00460 00461 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 00462 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA : 00463 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 00464 ssl->specs.cipher_type = block; 00465 ssl->specs.mac_algorithm = sha_mac; 00466 ssl->specs.kea = ecc_diffie_hellman_kea; 00467 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00468 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00469 ssl->specs.pad_size = PAD_SHA; 00470 ssl->specs.static_ecdh = 0; 00471 ssl->specs.key_size = DES3_KEY_SIZE; 00472 ssl->specs.block_size = DES_BLOCK_SIZE; 00473 ssl->specs.iv_size = DES_IV_SIZE; 00474 00475 break; 00476 #endif 00477 00478 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 00479 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA : 00480 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 00481 ssl->specs.cipher_type = stream; 00482 ssl->specs.mac_algorithm = sha_mac; 00483 ssl->specs.kea = ecc_diffie_hellman_kea; 00484 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00485 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00486 ssl->specs.pad_size = PAD_SHA; 00487 ssl->specs.static_ecdh = 0; 00488 ssl->specs.key_size = RC4_KEY_SIZE; 00489 ssl->specs.iv_size = 0; 00490 ssl->specs.block_size = 0; 00491 00492 break; 00493 #endif 00494 00495 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 00496 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA : 00497 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00498 ssl->specs.cipher_type = block; 00499 ssl->specs.mac_algorithm = sha_mac; 00500 ssl->specs.kea = ecc_diffie_hellman_kea; 00501 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00502 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00503 ssl->specs.pad_size = PAD_SHA; 00504 ssl->specs.static_ecdh = 0; 00505 ssl->specs.key_size = AES_128_KEY_SIZE; 00506 ssl->specs.block_size = AES_BLOCK_SIZE; 00507 ssl->specs.iv_size = AES_IV_SIZE; 00508 00509 break; 00510 #endif 00511 00512 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 00513 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA : 00514 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00515 ssl->specs.cipher_type = block; 00516 ssl->specs.mac_algorithm = sha_mac; 00517 ssl->specs.kea = ecc_diffie_hellman_kea; 00518 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00519 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00520 ssl->specs.pad_size = PAD_SHA; 00521 ssl->specs.static_ecdh = 0; 00522 ssl->specs.key_size = AES_256_KEY_SIZE; 00523 ssl->specs.block_size = AES_BLOCK_SIZE; 00524 ssl->specs.iv_size = AES_IV_SIZE; 00525 00526 break; 00527 #endif 00528 00529 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 00530 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 : 00531 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00532 ssl->specs.cipher_type = aead; 00533 ssl->specs.mac_algorithm = sha256_mac; 00534 ssl->specs.kea = ecc_diffie_hellman_kea; 00535 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00536 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00537 ssl->specs.pad_size = PAD_SHA; 00538 ssl->specs.static_ecdh = 0; 00539 ssl->specs.key_size = AES_128_KEY_SIZE; 00540 ssl->specs.block_size = AES_BLOCK_SIZE; 00541 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00542 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00543 00544 break; 00545 #endif 00546 00547 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 00548 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 : 00549 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00550 ssl->specs.cipher_type = aead; 00551 ssl->specs.mac_algorithm = sha384_mac; 00552 ssl->specs.kea = ecc_diffie_hellman_kea; 00553 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00554 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00555 ssl->specs.pad_size = PAD_SHA; 00556 ssl->specs.static_ecdh = 0; 00557 ssl->specs.key_size = AES_256_KEY_SIZE; 00558 ssl->specs.block_size = AES_BLOCK_SIZE; 00559 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00560 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00561 00562 break; 00563 #endif 00564 00565 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 00566 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM : 00567 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00568 ssl->specs.cipher_type = aead; 00569 ssl->specs.mac_algorithm = sha256_mac; 00570 ssl->specs.kea = ecc_diffie_hellman_kea; 00571 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00572 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00573 ssl->specs.pad_size = PAD_SHA; 00574 ssl->specs.static_ecdh = 0; 00575 ssl->specs.key_size = AES_128_KEY_SIZE; 00576 ssl->specs.block_size = AES_BLOCK_SIZE; 00577 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00578 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 00579 00580 break; 00581 #endif 00582 00583 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 00584 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 : 00585 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00586 ssl->specs.cipher_type = aead; 00587 ssl->specs.mac_algorithm = sha256_mac; 00588 ssl->specs.kea = ecc_diffie_hellman_kea; 00589 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00590 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00591 ssl->specs.pad_size = PAD_SHA; 00592 ssl->specs.static_ecdh = 0; 00593 ssl->specs.key_size = AES_128_KEY_SIZE; 00594 ssl->specs.block_size = AES_BLOCK_SIZE; 00595 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00596 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00597 00598 break; 00599 #endif 00600 00601 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 00602 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 : 00603 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00604 ssl->specs.cipher_type = aead; 00605 ssl->specs.mac_algorithm = sha256_mac; 00606 ssl->specs.kea = ecc_diffie_hellman_kea; 00607 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00608 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00609 ssl->specs.pad_size = PAD_SHA; 00610 ssl->specs.static_ecdh = 0; 00611 ssl->specs.key_size = AES_256_KEY_SIZE; 00612 ssl->specs.block_size = AES_BLOCK_SIZE; 00613 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00614 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00615 00616 break; 00617 #endif 00618 00619 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA 00620 case TLS_ECDHE_ECDSA_WITH_NULL_SHA : 00621 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 00622 ssl->specs.cipher_type = stream; 00623 ssl->specs.mac_algorithm = sha_mac; 00624 ssl->specs.kea = ecc_diffie_hellman_kea; 00625 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00626 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00627 ssl->specs.pad_size = PAD_SHA; 00628 ssl->specs.static_ecdh = 0; 00629 ssl->specs.key_size = 0; 00630 ssl->specs.block_size = 0; 00631 ssl->specs.iv_size = 0; 00632 00633 break; 00634 #endif 00635 00636 #endif /* HAVE_ECC || (HAVE_CURVE25519 && HAVE_ED25519) */ 00637 00638 #if defined(HAVE_ECC) 00639 00640 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 00641 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 : 00642 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00643 ssl->specs.cipher_type = block; 00644 ssl->specs.mac_algorithm = sha256_mac; 00645 ssl->specs.kea = ecc_diffie_hellman_kea; 00646 ssl->specs.sig_algo = rsa_sa_algo; 00647 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00648 ssl->specs.pad_size = PAD_SHA; 00649 ssl->specs.static_ecdh = 1; 00650 ssl->specs.key_size = AES_128_KEY_SIZE; 00651 ssl->specs.iv_size = AES_IV_SIZE; 00652 ssl->specs.block_size = AES_BLOCK_SIZE; 00653 00654 break; 00655 #endif 00656 00657 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 00658 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 : 00659 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00660 ssl->specs.cipher_type = block; 00661 ssl->specs.mac_algorithm = sha256_mac; 00662 ssl->specs.kea = ecc_diffie_hellman_kea; 00663 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00664 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00665 ssl->specs.pad_size = PAD_SHA; 00666 ssl->specs.static_ecdh = 1; 00667 ssl->specs.key_size = AES_128_KEY_SIZE; 00668 ssl->specs.iv_size = AES_IV_SIZE; 00669 ssl->specs.block_size = AES_BLOCK_SIZE; 00670 00671 break; 00672 #endif 00673 00674 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 00675 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 : 00676 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00677 ssl->specs.cipher_type = block; 00678 ssl->specs.mac_algorithm = sha384_mac; 00679 ssl->specs.kea = ecc_diffie_hellman_kea; 00680 ssl->specs.sig_algo = rsa_sa_algo; 00681 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00682 ssl->specs.pad_size = PAD_SHA; 00683 ssl->specs.static_ecdh = 1; 00684 ssl->specs.key_size = AES_256_KEY_SIZE; 00685 ssl->specs.iv_size = AES_IV_SIZE; 00686 ssl->specs.block_size = AES_BLOCK_SIZE; 00687 00688 break; 00689 #endif 00690 00691 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 00692 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 : 00693 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00694 ssl->specs.cipher_type = block; 00695 ssl->specs.mac_algorithm = sha384_mac; 00696 ssl->specs.kea = ecc_diffie_hellman_kea; 00697 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00698 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00699 ssl->specs.pad_size = PAD_SHA; 00700 ssl->specs.static_ecdh = 1; 00701 ssl->specs.key_size = AES_256_KEY_SIZE; 00702 ssl->specs.iv_size = AES_IV_SIZE; 00703 ssl->specs.block_size = AES_BLOCK_SIZE; 00704 00705 break; 00706 #endif 00707 00708 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 00709 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA : 00710 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00711 ssl->specs.cipher_type = block; 00712 ssl->specs.mac_algorithm = sha_mac; 00713 ssl->specs.kea = ecc_diffie_hellman_kea; 00714 ssl->specs.sig_algo = rsa_sa_algo; 00715 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00716 ssl->specs.pad_size = PAD_SHA; 00717 ssl->specs.static_ecdh = 1; 00718 ssl->specs.key_size = AES_128_KEY_SIZE; 00719 ssl->specs.block_size = AES_BLOCK_SIZE; 00720 ssl->specs.iv_size = AES_IV_SIZE; 00721 00722 break; 00723 #endif 00724 00725 #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 00726 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA : 00727 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 00728 ssl->specs.cipher_type = block; 00729 ssl->specs.mac_algorithm = sha_mac; 00730 ssl->specs.kea = ecc_diffie_hellman_kea; 00731 ssl->specs.sig_algo = rsa_sa_algo; 00732 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00733 ssl->specs.pad_size = PAD_SHA; 00734 ssl->specs.static_ecdh = 1; 00735 ssl->specs.key_size = DES3_KEY_SIZE; 00736 ssl->specs.block_size = DES_BLOCK_SIZE; 00737 ssl->specs.iv_size = DES_IV_SIZE; 00738 00739 break; 00740 #endif 00741 00742 #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA 00743 case TLS_ECDH_RSA_WITH_RC4_128_SHA : 00744 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 00745 ssl->specs.cipher_type = stream; 00746 ssl->specs.mac_algorithm = sha_mac; 00747 ssl->specs.kea = ecc_diffie_hellman_kea; 00748 ssl->specs.sig_algo = rsa_sa_algo; 00749 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00750 ssl->specs.pad_size = PAD_SHA; 00751 ssl->specs.static_ecdh = 1; 00752 ssl->specs.key_size = RC4_KEY_SIZE; 00753 ssl->specs.iv_size = 0; 00754 ssl->specs.block_size = 0; 00755 00756 break; 00757 #endif 00758 00759 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 00760 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA : 00761 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 00762 ssl->specs.cipher_type = block; 00763 ssl->specs.mac_algorithm = sha_mac; 00764 ssl->specs.kea = ecc_diffie_hellman_kea; 00765 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00766 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00767 ssl->specs.pad_size = PAD_SHA; 00768 ssl->specs.static_ecdh = 1; 00769 ssl->specs.key_size = DES3_KEY_SIZE; 00770 ssl->specs.block_size = DES_BLOCK_SIZE; 00771 ssl->specs.iv_size = DES_IV_SIZE; 00772 00773 break; 00774 #endif 00775 00776 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 00777 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA : 00778 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 00779 ssl->specs.cipher_type = stream; 00780 ssl->specs.mac_algorithm = sha_mac; 00781 ssl->specs.kea = ecc_diffie_hellman_kea; 00782 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00783 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00784 ssl->specs.pad_size = PAD_SHA; 00785 ssl->specs.static_ecdh = 1; 00786 ssl->specs.key_size = RC4_KEY_SIZE; 00787 ssl->specs.iv_size = 0; 00788 ssl->specs.block_size = 0; 00789 00790 break; 00791 #endif 00792 00793 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 00794 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA : 00795 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00796 ssl->specs.cipher_type = block; 00797 ssl->specs.mac_algorithm = sha_mac; 00798 ssl->specs.kea = ecc_diffie_hellman_kea; 00799 ssl->specs.sig_algo = rsa_sa_algo; 00800 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00801 ssl->specs.pad_size = PAD_SHA; 00802 ssl->specs.static_ecdh = 1; 00803 ssl->specs.key_size = AES_256_KEY_SIZE; 00804 ssl->specs.block_size = AES_BLOCK_SIZE; 00805 ssl->specs.iv_size = AES_IV_SIZE; 00806 00807 break; 00808 #endif 00809 00810 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 00811 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA : 00812 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00813 ssl->specs.cipher_type = block; 00814 ssl->specs.mac_algorithm = sha_mac; 00815 ssl->specs.kea = ecc_diffie_hellman_kea; 00816 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00817 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00818 ssl->specs.pad_size = PAD_SHA; 00819 ssl->specs.static_ecdh = 1; 00820 ssl->specs.key_size = AES_128_KEY_SIZE; 00821 ssl->specs.block_size = AES_BLOCK_SIZE; 00822 ssl->specs.iv_size = AES_IV_SIZE; 00823 00824 break; 00825 #endif 00826 00827 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 00828 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA : 00829 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 00830 ssl->specs.cipher_type = block; 00831 ssl->specs.mac_algorithm = sha_mac; 00832 ssl->specs.kea = ecc_diffie_hellman_kea; 00833 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00834 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 00835 ssl->specs.pad_size = PAD_SHA; 00836 ssl->specs.static_ecdh = 1; 00837 ssl->specs.key_size = AES_256_KEY_SIZE; 00838 ssl->specs.block_size = AES_BLOCK_SIZE; 00839 ssl->specs.iv_size = AES_IV_SIZE; 00840 00841 break; 00842 #endif 00843 00844 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 00845 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 : 00846 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00847 ssl->specs.cipher_type = aead; 00848 ssl->specs.mac_algorithm = sha256_mac; 00849 ssl->specs.kea = ecc_diffie_hellman_kea; 00850 ssl->specs.sig_algo = rsa_sa_algo; 00851 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00852 ssl->specs.pad_size = PAD_SHA; 00853 ssl->specs.static_ecdh = 1; 00854 ssl->specs.key_size = AES_128_KEY_SIZE; 00855 ssl->specs.block_size = AES_BLOCK_SIZE; 00856 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00857 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00858 00859 break; 00860 #endif 00861 00862 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 00863 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 : 00864 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00865 ssl->specs.cipher_type = aead; 00866 ssl->specs.mac_algorithm = sha384_mac; 00867 ssl->specs.kea = ecc_diffie_hellman_kea; 00868 ssl->specs.sig_algo = rsa_sa_algo; 00869 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00870 ssl->specs.pad_size = PAD_SHA; 00871 ssl->specs.static_ecdh = 1; 00872 ssl->specs.key_size = AES_256_KEY_SIZE; 00873 ssl->specs.block_size = AES_BLOCK_SIZE; 00874 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00875 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00876 00877 break; 00878 #endif 00879 00880 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 00881 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 : 00882 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00883 ssl->specs.cipher_type = aead; 00884 ssl->specs.mac_algorithm = sha256_mac; 00885 ssl->specs.kea = ecc_diffie_hellman_kea; 00886 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00887 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00888 ssl->specs.pad_size = PAD_SHA; 00889 ssl->specs.static_ecdh = 1; 00890 ssl->specs.key_size = AES_128_KEY_SIZE; 00891 ssl->specs.block_size = AES_BLOCK_SIZE; 00892 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00893 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00894 00895 break; 00896 #endif 00897 00898 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 00899 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 : 00900 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 00901 ssl->specs.cipher_type = aead; 00902 ssl->specs.mac_algorithm = sha384_mac; 00903 ssl->specs.kea = ecc_diffie_hellman_kea; 00904 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00905 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 00906 ssl->specs.pad_size = PAD_SHA; 00907 ssl->specs.static_ecdh = 1; 00908 ssl->specs.key_size = AES_256_KEY_SIZE; 00909 ssl->specs.block_size = AES_BLOCK_SIZE; 00910 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00911 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 00912 00913 break; 00914 #endif 00915 00916 #endif /* HAVE_ECC */ 00917 00918 #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8 00919 case TLS_RSA_WITH_AES_128_CCM_8 : 00920 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00921 ssl->specs.cipher_type = aead; 00922 ssl->specs.mac_algorithm = sha256_mac; 00923 ssl->specs.kea = rsa_kea; 00924 ssl->specs.sig_algo = rsa_sa_algo; 00925 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00926 ssl->specs.pad_size = PAD_SHA; 00927 ssl->specs.static_ecdh = 0; 00928 ssl->specs.key_size = AES_128_KEY_SIZE; 00929 ssl->specs.block_size = AES_BLOCK_SIZE; 00930 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00931 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00932 00933 break; 00934 #endif 00935 00936 #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8 00937 case TLS_RSA_WITH_AES_256_CCM_8 : 00938 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00939 ssl->specs.cipher_type = aead; 00940 ssl->specs.mac_algorithm = sha256_mac; 00941 ssl->specs.kea = rsa_kea; 00942 ssl->specs.sig_algo = rsa_sa_algo; 00943 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00944 ssl->specs.pad_size = PAD_SHA; 00945 ssl->specs.static_ecdh = 0; 00946 ssl->specs.key_size = AES_256_KEY_SIZE; 00947 ssl->specs.block_size = AES_BLOCK_SIZE; 00948 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00949 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00950 00951 break; 00952 #endif 00953 00954 #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8 00955 case TLS_PSK_WITH_AES_128_CCM_8 : 00956 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00957 ssl->specs.cipher_type = aead; 00958 ssl->specs.mac_algorithm = sha256_mac; 00959 ssl->specs.kea = psk_kea; 00960 ssl->specs.sig_algo = anonymous_sa_algo; 00961 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00962 ssl->specs.pad_size = PAD_SHA; 00963 ssl->specs.static_ecdh = 0; 00964 ssl->specs.key_size = AES_128_KEY_SIZE; 00965 ssl->specs.block_size = AES_BLOCK_SIZE; 00966 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00967 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00968 00969 ssl->options.usingPSK_cipher = 1; 00970 break; 00971 #endif 00972 00973 #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8 00974 case TLS_PSK_WITH_AES_256_CCM_8 : 00975 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00976 ssl->specs.cipher_type = aead; 00977 ssl->specs.mac_algorithm = sha256_mac; 00978 ssl->specs.kea = psk_kea; 00979 ssl->specs.sig_algo = anonymous_sa_algo; 00980 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 00981 ssl->specs.pad_size = PAD_SHA; 00982 ssl->specs.static_ecdh = 0; 00983 ssl->specs.key_size = AES_256_KEY_SIZE; 00984 ssl->specs.block_size = AES_BLOCK_SIZE; 00985 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 00986 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 00987 00988 ssl->options.usingPSK_cipher = 1; 00989 break; 00990 #endif 00991 00992 #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM 00993 case TLS_PSK_WITH_AES_128_CCM : 00994 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 00995 ssl->specs.cipher_type = aead; 00996 ssl->specs.mac_algorithm = sha256_mac; 00997 ssl->specs.kea = psk_kea; 00998 ssl->specs.sig_algo = anonymous_sa_algo; 00999 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01000 ssl->specs.pad_size = PAD_SHA; 01001 ssl->specs.static_ecdh = 0; 01002 ssl->specs.key_size = AES_128_KEY_SIZE; 01003 ssl->specs.block_size = AES_BLOCK_SIZE; 01004 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01005 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 01006 01007 ssl->options.usingPSK_cipher = 1; 01008 break; 01009 #endif 01010 01011 #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM 01012 case TLS_PSK_WITH_AES_256_CCM : 01013 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 01014 ssl->specs.cipher_type = aead; 01015 ssl->specs.mac_algorithm = sha256_mac; 01016 ssl->specs.kea = psk_kea; 01017 ssl->specs.sig_algo = anonymous_sa_algo; 01018 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01019 ssl->specs.pad_size = PAD_SHA; 01020 ssl->specs.static_ecdh = 0; 01021 ssl->specs.key_size = AES_256_KEY_SIZE; 01022 ssl->specs.block_size = AES_BLOCK_SIZE; 01023 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01024 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 01025 01026 ssl->options.usingPSK_cipher = 1; 01027 break; 01028 #endif 01029 01030 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM 01031 case TLS_DHE_PSK_WITH_AES_128_CCM : 01032 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 01033 ssl->specs.cipher_type = aead; 01034 ssl->specs.mac_algorithm = sha256_mac; 01035 ssl->specs.kea = dhe_psk_kea; 01036 ssl->specs.sig_algo = anonymous_sa_algo; 01037 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01038 ssl->specs.pad_size = PAD_SHA; 01039 ssl->specs.static_ecdh = 0; 01040 ssl->specs.key_size = AES_128_KEY_SIZE; 01041 ssl->specs.block_size = AES_BLOCK_SIZE; 01042 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01043 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 01044 01045 ssl->options.usingPSK_cipher = 1; 01046 break; 01047 #endif 01048 01049 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM 01050 case TLS_DHE_PSK_WITH_AES_256_CCM : 01051 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 01052 ssl->specs.cipher_type = aead; 01053 ssl->specs.mac_algorithm = sha256_mac; 01054 ssl->specs.kea = dhe_psk_kea; 01055 ssl->specs.sig_algo = anonymous_sa_algo; 01056 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01057 ssl->specs.pad_size = PAD_SHA; 01058 ssl->specs.static_ecdh = 0; 01059 ssl->specs.key_size = AES_256_KEY_SIZE; 01060 ssl->specs.block_size = AES_BLOCK_SIZE; 01061 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01062 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 01063 01064 ssl->options.usingPSK_cipher = 1; 01065 break; 01066 #endif 01067 01068 default: 01069 WOLFSSL_MSG("Unsupported cipher suite, SetCipherSpecs ECC"); 01070 return UNSUPPORTED_SUITE; 01071 } /* switch */ 01072 } /* if */ 01073 01074 /* TLSi v1.3 cipher suites, 0x13 */ 01075 if (ssl->options.cipherSuite0 == TLS13_BYTE) { 01076 switch (ssl->options.cipherSuite) { 01077 01078 #ifdef WOLFSSL_TLS13 01079 #ifdef BUILD_TLS_AES_128_GCM_SHA256 01080 case TLS_AES_128_GCM_SHA256 : 01081 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01082 ssl->specs.cipher_type = aead; 01083 ssl->specs.mac_algorithm = sha256_mac; 01084 ssl->specs.kea = 0; 01085 ssl->specs.sig_algo = 0; 01086 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01087 ssl->specs.pad_size = PAD_SHA; 01088 ssl->specs.static_ecdh = 0; 01089 ssl->specs.key_size = AES_128_KEY_SIZE; 01090 ssl->specs.block_size = AES_BLOCK_SIZE; 01091 ssl->specs.iv_size = AESGCM_NONCE_SZ; 01092 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01093 01094 break; 01095 #endif 01096 01097 #ifdef BUILD_TLS_AES_256_GCM_SHA384 01098 case TLS_AES_256_GCM_SHA384 : 01099 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01100 ssl->specs.cipher_type = aead; 01101 ssl->specs.mac_algorithm = sha384_mac; 01102 ssl->specs.kea = 0; 01103 ssl->specs.sig_algo = 0; 01104 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01105 ssl->specs.pad_size = PAD_SHA; 01106 ssl->specs.static_ecdh = 0; 01107 ssl->specs.key_size = AES_256_KEY_SIZE; 01108 ssl->specs.block_size = AES_BLOCK_SIZE; 01109 ssl->specs.iv_size = AESGCM_NONCE_SZ; 01110 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01111 01112 break; 01113 #endif 01114 01115 #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256 01116 case TLS_CHACHA20_POLY1305_SHA256 : 01117 ssl->specs.bulk_cipher_algorithm = wolfssl_chacha; 01118 ssl->specs.cipher_type = aead; 01119 ssl->specs.mac_algorithm = sha256_mac; 01120 ssl->specs.kea = 0; 01121 ssl->specs.sig_algo = 0; 01122 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01123 ssl->specs.pad_size = PAD_SHA; 01124 ssl->specs.static_ecdh = 0; 01125 ssl->specs.key_size = CHACHA20_256_KEY_SIZE; 01126 ssl->specs.block_size = CHACHA20_BLOCK_SIZE; 01127 ssl->specs.iv_size = CHACHA20_IV_SIZE; 01128 ssl->specs.aead_mac_size = POLY1305_AUTH_SZ; 01129 ssl->options.oldPoly = 0; /* use recent padding RFC */ 01130 01131 break; 01132 #endif 01133 01134 #ifdef BUILD_TLS_AES_128_CCM_SHA256 01135 case TLS_AES_128_CCM_SHA256 : 01136 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 01137 ssl->specs.cipher_type = aead; 01138 ssl->specs.mac_algorithm = sha256_mac; 01139 ssl->specs.kea = 0; 01140 ssl->specs.sig_algo = 0; 01141 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01142 ssl->specs.pad_size = PAD_SHA; 01143 ssl->specs.static_ecdh = 0; 01144 ssl->specs.key_size = AES_128_KEY_SIZE; 01145 ssl->specs.block_size = AES_BLOCK_SIZE; 01146 ssl->specs.iv_size = AESGCM_NONCE_SZ; 01147 ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ; 01148 01149 break; 01150 #endif 01151 01152 #ifdef BUILD_TLS_AES_128_CCM_8_SHA256 01153 case TLS_AES_128_CCM_8_SHA256 : 01154 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_ccm; 01155 ssl->specs.cipher_type = aead; 01156 ssl->specs.mac_algorithm = sha256_mac; 01157 ssl->specs.kea = 0; 01158 ssl->specs.sig_algo = 0; 01159 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01160 ssl->specs.pad_size = PAD_SHA; 01161 ssl->specs.static_ecdh = 0; 01162 ssl->specs.key_size = AES_128_KEY_SIZE; 01163 ssl->specs.block_size = AES_BLOCK_SIZE; 01164 ssl->specs.iv_size = AESGCM_NONCE_SZ; 01165 ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ; 01166 01167 break; 01168 #endif 01169 #endif /* WOLFSSL_TLS13 */ 01170 } 01171 } 01172 01173 if (ssl->options.cipherSuite0 != ECC_BYTE && 01174 ssl->options.cipherSuite0 != CHACHA_BYTE && 01175 ssl->options.cipherSuite0 != TLS13_BYTE) { /* normal suites */ 01176 switch (ssl->options.cipherSuite) { 01177 01178 #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA 01179 case SSL_RSA_WITH_RC4_128_SHA : 01180 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 01181 ssl->specs.cipher_type = stream; 01182 ssl->specs.mac_algorithm = sha_mac; 01183 ssl->specs.kea = rsa_kea; 01184 ssl->specs.sig_algo = rsa_sa_algo; 01185 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01186 ssl->specs.pad_size = PAD_SHA; 01187 ssl->specs.static_ecdh = 0; 01188 ssl->specs.key_size = RC4_KEY_SIZE; 01189 ssl->specs.iv_size = 0; 01190 ssl->specs.block_size = 0; 01191 01192 break; 01193 #endif 01194 01195 #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA 01196 case TLS_NTRU_RSA_WITH_RC4_128_SHA : 01197 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 01198 ssl->specs.cipher_type = stream; 01199 ssl->specs.mac_algorithm = sha_mac; 01200 ssl->specs.kea = ntru_kea; 01201 ssl->specs.sig_algo = rsa_sa_algo; 01202 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01203 ssl->specs.pad_size = PAD_SHA; 01204 ssl->specs.static_ecdh = 0; 01205 ssl->specs.key_size = RC4_KEY_SIZE; 01206 ssl->specs.iv_size = 0; 01207 ssl->specs.block_size = 0; 01208 01209 break; 01210 #endif 01211 01212 #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5 01213 case SSL_RSA_WITH_RC4_128_MD5 : 01214 ssl->specs.bulk_cipher_algorithm = wolfssl_rc4; 01215 ssl->specs.cipher_type = stream; 01216 ssl->specs.mac_algorithm = md5_mac; 01217 ssl->specs.kea = rsa_kea; 01218 ssl->specs.sig_algo = rsa_sa_algo; 01219 ssl->specs.hash_size = WC_MD5_DIGEST_SIZE; 01220 ssl->specs.pad_size = PAD_MD5; 01221 ssl->specs.static_ecdh = 0; 01222 ssl->specs.key_size = RC4_KEY_SIZE; 01223 ssl->specs.iv_size = 0; 01224 ssl->specs.block_size = 0; 01225 01226 break; 01227 #endif 01228 01229 #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA 01230 case SSL_RSA_WITH_3DES_EDE_CBC_SHA : 01231 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 01232 ssl->specs.cipher_type = block; 01233 ssl->specs.mac_algorithm = sha_mac; 01234 ssl->specs.kea = rsa_kea; 01235 ssl->specs.sig_algo = rsa_sa_algo; 01236 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01237 ssl->specs.pad_size = PAD_SHA; 01238 ssl->specs.static_ecdh = 0; 01239 ssl->specs.key_size = DES3_KEY_SIZE; 01240 ssl->specs.block_size = DES_BLOCK_SIZE; 01241 ssl->specs.iv_size = DES_IV_SIZE; 01242 01243 break; 01244 #endif 01245 01246 #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA 01247 case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA : 01248 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 01249 ssl->specs.cipher_type = block; 01250 ssl->specs.mac_algorithm = sha_mac; 01251 ssl->specs.kea = ntru_kea; 01252 ssl->specs.sig_algo = rsa_sa_algo; 01253 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01254 ssl->specs.pad_size = PAD_SHA; 01255 ssl->specs.static_ecdh = 0; 01256 ssl->specs.key_size = DES3_KEY_SIZE; 01257 ssl->specs.block_size = DES_BLOCK_SIZE; 01258 ssl->specs.iv_size = DES_IV_SIZE; 01259 01260 break; 01261 #endif 01262 01263 #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA 01264 case TLS_RSA_WITH_AES_128_CBC_SHA : 01265 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01266 ssl->specs.cipher_type = block; 01267 ssl->specs.mac_algorithm = sha_mac; 01268 ssl->specs.kea = rsa_kea; 01269 ssl->specs.sig_algo = rsa_sa_algo; 01270 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01271 ssl->specs.pad_size = PAD_SHA; 01272 ssl->specs.static_ecdh = 0; 01273 ssl->specs.key_size = AES_128_KEY_SIZE; 01274 ssl->specs.block_size = AES_BLOCK_SIZE; 01275 ssl->specs.iv_size = AES_IV_SIZE; 01276 01277 break; 01278 #endif 01279 01280 #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256 01281 case TLS_RSA_WITH_AES_128_CBC_SHA256 : 01282 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01283 ssl->specs.cipher_type = block; 01284 ssl->specs.mac_algorithm = sha256_mac; 01285 ssl->specs.kea = rsa_kea; 01286 ssl->specs.sig_algo = rsa_sa_algo; 01287 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01288 ssl->specs.pad_size = PAD_SHA; 01289 ssl->specs.static_ecdh = 0; 01290 ssl->specs.key_size = AES_128_KEY_SIZE; 01291 ssl->specs.block_size = AES_BLOCK_SIZE; 01292 ssl->specs.iv_size = AES_IV_SIZE; 01293 01294 break; 01295 #endif 01296 01297 #ifdef BUILD_TLS_RSA_WITH_NULL_SHA 01298 case TLS_RSA_WITH_NULL_SHA : 01299 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01300 ssl->specs.cipher_type = stream; 01301 ssl->specs.mac_algorithm = sha_mac; 01302 ssl->specs.kea = rsa_kea; 01303 ssl->specs.sig_algo = rsa_sa_algo; 01304 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01305 ssl->specs.pad_size = PAD_SHA; 01306 ssl->specs.static_ecdh = 0; 01307 ssl->specs.key_size = 0; 01308 ssl->specs.block_size = 0; 01309 ssl->specs.iv_size = 0; 01310 01311 break; 01312 #endif 01313 01314 #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256 01315 case TLS_RSA_WITH_NULL_SHA256 : 01316 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01317 ssl->specs.cipher_type = stream; 01318 ssl->specs.mac_algorithm = sha256_mac; 01319 ssl->specs.kea = rsa_kea; 01320 ssl->specs.sig_algo = rsa_sa_algo; 01321 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01322 ssl->specs.pad_size = PAD_SHA; 01323 ssl->specs.static_ecdh = 0; 01324 ssl->specs.key_size = 0; 01325 ssl->specs.block_size = 0; 01326 ssl->specs.iv_size = 0; 01327 01328 break; 01329 #endif 01330 01331 #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA 01332 case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA : 01333 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01334 ssl->specs.cipher_type = block; 01335 ssl->specs.mac_algorithm = sha_mac; 01336 ssl->specs.kea = ntru_kea; 01337 ssl->specs.sig_algo = rsa_sa_algo; 01338 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01339 ssl->specs.pad_size = PAD_SHA; 01340 ssl->specs.static_ecdh = 0; 01341 ssl->specs.key_size = AES_128_KEY_SIZE; 01342 ssl->specs.block_size = AES_BLOCK_SIZE; 01343 ssl->specs.iv_size = AES_IV_SIZE; 01344 01345 break; 01346 #endif 01347 01348 #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA 01349 case TLS_RSA_WITH_AES_256_CBC_SHA : 01350 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01351 ssl->specs.cipher_type = block; 01352 ssl->specs.mac_algorithm = sha_mac; 01353 ssl->specs.kea = rsa_kea; 01354 ssl->specs.sig_algo = rsa_sa_algo; 01355 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01356 ssl->specs.pad_size = PAD_SHA; 01357 ssl->specs.static_ecdh = 0; 01358 ssl->specs.key_size = AES_256_KEY_SIZE; 01359 ssl->specs.block_size = AES_BLOCK_SIZE; 01360 ssl->specs.iv_size = AES_IV_SIZE; 01361 01362 break; 01363 #endif 01364 01365 #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256 01366 case TLS_RSA_WITH_AES_256_CBC_SHA256 : 01367 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01368 ssl->specs.cipher_type = block; 01369 ssl->specs.mac_algorithm = sha256_mac; 01370 ssl->specs.kea = rsa_kea; 01371 ssl->specs.sig_algo = rsa_sa_algo; 01372 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01373 ssl->specs.pad_size = PAD_SHA; 01374 ssl->specs.static_ecdh = 0; 01375 ssl->specs.key_size = AES_256_KEY_SIZE; 01376 ssl->specs.block_size = AES_BLOCK_SIZE; 01377 ssl->specs.iv_size = AES_IV_SIZE; 01378 01379 break; 01380 #endif 01381 01382 #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA 01383 case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA : 01384 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01385 ssl->specs.cipher_type = block; 01386 ssl->specs.mac_algorithm = sha_mac; 01387 ssl->specs.kea = ntru_kea; 01388 ssl->specs.sig_algo = rsa_sa_algo; 01389 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01390 ssl->specs.pad_size = PAD_SHA; 01391 ssl->specs.static_ecdh = 0; 01392 ssl->specs.key_size = AES_256_KEY_SIZE; 01393 ssl->specs.block_size = AES_BLOCK_SIZE; 01394 ssl->specs.iv_size = AES_IV_SIZE; 01395 01396 break; 01397 #endif 01398 01399 #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256 01400 case TLS_PSK_WITH_AES_128_GCM_SHA256 : 01401 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01402 ssl->specs.cipher_type = aead; 01403 ssl->specs.mac_algorithm = sha256_mac; 01404 ssl->specs.kea = psk_kea; 01405 ssl->specs.sig_algo = anonymous_sa_algo; 01406 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01407 ssl->specs.pad_size = PAD_SHA; 01408 ssl->specs.static_ecdh = 0; 01409 ssl->specs.key_size = AES_128_KEY_SIZE; 01410 ssl->specs.block_size = AES_BLOCK_SIZE; 01411 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01412 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01413 01414 ssl->options.usingPSK_cipher = 1; 01415 break; 01416 #endif 01417 01418 #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384 01419 case TLS_PSK_WITH_AES_256_GCM_SHA384 : 01420 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01421 ssl->specs.cipher_type = aead; 01422 ssl->specs.mac_algorithm = sha384_mac; 01423 ssl->specs.kea = psk_kea; 01424 ssl->specs.sig_algo = anonymous_sa_algo; 01425 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01426 ssl->specs.pad_size = PAD_SHA; 01427 ssl->specs.static_ecdh = 0; 01428 ssl->specs.key_size = AES_256_KEY_SIZE; 01429 ssl->specs.block_size = AES_BLOCK_SIZE; 01430 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01431 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01432 01433 ssl->options.usingPSK_cipher = 1; 01434 break; 01435 #endif 01436 01437 #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384 01438 case TLS_DH_anon_WITH_AES_256_GCM_SHA384: 01439 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01440 ssl->specs.cipher_type = aead; 01441 ssl->specs.mac_algorithm = sha384_mac; 01442 ssl->specs.kea = diffie_hellman_kea; 01443 ssl->specs.sig_algo = anonymous_sa_algo; 01444 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01445 ssl->specs.pad_size = PAD_SHA; 01446 ssl->specs.static_ecdh = 0; 01447 ssl->specs.key_size = AES_256_KEY_SIZE; 01448 ssl->specs.block_size = AES_BLOCK_SIZE; 01449 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01450 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01451 01452 ssl->options.usingAnon_cipher = 1; 01453 break; 01454 #endif 01455 01456 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 01457 case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 : 01458 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01459 ssl->specs.cipher_type = aead; 01460 ssl->specs.mac_algorithm = sha256_mac; 01461 ssl->specs.kea = dhe_psk_kea; 01462 ssl->specs.sig_algo = anonymous_sa_algo; 01463 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01464 ssl->specs.pad_size = PAD_SHA; 01465 ssl->specs.static_ecdh = 0; 01466 ssl->specs.key_size = AES_128_KEY_SIZE; 01467 ssl->specs.block_size = AES_BLOCK_SIZE; 01468 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01469 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01470 01471 ssl->options.usingPSK_cipher = 1; 01472 break; 01473 #endif 01474 01475 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 01476 case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 : 01477 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01478 ssl->specs.cipher_type = aead; 01479 ssl->specs.mac_algorithm = sha384_mac; 01480 ssl->specs.kea = dhe_psk_kea; 01481 ssl->specs.sig_algo = anonymous_sa_algo; 01482 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01483 ssl->specs.pad_size = PAD_SHA; 01484 ssl->specs.static_ecdh = 0; 01485 ssl->specs.key_size = AES_256_KEY_SIZE; 01486 ssl->specs.block_size = AES_BLOCK_SIZE; 01487 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01488 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01489 01490 ssl->options.usingPSK_cipher = 1; 01491 break; 01492 #endif 01493 01494 #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256 01495 case TLS_PSK_WITH_AES_128_CBC_SHA256 : 01496 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01497 ssl->specs.cipher_type = block; 01498 ssl->specs.mac_algorithm = sha256_mac; 01499 ssl->specs.kea = psk_kea; 01500 ssl->specs.sig_algo = anonymous_sa_algo; 01501 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01502 ssl->specs.pad_size = PAD_SHA; 01503 ssl->specs.static_ecdh = 0; 01504 ssl->specs.key_size = AES_128_KEY_SIZE; 01505 ssl->specs.block_size = AES_BLOCK_SIZE; 01506 ssl->specs.iv_size = AES_IV_SIZE; 01507 01508 ssl->options.usingPSK_cipher = 1; 01509 break; 01510 #endif 01511 01512 #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384 01513 case TLS_PSK_WITH_AES_256_CBC_SHA384 : 01514 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01515 ssl->specs.cipher_type = block; 01516 ssl->specs.mac_algorithm = sha384_mac; 01517 ssl->specs.kea = psk_kea; 01518 ssl->specs.sig_algo = anonymous_sa_algo; 01519 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01520 ssl->specs.pad_size = PAD_SHA; 01521 ssl->specs.static_ecdh = 0; 01522 ssl->specs.key_size = AES_256_KEY_SIZE; 01523 ssl->specs.block_size = AES_BLOCK_SIZE; 01524 ssl->specs.iv_size = AES_IV_SIZE; 01525 01526 ssl->options.usingPSK_cipher = 1; 01527 break; 01528 #endif 01529 01530 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 01531 case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 : 01532 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01533 ssl->specs.cipher_type = block; 01534 ssl->specs.mac_algorithm = sha256_mac; 01535 ssl->specs.kea = dhe_psk_kea; 01536 ssl->specs.sig_algo = anonymous_sa_algo; 01537 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01538 ssl->specs.pad_size = PAD_SHA; 01539 ssl->specs.static_ecdh = 0; 01540 ssl->specs.key_size = AES_128_KEY_SIZE; 01541 ssl->specs.block_size = AES_BLOCK_SIZE; 01542 ssl->specs.iv_size = AES_IV_SIZE; 01543 01544 ssl->options.usingPSK_cipher = 1; 01545 break; 01546 #endif 01547 01548 #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 01549 case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 : 01550 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01551 ssl->specs.cipher_type = block; 01552 ssl->specs.mac_algorithm = sha384_mac; 01553 ssl->specs.kea = dhe_psk_kea; 01554 ssl->specs.sig_algo = anonymous_sa_algo; 01555 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01556 ssl->specs.pad_size = PAD_SHA; 01557 ssl->specs.static_ecdh = 0; 01558 ssl->specs.key_size = AES_256_KEY_SIZE; 01559 ssl->specs.block_size = AES_BLOCK_SIZE; 01560 ssl->specs.iv_size = AES_IV_SIZE; 01561 01562 ssl->options.usingPSK_cipher = 1; 01563 break; 01564 #endif 01565 01566 #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA 01567 case TLS_PSK_WITH_AES_128_CBC_SHA : 01568 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01569 ssl->specs.cipher_type = block; 01570 ssl->specs.mac_algorithm = sha_mac; 01571 ssl->specs.kea = psk_kea; 01572 ssl->specs.sig_algo = anonymous_sa_algo; 01573 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01574 ssl->specs.pad_size = PAD_SHA; 01575 ssl->specs.static_ecdh = 0; 01576 ssl->specs.key_size = AES_128_KEY_SIZE; 01577 ssl->specs.block_size = AES_BLOCK_SIZE; 01578 ssl->specs.iv_size = AES_IV_SIZE; 01579 01580 ssl->options.usingPSK_cipher = 1; 01581 break; 01582 #endif 01583 01584 #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA 01585 case TLS_PSK_WITH_AES_256_CBC_SHA : 01586 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01587 ssl->specs.cipher_type = block; 01588 ssl->specs.mac_algorithm = sha_mac; 01589 ssl->specs.kea = psk_kea; 01590 ssl->specs.sig_algo = anonymous_sa_algo; 01591 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01592 ssl->specs.pad_size = PAD_SHA; 01593 ssl->specs.static_ecdh = 0; 01594 ssl->specs.key_size = AES_256_KEY_SIZE; 01595 ssl->specs.block_size = AES_BLOCK_SIZE; 01596 ssl->specs.iv_size = AES_IV_SIZE; 01597 01598 ssl->options.usingPSK_cipher = 1; 01599 break; 01600 #endif 01601 01602 #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256 01603 case TLS_PSK_WITH_NULL_SHA256 : 01604 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01605 ssl->specs.cipher_type = stream; 01606 ssl->specs.mac_algorithm = sha256_mac; 01607 ssl->specs.kea = psk_kea; 01608 ssl->specs.sig_algo = anonymous_sa_algo; 01609 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01610 ssl->specs.pad_size = PAD_SHA; 01611 ssl->specs.static_ecdh = 0; 01612 ssl->specs.key_size = 0; 01613 ssl->specs.block_size = 0; 01614 ssl->specs.iv_size = 0; 01615 01616 ssl->options.usingPSK_cipher = 1; 01617 break; 01618 #endif 01619 01620 #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384 01621 case TLS_PSK_WITH_NULL_SHA384 : 01622 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01623 ssl->specs.cipher_type = stream; 01624 ssl->specs.mac_algorithm = sha384_mac; 01625 ssl->specs.kea = psk_kea; 01626 ssl->specs.sig_algo = anonymous_sa_algo; 01627 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01628 ssl->specs.pad_size = PAD_SHA; 01629 ssl->specs.static_ecdh = 0; 01630 ssl->specs.key_size = 0; 01631 ssl->specs.block_size = 0; 01632 ssl->specs.iv_size = 0; 01633 01634 ssl->options.usingPSK_cipher = 1; 01635 break; 01636 #endif 01637 01638 #ifdef BUILD_TLS_PSK_WITH_NULL_SHA 01639 case TLS_PSK_WITH_NULL_SHA : 01640 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01641 ssl->specs.cipher_type = stream; 01642 ssl->specs.mac_algorithm = sha_mac; 01643 ssl->specs.kea = psk_kea; 01644 ssl->specs.sig_algo = anonymous_sa_algo; 01645 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01646 ssl->specs.pad_size = PAD_SHA; 01647 ssl->specs.static_ecdh = 0; 01648 ssl->specs.key_size = 0; 01649 ssl->specs.block_size = 0; 01650 ssl->specs.iv_size = 0; 01651 01652 ssl->options.usingPSK_cipher = 1; 01653 break; 01654 #endif 01655 01656 #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256 01657 case TLS_DHE_PSK_WITH_NULL_SHA256 : 01658 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01659 ssl->specs.cipher_type = stream; 01660 ssl->specs.mac_algorithm = sha256_mac; 01661 ssl->specs.kea = dhe_psk_kea; 01662 ssl->specs.sig_algo = anonymous_sa_algo; 01663 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01664 ssl->specs.pad_size = PAD_SHA; 01665 ssl->specs.static_ecdh = 0; 01666 ssl->specs.key_size = 0; 01667 ssl->specs.block_size = 0; 01668 ssl->specs.iv_size = 0; 01669 01670 ssl->options.usingPSK_cipher = 1; 01671 break; 01672 #endif 01673 01674 #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384 01675 case TLS_DHE_PSK_WITH_NULL_SHA384 : 01676 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 01677 ssl->specs.cipher_type = stream; 01678 ssl->specs.mac_algorithm = sha384_mac; 01679 ssl->specs.kea = dhe_psk_kea; 01680 ssl->specs.sig_algo = anonymous_sa_algo; 01681 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01682 ssl->specs.pad_size = PAD_SHA; 01683 ssl->specs.static_ecdh = 0; 01684 ssl->specs.key_size = 0; 01685 ssl->specs.block_size = 0; 01686 ssl->specs.iv_size = 0; 01687 01688 ssl->options.usingPSK_cipher = 1; 01689 break; 01690 #endif 01691 01692 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 01693 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 : 01694 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01695 ssl->specs.cipher_type = block; 01696 ssl->specs.mac_algorithm = sha256_mac; 01697 ssl->specs.kea = diffie_hellman_kea; 01698 ssl->specs.sig_algo = rsa_sa_algo; 01699 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01700 ssl->specs.pad_size = PAD_SHA; 01701 ssl->specs.static_ecdh = 0; 01702 ssl->specs.key_size = AES_128_KEY_SIZE; 01703 ssl->specs.block_size = AES_BLOCK_SIZE; 01704 ssl->specs.iv_size = AES_IV_SIZE; 01705 01706 break; 01707 #endif 01708 01709 #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 01710 case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA : 01711 ssl->specs.bulk_cipher_algorithm = wolfssl_triple_des; 01712 ssl->specs.cipher_type = block; 01713 ssl->specs.mac_algorithm = sha_mac; 01714 ssl->specs.kea = diffie_hellman_kea; 01715 ssl->specs.sig_algo = rsa_sa_algo; 01716 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01717 ssl->specs.pad_size = PAD_SHA; 01718 ssl->specs.static_ecdh = 0; 01719 ssl->specs.key_size = DES3_KEY_SIZE; 01720 ssl->specs.block_size = DES_BLOCK_SIZE; 01721 ssl->specs.iv_size = DES_IV_SIZE; 01722 01723 break; 01724 #endif 01725 01726 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 01727 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 : 01728 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01729 ssl->specs.cipher_type = block; 01730 ssl->specs.mac_algorithm = sha256_mac; 01731 ssl->specs.kea = diffie_hellman_kea; 01732 ssl->specs.sig_algo = rsa_sa_algo; 01733 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01734 ssl->specs.pad_size = PAD_SHA; 01735 ssl->specs.static_ecdh = 0; 01736 ssl->specs.key_size = AES_256_KEY_SIZE; 01737 ssl->specs.block_size = AES_BLOCK_SIZE; 01738 ssl->specs.iv_size = AES_IV_SIZE; 01739 01740 break; 01741 #endif 01742 01743 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 01744 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : 01745 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01746 ssl->specs.cipher_type = block; 01747 ssl->specs.mac_algorithm = sha_mac; 01748 ssl->specs.kea = diffie_hellman_kea; 01749 ssl->specs.sig_algo = rsa_sa_algo; 01750 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01751 ssl->specs.pad_size = PAD_SHA; 01752 ssl->specs.static_ecdh = 0; 01753 ssl->specs.key_size = AES_128_KEY_SIZE; 01754 ssl->specs.block_size = AES_BLOCK_SIZE; 01755 ssl->specs.iv_size = AES_IV_SIZE; 01756 01757 break; 01758 #endif 01759 01760 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 01761 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : 01762 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01763 ssl->specs.cipher_type = block; 01764 ssl->specs.mac_algorithm = sha_mac; 01765 ssl->specs.kea = diffie_hellman_kea; 01766 ssl->specs.sig_algo = rsa_sa_algo; 01767 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01768 ssl->specs.pad_size = PAD_SHA; 01769 ssl->specs.static_ecdh = 0; 01770 ssl->specs.key_size = AES_256_KEY_SIZE; 01771 ssl->specs.block_size = AES_BLOCK_SIZE; 01772 ssl->specs.iv_size = AES_IV_SIZE; 01773 01774 break; 01775 #endif 01776 01777 #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5 01778 case TLS_RSA_WITH_HC_128_MD5 : 01779 ssl->specs.bulk_cipher_algorithm = wolfssl_hc128; 01780 ssl->specs.cipher_type = stream; 01781 ssl->specs.mac_algorithm = md5_mac; 01782 ssl->specs.kea = rsa_kea; 01783 ssl->specs.sig_algo = rsa_sa_algo; 01784 ssl->specs.hash_size = WC_MD5_DIGEST_SIZE; 01785 ssl->specs.pad_size = PAD_MD5; 01786 ssl->specs.static_ecdh = 0; 01787 ssl->specs.key_size = HC_128_KEY_SIZE; 01788 ssl->specs.block_size = 0; 01789 ssl->specs.iv_size = HC_128_IV_SIZE; 01790 01791 break; 01792 #endif 01793 01794 #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA 01795 case TLS_RSA_WITH_HC_128_SHA : 01796 ssl->specs.bulk_cipher_algorithm = wolfssl_hc128; 01797 ssl->specs.cipher_type = stream; 01798 ssl->specs.mac_algorithm = sha_mac; 01799 ssl->specs.kea = rsa_kea; 01800 ssl->specs.sig_algo = rsa_sa_algo; 01801 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01802 ssl->specs.pad_size = PAD_SHA; 01803 ssl->specs.static_ecdh = 0; 01804 ssl->specs.key_size = HC_128_KEY_SIZE; 01805 ssl->specs.block_size = 0; 01806 ssl->specs.iv_size = HC_128_IV_SIZE; 01807 01808 break; 01809 #endif 01810 01811 #ifdef BUILD_TLS_RSA_WITH_HC_128_B2B256 01812 case TLS_RSA_WITH_HC_128_B2B256: 01813 ssl->specs.bulk_cipher_algorithm = wolfssl_hc128; 01814 ssl->specs.cipher_type = stream; 01815 ssl->specs.mac_algorithm = blake2b_mac; 01816 ssl->specs.kea = rsa_kea; 01817 ssl->specs.sig_algo = rsa_sa_algo; 01818 ssl->specs.hash_size = BLAKE2B_256; 01819 ssl->specs.pad_size = PAD_SHA; 01820 ssl->specs.static_ecdh = 0; 01821 ssl->specs.key_size = HC_128_KEY_SIZE; 01822 ssl->specs.block_size = 0; 01823 ssl->specs.iv_size = HC_128_IV_SIZE; 01824 01825 break; 01826 #endif 01827 01828 #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_B2B256 01829 case TLS_RSA_WITH_AES_128_CBC_B2B256: 01830 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01831 ssl->specs.cipher_type = block; 01832 ssl->specs.mac_algorithm = blake2b_mac; 01833 ssl->specs.kea = rsa_kea; 01834 ssl->specs.sig_algo = rsa_sa_algo; 01835 ssl->specs.hash_size = BLAKE2B_256; 01836 ssl->specs.pad_size = PAD_SHA; 01837 ssl->specs.static_ecdh = 0; 01838 ssl->specs.key_size = AES_128_KEY_SIZE; 01839 ssl->specs.iv_size = AES_IV_SIZE; 01840 ssl->specs.block_size = AES_BLOCK_SIZE; 01841 01842 break; 01843 #endif 01844 01845 #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_B2B256 01846 case TLS_RSA_WITH_AES_256_CBC_B2B256: 01847 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 01848 ssl->specs.cipher_type = block; 01849 ssl->specs.mac_algorithm = blake2b_mac; 01850 ssl->specs.kea = rsa_kea; 01851 ssl->specs.sig_algo = rsa_sa_algo; 01852 ssl->specs.hash_size = BLAKE2B_256; 01853 ssl->specs.pad_size = PAD_SHA; 01854 ssl->specs.static_ecdh = 0; 01855 ssl->specs.key_size = AES_256_KEY_SIZE; 01856 ssl->specs.iv_size = AES_IV_SIZE; 01857 ssl->specs.block_size = AES_BLOCK_SIZE; 01858 01859 break; 01860 #endif 01861 01862 #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA 01863 case TLS_RSA_WITH_RABBIT_SHA : 01864 ssl->specs.bulk_cipher_algorithm = wolfssl_rabbit; 01865 ssl->specs.cipher_type = stream; 01866 ssl->specs.mac_algorithm = sha_mac; 01867 ssl->specs.kea = rsa_kea; 01868 ssl->specs.sig_algo = rsa_sa_algo; 01869 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01870 ssl->specs.pad_size = PAD_SHA; 01871 ssl->specs.static_ecdh = 0; 01872 ssl->specs.key_size = RABBIT_KEY_SIZE; 01873 ssl->specs.block_size = 0; 01874 ssl->specs.iv_size = RABBIT_IV_SIZE; 01875 01876 break; 01877 #endif 01878 01879 #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256 01880 case TLS_RSA_WITH_AES_128_GCM_SHA256 : 01881 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01882 ssl->specs.cipher_type = aead; 01883 ssl->specs.mac_algorithm = sha256_mac; 01884 ssl->specs.kea = rsa_kea; 01885 ssl->specs.sig_algo = rsa_sa_algo; 01886 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01887 ssl->specs.pad_size = PAD_SHA; 01888 ssl->specs.static_ecdh = 0; 01889 ssl->specs.key_size = AES_128_KEY_SIZE; 01890 ssl->specs.block_size = AES_BLOCK_SIZE; 01891 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01892 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01893 01894 break; 01895 #endif 01896 01897 #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384 01898 case TLS_RSA_WITH_AES_256_GCM_SHA384 : 01899 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01900 ssl->specs.cipher_type = aead; 01901 ssl->specs.mac_algorithm = sha384_mac; 01902 ssl->specs.kea = rsa_kea; 01903 ssl->specs.sig_algo = rsa_sa_algo; 01904 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01905 ssl->specs.pad_size = PAD_SHA; 01906 ssl->specs.static_ecdh = 0; 01907 ssl->specs.key_size = AES_256_KEY_SIZE; 01908 ssl->specs.block_size = AES_BLOCK_SIZE; 01909 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01910 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01911 01912 break; 01913 #endif 01914 01915 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 01916 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 : 01917 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01918 ssl->specs.cipher_type = aead; 01919 ssl->specs.mac_algorithm = sha256_mac; 01920 ssl->specs.kea = diffie_hellman_kea; 01921 ssl->specs.sig_algo = rsa_sa_algo; 01922 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01923 ssl->specs.pad_size = PAD_SHA; 01924 ssl->specs.static_ecdh = 0; 01925 ssl->specs.key_size = AES_128_KEY_SIZE; 01926 ssl->specs.block_size = AES_BLOCK_SIZE; 01927 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01928 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01929 01930 break; 01931 #endif 01932 01933 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 01934 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 : 01935 ssl->specs.bulk_cipher_algorithm = wolfssl_aes_gcm; 01936 ssl->specs.cipher_type = aead; 01937 ssl->specs.mac_algorithm = sha384_mac; 01938 ssl->specs.kea = diffie_hellman_kea; 01939 ssl->specs.sig_algo = rsa_sa_algo; 01940 ssl->specs.hash_size = WC_SHA384_DIGEST_SIZE; 01941 ssl->specs.pad_size = PAD_SHA; 01942 ssl->specs.static_ecdh = 0; 01943 ssl->specs.key_size = AES_256_KEY_SIZE; 01944 ssl->specs.block_size = AES_BLOCK_SIZE; 01945 ssl->specs.iv_size = AESGCM_IMP_IV_SZ; 01946 ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ; 01947 01948 break; 01949 #endif 01950 01951 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 01952 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA : 01953 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 01954 ssl->specs.cipher_type = block; 01955 ssl->specs.mac_algorithm = sha_mac; 01956 ssl->specs.kea = rsa_kea; 01957 ssl->specs.sig_algo = rsa_sa_algo; 01958 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01959 ssl->specs.pad_size = PAD_SHA; 01960 ssl->specs.static_ecdh = 0; 01961 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01962 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01963 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01964 01965 break; 01966 #endif 01967 01968 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 01969 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA : 01970 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 01971 ssl->specs.cipher_type = block; 01972 ssl->specs.mac_algorithm = sha_mac; 01973 ssl->specs.kea = rsa_kea; 01974 ssl->specs.sig_algo = rsa_sa_algo; 01975 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 01976 ssl->specs.pad_size = PAD_SHA; 01977 ssl->specs.static_ecdh = 0; 01978 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 01979 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01980 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01981 01982 break; 01983 #endif 01984 01985 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 01986 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 : 01987 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 01988 ssl->specs.cipher_type = block; 01989 ssl->specs.mac_algorithm = sha256_mac; 01990 ssl->specs.kea = rsa_kea; 01991 ssl->specs.sig_algo = rsa_sa_algo; 01992 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 01993 ssl->specs.pad_size = PAD_SHA; 01994 ssl->specs.static_ecdh = 0; 01995 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01996 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01997 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01998 01999 break; 02000 #endif 02001 02002 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 02003 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 : 02004 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 02005 ssl->specs.cipher_type = block; 02006 ssl->specs.mac_algorithm = sha256_mac; 02007 ssl->specs.kea = rsa_kea; 02008 ssl->specs.sig_algo = rsa_sa_algo; 02009 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 02010 ssl->specs.pad_size = PAD_SHA; 02011 ssl->specs.static_ecdh = 0; 02012 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 02013 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 02014 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 02015 02016 break; 02017 #endif 02018 02019 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 02020 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA : 02021 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 02022 ssl->specs.cipher_type = block; 02023 ssl->specs.mac_algorithm = sha_mac; 02024 ssl->specs.kea = diffie_hellman_kea; 02025 ssl->specs.sig_algo = rsa_sa_algo; 02026 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 02027 ssl->specs.pad_size = PAD_SHA; 02028 ssl->specs.static_ecdh = 0; 02029 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 02030 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 02031 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 02032 02033 break; 02034 #endif 02035 02036 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 02037 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA : 02038 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 02039 ssl->specs.cipher_type = block; 02040 ssl->specs.mac_algorithm = sha_mac; 02041 ssl->specs.kea = diffie_hellman_kea; 02042 ssl->specs.sig_algo = rsa_sa_algo; 02043 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 02044 ssl->specs.pad_size = PAD_SHA; 02045 ssl->specs.static_ecdh = 0; 02046 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 02047 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 02048 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 02049 02050 break; 02051 #endif 02052 02053 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 02054 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 : 02055 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 02056 ssl->specs.cipher_type = block; 02057 ssl->specs.mac_algorithm = sha256_mac; 02058 ssl->specs.kea = diffie_hellman_kea; 02059 ssl->specs.sig_algo = rsa_sa_algo; 02060 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 02061 ssl->specs.pad_size = PAD_SHA; 02062 ssl->specs.static_ecdh = 0; 02063 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 02064 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 02065 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 02066 02067 break; 02068 #endif 02069 02070 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 02071 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 : 02072 ssl->specs.bulk_cipher_algorithm = wolfssl_camellia; 02073 ssl->specs.cipher_type = block; 02074 ssl->specs.mac_algorithm = sha256_mac; 02075 ssl->specs.kea = diffie_hellman_kea; 02076 ssl->specs.sig_algo = rsa_sa_algo; 02077 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 02078 ssl->specs.pad_size = PAD_SHA; 02079 ssl->specs.static_ecdh = 0; 02080 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 02081 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 02082 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 02083 02084 break; 02085 #endif 02086 02087 #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA 02088 case TLS_DH_anon_WITH_AES_128_CBC_SHA : 02089 ssl->specs.bulk_cipher_algorithm = wolfssl_aes; 02090 ssl->specs.cipher_type = block; 02091 ssl->specs.mac_algorithm = sha_mac; 02092 ssl->specs.kea = diffie_hellman_kea; 02093 ssl->specs.sig_algo = anonymous_sa_algo; 02094 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 02095 ssl->specs.pad_size = PAD_SHA; 02096 ssl->specs.static_ecdh = 0; 02097 ssl->specs.key_size = AES_128_KEY_SIZE; 02098 ssl->specs.block_size = AES_BLOCK_SIZE; 02099 ssl->specs.iv_size = AES_IV_SIZE; 02100 02101 ssl->options.usingAnon_cipher = 1; 02102 break; 02103 #endif 02104 02105 #ifdef BUILD_SSL_RSA_WITH_IDEA_CBC_SHA 02106 case SSL_RSA_WITH_IDEA_CBC_SHA : 02107 ssl->specs.bulk_cipher_algorithm = wolfssl_idea; 02108 ssl->specs.cipher_type = block; 02109 ssl->specs.mac_algorithm = sha_mac; 02110 ssl->specs.kea = rsa_kea; 02111 ssl->specs.sig_algo = rsa_sa_algo; 02112 ssl->specs.hash_size = WC_SHA_DIGEST_SIZE; 02113 ssl->specs.pad_size = PAD_SHA; 02114 ssl->specs.static_ecdh = 0; 02115 ssl->specs.key_size = IDEA_KEY_SIZE; 02116 ssl->specs.block_size = IDEA_BLOCK_SIZE; 02117 ssl->specs.iv_size = IDEA_IV_SIZE; 02118 02119 break; 02120 #endif 02121 02122 #ifdef BUILD_WDM_WITH_NULL_SHA256 02123 case WDM_WITH_NULL_SHA256 : 02124 ssl->specs.bulk_cipher_algorithm = wolfssl_cipher_null; 02125 ssl->specs.cipher_type = stream; 02126 ssl->specs.mac_algorithm = sha256_mac; 02127 ssl->specs.kea = no_kea; 02128 ssl->specs.sig_algo = anonymous_sa_algo; 02129 ssl->specs.hash_size = WC_SHA256_DIGEST_SIZE; 02130 ssl->specs.pad_size = PAD_SHA; 02131 02132 break; 02133 #endif 02134 02135 default: 02136 WOLFSSL_MSG("Unsupported cipher suite, SetCipherSpecs"); 02137 return UNSUPPORTED_SUITE; 02138 } /* switch */ 02139 } /* if ECC / Normal suites else */ 02140 02141 /* set TLS if it hasn't been turned off */ 02142 if (ssl->version.major == 3 && ssl->version.minor >= 1) { 02143 #ifndef NO_TLS 02144 ssl->options.tls = 1; 02145 #ifndef WOLFSSL_NO_TLS12 02146 ssl->hmac = TLS_hmac; 02147 #endif 02148 if (ssl->version.minor >= 2) { 02149 ssl->options.tls1_1 = 1; 02150 if (ssl->version.minor >= 4) 02151 ssl->options.tls1_3 = 1; 02152 } 02153 #endif 02154 } 02155 02156 #ifdef WOLFSSL_DTLS 02157 if (ssl->options.dtls) 02158 ssl->hmac = TLS_hmac; 02159 #endif 02160 02161 return 0; 02162 } 02163 02164 02165 enum KeyStuff { 02166 MASTER_ROUNDS = 3, 02167 PREFIX = 3, /* up to three letters for master prefix */ 02168 KEY_PREFIX = 9 /* up to 9 prefix letters for key rounds */ 02169 02170 02171 }; 02172 02173 #ifndef NO_OLD_TLS 02174 /* true or false, zero for error */ 02175 static int SetPrefix(byte* sha_input, int idx) 02176 { 02177 switch (idx) { 02178 case 0: 02179 XMEMCPY(sha_input, "A", 1); 02180 break; 02181 case 1: 02182 XMEMCPY(sha_input, "BB", 2); 02183 break; 02184 case 2: 02185 XMEMCPY(sha_input, "CCC", 3); 02186 break; 02187 case 3: 02188 XMEMCPY(sha_input, "DDDD", 4); 02189 break; 02190 case 4: 02191 XMEMCPY(sha_input, "EEEEE", 5); 02192 break; 02193 case 5: 02194 XMEMCPY(sha_input, "FFFFFF", 6); 02195 break; 02196 case 6: 02197 XMEMCPY(sha_input, "GGGGGGG", 7); 02198 break; 02199 case 7: 02200 XMEMCPY(sha_input, "HHHHHHHH", 8); 02201 break; 02202 case 8: 02203 XMEMCPY(sha_input, "IIIIIIIII", 9); 02204 break; 02205 default: 02206 WOLFSSL_MSG("Set Prefix error, bad input"); 02207 return 0; 02208 } 02209 return 1; 02210 } 02211 #endif 02212 02213 02214 static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs, 02215 int side, void* heap, int devId) 02216 { 02217 #ifdef BUILD_ARC4 02218 word32 sz = specs->key_size; 02219 if (specs->bulk_cipher_algorithm == wolfssl_rc4) { 02220 if (enc && enc->arc4 == NULL) 02221 enc->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER); 02222 if (enc && enc->arc4 == NULL) 02223 return MEMORY_E; 02224 if (dec && dec->arc4 == NULL) 02225 dec->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER); 02226 if (dec && dec->arc4 == NULL) 02227 return MEMORY_E; 02228 02229 if (enc) { 02230 if (wc_Arc4Init(enc->arc4, heap, devId) != 0) { 02231 WOLFSSL_MSG("Arc4Init failed in SetKeys"); 02232 return ASYNC_INIT_E; 02233 } 02234 } 02235 if (dec) { 02236 if (wc_Arc4Init(dec->arc4, heap, devId) != 0) { 02237 WOLFSSL_MSG("Arc4Init failed in SetKeys"); 02238 return ASYNC_INIT_E; 02239 } 02240 } 02241 02242 if (side == WOLFSSL_CLIENT_END) { 02243 if (enc) 02244 wc_Arc4SetKey(enc->arc4, keys->client_write_key, sz); 02245 if (dec) 02246 wc_Arc4SetKey(dec->arc4, keys->server_write_key, sz); 02247 } 02248 else { 02249 if (enc) 02250 wc_Arc4SetKey(enc->arc4, keys->server_write_key, sz); 02251 if (dec) 02252 wc_Arc4SetKey(dec->arc4, keys->client_write_key, sz); 02253 } 02254 if (enc) 02255 enc->setup = 1; 02256 if (dec) 02257 dec->setup = 1; 02258 } 02259 #endif /* BUILD_ARC4 */ 02260 02261 02262 #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) 02263 /* Check that the max implicit iv size is suffecient */ 02264 #if (AEAD_MAX_IMP_SZ < 12) /* CHACHA20_IMP_IV_SZ */ 02265 #error AEAD_MAX_IMP_SZ is too small for ChaCha20 02266 #endif 02267 #if (MAX_WRITE_IV_SZ < 12) /* CHACHA20_IMP_IV_SZ */ 02268 #error MAX_WRITE_IV_SZ is too small for ChaCha20 02269 #endif 02270 02271 if (specs->bulk_cipher_algorithm == wolfssl_chacha) { 02272 int chachaRet; 02273 if (enc && enc->chacha == NULL) 02274 enc->chacha = 02275 (ChaCha*)XMALLOC(sizeof(ChaCha), heap, DYNAMIC_TYPE_CIPHER); 02276 if (enc && enc->chacha == NULL) 02277 return MEMORY_E; 02278 if (dec && dec->chacha == NULL) 02279 dec->chacha = 02280 (ChaCha*)XMALLOC(sizeof(ChaCha), heap, DYNAMIC_TYPE_CIPHER); 02281 if (dec && dec->chacha == NULL) 02282 return MEMORY_E; 02283 if (side == WOLFSSL_CLIENT_END) { 02284 if (enc) { 02285 chachaRet = wc_Chacha_SetKey(enc->chacha, keys->client_write_key, 02286 specs->key_size); 02287 XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, 02288 CHACHA20_IMP_IV_SZ); 02289 if (chachaRet != 0) return chachaRet; 02290 } 02291 if (dec) { 02292 chachaRet = wc_Chacha_SetKey(dec->chacha, keys->server_write_key, 02293 specs->key_size); 02294 XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, 02295 CHACHA20_IMP_IV_SZ); 02296 if (chachaRet != 0) return chachaRet; 02297 } 02298 } 02299 else { 02300 if (enc) { 02301 chachaRet = wc_Chacha_SetKey(enc->chacha, keys->server_write_key, 02302 specs->key_size); 02303 XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, 02304 CHACHA20_IMP_IV_SZ); 02305 if (chachaRet != 0) return chachaRet; 02306 } 02307 if (dec) { 02308 chachaRet = wc_Chacha_SetKey(dec->chacha, keys->client_write_key, 02309 specs->key_size); 02310 XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, 02311 CHACHA20_IMP_IV_SZ); 02312 if (chachaRet != 0) return chachaRet; 02313 } 02314 } 02315 02316 if (enc) 02317 enc->setup = 1; 02318 if (dec) 02319 dec->setup = 1; 02320 } 02321 #endif /* HAVE_CHACHA && HAVE_POLY1305 */ 02322 02323 02324 #ifdef HAVE_HC128 02325 /* check that buffer sizes are sufficient */ 02326 #if (MAX_WRITE_IV_SZ < 16) /* HC_128_IV_SIZE */ 02327 #error MAX_WRITE_IV_SZ too small for HC128 02328 #endif 02329 02330 if (specs->bulk_cipher_algorithm == wolfssl_hc128) { 02331 int hcRet; 02332 if (enc && enc->hc128 == NULL) 02333 enc->hc128 = 02334 (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER); 02335 if (enc && enc->hc128 == NULL) 02336 return MEMORY_E; 02337 if (dec && dec->hc128 == NULL) 02338 dec->hc128 = 02339 (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER); 02340 if (dec && dec->hc128 == NULL) 02341 return MEMORY_E; 02342 if (side == WOLFSSL_CLIENT_END) { 02343 if (enc) { 02344 hcRet = wc_Hc128_SetKey(enc->hc128, keys->client_write_key, 02345 keys->client_write_IV); 02346 if (hcRet != 0) return hcRet; 02347 } 02348 if (dec) { 02349 hcRet = wc_Hc128_SetKey(dec->hc128, keys->server_write_key, 02350 keys->server_write_IV); 02351 if (hcRet != 0) return hcRet; 02352 } 02353 } 02354 else { 02355 if (enc) { 02356 hcRet = wc_Hc128_SetKey(enc->hc128, keys->server_write_key, 02357 keys->server_write_IV); 02358 if (hcRet != 0) return hcRet; 02359 } 02360 if (dec) { 02361 hcRet = wc_Hc128_SetKey(dec->hc128, keys->client_write_key, 02362 keys->client_write_IV); 02363 if (hcRet != 0) return hcRet; 02364 } 02365 } 02366 if (enc) 02367 enc->setup = 1; 02368 if (dec) 02369 dec->setup = 1; 02370 } 02371 #endif /* HAVE_HC128 */ 02372 02373 #ifdef BUILD_RABBIT 02374 /* check that buffer sizes are sufficient */ 02375 #if (MAX_WRITE_IV_SZ < 8) /* RABBIT_IV_SIZE */ 02376 #error MAX_WRITE_IV_SZ too small for RABBIT 02377 #endif 02378 02379 if (specs->bulk_cipher_algorithm == wolfssl_rabbit) { 02380 int rabRet; 02381 if (enc && enc->rabbit == NULL) 02382 enc->rabbit = 02383 (Rabbit*)XMALLOC(sizeof(Rabbit), heap, DYNAMIC_TYPE_CIPHER); 02384 if (enc && enc->rabbit == NULL) 02385 return MEMORY_E; 02386 if (dec && dec->rabbit == NULL) 02387 dec->rabbit = 02388 (Rabbit*)XMALLOC(sizeof(Rabbit), heap, DYNAMIC_TYPE_CIPHER); 02389 if (dec && dec->rabbit == NULL) 02390 return MEMORY_E; 02391 if (side == WOLFSSL_CLIENT_END) { 02392 if (enc) { 02393 rabRet = wc_RabbitSetKey(enc->rabbit, keys->client_write_key, 02394 keys->client_write_IV); 02395 if (rabRet != 0) return rabRet; 02396 } 02397 if (dec) { 02398 rabRet = wc_RabbitSetKey(dec->rabbit, keys->server_write_key, 02399 keys->server_write_IV); 02400 if (rabRet != 0) return rabRet; 02401 } 02402 } 02403 else { 02404 if (enc) { 02405 rabRet = wc_RabbitSetKey(enc->rabbit, keys->server_write_key, 02406 keys->server_write_IV); 02407 if (rabRet != 0) return rabRet; 02408 } 02409 if (dec) { 02410 rabRet = wc_RabbitSetKey(dec->rabbit, keys->client_write_key, 02411 keys->client_write_IV); 02412 if (rabRet != 0) return rabRet; 02413 } 02414 } 02415 if (enc) 02416 enc->setup = 1; 02417 if (dec) 02418 dec->setup = 1; 02419 } 02420 #endif /* BUILD_RABBIT */ 02421 02422 #ifdef BUILD_DES3 02423 /* check that buffer sizes are sufficient */ 02424 #if (MAX_WRITE_IV_SZ < 8) /* DES_IV_SIZE */ 02425 #error MAX_WRITE_IV_SZ too small for 3DES 02426 #endif 02427 02428 if (specs->bulk_cipher_algorithm == wolfssl_triple_des) { 02429 int desRet = 0; 02430 02431 if (enc) { 02432 if (enc->des3 == NULL) 02433 enc->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER); 02434 if (enc->des3 == NULL) 02435 return MEMORY_E; 02436 XMEMSET(enc->des3, 0, sizeof(Des3)); 02437 } 02438 if (dec) { 02439 if (dec->des3 == NULL) 02440 dec->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER); 02441 if (dec->des3 == NULL) 02442 return MEMORY_E; 02443 XMEMSET(dec->des3, 0, sizeof(Des3)); 02444 } 02445 02446 if (enc) { 02447 if (wc_Des3Init(enc->des3, heap, devId) != 0) { 02448 WOLFSSL_MSG("Des3Init failed in SetKeys"); 02449 return ASYNC_INIT_E; 02450 } 02451 } 02452 if (dec) { 02453 if (wc_Des3Init(dec->des3, heap, devId) != 0) { 02454 WOLFSSL_MSG("Des3Init failed in SetKeys"); 02455 return ASYNC_INIT_E; 02456 } 02457 } 02458 02459 if (side == WOLFSSL_CLIENT_END) { 02460 if (enc) { 02461 desRet = wc_Des3_SetKey(enc->des3, keys->client_write_key, 02462 keys->client_write_IV, DES_ENCRYPTION); 02463 if (desRet != 0) return desRet; 02464 } 02465 if (dec) { 02466 desRet = wc_Des3_SetKey(dec->des3, keys->server_write_key, 02467 keys->server_write_IV, DES_DECRYPTION); 02468 if (desRet != 0) return desRet; 02469 } 02470 } 02471 else { 02472 if (enc) { 02473 desRet = wc_Des3_SetKey(enc->des3, keys->server_write_key, 02474 keys->server_write_IV, DES_ENCRYPTION); 02475 if (desRet != 0) return desRet; 02476 } 02477 if (dec) { 02478 desRet = wc_Des3_SetKey(dec->des3, keys->client_write_key, 02479 keys->client_write_IV, DES_DECRYPTION); 02480 if (desRet != 0) return desRet; 02481 } 02482 } 02483 if (enc) 02484 enc->setup = 1; 02485 if (dec) 02486 dec->setup = 1; 02487 } 02488 #endif /* BUILD_DES3 */ 02489 02490 #ifdef BUILD_AES 02491 /* check that buffer sizes are sufficient */ 02492 #if (MAX_WRITE_IV_SZ < 16) /* AES_IV_SIZE */ 02493 #error MAX_WRITE_IV_SZ too small for AES 02494 #endif 02495 02496 if (specs->bulk_cipher_algorithm == wolfssl_aes) { 02497 int aesRet = 0; 02498 02499 if (enc) { 02500 if (enc->aes == NULL) 02501 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02502 if (enc->aes == NULL) 02503 return MEMORY_E; 02504 XMEMSET(enc->aes, 0, sizeof(Aes)); 02505 } 02506 if (dec) { 02507 if (dec->aes == NULL) 02508 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02509 if (dec->aes == NULL) 02510 return MEMORY_E; 02511 XMEMSET(dec->aes, 0, sizeof(Aes)); 02512 } 02513 if (enc) { 02514 if (wc_AesInit(enc->aes, heap, devId) != 0) { 02515 WOLFSSL_MSG("AesInit failed in SetKeys"); 02516 return ASYNC_INIT_E; 02517 } 02518 } 02519 if (dec) { 02520 if (wc_AesInit(dec->aes, heap, devId) != 0) { 02521 WOLFSSL_MSG("AesInit failed in SetKeys"); 02522 return ASYNC_INIT_E; 02523 } 02524 } 02525 02526 if (side == WOLFSSL_CLIENT_END) { 02527 if (enc) { 02528 aesRet = wc_AesSetKey(enc->aes, keys->client_write_key, 02529 specs->key_size, keys->client_write_IV, 02530 AES_ENCRYPTION); 02531 if (aesRet != 0) return aesRet; 02532 } 02533 if (dec) { 02534 aesRet = wc_AesSetKey(dec->aes, keys->server_write_key, 02535 specs->key_size, keys->server_write_IV, 02536 AES_DECRYPTION); 02537 if (aesRet != 0) return aesRet; 02538 } 02539 } 02540 else { 02541 if (enc) { 02542 aesRet = wc_AesSetKey(enc->aes, keys->server_write_key, 02543 specs->key_size, keys->server_write_IV, 02544 AES_ENCRYPTION); 02545 if (aesRet != 0) return aesRet; 02546 } 02547 if (dec) { 02548 aesRet = wc_AesSetKey(dec->aes, keys->client_write_key, 02549 specs->key_size, keys->client_write_IV, 02550 AES_DECRYPTION); 02551 if (aesRet != 0) return aesRet; 02552 } 02553 } 02554 if (enc) 02555 enc->setup = 1; 02556 if (dec) 02557 dec->setup = 1; 02558 } 02559 #endif /* BUILD_AES */ 02560 02561 #ifdef BUILD_AESGCM 02562 /* check that buffer sizes are sufficient */ 02563 #if (AEAD_MAX_IMP_SZ < 4) /* AESGCM_IMP_IV_SZ */ 02564 #error AEAD_MAX_IMP_SZ too small for AESGCM 02565 #endif 02566 #if (AEAD_MAX_EXP_SZ < 8) /* AESGCM_EXP_IV_SZ */ 02567 #error AEAD_MAX_EXP_SZ too small for AESGCM 02568 #endif 02569 #if (MAX_WRITE_IV_SZ < 4) /* AESGCM_IMP_IV_SZ */ 02570 #error MAX_WRITE_IV_SZ too small for AESGCM 02571 #endif 02572 02573 if (specs->bulk_cipher_algorithm == wolfssl_aes_gcm) { 02574 int gcmRet; 02575 02576 if (enc) { 02577 if (enc->aes == NULL) 02578 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02579 if (enc->aes == NULL) 02580 return MEMORY_E; 02581 XMEMSET(enc->aes, 0, sizeof(Aes)); 02582 } 02583 if (dec) { 02584 if (dec->aes == NULL) 02585 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02586 if (dec->aes == NULL) 02587 return MEMORY_E; 02588 XMEMSET(dec->aes, 0, sizeof(Aes)); 02589 } 02590 02591 if (enc) { 02592 if (wc_AesInit(enc->aes, heap, devId) != 0) { 02593 WOLFSSL_MSG("AesInit failed in SetKeys"); 02594 return ASYNC_INIT_E; 02595 } 02596 } 02597 if (dec) { 02598 if (wc_AesInit(dec->aes, heap, devId) != 0) { 02599 WOLFSSL_MSG("AesInit failed in SetKeys"); 02600 return ASYNC_INIT_E; 02601 } 02602 } 02603 02604 if (side == WOLFSSL_CLIENT_END) { 02605 if (enc) { 02606 gcmRet = wc_AesGcmSetKey(enc->aes, keys->client_write_key, 02607 specs->key_size); 02608 if (gcmRet != 0) return gcmRet; 02609 XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, 02610 AEAD_MAX_IMP_SZ); 02611 } 02612 if (dec) { 02613 gcmRet = wc_AesGcmSetKey(dec->aes, keys->server_write_key, 02614 specs->key_size); 02615 if (gcmRet != 0) return gcmRet; 02616 XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, 02617 AEAD_MAX_IMP_SZ); 02618 } 02619 } 02620 else { 02621 if (enc) { 02622 gcmRet = wc_AesGcmSetKey(enc->aes, keys->server_write_key, 02623 specs->key_size); 02624 if (gcmRet != 0) return gcmRet; 02625 XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, 02626 AEAD_MAX_IMP_SZ); 02627 } 02628 if (dec) { 02629 gcmRet = wc_AesGcmSetKey(dec->aes, keys->client_write_key, 02630 specs->key_size); 02631 if (gcmRet != 0) return gcmRet; 02632 XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, 02633 AEAD_MAX_IMP_SZ); 02634 } 02635 } 02636 if (enc) 02637 enc->setup = 1; 02638 if (dec) 02639 dec->setup = 1; 02640 } 02641 #endif /* BUILD_AESGCM */ 02642 02643 #ifdef HAVE_AESCCM 02644 /* check that buffer sizes are sufficient (CCM is same size as GCM) */ 02645 #if (AEAD_MAX_IMP_SZ < 4) /* AESGCM_IMP_IV_SZ */ 02646 #error AEAD_MAX_IMP_SZ too small for AESCCM 02647 #endif 02648 #if (AEAD_MAX_EXP_SZ < 8) /* AESGCM_EXP_IV_SZ */ 02649 #error AEAD_MAX_EXP_SZ too small for AESCCM 02650 #endif 02651 #if (MAX_WRITE_IV_SZ < 4) /* AESGCM_IMP_IV_SZ */ 02652 #error MAX_WRITE_IV_SZ too small for AESCCM 02653 #endif 02654 02655 if (specs->bulk_cipher_algorithm == wolfssl_aes_ccm) { 02656 int CcmRet; 02657 02658 if (enc) { 02659 if (enc->aes == NULL) 02660 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02661 if (enc->aes == NULL) 02662 return MEMORY_E; 02663 XMEMSET(enc->aes, 0, sizeof(Aes)); 02664 } 02665 if (dec) { 02666 if (dec->aes == NULL) 02667 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 02668 if (dec->aes == NULL) 02669 return MEMORY_E; 02670 XMEMSET(dec->aes, 0, sizeof(Aes)); 02671 } 02672 02673 if (enc) { 02674 if (wc_AesInit(enc->aes, heap, devId) != 0) { 02675 WOLFSSL_MSG("AesInit failed in SetKeys"); 02676 return ASYNC_INIT_E; 02677 } 02678 } 02679 if (dec) { 02680 if (wc_AesInit(dec->aes, heap, devId) != 0) { 02681 WOLFSSL_MSG("AesInit failed in SetKeys"); 02682 return ASYNC_INIT_E; 02683 } 02684 } 02685 02686 if (side == WOLFSSL_CLIENT_END) { 02687 if (enc) { 02688 CcmRet = wc_AesCcmSetKey(enc->aes, keys->client_write_key, 02689 specs->key_size); 02690 if (CcmRet != 0) { 02691 return CcmRet; 02692 } 02693 XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, 02694 AEAD_MAX_IMP_SZ); 02695 } 02696 if (dec) { 02697 CcmRet = wc_AesCcmSetKey(dec->aes, keys->server_write_key, 02698 specs->key_size); 02699 if (CcmRet != 0) { 02700 return CcmRet; 02701 } 02702 XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, 02703 AEAD_MAX_IMP_SZ); 02704 } 02705 } 02706 else { 02707 if (enc) { 02708 CcmRet = wc_AesCcmSetKey(enc->aes, keys->server_write_key, 02709 specs->key_size); 02710 if (CcmRet != 0) { 02711 return CcmRet; 02712 } 02713 XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, 02714 AEAD_MAX_IMP_SZ); 02715 } 02716 if (dec) { 02717 CcmRet = wc_AesCcmSetKey(dec->aes, keys->client_write_key, 02718 specs->key_size); 02719 if (CcmRet != 0) { 02720 return CcmRet; 02721 } 02722 XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, 02723 AEAD_MAX_IMP_SZ); 02724 } 02725 } 02726 if (enc) 02727 enc->setup = 1; 02728 if (dec) 02729 dec->setup = 1; 02730 } 02731 #endif /* HAVE_AESCCM */ 02732 02733 #ifdef HAVE_CAMELLIA 02734 /* check that buffer sizes are sufficient */ 02735 #if (MAX_WRITE_IV_SZ < 16) /* CAMELLIA_IV_SIZE */ 02736 #error MAX_WRITE_IV_SZ too small for CAMELLIA 02737 #endif 02738 02739 if (specs->bulk_cipher_algorithm == wolfssl_camellia) { 02740 int camRet; 02741 02742 if (enc && enc->cam == NULL) 02743 enc->cam = 02744 (Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER); 02745 if (enc && enc->cam == NULL) 02746 return MEMORY_E; 02747 02748 if (dec && dec->cam == NULL) 02749 dec->cam = 02750 (Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER); 02751 if (dec && dec->cam == NULL) 02752 return MEMORY_E; 02753 02754 if (side == WOLFSSL_CLIENT_END) { 02755 if (enc) { 02756 camRet = wc_CamelliaSetKey(enc->cam, keys->client_write_key, 02757 specs->key_size, keys->client_write_IV); 02758 if (camRet != 0) return camRet; 02759 } 02760 if (dec) { 02761 camRet = wc_CamelliaSetKey(dec->cam, keys->server_write_key, 02762 specs->key_size, keys->server_write_IV); 02763 if (camRet != 0) return camRet; 02764 } 02765 } 02766 else { 02767 if (enc) { 02768 camRet = wc_CamelliaSetKey(enc->cam, keys->server_write_key, 02769 specs->key_size, keys->server_write_IV); 02770 if (camRet != 0) return camRet; 02771 } 02772 if (dec) { 02773 camRet = wc_CamelliaSetKey(dec->cam, keys->client_write_key, 02774 specs->key_size, keys->client_write_IV); 02775 if (camRet != 0) return camRet; 02776 } 02777 } 02778 if (enc) 02779 enc->setup = 1; 02780 if (dec) 02781 dec->setup = 1; 02782 } 02783 #endif /* HAVE_CAMELLIA */ 02784 02785 #ifdef HAVE_IDEA 02786 /* check that buffer sizes are sufficient */ 02787 #if (MAX_WRITE_IV_SZ < 8) /* IDEA_IV_SIZE */ 02788 #error MAX_WRITE_IV_SZ too small for IDEA 02789 #endif 02790 02791 if (specs->bulk_cipher_algorithm == wolfssl_idea) { 02792 int ideaRet; 02793 02794 if (enc && enc->idea == NULL) 02795 enc->idea = (Idea*)XMALLOC(sizeof(Idea), heap, DYNAMIC_TYPE_CIPHER); 02796 if (enc && enc->idea == NULL) 02797 return MEMORY_E; 02798 02799 if (dec && dec->idea == NULL) 02800 dec->idea = (Idea*)XMALLOC(sizeof(Idea), heap, DYNAMIC_TYPE_CIPHER); 02801 if (dec && dec->idea == NULL) 02802 return MEMORY_E; 02803 02804 if (side == WOLFSSL_CLIENT_END) { 02805 if (enc) { 02806 ideaRet = wc_IdeaSetKey(enc->idea, keys->client_write_key, 02807 specs->key_size, keys->client_write_IV, 02808 IDEA_ENCRYPTION); 02809 if (ideaRet != 0) return ideaRet; 02810 } 02811 if (dec) { 02812 ideaRet = wc_IdeaSetKey(dec->idea, keys->server_write_key, 02813 specs->key_size, keys->server_write_IV, 02814 IDEA_DECRYPTION); 02815 if (ideaRet != 0) return ideaRet; 02816 } 02817 } 02818 else { 02819 if (enc) { 02820 ideaRet = wc_IdeaSetKey(enc->idea, keys->server_write_key, 02821 specs->key_size, keys->server_write_IV, 02822 IDEA_ENCRYPTION); 02823 if (ideaRet != 0) return ideaRet; 02824 } 02825 if (dec) { 02826 ideaRet = wc_IdeaSetKey(dec->idea, keys->client_write_key, 02827 specs->key_size, keys->client_write_IV, 02828 IDEA_DECRYPTION); 02829 if (ideaRet != 0) return ideaRet; 02830 } 02831 } 02832 if (enc) 02833 enc->setup = 1; 02834 if (dec) 02835 dec->setup = 1; 02836 } 02837 #endif /* HAVE_IDEA */ 02838 02839 #ifdef HAVE_NULL_CIPHER 02840 if (specs->bulk_cipher_algorithm == wolfssl_cipher_null) { 02841 if (enc) 02842 enc->setup = 1; 02843 if (dec) 02844 dec->setup = 1; 02845 } 02846 #endif 02847 02848 if (enc) { 02849 keys->sequence_number_hi = 0; 02850 keys->sequence_number_lo = 0; 02851 } 02852 if (dec) { 02853 keys->peer_sequence_number_hi = 0; 02854 keys->peer_sequence_number_lo = 0; 02855 } 02856 (void)side; 02857 (void)heap; 02858 (void)enc; 02859 (void)dec; 02860 (void)specs; 02861 (void)devId; 02862 02863 return 0; 02864 } 02865 02866 02867 #ifdef HAVE_ONE_TIME_AUTH 02868 /* set one time authentication keys */ 02869 static int SetAuthKeys(OneTimeAuth* authentication, Keys* keys, 02870 CipherSpecs* specs, void* heap, int devId) 02871 { 02872 02873 #ifdef HAVE_POLY1305 02874 /* set up memory space for poly1305 */ 02875 if (authentication && authentication->poly1305 == NULL) 02876 authentication->poly1305 = 02877 (Poly1305*)XMALLOC(sizeof(Poly1305), heap, DYNAMIC_TYPE_CIPHER); 02878 if (authentication && authentication->poly1305 == NULL) 02879 return MEMORY_E; 02880 if (authentication) 02881 authentication->setup = 1; 02882 #endif 02883 (void)authentication; 02884 (void)heap; 02885 (void)keys; 02886 (void)specs; 02887 (void)devId; 02888 02889 return 0; 02890 } 02891 #endif /* HAVE_ONE_TIME_AUTH */ 02892 02893 #ifdef HAVE_SECURE_RENEGOTIATION 02894 /* function name is for cache_status++ 02895 * This function was added because of error incrementing enum type when 02896 * compiling with a C++ compiler. 02897 */ 02898 static void CacheStatusPP(SecureRenegotiation* cache) 02899 { 02900 switch (cache->cache_status) { 02901 case SCR_CACHE_NULL: 02902 cache->cache_status = SCR_CACHE_NEEDED; 02903 break; 02904 02905 case SCR_CACHE_NEEDED: 02906 cache->cache_status = SCR_CACHE_COPY; 02907 break; 02908 02909 case SCR_CACHE_COPY: 02910 cache->cache_status = SCR_CACHE_PARTIAL; 02911 break; 02912 02913 case SCR_CACHE_PARTIAL: 02914 cache->cache_status = SCR_CACHE_COMPLETE; 02915 break; 02916 02917 case SCR_CACHE_COMPLETE: 02918 WOLFSSL_MSG("SCR Cache state Complete"); 02919 break; 02920 02921 default: 02922 WOLFSSL_MSG("Unknown cache state!!"); 02923 } 02924 } 02925 #endif /* HAVE_SECURE_RENEGOTIATION */ 02926 02927 02928 /* Set wc_encrypt/wc_decrypt or both sides of key setup 02929 * note: use wc_encrypt to avoid shadowing global encrypt 02930 * declared in unistd.h 02931 */ 02932 int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side) 02933 { 02934 int devId = INVALID_DEVID, ret, copy = 0; 02935 Ciphers* wc_encrypt = NULL; 02936 Ciphers* wc_decrypt = NULL; 02937 Keys* keys = &ssl->keys; 02938 02939 (void)copy; 02940 02941 #ifdef WOLFSSL_ASYNC_CRYPT 02942 devId = ssl->devId; 02943 #endif 02944 02945 #ifdef HAVE_SECURE_RENEGOTIATION 02946 if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status) { 02947 keys = &ssl->secure_renegotiation->tmp_keys; 02948 copy = 1; 02949 } 02950 #endif /* HAVE_SECURE_RENEGOTIATION */ 02951 02952 switch (side) { 02953 case ENCRYPT_SIDE_ONLY: 02954 #ifdef WOLFSSL_DEBUG_TLS 02955 WOLFSSL_MSG("Provisioning ENCRYPT key"); 02956 if (ssl->options.side == WOLFSSL_CLIENT_END) { 02957 WOLFSSL_BUFFER(ssl->keys.client_write_key, AES_256_KEY_SIZE); 02958 } 02959 else { 02960 WOLFSSL_BUFFER(ssl->keys.server_write_key, AES_256_KEY_SIZE); 02961 } 02962 #endif 02963 wc_encrypt = &ssl->encrypt; 02964 break; 02965 02966 case DECRYPT_SIDE_ONLY: 02967 #ifdef WOLFSSL_DEBUG_TLS 02968 WOLFSSL_MSG("Provisioning DECRYPT key"); 02969 if (ssl->options.side == WOLFSSL_CLIENT_END) { 02970 WOLFSSL_BUFFER(ssl->keys.server_write_key, AES_256_KEY_SIZE); 02971 } 02972 else { 02973 WOLFSSL_BUFFER(ssl->keys.client_write_key, AES_256_KEY_SIZE); 02974 } 02975 #endif 02976 wc_decrypt = &ssl->decrypt; 02977 break; 02978 02979 case ENCRYPT_AND_DECRYPT_SIDE: 02980 #ifdef WOLFSSL_DEBUG_TLS 02981 WOLFSSL_MSG("Provisioning ENCRYPT key"); 02982 if (ssl->options.side == WOLFSSL_CLIENT_END) { 02983 WOLFSSL_BUFFER(ssl->keys.client_write_key, AES_256_KEY_SIZE); 02984 } 02985 else { 02986 WOLFSSL_BUFFER(ssl->keys.server_write_key, AES_256_KEY_SIZE); 02987 } 02988 WOLFSSL_MSG("Provisioning DECRYPT key"); 02989 if (ssl->options.side == WOLFSSL_CLIENT_END) { 02990 WOLFSSL_BUFFER(ssl->keys.server_write_key, AES_256_KEY_SIZE); 02991 } 02992 else { 02993 WOLFSSL_BUFFER(ssl->keys.client_write_key, AES_256_KEY_SIZE); 02994 } 02995 #endif 02996 wc_encrypt = &ssl->encrypt; 02997 wc_decrypt = &ssl->decrypt; 02998 break; 02999 03000 default: 03001 return BAD_FUNC_ARG; 03002 } 03003 03004 #ifdef HAVE_ONE_TIME_AUTH 03005 if (!ssl->auth.setup && ssl->specs.bulk_cipher_algorithm == wolfssl_chacha){ 03006 ret = SetAuthKeys(&ssl->auth, keys, &ssl->specs, ssl->heap, devId); 03007 if (ret != 0) 03008 return ret; 03009 } 03010 #endif 03011 03012 ret = SetKeys(wc_encrypt, wc_decrypt, keys, &ssl->specs, ssl->options.side, 03013 ssl->heap, devId); 03014 03015 #ifdef HAVE_SECURE_RENEGOTIATION 03016 if (copy) { 03017 int clientCopy = 0; 03018 03019 if (ssl->options.side == WOLFSSL_CLIENT_END && wc_encrypt) 03020 clientCopy = 1; 03021 else if (ssl->options.side == WOLFSSL_SERVER_END && wc_decrypt) 03022 clientCopy = 1; 03023 03024 if (clientCopy) { 03025 XMEMCPY(ssl->keys.client_write_MAC_secret, 03026 keys->client_write_MAC_secret, WC_MAX_DIGEST_SIZE); 03027 XMEMCPY(ssl->keys.client_write_key, 03028 keys->client_write_key, AES_256_KEY_SIZE); 03029 XMEMCPY(ssl->keys.client_write_IV, 03030 keys->client_write_IV, MAX_WRITE_IV_SZ); 03031 } else { 03032 XMEMCPY(ssl->keys.server_write_MAC_secret, 03033 keys->server_write_MAC_secret, WC_MAX_DIGEST_SIZE); 03034 XMEMCPY(ssl->keys.server_write_key, 03035 keys->server_write_key, AES_256_KEY_SIZE); 03036 XMEMCPY(ssl->keys.server_write_IV, 03037 keys->server_write_IV, MAX_WRITE_IV_SZ); 03038 } 03039 if (wc_encrypt) { 03040 ssl->keys.sequence_number_hi = keys->sequence_number_hi; 03041 ssl->keys.sequence_number_lo = keys->sequence_number_lo; 03042 #ifdef HAVE_AEAD 03043 if (ssl->specs.cipher_type == aead) { 03044 /* Initialize the AES-GCM/CCM explicit IV to a zero. */ 03045 XMEMCPY(ssl->keys.aead_exp_IV, keys->aead_exp_IV, 03046 AEAD_MAX_EXP_SZ); 03047 03048 /* Initialize encrypt implicit IV by encrypt side */ 03049 if (ssl->options.side == WOLFSSL_CLIENT_END) { 03050 XMEMCPY(ssl->keys.aead_enc_imp_IV, 03051 keys->client_write_IV, AEAD_MAX_IMP_SZ); 03052 } else { 03053 XMEMCPY(ssl->keys.aead_enc_imp_IV, 03054 keys->server_write_IV, AEAD_MAX_IMP_SZ); 03055 } 03056 } 03057 #endif 03058 } 03059 if (wc_decrypt) { 03060 ssl->keys.peer_sequence_number_hi = keys->peer_sequence_number_hi; 03061 ssl->keys.peer_sequence_number_lo = keys->peer_sequence_number_lo; 03062 #ifdef HAVE_AEAD 03063 if (ssl->specs.cipher_type == aead) { 03064 /* Initialize decrypt implicit IV by decrypt side */ 03065 if (ssl->options.side == WOLFSSL_SERVER_END) { 03066 XMEMCPY(ssl->keys.aead_dec_imp_IV, 03067 keys->client_write_IV, AEAD_MAX_IMP_SZ); 03068 } else { 03069 XMEMCPY(ssl->keys.aead_dec_imp_IV, 03070 keys->server_write_IV, AEAD_MAX_IMP_SZ); 03071 } 03072 } 03073 #endif 03074 } 03075 CacheStatusPP(ssl->secure_renegotiation); 03076 } 03077 #endif /* HAVE_SECURE_RENEGOTIATION */ 03078 03079 return ret; 03080 } 03081 03082 03083 /* TLS can call too */ 03084 int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) 03085 { 03086 int sz, i = 0; 03087 Keys* keys = &ssl->keys; 03088 03089 #ifdef HAVE_SECURE_RENEGOTIATION 03090 if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status == 03091 SCR_CACHE_NEEDED) { 03092 keys = &ssl->secure_renegotiation->tmp_keys; 03093 CacheStatusPP(ssl->secure_renegotiation); 03094 } 03095 #endif /* HAVE_SECURE_RENEGOTIATION */ 03096 03097 #ifdef WOLFSSL_MULTICAST 03098 if (ssl->options.haveMcast) { 03099 /* Use the same keys for encrypt and decrypt. */ 03100 if (ssl->specs.cipher_type != aead) { 03101 sz = ssl->specs.hash_size; 03102 XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); 03103 XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); 03104 i += sz; 03105 } 03106 sz = ssl->specs.key_size; 03107 XMEMCPY(keys->client_write_key, &keyData[i], sz); 03108 XMEMCPY(keys->server_write_key, &keyData[i], sz); 03109 i += sz; 03110 03111 sz = ssl->specs.iv_size; 03112 XMEMCPY(keys->client_write_IV, &keyData[i], sz); 03113 XMEMCPY(keys->server_write_IV, &keyData[i], sz); 03114 03115 #ifdef HAVE_AEAD 03116 if (ssl->specs.cipher_type == aead) { 03117 /* Initialize the AES-GCM/CCM explicit IV to a zero. */ 03118 XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ); 03119 } 03120 #endif /* HAVE_AEAD */ 03121 03122 return 0; 03123 } 03124 #endif /* WOLFSSL_MULTICAST */ 03125 03126 if (ssl->specs.cipher_type != aead) { 03127 sz = ssl->specs.hash_size; 03128 if (side & PROVISION_CLIENT) { 03129 XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); 03130 i += sz; 03131 } 03132 if (side & PROVISION_SERVER) { 03133 XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); 03134 i += sz; 03135 } 03136 } 03137 sz = ssl->specs.key_size; 03138 if (side & PROVISION_CLIENT) { 03139 XMEMCPY(keys->client_write_key, &keyData[i], sz); 03140 i += sz; 03141 } 03142 if (side & PROVISION_SERVER) { 03143 XMEMCPY(keys->server_write_key, &keyData[i], sz); 03144 i += sz; 03145 } 03146 03147 sz = ssl->specs.iv_size; 03148 if (side & PROVISION_CLIENT) { 03149 XMEMCPY(keys->client_write_IV, &keyData[i], sz); 03150 i += sz; 03151 } 03152 if (side & PROVISION_SERVER) 03153 XMEMCPY(keys->server_write_IV, &keyData[i], sz); 03154 03155 #ifdef HAVE_AEAD 03156 if (ssl->specs.cipher_type == aead) { 03157 /* Initialize the AES-GCM/CCM explicit IV to a zero. */ 03158 XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ); 03159 } 03160 #endif 03161 03162 return 0; 03163 } 03164 03165 #ifndef NO_OLD_TLS 03166 int DeriveKeys(WOLFSSL* ssl) 03167 { 03168 int length = 2 * ssl->specs.hash_size + 03169 2 * ssl->specs.key_size + 03170 2 * ssl->specs.iv_size; 03171 int rounds = (length + WC_MD5_DIGEST_SIZE - 1 ) / WC_MD5_DIGEST_SIZE, i; 03172 int ret = 0; 03173 03174 #ifdef WOLFSSL_SMALL_STACK 03175 byte* shaOutput; 03176 byte* md5Input; 03177 byte* shaInput; 03178 byte* keyData; 03179 wc_Md5* md5; 03180 wc_Sha* sha; 03181 #else 03182 byte shaOutput[WC_SHA_DIGEST_SIZE]; 03183 byte md5Input[SECRET_LEN + WC_SHA_DIGEST_SIZE]; 03184 byte shaInput[KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN]; 03185 byte keyData[KEY_PREFIX * WC_MD5_DIGEST_SIZE]; 03186 wc_Md5 md5[1]; 03187 wc_Sha sha[1]; 03188 #endif 03189 03190 #ifdef WOLFSSL_SMALL_STACK 03191 shaOutput = (byte*)XMALLOC(WC_SHA_DIGEST_SIZE, 03192 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03193 md5Input = (byte*)XMALLOC(SECRET_LEN + WC_SHA_DIGEST_SIZE, 03194 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03195 shaInput = (byte*)XMALLOC(KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN, 03196 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03197 keyData = (byte*)XMALLOC(KEY_PREFIX * WC_MD5_DIGEST_SIZE, 03198 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03199 md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); 03200 sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); 03201 03202 if (shaOutput == NULL || md5Input == NULL || shaInput == NULL || 03203 keyData == NULL || md5 == NULL || sha == NULL) { 03204 if (shaOutput) XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03205 if (md5Input) XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03206 if (shaInput) XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03207 if (keyData) XFREE(keyData, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03208 if (md5) XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03209 if (sha) XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03210 03211 return MEMORY_E; 03212 } 03213 #endif 03214 03215 ret = wc_InitMd5(md5); 03216 if (ret == 0) { 03217 ret = wc_InitSha(sha); 03218 } 03219 if (ret == 0) { 03220 XMEMCPY(md5Input, ssl->arrays->masterSecret, SECRET_LEN); 03221 03222 for (i = 0; i < rounds; ++i) { 03223 int j = i + 1; 03224 int idx = j; 03225 03226 if (!SetPrefix(shaInput, i)) { 03227 ret = PREFIX_ERROR; 03228 break; 03229 } 03230 03231 XMEMCPY(shaInput + idx, ssl->arrays->masterSecret, SECRET_LEN); 03232 idx += SECRET_LEN; 03233 XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN); 03234 idx += RAN_LEN; 03235 XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN); 03236 if (ret == 0) { 03237 ret = wc_ShaUpdate(sha, shaInput, 03238 (KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN) - KEY_PREFIX + j); 03239 } 03240 if (ret == 0) { 03241 ret = wc_ShaFinal(sha, shaOutput); 03242 } 03243 03244 XMEMCPY(md5Input + SECRET_LEN, shaOutput, WC_SHA_DIGEST_SIZE); 03245 if (ret == 0) { 03246 ret = wc_Md5Update(md5, md5Input, SECRET_LEN + WC_SHA_DIGEST_SIZE); 03247 } 03248 if (ret == 0) { 03249 ret = wc_Md5Final(md5, keyData + i * WC_MD5_DIGEST_SIZE); 03250 } 03251 } 03252 03253 if (ret == 0) 03254 ret = StoreKeys(ssl, keyData, PROVISION_CLIENT_SERVER); 03255 } 03256 03257 #ifdef WOLFSSL_SMALL_STACK 03258 XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03259 XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03260 XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03261 XFREE(keyData, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03262 XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03263 XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03264 #endif 03265 03266 return ret; 03267 } 03268 03269 03270 static int CleanPreMaster(WOLFSSL* ssl) 03271 { 03272 int i, ret, sz = ssl->arrays->preMasterSz; 03273 03274 for (i = 0; i < sz; i++) 03275 ssl->arrays->preMasterSecret[i] = 0; 03276 03277 ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->preMasterSecret, sz); 03278 if (ret != 0) 03279 return ret; 03280 03281 for (i = 0; i < sz; i++) 03282 ssl->arrays->preMasterSecret[i] = 0; 03283 03284 return 0; 03285 } 03286 03287 03288 /* Create and store the master secret see page 32, 6.1 */ 03289 static int MakeSslMasterSecret(WOLFSSL* ssl) 03290 { 03291 int i, ret; 03292 word32 idx; 03293 word32 pmsSz = ssl->arrays->preMasterSz; 03294 03295 #ifdef WOLFSSL_SMALL_STACK 03296 byte* shaOutput; 03297 byte* md5Input; 03298 byte* shaInput; 03299 wc_Md5* md5; 03300 wc_Sha* sha; 03301 #else 03302 byte shaOutput[WC_SHA_DIGEST_SIZE]; 03303 byte md5Input[ENCRYPT_LEN + WC_SHA_DIGEST_SIZE]; 03304 byte shaInput[PREFIX + ENCRYPT_LEN + 2 * RAN_LEN]; 03305 wc_Md5 md5[1]; 03306 wc_Sha sha[1]; 03307 #endif 03308 03309 #ifdef SHOW_SECRETS 03310 { 03311 word32 j; 03312 printf("pre master secret: "); 03313 for (j = 0; j < pmsSz; j++) 03314 printf("%02x", ssl->arrays->preMasterSecret[j]); 03315 printf("\n"); 03316 } 03317 #endif 03318 03319 #ifdef WOLFSSL_SMALL_STACK 03320 shaOutput = (byte*)XMALLOC(WC_SHA_DIGEST_SIZE, 03321 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03322 md5Input = (byte*)XMALLOC(ENCRYPT_LEN + WC_SHA_DIGEST_SIZE, 03323 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03324 shaInput = (byte*)XMALLOC(PREFIX + ENCRYPT_LEN + 2 * RAN_LEN, 03325 NULL, DYNAMIC_TYPE_TMP_BUFFER); 03326 md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER); 03327 sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); 03328 03329 if (shaOutput == NULL || md5Input == NULL || shaInput == NULL || 03330 md5 == NULL || sha == NULL) { 03331 if (shaOutput) XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03332 if (md5Input) XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03333 if (shaInput) XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03334 if (md5) XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03335 if (sha) XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03336 03337 return MEMORY_E; 03338 } 03339 #endif 03340 03341 ret = wc_InitMd5(md5); 03342 if (ret == 0) { 03343 ret = wc_InitSha(sha); 03344 } 03345 if (ret == 0) { 03346 XMEMCPY(md5Input, ssl->arrays->preMasterSecret, pmsSz); 03347 03348 for (i = 0; i < MASTER_ROUNDS; ++i) { 03349 byte prefix[KEY_PREFIX]; /* only need PREFIX bytes but static */ 03350 if (!SetPrefix(prefix, i)) { /* analysis thinks will overrun */ 03351 ret = PREFIX_ERROR; 03352 break; 03353 } 03354 03355 idx = 0; 03356 XMEMCPY(shaInput, prefix, i + 1); 03357 idx += i + 1; 03358 03359 XMEMCPY(shaInput + idx, ssl->arrays->preMasterSecret, pmsSz); 03360 idx += pmsSz; 03361 XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN); 03362 idx += RAN_LEN; 03363 XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN); 03364 idx += RAN_LEN; 03365 if (ret == 0) { 03366 ret = wc_ShaUpdate(sha, shaInput, idx); 03367 } 03368 if (ret == 0) { 03369 ret = wc_ShaFinal(sha, shaOutput); 03370 } 03371 idx = pmsSz; /* preSz */ 03372 XMEMCPY(md5Input + idx, shaOutput, WC_SHA_DIGEST_SIZE); 03373 idx += WC_SHA_DIGEST_SIZE; 03374 if (ret == 0) { 03375 ret = wc_Md5Update(md5, md5Input, idx); 03376 } 03377 if (ret == 0) { 03378 ret = wc_Md5Final(md5, 03379 &ssl->arrays->masterSecret[i * WC_MD5_DIGEST_SIZE]); 03380 } 03381 } 03382 03383 #ifdef SHOW_SECRETS 03384 { 03385 word32 j; 03386 printf("master secret: "); 03387 for (j = 0; j < SECRET_LEN; j++) 03388 printf("%02x", ssl->arrays->masterSecret[j]); 03389 printf("\n"); 03390 } 03391 #endif 03392 03393 if (ret == 0) 03394 ret = DeriveKeys(ssl); 03395 } 03396 03397 #ifdef WOLFSSL_SMALL_STACK 03398 XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03399 XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03400 XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03401 XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03402 XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER); 03403 #endif 03404 03405 if (ret == 0) 03406 ret = CleanPreMaster(ssl); 03407 else 03408 CleanPreMaster(ssl); 03409 03410 return ret; 03411 } 03412 #endif 03413 03414 03415 /* Master wrapper, doesn't use SSL stack space in TLS mode */ 03416 int MakeMasterSecret(WOLFSSL* ssl) 03417 { 03418 /* append secret to premaster : premaster | SerSi | CliSi */ 03419 #ifdef HAVE_QSH 03420 word32 offset = 0; 03421 03422 if (ssl->peerQSHKeyPresent) { 03423 offset += ssl->arrays->preMasterSz; 03424 ssl->arrays->preMasterSz += ssl->QSH_secret->CliSi->length + 03425 ssl->QSH_secret->SerSi->length; 03426 /* test and set flag if QSH has been used */ 03427 if (ssl->QSH_secret->CliSi->length > 0 || 03428 ssl->QSH_secret->SerSi->length > 0) 03429 ssl->isQSH = 1; 03430 03431 /* append secrets to the premaster */ 03432 if (ssl->QSH_secret->SerSi != NULL) { 03433 XMEMCPY(ssl->arrays->preMasterSecret + offset, 03434 ssl->QSH_secret->SerSi->buffer, ssl->QSH_secret->SerSi->length); 03435 } 03436 offset += ssl->QSH_secret->SerSi->length; 03437 if (ssl->QSH_secret->CliSi != NULL) { 03438 XMEMCPY(ssl->arrays->preMasterSecret + offset, 03439 ssl->QSH_secret->CliSi->buffer, ssl->QSH_secret->CliSi->length); 03440 } 03441 03442 /* show secret SerSi and CliSi */ 03443 #ifdef SHOW_SECRETS 03444 { 03445 word32 j; 03446 printf("QSH generated secret material\n"); 03447 printf("SerSi : "); 03448 for (j = 0; j < ssl->QSH_secret->SerSi->length; j++) { 03449 printf("%02x", ssl->QSH_secret->SerSi->buffer[j]); 03450 } 03451 printf("\n"); 03452 printf("CliSi : "); 03453 for (j = 0; j < ssl->QSH_secret->CliSi->length; j++) { 03454 printf("%02x", ssl->QSH_secret->CliSi->buffer[j]); 03455 } 03456 printf("\n"); 03457 } 03458 #endif 03459 } 03460 #endif 03461 03462 #ifndef NO_OLD_TLS 03463 if (ssl->options.tls) return MakeTlsMasterSecret(ssl); 03464 return MakeSslMasterSecret(ssl); 03465 #elif !defined(WOLFSSL_NO_TLS12) 03466 return MakeTlsMasterSecret(ssl); 03467 #else 03468 (void)ssl; 03469 return 0; 03470 #endif 03471 } 03472 03473 #endif /* WOLFCRYPT_ONLY */ 03474 03475
Generated on Wed Jul 13 2022 01:38:42 by 1.7.2