cyassl re-port with cellular comms, PSK test
Dependencies: VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src
keys.c
00001 /* keys.c 00002 * 00003 * Copyright (C) 2006-2012 Sawtooth Consulting Ltd. 00004 * 00005 * This file is part of CyaSSL. 00006 * 00007 * CyaSSL 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 * CyaSSL 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 00020 */ 00021 00022 00023 #ifdef HAVE_CONFIG_H 00024 #include <config.h> 00025 #endif 00026 00027 #include <cyassl/internal.h> 00028 #include <cyassl/error.h> 00029 #ifdef SHOW_SECRETS 00030 #ifdef FREESCALE_MQX 00031 #include <fio.h> 00032 #else 00033 #include <stdio.h> 00034 #endif 00035 #endif 00036 00037 00038 int SetCipherSpecs(CYASSL* ssl) 00039 { 00040 /* ECC extensions, or AES-CCM */ 00041 if (ssl->options.cipherSuite0 == ECC_BYTE) { 00042 00043 switch (ssl->options.cipherSuite) { 00044 00045 #ifdef HAVE_ECC 00046 00047 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 00048 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA : 00049 ssl->specs.bulk_cipher_algorithm = aes; 00050 ssl->specs.cipher_type = block; 00051 ssl->specs.mac_algorithm = sha_mac; 00052 ssl->specs.kea = ecc_diffie_hellman_kea; 00053 ssl->specs.sig_algo = rsa_sa_algo; 00054 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00055 ssl->specs.pad_size = PAD_SHA; 00056 ssl->specs.static_ecdh = 0; 00057 ssl->specs.key_size = AES_128_KEY_SIZE; 00058 ssl->specs.block_size = AES_BLOCK_SIZE; 00059 ssl->specs.iv_size = AES_IV_SIZE; 00060 00061 break; 00062 #endif 00063 00064 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 00065 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA : 00066 ssl->specs.bulk_cipher_algorithm = aes; 00067 ssl->specs.cipher_type = block; 00068 ssl->specs.mac_algorithm = sha_mac; 00069 ssl->specs.kea = ecc_diffie_hellman_kea; 00070 ssl->specs.sig_algo = rsa_sa_algo; 00071 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00072 ssl->specs.pad_size = PAD_SHA; 00073 ssl->specs.static_ecdh = 1; 00074 ssl->specs.key_size = AES_128_KEY_SIZE; 00075 ssl->specs.block_size = AES_BLOCK_SIZE; 00076 ssl->specs.iv_size = AES_IV_SIZE; 00077 00078 break; 00079 #endif 00080 00081 #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 00082 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA : 00083 ssl->specs.bulk_cipher_algorithm = triple_des; 00084 ssl->specs.cipher_type = block; 00085 ssl->specs.mac_algorithm = sha_mac; 00086 ssl->specs.kea = ecc_diffie_hellman_kea; 00087 ssl->specs.sig_algo = rsa_sa_algo; 00088 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00089 ssl->specs.pad_size = PAD_SHA; 00090 ssl->specs.static_ecdh = 0; 00091 ssl->specs.key_size = DES3_KEY_SIZE; 00092 ssl->specs.block_size = DES_BLOCK_SIZE; 00093 ssl->specs.iv_size = DES_IV_SIZE; 00094 00095 break; 00096 #endif 00097 00098 #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 00099 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA : 00100 ssl->specs.bulk_cipher_algorithm = triple_des; 00101 ssl->specs.cipher_type = block; 00102 ssl->specs.mac_algorithm = sha_mac; 00103 ssl->specs.kea = ecc_diffie_hellman_kea; 00104 ssl->specs.sig_algo = rsa_sa_algo; 00105 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00106 ssl->specs.pad_size = PAD_SHA; 00107 ssl->specs.static_ecdh = 1; 00108 ssl->specs.key_size = DES3_KEY_SIZE; 00109 ssl->specs.block_size = DES_BLOCK_SIZE; 00110 ssl->specs.iv_size = DES_IV_SIZE; 00111 00112 break; 00113 #endif 00114 00115 #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA 00116 case TLS_ECDHE_RSA_WITH_RC4_128_SHA : 00117 ssl->specs.bulk_cipher_algorithm = rc4; 00118 ssl->specs.cipher_type = stream; 00119 ssl->specs.mac_algorithm = sha_mac; 00120 ssl->specs.kea = ecc_diffie_hellman_kea; 00121 ssl->specs.sig_algo = rsa_sa_algo; 00122 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00123 ssl->specs.pad_size = PAD_SHA; 00124 ssl->specs.static_ecdh = 0; 00125 ssl->specs.key_size = RC4_KEY_SIZE; 00126 ssl->specs.iv_size = 0; 00127 ssl->specs.block_size = 0; 00128 00129 break; 00130 #endif 00131 00132 #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA 00133 case TLS_ECDH_RSA_WITH_RC4_128_SHA : 00134 ssl->specs.bulk_cipher_algorithm = rc4; 00135 ssl->specs.cipher_type = stream; 00136 ssl->specs.mac_algorithm = sha_mac; 00137 ssl->specs.kea = ecc_diffie_hellman_kea; 00138 ssl->specs.sig_algo = rsa_sa_algo; 00139 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00140 ssl->specs.pad_size = PAD_SHA; 00141 ssl->specs.static_ecdh = 1; 00142 ssl->specs.key_size = RC4_KEY_SIZE; 00143 ssl->specs.iv_size = 0; 00144 ssl->specs.block_size = 0; 00145 00146 break; 00147 #endif 00148 00149 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 00150 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA : 00151 ssl->specs.bulk_cipher_algorithm = triple_des; 00152 ssl->specs.cipher_type = block; 00153 ssl->specs.mac_algorithm = sha_mac; 00154 ssl->specs.kea = ecc_diffie_hellman_kea; 00155 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00156 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00157 ssl->specs.pad_size = PAD_SHA; 00158 ssl->specs.static_ecdh = 0; 00159 ssl->specs.key_size = DES3_KEY_SIZE; 00160 ssl->specs.block_size = DES_BLOCK_SIZE; 00161 ssl->specs.iv_size = DES_IV_SIZE; 00162 00163 break; 00164 #endif 00165 00166 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 00167 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA : 00168 ssl->specs.bulk_cipher_algorithm = triple_des; 00169 ssl->specs.cipher_type = block; 00170 ssl->specs.mac_algorithm = sha_mac; 00171 ssl->specs.kea = ecc_diffie_hellman_kea; 00172 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00173 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00174 ssl->specs.pad_size = PAD_SHA; 00175 ssl->specs.static_ecdh = 1; 00176 ssl->specs.key_size = DES3_KEY_SIZE; 00177 ssl->specs.block_size = DES_BLOCK_SIZE; 00178 ssl->specs.iv_size = DES_IV_SIZE; 00179 00180 break; 00181 #endif 00182 00183 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 00184 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA : 00185 ssl->specs.bulk_cipher_algorithm = rc4; 00186 ssl->specs.cipher_type = stream; 00187 ssl->specs.mac_algorithm = sha_mac; 00188 ssl->specs.kea = ecc_diffie_hellman_kea; 00189 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00190 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00191 ssl->specs.pad_size = PAD_SHA; 00192 ssl->specs.static_ecdh = 0; 00193 ssl->specs.key_size = RC4_KEY_SIZE; 00194 ssl->specs.iv_size = 0; 00195 ssl->specs.block_size = 0; 00196 00197 break; 00198 #endif 00199 00200 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 00201 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA : 00202 ssl->specs.bulk_cipher_algorithm = rc4; 00203 ssl->specs.cipher_type = stream; 00204 ssl->specs.mac_algorithm = sha_mac; 00205 ssl->specs.kea = ecc_diffie_hellman_kea; 00206 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00207 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00208 ssl->specs.pad_size = PAD_SHA; 00209 ssl->specs.static_ecdh = 1; 00210 ssl->specs.key_size = RC4_KEY_SIZE; 00211 ssl->specs.iv_size = 0; 00212 ssl->specs.block_size = 0; 00213 00214 break; 00215 #endif 00216 00217 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 00218 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA : 00219 ssl->specs.bulk_cipher_algorithm = aes; 00220 ssl->specs.cipher_type = block; 00221 ssl->specs.mac_algorithm = sha_mac; 00222 ssl->specs.kea = ecc_diffie_hellman_kea; 00223 ssl->specs.sig_algo = rsa_sa_algo; 00224 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00225 ssl->specs.pad_size = PAD_SHA; 00226 ssl->specs.static_ecdh = 0; 00227 ssl->specs.key_size = AES_256_KEY_SIZE; 00228 ssl->specs.block_size = AES_BLOCK_SIZE; 00229 ssl->specs.iv_size = AES_IV_SIZE; 00230 00231 break; 00232 #endif 00233 00234 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 00235 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA : 00236 ssl->specs.bulk_cipher_algorithm = aes; 00237 ssl->specs.cipher_type = block; 00238 ssl->specs.mac_algorithm = sha_mac; 00239 ssl->specs.kea = ecc_diffie_hellman_kea; 00240 ssl->specs.sig_algo = rsa_sa_algo; 00241 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00242 ssl->specs.pad_size = PAD_SHA; 00243 ssl->specs.static_ecdh = 1; 00244 ssl->specs.key_size = AES_256_KEY_SIZE; 00245 ssl->specs.block_size = AES_BLOCK_SIZE; 00246 ssl->specs.iv_size = AES_IV_SIZE; 00247 00248 break; 00249 #endif 00250 00251 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 00252 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA : 00253 ssl->specs.bulk_cipher_algorithm = aes; 00254 ssl->specs.cipher_type = block; 00255 ssl->specs.mac_algorithm = sha_mac; 00256 ssl->specs.kea = ecc_diffie_hellman_kea; 00257 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00258 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00259 ssl->specs.pad_size = PAD_SHA; 00260 ssl->specs.static_ecdh = 0; 00261 ssl->specs.key_size = AES_128_KEY_SIZE; 00262 ssl->specs.block_size = AES_BLOCK_SIZE; 00263 ssl->specs.iv_size = AES_IV_SIZE; 00264 00265 break; 00266 #endif 00267 00268 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 00269 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA : 00270 ssl->specs.bulk_cipher_algorithm = aes; 00271 ssl->specs.cipher_type = block; 00272 ssl->specs.mac_algorithm = sha_mac; 00273 ssl->specs.kea = ecc_diffie_hellman_kea; 00274 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00275 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00276 ssl->specs.pad_size = PAD_SHA; 00277 ssl->specs.static_ecdh = 1; 00278 ssl->specs.key_size = AES_128_KEY_SIZE; 00279 ssl->specs.block_size = AES_BLOCK_SIZE; 00280 ssl->specs.iv_size = AES_IV_SIZE; 00281 00282 break; 00283 #endif 00284 00285 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 00286 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA : 00287 ssl->specs.bulk_cipher_algorithm = aes; 00288 ssl->specs.cipher_type = block; 00289 ssl->specs.mac_algorithm = sha_mac; 00290 ssl->specs.kea = ecc_diffie_hellman_kea; 00291 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00292 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00293 ssl->specs.pad_size = PAD_SHA; 00294 ssl->specs.static_ecdh = 0; 00295 ssl->specs.key_size = AES_256_KEY_SIZE; 00296 ssl->specs.block_size = AES_BLOCK_SIZE; 00297 ssl->specs.iv_size = AES_IV_SIZE; 00298 00299 break; 00300 #endif 00301 00302 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 00303 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA : 00304 ssl->specs.bulk_cipher_algorithm = aes; 00305 ssl->specs.cipher_type = block; 00306 ssl->specs.mac_algorithm = sha_mac; 00307 ssl->specs.kea = ecc_diffie_hellman_kea; 00308 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00309 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00310 ssl->specs.pad_size = PAD_SHA; 00311 ssl->specs.static_ecdh = 1; 00312 ssl->specs.key_size = AES_256_KEY_SIZE; 00313 ssl->specs.block_size = AES_BLOCK_SIZE; 00314 ssl->specs.iv_size = AES_IV_SIZE; 00315 00316 break; 00317 #endif 00318 00319 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 00320 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 : 00321 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00322 ssl->specs.cipher_type = aead; 00323 ssl->specs.mac_algorithm = sha256_mac; 00324 ssl->specs.kea = ecc_diffie_hellman_kea; 00325 ssl->specs.sig_algo = rsa_sa_algo; 00326 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00327 ssl->specs.pad_size = PAD_SHA; 00328 ssl->specs.static_ecdh = 0; 00329 ssl->specs.key_size = AES_128_KEY_SIZE; 00330 ssl->specs.block_size = AES_BLOCK_SIZE; 00331 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00332 00333 break; 00334 #endif 00335 00336 #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 00337 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 : 00338 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00339 ssl->specs.cipher_type = aead; 00340 ssl->specs.mac_algorithm = sha384_mac; 00341 ssl->specs.kea = ecc_diffie_hellman_kea; 00342 ssl->specs.sig_algo = rsa_sa_algo; 00343 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00344 ssl->specs.pad_size = PAD_SHA; 00345 ssl->specs.static_ecdh = 0; 00346 ssl->specs.key_size = AES_256_KEY_SIZE; 00347 ssl->specs.block_size = AES_BLOCK_SIZE; 00348 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00349 00350 break; 00351 #endif 00352 00353 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 00354 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 : 00355 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00356 ssl->specs.cipher_type = aead; 00357 ssl->specs.mac_algorithm = sha256_mac; 00358 ssl->specs.kea = ecc_diffie_hellman_kea; 00359 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00360 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00361 ssl->specs.pad_size = PAD_SHA; 00362 ssl->specs.static_ecdh = 0; 00363 ssl->specs.key_size = AES_128_KEY_SIZE; 00364 ssl->specs.block_size = AES_BLOCK_SIZE; 00365 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00366 00367 break; 00368 #endif 00369 00370 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 00371 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 : 00372 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00373 ssl->specs.cipher_type = aead; 00374 ssl->specs.mac_algorithm = sha384_mac; 00375 ssl->specs.kea = ecc_diffie_hellman_kea; 00376 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00377 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00378 ssl->specs.pad_size = PAD_SHA; 00379 ssl->specs.static_ecdh = 0; 00380 ssl->specs.key_size = AES_256_KEY_SIZE; 00381 ssl->specs.block_size = AES_BLOCK_SIZE; 00382 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00383 00384 break; 00385 #endif 00386 00387 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 00388 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 : 00389 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00390 ssl->specs.cipher_type = aead; 00391 ssl->specs.mac_algorithm = sha256_mac; 00392 ssl->specs.kea = ecc_diffie_hellman_kea; 00393 ssl->specs.sig_algo = rsa_sa_algo; 00394 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00395 ssl->specs.pad_size = PAD_SHA; 00396 ssl->specs.static_ecdh = 1; 00397 ssl->specs.key_size = AES_128_KEY_SIZE; 00398 ssl->specs.block_size = AES_BLOCK_SIZE; 00399 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00400 00401 break; 00402 #endif 00403 00404 #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 00405 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 : 00406 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00407 ssl->specs.cipher_type = aead; 00408 ssl->specs.mac_algorithm = sha384_mac; 00409 ssl->specs.kea = ecc_diffie_hellman_kea; 00410 ssl->specs.sig_algo = rsa_sa_algo; 00411 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00412 ssl->specs.pad_size = PAD_SHA; 00413 ssl->specs.static_ecdh = 1; 00414 ssl->specs.key_size = AES_256_KEY_SIZE; 00415 ssl->specs.block_size = AES_BLOCK_SIZE; 00416 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00417 00418 break; 00419 #endif 00420 00421 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 00422 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 : 00423 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00424 ssl->specs.cipher_type = aead; 00425 ssl->specs.mac_algorithm = sha256_mac; 00426 ssl->specs.kea = ecc_diffie_hellman_kea; 00427 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00428 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00429 ssl->specs.pad_size = PAD_SHA; 00430 ssl->specs.static_ecdh = 1; 00431 ssl->specs.key_size = AES_128_KEY_SIZE; 00432 ssl->specs.block_size = AES_BLOCK_SIZE; 00433 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00434 00435 break; 00436 #endif 00437 00438 #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 00439 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 : 00440 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00441 ssl->specs.cipher_type = aead; 00442 ssl->specs.mac_algorithm = sha384_mac; 00443 ssl->specs.kea = ecc_diffie_hellman_kea; 00444 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00445 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00446 ssl->specs.pad_size = PAD_SHA; 00447 ssl->specs.static_ecdh = 1; 00448 ssl->specs.key_size = AES_256_KEY_SIZE; 00449 ssl->specs.block_size = AES_BLOCK_SIZE; 00450 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00451 00452 break; 00453 #endif 00454 00455 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 00456 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 : 00457 ssl->specs.bulk_cipher_algorithm = aes_ccm; 00458 ssl->specs.cipher_type = aead; 00459 ssl->specs.mac_algorithm = sha256_mac; 00460 ssl->specs.kea = ecc_diffie_hellman_kea; 00461 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00462 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00463 ssl->specs.pad_size = PAD_SHA; 00464 ssl->specs.static_ecdh = 1; 00465 ssl->specs.key_size = AES_128_KEY_SIZE; 00466 ssl->specs.block_size = AES_BLOCK_SIZE; 00467 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00468 break; 00469 #endif 00470 00471 #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 00472 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 : 00473 ssl->specs.bulk_cipher_algorithm = aes_ccm; 00474 ssl->specs.cipher_type = aead; 00475 ssl->specs.mac_algorithm = sha384_mac; 00476 ssl->specs.kea = ecc_diffie_hellman_kea; 00477 ssl->specs.sig_algo = ecc_dsa_sa_algo; 00478 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00479 ssl->specs.pad_size = PAD_SHA; 00480 ssl->specs.static_ecdh = 1; 00481 ssl->specs.key_size = AES_256_KEY_SIZE; 00482 ssl->specs.block_size = AES_BLOCK_SIZE; 00483 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00484 break; 00485 #endif 00486 #endif /* HAVE_ECC */ 00487 00488 #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256 00489 case TLS_RSA_WITH_AES_128_CCM_8_SHA256 : 00490 ssl->specs.bulk_cipher_algorithm = aes_ccm; 00491 ssl->specs.cipher_type = aead; 00492 ssl->specs.mac_algorithm = sha256_mac; 00493 ssl->specs.kea = rsa_kea; 00494 ssl->specs.sig_algo = rsa_sa_algo; 00495 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00496 ssl->specs.pad_size = PAD_SHA; 00497 ssl->specs.static_ecdh = 0; 00498 ssl->specs.key_size = AES_128_KEY_SIZE; 00499 ssl->specs.block_size = AES_BLOCK_SIZE; 00500 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00501 break; 00502 #endif 00503 00504 #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8_SHA384 00505 case TLS_RSA_WITH_AES_256_CCM_8_SHA384 : 00506 ssl->specs.bulk_cipher_algorithm = aes_ccm; 00507 ssl->specs.cipher_type = aead; 00508 ssl->specs.mac_algorithm = sha384_mac; 00509 ssl->specs.kea = rsa_kea; 00510 ssl->specs.sig_algo = rsa_sa_algo; 00511 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00512 ssl->specs.pad_size = PAD_SHA; 00513 ssl->specs.static_ecdh = 0; 00514 ssl->specs.key_size = AES_256_KEY_SIZE; 00515 ssl->specs.block_size = AES_BLOCK_SIZE; 00516 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00517 break; 00518 #endif 00519 00520 default: 00521 CYASSL_MSG("Unsupported cipher suite, SetCipherSpecs ECC"); 00522 return UNSUPPORTED_SUITE; 00523 } /* switch */ 00524 } /* if */ 00525 if (ssl->options.cipherSuite0 != ECC_BYTE) { /* normal suites */ 00526 switch (ssl->options.cipherSuite) { 00527 00528 #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA 00529 case SSL_RSA_WITH_RC4_128_SHA : 00530 ssl->specs.bulk_cipher_algorithm = rc4; 00531 ssl->specs.cipher_type = stream; 00532 ssl->specs.mac_algorithm = sha_mac; 00533 ssl->specs.kea = rsa_kea; 00534 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00535 ssl->specs.pad_size = PAD_SHA; 00536 ssl->specs.static_ecdh = 0; 00537 ssl->specs.key_size = RC4_KEY_SIZE; 00538 ssl->specs.iv_size = 0; 00539 ssl->specs.block_size = 0; 00540 00541 break; 00542 #endif 00543 00544 #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA 00545 case TLS_NTRU_RSA_WITH_RC4_128_SHA : 00546 ssl->specs.bulk_cipher_algorithm = rc4; 00547 ssl->specs.cipher_type = stream; 00548 ssl->specs.mac_algorithm = sha_mac; 00549 ssl->specs.kea = ntru_kea; 00550 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00551 ssl->specs.pad_size = PAD_SHA; 00552 ssl->specs.static_ecdh = 0; 00553 ssl->specs.key_size = RC4_KEY_SIZE; 00554 ssl->specs.iv_size = 0; 00555 ssl->specs.block_size = 0; 00556 00557 break; 00558 #endif 00559 00560 #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5 00561 case SSL_RSA_WITH_RC4_128_MD5 : 00562 ssl->specs.bulk_cipher_algorithm = rc4; 00563 ssl->specs.cipher_type = stream; 00564 ssl->specs.mac_algorithm = md5_mac; 00565 ssl->specs.kea = rsa_kea; 00566 ssl->specs.hash_size = MD5_DIGEST_SIZE; 00567 ssl->specs.pad_size = PAD_MD5; 00568 ssl->specs.static_ecdh = 0; 00569 ssl->specs.key_size = RC4_KEY_SIZE; 00570 ssl->specs.iv_size = 0; 00571 ssl->specs.block_size = 0; 00572 00573 break; 00574 #endif 00575 00576 #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA 00577 case SSL_RSA_WITH_3DES_EDE_CBC_SHA : 00578 ssl->specs.bulk_cipher_algorithm = triple_des; 00579 ssl->specs.cipher_type = block; 00580 ssl->specs.mac_algorithm = sha_mac; 00581 ssl->specs.kea = rsa_kea; 00582 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00583 ssl->specs.pad_size = PAD_SHA; 00584 ssl->specs.static_ecdh = 0; 00585 ssl->specs.key_size = DES3_KEY_SIZE; 00586 ssl->specs.block_size = DES_BLOCK_SIZE; 00587 ssl->specs.iv_size = DES_IV_SIZE; 00588 00589 break; 00590 #endif 00591 00592 #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA 00593 case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA : 00594 ssl->specs.bulk_cipher_algorithm = triple_des; 00595 ssl->specs.cipher_type = block; 00596 ssl->specs.mac_algorithm = sha_mac; 00597 ssl->specs.kea = ntru_kea; 00598 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00599 ssl->specs.pad_size = PAD_SHA; 00600 ssl->specs.static_ecdh = 0; 00601 ssl->specs.key_size = DES3_KEY_SIZE; 00602 ssl->specs.block_size = DES_BLOCK_SIZE; 00603 ssl->specs.iv_size = DES_IV_SIZE; 00604 00605 break; 00606 #endif 00607 00608 #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA 00609 case TLS_RSA_WITH_AES_128_CBC_SHA : 00610 ssl->specs.bulk_cipher_algorithm = aes; 00611 ssl->specs.cipher_type = block; 00612 ssl->specs.mac_algorithm = sha_mac; 00613 ssl->specs.kea = rsa_kea; 00614 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00615 ssl->specs.pad_size = PAD_SHA; 00616 ssl->specs.static_ecdh = 0; 00617 ssl->specs.key_size = AES_128_KEY_SIZE; 00618 ssl->specs.block_size = AES_BLOCK_SIZE; 00619 ssl->specs.iv_size = AES_IV_SIZE; 00620 00621 break; 00622 #endif 00623 00624 #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256 00625 case TLS_RSA_WITH_AES_128_CBC_SHA256 : 00626 ssl->specs.bulk_cipher_algorithm = aes; 00627 ssl->specs.cipher_type = block; 00628 ssl->specs.mac_algorithm = sha256_mac; 00629 ssl->specs.kea = rsa_kea; 00630 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00631 ssl->specs.pad_size = PAD_SHA; 00632 ssl->specs.static_ecdh = 0; 00633 ssl->specs.key_size = AES_128_KEY_SIZE; 00634 ssl->specs.block_size = AES_BLOCK_SIZE; 00635 ssl->specs.iv_size = AES_IV_SIZE; 00636 00637 break; 00638 #endif 00639 00640 #ifdef BUILD_TLS_RSA_WITH_NULL_SHA 00641 case TLS_RSA_WITH_NULL_SHA : 00642 ssl->specs.bulk_cipher_algorithm = cipher_null; 00643 ssl->specs.cipher_type = stream; 00644 ssl->specs.mac_algorithm = sha_mac; 00645 ssl->specs.kea = rsa_kea; 00646 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00647 ssl->specs.pad_size = PAD_SHA; 00648 ssl->specs.static_ecdh = 0; 00649 ssl->specs.key_size = 0; 00650 ssl->specs.block_size = 0; 00651 ssl->specs.iv_size = 0; 00652 00653 break; 00654 #endif 00655 00656 #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256 00657 case TLS_RSA_WITH_NULL_SHA256 : 00658 ssl->specs.bulk_cipher_algorithm = cipher_null; 00659 ssl->specs.cipher_type = stream; 00660 ssl->specs.mac_algorithm = sha256_mac; 00661 ssl->specs.kea = rsa_kea; 00662 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00663 ssl->specs.pad_size = PAD_SHA; 00664 ssl->specs.static_ecdh = 0; 00665 ssl->specs.key_size = 0; 00666 ssl->specs.block_size = 0; 00667 ssl->specs.iv_size = 0; 00668 00669 break; 00670 #endif 00671 00672 #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA 00673 case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA : 00674 ssl->specs.bulk_cipher_algorithm = aes; 00675 ssl->specs.cipher_type = block; 00676 ssl->specs.mac_algorithm = sha_mac; 00677 ssl->specs.kea = ntru_kea; 00678 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00679 ssl->specs.pad_size = PAD_SHA; 00680 ssl->specs.static_ecdh = 0; 00681 ssl->specs.key_size = AES_128_KEY_SIZE; 00682 ssl->specs.block_size = AES_BLOCK_SIZE; 00683 ssl->specs.iv_size = AES_IV_SIZE; 00684 00685 break; 00686 #endif 00687 00688 #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA 00689 case TLS_RSA_WITH_AES_256_CBC_SHA : 00690 ssl->specs.bulk_cipher_algorithm = aes; 00691 ssl->specs.cipher_type = block; 00692 ssl->specs.mac_algorithm = sha_mac; 00693 ssl->specs.kea = rsa_kea; 00694 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00695 ssl->specs.pad_size = PAD_SHA; 00696 ssl->specs.static_ecdh = 0; 00697 ssl->specs.key_size = AES_256_KEY_SIZE; 00698 ssl->specs.block_size = AES_BLOCK_SIZE; 00699 ssl->specs.iv_size = AES_IV_SIZE; 00700 00701 break; 00702 #endif 00703 00704 #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256 00705 case TLS_RSA_WITH_AES_256_CBC_SHA256 : 00706 ssl->specs.bulk_cipher_algorithm = aes; 00707 ssl->specs.cipher_type = block; 00708 ssl->specs.mac_algorithm = sha256_mac; 00709 ssl->specs.kea = rsa_kea; 00710 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00711 ssl->specs.pad_size = PAD_SHA; 00712 ssl->specs.static_ecdh = 0; 00713 ssl->specs.key_size = AES_256_KEY_SIZE; 00714 ssl->specs.block_size = AES_BLOCK_SIZE; 00715 ssl->specs.iv_size = AES_IV_SIZE; 00716 00717 break; 00718 #endif 00719 00720 #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA 00721 case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA : 00722 ssl->specs.bulk_cipher_algorithm = aes; 00723 ssl->specs.cipher_type = block; 00724 ssl->specs.mac_algorithm = sha_mac; 00725 ssl->specs.kea = ntru_kea; 00726 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00727 ssl->specs.pad_size = PAD_SHA; 00728 ssl->specs.static_ecdh = 0; 00729 ssl->specs.key_size = AES_256_KEY_SIZE; 00730 ssl->specs.block_size = AES_BLOCK_SIZE; 00731 ssl->specs.iv_size = AES_IV_SIZE; 00732 00733 break; 00734 #endif 00735 00736 #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256 00737 case TLS_PSK_WITH_AES_128_CBC_SHA256 : 00738 ssl->specs.bulk_cipher_algorithm = aes; 00739 ssl->specs.cipher_type = block; 00740 ssl->specs.mac_algorithm = sha256_mac; 00741 ssl->specs.kea = psk_kea; 00742 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00743 ssl->specs.pad_size = PAD_SHA; 00744 ssl->specs.static_ecdh = 0; 00745 ssl->specs.key_size = AES_128_KEY_SIZE; 00746 ssl->specs.block_size = AES_BLOCK_SIZE; 00747 ssl->specs.iv_size = AES_IV_SIZE; 00748 00749 ssl->options.usingPSK_cipher = 1; 00750 break; 00751 #endif 00752 00753 #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA 00754 case TLS_PSK_WITH_AES_128_CBC_SHA : 00755 ssl->specs.bulk_cipher_algorithm = aes; 00756 ssl->specs.cipher_type = block; 00757 ssl->specs.mac_algorithm = sha_mac; 00758 ssl->specs.kea = psk_kea; 00759 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00760 ssl->specs.pad_size = PAD_SHA; 00761 ssl->specs.static_ecdh = 0; 00762 ssl->specs.key_size = AES_128_KEY_SIZE; 00763 ssl->specs.block_size = AES_BLOCK_SIZE; 00764 ssl->specs.iv_size = AES_IV_SIZE; 00765 00766 ssl->options.usingPSK_cipher = 1; 00767 break; 00768 #endif 00769 00770 #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA 00771 case TLS_PSK_WITH_AES_256_CBC_SHA : 00772 ssl->specs.bulk_cipher_algorithm = aes; 00773 ssl->specs.cipher_type = block; 00774 ssl->specs.mac_algorithm = sha_mac; 00775 ssl->specs.kea = psk_kea; 00776 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00777 ssl->specs.pad_size = PAD_SHA; 00778 ssl->specs.static_ecdh = 0; 00779 ssl->specs.key_size = AES_256_KEY_SIZE; 00780 ssl->specs.block_size = AES_BLOCK_SIZE; 00781 ssl->specs.iv_size = AES_IV_SIZE; 00782 00783 ssl->options.usingPSK_cipher = 1; 00784 break; 00785 #endif 00786 00787 #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256 00788 case TLS_PSK_WITH_NULL_SHA256 : 00789 ssl->specs.bulk_cipher_algorithm = cipher_null; 00790 ssl->specs.cipher_type = stream; 00791 ssl->specs.mac_algorithm = sha256_mac; 00792 ssl->specs.kea = psk_kea; 00793 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00794 ssl->specs.pad_size = PAD_SHA; 00795 ssl->specs.static_ecdh = 0; 00796 ssl->specs.key_size = 0; 00797 ssl->specs.block_size = 0; 00798 ssl->specs.iv_size = 0; 00799 00800 ssl->options.usingPSK_cipher = 1; 00801 break; 00802 #endif 00803 00804 #ifdef BUILD_TLS_PSK_WITH_NULL_SHA 00805 case TLS_PSK_WITH_NULL_SHA : 00806 ssl->specs.bulk_cipher_algorithm = cipher_null; 00807 ssl->specs.cipher_type = stream; 00808 ssl->specs.mac_algorithm = sha_mac; 00809 ssl->specs.kea = psk_kea; 00810 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00811 ssl->specs.pad_size = PAD_SHA; 00812 ssl->specs.static_ecdh = 0; 00813 ssl->specs.key_size = 0; 00814 ssl->specs.block_size = 0; 00815 ssl->specs.iv_size = 0; 00816 00817 ssl->options.usingPSK_cipher = 1; 00818 break; 00819 #endif 00820 00821 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 00822 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 : 00823 ssl->specs.bulk_cipher_algorithm = aes; 00824 ssl->specs.cipher_type = block; 00825 ssl->specs.mac_algorithm = sha256_mac; 00826 ssl->specs.kea = diffie_hellman_kea; 00827 ssl->specs.sig_algo = rsa_sa_algo; 00828 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00829 ssl->specs.pad_size = PAD_SHA; 00830 ssl->specs.static_ecdh = 0; 00831 ssl->specs.key_size = AES_128_KEY_SIZE; 00832 ssl->specs.block_size = AES_BLOCK_SIZE; 00833 ssl->specs.iv_size = AES_IV_SIZE; 00834 00835 break; 00836 #endif 00837 00838 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 00839 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 : 00840 ssl->specs.bulk_cipher_algorithm = aes; 00841 ssl->specs.cipher_type = block; 00842 ssl->specs.mac_algorithm = sha256_mac; 00843 ssl->specs.kea = diffie_hellman_kea; 00844 ssl->specs.sig_algo = rsa_sa_algo; 00845 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00846 ssl->specs.pad_size = PAD_SHA; 00847 ssl->specs.static_ecdh = 0; 00848 ssl->specs.key_size = AES_256_KEY_SIZE; 00849 ssl->specs.block_size = AES_BLOCK_SIZE; 00850 ssl->specs.iv_size = AES_IV_SIZE; 00851 00852 break; 00853 #endif 00854 00855 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 00856 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : 00857 ssl->specs.bulk_cipher_algorithm = aes; 00858 ssl->specs.cipher_type = block; 00859 ssl->specs.mac_algorithm = sha_mac; 00860 ssl->specs.kea = diffie_hellman_kea; 00861 ssl->specs.sig_algo = rsa_sa_algo; 00862 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00863 ssl->specs.pad_size = PAD_SHA; 00864 ssl->specs.static_ecdh = 0; 00865 ssl->specs.key_size = AES_128_KEY_SIZE; 00866 ssl->specs.block_size = AES_BLOCK_SIZE; 00867 ssl->specs.iv_size = AES_IV_SIZE; 00868 00869 break; 00870 #endif 00871 00872 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 00873 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : 00874 ssl->specs.bulk_cipher_algorithm = aes; 00875 ssl->specs.cipher_type = block; 00876 ssl->specs.mac_algorithm = sha_mac; 00877 ssl->specs.kea = diffie_hellman_kea; 00878 ssl->specs.sig_algo = rsa_sa_algo; 00879 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00880 ssl->specs.pad_size = PAD_SHA; 00881 ssl->specs.static_ecdh = 0; 00882 ssl->specs.key_size = AES_256_KEY_SIZE; 00883 ssl->specs.block_size = AES_BLOCK_SIZE; 00884 ssl->specs.iv_size = AES_IV_SIZE; 00885 00886 break; 00887 #endif 00888 00889 #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_MD5 00890 case TLS_RSA_WITH_HC_128_CBC_MD5 : 00891 ssl->specs.bulk_cipher_algorithm = hc128; 00892 ssl->specs.cipher_type = stream; 00893 ssl->specs.mac_algorithm = md5_mac; 00894 ssl->specs.kea = rsa_kea; 00895 ssl->specs.hash_size = MD5_DIGEST_SIZE; 00896 ssl->specs.pad_size = PAD_MD5; 00897 ssl->specs.static_ecdh = 0; 00898 ssl->specs.key_size = HC_128_KEY_SIZE; 00899 ssl->specs.block_size = 0; 00900 ssl->specs.iv_size = HC_128_IV_SIZE; 00901 00902 break; 00903 #endif 00904 00905 #ifdef BUILD_TLS_RSA_WITH_HC_128_CBC_SHA 00906 case TLS_RSA_WITH_HC_128_CBC_SHA : 00907 ssl->specs.bulk_cipher_algorithm = hc128; 00908 ssl->specs.cipher_type = stream; 00909 ssl->specs.mac_algorithm = sha_mac; 00910 ssl->specs.kea = rsa_kea; 00911 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00912 ssl->specs.pad_size = PAD_SHA; 00913 ssl->specs.static_ecdh = 0; 00914 ssl->specs.key_size = HC_128_KEY_SIZE; 00915 ssl->specs.block_size = 0; 00916 ssl->specs.iv_size = HC_128_IV_SIZE; 00917 00918 break; 00919 #endif 00920 00921 #ifdef BUILD_TLS_RSA_WITH_RABBIT_CBC_SHA 00922 case TLS_RSA_WITH_RABBIT_CBC_SHA : 00923 ssl->specs.bulk_cipher_algorithm = rabbit; 00924 ssl->specs.cipher_type = stream; 00925 ssl->specs.mac_algorithm = sha_mac; 00926 ssl->specs.kea = rsa_kea; 00927 ssl->specs.hash_size = SHA_DIGEST_SIZE; 00928 ssl->specs.pad_size = PAD_SHA; 00929 ssl->specs.static_ecdh = 0; 00930 ssl->specs.key_size = RABBIT_KEY_SIZE; 00931 ssl->specs.block_size = 0; 00932 ssl->specs.iv_size = RABBIT_IV_SIZE; 00933 00934 break; 00935 #endif 00936 00937 #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256 00938 case TLS_RSA_WITH_AES_128_GCM_SHA256 : 00939 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00940 ssl->specs.cipher_type = aead; 00941 ssl->specs.mac_algorithm = sha256_mac; 00942 ssl->specs.kea = rsa_kea; 00943 ssl->specs.sig_algo = rsa_sa_algo; 00944 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00945 ssl->specs.pad_size = PAD_SHA; 00946 ssl->specs.static_ecdh = 0; 00947 ssl->specs.key_size = AES_128_KEY_SIZE; 00948 ssl->specs.block_size = AES_BLOCK_SIZE; 00949 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00950 00951 break; 00952 #endif 00953 00954 #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384 00955 case TLS_RSA_WITH_AES_256_GCM_SHA384 : 00956 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00957 ssl->specs.cipher_type = aead; 00958 ssl->specs.mac_algorithm = sha384_mac; 00959 ssl->specs.kea = rsa_kea; 00960 ssl->specs.sig_algo = rsa_sa_algo; 00961 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00962 ssl->specs.pad_size = PAD_SHA; 00963 ssl->specs.static_ecdh = 0; 00964 ssl->specs.key_size = AES_256_KEY_SIZE; 00965 ssl->specs.block_size = AES_BLOCK_SIZE; 00966 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00967 00968 break; 00969 #endif 00970 00971 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 00972 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 : 00973 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00974 ssl->specs.cipher_type = aead; 00975 ssl->specs.mac_algorithm = sha256_mac; 00976 ssl->specs.kea = diffie_hellman_kea; 00977 ssl->specs.sig_algo = rsa_sa_algo; 00978 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 00979 ssl->specs.pad_size = PAD_SHA; 00980 ssl->specs.static_ecdh = 0; 00981 ssl->specs.key_size = AES_128_KEY_SIZE; 00982 ssl->specs.block_size = AES_BLOCK_SIZE; 00983 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 00984 00985 break; 00986 #endif 00987 00988 #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 00989 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 : 00990 ssl->specs.bulk_cipher_algorithm = aes_gcm; 00991 ssl->specs.cipher_type = aead; 00992 ssl->specs.mac_algorithm = sha384_mac; 00993 ssl->specs.kea = diffie_hellman_kea; 00994 ssl->specs.sig_algo = rsa_sa_algo; 00995 ssl->specs.hash_size = SHA384_DIGEST_SIZE; 00996 ssl->specs.pad_size = PAD_SHA; 00997 ssl->specs.static_ecdh = 0; 00998 ssl->specs.key_size = AES_256_KEY_SIZE; 00999 ssl->specs.block_size = AES_BLOCK_SIZE; 01000 ssl->specs.iv_size = AEAD_IMP_IV_SZ; 01001 01002 break; 01003 #endif 01004 01005 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 01006 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA : 01007 ssl->specs.bulk_cipher_algorithm = camellia; 01008 ssl->specs.cipher_type = block; 01009 ssl->specs.mac_algorithm = sha_mac; 01010 ssl->specs.kea = rsa_kea; 01011 ssl->specs.hash_size = SHA_DIGEST_SIZE; 01012 ssl->specs.pad_size = PAD_SHA; 01013 ssl->specs.static_ecdh = 0; 01014 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01015 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01016 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01017 01018 break; 01019 #endif 01020 01021 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 01022 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA : 01023 ssl->specs.bulk_cipher_algorithm = camellia; 01024 ssl->specs.cipher_type = block; 01025 ssl->specs.mac_algorithm = sha_mac; 01026 ssl->specs.kea = rsa_kea; 01027 ssl->specs.hash_size = SHA_DIGEST_SIZE; 01028 ssl->specs.pad_size = PAD_SHA; 01029 ssl->specs.static_ecdh = 0; 01030 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 01031 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01032 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01033 01034 break; 01035 #endif 01036 01037 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 01038 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 : 01039 ssl->specs.bulk_cipher_algorithm = camellia; 01040 ssl->specs.cipher_type = block; 01041 ssl->specs.mac_algorithm = sha256_mac; 01042 ssl->specs.kea = rsa_kea; 01043 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 01044 ssl->specs.pad_size = PAD_SHA; 01045 ssl->specs.static_ecdh = 0; 01046 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01047 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01048 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01049 01050 break; 01051 #endif 01052 01053 #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 01054 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 : 01055 ssl->specs.bulk_cipher_algorithm = camellia; 01056 ssl->specs.cipher_type = block; 01057 ssl->specs.mac_algorithm = sha256_mac; 01058 ssl->specs.kea = rsa_kea; 01059 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 01060 ssl->specs.pad_size = PAD_SHA; 01061 ssl->specs.static_ecdh = 0; 01062 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 01063 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01064 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01065 01066 break; 01067 #endif 01068 01069 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 01070 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA : 01071 ssl->specs.bulk_cipher_algorithm = camellia; 01072 ssl->specs.cipher_type = block; 01073 ssl->specs.mac_algorithm = sha_mac; 01074 ssl->specs.kea = diffie_hellman_kea; 01075 ssl->specs.sig_algo = rsa_sa_algo; 01076 ssl->specs.hash_size = SHA_DIGEST_SIZE; 01077 ssl->specs.pad_size = PAD_SHA; 01078 ssl->specs.static_ecdh = 0; 01079 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01080 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01081 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01082 01083 break; 01084 #endif 01085 01086 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 01087 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA : 01088 ssl->specs.bulk_cipher_algorithm = camellia; 01089 ssl->specs.cipher_type = block; 01090 ssl->specs.mac_algorithm = sha_mac; 01091 ssl->specs.kea = diffie_hellman_kea; 01092 ssl->specs.sig_algo = rsa_sa_algo; 01093 ssl->specs.hash_size = SHA_DIGEST_SIZE; 01094 ssl->specs.pad_size = PAD_SHA; 01095 ssl->specs.static_ecdh = 0; 01096 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 01097 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01098 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01099 01100 break; 01101 #endif 01102 01103 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 01104 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 : 01105 ssl->specs.bulk_cipher_algorithm = camellia; 01106 ssl->specs.cipher_type = block; 01107 ssl->specs.mac_algorithm = sha256_mac; 01108 ssl->specs.kea = diffie_hellman_kea; 01109 ssl->specs.sig_algo = rsa_sa_algo; 01110 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 01111 ssl->specs.pad_size = PAD_SHA; 01112 ssl->specs.static_ecdh = 0; 01113 ssl->specs.key_size = CAMELLIA_128_KEY_SIZE; 01114 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01115 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01116 01117 break; 01118 #endif 01119 01120 #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 01121 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 : 01122 ssl->specs.bulk_cipher_algorithm = camellia; 01123 ssl->specs.cipher_type = block; 01124 ssl->specs.mac_algorithm = sha256_mac; 01125 ssl->specs.kea = diffie_hellman_kea; 01126 ssl->specs.sig_algo = rsa_sa_algo; 01127 ssl->specs.hash_size = SHA256_DIGEST_SIZE; 01128 ssl->specs.pad_size = PAD_SHA; 01129 ssl->specs.static_ecdh = 0; 01130 ssl->specs.key_size = CAMELLIA_256_KEY_SIZE; 01131 ssl->specs.block_size = CAMELLIA_BLOCK_SIZE; 01132 ssl->specs.iv_size = CAMELLIA_IV_SIZE; 01133 01134 break; 01135 #endif 01136 01137 default: 01138 CYASSL_MSG("Unsupported cipher suite, SetCipherSpecs"); 01139 return UNSUPPORTED_SUITE; 01140 } /* switch */ 01141 } /* if ECC / Normal suites else */ 01142 01143 /* set TLS if it hasn't been turned off */ 01144 if (ssl->version.major == 3 && ssl->version.minor >= 1) { 01145 #ifndef NO_TLS 01146 ssl->options.tls = 1; 01147 ssl->hmac = TLS_hmac; 01148 if (ssl->version.minor >= 2) 01149 ssl->options.tls1_1 = 1; 01150 #endif 01151 } 01152 01153 #ifdef CYASSL_DTLS 01154 if (ssl->options.dtls) 01155 ssl->hmac = TLS_hmac; 01156 #endif 01157 01158 return 0; 01159 } 01160 01161 01162 enum KeyStuff { 01163 MASTER_ROUNDS = 3, 01164 PREFIX = 3, /* up to three letters for master prefix */ 01165 KEY_PREFIX = 7 /* up to 7 prefix letters for key rounds */ 01166 01167 01168 }; 01169 01170 #ifndef NO_OLD_TLS 01171 /* true or false, zero for error */ 01172 static int SetPrefix(byte* sha_input, int idx) 01173 { 01174 switch (idx) { 01175 case 0: 01176 XMEMCPY(sha_input, "A", 1); 01177 break; 01178 case 1: 01179 XMEMCPY(sha_input, "BB", 2); 01180 break; 01181 case 2: 01182 XMEMCPY(sha_input, "CCC", 3); 01183 break; 01184 case 3: 01185 XMEMCPY(sha_input, "DDDD", 4); 01186 break; 01187 case 4: 01188 XMEMCPY(sha_input, "EEEEE", 5); 01189 break; 01190 case 5: 01191 XMEMCPY(sha_input, "FFFFFF", 6); 01192 break; 01193 case 6: 01194 XMEMCPY(sha_input, "GGGGGGG", 7); 01195 break; 01196 default: 01197 CYASSL_MSG("Set Prefix error, bad input"); 01198 return 0; 01199 } 01200 return 1; 01201 } 01202 #endif 01203 01204 01205 static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs, 01206 byte side, void* heap, int devId) 01207 { 01208 #ifdef BUILD_ARC4 01209 word32 sz = specs->key_size; 01210 if (specs->bulk_cipher_algorithm == rc4) { 01211 enc->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER); 01212 if (enc->arc4 == NULL) 01213 return MEMORY_E; 01214 dec->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER); 01215 if (dec->arc4 == NULL) 01216 return MEMORY_E; 01217 #ifdef HAVE_CAVIUM 01218 if (devId != NO_CAVIUM_DEVICE) { 01219 if (Arc4InitCavium(enc->arc4, devId) != 0) { 01220 CYASSL_MSG("Arc4InitCavium failed in SetKeys"); 01221 return CAVIUM_INIT_E; 01222 } 01223 if (Arc4InitCavium(dec->arc4, devId) != 0) { 01224 CYASSL_MSG("Arc4InitCavium failed in SetKeys"); 01225 return CAVIUM_INIT_E; 01226 } 01227 } 01228 #endif 01229 if (side == CLIENT_END) { 01230 Arc4SetKey(enc->arc4, keys->client_write_key, sz); 01231 Arc4SetKey(dec->arc4, keys->server_write_key, sz); 01232 } 01233 else { 01234 Arc4SetKey(enc->arc4, keys->server_write_key, sz); 01235 Arc4SetKey(dec->arc4, keys->client_write_key, sz); 01236 } 01237 enc->setup = 1; 01238 dec->setup = 1; 01239 } 01240 #endif 01241 01242 #ifdef HAVE_HC128 01243 if (specs->bulk_cipher_algorithm == hc128) { 01244 enc->hc128 = (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER); 01245 if (enc->hc128 == NULL) 01246 return MEMORY_E; 01247 dec->hc128 = (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER); 01248 if (dec->hc128 == NULL) 01249 return MEMORY_E; 01250 if (side == CLIENT_END) { 01251 Hc128_SetKey(enc->hc128, keys->client_write_key, 01252 keys->client_write_IV); 01253 Hc128_SetKey(dec->hc128, keys->server_write_key, 01254 keys->server_write_IV); 01255 } 01256 else { 01257 Hc128_SetKey(enc->hc128, keys->server_write_key, 01258 keys->server_write_IV); 01259 Hc128_SetKey(dec->hc128, keys->client_write_key, 01260 keys->client_write_IV); 01261 } 01262 enc->setup = 1; 01263 dec->setup = 1; 01264 } 01265 #endif 01266 01267 #ifdef BUILD_RABBIT 01268 if (specs->bulk_cipher_algorithm == rabbit) { 01269 enc->rabbit = (Rabbit*)XMALLOC(sizeof(Rabbit),heap,DYNAMIC_TYPE_CIPHER); 01270 if (enc->rabbit == NULL) 01271 return MEMORY_E; 01272 dec->rabbit = (Rabbit*)XMALLOC(sizeof(Rabbit),heap,DYNAMIC_TYPE_CIPHER); 01273 if (dec->rabbit == NULL) 01274 return MEMORY_E; 01275 if (side == CLIENT_END) { 01276 RabbitSetKey(enc->rabbit, keys->client_write_key, 01277 keys->client_write_IV); 01278 RabbitSetKey(dec->rabbit, keys->server_write_key, 01279 keys->server_write_IV); 01280 } 01281 else { 01282 RabbitSetKey(enc->rabbit, keys->server_write_key, 01283 keys->server_write_IV); 01284 RabbitSetKey(dec->rabbit, keys->client_write_key, 01285 keys->client_write_IV); 01286 } 01287 enc->setup = 1; 01288 dec->setup = 1; 01289 } 01290 #endif 01291 01292 #ifdef BUILD_DES3 01293 if (specs->bulk_cipher_algorithm == triple_des) { 01294 enc->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER); 01295 if (enc->des3 == NULL) 01296 return MEMORY_E; 01297 dec->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER); 01298 if (dec->des3 == NULL) 01299 return MEMORY_E; 01300 #ifdef HAVE_CAVIUM 01301 if (devId != NO_CAVIUM_DEVICE) { 01302 if (Des3_InitCavium(enc->des3, devId) != 0) { 01303 CYASSL_MSG("Des3_InitCavium failed in SetKeys"); 01304 return CAVIUM_INIT_E; 01305 } 01306 if (Des3_InitCavium(dec->des3, devId) != 0) { 01307 CYASSL_MSG("Des3_InitCavium failed in SetKeys"); 01308 return CAVIUM_INIT_E; 01309 } 01310 } 01311 #endif 01312 if (side == CLIENT_END) { 01313 Des3_SetKey(enc->des3, keys->client_write_key, 01314 keys->client_write_IV, DES_ENCRYPTION); 01315 Des3_SetKey(dec->des3, keys->server_write_key, 01316 keys->server_write_IV, DES_DECRYPTION); 01317 } 01318 else { 01319 Des3_SetKey(enc->des3, keys->server_write_key, 01320 keys->server_write_IV, DES_ENCRYPTION); 01321 Des3_SetKey(dec->des3, keys->client_write_key, 01322 keys->client_write_IV, DES_DECRYPTION); 01323 } 01324 enc->setup = 1; 01325 dec->setup = 1; 01326 } 01327 #endif 01328 01329 #ifdef BUILD_AES 01330 if (specs->bulk_cipher_algorithm == aes) { 01331 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01332 if (enc->aes == NULL) 01333 return MEMORY_E; 01334 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01335 if (dec->aes == NULL) 01336 return MEMORY_E; 01337 #ifdef HAVE_CAVIUM 01338 if (devId != NO_CAVIUM_DEVICE) { 01339 if (AesInitCavium(enc->aes, devId) != 0) { 01340 CYASSL_MSG("AesInitCavium failed in SetKeys"); 01341 return CAVIUM_INIT_E; 01342 } 01343 if (AesInitCavium(dec->aes, devId) != 0) { 01344 CYASSL_MSG("AesInitCavium failed in SetKeys"); 01345 return CAVIUM_INIT_E; 01346 } 01347 } 01348 #endif 01349 if (side == CLIENT_END) { 01350 AesSetKey(enc->aes, keys->client_write_key, 01351 specs->key_size, keys->client_write_IV, 01352 AES_ENCRYPTION); 01353 AesSetKey(dec->aes, keys->server_write_key, 01354 specs->key_size, keys->server_write_IV, 01355 AES_DECRYPTION); 01356 } 01357 else { 01358 AesSetKey(enc->aes, keys->server_write_key, 01359 specs->key_size, keys->server_write_IV, 01360 AES_ENCRYPTION); 01361 AesSetKey(dec->aes, keys->client_write_key, 01362 specs->key_size, keys->client_write_IV, 01363 AES_DECRYPTION); 01364 } 01365 enc->setup = 1; 01366 dec->setup = 1; 01367 } 01368 #endif 01369 01370 #ifdef BUILD_AESGCM 01371 if (specs->bulk_cipher_algorithm == aes_gcm) { 01372 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01373 if (enc->aes == NULL) 01374 return MEMORY_E; 01375 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01376 if (dec->aes == NULL) 01377 return MEMORY_E; 01378 01379 if (side == CLIENT_END) { 01380 AesGcmSetKey(enc->aes, keys->client_write_key, specs->key_size); 01381 XMEMCPY(keys->aead_enc_imp_IV, 01382 keys->client_write_IV, AEAD_IMP_IV_SZ); 01383 AesGcmSetKey(dec->aes, keys->server_write_key, specs->key_size); 01384 XMEMCPY(keys->aead_dec_imp_IV, 01385 keys->server_write_IV, AEAD_IMP_IV_SZ); 01386 } 01387 else { 01388 AesGcmSetKey(enc->aes, keys->server_write_key, specs->key_size); 01389 XMEMCPY(keys->aead_enc_imp_IV, 01390 keys->server_write_IV, AEAD_IMP_IV_SZ); 01391 AesGcmSetKey(dec->aes, keys->client_write_key, specs->key_size); 01392 XMEMCPY(keys->aead_dec_imp_IV, 01393 keys->client_write_IV, AEAD_IMP_IV_SZ); 01394 } 01395 enc->setup = 1; 01396 dec->setup = 1; 01397 } 01398 #endif 01399 01400 #ifdef HAVE_AESCCM 01401 if (specs->bulk_cipher_algorithm == aes_ccm) { 01402 enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01403 if (enc->aes == NULL) 01404 return MEMORY_E; 01405 dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER); 01406 if (dec->aes == NULL) 01407 return MEMORY_E; 01408 01409 if (side == CLIENT_END) { 01410 AesCcmSetKey(enc->aes, keys->client_write_key, specs->key_size); 01411 XMEMCPY(keys->aead_enc_imp_IV, 01412 keys->client_write_IV, AEAD_IMP_IV_SZ); 01413 AesCcmSetKey(dec->aes, keys->server_write_key, specs->key_size); 01414 XMEMCPY(keys->aead_dec_imp_IV, 01415 keys->server_write_IV, AEAD_IMP_IV_SZ); 01416 } 01417 else { 01418 AesCcmSetKey(enc->aes, keys->server_write_key, specs->key_size); 01419 XMEMCPY(keys->aead_enc_imp_IV, 01420 keys->server_write_IV, AEAD_IMP_IV_SZ); 01421 AesCcmSetKey(dec->aes, keys->client_write_key, specs->key_size); 01422 XMEMCPY(keys->aead_dec_imp_IV, 01423 keys->client_write_IV, AEAD_IMP_IV_SZ); 01424 } 01425 enc->setup = 1; 01426 dec->setup = 1; 01427 } 01428 #endif 01429 01430 #ifdef HAVE_CAMELLIA 01431 if (specs->bulk_cipher_algorithm == camellia) { 01432 enc->cam = (Camellia*)XMALLOC(sizeof(Camellia), 01433 heap, DYNAMIC_TYPE_CIPHER); 01434 if (enc->cam == NULL) 01435 return MEMORY_E; 01436 dec->cam = (Camellia*)XMALLOC(sizeof(Camellia), 01437 heap, DYNAMIC_TYPE_CIPHER); 01438 if (dec->cam == NULL) 01439 return MEMORY_E; 01440 if (side == CLIENT_END) { 01441 CamelliaSetKey(enc->cam, keys->client_write_key, 01442 specs->key_size, keys->client_write_IV); 01443 CamelliaSetKey(dec->cam, keys->server_write_key, 01444 specs->key_size, keys->server_write_IV); 01445 } 01446 else { 01447 CamelliaSetKey(enc->cam, keys->server_write_key, 01448 specs->key_size, keys->server_write_IV); 01449 CamelliaSetKey(dec->cam, keys->client_write_key, 01450 specs->key_size, keys->client_write_IV); 01451 } 01452 enc->setup = 1; 01453 dec->setup = 1; 01454 } 01455 #endif 01456 01457 #ifdef HAVE_NULL_CIPHER 01458 if (specs->bulk_cipher_algorithm == cipher_null) { 01459 enc->setup = 1; 01460 dec->setup = 1; 01461 } 01462 #endif 01463 01464 keys->sequence_number = 0; 01465 keys->peer_sequence_number = 0; 01466 keys->encryptionOn = 0; 01467 (void)side; 01468 (void)heap; 01469 (void)enc; 01470 (void)dec; 01471 (void)specs; 01472 (void)devId; 01473 01474 return 0; 01475 } 01476 01477 01478 /* TLS can call too */ 01479 int StoreKeys(CYASSL* ssl, const byte* keyData) 01480 { 01481 int sz, i = 0; 01482 int devId = NO_CAVIUM_DEVICE; 01483 01484 #ifdef HAVE_CAVIUM 01485 devId = ssl->devId; 01486 #endif 01487 01488 if (ssl->specs.cipher_type != aead) { 01489 sz = ssl->specs.hash_size; 01490 XMEMCPY(ssl->keys.client_write_MAC_secret,&keyData[i], sz); 01491 i += sz; 01492 XMEMCPY(ssl->keys.server_write_MAC_secret,&keyData[i], sz); 01493 i += sz; 01494 } 01495 sz = ssl->specs.key_size; 01496 XMEMCPY(ssl->keys.client_write_key, &keyData[i], sz); 01497 i += sz; 01498 XMEMCPY(ssl->keys.server_write_key, &keyData[i], sz); 01499 i += sz; 01500 01501 sz = ssl->specs.iv_size; 01502 XMEMCPY(ssl->keys.client_write_IV, &keyData[i], sz); 01503 i += sz; 01504 XMEMCPY(ssl->keys.server_write_IV, &keyData[i], sz); 01505 01506 #ifdef HAVE_AEAD 01507 if (ssl->specs.cipher_type == aead) { 01508 /* Initialize the AES-GCM explicit IV to a random number. */ 01509 RNG_GenerateBlock(ssl->rng, ssl->keys.aead_exp_IV, AEAD_EXP_IV_SZ); 01510 } 01511 #endif 01512 01513 return SetKeys(&ssl->encrypt, &ssl->decrypt, &ssl->keys, &ssl->specs, 01514 ssl->options.side, ssl->heap, devId); 01515 } 01516 01517 #ifndef NO_OLD_TLS 01518 int DeriveKeys(CYASSL* ssl) 01519 { 01520 int length = 2 * ssl->specs.hash_size + 01521 2 * ssl->specs.key_size + 01522 2 * ssl->specs.iv_size; 01523 int rounds = (length + MD5_DIGEST_SIZE - 1 ) / MD5_DIGEST_SIZE, i; 01524 01525 byte shaOutput[SHA_DIGEST_SIZE]; 01526 byte md5Input[SECRET_LEN + SHA_DIGEST_SIZE]; 01527 byte shaInput[KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN]; 01528 01529 Md5 md5; 01530 Sha sha; 01531 01532 byte keyData[KEY_PREFIX * MD5_DIGEST_SIZE]; /* max size */ 01533 01534 InitMd5(&md5); 01535 InitSha(&sha); 01536 01537 XMEMCPY(md5Input, ssl->arrays->masterSecret, SECRET_LEN); 01538 01539 for (i = 0; i < rounds; ++i) { 01540 int j = i + 1; 01541 int idx = j; 01542 01543 if (!SetPrefix(shaInput, i)) { 01544 return PREFIX_ERROR; 01545 } 01546 01547 XMEMCPY(shaInput + idx, ssl->arrays->masterSecret, SECRET_LEN); 01548 idx += SECRET_LEN; 01549 XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN); 01550 idx += RAN_LEN; 01551 XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN); 01552 01553 ShaUpdate(&sha, shaInput, (word32)sizeof(shaInput) - KEY_PREFIX + j); 01554 ShaFinal(&sha, shaOutput); 01555 01556 XMEMCPY(&md5Input[SECRET_LEN], shaOutput, SHA_DIGEST_SIZE); 01557 Md5Update(&md5, md5Input, sizeof(md5Input)); 01558 Md5Final(&md5, keyData + i * MD5_DIGEST_SIZE); 01559 } 01560 01561 return StoreKeys(ssl, keyData); 01562 } 01563 01564 01565 static void CleanPreMaster(CYASSL* ssl) 01566 { 01567 int i, sz = ssl->arrays->preMasterSz; 01568 01569 for (i = 0; i < sz; i++) 01570 ssl->arrays->preMasterSecret[i] = 0; 01571 01572 RNG_GenerateBlock(ssl->rng, ssl->arrays->preMasterSecret, sz); 01573 01574 for (i = 0; i < sz; i++) 01575 ssl->arrays->preMasterSecret[i] = 0; 01576 01577 } 01578 01579 01580 /* Create and store the master secret see page 32, 6.1 */ 01581 static int MakeSslMasterSecret(CYASSL* ssl) 01582 { 01583 byte shaOutput[SHA_DIGEST_SIZE]; 01584 byte md5Input[ENCRYPT_LEN + SHA_DIGEST_SIZE]; 01585 byte shaInput[PREFIX + ENCRYPT_LEN + 2 * RAN_LEN]; 01586 int i, ret; 01587 word32 idx; 01588 word32 pmsSz = ssl->arrays->preMasterSz; 01589 01590 Md5 md5; 01591 Sha sha; 01592 01593 #ifdef SHOW_SECRETS 01594 { 01595 int j; 01596 printf("pre master secret: "); 01597 for (j = 0; j < pmsSz; j++) 01598 printf("%02x", ssl->arrays->preMasterSecret[j]); 01599 printf("\n"); 01600 } 01601 #endif 01602 01603 InitMd5(&md5); 01604 InitSha(&sha); 01605 01606 XMEMCPY(md5Input, ssl->arrays->preMasterSecret, pmsSz); 01607 01608 for (i = 0; i < MASTER_ROUNDS; ++i) { 01609 byte prefix[PREFIX]; 01610 if (!SetPrefix(prefix, i)) { 01611 return PREFIX_ERROR; 01612 } 01613 01614 idx = 0; 01615 XMEMCPY(shaInput, prefix, i + 1); 01616 idx += i + 1; 01617 01618 XMEMCPY(shaInput + idx, ssl->arrays->preMasterSecret, pmsSz); 01619 idx += pmsSz; 01620 XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN); 01621 idx += RAN_LEN; 01622 XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN); 01623 idx += RAN_LEN; 01624 ShaUpdate(&sha, shaInput, idx); 01625 ShaFinal(&sha, shaOutput); 01626 01627 idx = pmsSz; /* preSz */ 01628 XMEMCPY(md5Input + idx, shaOutput, SHA_DIGEST_SIZE); 01629 idx += SHA_DIGEST_SIZE; 01630 Md5Update(&md5, md5Input, idx); 01631 Md5Final(&md5, &ssl->arrays->masterSecret[i * MD5_DIGEST_SIZE]); 01632 } 01633 01634 #ifdef SHOW_SECRETS 01635 { 01636 int i; 01637 printf("master secret: "); 01638 for (i = 0; i < SECRET_LEN; i++) 01639 printf("%02x", ssl->arrays->masterSecret[i]); 01640 printf("\n"); 01641 } 01642 #endif 01643 01644 ret = DeriveKeys(ssl); 01645 CleanPreMaster(ssl); 01646 01647 return ret; 01648 } 01649 #endif 01650 01651 01652 /* Master wrapper, doesn't use SSL stack space in TLS mode */ 01653 int MakeMasterSecret(CYASSL* ssl) 01654 { 01655 #ifdef NO_OLD_TLS 01656 return MakeTlsMasterSecret(ssl); 01657 #elif !defined(NO_TLS) 01658 if (ssl->options.tls) return MakeTlsMasterSecret(ssl); 01659 #endif 01660 01661 #ifndef NO_OLD_TLS 01662 return MakeSslMasterSecret(ssl); 01663 #endif 01664 } 01665
Generated on Thu Jul 14 2022 00:25:23 by 1.7.2