keys.c 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482
  1. /* keys.c
  2. *
  3. * Copyright (C) 2006-2014 wolfSSL Inc.
  4. *
  5. * This file is part of CyaSSL.
  6. *
  7. * CyaSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * CyaSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  20. */
  21. #ifdef HAVE_CONFIG_H
  22. #include <config.h>
  23. #endif
  24. #include <cyassl/ctaocrypt/settings.h>
  25. #include <cyassl/internal.h>
  26. #include <cyassl/error-ssl.h>
  27. #if defined(SHOW_SECRETS) || defined(CHACHA_AEAD_TEST)
  28. #ifdef FREESCALE_MQX
  29. #include <fio.h>
  30. #else
  31. #include <stdio.h>
  32. #endif
  33. #endif
  34. int SetCipherSpecs(CYASSL* ssl)
  35. {
  36. #ifndef NO_CYASSL_CLIENT
  37. if (ssl->options.side == CYASSL_CLIENT_END) {
  38. /* server side verified before SetCipherSpecs call */
  39. if (VerifyClientSuite(ssl) != 1) {
  40. CYASSL_MSG("SetCipherSpecs() client has an unusuable suite");
  41. return UNSUPPORTED_SUITE;
  42. }
  43. }
  44. #endif /* NO_CYASSL_CLIENT */
  45. /* Chacha extensions, 0xcc */
  46. if (ssl->options.cipherSuite0 == CHACHA_BYTE) {
  47. switch (ssl->options.cipherSuite) {
  48. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  49. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  50. ssl->specs.bulk_cipher_algorithm = cyassl_chacha;
  51. ssl->specs.cipher_type = aead;
  52. ssl->specs.mac_algorithm = sha256_mac;
  53. ssl->specs.kea = ecc_diffie_hellman_kea;
  54. ssl->specs.sig_algo = rsa_sa_algo;
  55. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  56. ssl->specs.pad_size = PAD_SHA;
  57. ssl->specs.static_ecdh = 0;
  58. ssl->specs.key_size = CHACHA20_256_KEY_SIZE;
  59. ssl->specs.block_size = CHACHA20_BLOCK_SIZE;
  60. ssl->specs.iv_size = CHACHA20_IV_SIZE;
  61. ssl->specs.aead_mac_size = POLY1305_AUTH_SZ;
  62. break;
  63. #endif
  64. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  65. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  66. ssl->specs.bulk_cipher_algorithm = cyassl_chacha;
  67. ssl->specs.cipher_type = aead;
  68. ssl->specs.mac_algorithm = sha256_mac;
  69. ssl->specs.kea = ecc_diffie_hellman_kea;
  70. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  71. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  72. ssl->specs.pad_size = PAD_SHA;
  73. ssl->specs.static_ecdh = 0;
  74. ssl->specs.key_size = CHACHA20_256_KEY_SIZE;
  75. ssl->specs.block_size = CHACHA20_BLOCK_SIZE;
  76. ssl->specs.iv_size = CHACHA20_IV_SIZE;
  77. ssl->specs.aead_mac_size = POLY1305_AUTH_SZ;
  78. break;
  79. #endif
  80. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  81. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  82. ssl->specs.bulk_cipher_algorithm = cyassl_chacha;
  83. ssl->specs.cipher_type = aead;
  84. ssl->specs.mac_algorithm = sha256_mac;
  85. ssl->specs.kea = diffie_hellman_kea;
  86. ssl->specs.sig_algo = rsa_sa_algo;
  87. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  88. ssl->specs.pad_size = PAD_SHA;
  89. ssl->specs.static_ecdh = 0;
  90. ssl->specs.key_size = CHACHA20_256_KEY_SIZE;
  91. ssl->specs.block_size = CHACHA20_BLOCK_SIZE;
  92. ssl->specs.iv_size = CHACHA20_IV_SIZE;
  93. ssl->specs.aead_mac_size = POLY1305_AUTH_SZ;
  94. break;
  95. #endif
  96. default:
  97. CYASSL_MSG("Unsupported cipher suite, SetCipherSpecs ChaCha");
  98. return UNSUPPORTED_SUITE;
  99. }
  100. }
  101. /* ECC extensions, or AES-CCM */
  102. if (ssl->options.cipherSuite0 == ECC_BYTE) {
  103. switch (ssl->options.cipherSuite) {
  104. #ifdef HAVE_ECC
  105. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  106. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  107. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  108. ssl->specs.cipher_type = block;
  109. ssl->specs.mac_algorithm = sha256_mac;
  110. ssl->specs.kea = ecc_diffie_hellman_kea;
  111. ssl->specs.sig_algo = rsa_sa_algo;
  112. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  113. ssl->specs.pad_size = PAD_SHA;
  114. ssl->specs.static_ecdh = 0;
  115. ssl->specs.key_size = AES_128_KEY_SIZE;
  116. ssl->specs.iv_size = AES_IV_SIZE;
  117. ssl->specs.block_size = AES_BLOCK_SIZE;
  118. break;
  119. #endif
  120. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  121. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  122. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  123. ssl->specs.cipher_type = block;
  124. ssl->specs.mac_algorithm = sha256_mac;
  125. ssl->specs.kea = ecc_diffie_hellman_kea;
  126. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  127. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  128. ssl->specs.pad_size = PAD_SHA;
  129. ssl->specs.static_ecdh = 0;
  130. ssl->specs.key_size = AES_128_KEY_SIZE;
  131. ssl->specs.iv_size = AES_IV_SIZE;
  132. ssl->specs.block_size = AES_BLOCK_SIZE;
  133. break;
  134. #endif
  135. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  136. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  137. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  138. ssl->specs.cipher_type = block;
  139. ssl->specs.mac_algorithm = sha256_mac;
  140. ssl->specs.kea = ecc_diffie_hellman_kea;
  141. ssl->specs.sig_algo = rsa_sa_algo;
  142. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  143. ssl->specs.pad_size = PAD_SHA;
  144. ssl->specs.static_ecdh = 1;
  145. ssl->specs.key_size = AES_128_KEY_SIZE;
  146. ssl->specs.iv_size = AES_IV_SIZE;
  147. ssl->specs.block_size = AES_BLOCK_SIZE;
  148. break;
  149. #endif
  150. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  151. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  152. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  153. ssl->specs.cipher_type = block;
  154. ssl->specs.mac_algorithm = sha256_mac;
  155. ssl->specs.kea = ecc_diffie_hellman_kea;
  156. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  157. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  158. ssl->specs.pad_size = PAD_SHA;
  159. ssl->specs.static_ecdh = 1;
  160. ssl->specs.key_size = AES_128_KEY_SIZE;
  161. ssl->specs.iv_size = AES_IV_SIZE;
  162. ssl->specs.block_size = AES_BLOCK_SIZE;
  163. break;
  164. #endif
  165. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  166. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  167. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  168. ssl->specs.cipher_type = block;
  169. ssl->specs.mac_algorithm = sha384_mac;
  170. ssl->specs.kea = ecc_diffie_hellman_kea;
  171. ssl->specs.sig_algo = rsa_sa_algo;
  172. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  173. ssl->specs.pad_size = PAD_SHA;
  174. ssl->specs.static_ecdh = 0;
  175. ssl->specs.key_size = AES_256_KEY_SIZE;
  176. ssl->specs.iv_size = AES_IV_SIZE;
  177. ssl->specs.block_size = AES_BLOCK_SIZE;
  178. break;
  179. #endif
  180. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  181. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  182. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  183. ssl->specs.cipher_type = block;
  184. ssl->specs.mac_algorithm = sha384_mac;
  185. ssl->specs.kea = ecc_diffie_hellman_kea;
  186. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  187. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  188. ssl->specs.pad_size = PAD_SHA;
  189. ssl->specs.static_ecdh = 0;
  190. ssl->specs.key_size = AES_256_KEY_SIZE;
  191. ssl->specs.iv_size = AES_IV_SIZE;
  192. ssl->specs.block_size = AES_BLOCK_SIZE;
  193. break;
  194. #endif
  195. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  196. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  197. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  198. ssl->specs.cipher_type = block;
  199. ssl->specs.mac_algorithm = sha384_mac;
  200. ssl->specs.kea = ecc_diffie_hellman_kea;
  201. ssl->specs.sig_algo = rsa_sa_algo;
  202. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  203. ssl->specs.pad_size = PAD_SHA;
  204. ssl->specs.static_ecdh = 1;
  205. ssl->specs.key_size = AES_256_KEY_SIZE;
  206. ssl->specs.iv_size = AES_IV_SIZE;
  207. ssl->specs.block_size = AES_BLOCK_SIZE;
  208. break;
  209. #endif
  210. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  211. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  212. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  213. ssl->specs.cipher_type = block;
  214. ssl->specs.mac_algorithm = sha384_mac;
  215. ssl->specs.kea = ecc_diffie_hellman_kea;
  216. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  217. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  218. ssl->specs.pad_size = PAD_SHA;
  219. ssl->specs.static_ecdh = 1;
  220. ssl->specs.key_size = AES_256_KEY_SIZE;
  221. ssl->specs.iv_size = AES_IV_SIZE;
  222. ssl->specs.block_size = AES_BLOCK_SIZE;
  223. break;
  224. #endif
  225. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  226. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  227. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  228. ssl->specs.cipher_type = block;
  229. ssl->specs.mac_algorithm = sha_mac;
  230. ssl->specs.kea = ecc_diffie_hellman_kea;
  231. ssl->specs.sig_algo = rsa_sa_algo;
  232. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  233. ssl->specs.pad_size = PAD_SHA;
  234. ssl->specs.static_ecdh = 0;
  235. ssl->specs.key_size = AES_128_KEY_SIZE;
  236. ssl->specs.block_size = AES_BLOCK_SIZE;
  237. ssl->specs.iv_size = AES_IV_SIZE;
  238. break;
  239. #endif
  240. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  241. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  242. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  243. ssl->specs.cipher_type = block;
  244. ssl->specs.mac_algorithm = sha_mac;
  245. ssl->specs.kea = ecc_diffie_hellman_kea;
  246. ssl->specs.sig_algo = rsa_sa_algo;
  247. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  248. ssl->specs.pad_size = PAD_SHA;
  249. ssl->specs.static_ecdh = 1;
  250. ssl->specs.key_size = AES_128_KEY_SIZE;
  251. ssl->specs.block_size = AES_BLOCK_SIZE;
  252. ssl->specs.iv_size = AES_IV_SIZE;
  253. break;
  254. #endif
  255. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  256. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  257. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  258. ssl->specs.cipher_type = block;
  259. ssl->specs.mac_algorithm = sha_mac;
  260. ssl->specs.kea = ecc_diffie_hellman_kea;
  261. ssl->specs.sig_algo = rsa_sa_algo;
  262. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  263. ssl->specs.pad_size = PAD_SHA;
  264. ssl->specs.static_ecdh = 0;
  265. ssl->specs.key_size = DES3_KEY_SIZE;
  266. ssl->specs.block_size = DES_BLOCK_SIZE;
  267. ssl->specs.iv_size = DES_IV_SIZE;
  268. break;
  269. #endif
  270. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  271. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  272. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  273. ssl->specs.cipher_type = block;
  274. ssl->specs.mac_algorithm = sha_mac;
  275. ssl->specs.kea = ecc_diffie_hellman_kea;
  276. ssl->specs.sig_algo = rsa_sa_algo;
  277. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  278. ssl->specs.pad_size = PAD_SHA;
  279. ssl->specs.static_ecdh = 1;
  280. ssl->specs.key_size = DES3_KEY_SIZE;
  281. ssl->specs.block_size = DES_BLOCK_SIZE;
  282. ssl->specs.iv_size = DES_IV_SIZE;
  283. break;
  284. #endif
  285. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  286. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  287. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  288. ssl->specs.cipher_type = stream;
  289. ssl->specs.mac_algorithm = sha_mac;
  290. ssl->specs.kea = ecc_diffie_hellman_kea;
  291. ssl->specs.sig_algo = rsa_sa_algo;
  292. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  293. ssl->specs.pad_size = PAD_SHA;
  294. ssl->specs.static_ecdh = 0;
  295. ssl->specs.key_size = RC4_KEY_SIZE;
  296. ssl->specs.iv_size = 0;
  297. ssl->specs.block_size = 0;
  298. break;
  299. #endif
  300. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  301. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  302. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  303. ssl->specs.cipher_type = stream;
  304. ssl->specs.mac_algorithm = sha_mac;
  305. ssl->specs.kea = ecc_diffie_hellman_kea;
  306. ssl->specs.sig_algo = rsa_sa_algo;
  307. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  308. ssl->specs.pad_size = PAD_SHA;
  309. ssl->specs.static_ecdh = 1;
  310. ssl->specs.key_size = RC4_KEY_SIZE;
  311. ssl->specs.iv_size = 0;
  312. ssl->specs.block_size = 0;
  313. break;
  314. #endif
  315. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  316. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  317. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  318. ssl->specs.cipher_type = block;
  319. ssl->specs.mac_algorithm = sha_mac;
  320. ssl->specs.kea = ecc_diffie_hellman_kea;
  321. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  322. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  323. ssl->specs.pad_size = PAD_SHA;
  324. ssl->specs.static_ecdh = 0;
  325. ssl->specs.key_size = DES3_KEY_SIZE;
  326. ssl->specs.block_size = DES_BLOCK_SIZE;
  327. ssl->specs.iv_size = DES_IV_SIZE;
  328. break;
  329. #endif
  330. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  331. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  332. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  333. ssl->specs.cipher_type = block;
  334. ssl->specs.mac_algorithm = sha_mac;
  335. ssl->specs.kea = ecc_diffie_hellman_kea;
  336. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  337. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  338. ssl->specs.pad_size = PAD_SHA;
  339. ssl->specs.static_ecdh = 1;
  340. ssl->specs.key_size = DES3_KEY_SIZE;
  341. ssl->specs.block_size = DES_BLOCK_SIZE;
  342. ssl->specs.iv_size = DES_IV_SIZE;
  343. break;
  344. #endif
  345. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  346. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  347. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  348. ssl->specs.cipher_type = stream;
  349. ssl->specs.mac_algorithm = sha_mac;
  350. ssl->specs.kea = ecc_diffie_hellman_kea;
  351. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  352. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  353. ssl->specs.pad_size = PAD_SHA;
  354. ssl->specs.static_ecdh = 0;
  355. ssl->specs.key_size = RC4_KEY_SIZE;
  356. ssl->specs.iv_size = 0;
  357. ssl->specs.block_size = 0;
  358. break;
  359. #endif
  360. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  361. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  362. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  363. ssl->specs.cipher_type = stream;
  364. ssl->specs.mac_algorithm = sha_mac;
  365. ssl->specs.kea = ecc_diffie_hellman_kea;
  366. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  367. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  368. ssl->specs.pad_size = PAD_SHA;
  369. ssl->specs.static_ecdh = 1;
  370. ssl->specs.key_size = RC4_KEY_SIZE;
  371. ssl->specs.iv_size = 0;
  372. ssl->specs.block_size = 0;
  373. break;
  374. #endif
  375. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  376. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  377. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  378. ssl->specs.cipher_type = block;
  379. ssl->specs.mac_algorithm = sha_mac;
  380. ssl->specs.kea = ecc_diffie_hellman_kea;
  381. ssl->specs.sig_algo = rsa_sa_algo;
  382. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  383. ssl->specs.pad_size = PAD_SHA;
  384. ssl->specs.static_ecdh = 0;
  385. ssl->specs.key_size = AES_256_KEY_SIZE;
  386. ssl->specs.block_size = AES_BLOCK_SIZE;
  387. ssl->specs.iv_size = AES_IV_SIZE;
  388. break;
  389. #endif
  390. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  391. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  392. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  393. ssl->specs.cipher_type = block;
  394. ssl->specs.mac_algorithm = sha_mac;
  395. ssl->specs.kea = ecc_diffie_hellman_kea;
  396. ssl->specs.sig_algo = rsa_sa_algo;
  397. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  398. ssl->specs.pad_size = PAD_SHA;
  399. ssl->specs.static_ecdh = 1;
  400. ssl->specs.key_size = AES_256_KEY_SIZE;
  401. ssl->specs.block_size = AES_BLOCK_SIZE;
  402. ssl->specs.iv_size = AES_IV_SIZE;
  403. break;
  404. #endif
  405. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  406. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  407. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  408. ssl->specs.cipher_type = block;
  409. ssl->specs.mac_algorithm = sha_mac;
  410. ssl->specs.kea = ecc_diffie_hellman_kea;
  411. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  412. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  413. ssl->specs.pad_size = PAD_SHA;
  414. ssl->specs.static_ecdh = 0;
  415. ssl->specs.key_size = AES_128_KEY_SIZE;
  416. ssl->specs.block_size = AES_BLOCK_SIZE;
  417. ssl->specs.iv_size = AES_IV_SIZE;
  418. break;
  419. #endif
  420. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  421. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  422. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  423. ssl->specs.cipher_type = block;
  424. ssl->specs.mac_algorithm = sha_mac;
  425. ssl->specs.kea = ecc_diffie_hellman_kea;
  426. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  427. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  428. ssl->specs.pad_size = PAD_SHA;
  429. ssl->specs.static_ecdh = 1;
  430. ssl->specs.key_size = AES_128_KEY_SIZE;
  431. ssl->specs.block_size = AES_BLOCK_SIZE;
  432. ssl->specs.iv_size = AES_IV_SIZE;
  433. break;
  434. #endif
  435. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  436. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  437. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  438. ssl->specs.cipher_type = block;
  439. ssl->specs.mac_algorithm = sha_mac;
  440. ssl->specs.kea = ecc_diffie_hellman_kea;
  441. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  442. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  443. ssl->specs.pad_size = PAD_SHA;
  444. ssl->specs.static_ecdh = 0;
  445. ssl->specs.key_size = AES_256_KEY_SIZE;
  446. ssl->specs.block_size = AES_BLOCK_SIZE;
  447. ssl->specs.iv_size = AES_IV_SIZE;
  448. break;
  449. #endif
  450. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  451. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  452. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  453. ssl->specs.cipher_type = block;
  454. ssl->specs.mac_algorithm = sha_mac;
  455. ssl->specs.kea = ecc_diffie_hellman_kea;
  456. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  457. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  458. ssl->specs.pad_size = PAD_SHA;
  459. ssl->specs.static_ecdh = 1;
  460. ssl->specs.key_size = AES_256_KEY_SIZE;
  461. ssl->specs.block_size = AES_BLOCK_SIZE;
  462. ssl->specs.iv_size = AES_IV_SIZE;
  463. break;
  464. #endif
  465. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  466. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  467. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  468. ssl->specs.cipher_type = aead;
  469. ssl->specs.mac_algorithm = sha256_mac;
  470. ssl->specs.kea = ecc_diffie_hellman_kea;
  471. ssl->specs.sig_algo = rsa_sa_algo;
  472. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  473. ssl->specs.pad_size = PAD_SHA;
  474. ssl->specs.static_ecdh = 0;
  475. ssl->specs.key_size = AES_128_KEY_SIZE;
  476. ssl->specs.block_size = AES_BLOCK_SIZE;
  477. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  478. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  479. break;
  480. #endif
  481. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  482. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  483. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  484. ssl->specs.cipher_type = aead;
  485. ssl->specs.mac_algorithm = sha384_mac;
  486. ssl->specs.kea = ecc_diffie_hellman_kea;
  487. ssl->specs.sig_algo = rsa_sa_algo;
  488. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  489. ssl->specs.pad_size = PAD_SHA;
  490. ssl->specs.static_ecdh = 0;
  491. ssl->specs.key_size = AES_256_KEY_SIZE;
  492. ssl->specs.block_size = AES_BLOCK_SIZE;
  493. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  494. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  495. break;
  496. #endif
  497. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  498. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  499. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  500. ssl->specs.cipher_type = aead;
  501. ssl->specs.mac_algorithm = sha256_mac;
  502. ssl->specs.kea = ecc_diffie_hellman_kea;
  503. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  504. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  505. ssl->specs.pad_size = PAD_SHA;
  506. ssl->specs.static_ecdh = 0;
  507. ssl->specs.key_size = AES_128_KEY_SIZE;
  508. ssl->specs.block_size = AES_BLOCK_SIZE;
  509. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  510. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  511. break;
  512. #endif
  513. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  514. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  515. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  516. ssl->specs.cipher_type = aead;
  517. ssl->specs.mac_algorithm = sha384_mac;
  518. ssl->specs.kea = ecc_diffie_hellman_kea;
  519. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  520. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  521. ssl->specs.pad_size = PAD_SHA;
  522. ssl->specs.static_ecdh = 0;
  523. ssl->specs.key_size = AES_256_KEY_SIZE;
  524. ssl->specs.block_size = AES_BLOCK_SIZE;
  525. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  526. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  527. break;
  528. #endif
  529. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  530. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  531. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  532. ssl->specs.cipher_type = aead;
  533. ssl->specs.mac_algorithm = sha256_mac;
  534. ssl->specs.kea = ecc_diffie_hellman_kea;
  535. ssl->specs.sig_algo = rsa_sa_algo;
  536. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  537. ssl->specs.pad_size = PAD_SHA;
  538. ssl->specs.static_ecdh = 1;
  539. ssl->specs.key_size = AES_128_KEY_SIZE;
  540. ssl->specs.block_size = AES_BLOCK_SIZE;
  541. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  542. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  543. break;
  544. #endif
  545. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  546. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  547. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  548. ssl->specs.cipher_type = aead;
  549. ssl->specs.mac_algorithm = sha384_mac;
  550. ssl->specs.kea = ecc_diffie_hellman_kea;
  551. ssl->specs.sig_algo = rsa_sa_algo;
  552. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  553. ssl->specs.pad_size = PAD_SHA;
  554. ssl->specs.static_ecdh = 1;
  555. ssl->specs.key_size = AES_256_KEY_SIZE;
  556. ssl->specs.block_size = AES_BLOCK_SIZE;
  557. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  558. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  559. break;
  560. #endif
  561. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  562. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  563. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  564. ssl->specs.cipher_type = aead;
  565. ssl->specs.mac_algorithm = sha256_mac;
  566. ssl->specs.kea = ecc_diffie_hellman_kea;
  567. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  568. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  569. ssl->specs.pad_size = PAD_SHA;
  570. ssl->specs.static_ecdh = 1;
  571. ssl->specs.key_size = AES_128_KEY_SIZE;
  572. ssl->specs.block_size = AES_BLOCK_SIZE;
  573. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  574. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  575. break;
  576. #endif
  577. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  578. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  579. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  580. ssl->specs.cipher_type = aead;
  581. ssl->specs.mac_algorithm = sha384_mac;
  582. ssl->specs.kea = ecc_diffie_hellman_kea;
  583. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  584. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  585. ssl->specs.pad_size = PAD_SHA;
  586. ssl->specs.static_ecdh = 1;
  587. ssl->specs.key_size = AES_256_KEY_SIZE;
  588. ssl->specs.block_size = AES_BLOCK_SIZE;
  589. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  590. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  591. break;
  592. #endif
  593. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  594. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  595. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  596. ssl->specs.cipher_type = aead;
  597. ssl->specs.mac_algorithm = sha256_mac;
  598. ssl->specs.kea = ecc_diffie_hellman_kea;
  599. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  600. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  601. ssl->specs.pad_size = PAD_SHA;
  602. ssl->specs.static_ecdh = 0;
  603. ssl->specs.key_size = AES_128_KEY_SIZE;
  604. ssl->specs.block_size = AES_BLOCK_SIZE;
  605. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  606. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  607. break;
  608. #endif
  609. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  610. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  611. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  612. ssl->specs.cipher_type = aead;
  613. ssl->specs.mac_algorithm = sha256_mac;
  614. ssl->specs.kea = ecc_diffie_hellman_kea;
  615. ssl->specs.sig_algo = ecc_dsa_sa_algo;
  616. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  617. ssl->specs.pad_size = PAD_SHA;
  618. ssl->specs.static_ecdh = 0;
  619. ssl->specs.key_size = AES_256_KEY_SIZE;
  620. ssl->specs.block_size = AES_BLOCK_SIZE;
  621. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  622. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  623. break;
  624. #endif
  625. #endif /* HAVE_ECC */
  626. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  627. case TLS_RSA_WITH_AES_128_CCM_8 :
  628. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  629. ssl->specs.cipher_type = aead;
  630. ssl->specs.mac_algorithm = sha256_mac;
  631. ssl->specs.kea = rsa_kea;
  632. ssl->specs.sig_algo = rsa_sa_algo;
  633. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  634. ssl->specs.pad_size = PAD_SHA;
  635. ssl->specs.static_ecdh = 0;
  636. ssl->specs.key_size = AES_128_KEY_SIZE;
  637. ssl->specs.block_size = AES_BLOCK_SIZE;
  638. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  639. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  640. break;
  641. #endif
  642. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  643. case TLS_RSA_WITH_AES_256_CCM_8 :
  644. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  645. ssl->specs.cipher_type = aead;
  646. ssl->specs.mac_algorithm = sha256_mac;
  647. ssl->specs.kea = rsa_kea;
  648. ssl->specs.sig_algo = rsa_sa_algo;
  649. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  650. ssl->specs.pad_size = PAD_SHA;
  651. ssl->specs.static_ecdh = 0;
  652. ssl->specs.key_size = AES_256_KEY_SIZE;
  653. ssl->specs.block_size = AES_BLOCK_SIZE;
  654. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  655. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  656. break;
  657. #endif
  658. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  659. case TLS_PSK_WITH_AES_128_CCM_8 :
  660. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  661. ssl->specs.cipher_type = aead;
  662. ssl->specs.mac_algorithm = sha256_mac;
  663. ssl->specs.kea = psk_kea;
  664. ssl->specs.sig_algo = anonymous_sa_algo;
  665. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  666. ssl->specs.pad_size = PAD_SHA;
  667. ssl->specs.static_ecdh = 0;
  668. ssl->specs.key_size = AES_128_KEY_SIZE;
  669. ssl->specs.block_size = AES_BLOCK_SIZE;
  670. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  671. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  672. ssl->options.usingPSK_cipher = 1;
  673. break;
  674. #endif
  675. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  676. case TLS_PSK_WITH_AES_256_CCM_8 :
  677. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  678. ssl->specs.cipher_type = aead;
  679. ssl->specs.mac_algorithm = sha256_mac;
  680. ssl->specs.kea = psk_kea;
  681. ssl->specs.sig_algo = anonymous_sa_algo;
  682. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  683. ssl->specs.pad_size = PAD_SHA;
  684. ssl->specs.static_ecdh = 0;
  685. ssl->specs.key_size = AES_256_KEY_SIZE;
  686. ssl->specs.block_size = AES_BLOCK_SIZE;
  687. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  688. ssl->specs.aead_mac_size = AES_CCM_8_AUTH_SZ;
  689. ssl->options.usingPSK_cipher = 1;
  690. break;
  691. #endif
  692. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  693. case TLS_PSK_WITH_AES_128_CCM :
  694. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  695. ssl->specs.cipher_type = aead;
  696. ssl->specs.mac_algorithm = sha256_mac;
  697. ssl->specs.kea = psk_kea;
  698. ssl->specs.sig_algo = anonymous_sa_algo;
  699. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  700. ssl->specs.pad_size = PAD_SHA;
  701. ssl->specs.static_ecdh = 0;
  702. ssl->specs.key_size = AES_128_KEY_SIZE;
  703. ssl->specs.block_size = AES_BLOCK_SIZE;
  704. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  705. ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ;
  706. ssl->options.usingPSK_cipher = 1;
  707. break;
  708. #endif
  709. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  710. case TLS_PSK_WITH_AES_256_CCM :
  711. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  712. ssl->specs.cipher_type = aead;
  713. ssl->specs.mac_algorithm = sha256_mac;
  714. ssl->specs.kea = psk_kea;
  715. ssl->specs.sig_algo = anonymous_sa_algo;
  716. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  717. ssl->specs.pad_size = PAD_SHA;
  718. ssl->specs.static_ecdh = 0;
  719. ssl->specs.key_size = AES_256_KEY_SIZE;
  720. ssl->specs.block_size = AES_BLOCK_SIZE;
  721. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  722. ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ;
  723. ssl->options.usingPSK_cipher = 1;
  724. break;
  725. #endif
  726. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  727. case TLS_DHE_PSK_WITH_AES_128_CCM :
  728. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  729. ssl->specs.cipher_type = aead;
  730. ssl->specs.mac_algorithm = sha256_mac;
  731. ssl->specs.kea = dhe_psk_kea;
  732. ssl->specs.sig_algo = anonymous_sa_algo;
  733. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  734. ssl->specs.pad_size = PAD_SHA;
  735. ssl->specs.static_ecdh = 0;
  736. ssl->specs.key_size = AES_128_KEY_SIZE;
  737. ssl->specs.block_size = AES_BLOCK_SIZE;
  738. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  739. ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ;
  740. ssl->options.usingPSK_cipher = 1;
  741. break;
  742. #endif
  743. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  744. case TLS_DHE_PSK_WITH_AES_256_CCM :
  745. ssl->specs.bulk_cipher_algorithm = cyassl_aes_ccm;
  746. ssl->specs.cipher_type = aead;
  747. ssl->specs.mac_algorithm = sha256_mac;
  748. ssl->specs.kea = dhe_psk_kea;
  749. ssl->specs.sig_algo = anonymous_sa_algo;
  750. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  751. ssl->specs.pad_size = PAD_SHA;
  752. ssl->specs.static_ecdh = 0;
  753. ssl->specs.key_size = AES_256_KEY_SIZE;
  754. ssl->specs.block_size = AES_BLOCK_SIZE;
  755. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  756. ssl->specs.aead_mac_size = AES_CCM_16_AUTH_SZ;
  757. ssl->options.usingPSK_cipher = 1;
  758. break;
  759. #endif
  760. default:
  761. CYASSL_MSG("Unsupported cipher suite, SetCipherSpecs ECC");
  762. return UNSUPPORTED_SUITE;
  763. } /* switch */
  764. } /* if */
  765. if (ssl->options.cipherSuite0 != ECC_BYTE &&
  766. ssl->options.cipherSuite0 != CHACHA_BYTE) { /* normal suites */
  767. switch (ssl->options.cipherSuite) {
  768. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  769. case SSL_RSA_WITH_RC4_128_SHA :
  770. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  771. ssl->specs.cipher_type = stream;
  772. ssl->specs.mac_algorithm = sha_mac;
  773. ssl->specs.kea = rsa_kea;
  774. ssl->specs.sig_algo = rsa_sa_algo;
  775. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  776. ssl->specs.pad_size = PAD_SHA;
  777. ssl->specs.static_ecdh = 0;
  778. ssl->specs.key_size = RC4_KEY_SIZE;
  779. ssl->specs.iv_size = 0;
  780. ssl->specs.block_size = 0;
  781. break;
  782. #endif
  783. #ifdef BUILD_TLS_NTRU_RSA_WITH_RC4_128_SHA
  784. case TLS_NTRU_RSA_WITH_RC4_128_SHA :
  785. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  786. ssl->specs.cipher_type = stream;
  787. ssl->specs.mac_algorithm = sha_mac;
  788. ssl->specs.kea = ntru_kea;
  789. ssl->specs.sig_algo = rsa_sa_algo;
  790. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  791. ssl->specs.pad_size = PAD_SHA;
  792. ssl->specs.static_ecdh = 0;
  793. ssl->specs.key_size = RC4_KEY_SIZE;
  794. ssl->specs.iv_size = 0;
  795. ssl->specs.block_size = 0;
  796. break;
  797. #endif
  798. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  799. case SSL_RSA_WITH_RC4_128_MD5 :
  800. ssl->specs.bulk_cipher_algorithm = cyassl_rc4;
  801. ssl->specs.cipher_type = stream;
  802. ssl->specs.mac_algorithm = md5_mac;
  803. ssl->specs.kea = rsa_kea;
  804. ssl->specs.sig_algo = rsa_sa_algo;
  805. ssl->specs.hash_size = MD5_DIGEST_SIZE;
  806. ssl->specs.pad_size = PAD_MD5;
  807. ssl->specs.static_ecdh = 0;
  808. ssl->specs.key_size = RC4_KEY_SIZE;
  809. ssl->specs.iv_size = 0;
  810. ssl->specs.block_size = 0;
  811. break;
  812. #endif
  813. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  814. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  815. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  816. ssl->specs.cipher_type = block;
  817. ssl->specs.mac_algorithm = sha_mac;
  818. ssl->specs.kea = rsa_kea;
  819. ssl->specs.sig_algo = rsa_sa_algo;
  820. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  821. ssl->specs.pad_size = PAD_SHA;
  822. ssl->specs.static_ecdh = 0;
  823. ssl->specs.key_size = DES3_KEY_SIZE;
  824. ssl->specs.block_size = DES_BLOCK_SIZE;
  825. ssl->specs.iv_size = DES_IV_SIZE;
  826. break;
  827. #endif
  828. #ifdef BUILD_TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA
  829. case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
  830. ssl->specs.bulk_cipher_algorithm = cyassl_triple_des;
  831. ssl->specs.cipher_type = block;
  832. ssl->specs.mac_algorithm = sha_mac;
  833. ssl->specs.kea = ntru_kea;
  834. ssl->specs.sig_algo = rsa_sa_algo;
  835. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  836. ssl->specs.pad_size = PAD_SHA;
  837. ssl->specs.static_ecdh = 0;
  838. ssl->specs.key_size = DES3_KEY_SIZE;
  839. ssl->specs.block_size = DES_BLOCK_SIZE;
  840. ssl->specs.iv_size = DES_IV_SIZE;
  841. break;
  842. #endif
  843. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  844. case TLS_RSA_WITH_AES_128_CBC_SHA :
  845. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  846. ssl->specs.cipher_type = block;
  847. ssl->specs.mac_algorithm = sha_mac;
  848. ssl->specs.kea = rsa_kea;
  849. ssl->specs.sig_algo = rsa_sa_algo;
  850. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  851. ssl->specs.pad_size = PAD_SHA;
  852. ssl->specs.static_ecdh = 0;
  853. ssl->specs.key_size = AES_128_KEY_SIZE;
  854. ssl->specs.block_size = AES_BLOCK_SIZE;
  855. ssl->specs.iv_size = AES_IV_SIZE;
  856. break;
  857. #endif
  858. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  859. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  860. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  861. ssl->specs.cipher_type = block;
  862. ssl->specs.mac_algorithm = sha256_mac;
  863. ssl->specs.kea = rsa_kea;
  864. ssl->specs.sig_algo = rsa_sa_algo;
  865. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  866. ssl->specs.pad_size = PAD_SHA;
  867. ssl->specs.static_ecdh = 0;
  868. ssl->specs.key_size = AES_128_KEY_SIZE;
  869. ssl->specs.block_size = AES_BLOCK_SIZE;
  870. ssl->specs.iv_size = AES_IV_SIZE;
  871. break;
  872. #endif
  873. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  874. case TLS_RSA_WITH_NULL_SHA :
  875. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  876. ssl->specs.cipher_type = stream;
  877. ssl->specs.mac_algorithm = sha_mac;
  878. ssl->specs.kea = rsa_kea;
  879. ssl->specs.sig_algo = rsa_sa_algo;
  880. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  881. ssl->specs.pad_size = PAD_SHA;
  882. ssl->specs.static_ecdh = 0;
  883. ssl->specs.key_size = 0;
  884. ssl->specs.block_size = 0;
  885. ssl->specs.iv_size = 0;
  886. break;
  887. #endif
  888. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  889. case TLS_RSA_WITH_NULL_SHA256 :
  890. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  891. ssl->specs.cipher_type = stream;
  892. ssl->specs.mac_algorithm = sha256_mac;
  893. ssl->specs.kea = rsa_kea;
  894. ssl->specs.sig_algo = rsa_sa_algo;
  895. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  896. ssl->specs.pad_size = PAD_SHA;
  897. ssl->specs.static_ecdh = 0;
  898. ssl->specs.key_size = 0;
  899. ssl->specs.block_size = 0;
  900. ssl->specs.iv_size = 0;
  901. break;
  902. #endif
  903. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_128_CBC_SHA
  904. case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
  905. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  906. ssl->specs.cipher_type = block;
  907. ssl->specs.mac_algorithm = sha_mac;
  908. ssl->specs.kea = ntru_kea;
  909. ssl->specs.sig_algo = rsa_sa_algo;
  910. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  911. ssl->specs.pad_size = PAD_SHA;
  912. ssl->specs.static_ecdh = 0;
  913. ssl->specs.key_size = AES_128_KEY_SIZE;
  914. ssl->specs.block_size = AES_BLOCK_SIZE;
  915. ssl->specs.iv_size = AES_IV_SIZE;
  916. break;
  917. #endif
  918. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  919. case TLS_RSA_WITH_AES_256_CBC_SHA :
  920. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  921. ssl->specs.cipher_type = block;
  922. ssl->specs.mac_algorithm = sha_mac;
  923. ssl->specs.kea = rsa_kea;
  924. ssl->specs.sig_algo = rsa_sa_algo;
  925. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  926. ssl->specs.pad_size = PAD_SHA;
  927. ssl->specs.static_ecdh = 0;
  928. ssl->specs.key_size = AES_256_KEY_SIZE;
  929. ssl->specs.block_size = AES_BLOCK_SIZE;
  930. ssl->specs.iv_size = AES_IV_SIZE;
  931. break;
  932. #endif
  933. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  934. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  935. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  936. ssl->specs.cipher_type = block;
  937. ssl->specs.mac_algorithm = sha256_mac;
  938. ssl->specs.kea = rsa_kea;
  939. ssl->specs.sig_algo = rsa_sa_algo;
  940. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  941. ssl->specs.pad_size = PAD_SHA;
  942. ssl->specs.static_ecdh = 0;
  943. ssl->specs.key_size = AES_256_KEY_SIZE;
  944. ssl->specs.block_size = AES_BLOCK_SIZE;
  945. ssl->specs.iv_size = AES_IV_SIZE;
  946. break;
  947. #endif
  948. #ifdef BUILD_TLS_NTRU_RSA_WITH_AES_256_CBC_SHA
  949. case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
  950. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  951. ssl->specs.cipher_type = block;
  952. ssl->specs.mac_algorithm = sha_mac;
  953. ssl->specs.kea = ntru_kea;
  954. ssl->specs.sig_algo = rsa_sa_algo;
  955. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  956. ssl->specs.pad_size = PAD_SHA;
  957. ssl->specs.static_ecdh = 0;
  958. ssl->specs.key_size = AES_256_KEY_SIZE;
  959. ssl->specs.block_size = AES_BLOCK_SIZE;
  960. ssl->specs.iv_size = AES_IV_SIZE;
  961. break;
  962. #endif
  963. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  964. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  965. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  966. ssl->specs.cipher_type = aead;
  967. ssl->specs.mac_algorithm = sha256_mac;
  968. ssl->specs.kea = psk_kea;
  969. ssl->specs.sig_algo = anonymous_sa_algo;
  970. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  971. ssl->specs.pad_size = PAD_SHA;
  972. ssl->specs.static_ecdh = 0;
  973. ssl->specs.key_size = AES_128_KEY_SIZE;
  974. ssl->specs.block_size = AES_BLOCK_SIZE;
  975. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  976. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  977. ssl->options.usingPSK_cipher = 1;
  978. break;
  979. #endif
  980. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  981. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  982. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  983. ssl->specs.cipher_type = aead;
  984. ssl->specs.mac_algorithm = sha384_mac;
  985. ssl->specs.kea = psk_kea;
  986. ssl->specs.sig_algo = anonymous_sa_algo;
  987. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  988. ssl->specs.pad_size = PAD_SHA;
  989. ssl->specs.static_ecdh = 0;
  990. ssl->specs.key_size = AES_256_KEY_SIZE;
  991. ssl->specs.block_size = AES_BLOCK_SIZE;
  992. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  993. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  994. ssl->options.usingPSK_cipher = 1;
  995. break;
  996. #endif
  997. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  998. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  999. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1000. ssl->specs.cipher_type = aead;
  1001. ssl->specs.mac_algorithm = sha256_mac;
  1002. ssl->specs.kea = dhe_psk_kea;
  1003. ssl->specs.sig_algo = anonymous_sa_algo;
  1004. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1005. ssl->specs.pad_size = PAD_SHA;
  1006. ssl->specs.static_ecdh = 0;
  1007. ssl->specs.key_size = AES_128_KEY_SIZE;
  1008. ssl->specs.block_size = AES_BLOCK_SIZE;
  1009. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1010. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1011. ssl->options.usingPSK_cipher = 1;
  1012. break;
  1013. #endif
  1014. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  1015. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  1016. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1017. ssl->specs.cipher_type = aead;
  1018. ssl->specs.mac_algorithm = sha384_mac;
  1019. ssl->specs.kea = dhe_psk_kea;
  1020. ssl->specs.sig_algo = anonymous_sa_algo;
  1021. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1022. ssl->specs.pad_size = PAD_SHA;
  1023. ssl->specs.static_ecdh = 0;
  1024. ssl->specs.key_size = AES_256_KEY_SIZE;
  1025. ssl->specs.block_size = AES_BLOCK_SIZE;
  1026. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1027. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1028. ssl->options.usingPSK_cipher = 1;
  1029. break;
  1030. #endif
  1031. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  1032. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  1033. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1034. ssl->specs.cipher_type = block;
  1035. ssl->specs.mac_algorithm = sha256_mac;
  1036. ssl->specs.kea = psk_kea;
  1037. ssl->specs.sig_algo = anonymous_sa_algo;
  1038. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1039. ssl->specs.pad_size = PAD_SHA;
  1040. ssl->specs.static_ecdh = 0;
  1041. ssl->specs.key_size = AES_128_KEY_SIZE;
  1042. ssl->specs.block_size = AES_BLOCK_SIZE;
  1043. ssl->specs.iv_size = AES_IV_SIZE;
  1044. ssl->options.usingPSK_cipher = 1;
  1045. break;
  1046. #endif
  1047. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  1048. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  1049. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1050. ssl->specs.cipher_type = block;
  1051. ssl->specs.mac_algorithm = sha384_mac;
  1052. ssl->specs.kea = psk_kea;
  1053. ssl->specs.sig_algo = anonymous_sa_algo;
  1054. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1055. ssl->specs.pad_size = PAD_SHA;
  1056. ssl->specs.static_ecdh = 0;
  1057. ssl->specs.key_size = AES_256_KEY_SIZE;
  1058. ssl->specs.block_size = AES_BLOCK_SIZE;
  1059. ssl->specs.iv_size = AES_IV_SIZE;
  1060. ssl->options.usingPSK_cipher = 1;
  1061. break;
  1062. #endif
  1063. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  1064. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  1065. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1066. ssl->specs.cipher_type = block;
  1067. ssl->specs.mac_algorithm = sha256_mac;
  1068. ssl->specs.kea = dhe_psk_kea;
  1069. ssl->specs.sig_algo = anonymous_sa_algo;
  1070. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1071. ssl->specs.pad_size = PAD_SHA;
  1072. ssl->specs.static_ecdh = 0;
  1073. ssl->specs.key_size = AES_128_KEY_SIZE;
  1074. ssl->specs.block_size = AES_BLOCK_SIZE;
  1075. ssl->specs.iv_size = AES_IV_SIZE;
  1076. ssl->options.usingPSK_cipher = 1;
  1077. break;
  1078. #endif
  1079. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  1080. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  1081. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1082. ssl->specs.cipher_type = block;
  1083. ssl->specs.mac_algorithm = sha384_mac;
  1084. ssl->specs.kea = dhe_psk_kea;
  1085. ssl->specs.sig_algo = anonymous_sa_algo;
  1086. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1087. ssl->specs.pad_size = PAD_SHA;
  1088. ssl->specs.static_ecdh = 0;
  1089. ssl->specs.key_size = AES_256_KEY_SIZE;
  1090. ssl->specs.block_size = AES_BLOCK_SIZE;
  1091. ssl->specs.iv_size = AES_IV_SIZE;
  1092. ssl->options.usingPSK_cipher = 1;
  1093. break;
  1094. #endif
  1095. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  1096. case TLS_PSK_WITH_AES_128_CBC_SHA :
  1097. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1098. ssl->specs.cipher_type = block;
  1099. ssl->specs.mac_algorithm = sha_mac;
  1100. ssl->specs.kea = psk_kea;
  1101. ssl->specs.sig_algo = anonymous_sa_algo;
  1102. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1103. ssl->specs.pad_size = PAD_SHA;
  1104. ssl->specs.static_ecdh = 0;
  1105. ssl->specs.key_size = AES_128_KEY_SIZE;
  1106. ssl->specs.block_size = AES_BLOCK_SIZE;
  1107. ssl->specs.iv_size = AES_IV_SIZE;
  1108. ssl->options.usingPSK_cipher = 1;
  1109. break;
  1110. #endif
  1111. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  1112. case TLS_PSK_WITH_AES_256_CBC_SHA :
  1113. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1114. ssl->specs.cipher_type = block;
  1115. ssl->specs.mac_algorithm = sha_mac;
  1116. ssl->specs.kea = psk_kea;
  1117. ssl->specs.sig_algo = anonymous_sa_algo;
  1118. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1119. ssl->specs.pad_size = PAD_SHA;
  1120. ssl->specs.static_ecdh = 0;
  1121. ssl->specs.key_size = AES_256_KEY_SIZE;
  1122. ssl->specs.block_size = AES_BLOCK_SIZE;
  1123. ssl->specs.iv_size = AES_IV_SIZE;
  1124. ssl->options.usingPSK_cipher = 1;
  1125. break;
  1126. #endif
  1127. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  1128. case TLS_PSK_WITH_NULL_SHA256 :
  1129. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  1130. ssl->specs.cipher_type = stream;
  1131. ssl->specs.mac_algorithm = sha256_mac;
  1132. ssl->specs.kea = psk_kea;
  1133. ssl->specs.sig_algo = anonymous_sa_algo;
  1134. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1135. ssl->specs.pad_size = PAD_SHA;
  1136. ssl->specs.static_ecdh = 0;
  1137. ssl->specs.key_size = 0;
  1138. ssl->specs.block_size = 0;
  1139. ssl->specs.iv_size = 0;
  1140. ssl->options.usingPSK_cipher = 1;
  1141. break;
  1142. #endif
  1143. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  1144. case TLS_PSK_WITH_NULL_SHA384 :
  1145. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  1146. ssl->specs.cipher_type = stream;
  1147. ssl->specs.mac_algorithm = sha384_mac;
  1148. ssl->specs.kea = psk_kea;
  1149. ssl->specs.sig_algo = anonymous_sa_algo;
  1150. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1151. ssl->specs.pad_size = PAD_SHA;
  1152. ssl->specs.static_ecdh = 0;
  1153. ssl->specs.key_size = 0;
  1154. ssl->specs.block_size = 0;
  1155. ssl->specs.iv_size = 0;
  1156. ssl->options.usingPSK_cipher = 1;
  1157. break;
  1158. #endif
  1159. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  1160. case TLS_PSK_WITH_NULL_SHA :
  1161. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  1162. ssl->specs.cipher_type = stream;
  1163. ssl->specs.mac_algorithm = sha_mac;
  1164. ssl->specs.kea = psk_kea;
  1165. ssl->specs.sig_algo = anonymous_sa_algo;
  1166. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1167. ssl->specs.pad_size = PAD_SHA;
  1168. ssl->specs.static_ecdh = 0;
  1169. ssl->specs.key_size = 0;
  1170. ssl->specs.block_size = 0;
  1171. ssl->specs.iv_size = 0;
  1172. ssl->options.usingPSK_cipher = 1;
  1173. break;
  1174. #endif
  1175. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  1176. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  1177. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  1178. ssl->specs.cipher_type = stream;
  1179. ssl->specs.mac_algorithm = sha256_mac;
  1180. ssl->specs.kea = dhe_psk_kea;
  1181. ssl->specs.sig_algo = anonymous_sa_algo;
  1182. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1183. ssl->specs.pad_size = PAD_SHA;
  1184. ssl->specs.static_ecdh = 0;
  1185. ssl->specs.key_size = 0;
  1186. ssl->specs.block_size = 0;
  1187. ssl->specs.iv_size = 0;
  1188. ssl->options.usingPSK_cipher = 1;
  1189. break;
  1190. #endif
  1191. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  1192. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  1193. ssl->specs.bulk_cipher_algorithm = cyassl_cipher_null;
  1194. ssl->specs.cipher_type = stream;
  1195. ssl->specs.mac_algorithm = sha384_mac;
  1196. ssl->specs.kea = dhe_psk_kea;
  1197. ssl->specs.sig_algo = anonymous_sa_algo;
  1198. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1199. ssl->specs.pad_size = PAD_SHA;
  1200. ssl->specs.static_ecdh = 0;
  1201. ssl->specs.key_size = 0;
  1202. ssl->specs.block_size = 0;
  1203. ssl->specs.iv_size = 0;
  1204. ssl->options.usingPSK_cipher = 1;
  1205. break;
  1206. #endif
  1207. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  1208. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  1209. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1210. ssl->specs.cipher_type = block;
  1211. ssl->specs.mac_algorithm = sha256_mac;
  1212. ssl->specs.kea = diffie_hellman_kea;
  1213. ssl->specs.sig_algo = rsa_sa_algo;
  1214. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1215. ssl->specs.pad_size = PAD_SHA;
  1216. ssl->specs.static_ecdh = 0;
  1217. ssl->specs.key_size = AES_128_KEY_SIZE;
  1218. ssl->specs.block_size = AES_BLOCK_SIZE;
  1219. ssl->specs.iv_size = AES_IV_SIZE;
  1220. break;
  1221. #endif
  1222. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  1223. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  1224. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1225. ssl->specs.cipher_type = block;
  1226. ssl->specs.mac_algorithm = sha256_mac;
  1227. ssl->specs.kea = diffie_hellman_kea;
  1228. ssl->specs.sig_algo = rsa_sa_algo;
  1229. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1230. ssl->specs.pad_size = PAD_SHA;
  1231. ssl->specs.static_ecdh = 0;
  1232. ssl->specs.key_size = AES_256_KEY_SIZE;
  1233. ssl->specs.block_size = AES_BLOCK_SIZE;
  1234. ssl->specs.iv_size = AES_IV_SIZE;
  1235. break;
  1236. #endif
  1237. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  1238. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  1239. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1240. ssl->specs.cipher_type = block;
  1241. ssl->specs.mac_algorithm = sha_mac;
  1242. ssl->specs.kea = diffie_hellman_kea;
  1243. ssl->specs.sig_algo = rsa_sa_algo;
  1244. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1245. ssl->specs.pad_size = PAD_SHA;
  1246. ssl->specs.static_ecdh = 0;
  1247. ssl->specs.key_size = AES_128_KEY_SIZE;
  1248. ssl->specs.block_size = AES_BLOCK_SIZE;
  1249. ssl->specs.iv_size = AES_IV_SIZE;
  1250. break;
  1251. #endif
  1252. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  1253. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  1254. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1255. ssl->specs.cipher_type = block;
  1256. ssl->specs.mac_algorithm = sha_mac;
  1257. ssl->specs.kea = diffie_hellman_kea;
  1258. ssl->specs.sig_algo = rsa_sa_algo;
  1259. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1260. ssl->specs.pad_size = PAD_SHA;
  1261. ssl->specs.static_ecdh = 0;
  1262. ssl->specs.key_size = AES_256_KEY_SIZE;
  1263. ssl->specs.block_size = AES_BLOCK_SIZE;
  1264. ssl->specs.iv_size = AES_IV_SIZE;
  1265. break;
  1266. #endif
  1267. #ifdef BUILD_TLS_RSA_WITH_HC_128_MD5
  1268. case TLS_RSA_WITH_HC_128_MD5 :
  1269. ssl->specs.bulk_cipher_algorithm = cyassl_hc128;
  1270. ssl->specs.cipher_type = stream;
  1271. ssl->specs.mac_algorithm = md5_mac;
  1272. ssl->specs.kea = rsa_kea;
  1273. ssl->specs.sig_algo = rsa_sa_algo;
  1274. ssl->specs.hash_size = MD5_DIGEST_SIZE;
  1275. ssl->specs.pad_size = PAD_MD5;
  1276. ssl->specs.static_ecdh = 0;
  1277. ssl->specs.key_size = HC_128_KEY_SIZE;
  1278. ssl->specs.block_size = 0;
  1279. ssl->specs.iv_size = HC_128_IV_SIZE;
  1280. break;
  1281. #endif
  1282. #ifdef BUILD_TLS_RSA_WITH_HC_128_SHA
  1283. case TLS_RSA_WITH_HC_128_SHA :
  1284. ssl->specs.bulk_cipher_algorithm = cyassl_hc128;
  1285. ssl->specs.cipher_type = stream;
  1286. ssl->specs.mac_algorithm = sha_mac;
  1287. ssl->specs.kea = rsa_kea;
  1288. ssl->specs.sig_algo = rsa_sa_algo;
  1289. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1290. ssl->specs.pad_size = PAD_SHA;
  1291. ssl->specs.static_ecdh = 0;
  1292. ssl->specs.key_size = HC_128_KEY_SIZE;
  1293. ssl->specs.block_size = 0;
  1294. ssl->specs.iv_size = HC_128_IV_SIZE;
  1295. break;
  1296. #endif
  1297. #ifdef BUILD_TLS_RSA_WITH_HC_128_B2B256
  1298. case TLS_RSA_WITH_HC_128_B2B256:
  1299. ssl->specs.bulk_cipher_algorithm = cyassl_hc128;
  1300. ssl->specs.cipher_type = stream;
  1301. ssl->specs.mac_algorithm = blake2b_mac;
  1302. ssl->specs.kea = rsa_kea;
  1303. ssl->specs.sig_algo = rsa_sa_algo;
  1304. ssl->specs.hash_size = BLAKE2B_256;
  1305. ssl->specs.pad_size = PAD_SHA;
  1306. ssl->specs.static_ecdh = 0;
  1307. ssl->specs.key_size = HC_128_KEY_SIZE;
  1308. ssl->specs.block_size = 0;
  1309. ssl->specs.iv_size = HC_128_IV_SIZE;
  1310. break;
  1311. #endif
  1312. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_B2B256
  1313. case TLS_RSA_WITH_AES_128_CBC_B2B256:
  1314. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1315. ssl->specs.cipher_type = block;
  1316. ssl->specs.mac_algorithm = blake2b_mac;
  1317. ssl->specs.kea = rsa_kea;
  1318. ssl->specs.sig_algo = rsa_sa_algo;
  1319. ssl->specs.hash_size = BLAKE2B_256;
  1320. ssl->specs.pad_size = PAD_SHA;
  1321. ssl->specs.static_ecdh = 0;
  1322. ssl->specs.key_size = AES_128_KEY_SIZE;
  1323. ssl->specs.iv_size = AES_IV_SIZE;
  1324. ssl->specs.block_size = AES_BLOCK_SIZE;
  1325. break;
  1326. #endif
  1327. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_B2B256
  1328. case TLS_RSA_WITH_AES_256_CBC_B2B256:
  1329. ssl->specs.bulk_cipher_algorithm = cyassl_aes;
  1330. ssl->specs.cipher_type = block;
  1331. ssl->specs.mac_algorithm = blake2b_mac;
  1332. ssl->specs.kea = rsa_kea;
  1333. ssl->specs.sig_algo = rsa_sa_algo;
  1334. ssl->specs.hash_size = BLAKE2B_256;
  1335. ssl->specs.pad_size = PAD_SHA;
  1336. ssl->specs.static_ecdh = 0;
  1337. ssl->specs.key_size = AES_256_KEY_SIZE;
  1338. ssl->specs.iv_size = AES_IV_SIZE;
  1339. ssl->specs.block_size = AES_BLOCK_SIZE;
  1340. break;
  1341. #endif
  1342. #ifdef BUILD_TLS_RSA_WITH_RABBIT_SHA
  1343. case TLS_RSA_WITH_RABBIT_SHA :
  1344. ssl->specs.bulk_cipher_algorithm = cyassl_rabbit;
  1345. ssl->specs.cipher_type = stream;
  1346. ssl->specs.mac_algorithm = sha_mac;
  1347. ssl->specs.kea = rsa_kea;
  1348. ssl->specs.sig_algo = rsa_sa_algo;
  1349. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1350. ssl->specs.pad_size = PAD_SHA;
  1351. ssl->specs.static_ecdh = 0;
  1352. ssl->specs.key_size = RABBIT_KEY_SIZE;
  1353. ssl->specs.block_size = 0;
  1354. ssl->specs.iv_size = RABBIT_IV_SIZE;
  1355. break;
  1356. #endif
  1357. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  1358. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  1359. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1360. ssl->specs.cipher_type = aead;
  1361. ssl->specs.mac_algorithm = sha256_mac;
  1362. ssl->specs.kea = rsa_kea;
  1363. ssl->specs.sig_algo = rsa_sa_algo;
  1364. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1365. ssl->specs.pad_size = PAD_SHA;
  1366. ssl->specs.static_ecdh = 0;
  1367. ssl->specs.key_size = AES_128_KEY_SIZE;
  1368. ssl->specs.block_size = AES_BLOCK_SIZE;
  1369. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1370. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1371. break;
  1372. #endif
  1373. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  1374. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  1375. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1376. ssl->specs.cipher_type = aead;
  1377. ssl->specs.mac_algorithm = sha384_mac;
  1378. ssl->specs.kea = rsa_kea;
  1379. ssl->specs.sig_algo = rsa_sa_algo;
  1380. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1381. ssl->specs.pad_size = PAD_SHA;
  1382. ssl->specs.static_ecdh = 0;
  1383. ssl->specs.key_size = AES_256_KEY_SIZE;
  1384. ssl->specs.block_size = AES_BLOCK_SIZE;
  1385. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1386. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1387. break;
  1388. #endif
  1389. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  1390. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  1391. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1392. ssl->specs.cipher_type = aead;
  1393. ssl->specs.mac_algorithm = sha256_mac;
  1394. ssl->specs.kea = diffie_hellman_kea;
  1395. ssl->specs.sig_algo = rsa_sa_algo;
  1396. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1397. ssl->specs.pad_size = PAD_SHA;
  1398. ssl->specs.static_ecdh = 0;
  1399. ssl->specs.key_size = AES_128_KEY_SIZE;
  1400. ssl->specs.block_size = AES_BLOCK_SIZE;
  1401. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1402. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1403. break;
  1404. #endif
  1405. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  1406. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  1407. ssl->specs.bulk_cipher_algorithm = cyassl_aes_gcm;
  1408. ssl->specs.cipher_type = aead;
  1409. ssl->specs.mac_algorithm = sha384_mac;
  1410. ssl->specs.kea = diffie_hellman_kea;
  1411. ssl->specs.sig_algo = rsa_sa_algo;
  1412. ssl->specs.hash_size = SHA384_DIGEST_SIZE;
  1413. ssl->specs.pad_size = PAD_SHA;
  1414. ssl->specs.static_ecdh = 0;
  1415. ssl->specs.key_size = AES_256_KEY_SIZE;
  1416. ssl->specs.block_size = AES_BLOCK_SIZE;
  1417. ssl->specs.iv_size = AEAD_IMP_IV_SZ;
  1418. ssl->specs.aead_mac_size = AES_GCM_AUTH_SZ;
  1419. break;
  1420. #endif
  1421. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  1422. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  1423. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1424. ssl->specs.cipher_type = block;
  1425. ssl->specs.mac_algorithm = sha_mac;
  1426. ssl->specs.kea = rsa_kea;
  1427. ssl->specs.sig_algo = rsa_sa_algo;
  1428. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1429. ssl->specs.pad_size = PAD_SHA;
  1430. ssl->specs.static_ecdh = 0;
  1431. ssl->specs.key_size = CAMELLIA_128_KEY_SIZE;
  1432. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1433. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1434. break;
  1435. #endif
  1436. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  1437. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  1438. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1439. ssl->specs.cipher_type = block;
  1440. ssl->specs.mac_algorithm = sha_mac;
  1441. ssl->specs.kea = rsa_kea;
  1442. ssl->specs.sig_algo = rsa_sa_algo;
  1443. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1444. ssl->specs.pad_size = PAD_SHA;
  1445. ssl->specs.static_ecdh = 0;
  1446. ssl->specs.key_size = CAMELLIA_256_KEY_SIZE;
  1447. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1448. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1449. break;
  1450. #endif
  1451. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  1452. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  1453. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1454. ssl->specs.cipher_type = block;
  1455. ssl->specs.mac_algorithm = sha256_mac;
  1456. ssl->specs.kea = rsa_kea;
  1457. ssl->specs.sig_algo = rsa_sa_algo;
  1458. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1459. ssl->specs.pad_size = PAD_SHA;
  1460. ssl->specs.static_ecdh = 0;
  1461. ssl->specs.key_size = CAMELLIA_128_KEY_SIZE;
  1462. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1463. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1464. break;
  1465. #endif
  1466. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  1467. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  1468. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1469. ssl->specs.cipher_type = block;
  1470. ssl->specs.mac_algorithm = sha256_mac;
  1471. ssl->specs.kea = rsa_kea;
  1472. ssl->specs.sig_algo = rsa_sa_algo;
  1473. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1474. ssl->specs.pad_size = PAD_SHA;
  1475. ssl->specs.static_ecdh = 0;
  1476. ssl->specs.key_size = CAMELLIA_256_KEY_SIZE;
  1477. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1478. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1479. break;
  1480. #endif
  1481. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  1482. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  1483. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1484. ssl->specs.cipher_type = block;
  1485. ssl->specs.mac_algorithm = sha_mac;
  1486. ssl->specs.kea = diffie_hellman_kea;
  1487. ssl->specs.sig_algo = rsa_sa_algo;
  1488. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1489. ssl->specs.pad_size = PAD_SHA;
  1490. ssl->specs.static_ecdh = 0;
  1491. ssl->specs.key_size = CAMELLIA_128_KEY_SIZE;
  1492. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1493. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1494. break;
  1495. #endif
  1496. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  1497. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  1498. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1499. ssl->specs.cipher_type = block;
  1500. ssl->specs.mac_algorithm = sha_mac;
  1501. ssl->specs.kea = diffie_hellman_kea;
  1502. ssl->specs.sig_algo = rsa_sa_algo;
  1503. ssl->specs.hash_size = SHA_DIGEST_SIZE;
  1504. ssl->specs.pad_size = PAD_SHA;
  1505. ssl->specs.static_ecdh = 0;
  1506. ssl->specs.key_size = CAMELLIA_256_KEY_SIZE;
  1507. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1508. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1509. break;
  1510. #endif
  1511. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  1512. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  1513. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1514. ssl->specs.cipher_type = block;
  1515. ssl->specs.mac_algorithm = sha256_mac;
  1516. ssl->specs.kea = diffie_hellman_kea;
  1517. ssl->specs.sig_algo = rsa_sa_algo;
  1518. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1519. ssl->specs.pad_size = PAD_SHA;
  1520. ssl->specs.static_ecdh = 0;
  1521. ssl->specs.key_size = CAMELLIA_128_KEY_SIZE;
  1522. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1523. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1524. break;
  1525. #endif
  1526. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  1527. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  1528. ssl->specs.bulk_cipher_algorithm = cyassl_camellia;
  1529. ssl->specs.cipher_type = block;
  1530. ssl->specs.mac_algorithm = sha256_mac;
  1531. ssl->specs.kea = diffie_hellman_kea;
  1532. ssl->specs.sig_algo = rsa_sa_algo;
  1533. ssl->specs.hash_size = SHA256_DIGEST_SIZE;
  1534. ssl->specs.pad_size = PAD_SHA;
  1535. ssl->specs.static_ecdh = 0;
  1536. ssl->specs.key_size = CAMELLIA_256_KEY_SIZE;
  1537. ssl->specs.block_size = CAMELLIA_BLOCK_SIZE;
  1538. ssl->specs.iv_size = CAMELLIA_IV_SIZE;
  1539. break;
  1540. #endif
  1541. default:
  1542. CYASSL_MSG("Unsupported cipher suite, SetCipherSpecs");
  1543. return UNSUPPORTED_SUITE;
  1544. } /* switch */
  1545. } /* if ECC / Normal suites else */
  1546. /* set TLS if it hasn't been turned off */
  1547. if (ssl->version.major == 3 && ssl->version.minor >= 1) {
  1548. #ifndef NO_TLS
  1549. ssl->options.tls = 1;
  1550. ssl->hmac = TLS_hmac;
  1551. if (ssl->version.minor >= 2)
  1552. ssl->options.tls1_1 = 1;
  1553. #endif
  1554. }
  1555. #ifdef CYASSL_DTLS
  1556. if (ssl->options.dtls)
  1557. ssl->hmac = TLS_hmac;
  1558. #endif
  1559. return 0;
  1560. }
  1561. enum KeyStuff {
  1562. MASTER_ROUNDS = 3,
  1563. PREFIX = 3, /* up to three letters for master prefix */
  1564. KEY_PREFIX = 7 /* up to 7 prefix letters for key rounds */
  1565. };
  1566. #ifndef NO_OLD_TLS
  1567. /* true or false, zero for error */
  1568. static int SetPrefix(byte* sha_input, int idx)
  1569. {
  1570. switch (idx) {
  1571. case 0:
  1572. XMEMCPY(sha_input, "A", 1);
  1573. break;
  1574. case 1:
  1575. XMEMCPY(sha_input, "BB", 2);
  1576. break;
  1577. case 2:
  1578. XMEMCPY(sha_input, "CCC", 3);
  1579. break;
  1580. case 3:
  1581. XMEMCPY(sha_input, "DDDD", 4);
  1582. break;
  1583. case 4:
  1584. XMEMCPY(sha_input, "EEEEE", 5);
  1585. break;
  1586. case 5:
  1587. XMEMCPY(sha_input, "FFFFFF", 6);
  1588. break;
  1589. case 6:
  1590. XMEMCPY(sha_input, "GGGGGGG", 7);
  1591. break;
  1592. default:
  1593. CYASSL_MSG("Set Prefix error, bad input");
  1594. return 0;
  1595. }
  1596. return 1;
  1597. }
  1598. #endif
  1599. static int SetKeys(Ciphers* enc, Ciphers* dec, Keys* keys, CipherSpecs* specs,
  1600. byte side, void* heap, int devId)
  1601. {
  1602. #ifdef BUILD_ARC4
  1603. word32 sz = specs->key_size;
  1604. if (specs->bulk_cipher_algorithm == cyassl_rc4) {
  1605. if (enc->arc4 == NULL)
  1606. enc->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER);
  1607. if (enc->arc4 == NULL)
  1608. return MEMORY_E;
  1609. if (dec->arc4 == NULL)
  1610. dec->arc4 = (Arc4*)XMALLOC(sizeof(Arc4), heap, DYNAMIC_TYPE_CIPHER);
  1611. if (dec->arc4 == NULL)
  1612. return MEMORY_E;
  1613. #ifdef HAVE_CAVIUM
  1614. if (devId != NO_CAVIUM_DEVICE) {
  1615. if (Arc4InitCavium(enc->arc4, devId) != 0) {
  1616. CYASSL_MSG("Arc4InitCavium failed in SetKeys");
  1617. return CAVIUM_INIT_E;
  1618. }
  1619. if (Arc4InitCavium(dec->arc4, devId) != 0) {
  1620. CYASSL_MSG("Arc4InitCavium failed in SetKeys");
  1621. return CAVIUM_INIT_E;
  1622. }
  1623. }
  1624. #endif
  1625. if (side == CYASSL_CLIENT_END) {
  1626. Arc4SetKey(enc->arc4, keys->client_write_key, sz);
  1627. Arc4SetKey(dec->arc4, keys->server_write_key, sz);
  1628. }
  1629. else {
  1630. Arc4SetKey(enc->arc4, keys->server_write_key, sz);
  1631. Arc4SetKey(dec->arc4, keys->client_write_key, sz);
  1632. }
  1633. enc->setup = 1;
  1634. dec->setup = 1;
  1635. }
  1636. #endif
  1637. #ifdef HAVE_POLY1305
  1638. /* set up memory space for poly1305 */
  1639. if (enc->poly1305 == NULL)
  1640. enc->poly1305 = (Poly1305*)malloc(sizeof(Poly1305));
  1641. if (enc->poly1305 == NULL)
  1642. return MEMORY_E;
  1643. if (dec->poly1305 == NULL)
  1644. dec->poly1305 =
  1645. (Poly1305*)XMALLOC(sizeof(Poly1305), heap, DYNAMIC_TYPE_CIPHER);
  1646. if (dec->poly1305 == NULL)
  1647. return MEMORY_E;
  1648. #endif
  1649. #ifdef HAVE_CHACHA
  1650. if (specs->bulk_cipher_algorithm == cyassl_chacha) {
  1651. int chachaRet;
  1652. if (enc->chacha == NULL)
  1653. enc->chacha = (ChaCha*)malloc(sizeof(ChaCha));
  1654. if (enc->chacha == NULL)
  1655. return MEMORY_E;
  1656. if (dec->chacha == NULL)
  1657. dec->chacha =
  1658. (ChaCha*)XMALLOC(sizeof(ChaCha), heap, DYNAMIC_TYPE_CIPHER);
  1659. if (dec->chacha == NULL)
  1660. return MEMORY_E;
  1661. if (side == CYASSL_CLIENT_END) {
  1662. chachaRet = Chacha_SetKey(enc->chacha, keys->client_write_key,
  1663. specs->key_size);
  1664. XMEMCPY(keys->aead_enc_imp_IV,
  1665. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1666. if (chachaRet != 0) return chachaRet;
  1667. chachaRet = Chacha_SetKey(dec->chacha, keys->server_write_key,
  1668. specs->key_size);
  1669. XMEMCPY(keys->aead_dec_imp_IV,
  1670. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1671. if (chachaRet != 0) return chachaRet;
  1672. }
  1673. else {
  1674. chachaRet = Chacha_SetKey(enc->chacha, keys->server_write_key,
  1675. specs->key_size);
  1676. XMEMCPY(keys->aead_enc_imp_IV,
  1677. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1678. if (chachaRet != 0) return chachaRet;
  1679. chachaRet = Chacha_SetKey(dec->chacha, keys->client_write_key,
  1680. specs->key_size);
  1681. XMEMCPY(keys->aead_dec_imp_IV,
  1682. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1683. if (chachaRet != 0) return chachaRet;
  1684. }
  1685. enc->setup = 1;
  1686. dec->setup = 1;
  1687. }
  1688. #endif
  1689. #ifdef HAVE_HC128
  1690. if (specs->bulk_cipher_algorithm == cyassl_hc128) {
  1691. int hcRet;
  1692. if (enc->hc128 == NULL)
  1693. enc->hc128 =
  1694. (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER);
  1695. if (enc->hc128 == NULL)
  1696. return MEMORY_E;
  1697. if (dec->hc128 == NULL)
  1698. dec->hc128 =
  1699. (HC128*)XMALLOC(sizeof(HC128), heap, DYNAMIC_TYPE_CIPHER);
  1700. if (dec->hc128 == NULL)
  1701. return MEMORY_E;
  1702. if (side == CYASSL_CLIENT_END) {
  1703. hcRet = Hc128_SetKey(enc->hc128, keys->client_write_key,
  1704. keys->client_write_IV);
  1705. if (hcRet != 0) return hcRet;
  1706. hcRet = Hc128_SetKey(dec->hc128, keys->server_write_key,
  1707. keys->server_write_IV);
  1708. if (hcRet != 0) return hcRet;
  1709. }
  1710. else {
  1711. hcRet = Hc128_SetKey(enc->hc128, keys->server_write_key,
  1712. keys->server_write_IV);
  1713. if (hcRet != 0) return hcRet;
  1714. hcRet = Hc128_SetKey(dec->hc128, keys->client_write_key,
  1715. keys->client_write_IV);
  1716. if (hcRet != 0) return hcRet;
  1717. }
  1718. enc->setup = 1;
  1719. dec->setup = 1;
  1720. }
  1721. #endif
  1722. #ifdef BUILD_RABBIT
  1723. if (specs->bulk_cipher_algorithm == cyassl_rabbit) {
  1724. int rabRet;
  1725. if (enc->rabbit == NULL)
  1726. enc->rabbit =
  1727. (Rabbit*)XMALLOC(sizeof(Rabbit), heap, DYNAMIC_TYPE_CIPHER);
  1728. if (enc->rabbit == NULL)
  1729. return MEMORY_E;
  1730. if (dec->rabbit == NULL)
  1731. dec->rabbit =
  1732. (Rabbit*)XMALLOC(sizeof(Rabbit), heap, DYNAMIC_TYPE_CIPHER);
  1733. if (dec->rabbit == NULL)
  1734. return MEMORY_E;
  1735. if (side == CYASSL_CLIENT_END) {
  1736. rabRet = RabbitSetKey(enc->rabbit, keys->client_write_key,
  1737. keys->client_write_IV);
  1738. if (rabRet != 0) return rabRet;
  1739. rabRet = RabbitSetKey(dec->rabbit, keys->server_write_key,
  1740. keys->server_write_IV);
  1741. if (rabRet != 0) return rabRet;
  1742. }
  1743. else {
  1744. rabRet = RabbitSetKey(enc->rabbit, keys->server_write_key,
  1745. keys->server_write_IV);
  1746. if (rabRet != 0) return rabRet;
  1747. rabRet = RabbitSetKey(dec->rabbit, keys->client_write_key,
  1748. keys->client_write_IV);
  1749. if (rabRet != 0) return rabRet;
  1750. }
  1751. enc->setup = 1;
  1752. dec->setup = 1;
  1753. }
  1754. #endif
  1755. #ifdef BUILD_DES3
  1756. if (specs->bulk_cipher_algorithm == cyassl_triple_des) {
  1757. int desRet = 0;
  1758. if (enc->des3 == NULL)
  1759. enc->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER);
  1760. if (enc->des3 == NULL)
  1761. return MEMORY_E;
  1762. if (dec->des3 == NULL)
  1763. dec->des3 = (Des3*)XMALLOC(sizeof(Des3), heap, DYNAMIC_TYPE_CIPHER);
  1764. if (dec->des3 == NULL)
  1765. return MEMORY_E;
  1766. #ifdef HAVE_CAVIUM
  1767. if (devId != NO_CAVIUM_DEVICE) {
  1768. if (Des3_InitCavium(enc->des3, devId) != 0) {
  1769. CYASSL_MSG("Des3_InitCavium failed in SetKeys");
  1770. return CAVIUM_INIT_E;
  1771. }
  1772. if (Des3_InitCavium(dec->des3, devId) != 0) {
  1773. CYASSL_MSG("Des3_InitCavium failed in SetKeys");
  1774. return CAVIUM_INIT_E;
  1775. }
  1776. }
  1777. #endif
  1778. if (side == CYASSL_CLIENT_END) {
  1779. desRet = Des3_SetKey(enc->des3, keys->client_write_key,
  1780. keys->client_write_IV, DES_ENCRYPTION);
  1781. if (desRet != 0)
  1782. return desRet;
  1783. desRet = Des3_SetKey(dec->des3, keys->server_write_key,
  1784. keys->server_write_IV, DES_DECRYPTION);
  1785. if (desRet != 0)
  1786. return desRet;
  1787. }
  1788. else {
  1789. desRet = Des3_SetKey(enc->des3, keys->server_write_key,
  1790. keys->server_write_IV, DES_ENCRYPTION);
  1791. if (desRet != 0)
  1792. return desRet;
  1793. desRet = Des3_SetKey(dec->des3, keys->client_write_key,
  1794. keys->client_write_IV, DES_DECRYPTION);
  1795. if (desRet != 0)
  1796. return desRet;
  1797. }
  1798. enc->setup = 1;
  1799. dec->setup = 1;
  1800. }
  1801. #endif
  1802. #ifdef BUILD_AES
  1803. if (specs->bulk_cipher_algorithm == cyassl_aes) {
  1804. int aesRet = 0;
  1805. if (enc->aes == NULL)
  1806. enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1807. if (enc->aes == NULL)
  1808. return MEMORY_E;
  1809. if (dec->aes == NULL)
  1810. dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1811. if (dec->aes == NULL)
  1812. return MEMORY_E;
  1813. #ifdef HAVE_CAVIUM
  1814. if (devId != NO_CAVIUM_DEVICE) {
  1815. if (AesInitCavium(enc->aes, devId) != 0) {
  1816. CYASSL_MSG("AesInitCavium failed in SetKeys");
  1817. return CAVIUM_INIT_E;
  1818. }
  1819. if (AesInitCavium(dec->aes, devId) != 0) {
  1820. CYASSL_MSG("AesInitCavium failed in SetKeys");
  1821. return CAVIUM_INIT_E;
  1822. }
  1823. }
  1824. #endif
  1825. if (side == CYASSL_CLIENT_END) {
  1826. aesRet = AesSetKey(enc->aes, keys->client_write_key,
  1827. specs->key_size, keys->client_write_IV,
  1828. AES_ENCRYPTION);
  1829. if (aesRet != 0)
  1830. return aesRet;
  1831. aesRet = AesSetKey(dec->aes, keys->server_write_key,
  1832. specs->key_size, keys->server_write_IV,
  1833. AES_DECRYPTION);
  1834. if (aesRet != 0)
  1835. return aesRet;
  1836. }
  1837. else {
  1838. aesRet = AesSetKey(enc->aes, keys->server_write_key,
  1839. specs->key_size, keys->server_write_IV,
  1840. AES_ENCRYPTION);
  1841. if (aesRet != 0)
  1842. return aesRet;
  1843. aesRet = AesSetKey(dec->aes, keys->client_write_key,
  1844. specs->key_size, keys->client_write_IV,
  1845. AES_DECRYPTION);
  1846. if (aesRet != 0)
  1847. return aesRet;
  1848. }
  1849. enc->setup = 1;
  1850. dec->setup = 1;
  1851. }
  1852. #endif
  1853. #ifdef BUILD_AESGCM
  1854. if (specs->bulk_cipher_algorithm == cyassl_aes_gcm) {
  1855. if (enc->aes == NULL)
  1856. enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1857. if (enc->aes == NULL)
  1858. return MEMORY_E;
  1859. if (dec->aes == NULL)
  1860. dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1861. if (dec->aes == NULL)
  1862. return MEMORY_E;
  1863. if (side == CYASSL_CLIENT_END) {
  1864. AesGcmSetKey(enc->aes, keys->client_write_key, specs->key_size);
  1865. XMEMCPY(keys->aead_enc_imp_IV,
  1866. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1867. AesGcmSetKey(dec->aes, keys->server_write_key, specs->key_size);
  1868. XMEMCPY(keys->aead_dec_imp_IV,
  1869. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1870. }
  1871. else {
  1872. AesGcmSetKey(enc->aes, keys->server_write_key, specs->key_size);
  1873. XMEMCPY(keys->aead_enc_imp_IV,
  1874. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1875. AesGcmSetKey(dec->aes, keys->client_write_key, specs->key_size);
  1876. XMEMCPY(keys->aead_dec_imp_IV,
  1877. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1878. }
  1879. enc->setup = 1;
  1880. dec->setup = 1;
  1881. }
  1882. #endif
  1883. #ifdef HAVE_AESCCM
  1884. if (specs->bulk_cipher_algorithm == cyassl_aes_ccm) {
  1885. if (enc->aes == NULL)
  1886. enc->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1887. if (enc->aes == NULL)
  1888. return MEMORY_E;
  1889. if (dec->aes == NULL)
  1890. dec->aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_CIPHER);
  1891. if (dec->aes == NULL)
  1892. return MEMORY_E;
  1893. if (side == CYASSL_CLIENT_END) {
  1894. AesCcmSetKey(enc->aes, keys->client_write_key, specs->key_size);
  1895. XMEMCPY(keys->aead_enc_imp_IV,
  1896. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1897. AesCcmSetKey(dec->aes, keys->server_write_key, specs->key_size);
  1898. XMEMCPY(keys->aead_dec_imp_IV,
  1899. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1900. }
  1901. else {
  1902. AesCcmSetKey(enc->aes, keys->server_write_key, specs->key_size);
  1903. XMEMCPY(keys->aead_enc_imp_IV,
  1904. keys->server_write_IV, AEAD_IMP_IV_SZ);
  1905. AesCcmSetKey(dec->aes, keys->client_write_key, specs->key_size);
  1906. XMEMCPY(keys->aead_dec_imp_IV,
  1907. keys->client_write_IV, AEAD_IMP_IV_SZ);
  1908. }
  1909. enc->setup = 1;
  1910. dec->setup = 1;
  1911. }
  1912. #endif
  1913. #ifdef HAVE_CAMELLIA
  1914. if (specs->bulk_cipher_algorithm == cyassl_camellia) {
  1915. int camRet;
  1916. if (enc->cam == NULL)
  1917. enc->cam =
  1918. (Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
  1919. if (enc->cam == NULL)
  1920. return MEMORY_E;
  1921. if (dec->cam == NULL)
  1922. dec->cam =
  1923. (Camellia*)XMALLOC(sizeof(Camellia), heap, DYNAMIC_TYPE_CIPHER);
  1924. if (dec->cam == NULL)
  1925. return MEMORY_E;
  1926. if (side == CYASSL_CLIENT_END) {
  1927. camRet = CamelliaSetKey(enc->cam, keys->client_write_key,
  1928. specs->key_size, keys->client_write_IV);
  1929. if (camRet != 0)
  1930. return camRet;
  1931. camRet = CamelliaSetKey(dec->cam, keys->server_write_key,
  1932. specs->key_size, keys->server_write_IV);
  1933. if (camRet != 0)
  1934. return camRet;
  1935. }
  1936. else {
  1937. camRet = CamelliaSetKey(enc->cam, keys->server_write_key,
  1938. specs->key_size, keys->server_write_IV);
  1939. if (camRet != 0)
  1940. return camRet;
  1941. camRet = CamelliaSetKey(dec->cam, keys->client_write_key,
  1942. specs->key_size, keys->client_write_IV);
  1943. if (camRet != 0)
  1944. return camRet;
  1945. }
  1946. enc->setup = 1;
  1947. dec->setup = 1;
  1948. }
  1949. #endif
  1950. #ifdef HAVE_NULL_CIPHER
  1951. if (specs->bulk_cipher_algorithm == cyassl_cipher_null) {
  1952. enc->setup = 1;
  1953. dec->setup = 1;
  1954. }
  1955. #endif
  1956. keys->sequence_number = 0;
  1957. keys->peer_sequence_number = 0;
  1958. keys->encryptionOn = 0;
  1959. (void)side;
  1960. (void)heap;
  1961. (void)enc;
  1962. (void)dec;
  1963. (void)specs;
  1964. (void)devId;
  1965. return 0;
  1966. }
  1967. /* TLS can call too */
  1968. int StoreKeys(CYASSL* ssl, const byte* keyData)
  1969. {
  1970. int sz, i = 0;
  1971. int devId = NO_CAVIUM_DEVICE;
  1972. #ifdef HAVE_CAVIUM
  1973. devId = ssl->devId;
  1974. #endif
  1975. if (ssl->specs.cipher_type != aead) {
  1976. sz = ssl->specs.hash_size;
  1977. XMEMCPY(ssl->keys.client_write_MAC_secret,&keyData[i], sz);
  1978. i += sz;
  1979. XMEMCPY(ssl->keys.server_write_MAC_secret,&keyData[i], sz);
  1980. i += sz;
  1981. }
  1982. sz = ssl->specs.key_size;
  1983. XMEMCPY(ssl->keys.client_write_key, &keyData[i], sz);
  1984. i += sz;
  1985. XMEMCPY(ssl->keys.server_write_key, &keyData[i], sz);
  1986. i += sz;
  1987. sz = ssl->specs.iv_size;
  1988. XMEMCPY(ssl->keys.client_write_IV, &keyData[i], sz);
  1989. i += sz;
  1990. XMEMCPY(ssl->keys.server_write_IV, &keyData[i], sz);
  1991. #ifdef HAVE_AEAD
  1992. if (ssl->specs.cipher_type == aead) {
  1993. /* Initialize the AES-GCM/CCM explicit IV to a zero. */
  1994. XMEMSET(ssl->keys.aead_exp_IV, 0, AEAD_EXP_IV_SZ);
  1995. }
  1996. #endif
  1997. return SetKeys(&ssl->encrypt, &ssl->decrypt, &ssl->keys, &ssl->specs,
  1998. ssl->options.side, ssl->heap, devId);
  1999. }
  2000. #ifndef NO_OLD_TLS
  2001. int DeriveKeys(CYASSL* ssl)
  2002. {
  2003. int length = 2 * ssl->specs.hash_size +
  2004. 2 * ssl->specs.key_size +
  2005. 2 * ssl->specs.iv_size;
  2006. int rounds = (length + MD5_DIGEST_SIZE - 1 ) / MD5_DIGEST_SIZE, i;
  2007. int ret = 0;
  2008. #ifdef CYASSL_SMALL_STACK
  2009. byte* shaOutput;
  2010. byte* md5Input;
  2011. byte* shaInput;
  2012. byte* keyData;
  2013. Md5* md5;
  2014. Sha* sha;
  2015. #else
  2016. byte shaOutput[SHA_DIGEST_SIZE];
  2017. byte md5Input[SECRET_LEN + SHA_DIGEST_SIZE];
  2018. byte shaInput[KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN];
  2019. byte keyData[KEY_PREFIX * MD5_DIGEST_SIZE];
  2020. Md5 md5[1];
  2021. Sha sha[1];
  2022. #endif
  2023. #ifdef CYASSL_SMALL_STACK
  2024. shaOutput = (byte*)XMALLOC(SHA_DIGEST_SIZE,
  2025. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2026. md5Input = (byte*)XMALLOC(SECRET_LEN + SHA_DIGEST_SIZE,
  2027. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2028. shaInput = (byte*)XMALLOC(KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN,
  2029. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2030. keyData = (byte*)XMALLOC(KEY_PREFIX * MD5_DIGEST_SIZE,
  2031. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2032. md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2033. sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2034. if (shaOutput == NULL || md5Input == NULL || shaInput == NULL ||
  2035. keyData == NULL || md5 == NULL || sha == NULL) {
  2036. if (shaOutput) XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2037. if (md5Input) XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2038. if (shaInput) XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2039. if (keyData) XFREE(keyData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2040. if (md5) XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2041. if (sha) XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2042. return MEMORY_E;
  2043. }
  2044. #endif
  2045. InitMd5(md5);
  2046. ret = InitSha(sha);
  2047. if (ret == 0) {
  2048. XMEMCPY(md5Input, ssl->arrays->masterSecret, SECRET_LEN);
  2049. for (i = 0; i < rounds; ++i) {
  2050. int j = i + 1;
  2051. int idx = j;
  2052. if (!SetPrefix(shaInput, i)) {
  2053. ret = PREFIX_ERROR;
  2054. break;
  2055. }
  2056. XMEMCPY(shaInput + idx, ssl->arrays->masterSecret, SECRET_LEN);
  2057. idx += SECRET_LEN;
  2058. XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN);
  2059. idx += RAN_LEN;
  2060. XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN);
  2061. ShaUpdate(sha, shaInput, (KEY_PREFIX + SECRET_LEN + 2 * RAN_LEN)
  2062. - KEY_PREFIX + j);
  2063. ShaFinal(sha, shaOutput);
  2064. XMEMCPY(md5Input + SECRET_LEN, shaOutput, SHA_DIGEST_SIZE);
  2065. Md5Update(md5, md5Input, SECRET_LEN + SHA_DIGEST_SIZE);
  2066. Md5Final(md5, keyData + i * MD5_DIGEST_SIZE);
  2067. }
  2068. if (ret == 0)
  2069. ret = StoreKeys(ssl, keyData);
  2070. }
  2071. #ifdef CYASSL_SMALL_STACK
  2072. XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2073. XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2074. XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2075. XFREE(keyData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2076. XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2077. XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2078. #endif
  2079. return ret;
  2080. }
  2081. static int CleanPreMaster(CYASSL* ssl)
  2082. {
  2083. int i, ret, sz = ssl->arrays->preMasterSz;
  2084. for (i = 0; i < sz; i++)
  2085. ssl->arrays->preMasterSecret[i] = 0;
  2086. ret = RNG_GenerateBlock(ssl->rng, ssl->arrays->preMasterSecret, sz);
  2087. if (ret != 0)
  2088. return ret;
  2089. for (i = 0; i < sz; i++)
  2090. ssl->arrays->preMasterSecret[i] = 0;
  2091. return 0;
  2092. }
  2093. /* Create and store the master secret see page 32, 6.1 */
  2094. static int MakeSslMasterSecret(CYASSL* ssl)
  2095. {
  2096. int i, ret;
  2097. word32 idx;
  2098. word32 pmsSz = ssl->arrays->preMasterSz;
  2099. #ifdef CYASSL_SMALL_STACK
  2100. byte* shaOutput;
  2101. byte* md5Input;
  2102. byte* shaInput;
  2103. Md5* md5;
  2104. Sha* sha;
  2105. #else
  2106. byte shaOutput[SHA_DIGEST_SIZE];
  2107. byte md5Input[ENCRYPT_LEN + SHA_DIGEST_SIZE];
  2108. byte shaInput[PREFIX + ENCRYPT_LEN + 2 * RAN_LEN];
  2109. Md5 md5[1];
  2110. Sha sha[1];
  2111. #endif
  2112. #ifdef SHOW_SECRETS
  2113. {
  2114. word32 j;
  2115. printf("pre master secret: ");
  2116. for (j = 0; j < pmsSz; j++)
  2117. printf("%02x", ssl->arrays->preMasterSecret[j]);
  2118. printf("\n");
  2119. }
  2120. #endif
  2121. #ifdef CYASSL_SMALL_STACK
  2122. shaOutput = (byte*)XMALLOC(SHA_DIGEST_SIZE,
  2123. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2124. md5Input = (byte*)XMALLOC(ENCRYPT_LEN + SHA_DIGEST_SIZE,
  2125. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2126. shaInput = (byte*)XMALLOC(PREFIX + ENCRYPT_LEN + 2 * RAN_LEN,
  2127. NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2128. md5 = (Md5*)XMALLOC(sizeof(Md5), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2129. sha = (Sha*)XMALLOC(sizeof(Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2130. if (shaOutput == NULL || md5Input == NULL || shaInput == NULL ||
  2131. md5 == NULL || sha == NULL) {
  2132. if (shaOutput) XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2133. if (md5Input) XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2134. if (shaInput) XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2135. if (md5) XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2136. if (sha) XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2137. return MEMORY_E;
  2138. }
  2139. #endif
  2140. InitMd5(md5);
  2141. ret = InitSha(sha);
  2142. if (ret == 0) {
  2143. XMEMCPY(md5Input, ssl->arrays->preMasterSecret, pmsSz);
  2144. for (i = 0; i < MASTER_ROUNDS; ++i) {
  2145. byte prefix[KEY_PREFIX]; /* only need PREFIX bytes but static */
  2146. if (!SetPrefix(prefix, i)) { /* analysis thinks will overrun */
  2147. ret = PREFIX_ERROR;
  2148. break;
  2149. }
  2150. idx = 0;
  2151. XMEMCPY(shaInput, prefix, i + 1);
  2152. idx += i + 1;
  2153. XMEMCPY(shaInput + idx, ssl->arrays->preMasterSecret, pmsSz);
  2154. idx += pmsSz;
  2155. XMEMCPY(shaInput + idx, ssl->arrays->clientRandom, RAN_LEN);
  2156. idx += RAN_LEN;
  2157. XMEMCPY(shaInput + idx, ssl->arrays->serverRandom, RAN_LEN);
  2158. idx += RAN_LEN;
  2159. ShaUpdate(sha, shaInput, idx);
  2160. ShaFinal(sha, shaOutput);
  2161. idx = pmsSz; /* preSz */
  2162. XMEMCPY(md5Input + idx, shaOutput, SHA_DIGEST_SIZE);
  2163. idx += SHA_DIGEST_SIZE;
  2164. Md5Update(md5, md5Input, idx);
  2165. Md5Final(md5, &ssl->arrays->masterSecret[i * MD5_DIGEST_SIZE]);
  2166. }
  2167. #ifdef SHOW_SECRETS
  2168. {
  2169. word32 j;
  2170. printf("master secret: ");
  2171. for (j = 0; j < SECRET_LEN; j++)
  2172. printf("%02x", ssl->arrays->masterSecret[j]);
  2173. printf("\n");
  2174. }
  2175. #endif
  2176. if (ret == 0)
  2177. ret = DeriveKeys(ssl);
  2178. }
  2179. #ifdef CYASSL_SMALL_STACK
  2180. XFREE(shaOutput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2181. XFREE(md5Input, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2182. XFREE(shaInput, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2183. XFREE(md5, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2184. XFREE(sha, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  2185. #endif
  2186. if (ret == 0)
  2187. ret = CleanPreMaster(ssl);
  2188. else
  2189. CleanPreMaster(ssl);
  2190. return ret;
  2191. }
  2192. #endif
  2193. /* Master wrapper, doesn't use SSL stack space in TLS mode */
  2194. int MakeMasterSecret(CYASSL* ssl)
  2195. {
  2196. #ifdef NO_OLD_TLS
  2197. return MakeTlsMasterSecret(ssl);
  2198. #elif !defined(NO_TLS)
  2199. if (ssl->options.tls) return MakeTlsMasterSecret(ssl);
  2200. #endif
  2201. #ifndef NO_OLD_TLS
  2202. return MakeSslMasterSecret(ssl);
  2203. #endif
  2204. }