ssl_cli.c 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391
  1. /*
  2. * Copyright (C) 2015-2018 Alibaba Group Holding Limited
  3. */
  4. #if !defined(MBEDTLS_CONFIG_FILE)
  5. #include "mbedtls/config.h"
  6. #else
  7. #include MBEDTLS_CONFIG_FILE
  8. #endif
  9. #if defined(MBEDTLS_SSL_CLI_C)
  10. #if defined(MBEDTLS_PLATFORM_C)
  11. #include "mbedtls/platform.h"
  12. #else
  13. #include <stdlib.h>
  14. #define mbedtls_calloc calloc
  15. #define mbedtls_free free
  16. #endif
  17. #include "mbedtls/debug.h"
  18. #include "mbedtls/ssl.h"
  19. #include "mbedtls/ssl_internal.h"
  20. #include <string.h>
  21. #include <stdint.h>
  22. #if defined(MBEDTLS_HAVE_TIME)
  23. #include "mbedtls/platform_time.h"
  24. #endif
  25. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  26. /* Implementation that should never be optimized out by the compiler */
  27. static void mbedtls_zeroize( void *v, size_t n ) {
  28. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  29. }
  30. #endif
  31. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  32. static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
  33. unsigned char *buf,
  34. size_t *olen )
  35. {
  36. unsigned char *p = buf;
  37. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  38. size_t hostname_len;
  39. *olen = 0;
  40. if( ssl->hostname == NULL )
  41. return;
  42. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
  43. ssl->hostname ) );
  44. hostname_len = strlen( ssl->hostname );
  45. if( end < p || (size_t)( end - p ) < hostname_len + 9 )
  46. {
  47. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  48. return;
  49. }
  50. /*
  51. * struct {
  52. * NameType name_type;
  53. * select (name_type) {
  54. * case host_name: HostName;
  55. * } name;
  56. * } ServerName;
  57. *
  58. * enum {
  59. * host_name(0), (255)
  60. * } NameType;
  61. *
  62. * opaque HostName<1..2^16-1>;
  63. *
  64. * struct {
  65. * ServerName server_name_list<1..2^16-1>
  66. * } ServerNameList;
  67. */
  68. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
  69. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF );
  70. *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
  71. *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF );
  72. *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
  73. *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF );
  74. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
  75. *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
  76. *p++ = (unsigned char)( ( hostname_len ) & 0xFF );
  77. memcpy( p, ssl->hostname, hostname_len );
  78. *olen = hostname_len + 9;
  79. }
  80. #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
  81. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  82. static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
  83. unsigned char *buf,
  84. size_t *olen )
  85. {
  86. unsigned char *p = buf;
  87. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  88. *olen = 0;
  89. if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  90. return;
  91. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
  92. if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )
  93. {
  94. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  95. return;
  96. }
  97. /*
  98. * Secure renegotiation
  99. */
  100. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
  101. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
  102. *p++ = 0x00;
  103. *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
  104. *p++ = ssl->verify_data_len & 0xFF;
  105. memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
  106. *olen = 5 + ssl->verify_data_len;
  107. }
  108. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  109. /*
  110. * Only if we handle at least one key exchange that needs signatures.
  111. */
  112. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  113. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  114. static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
  115. unsigned char *buf,
  116. size_t *olen )
  117. {
  118. unsigned char *p = buf;
  119. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  120. size_t sig_alg_len = 0;
  121. const int *md;
  122. #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
  123. unsigned char *sig_alg_list = buf + 6;
  124. #endif
  125. *olen = 0;
  126. if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  127. return;
  128. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
  129. for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
  130. {
  131. #if defined(MBEDTLS_ECDSA_C)
  132. sig_alg_len += 2;
  133. #endif
  134. #if defined(MBEDTLS_RSA_C)
  135. sig_alg_len += 2;
  136. #endif
  137. }
  138. if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
  139. {
  140. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  141. return;
  142. }
  143. /*
  144. * Prepare signature_algorithms extension (TLS 1.2)
  145. */
  146. sig_alg_len = 0;
  147. for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
  148. {
  149. #if defined(MBEDTLS_ECDSA_C)
  150. sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
  151. sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
  152. #endif
  153. #if defined(MBEDTLS_RSA_C)
  154. sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
  155. sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
  156. #endif
  157. }
  158. /*
  159. * enum {
  160. * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
  161. * sha512(6), (255)
  162. * } HashAlgorithm;
  163. *
  164. * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
  165. * SignatureAlgorithm;
  166. *
  167. * struct {
  168. * HashAlgorithm hash;
  169. * SignatureAlgorithm signature;
  170. * } SignatureAndHashAlgorithm;
  171. *
  172. * SignatureAndHashAlgorithm
  173. * supported_signature_algorithms<2..2^16-2>;
  174. */
  175. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
  176. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF );
  177. *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
  178. *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
  179. *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
  180. *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
  181. *olen = 6 + sig_alg_len;
  182. }
  183. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
  184. MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
  185. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  186. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  187. static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
  188. unsigned char *buf,
  189. size_t *olen )
  190. {
  191. unsigned char *p = buf;
  192. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  193. unsigned char *elliptic_curve_list = p + 6;
  194. size_t elliptic_curve_len = 0;
  195. const mbedtls_ecp_curve_info *info;
  196. #if defined(MBEDTLS_ECP_C)
  197. const mbedtls_ecp_group_id *grp_id;
  198. #else
  199. ((void) ssl);
  200. #endif
  201. *olen = 0;
  202. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
  203. #if defined(MBEDTLS_ECP_C)
  204. for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
  205. {
  206. info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
  207. #else
  208. for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
  209. {
  210. #endif
  211. if( info == NULL )
  212. {
  213. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) );
  214. return;
  215. }
  216. elliptic_curve_len += 2;
  217. }
  218. if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
  219. {
  220. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  221. return;
  222. }
  223. elliptic_curve_len = 0;
  224. #if defined(MBEDTLS_ECP_C)
  225. for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
  226. {
  227. info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
  228. #else
  229. for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
  230. {
  231. #endif
  232. elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
  233. elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
  234. }
  235. if( elliptic_curve_len == 0 )
  236. return;
  237. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
  238. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
  239. *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
  240. *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
  241. *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
  242. *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
  243. *olen = 6 + elliptic_curve_len;
  244. }
  245. static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
  246. unsigned char *buf,
  247. size_t *olen )
  248. {
  249. unsigned char *p = buf;
  250. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  251. *olen = 0;
  252. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
  253. if( end < p || (size_t)( end - p ) < 6 )
  254. {
  255. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  256. return;
  257. }
  258. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
  259. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
  260. *p++ = 0x00;
  261. *p++ = 2;
  262. *p++ = 1;
  263. *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
  264. *olen = 6;
  265. }
  266. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  267. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  268. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  269. static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
  270. unsigned char *buf,
  271. size_t *olen )
  272. {
  273. int ret;
  274. unsigned char *p = buf;
  275. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  276. size_t kkpp_len;
  277. *olen = 0;
  278. /* Skip costly extension if we can't use EC J-PAKE anyway */
  279. if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
  280. return;
  281. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
  282. if( end - p < 4 )
  283. {
  284. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  285. return;
  286. }
  287. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
  288. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF );
  289. /*
  290. * We may need to send ClientHello multiple times for Hello verification.
  291. * We don't want to compute fresh values every time (both for performance
  292. * and consistency reasons), so cache the extension content.
  293. */
  294. if( ssl->handshake->ecjpake_cache == NULL ||
  295. ssl->handshake->ecjpake_cache_len == 0 )
  296. {
  297. MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
  298. ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
  299. p + 2, end - p - 2, &kkpp_len,
  300. ssl->conf->f_rng, ssl->conf->p_rng );
  301. if( ret != 0 )
  302. {
  303. MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
  304. return;
  305. }
  306. ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
  307. if( ssl->handshake->ecjpake_cache == NULL )
  308. {
  309. MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
  310. return;
  311. }
  312. memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
  313. ssl->handshake->ecjpake_cache_len = kkpp_len;
  314. }
  315. else
  316. {
  317. MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
  318. kkpp_len = ssl->handshake->ecjpake_cache_len;
  319. if( (size_t)( end - p - 2 ) < kkpp_len )
  320. {
  321. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  322. return;
  323. }
  324. memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
  325. }
  326. *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
  327. *p++ = (unsigned char)( ( kkpp_len ) & 0xFF );
  328. *olen = kkpp_len + 4;
  329. }
  330. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  331. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  332. static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  333. unsigned char *buf,
  334. size_t *olen )
  335. {
  336. unsigned char *p = buf;
  337. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  338. *olen = 0;
  339. if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
  340. return;
  341. }
  342. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
  343. if( end < p || (size_t)( end - p ) < 5 )
  344. {
  345. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  346. return;
  347. }
  348. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
  349. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
  350. *p++ = 0x00;
  351. *p++ = 1;
  352. *p++ = ssl->conf->mfl_code;
  353. *olen = 5;
  354. }
  355. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  356. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  357. static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  358. unsigned char *buf, size_t *olen )
  359. {
  360. unsigned char *p = buf;
  361. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  362. *olen = 0;
  363. if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
  364. {
  365. return;
  366. }
  367. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
  368. if( end < p || (size_t)( end - p ) < 4 )
  369. {
  370. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  371. return;
  372. }
  373. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
  374. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
  375. *p++ = 0x00;
  376. *p++ = 0x00;
  377. *olen = 4;
  378. }
  379. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  380. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  381. static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  382. unsigned char *buf, size_t *olen )
  383. {
  384. unsigned char *p = buf;
  385. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  386. *olen = 0;
  387. if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
  388. ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  389. {
  390. return;
  391. }
  392. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
  393. "extension" ) );
  394. if( end < p || (size_t)( end - p ) < 4 )
  395. {
  396. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  397. return;
  398. }
  399. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
  400. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
  401. *p++ = 0x00;
  402. *p++ = 0x00;
  403. *olen = 4;
  404. }
  405. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  406. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  407. static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
  408. unsigned char *buf, size_t *olen )
  409. {
  410. unsigned char *p = buf;
  411. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  412. *olen = 0;
  413. if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  414. ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
  415. {
  416. return;
  417. }
  418. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
  419. "extension" ) );
  420. if( end < p || (size_t)( end - p ) < 4 )
  421. {
  422. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  423. return;
  424. }
  425. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
  426. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
  427. *p++ = 0x00;
  428. *p++ = 0x00;
  429. *olen = 4;
  430. }
  431. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  432. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  433. static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
  434. unsigned char *buf, size_t *olen )
  435. {
  436. unsigned char *p = buf;
  437. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  438. size_t tlen = ssl->session_negotiate->ticket_len;
  439. *olen = 0;
  440. if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
  441. {
  442. return;
  443. }
  444. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
  445. if( end < p || (size_t)( end - p ) < 4 + tlen )
  446. {
  447. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  448. return;
  449. }
  450. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
  451. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF );
  452. *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
  453. *p++ = (unsigned char)( ( tlen ) & 0xFF );
  454. *olen = 4;
  455. if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
  456. {
  457. return;
  458. }
  459. MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
  460. memcpy( p, ssl->session_negotiate->ticket, tlen );
  461. *olen += tlen;
  462. }
  463. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  464. #if defined(MBEDTLS_SSL_ALPN)
  465. static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
  466. unsigned char *buf, size_t *olen )
  467. {
  468. unsigned char *p = buf;
  469. const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;
  470. size_t alpnlen = 0;
  471. const char **cur;
  472. *olen = 0;
  473. if( ssl->conf->alpn_list == NULL )
  474. {
  475. return;
  476. }
  477. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
  478. for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
  479. alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
  480. if( end < p || (size_t)( end - p ) < 6 + alpnlen )
  481. {
  482. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
  483. return;
  484. }
  485. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
  486. *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF );
  487. /*
  488. * opaque ProtocolName<1..2^8-1>;
  489. *
  490. * struct {
  491. * ProtocolName protocol_name_list<2..2^16-1>
  492. * } ProtocolNameList;
  493. */
  494. /* Skip writing extension and list length for now */
  495. p += 4;
  496. for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
  497. {
  498. *p = (unsigned char)( strlen( *cur ) & 0xFF );
  499. memcpy( p + 1, *cur, *p );
  500. p += 1 + *p;
  501. }
  502. *olen = p - buf;
  503. /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
  504. buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
  505. buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
  506. /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
  507. buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
  508. buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
  509. }
  510. #endif /* MBEDTLS_SSL_ALPN */
  511. /*
  512. * Generate random bytes for ClientHello
  513. */
  514. static int ssl_generate_random( mbedtls_ssl_context *ssl )
  515. {
  516. int ret;
  517. unsigned char *p = ssl->handshake->randbytes;
  518. #if defined(MBEDTLS_HAVE_TIME)
  519. mbedtls_time_t t;
  520. #endif
  521. /*
  522. * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
  523. */
  524. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  525. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  526. ssl->handshake->verify_cookie != NULL )
  527. {
  528. return( 0 );
  529. }
  530. #endif
  531. #if defined(MBEDTLS_HAVE_TIME)
  532. t = mbedtls_time( NULL );
  533. *p++ = (unsigned char)( t >> 24 );
  534. *p++ = (unsigned char)( t >> 16 );
  535. *p++ = (unsigned char)( t >> 8 );
  536. *p++ = (unsigned char)( t );
  537. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
  538. #else
  539. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
  540. return( ret );
  541. p += 4;
  542. #endif /* MBEDTLS_HAVE_TIME */
  543. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
  544. return( ret );
  545. return( 0 );
  546. }
  547. static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
  548. {
  549. int ret;
  550. size_t i, n, olen, ext_len = 0;
  551. unsigned char *buf;
  552. unsigned char *p, *q;
  553. unsigned char offer_compress;
  554. const int *ciphersuites;
  555. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  556. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
  557. if( ssl->conf->f_rng == NULL )
  558. {
  559. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
  560. return( MBEDTLS_ERR_SSL_NO_RNG );
  561. }
  562. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  563. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  564. #endif
  565. {
  566. ssl->major_ver = ssl->conf->min_major_ver;
  567. ssl->minor_ver = ssl->conf->min_minor_ver;
  568. }
  569. if( ssl->conf->max_major_ver == 0 )
  570. {
  571. MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
  572. "consider using mbedtls_ssl_config_defaults()" ) );
  573. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  574. }
  575. /*
  576. * 0 . 0 handshake type
  577. * 1 . 3 handshake length
  578. * 4 . 5 highest version supported
  579. * 6 . 9 current UNIX time
  580. * 10 . 37 random bytes
  581. */
  582. buf = ssl->out_msg;
  583. p = buf + 4;
  584. mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
  585. ssl->conf->transport, p );
  586. p += 2;
  587. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
  588. buf[4], buf[5] ) );
  589. if( ( ret = ssl_generate_random( ssl ) ) != 0 )
  590. {
  591. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
  592. return( ret );
  593. }
  594. memcpy( p, ssl->handshake->randbytes, 32 );
  595. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
  596. p += 32;
  597. /*
  598. * 38 . 38 session id length
  599. * 39 . 39+n session id
  600. * 39+n . 39+n DTLS only: cookie length (1 byte)
  601. * 40+n . .. DTSL only: cookie
  602. * .. . .. ciphersuitelist length (2 bytes)
  603. * .. . .. ciphersuitelist
  604. * .. . .. compression methods length (1 byte)
  605. * .. . .. compression methods
  606. * .. . .. extensions length (2 bytes)
  607. * .. . .. extensions
  608. */
  609. n = ssl->session_negotiate->id_len;
  610. if( n < 16 || n > 32 ||
  611. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  612. ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
  613. #endif
  614. ssl->handshake->resume == 0 )
  615. {
  616. n = 0;
  617. }
  618. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  619. /*
  620. * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
  621. * generate and include a Session ID in the TLS ClientHello."
  622. */
  623. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  624. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  625. #endif
  626. {
  627. if( ssl->session_negotiate->ticket != NULL &&
  628. ssl->session_negotiate->ticket_len != 0 )
  629. {
  630. ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );
  631. if( ret != 0 )
  632. return( ret );
  633. ssl->session_negotiate->id_len = n = 32;
  634. }
  635. }
  636. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  637. *p++ = (unsigned char) n;
  638. for( i = 0; i < n; i++ )
  639. *p++ = ssl->session_negotiate->id[i];
  640. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
  641. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
  642. /*
  643. * DTLS cookie
  644. */
  645. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  646. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  647. {
  648. if( ssl->handshake->verify_cookie == NULL )
  649. {
  650. MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
  651. *p++ = 0;
  652. }
  653. else
  654. {
  655. MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
  656. ssl->handshake->verify_cookie,
  657. ssl->handshake->verify_cookie_len );
  658. *p++ = ssl->handshake->verify_cookie_len;
  659. memcpy( p, ssl->handshake->verify_cookie,
  660. ssl->handshake->verify_cookie_len );
  661. p += ssl->handshake->verify_cookie_len;
  662. }
  663. }
  664. #endif
  665. /*
  666. * Ciphersuite list
  667. */
  668. ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
  669. /* Skip writing ciphersuite length for now */
  670. n = 0;
  671. q = p;
  672. p += 2;
  673. for( i = 0; ciphersuites[i] != 0; i++ )
  674. {
  675. ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
  676. if( ciphersuite_info == NULL )
  677. continue;
  678. if( ciphersuite_info->min_minor_ver > ssl->conf->max_minor_ver ||
  679. ciphersuite_info->max_minor_ver < ssl->conf->min_minor_ver )
  680. continue;
  681. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  682. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  683. ( ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
  684. continue;
  685. #endif
  686. #if defined(MBEDTLS_ARC4_C)
  687. if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
  688. ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
  689. continue;
  690. #endif
  691. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  692. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
  693. mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
  694. continue;
  695. #endif
  696. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
  697. ciphersuites[i] ) );
  698. n++;
  699. *p++ = (unsigned char)( ciphersuites[i] >> 8 );
  700. *p++ = (unsigned char)( ciphersuites[i] );
  701. }
  702. /*
  703. * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
  704. */
  705. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  706. if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
  707. #endif
  708. {
  709. *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
  710. *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO );
  711. n++;
  712. }
  713. /* Some versions of OpenSSL don't handle it correctly if not at end */
  714. #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
  715. if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
  716. {
  717. MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
  718. *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
  719. *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE );
  720. n++;
  721. }
  722. #endif
  723. *q++ = (unsigned char)( n >> 7 );
  724. *q++ = (unsigned char)( n << 1 );
  725. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
  726. #if defined(MBEDTLS_ZLIB_SUPPORT)
  727. offer_compress = 1;
  728. #else
  729. offer_compress = 0;
  730. #endif
  731. /*
  732. * We don't support compression with DTLS right now: is many records come
  733. * in the same datagram, uncompressing one could overwrite the next one.
  734. * We don't want to add complexity for handling that case unless there is
  735. * an actual need for it.
  736. */
  737. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  738. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  739. offer_compress = 0;
  740. #endif
  741. if( offer_compress )
  742. {
  743. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
  744. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
  745. MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
  746. *p++ = 2;
  747. *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
  748. *p++ = MBEDTLS_SSL_COMPRESS_NULL;
  749. }
  750. else
  751. {
  752. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
  753. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
  754. MBEDTLS_SSL_COMPRESS_NULL ) );
  755. *p++ = 1;
  756. *p++ = MBEDTLS_SSL_COMPRESS_NULL;
  757. }
  758. // First write extensions, then the total length
  759. //
  760. #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  761. ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
  762. ext_len += olen;
  763. #endif
  764. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  765. ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
  766. ext_len += olen;
  767. #endif
  768. #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
  769. defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
  770. ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
  771. ext_len += olen;
  772. #endif
  773. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  774. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  775. ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
  776. ext_len += olen;
  777. ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
  778. ext_len += olen;
  779. #endif
  780. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  781. ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
  782. ext_len += olen;
  783. #endif
  784. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  785. ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
  786. ext_len += olen;
  787. #endif
  788. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  789. ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
  790. ext_len += olen;
  791. #endif
  792. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  793. ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
  794. ext_len += olen;
  795. #endif
  796. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  797. ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
  798. ext_len += olen;
  799. #endif
  800. #if defined(MBEDTLS_SSL_ALPN)
  801. ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
  802. ext_len += olen;
  803. #endif
  804. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  805. ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
  806. ext_len += olen;
  807. #endif
  808. /* olen unused if all extensions are disabled */
  809. ((void) olen);
  810. MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
  811. ext_len ) );
  812. if( ext_len > 0 )
  813. {
  814. *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
  815. *p++ = (unsigned char)( ( ext_len ) & 0xFF );
  816. p += ext_len;
  817. }
  818. ssl->out_msglen = p - buf;
  819. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  820. ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO;
  821. ssl->state++;
  822. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  823. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  824. mbedtls_ssl_send_flight_completed( ssl );
  825. #endif
  826. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  827. {
  828. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  829. return( ret );
  830. }
  831. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
  832. return( 0 );
  833. }
  834. static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
  835. const unsigned char *buf,
  836. size_t len )
  837. {
  838. int ret;
  839. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  840. if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
  841. {
  842. /* Check verify-data in constant-time. The length OTOH is no secret */
  843. if( len != 1 + ssl->verify_data_len * 2 ||
  844. buf[0] != ssl->verify_data_len * 2 ||
  845. mbedtls_ssl_safer_memcmp( buf + 1,
  846. ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
  847. mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
  848. ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
  849. {
  850. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
  851. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  852. return( ret );
  853. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  854. }
  855. }
  856. else
  857. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  858. {
  859. if( len != 1 || buf[0] != 0x00 )
  860. {
  861. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
  862. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  863. return( ret );
  864. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  865. }
  866. ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
  867. }
  868. return( 0 );
  869. }
  870. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  871. static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
  872. const unsigned char *buf,
  873. size_t len )
  874. {
  875. /*
  876. * server should use the extension only if we did,
  877. * and if so the server's value should match ours (and len is always 1)
  878. */
  879. if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
  880. len != 1 ||
  881. buf[0] != ssl->conf->mfl_code )
  882. {
  883. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  884. }
  885. return( 0 );
  886. }
  887. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  888. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  889. static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
  890. const unsigned char *buf,
  891. size_t len )
  892. {
  893. if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
  894. len != 0 )
  895. {
  896. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  897. }
  898. ((void) buf);
  899. ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
  900. return( 0 );
  901. }
  902. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  903. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  904. static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
  905. const unsigned char *buf,
  906. size_t len )
  907. {
  908. if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
  909. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
  910. len != 0 )
  911. {
  912. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  913. }
  914. ((void) buf);
  915. ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
  916. return( 0 );
  917. }
  918. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  919. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  920. static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
  921. const unsigned char *buf,
  922. size_t len )
  923. {
  924. if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
  925. ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
  926. len != 0 )
  927. {
  928. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  929. }
  930. ((void) buf);
  931. ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
  932. return( 0 );
  933. }
  934. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  935. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  936. static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
  937. const unsigned char *buf,
  938. size_t len )
  939. {
  940. if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
  941. len != 0 )
  942. {
  943. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  944. }
  945. ((void) buf);
  946. ssl->handshake->new_session_ticket = 1;
  947. return( 0 );
  948. }
  949. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  950. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  951. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  952. static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
  953. const unsigned char *buf,
  954. size_t len )
  955. {
  956. size_t list_size;
  957. const unsigned char *p;
  958. list_size = buf[0];
  959. if( list_size + 1 != len )
  960. {
  961. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  962. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  963. }
  964. p = buf + 1;
  965. while( list_size > 0 )
  966. {
  967. if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
  968. p[0] == MBEDTLS_ECP_PF_COMPRESSED )
  969. {
  970. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
  971. ssl->handshake->ecdh_ctx.point_format = p[0];
  972. #endif
  973. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  974. ssl->handshake->ecjpake_ctx.point_format = p[0];
  975. #endif
  976. MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
  977. return( 0 );
  978. }
  979. list_size--;
  980. p++;
  981. }
  982. MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
  983. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  984. }
  985. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  986. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  987. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  988. static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
  989. const unsigned char *buf,
  990. size_t len )
  991. {
  992. int ret;
  993. if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=
  994. MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  995. {
  996. MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
  997. return( 0 );
  998. }
  999. /* If we got here, we no longer need our cached extension */
  1000. mbedtls_free( ssl->handshake->ecjpake_cache );
  1001. ssl->handshake->ecjpake_cache = NULL;
  1002. ssl->handshake->ecjpake_cache_len = 0;
  1003. if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
  1004. buf, len ) ) != 0 )
  1005. {
  1006. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
  1007. return( ret );
  1008. }
  1009. return( 0 );
  1010. }
  1011. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  1012. #if defined(MBEDTLS_SSL_ALPN)
  1013. static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
  1014. const unsigned char *buf, size_t len )
  1015. {
  1016. size_t list_len, name_len;
  1017. const char **p;
  1018. /* If we didn't send it, the server shouldn't send it */
  1019. if( ssl->conf->alpn_list == NULL )
  1020. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1021. /*
  1022. * opaque ProtocolName<1..2^8-1>;
  1023. *
  1024. * struct {
  1025. * ProtocolName protocol_name_list<2..2^16-1>
  1026. * } ProtocolNameList;
  1027. *
  1028. * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
  1029. */
  1030. /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
  1031. if( len < 4 )
  1032. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1033. list_len = ( buf[0] << 8 ) | buf[1];
  1034. if( list_len != len - 2 )
  1035. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1036. name_len = buf[2];
  1037. if( name_len != list_len - 1 )
  1038. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1039. /* Check that the server chosen protocol was in our list and save it */
  1040. for( p = ssl->conf->alpn_list; *p != NULL; p++ )
  1041. {
  1042. if( name_len == strlen( *p ) &&
  1043. memcmp( buf + 3, *p, name_len ) == 0 )
  1044. {
  1045. ssl->alpn_chosen = *p;
  1046. return( 0 );
  1047. }
  1048. }
  1049. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1050. }
  1051. #endif /* MBEDTLS_SSL_ALPN */
  1052. /*
  1053. * Parse HelloVerifyRequest. Only called after verifying the HS type.
  1054. */
  1055. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  1056. static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
  1057. {
  1058. const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  1059. int major_ver, minor_ver;
  1060. unsigned char cookie_len;
  1061. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
  1062. /*
  1063. * struct {
  1064. * ProtocolVersion server_version;
  1065. * opaque cookie<0..2^8-1>;
  1066. * } HelloVerifyRequest;
  1067. */
  1068. MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
  1069. mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
  1070. p += 2;
  1071. /*
  1072. * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
  1073. * even is lower than our min version.
  1074. */
  1075. if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
  1076. minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
  1077. major_ver > ssl->conf->max_major_ver ||
  1078. minor_ver > ssl->conf->max_minor_ver )
  1079. {
  1080. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
  1081. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  1082. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  1083. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  1084. }
  1085. cookie_len = *p++;
  1086. MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
  1087. if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
  1088. {
  1089. MBEDTLS_SSL_DEBUG_MSG( 1,
  1090. ( "cookie length does not match incoming message size" ) );
  1091. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  1092. MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
  1093. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1094. }
  1095. mbedtls_free( ssl->handshake->verify_cookie );
  1096. ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
  1097. if( ssl->handshake->verify_cookie == NULL )
  1098. {
  1099. MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
  1100. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  1101. }
  1102. memcpy( ssl->handshake->verify_cookie, p, cookie_len );
  1103. ssl->handshake->verify_cookie_len = cookie_len;
  1104. /* Start over at ClientHello */
  1105. ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
  1106. mbedtls_ssl_reset_checksum( ssl );
  1107. mbedtls_ssl_recv_flight_completed( ssl );
  1108. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
  1109. return( 0 );
  1110. }
  1111. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  1112. static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
  1113. {
  1114. int ret, i;
  1115. size_t n;
  1116. size_t ext_len;
  1117. unsigned char *buf, *ext;
  1118. unsigned char comp;
  1119. #if defined(MBEDTLS_ZLIB_SUPPORT)
  1120. int accept_comp;
  1121. #endif
  1122. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  1123. int renegotiation_info_seen = 0;
  1124. #endif
  1125. int handshake_failure = 0;
  1126. const mbedtls_ssl_ciphersuite_t *suite_info;
  1127. #if defined(MBEDTLS_DEBUG_C)
  1128. uint32_t t;
  1129. #endif
  1130. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
  1131. buf = ssl->in_msg;
  1132. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  1133. {
  1134. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  1135. return( ret );
  1136. }
  1137. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  1138. {
  1139. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  1140. if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
  1141. {
  1142. ssl->renego_records_seen++;
  1143. if( ssl->conf->renego_max_records >= 0 &&
  1144. ssl->renego_records_seen > ssl->conf->renego_max_records )
  1145. {
  1146. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
  1147. "but not honored by server" ) );
  1148. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1149. }
  1150. MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
  1151. return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
  1152. }
  1153. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  1154. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1155. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1156. }
  1157. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  1158. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  1159. {
  1160. if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
  1161. {
  1162. MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
  1163. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
  1164. return( ssl_parse_hello_verify_request( ssl ) );
  1165. }
  1166. else
  1167. {
  1168. /* We made it through the verification process */
  1169. mbedtls_free( ssl->handshake->verify_cookie );
  1170. ssl->handshake->verify_cookie = NULL;
  1171. ssl->handshake->verify_cookie_len = 0;
  1172. }
  1173. }
  1174. #endif /* MBEDTLS_SSL_PROTO_DTLS */
  1175. if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
  1176. buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
  1177. {
  1178. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1179. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1180. }
  1181. /*
  1182. * 0 . 1 server_version
  1183. * 2 . 33 random (maybe including 4 bytes of Unix time)
  1184. * 34 . 34 session_id length = n
  1185. * 35 . 34+n session_id
  1186. * 35+n . 36+n cipher_suite
  1187. * 37+n . 37+n compression_method
  1188. *
  1189. * 38+n . 39+n extensions length (optional)
  1190. * 40+n . .. extensions
  1191. */
  1192. buf += mbedtls_ssl_hs_hdr_len( ssl );
  1193. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
  1194. mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
  1195. ssl->conf->transport, buf + 0 );
  1196. if( ssl->major_ver < ssl->conf->min_major_ver ||
  1197. ssl->minor_ver < ssl->conf->min_minor_ver ||
  1198. ssl->major_ver > ssl->conf->max_major_ver ||
  1199. ssl->minor_ver > ssl->conf->max_minor_ver )
  1200. {
  1201. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
  1202. " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
  1203. ssl->conf->min_major_ver, ssl->conf->min_minor_ver,
  1204. ssl->major_ver, ssl->minor_ver,
  1205. ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) );
  1206. mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
  1207. MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
  1208. return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
  1209. }
  1210. #if defined(MBEDTLS_DEBUG_C)
  1211. t = ( (uint32_t) buf[2] << 24 )
  1212. | ( (uint32_t) buf[3] << 16 )
  1213. | ( (uint32_t) buf[4] << 8 )
  1214. | ( (uint32_t) buf[5] );
  1215. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
  1216. #endif
  1217. memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
  1218. n = buf[34];
  1219. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 );
  1220. if( n > 32 )
  1221. {
  1222. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1223. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1224. }
  1225. if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
  1226. {
  1227. ext_len = ( ( buf[38 + n] << 8 )
  1228. | ( buf[39 + n] ) );
  1229. if( ( ext_len > 0 && ext_len < 4 ) ||
  1230. ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
  1231. {
  1232. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1233. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1234. }
  1235. }
  1236. else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
  1237. {
  1238. ext_len = 0;
  1239. }
  1240. else
  1241. {
  1242. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1243. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1244. }
  1245. /* ciphersuite (used later) */
  1246. i = ( buf[35 + n] << 8 ) | buf[36 + n];
  1247. /*
  1248. * Read and check compression
  1249. */
  1250. comp = buf[37 + n];
  1251. #if defined(MBEDTLS_ZLIB_SUPPORT)
  1252. /* See comments in ssl_write_client_hello() */
  1253. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  1254. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  1255. accept_comp = 0;
  1256. else
  1257. #endif
  1258. accept_comp = 1;
  1259. if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
  1260. ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
  1261. #else /* MBEDTLS_ZLIB_SUPPORT */
  1262. if( comp != MBEDTLS_SSL_COMPRESS_NULL )
  1263. #endif/* MBEDTLS_ZLIB_SUPPORT */
  1264. {
  1265. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
  1266. return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
  1267. }
  1268. /*
  1269. * Initialize update checksum functions
  1270. */
  1271. ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );
  1272. if( ssl->transform_negotiate->ciphersuite_info == NULL )
  1273. {
  1274. MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
  1275. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  1276. }
  1277. mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
  1278. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
  1279. MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n );
  1280. /*
  1281. * Check if the session can be resumed
  1282. */
  1283. if( ssl->handshake->resume == 0 || n == 0 ||
  1284. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  1285. ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
  1286. #endif
  1287. ssl->session_negotiate->ciphersuite != i ||
  1288. ssl->session_negotiate->compression != comp ||
  1289. ssl->session_negotiate->id_len != n ||
  1290. memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
  1291. {
  1292. ssl->state++;
  1293. ssl->handshake->resume = 0;
  1294. #if defined(MBEDTLS_HAVE_TIME)
  1295. ssl->session_negotiate->start = mbedtls_time( NULL );
  1296. #endif
  1297. ssl->session_negotiate->ciphersuite = i;
  1298. ssl->session_negotiate->compression = comp;
  1299. ssl->session_negotiate->id_len = n;
  1300. memcpy( ssl->session_negotiate->id, buf + 35, n );
  1301. }
  1302. else
  1303. {
  1304. ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
  1305. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  1306. {
  1307. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  1308. return( ret );
  1309. }
  1310. }
  1311. MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
  1312. ssl->handshake->resume ? "a" : "no" ) );
  1313. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
  1314. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
  1315. suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
  1316. if( suite_info == NULL
  1317. #if defined(MBEDTLS_ARC4_C)
  1318. || ( ssl->conf->arc4_disabled &&
  1319. suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
  1320. #endif
  1321. )
  1322. {
  1323. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1324. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1325. }
  1326. MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
  1327. i = 0;
  1328. while( 1 )
  1329. {
  1330. if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
  1331. {
  1332. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1333. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1334. }
  1335. if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
  1336. ssl->session_negotiate->ciphersuite )
  1337. {
  1338. break;
  1339. }
  1340. }
  1341. if( comp != MBEDTLS_SSL_COMPRESS_NULL
  1342. #if defined(MBEDTLS_ZLIB_SUPPORT)
  1343. && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
  1344. #endif
  1345. )
  1346. {
  1347. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1348. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1349. }
  1350. ssl->session_negotiate->compression = comp;
  1351. ext = buf + 40 + n;
  1352. MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
  1353. while( ext_len )
  1354. {
  1355. unsigned int ext_id = ( ( ext[0] << 8 )
  1356. | ( ext[1] ) );
  1357. unsigned int ext_size = ( ( ext[2] << 8 )
  1358. | ( ext[3] ) );
  1359. if( ext_size + 4 > ext_len )
  1360. {
  1361. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1362. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1363. }
  1364. switch( ext_id )
  1365. {
  1366. case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
  1367. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
  1368. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  1369. renegotiation_info_seen = 1;
  1370. #endif
  1371. if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
  1372. ext_size ) ) != 0 )
  1373. return( ret );
  1374. break;
  1375. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  1376. case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
  1377. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
  1378. if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
  1379. ext + 4, ext_size ) ) != 0 )
  1380. {
  1381. return( ret );
  1382. }
  1383. break;
  1384. #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
  1385. #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
  1386. case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
  1387. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
  1388. if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
  1389. ext + 4, ext_size ) ) != 0 )
  1390. {
  1391. return( ret );
  1392. }
  1393. break;
  1394. #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
  1395. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  1396. case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
  1397. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
  1398. if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
  1399. ext + 4, ext_size ) ) != 0 )
  1400. {
  1401. return( ret );
  1402. }
  1403. break;
  1404. #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
  1405. #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
  1406. case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
  1407. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
  1408. if( ( ret = ssl_parse_extended_ms_ext( ssl,
  1409. ext + 4, ext_size ) ) != 0 )
  1410. {
  1411. return( ret );
  1412. }
  1413. break;
  1414. #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
  1415. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  1416. case MBEDTLS_TLS_EXT_SESSION_TICKET:
  1417. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
  1418. if( ( ret = ssl_parse_session_ticket_ext( ssl,
  1419. ext + 4, ext_size ) ) != 0 )
  1420. {
  1421. return( ret );
  1422. }
  1423. break;
  1424. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  1425. #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
  1426. defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  1427. case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
  1428. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
  1429. if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
  1430. ext + 4, ext_size ) ) != 0 )
  1431. {
  1432. return( ret );
  1433. }
  1434. break;
  1435. #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
  1436. MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  1437. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  1438. case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
  1439. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
  1440. if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
  1441. ext + 4, ext_size ) ) != 0 )
  1442. {
  1443. return( ret );
  1444. }
  1445. break;
  1446. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  1447. #if defined(MBEDTLS_SSL_ALPN)
  1448. case MBEDTLS_TLS_EXT_ALPN:
  1449. MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
  1450. if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
  1451. return( ret );
  1452. break;
  1453. #endif /* MBEDTLS_SSL_ALPN */
  1454. default:
  1455. MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
  1456. ext_id ) );
  1457. }
  1458. ext_len -= 4 + ext_size;
  1459. ext += 4 + ext_size;
  1460. if( ext_len > 0 && ext_len < 4 )
  1461. {
  1462. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  1463. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1464. }
  1465. }
  1466. /*
  1467. * Renegotiation security checks
  1468. */
  1469. if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  1470. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
  1471. {
  1472. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
  1473. handshake_failure = 1;
  1474. }
  1475. #if defined(MBEDTLS_SSL_RENEGOTIATION)
  1476. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  1477. ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
  1478. renegotiation_info_seen == 0 )
  1479. {
  1480. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
  1481. handshake_failure = 1;
  1482. }
  1483. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  1484. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  1485. ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
  1486. {
  1487. MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
  1488. handshake_failure = 1;
  1489. }
  1490. else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
  1491. ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
  1492. renegotiation_info_seen == 1 )
  1493. {
  1494. MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
  1495. handshake_failure = 1;
  1496. }
  1497. #endif /* MBEDTLS_SSL_RENEGOTIATION */
  1498. if( handshake_failure == 1 )
  1499. {
  1500. if( ( ret = mbedtls_ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
  1501. return( ret );
  1502. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
  1503. }
  1504. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
  1505. return( 0 );
  1506. }
  1507. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  1508. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  1509. static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
  1510. unsigned char *end )
  1511. {
  1512. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  1513. /*
  1514. * Ephemeral DH parameters:
  1515. *
  1516. * struct {
  1517. * opaque dh_p<1..2^16-1>;
  1518. * opaque dh_g<1..2^16-1>;
  1519. * opaque dh_Ys<1..2^16-1>;
  1520. * } ServerDHParams;
  1521. */
  1522. if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
  1523. {
  1524. MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
  1525. return( ret );
  1526. }
  1527. if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
  1528. {
  1529. MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
  1530. ssl->handshake->dhm_ctx.len * 8,
  1531. ssl->conf->dhm_min_bitlen ) );
  1532. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1533. }
  1534. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
  1535. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
  1536. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
  1537. return( ret );
  1538. }
  1539. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  1540. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  1541. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  1542. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  1543. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
  1544. defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  1545. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  1546. static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
  1547. {
  1548. const mbedtls_ecp_curve_info *curve_info;
  1549. curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
  1550. if( curve_info == NULL )
  1551. {
  1552. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  1553. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  1554. }
  1555. MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
  1556. #if defined(MBEDTLS_ECP_C)
  1557. if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )
  1558. #else
  1559. if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
  1560. ssl->handshake->ecdh_ctx.grp.nbits > 521 )
  1561. #endif
  1562. return( -1 );
  1563. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
  1564. return( 0 );
  1565. }
  1566. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  1567. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  1568. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
  1569. MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  1570. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  1571. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  1572. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  1573. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  1574. static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
  1575. unsigned char **p,
  1576. unsigned char *end )
  1577. {
  1578. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  1579. /*
  1580. * Ephemeral ECDH parameters:
  1581. *
  1582. * struct {
  1583. * ECParameters curve_params;
  1584. * ECPoint public;
  1585. * } ServerECDHParams;
  1586. */
  1587. if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
  1588. (const unsigned char **) p, end ) ) != 0 )
  1589. {
  1590. MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
  1591. return( ret );
  1592. }
  1593. if( ssl_check_server_ecdh_params( ssl ) != 0 )
  1594. {
  1595. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
  1596. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1597. }
  1598. return( ret );
  1599. }
  1600. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  1601. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  1602. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  1603. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  1604. static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
  1605. unsigned char **p,
  1606. unsigned char *end )
  1607. {
  1608. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  1609. size_t len;
  1610. ((void) ssl);
  1611. /*
  1612. * PSK parameters:
  1613. *
  1614. * opaque psk_identity_hint<0..2^16-1>;
  1615. */
  1616. len = (*p)[0] << 8 | (*p)[1];
  1617. *p += 2;
  1618. if( (*p) + len > end )
  1619. {
  1620. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
  1621. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1622. }
  1623. /*
  1624. * Note: we currently ignore the PKS identity hint, as we only allow one
  1625. * PSK to be provisionned on the client. This could be changed later if
  1626. * someone needs that feature.
  1627. */
  1628. *p += len;
  1629. ret = 0;
  1630. return( ret );
  1631. }
  1632. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  1633. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
  1634. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  1635. /*
  1636. * Generate a pre-master secret and encrypt it with the server's RSA key
  1637. */
  1638. static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
  1639. size_t offset, size_t *olen,
  1640. size_t pms_offset )
  1641. {
  1642. int ret;
  1643. size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
  1644. unsigned char *p = ssl->handshake->premaster + pms_offset;
  1645. if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )
  1646. {
  1647. MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
  1648. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  1649. }
  1650. /*
  1651. * Generate (part of) the pre-master as
  1652. * struct {
  1653. * ProtocolVersion client_version;
  1654. * opaque random[46];
  1655. * } PreMasterSecret;
  1656. */
  1657. mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
  1658. ssl->conf->transport, p );
  1659. if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
  1660. {
  1661. MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
  1662. return( ret );
  1663. }
  1664. ssl->handshake->pmslen = 48;
  1665. if( ssl->session_negotiate->peer_cert == NULL )
  1666. {
  1667. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  1668. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1669. }
  1670. /*
  1671. * Now write it out, encrypted
  1672. */
  1673. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
  1674. MBEDTLS_PK_RSA ) )
  1675. {
  1676. MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
  1677. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  1678. }
  1679. if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
  1680. p, ssl->handshake->pmslen,
  1681. ssl->out_msg + offset + len_bytes, olen,
  1682. MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,
  1683. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  1684. {
  1685. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
  1686. return( ret );
  1687. }
  1688. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  1689. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  1690. if( len_bytes == 2 )
  1691. {
  1692. ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
  1693. ssl->out_msg[offset+1] = (unsigned char)( *olen );
  1694. *olen += 2;
  1695. }
  1696. #endif
  1697. return( 0 );
  1698. }
  1699. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
  1700. MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  1701. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  1702. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  1703. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  1704. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  1705. static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
  1706. unsigned char **p,
  1707. unsigned char *end,
  1708. mbedtls_md_type_t *md_alg,
  1709. mbedtls_pk_type_t *pk_alg )
  1710. {
  1711. ((void) ssl);
  1712. *md_alg = MBEDTLS_MD_NONE;
  1713. *pk_alg = MBEDTLS_PK_NONE;
  1714. /* Only in TLS 1.2 */
  1715. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  1716. {
  1717. return( 0 );
  1718. }
  1719. if( (*p) + 2 > end )
  1720. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1721. /*
  1722. * Get hash algorithm
  1723. */
  1724. if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
  1725. {
  1726. MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
  1727. "HashAlgorithm %d", *(p)[0] ) );
  1728. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1729. }
  1730. /*
  1731. * Get signature algorithm
  1732. */
  1733. if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
  1734. {
  1735. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
  1736. "SignatureAlgorithm %d", (*p)[1] ) );
  1737. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1738. }
  1739. /*
  1740. * Check if the hash is acceptable
  1741. */
  1742. if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
  1743. {
  1744. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm "
  1745. "that was not offered" ) );
  1746. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1747. }
  1748. MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
  1749. MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
  1750. *p += 2;
  1751. return( 0 );
  1752. }
  1753. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  1754. MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  1755. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  1756. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  1757. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  1758. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  1759. static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
  1760. {
  1761. int ret;
  1762. const mbedtls_ecp_keypair *peer_key;
  1763. if( ssl->session_negotiate->peer_cert == NULL )
  1764. {
  1765. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  1766. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1767. }
  1768. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,
  1769. MBEDTLS_PK_ECKEY ) )
  1770. {
  1771. MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
  1772. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  1773. }
  1774. peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );
  1775. if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
  1776. MBEDTLS_ECDH_THEIRS ) ) != 0 )
  1777. {
  1778. MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
  1779. return( ret );
  1780. }
  1781. if( ssl_check_server_ecdh_params( ssl ) != 0 )
  1782. {
  1783. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
  1784. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
  1785. }
  1786. return( ret );
  1787. }
  1788. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
  1789. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  1790. static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
  1791. {
  1792. int ret;
  1793. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  1794. unsigned char *p, *end;
  1795. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
  1796. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  1797. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
  1798. {
  1799. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
  1800. ssl->state++;
  1801. return( 0 );
  1802. }
  1803. ((void) p);
  1804. ((void) end);
  1805. #endif
  1806. #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  1807. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  1808. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  1809. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  1810. {
  1811. if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
  1812. {
  1813. MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
  1814. return( ret );
  1815. }
  1816. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
  1817. ssl->state++;
  1818. return( 0 );
  1819. }
  1820. ((void) p);
  1821. ((void) end);
  1822. #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  1823. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  1824. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  1825. {
  1826. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  1827. return( ret );
  1828. }
  1829. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  1830. {
  1831. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1832. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1833. }
  1834. /*
  1835. * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
  1836. * doesn't use a psk_identity_hint
  1837. */
  1838. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
  1839. {
  1840. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  1841. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  1842. {
  1843. ssl->record_read = 1;
  1844. goto exit;
  1845. }
  1846. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1847. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  1848. }
  1849. p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  1850. end = ssl->in_msg + ssl->in_hslen;
  1851. MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p );
  1852. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  1853. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  1854. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  1855. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  1856. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  1857. {
  1858. if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
  1859. {
  1860. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1861. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1862. }
  1863. } /* FALLTROUGH */
  1864. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  1865. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
  1866. defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  1867. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  1868. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  1869. ; /* nothing more to do */
  1870. else
  1871. #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
  1872. MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
  1873. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  1874. defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  1875. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  1876. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  1877. {
  1878. if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
  1879. {
  1880. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1881. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1882. }
  1883. }
  1884. else
  1885. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  1886. MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  1887. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  1888. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
  1889. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  1890. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  1891. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  1892. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  1893. {
  1894. if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
  1895. {
  1896. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1897. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1898. }
  1899. }
  1900. else
  1901. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  1902. MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
  1903. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  1904. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  1905. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  1906. {
  1907. ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
  1908. p, end - p );
  1909. if( ret != 0 )
  1910. {
  1911. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
  1912. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1913. }
  1914. }
  1915. else
  1916. #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  1917. {
  1918. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  1919. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  1920. }
  1921. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
  1922. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  1923. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  1924. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
  1925. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  1926. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
  1927. {
  1928. size_t sig_len, hashlen;
  1929. unsigned char hash[64];
  1930. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  1931. mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
  1932. unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  1933. size_t params_len = p - params;
  1934. /*
  1935. * Handle the digitally-signed structure
  1936. */
  1937. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  1938. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  1939. {
  1940. if( ssl_parse_signature_algorithm( ssl, &p, end,
  1941. &md_alg, &pk_alg ) != 0 )
  1942. {
  1943. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1944. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1945. }
  1946. if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
  1947. {
  1948. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1949. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1950. }
  1951. }
  1952. else
  1953. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  1954. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  1955. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  1956. if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
  1957. {
  1958. pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
  1959. /* Default hash for ECDSA is SHA-1 */
  1960. if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
  1961. md_alg = MBEDTLS_MD_SHA1;
  1962. }
  1963. else
  1964. #endif
  1965. {
  1966. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  1967. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  1968. }
  1969. /*
  1970. * Read signature
  1971. */
  1972. sig_len = ( p[0] << 8 ) | p[1];
  1973. p += 2;
  1974. if( end != p + sig_len )
  1975. {
  1976. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  1977. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  1978. }
  1979. MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
  1980. /*
  1981. * Compute the hash that has been signed
  1982. */
  1983. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  1984. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  1985. if( md_alg == MBEDTLS_MD_NONE )
  1986. {
  1987. mbedtls_md5_context mbedtls_md5;
  1988. mbedtls_sha1_context mbedtls_sha1;
  1989. mbedtls_md5_init( &mbedtls_md5 );
  1990. mbedtls_sha1_init( &mbedtls_sha1 );
  1991. hashlen = 36;
  1992. /*
  1993. * digitally-signed struct {
  1994. * opaque md5_hash[16];
  1995. * opaque sha_hash[20];
  1996. * };
  1997. *
  1998. * md5_hash
  1999. * MD5(ClientHello.random + ServerHello.random
  2000. * + ServerParams);
  2001. * sha_hash
  2002. * SHA(ClientHello.random + ServerHello.random
  2003. * + ServerParams);
  2004. */
  2005. mbedtls_md5_starts( &mbedtls_md5 );
  2006. mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes, 64 );
  2007. mbedtls_md5_update( &mbedtls_md5, params, params_len );
  2008. mbedtls_md5_finish( &mbedtls_md5, hash );
  2009. mbedtls_sha1_starts( &mbedtls_sha1 );
  2010. mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes, 64 );
  2011. mbedtls_sha1_update( &mbedtls_sha1, params, params_len );
  2012. mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );
  2013. mbedtls_md5_free( &mbedtls_md5 );
  2014. mbedtls_sha1_free( &mbedtls_sha1 );
  2015. }
  2016. else
  2017. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
  2018. MBEDTLS_SSL_PROTO_TLS1_1 */
  2019. #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
  2020. defined(MBEDTLS_SSL_PROTO_TLS1_2)
  2021. if( md_alg != MBEDTLS_MD_NONE )
  2022. {
  2023. mbedtls_md_context_t ctx;
  2024. mbedtls_md_init( &ctx );
  2025. /* Info from md_alg will be used instead */
  2026. hashlen = 0;
  2027. /*
  2028. * digitally-signed struct {
  2029. * opaque client_random[32];
  2030. * opaque server_random[32];
  2031. * ServerDHParams params;
  2032. * };
  2033. */
  2034. if( ( ret = mbedtls_md_setup( &ctx,
  2035. mbedtls_md_info_from_type( md_alg ), 0 ) ) != 0 )
  2036. {
  2037. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
  2038. return( ret );
  2039. }
  2040. mbedtls_md_starts( &ctx );
  2041. mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );
  2042. mbedtls_md_update( &ctx, params, params_len );
  2043. mbedtls_md_finish( &ctx, hash );
  2044. mbedtls_md_free( &ctx );
  2045. }
  2046. else
  2047. #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
  2048. MBEDTLS_SSL_PROTO_TLS1_2 */
  2049. {
  2050. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2051. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2052. }
  2053. MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
  2054. (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );
  2055. if( ssl->session_negotiate->peer_cert == NULL )
  2056. {
  2057. MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) );
  2058. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  2059. }
  2060. /*
  2061. * Verify signature
  2062. */
  2063. if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
  2064. {
  2065. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  2066. return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
  2067. }
  2068. if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,
  2069. md_alg, hash, hashlen, p, sig_len ) ) != 0 )
  2070. {
  2071. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
  2072. return( ret );
  2073. }
  2074. }
  2075. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
  2076. MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  2077. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  2078. exit:
  2079. ssl->state++;
  2080. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
  2081. return( 0 );
  2082. }
  2083. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  2084. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  2085. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
  2086. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  2087. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
  2088. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  2089. static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
  2090. {
  2091. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  2092. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
  2093. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  2094. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  2095. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  2096. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  2097. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  2098. {
  2099. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
  2100. ssl->state++;
  2101. return( 0 );
  2102. }
  2103. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2104. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2105. }
  2106. #else
  2107. static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
  2108. {
  2109. int ret;
  2110. unsigned char *buf;
  2111. size_t n = 0;
  2112. size_t cert_type_len = 0, dn_len = 0;
  2113. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  2114. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
  2115. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  2116. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  2117. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  2118. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  2119. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  2120. {
  2121. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
  2122. ssl->state++;
  2123. return( 0 );
  2124. }
  2125. if( ssl->record_read == 0 )
  2126. {
  2127. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  2128. {
  2129. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  2130. return( ret );
  2131. }
  2132. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  2133. {
  2134. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  2135. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  2136. }
  2137. ssl->record_read = 1;
  2138. }
  2139. ssl->client_auth = 0;
  2140. ssl->state++;
  2141. if( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST )
  2142. ssl->client_auth++;
  2143. MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
  2144. ssl->client_auth ? "a" : "no" ) );
  2145. if( ssl->client_auth == 0 )
  2146. goto exit;
  2147. ssl->record_read = 0;
  2148. /*
  2149. * struct {
  2150. * ClientCertificateType certificate_types<1..2^8-1>;
  2151. * SignatureAndHashAlgorithm
  2152. * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
  2153. * DistinguishedName certificate_authorities<0..2^16-1>;
  2154. * } CertificateRequest;
  2155. *
  2156. * Since we only support a single certificate on clients, let's just
  2157. * ignore all the information that's supposed to help us pick a
  2158. * certificate.
  2159. *
  2160. * We could check that our certificate matches the request, and bail out
  2161. * if it doesn't, but it's simpler to just send the certificate anyway,
  2162. * and give the server the opportunity to decide if it should terminate
  2163. * the connection when it doesn't like our certificate.
  2164. *
  2165. * Same goes for the hash in TLS 1.2's signature_algorithms: at this
  2166. * point we only have one hash available (see comments in
  2167. * write_certificate_verify), so let's just use what we have.
  2168. *
  2169. * However, we still minimally parse the message to check it is at least
  2170. * superficially sane.
  2171. */
  2172. buf = ssl->in_msg;
  2173. /* certificate_types */
  2174. cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
  2175. n = cert_type_len;
  2176. if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
  2177. {
  2178. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  2179. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  2180. }
  2181. /* supported_signature_algorithms */
  2182. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  2183. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  2184. {
  2185. size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
  2186. | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
  2187. #if defined(MBEDTLS_DEBUG_C)
  2188. unsigned char* sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
  2189. size_t i;
  2190. for( i = 0; i < sig_alg_len; i += 2 )
  2191. {
  2192. MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d,%d", sig_alg[i], sig_alg[i + 1] ) );
  2193. }
  2194. #endif
  2195. n += 2 + sig_alg_len;
  2196. if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
  2197. {
  2198. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  2199. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  2200. }
  2201. }
  2202. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  2203. /* certificate_authorities */
  2204. dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 )
  2205. | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) );
  2206. n += dn_len;
  2207. if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
  2208. {
  2209. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  2210. return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
  2211. }
  2212. exit:
  2213. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
  2214. return( 0 );
  2215. }
  2216. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  2217. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  2218. !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
  2219. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
  2220. !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
  2221. !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  2222. static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
  2223. {
  2224. int ret;
  2225. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
  2226. if( ssl->record_read == 0 )
  2227. {
  2228. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  2229. {
  2230. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  2231. return( ret );
  2232. }
  2233. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  2234. {
  2235. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  2236. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  2237. }
  2238. }
  2239. ssl->record_read = 0;
  2240. if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ||
  2241. ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
  2242. {
  2243. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  2244. return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
  2245. }
  2246. ssl->state++;
  2247. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  2248. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
  2249. mbedtls_ssl_recv_flight_completed( ssl );
  2250. #endif
  2251. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
  2252. return( 0 );
  2253. }
  2254. static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
  2255. {
  2256. int ret;
  2257. size_t i, n;
  2258. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  2259. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
  2260. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
  2261. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
  2262. {
  2263. /*
  2264. * DHM key exchange -- send G^X mod P
  2265. */
  2266. n = ssl->handshake->dhm_ctx.len;
  2267. ssl->out_msg[4] = (unsigned char)( n >> 8 );
  2268. ssl->out_msg[5] = (unsigned char)( n );
  2269. i = 6;
  2270. ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
  2271. (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
  2272. &ssl->out_msg[i], n,
  2273. ssl->conf->f_rng, ssl->conf->p_rng );
  2274. if( ret != 0 )
  2275. {
  2276. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
  2277. return( ret );
  2278. }
  2279. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
  2280. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
  2281. if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
  2282. ssl->handshake->premaster,
  2283. MBEDTLS_PREMASTER_SIZE,
  2284. &ssl->handshake->pmslen,
  2285. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  2286. {
  2287. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
  2288. return( ret );
  2289. }
  2290. MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
  2291. }
  2292. else
  2293. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  2294. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
  2295. defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
  2296. defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
  2297. defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
  2298. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
  2299. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
  2300. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
  2301. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
  2302. {
  2303. /*
  2304. * ECDH key exchange -- send client public value
  2305. */
  2306. i = 4;
  2307. ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
  2308. &n,
  2309. &ssl->out_msg[i], 1000,
  2310. ssl->conf->f_rng, ssl->conf->p_rng );
  2311. if( ret != 0 )
  2312. {
  2313. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
  2314. return( ret );
  2315. }
  2316. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
  2317. if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
  2318. &ssl->handshake->pmslen,
  2319. ssl->handshake->premaster,
  2320. MBEDTLS_MPI_MAX_SIZE,
  2321. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  2322. {
  2323. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
  2324. return( ret );
  2325. }
  2326. MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
  2327. }
  2328. else
  2329. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
  2330. MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
  2331. MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
  2332. MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
  2333. #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
  2334. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  2335. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  2336. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  2337. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  2338. {
  2339. /*
  2340. * opaque psk_identity<0..2^16-1>;
  2341. */
  2342. if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )
  2343. {
  2344. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) );
  2345. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  2346. }
  2347. i = 4;
  2348. n = ssl->conf->psk_identity_len;
  2349. if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
  2350. {
  2351. MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
  2352. "SSL buffer too short" ) );
  2353. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  2354. }
  2355. ssl->out_msg[i++] = (unsigned char)( n >> 8 );
  2356. ssl->out_msg[i++] = (unsigned char)( n );
  2357. memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len );
  2358. i += ssl->conf->psk_identity_len;
  2359. #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
  2360. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
  2361. {
  2362. n = 0;
  2363. }
  2364. else
  2365. #endif
  2366. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
  2367. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
  2368. {
  2369. if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
  2370. return( ret );
  2371. }
  2372. else
  2373. #endif
  2374. #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
  2375. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
  2376. {
  2377. /*
  2378. * ClientDiffieHellmanPublic public (DHM send G^X mod P)
  2379. */
  2380. n = ssl->handshake->dhm_ctx.len;
  2381. if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )
  2382. {
  2383. MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
  2384. " or SSL buffer too short" ) );
  2385. return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
  2386. }
  2387. ssl->out_msg[i++] = (unsigned char)( n >> 8 );
  2388. ssl->out_msg[i++] = (unsigned char)( n );
  2389. ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
  2390. (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
  2391. &ssl->out_msg[i], n,
  2392. ssl->conf->f_rng, ssl->conf->p_rng );
  2393. if( ret != 0 )
  2394. {
  2395. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
  2396. return( ret );
  2397. }
  2398. }
  2399. else
  2400. #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
  2401. #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
  2402. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
  2403. {
  2404. /*
  2405. * ClientECDiffieHellmanPublic public;
  2406. */
  2407. ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
  2408. &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,
  2409. ssl->conf->f_rng, ssl->conf->p_rng );
  2410. if( ret != 0 )
  2411. {
  2412. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
  2413. return( ret );
  2414. }
  2415. MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
  2416. }
  2417. else
  2418. #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
  2419. {
  2420. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2421. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2422. }
  2423. if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
  2424. ciphersuite_info->key_exchange ) ) != 0 )
  2425. {
  2426. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
  2427. return( ret );
  2428. }
  2429. }
  2430. else
  2431. #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
  2432. #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
  2433. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
  2434. {
  2435. i = 4;
  2436. if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
  2437. return( ret );
  2438. }
  2439. else
  2440. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  2441. #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
  2442. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  2443. {
  2444. i = 4;
  2445. ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
  2446. ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,
  2447. ssl->conf->f_rng, ssl->conf->p_rng );
  2448. if( ret != 0 )
  2449. {
  2450. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
  2451. return( ret );
  2452. }
  2453. ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
  2454. ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
  2455. ssl->conf->f_rng, ssl->conf->p_rng );
  2456. if( ret != 0 )
  2457. {
  2458. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
  2459. return( ret );
  2460. }
  2461. }
  2462. else
  2463. #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
  2464. {
  2465. ((void) ciphersuite_info);
  2466. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2467. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2468. }
  2469. ssl->out_msglen = i + n;
  2470. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  2471. ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
  2472. ssl->state++;
  2473. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  2474. {
  2475. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  2476. return( ret );
  2477. }
  2478. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
  2479. return( 0 );
  2480. }
  2481. #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
  2482. !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
  2483. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
  2484. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
  2485. !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \
  2486. !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
  2487. static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
  2488. {
  2489. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  2490. int ret;
  2491. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
  2492. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  2493. {
  2494. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  2495. return( ret );
  2496. }
  2497. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  2498. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  2499. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  2500. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  2501. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  2502. {
  2503. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  2504. ssl->state++;
  2505. return( 0 );
  2506. }
  2507. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2508. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2509. }
  2510. #else
  2511. static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
  2512. {
  2513. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  2514. const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
  2515. size_t n = 0, offset = 0;
  2516. unsigned char hash[48];
  2517. unsigned char *hash_start = hash;
  2518. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  2519. unsigned int hashlen;
  2520. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
  2521. if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
  2522. {
  2523. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
  2524. return( ret );
  2525. }
  2526. if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
  2527. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
  2528. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
  2529. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
  2530. ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
  2531. {
  2532. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  2533. ssl->state++;
  2534. return( 0 );
  2535. }
  2536. if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
  2537. {
  2538. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  2539. ssl->state++;
  2540. return( 0 );
  2541. }
  2542. if( mbedtls_ssl_own_key( ssl ) == NULL )
  2543. {
  2544. MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
  2545. return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
  2546. }
  2547. /*
  2548. * Make an RSA signature of the handshake digests
  2549. */
  2550. ssl->handshake->calc_verify( ssl, hash );
  2551. #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
  2552. defined(MBEDTLS_SSL_PROTO_TLS1_1)
  2553. if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
  2554. {
  2555. /*
  2556. * digitally-signed struct {
  2557. * opaque md5_hash[16];
  2558. * opaque sha_hash[20];
  2559. * };
  2560. *
  2561. * md5_hash
  2562. * MD5(handshake_messages);
  2563. *
  2564. * sha_hash
  2565. * SHA(handshake_messages);
  2566. */
  2567. hashlen = 36;
  2568. md_alg = MBEDTLS_MD_NONE;
  2569. /*
  2570. * For ECDSA, default hash is SHA-1 only
  2571. */
  2572. if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
  2573. {
  2574. hash_start += 16;
  2575. hashlen -= 16;
  2576. md_alg = MBEDTLS_MD_SHA1;
  2577. }
  2578. }
  2579. else
  2580. #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
  2581. MBEDTLS_SSL_PROTO_TLS1_1 */
  2582. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  2583. if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
  2584. {
  2585. /*
  2586. * digitally-signed struct {
  2587. * opaque handshake_messages[handshake_messages_length];
  2588. * };
  2589. *
  2590. * Taking shortcut here. We assume that the server always allows the
  2591. * PRF Hash function and has sent it in the allowed signature
  2592. * algorithms list received in the Certificate Request message.
  2593. *
  2594. * Until we encounter a server that does not, we will take this
  2595. * shortcut.
  2596. *
  2597. * Reason: Otherwise we should have running hashes for SHA512 and SHA224
  2598. * in order to satisfy 'weird' needs from the server side.
  2599. */
  2600. if( ssl->transform_negotiate->ciphersuite_info->mac ==
  2601. MBEDTLS_MD_SHA384 )
  2602. {
  2603. md_alg = MBEDTLS_MD_SHA384;
  2604. ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
  2605. }
  2606. else
  2607. {
  2608. md_alg = MBEDTLS_MD_SHA256;
  2609. ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
  2610. }
  2611. ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
  2612. /* Info from md_alg will be used instead */
  2613. hashlen = 0;
  2614. offset = 2;
  2615. }
  2616. else
  2617. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  2618. {
  2619. MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
  2620. return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
  2621. }
  2622. if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,
  2623. ssl->out_msg + 6 + offset, &n,
  2624. ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
  2625. {
  2626. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
  2627. return( ret );
  2628. }
  2629. ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
  2630. ssl->out_msg[5 + offset] = (unsigned char)( n );
  2631. ssl->out_msglen = 6 + n + offset;
  2632. ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
  2633. ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
  2634. ssl->state++;
  2635. if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )
  2636. {
  2637. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
  2638. return( ret );
  2639. }
  2640. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
  2641. return( ret );
  2642. }
  2643. #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&
  2644. !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&
  2645. !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&
  2646. !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
  2647. !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&
  2648. !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
  2649. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  2650. static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
  2651. {
  2652. int ret;
  2653. uint32_t lifetime;
  2654. size_t ticket_len;
  2655. unsigned char *ticket;
  2656. const unsigned char *msg;
  2657. MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
  2658. if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )
  2659. {
  2660. MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
  2661. return( ret );
  2662. }
  2663. if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
  2664. {
  2665. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  2666. return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
  2667. }
  2668. /*
  2669. * struct {
  2670. * uint32 ticket_lifetime_hint;
  2671. * opaque ticket<0..2^16-1>;
  2672. * } NewSessionTicket;
  2673. *
  2674. * 0 . 3 ticket_lifetime_hint
  2675. * 4 . 5 ticket_len (n)
  2676. * 6 . 5+n ticket content
  2677. */
  2678. if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
  2679. ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
  2680. {
  2681. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  2682. return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
  2683. }
  2684. msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
  2685. lifetime = ( msg[0] << 24 ) | ( msg[1] << 16 ) |
  2686. ( msg[2] << 8 ) | ( msg[3] );
  2687. ticket_len = ( msg[4] << 8 ) | ( msg[5] );
  2688. if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
  2689. {
  2690. MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
  2691. return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
  2692. }
  2693. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
  2694. /* We're not waiting for a NewSessionTicket message any more */
  2695. ssl->handshake->new_session_ticket = 0;
  2696. ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
  2697. /*
  2698. * Zero-length ticket means the server changed his mind and doesn't want
  2699. * to send a ticket after all, so just forget it
  2700. */
  2701. if( ticket_len == 0 )
  2702. return( 0 );
  2703. mbedtls_zeroize( ssl->session_negotiate->ticket,
  2704. ssl->session_negotiate->ticket_len );
  2705. mbedtls_free( ssl->session_negotiate->ticket );
  2706. ssl->session_negotiate->ticket = NULL;
  2707. ssl->session_negotiate->ticket_len = 0;
  2708. if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
  2709. {
  2710. MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
  2711. return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
  2712. }
  2713. memcpy( ticket, msg + 6, ticket_len );
  2714. ssl->session_negotiate->ticket = ticket;
  2715. ssl->session_negotiate->ticket_len = ticket_len;
  2716. ssl->session_negotiate->ticket_lifetime = lifetime;
  2717. /*
  2718. * RFC 5077 section 3.4:
  2719. * "If the client receives a session ticket from the server, then it
  2720. * discards any Session ID that was sent in the ServerHello."
  2721. */
  2722. MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
  2723. ssl->session_negotiate->id_len = 0;
  2724. MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
  2725. return( 0 );
  2726. }
  2727. #endif /* MBEDTLS_SSL_SESSION_TICKETS */
  2728. /*
  2729. * SSL handshake -- client side -- single step
  2730. */
  2731. int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
  2732. {
  2733. int ret = 0;
  2734. if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
  2735. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  2736. MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
  2737. if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
  2738. return( ret );
  2739. #if defined(MBEDTLS_SSL_PROTO_DTLS)
  2740. if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
  2741. ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
  2742. {
  2743. if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
  2744. return( ret );
  2745. }
  2746. #endif
  2747. /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
  2748. * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
  2749. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  2750. if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
  2751. ssl->handshake->new_session_ticket != 0 )
  2752. {
  2753. ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
  2754. }
  2755. #endif
  2756. switch( ssl->state )
  2757. {
  2758. case MBEDTLS_SSL_HELLO_REQUEST:
  2759. ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
  2760. break;
  2761. /*
  2762. * ==> ClientHello
  2763. */
  2764. case MBEDTLS_SSL_CLIENT_HELLO:
  2765. ret = ssl_write_client_hello( ssl );
  2766. break;
  2767. /*
  2768. * <== ServerHello
  2769. * Certificate
  2770. * ( ServerKeyExchange )
  2771. * ( CertificateRequest )
  2772. * ServerHelloDone
  2773. */
  2774. case MBEDTLS_SSL_SERVER_HELLO:
  2775. ret = ssl_parse_server_hello( ssl );
  2776. break;
  2777. case MBEDTLS_SSL_SERVER_CERTIFICATE:
  2778. ret = mbedtls_ssl_parse_certificate( ssl );
  2779. break;
  2780. case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
  2781. ret = ssl_parse_server_key_exchange( ssl );
  2782. break;
  2783. case MBEDTLS_SSL_CERTIFICATE_REQUEST:
  2784. ret = ssl_parse_certificate_request( ssl );
  2785. break;
  2786. case MBEDTLS_SSL_SERVER_HELLO_DONE:
  2787. ret = ssl_parse_server_hello_done( ssl );
  2788. break;
  2789. /*
  2790. * ==> ( Certificate/Alert )
  2791. * ClientKeyExchange
  2792. * ( CertificateVerify )
  2793. * ChangeCipherSpec
  2794. * Finished
  2795. */
  2796. case MBEDTLS_SSL_CLIENT_CERTIFICATE:
  2797. ret = mbedtls_ssl_write_certificate( ssl );
  2798. break;
  2799. case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
  2800. ret = ssl_write_client_key_exchange( ssl );
  2801. break;
  2802. case MBEDTLS_SSL_CERTIFICATE_VERIFY:
  2803. ret = ssl_write_certificate_verify( ssl );
  2804. break;
  2805. case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
  2806. ret = mbedtls_ssl_write_change_cipher_spec( ssl );
  2807. break;
  2808. case MBEDTLS_SSL_CLIENT_FINISHED:
  2809. ret = mbedtls_ssl_write_finished( ssl );
  2810. break;
  2811. /*
  2812. * <== ( NewSessionTicket )
  2813. * ChangeCipherSpec
  2814. * Finished
  2815. */
  2816. #if defined(MBEDTLS_SSL_SESSION_TICKETS)
  2817. case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
  2818. ret = ssl_parse_new_session_ticket( ssl );
  2819. break;
  2820. #endif
  2821. case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
  2822. ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
  2823. break;
  2824. case MBEDTLS_SSL_SERVER_FINISHED:
  2825. ret = mbedtls_ssl_parse_finished( ssl );
  2826. break;
  2827. case MBEDTLS_SSL_FLUSH_BUFFERS:
  2828. MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
  2829. ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
  2830. break;
  2831. case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
  2832. mbedtls_ssl_handshake_wrapup( ssl );
  2833. break;
  2834. default:
  2835. MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
  2836. return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
  2837. }
  2838. return( ret );
  2839. }
  2840. #endif /* MBEDTLS_SSL_CLI_C */