test_suite_ssl.function 129 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548
  1. /* BEGIN_HEADER */
  2. #include <ssl_misc.h>
  3. #include <mbedtls/timing.h>
  4. #include <mbedtls/debug.h>
  5. #include <mbedtls/pk.h>
  6. #include <ssl_tls13_keys.h>
  7. #include <ssl_tls13_invasive.h>
  8. #include <test/ssl_helpers.h>
  9. #include <mbedtls/legacy_or_psa.h>
  10. #include "hash_info.h"
  11. #include <constant_time_internal.h>
  12. #include <test/constant_flow.h>
  13. /* END_HEADER */
  14. /* BEGIN_DEPENDENCIES
  15. * depends_on:MBEDTLS_SSL_TLS_C
  16. * END_DEPENDENCIES
  17. */
  18. /* BEGIN_CASE */
  19. void test_callback_buffer_sanity()
  20. {
  21. enum { MSGLEN = 10 };
  22. mbedtls_test_ssl_buffer buf;
  23. unsigned char input[MSGLEN];
  24. unsigned char output[MSGLEN];
  25. memset(input, 0, sizeof(input));
  26. /* Make sure calling put and get on NULL buffer results in error. */
  27. TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, input, sizeof(input))
  28. == -1);
  29. TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, output, sizeof(output))
  30. == -1);
  31. TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, sizeof(input))
  32. == -1);
  33. TEST_ASSERT(mbedtls_test_ssl_buffer_put(NULL, NULL, 0) == -1);
  34. TEST_ASSERT(mbedtls_test_ssl_buffer_get(NULL, NULL, 0) == -1);
  35. /* Make sure calling put and get on a buffer that hasn't been set up results
  36. * in error. */
  37. mbedtls_test_ssl_buffer_init(&buf);
  38. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
  39. == -1);
  40. TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, sizeof(output))
  41. == -1);
  42. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
  43. == -1);
  44. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == -1);
  45. TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == -1);
  46. /* Make sure calling put and get on NULL input only results in
  47. * error if the length is not zero, and that a NULL output is valid for data
  48. * dropping.
  49. */
  50. TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, sizeof(input)) == 0);
  51. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, sizeof(input))
  52. == -1);
  53. TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, sizeof(output))
  54. == 0);
  55. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, NULL, 0) == 0);
  56. TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, NULL, 0) == 0);
  57. /* Make sure calling put several times in the row is safe */
  58. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, sizeof(input))
  59. == sizeof(input));
  60. TEST_ASSERT(mbedtls_test_ssl_buffer_get(&buf, output, 2) == 2);
  61. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 1) == 1);
  62. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 1);
  63. TEST_ASSERT(mbedtls_test_ssl_buffer_put(&buf, input, 2) == 0);
  64. exit:
  65. mbedtls_test_ssl_buffer_free(&buf);
  66. }
  67. /* END_CASE */
  68. /*
  69. * Test if the implementation of `mbedtls_test_ssl_buffer` related functions is
  70. * correct and works as expected.
  71. *
  72. * That is
  73. * - If we try to put in \p put1 bytes then we can put in \p put1_ret bytes.
  74. * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
  75. * - Next, if we try to put in \p put1 bytes then we can put in \p put1_ret
  76. * bytes.
  77. * - Afterwards if we try to get \p get1 bytes then we can get \get1_ret bytes.
  78. * - All of the bytes we got match the bytes we put in in a FIFO manner.
  79. */
  80. /* BEGIN_CASE */
  81. void test_callback_buffer(int size, int put1, int put1_ret,
  82. int get1, int get1_ret, int put2, int put2_ret,
  83. int get2, int get2_ret)
  84. {
  85. enum { ROUNDS = 2 };
  86. size_t put[ROUNDS];
  87. int put_ret[ROUNDS];
  88. size_t get[ROUNDS];
  89. int get_ret[ROUNDS];
  90. mbedtls_test_ssl_buffer buf;
  91. unsigned char *input = NULL;
  92. size_t input_len;
  93. unsigned char *output = NULL;
  94. size_t output_len;
  95. size_t i, j, written, read;
  96. mbedtls_test_ssl_buffer_init(&buf);
  97. TEST_ASSERT(mbedtls_test_ssl_buffer_setup(&buf, size) == 0);
  98. /* Check the sanity of input parameters and initialise local variables. That
  99. * is, ensure that the amount of data is not negative and that we are not
  100. * expecting more to put or get than we actually asked for. */
  101. TEST_ASSERT(put1 >= 0);
  102. put[0] = put1;
  103. put_ret[0] = put1_ret;
  104. TEST_ASSERT(put1_ret <= put1);
  105. TEST_ASSERT(put2 >= 0);
  106. put[1] = put2;
  107. put_ret[1] = put2_ret;
  108. TEST_ASSERT(put2_ret <= put2);
  109. TEST_ASSERT(get1 >= 0);
  110. get[0] = get1;
  111. get_ret[0] = get1_ret;
  112. TEST_ASSERT(get1_ret <= get1);
  113. TEST_ASSERT(get2 >= 0);
  114. get[1] = get2;
  115. get_ret[1] = get2_ret;
  116. TEST_ASSERT(get2_ret <= get2);
  117. input_len = 0;
  118. /* Calculate actual input and output lengths */
  119. for (j = 0; j < ROUNDS; j++) {
  120. if (put_ret[j] > 0) {
  121. input_len += put_ret[j];
  122. }
  123. }
  124. /* In order to always have a valid pointer we always allocate at least 1
  125. * byte. */
  126. if (input_len == 0) {
  127. input_len = 1;
  128. }
  129. ASSERT_ALLOC(input, input_len);
  130. output_len = 0;
  131. for (j = 0; j < ROUNDS; j++) {
  132. if (get_ret[j] > 0) {
  133. output_len += get_ret[j];
  134. }
  135. }
  136. TEST_ASSERT(output_len <= input_len);
  137. /* In order to always have a valid pointer we always allocate at least 1
  138. * byte. */
  139. if (output_len == 0) {
  140. output_len = 1;
  141. }
  142. ASSERT_ALLOC(output, output_len);
  143. /* Fill up the buffer with structured data so that unwanted changes
  144. * can be detected */
  145. for (i = 0; i < input_len; i++) {
  146. input[i] = i & 0xFF;
  147. }
  148. written = read = 0;
  149. for (j = 0; j < ROUNDS; j++) {
  150. TEST_ASSERT(put_ret[j] == mbedtls_test_ssl_buffer_put(&buf,
  151. input + written, put[j]));
  152. written += put_ret[j];
  153. TEST_ASSERT(get_ret[j] == mbedtls_test_ssl_buffer_get(&buf,
  154. output + read, get[j]));
  155. read += get_ret[j];
  156. TEST_ASSERT(read <= written);
  157. if (get_ret[j] > 0) {
  158. TEST_ASSERT(memcmp(output + read - get_ret[j],
  159. input + read - get_ret[j], get_ret[j])
  160. == 0);
  161. }
  162. }
  163. exit:
  164. mbedtls_free(input);
  165. mbedtls_free(output);
  166. mbedtls_test_ssl_buffer_free(&buf);
  167. }
  168. /* END_CASE */
  169. /*
  170. * Test if the implementation of `mbedtls_test_mock_socket` related
  171. * I/O functions is correct and works as expected on unconnected sockets.
  172. */
  173. /* BEGIN_CASE */
  174. void ssl_mock_sanity()
  175. {
  176. enum { MSGLEN = 105 };
  177. unsigned char message[MSGLEN] = { 0 };
  178. unsigned char received[MSGLEN] = { 0 };
  179. mbedtls_test_mock_socket socket;
  180. mbedtls_mock_socket_init(&socket);
  181. TEST_ASSERT(mbedtls_test_mock_tcp_send_b(&socket, message, MSGLEN) < 0);
  182. mbedtls_test_mock_socket_close(&socket);
  183. mbedtls_mock_socket_init(&socket);
  184. TEST_ASSERT(mbedtls_test_mock_tcp_recv_b(&socket, received, MSGLEN) < 0);
  185. mbedtls_test_mock_socket_close(&socket);
  186. mbedtls_mock_socket_init(&socket);
  187. TEST_ASSERT(mbedtls_test_mock_tcp_send_nb(&socket, message, MSGLEN) < 0);
  188. mbedtls_test_mock_socket_close(&socket);
  189. mbedtls_mock_socket_init(&socket);
  190. TEST_ASSERT(mbedtls_test_mock_tcp_recv_nb(&socket, received, MSGLEN) < 0);
  191. mbedtls_test_mock_socket_close(&socket);
  192. exit:
  193. mbedtls_test_mock_socket_close(&socket);
  194. }
  195. /* END_CASE */
  196. /*
  197. * Test if the implementation of `mbedtls_test_mock_socket` related functions
  198. * can send a single message from the client to the server.
  199. */
  200. /* BEGIN_CASE */
  201. void ssl_mock_tcp(int blocking)
  202. {
  203. enum { MSGLEN = 105 };
  204. enum { BUFLEN = MSGLEN / 5 };
  205. unsigned char message[MSGLEN];
  206. unsigned char received[MSGLEN];
  207. mbedtls_test_mock_socket client;
  208. mbedtls_test_mock_socket server;
  209. size_t written, read;
  210. int send_ret, recv_ret;
  211. mbedtls_ssl_send_t *send;
  212. mbedtls_ssl_recv_t *recv;
  213. unsigned i;
  214. if (blocking == 0) {
  215. send = mbedtls_test_mock_tcp_send_nb;
  216. recv = mbedtls_test_mock_tcp_recv_nb;
  217. } else {
  218. send = mbedtls_test_mock_tcp_send_b;
  219. recv = mbedtls_test_mock_tcp_recv_b;
  220. }
  221. mbedtls_mock_socket_init(&client);
  222. mbedtls_mock_socket_init(&server);
  223. /* Fill up the buffer with structured data so that unwanted changes
  224. * can be detected */
  225. for (i = 0; i < MSGLEN; i++) {
  226. message[i] = i & 0xFF;
  227. }
  228. /* Make sure that sending a message takes a few iterations. */
  229. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  230. BUFLEN));
  231. /* Send the message to the server */
  232. send_ret = recv_ret = 1;
  233. written = read = 0;
  234. while (send_ret != 0 || recv_ret != 0) {
  235. send_ret = send(&client, message + written, MSGLEN - written);
  236. TEST_ASSERT(send_ret >= 0);
  237. TEST_ASSERT(send_ret <= BUFLEN);
  238. written += send_ret;
  239. /* If the buffer is full we can test blocking and non-blocking send */
  240. if (send_ret == BUFLEN) {
  241. int blocking_ret = send(&client, message, 1);
  242. if (blocking) {
  243. TEST_ASSERT(blocking_ret == 0);
  244. } else {
  245. TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
  246. }
  247. }
  248. recv_ret = recv(&server, received + read, MSGLEN - read);
  249. /* The result depends on whether any data was sent */
  250. if (send_ret > 0) {
  251. TEST_ASSERT(recv_ret > 0);
  252. TEST_ASSERT(recv_ret <= BUFLEN);
  253. read += recv_ret;
  254. } else if (blocking) {
  255. TEST_ASSERT(recv_ret == 0);
  256. } else {
  257. TEST_ASSERT(recv_ret == MBEDTLS_ERR_SSL_WANT_READ);
  258. recv_ret = 0;
  259. }
  260. /* If the buffer is empty we can test blocking and non-blocking read */
  261. if (recv_ret == BUFLEN) {
  262. int blocking_ret = recv(&server, received, 1);
  263. if (blocking) {
  264. TEST_ASSERT(blocking_ret == 0);
  265. } else {
  266. TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
  267. }
  268. }
  269. }
  270. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  271. exit:
  272. mbedtls_test_mock_socket_close(&client);
  273. mbedtls_test_mock_socket_close(&server);
  274. }
  275. /* END_CASE */
  276. /*
  277. * Test if the implementation of `mbedtls_test_mock_socket` related functions
  278. * can send messages in both direction at the same time (with the I/O calls
  279. * interleaving).
  280. */
  281. /* BEGIN_CASE */
  282. void ssl_mock_tcp_interleaving(int blocking)
  283. {
  284. enum { ROUNDS = 2 };
  285. enum { MSGLEN = 105 };
  286. enum { BUFLEN = MSGLEN / 5 };
  287. unsigned char message[ROUNDS][MSGLEN];
  288. unsigned char received[ROUNDS][MSGLEN];
  289. mbedtls_test_mock_socket client;
  290. mbedtls_test_mock_socket server;
  291. size_t written[ROUNDS];
  292. size_t read[ROUNDS];
  293. int send_ret[ROUNDS];
  294. int recv_ret[ROUNDS];
  295. unsigned i, j, progress;
  296. mbedtls_ssl_send_t *send;
  297. mbedtls_ssl_recv_t *recv;
  298. if (blocking == 0) {
  299. send = mbedtls_test_mock_tcp_send_nb;
  300. recv = mbedtls_test_mock_tcp_recv_nb;
  301. } else {
  302. send = mbedtls_test_mock_tcp_send_b;
  303. recv = mbedtls_test_mock_tcp_recv_b;
  304. }
  305. mbedtls_mock_socket_init(&client);
  306. mbedtls_mock_socket_init(&server);
  307. /* Fill up the buffers with structured data so that unwanted changes
  308. * can be detected */
  309. for (i = 0; i < ROUNDS; i++) {
  310. for (j = 0; j < MSGLEN; j++) {
  311. message[i][j] = (i * MSGLEN + j) & 0xFF;
  312. }
  313. }
  314. /* Make sure that sending a message takes a few iterations. */
  315. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  316. BUFLEN));
  317. /* Send the message from both sides, interleaving. */
  318. progress = 1;
  319. for (i = 0; i < ROUNDS; i++) {
  320. written[i] = 0;
  321. read[i] = 0;
  322. }
  323. /* This loop does not stop as long as there was a successful write or read
  324. * of at least one byte on either side. */
  325. while (progress != 0) {
  326. mbedtls_test_mock_socket *socket;
  327. for (i = 0; i < ROUNDS; i++) {
  328. /* First sending is from the client */
  329. socket = (i % 2 == 0) ? (&client) : (&server);
  330. send_ret[i] = send(socket, message[i] + written[i],
  331. MSGLEN - written[i]);
  332. TEST_ASSERT(send_ret[i] >= 0);
  333. TEST_ASSERT(send_ret[i] <= BUFLEN);
  334. written[i] += send_ret[i];
  335. /* If the buffer is full we can test blocking and non-blocking
  336. * send */
  337. if (send_ret[i] == BUFLEN) {
  338. int blocking_ret = send(socket, message[i], 1);
  339. if (blocking) {
  340. TEST_ASSERT(blocking_ret == 0);
  341. } else {
  342. TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_WRITE);
  343. }
  344. }
  345. }
  346. for (i = 0; i < ROUNDS; i++) {
  347. /* First receiving is from the server */
  348. socket = (i % 2 == 0) ? (&server) : (&client);
  349. recv_ret[i] = recv(socket, received[i] + read[i],
  350. MSGLEN - read[i]);
  351. /* The result depends on whether any data was sent */
  352. if (send_ret[i] > 0) {
  353. TEST_ASSERT(recv_ret[i] > 0);
  354. TEST_ASSERT(recv_ret[i] <= BUFLEN);
  355. read[i] += recv_ret[i];
  356. } else if (blocking) {
  357. TEST_ASSERT(recv_ret[i] == 0);
  358. } else {
  359. TEST_ASSERT(recv_ret[i] == MBEDTLS_ERR_SSL_WANT_READ);
  360. recv_ret[i] = 0;
  361. }
  362. /* If the buffer is empty we can test blocking and non-blocking
  363. * read */
  364. if (recv_ret[i] == BUFLEN) {
  365. int blocking_ret = recv(socket, received[i], 1);
  366. if (blocking) {
  367. TEST_ASSERT(blocking_ret == 0);
  368. } else {
  369. TEST_ASSERT(blocking_ret == MBEDTLS_ERR_SSL_WANT_READ);
  370. }
  371. }
  372. }
  373. progress = 0;
  374. for (i = 0; i < ROUNDS; i++) {
  375. progress += send_ret[i] + recv_ret[i];
  376. }
  377. }
  378. for (i = 0; i < ROUNDS; i++) {
  379. TEST_ASSERT(memcmp(message[i], received[i], MSGLEN) == 0);
  380. }
  381. exit:
  382. mbedtls_test_mock_socket_close(&client);
  383. mbedtls_test_mock_socket_close(&server);
  384. }
  385. /* END_CASE */
  386. /* BEGIN_CASE */
  387. void ssl_message_queue_sanity()
  388. {
  389. mbedtls_test_ssl_message_queue queue;
  390. /* Trying to push/pull to an empty queue */
  391. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(NULL, 1)
  392. == MBEDTLS_TEST_ERROR_ARG_NULL);
  393. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(NULL, 1)
  394. == MBEDTLS_TEST_ERROR_ARG_NULL);
  395. TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
  396. TEST_ASSERT(queue.capacity == 3);
  397. TEST_ASSERT(queue.num == 0);
  398. exit:
  399. mbedtls_test_ssl_message_queue_free(&queue);
  400. }
  401. /* END_CASE */
  402. /* BEGIN_CASE */
  403. void ssl_message_queue_basic()
  404. {
  405. mbedtls_test_ssl_message_queue queue;
  406. TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
  407. /* Sanity test - 3 pushes and 3 pops with sufficient space */
  408. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  409. TEST_ASSERT(queue.capacity == 3);
  410. TEST_ASSERT(queue.num == 1);
  411. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  412. TEST_ASSERT(queue.capacity == 3);
  413. TEST_ASSERT(queue.num == 2);
  414. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
  415. TEST_ASSERT(queue.capacity == 3);
  416. TEST_ASSERT(queue.num == 3);
  417. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  418. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  419. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
  420. exit:
  421. mbedtls_test_ssl_message_queue_free(&queue);
  422. }
  423. /* END_CASE */
  424. /* BEGIN_CASE */
  425. void ssl_message_queue_overflow_underflow()
  426. {
  427. mbedtls_test_ssl_message_queue queue;
  428. TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
  429. /* 4 pushes (last one with an error), 4 pops (last one with an error) */
  430. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  431. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  432. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
  433. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3)
  434. == MBEDTLS_ERR_SSL_WANT_WRITE);
  435. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  436. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  437. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
  438. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1)
  439. == MBEDTLS_ERR_SSL_WANT_READ);
  440. exit:
  441. mbedtls_test_ssl_message_queue_free(&queue);
  442. }
  443. /* END_CASE */
  444. /* BEGIN_CASE */
  445. void ssl_message_queue_interleaved()
  446. {
  447. mbedtls_test_ssl_message_queue queue;
  448. TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 3) == 0);
  449. /* Interleaved test - [2 pushes, 1 pop] twice, and then two pops
  450. * (to wrap around the buffer) */
  451. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  452. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 1) == 1);
  453. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  454. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 2) == 2);
  455. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 3) == 3);
  456. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 1) == 1);
  457. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 2) == 2);
  458. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 5) == 5);
  459. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, 8) == 8);
  460. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 3) == 3);
  461. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 5) == 5);
  462. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, 8) == 8);
  463. exit:
  464. mbedtls_test_ssl_message_queue_free(&queue);
  465. }
  466. /* END_CASE */
  467. /* BEGIN_CASE */
  468. void ssl_message_queue_insufficient_buffer()
  469. {
  470. mbedtls_test_ssl_message_queue queue;
  471. size_t message_len = 10;
  472. size_t buffer_len = 5;
  473. TEST_ASSERT(mbedtls_test_ssl_message_queue_setup(&queue, 1) == 0);
  474. /* Popping without a sufficient buffer */
  475. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&queue, message_len)
  476. == (int) message_len);
  477. TEST_ASSERT(mbedtls_test_ssl_message_queue_pop_info(&queue, buffer_len)
  478. == (int) buffer_len);
  479. exit:
  480. mbedtls_test_ssl_message_queue_free(&queue);
  481. }
  482. /* END_CASE */
  483. /* BEGIN_CASE */
  484. void ssl_message_mock_uninitialized()
  485. {
  486. enum { MSGLEN = 10 };
  487. unsigned char message[MSGLEN] = { 0 }, received[MSGLEN];
  488. mbedtls_test_mock_socket client, server;
  489. mbedtls_test_ssl_message_queue server_queue, client_queue;
  490. mbedtls_test_message_socket_context server_context, client_context;
  491. mbedtls_test_message_socket_init(&server_context);
  492. mbedtls_test_message_socket_init(&client_context);
  493. /* Send with a NULL context */
  494. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(NULL, message, MSGLEN)
  495. == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
  496. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(NULL, message, MSGLEN)
  497. == MBEDTLS_TEST_ERROR_CONTEXT_ERROR);
  498. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  499. &client_queue, 1,
  500. &server,
  501. &server_context) == 0);
  502. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  503. &server_queue, 1,
  504. &client,
  505. &client_context) == 0);
  506. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  507. MSGLEN)
  508. == MBEDTLS_TEST_ERROR_SEND_FAILED);
  509. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  510. MSGLEN)
  511. == MBEDTLS_ERR_SSL_WANT_READ);
  512. /* Push directly to a queue to later simulate a disconnected behavior */
  513. TEST_ASSERT(mbedtls_test_ssl_message_queue_push_info(&server_queue,
  514. MSGLEN)
  515. == MSGLEN);
  516. /* Test if there's an error when trying to read from a disconnected
  517. * socket */
  518. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  519. MSGLEN)
  520. == MBEDTLS_TEST_ERROR_RECV_FAILED);
  521. exit:
  522. mbedtls_test_message_socket_close(&server_context);
  523. mbedtls_test_message_socket_close(&client_context);
  524. }
  525. /* END_CASE */
  526. /* BEGIN_CASE */
  527. void ssl_message_mock_basic()
  528. {
  529. enum { MSGLEN = 10 };
  530. unsigned char message[MSGLEN], received[MSGLEN];
  531. mbedtls_test_mock_socket client, server;
  532. unsigned i;
  533. mbedtls_test_ssl_message_queue server_queue, client_queue;
  534. mbedtls_test_message_socket_context server_context, client_context;
  535. mbedtls_test_message_socket_init(&server_context);
  536. mbedtls_test_message_socket_init(&client_context);
  537. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  538. &client_queue, 1,
  539. &server,
  540. &server_context) == 0);
  541. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  542. &server_queue, 1,
  543. &client,
  544. &client_context) == 0);
  545. /* Fill up the buffer with structured data so that unwanted changes
  546. * can be detected */
  547. for (i = 0; i < MSGLEN; i++) {
  548. message[i] = i & 0xFF;
  549. }
  550. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  551. MSGLEN));
  552. /* Send the message to the server */
  553. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  554. MSGLEN) == MSGLEN);
  555. /* Read from the server */
  556. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  557. MSGLEN)
  558. == MSGLEN);
  559. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  560. memset(received, 0, MSGLEN);
  561. /* Send the message to the client */
  562. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
  563. MSGLEN)
  564. == MSGLEN);
  565. /* Read from the client */
  566. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
  567. MSGLEN)
  568. == MSGLEN);
  569. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  570. exit:
  571. mbedtls_test_message_socket_close(&server_context);
  572. mbedtls_test_message_socket_close(&client_context);
  573. }
  574. /* END_CASE */
  575. /* BEGIN_CASE */
  576. void ssl_message_mock_queue_overflow_underflow()
  577. {
  578. enum { MSGLEN = 10 };
  579. unsigned char message[MSGLEN], received[MSGLEN];
  580. mbedtls_test_mock_socket client, server;
  581. unsigned i;
  582. mbedtls_test_ssl_message_queue server_queue, client_queue;
  583. mbedtls_test_message_socket_context server_context, client_context;
  584. mbedtls_test_message_socket_init(&server_context);
  585. mbedtls_test_message_socket_init(&client_context);
  586. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  587. &client_queue, 2,
  588. &server,
  589. &server_context) == 0);
  590. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  591. &server_queue, 2,
  592. &client,
  593. &client_context) == 0);
  594. /* Fill up the buffer with structured data so that unwanted changes
  595. * can be detected */
  596. for (i = 0; i < MSGLEN; i++) {
  597. message[i] = i & 0xFF;
  598. }
  599. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  600. MSGLEN*2));
  601. /* Send three message to the server, last one with an error */
  602. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  603. MSGLEN - 1)
  604. == MSGLEN - 1);
  605. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  606. MSGLEN)
  607. == MSGLEN);
  608. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  609. MSGLEN)
  610. == MBEDTLS_ERR_SSL_WANT_WRITE);
  611. /* Read three messages from the server, last one with an error */
  612. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  613. MSGLEN - 1)
  614. == MSGLEN - 1);
  615. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  616. MSGLEN)
  617. == MSGLEN);
  618. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  619. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  620. MSGLEN)
  621. == MBEDTLS_ERR_SSL_WANT_READ);
  622. exit:
  623. mbedtls_test_message_socket_close(&server_context);
  624. mbedtls_test_message_socket_close(&client_context);
  625. }
  626. /* END_CASE */
  627. /* BEGIN_CASE */
  628. void ssl_message_mock_socket_overflow()
  629. {
  630. enum { MSGLEN = 10 };
  631. unsigned char message[MSGLEN], received[MSGLEN];
  632. mbedtls_test_mock_socket client, server;
  633. unsigned i;
  634. mbedtls_test_ssl_message_queue server_queue, client_queue;
  635. mbedtls_test_message_socket_context server_context, client_context;
  636. mbedtls_test_message_socket_init(&server_context);
  637. mbedtls_test_message_socket_init(&client_context);
  638. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  639. &client_queue, 2,
  640. &server,
  641. &server_context) == 0);
  642. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  643. &server_queue, 2,
  644. &client,
  645. &client_context) == 0);
  646. /* Fill up the buffer with structured data so that unwanted changes
  647. * can be detected */
  648. for (i = 0; i < MSGLEN; i++) {
  649. message[i] = i & 0xFF;
  650. }
  651. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  652. MSGLEN));
  653. /* Send two message to the server, second one with an error */
  654. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  655. MSGLEN)
  656. == MSGLEN);
  657. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  658. MSGLEN)
  659. == MBEDTLS_TEST_ERROR_SEND_FAILED);
  660. /* Read the only message from the server */
  661. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  662. MSGLEN)
  663. == MSGLEN);
  664. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  665. exit:
  666. mbedtls_test_message_socket_close(&server_context);
  667. mbedtls_test_message_socket_close(&client_context);
  668. }
  669. /* END_CASE */
  670. /* BEGIN_CASE */
  671. void ssl_message_mock_truncated()
  672. {
  673. enum { MSGLEN = 10 };
  674. unsigned char message[MSGLEN], received[MSGLEN];
  675. mbedtls_test_mock_socket client, server;
  676. unsigned i;
  677. mbedtls_test_ssl_message_queue server_queue, client_queue;
  678. mbedtls_test_message_socket_context server_context, client_context;
  679. mbedtls_test_message_socket_init(&server_context);
  680. mbedtls_test_message_socket_init(&client_context);
  681. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  682. &client_queue, 2,
  683. &server,
  684. &server_context) == 0);
  685. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  686. &server_queue, 2,
  687. &client,
  688. &client_context) == 0);
  689. memset(received, 0, MSGLEN);
  690. /* Fill up the buffer with structured data so that unwanted changes
  691. * can be detected */
  692. for (i = 0; i < MSGLEN; i++) {
  693. message[i] = i & 0xFF;
  694. }
  695. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  696. 2 * MSGLEN));
  697. /* Send two messages to the server, the second one small enough to fit in the
  698. * receiver's buffer. */
  699. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  700. MSGLEN)
  701. == MSGLEN);
  702. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  703. MSGLEN / 2)
  704. == MSGLEN / 2);
  705. /* Read a truncated message from the server */
  706. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  707. MSGLEN/2)
  708. == MSGLEN/2);
  709. /* Test that the first half of the message is valid, and second one isn't */
  710. TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
  711. TEST_ASSERT(memcmp(message + MSGLEN/2, received + MSGLEN/2, MSGLEN/2)
  712. != 0);
  713. memset(received, 0, MSGLEN);
  714. /* Read a full message from the server */
  715. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  716. MSGLEN/2)
  717. == MSGLEN / 2);
  718. /* Test that the first half of the message is valid */
  719. TEST_ASSERT(memcmp(message, received, MSGLEN/2) == 0);
  720. exit:
  721. mbedtls_test_message_socket_close(&server_context);
  722. mbedtls_test_message_socket_close(&client_context);
  723. }
  724. /* END_CASE */
  725. /* BEGIN_CASE */
  726. void ssl_message_mock_socket_read_error()
  727. {
  728. enum { MSGLEN = 10 };
  729. unsigned char message[MSGLEN], received[MSGLEN];
  730. mbedtls_test_mock_socket client, server;
  731. unsigned i;
  732. mbedtls_test_ssl_message_queue server_queue, client_queue;
  733. mbedtls_test_message_socket_context server_context, client_context;
  734. mbedtls_test_message_socket_init(&server_context);
  735. mbedtls_test_message_socket_init(&client_context);
  736. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  737. &client_queue, 1,
  738. &server,
  739. &server_context) == 0);
  740. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  741. &server_queue, 1,
  742. &client,
  743. &client_context) == 0);
  744. /* Fill up the buffer with structured data so that unwanted changes
  745. * can be detected */
  746. for (i = 0; i < MSGLEN; i++) {
  747. message[i] = i & 0xFF;
  748. }
  749. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  750. MSGLEN));
  751. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  752. MSGLEN)
  753. == MSGLEN);
  754. /* Force a read error by disconnecting the socket by hand */
  755. server.status = 0;
  756. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  757. MSGLEN)
  758. == MBEDTLS_TEST_ERROR_RECV_FAILED);
  759. /* Return to a valid state */
  760. server.status = MBEDTLS_MOCK_SOCKET_CONNECTED;
  761. memset(received, 0, sizeof(received));
  762. /* Test that even though the server tried to read once disconnected, the
  763. * continuity is preserved */
  764. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  765. MSGLEN)
  766. == MSGLEN);
  767. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  768. exit:
  769. mbedtls_test_message_socket_close(&server_context);
  770. mbedtls_test_message_socket_close(&client_context);
  771. }
  772. /* END_CASE */
  773. /* BEGIN_CASE */
  774. void ssl_message_mock_interleaved_one_way()
  775. {
  776. enum { MSGLEN = 10 };
  777. unsigned char message[MSGLEN], received[MSGLEN];
  778. mbedtls_test_mock_socket client, server;
  779. unsigned i;
  780. mbedtls_test_ssl_message_queue server_queue, client_queue;
  781. mbedtls_test_message_socket_context server_context, client_context;
  782. mbedtls_test_message_socket_init(&server_context);
  783. mbedtls_test_message_socket_init(&client_context);
  784. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  785. &client_queue, 3,
  786. &server,
  787. &server_context) == 0);
  788. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  789. &server_queue, 3,
  790. &client,
  791. &client_context) == 0);
  792. /* Fill up the buffer with structured data so that unwanted changes
  793. * can be detected */
  794. for (i = 0; i < MSGLEN; i++) {
  795. message[i] = i & 0xFF;
  796. }
  797. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  798. MSGLEN*3));
  799. /* Interleaved test - [2 sends, 1 read] twice, and then two reads
  800. * (to wrap around the buffer) */
  801. for (i = 0; i < 2; i++) {
  802. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  803. MSGLEN) == MSGLEN);
  804. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  805. MSGLEN) == MSGLEN);
  806. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  807. MSGLEN) == MSGLEN);
  808. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  809. memset(received, 0, sizeof(received));
  810. }
  811. for (i = 0; i < 2; i++) {
  812. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  813. MSGLEN) == MSGLEN);
  814. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  815. }
  816. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  817. MSGLEN)
  818. == MBEDTLS_ERR_SSL_WANT_READ);
  819. exit:
  820. mbedtls_test_message_socket_close(&server_context);
  821. mbedtls_test_message_socket_close(&client_context);
  822. }
  823. /* END_CASE */
  824. /* BEGIN_CASE */
  825. void ssl_message_mock_interleaved_two_ways()
  826. {
  827. enum { MSGLEN = 10 };
  828. unsigned char message[MSGLEN], received[MSGLEN];
  829. mbedtls_test_mock_socket client, server;
  830. unsigned i;
  831. mbedtls_test_ssl_message_queue server_queue, client_queue;
  832. mbedtls_test_message_socket_context server_context, client_context;
  833. mbedtls_test_message_socket_init(&server_context);
  834. mbedtls_test_message_socket_init(&client_context);
  835. TEST_ASSERT(mbedtls_test_message_socket_setup(&server_queue,
  836. &client_queue, 3,
  837. &server,
  838. &server_context) == 0);
  839. TEST_ASSERT(mbedtls_test_message_socket_setup(&client_queue,
  840. &server_queue, 3,
  841. &client,
  842. &client_context) == 0);
  843. /* Fill up the buffer with structured data so that unwanted changes
  844. * can be detected */
  845. for (i = 0; i < MSGLEN; i++) {
  846. message[i] = i & 0xFF;
  847. }
  848. TEST_ASSERT(0 == mbedtls_test_mock_socket_connect(&client, &server,
  849. MSGLEN*3));
  850. /* Interleaved test - [2 sends, 1 read] twice, both ways, and then two reads
  851. * (to wrap around the buffer) both ways. */
  852. for (i = 0; i < 2; i++) {
  853. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  854. MSGLEN) == MSGLEN);
  855. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&client_context, message,
  856. MSGLEN) == MSGLEN);
  857. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
  858. MSGLEN) == MSGLEN);
  859. TEST_ASSERT(mbedtls_test_mock_tcp_send_msg(&server_context, message,
  860. MSGLEN) == MSGLEN);
  861. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  862. MSGLEN) == MSGLEN);
  863. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  864. memset(received, 0, sizeof(received));
  865. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
  866. MSGLEN) == MSGLEN);
  867. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  868. memset(received, 0, sizeof(received));
  869. }
  870. for (i = 0; i < 2; i++) {
  871. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  872. MSGLEN) == MSGLEN);
  873. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  874. memset(received, 0, sizeof(received));
  875. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
  876. MSGLEN) == MSGLEN);
  877. TEST_ASSERT(memcmp(message, received, MSGLEN) == 0);
  878. memset(received, 0, sizeof(received));
  879. }
  880. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&server_context, received,
  881. MSGLEN)
  882. == MBEDTLS_ERR_SSL_WANT_READ);
  883. TEST_ASSERT(mbedtls_test_mock_tcp_recv_msg(&client_context, received,
  884. MSGLEN)
  885. == MBEDTLS_ERR_SSL_WANT_READ);
  886. exit:
  887. mbedtls_test_message_socket_close(&server_context);
  888. mbedtls_test_message_socket_close(&client_context);
  889. }
  890. /* END_CASE */
  891. /* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_ANTI_REPLAY */
  892. void ssl_dtls_replay(data_t *prevs, data_t *new, int ret)
  893. {
  894. uint32_t len = 0;
  895. mbedtls_ssl_context ssl;
  896. mbedtls_ssl_config conf;
  897. mbedtls_ssl_init(&ssl);
  898. mbedtls_ssl_config_init(&conf);
  899. TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
  900. MBEDTLS_SSL_IS_CLIENT,
  901. MBEDTLS_SSL_TRANSPORT_DATAGRAM,
  902. MBEDTLS_SSL_PRESET_DEFAULT) == 0);
  903. TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
  904. /* Read previous record numbers */
  905. for (len = 0; len < prevs->len; len += 6) {
  906. memcpy(ssl.in_ctr + 2, prevs->x + len, 6);
  907. mbedtls_ssl_dtls_replay_update(&ssl);
  908. }
  909. /* Check new number */
  910. memcpy(ssl.in_ctr + 2, new->x, 6);
  911. TEST_ASSERT(mbedtls_ssl_dtls_replay_check(&ssl) == ret);
  912. mbedtls_ssl_free(&ssl);
  913. mbedtls_ssl_config_free(&conf);
  914. }
  915. /* END_CASE */
  916. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
  917. void ssl_set_hostname_twice(char *hostname0, char *hostname1)
  918. {
  919. mbedtls_ssl_context ssl;
  920. mbedtls_ssl_init(&ssl);
  921. TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname0) == 0);
  922. TEST_ASSERT(mbedtls_ssl_set_hostname(&ssl, hostname1) == 0);
  923. mbedtls_ssl_free(&ssl);
  924. }
  925. /* END_CASE */
  926. /* BEGIN_CASE */
  927. void ssl_crypt_record(int cipher_type, int hash_id,
  928. int etm, int tag_mode, int ver,
  929. int cid0_len, int cid1_len)
  930. {
  931. /*
  932. * Test several record encryptions and decryptions
  933. * with plenty of space before and after the data
  934. * within the record buffer.
  935. */
  936. int ret;
  937. int num_records = 16;
  938. mbedtls_ssl_context ssl; /* ONLY for debugging */
  939. mbedtls_ssl_transform t0, t1;
  940. unsigned char *buf = NULL;
  941. size_t const buflen = 512;
  942. mbedtls_record rec, rec_backup;
  943. USE_PSA_INIT();
  944. mbedtls_ssl_init(&ssl);
  945. mbedtls_ssl_transform_init(&t0);
  946. mbedtls_ssl_transform_init(&t1);
  947. ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
  948. etm, tag_mode, ver,
  949. (size_t) cid0_len,
  950. (size_t) cid1_len);
  951. TEST_ASSERT(ret == 0);
  952. TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
  953. while (num_records-- > 0) {
  954. mbedtls_ssl_transform *t_dec, *t_enc;
  955. /* Take turns in who's sending and who's receiving. */
  956. if (num_records % 3 == 0) {
  957. t_dec = &t0;
  958. t_enc = &t1;
  959. } else {
  960. t_dec = &t1;
  961. t_enc = &t0;
  962. }
  963. /*
  964. * The record header affects the transformation in two ways:
  965. * 1) It determines the AEAD additional data
  966. * 2) The record counter sometimes determines the IV.
  967. *
  968. * Apart from that, the fields don't have influence.
  969. * In particular, it is currently not the responsibility
  970. * of ssl_encrypt/decrypt_buf to check if the transform
  971. * version matches the record version, or that the
  972. * type is sensible.
  973. */
  974. memset(rec.ctr, num_records, sizeof(rec.ctr));
  975. rec.type = 42;
  976. rec.ver[0] = num_records;
  977. rec.ver[1] = num_records;
  978. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  979. rec.cid_len = 0;
  980. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  981. rec.buf = buf;
  982. rec.buf_len = buflen;
  983. rec.data_offset = 16;
  984. /* Make sure to vary the length to exercise different
  985. * paddings. */
  986. rec.data_len = 1 + num_records;
  987. memset(rec.buf + rec.data_offset, 42, rec.data_len);
  988. /* Make a copy for later comparison */
  989. rec_backup = rec;
  990. /* Encrypt record */
  991. ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
  992. mbedtls_test_rnd_std_rand, NULL);
  993. TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  994. if (ret != 0) {
  995. continue;
  996. }
  997. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  998. if (rec.cid_len != 0) {
  999. /* DTLS 1.2 + CID hides the real content type and
  1000. * uses a special CID content type in the protected
  1001. * record. Double-check this. */
  1002. TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
  1003. }
  1004. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  1005. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1006. if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1007. /* TLS 1.3 hides the real content type and
  1008. * always uses Application Data as the content type
  1009. * for protected records. Double-check this. */
  1010. TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
  1011. }
  1012. #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
  1013. /* Decrypt record with t_dec */
  1014. ret = mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec);
  1015. TEST_ASSERT(ret == 0);
  1016. /* Compare results */
  1017. TEST_ASSERT(rec.type == rec_backup.type);
  1018. TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
  1019. TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
  1020. TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
  1021. TEST_ASSERT(rec.data_len == rec_backup.data_len);
  1022. TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
  1023. TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
  1024. rec_backup.buf + rec_backup.data_offset,
  1025. rec.data_len) == 0);
  1026. }
  1027. exit:
  1028. /* Cleanup */
  1029. mbedtls_ssl_free(&ssl);
  1030. mbedtls_ssl_transform_free(&t0);
  1031. mbedtls_ssl_transform_free(&t1);
  1032. mbedtls_free(buf);
  1033. USE_PSA_DONE();
  1034. }
  1035. /* END_CASE */
  1036. /* BEGIN_CASE */
  1037. void ssl_crypt_record_small(int cipher_type, int hash_id,
  1038. int etm, int tag_mode, int ver,
  1039. int cid0_len, int cid1_len)
  1040. {
  1041. /*
  1042. * Test pairs of encryption and decryption with an increasing
  1043. * amount of space in the record buffer - in more detail:
  1044. * 1) Try to encrypt with 0, 1, 2, ... bytes available
  1045. * in front of the plaintext, and expect the encryption
  1046. * to succeed starting from some offset. Always keep
  1047. * enough space in the end of the buffer.
  1048. * 2) Try to encrypt with 0, 1, 2, ... bytes available
  1049. * at the end of the plaintext, and expect the encryption
  1050. * to succeed starting from some offset. Always keep
  1051. * enough space at the beginning of the buffer.
  1052. * 3) Try to encrypt with 0, 1, 2, ... bytes available
  1053. * both at the front and end of the plaintext,
  1054. * and expect the encryption to succeed starting from
  1055. * some offset.
  1056. *
  1057. * If encryption succeeds, check that decryption succeeds
  1058. * and yields the original record.
  1059. */
  1060. mbedtls_ssl_context ssl; /* ONLY for debugging */
  1061. mbedtls_ssl_transform t0, t1;
  1062. unsigned char *buf = NULL;
  1063. size_t const buflen = 256;
  1064. mbedtls_record rec, rec_backup;
  1065. int ret;
  1066. int mode; /* Mode 1, 2 or 3 as explained above */
  1067. size_t offset; /* Available space at beginning/end/both */
  1068. size_t threshold = 96; /* Maximum offset to test against */
  1069. size_t default_pre_padding = 64; /* Pre-padding to use in mode 2 */
  1070. size_t default_post_padding = 128; /* Post-padding to use in mode 1 */
  1071. int seen_success; /* Indicates if in the current mode we've
  1072. * already seen a successful test. */
  1073. USE_PSA_INIT();
  1074. mbedtls_ssl_init(&ssl);
  1075. mbedtls_ssl_transform_init(&t0);
  1076. mbedtls_ssl_transform_init(&t1);
  1077. ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
  1078. etm, tag_mode, ver,
  1079. (size_t) cid0_len,
  1080. (size_t) cid1_len);
  1081. TEST_ASSERT(ret == 0);
  1082. TEST_ASSERT((buf = mbedtls_calloc(1, buflen)) != NULL);
  1083. for (mode = 1; mode <= 3; mode++) {
  1084. seen_success = 0;
  1085. for (offset = 0; offset <= threshold; offset++) {
  1086. mbedtls_ssl_transform *t_dec, *t_enc;
  1087. t_dec = &t0;
  1088. t_enc = &t1;
  1089. memset(rec.ctr, offset, sizeof(rec.ctr));
  1090. rec.type = 42;
  1091. rec.ver[0] = offset;
  1092. rec.ver[1] = offset;
  1093. rec.buf = buf;
  1094. rec.buf_len = buflen;
  1095. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  1096. rec.cid_len = 0;
  1097. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  1098. switch (mode) {
  1099. case 1: /* Space in the beginning */
  1100. rec.data_offset = offset;
  1101. rec.data_len = buflen - offset - default_post_padding;
  1102. break;
  1103. case 2: /* Space in the end */
  1104. rec.data_offset = default_pre_padding;
  1105. rec.data_len = buflen - default_pre_padding - offset;
  1106. break;
  1107. case 3: /* Space in the beginning and end */
  1108. rec.data_offset = offset;
  1109. rec.data_len = buflen - 2 * offset;
  1110. break;
  1111. default:
  1112. TEST_ASSERT(0);
  1113. break;
  1114. }
  1115. memset(rec.buf + rec.data_offset, 42, rec.data_len);
  1116. /* Make a copy for later comparison */
  1117. rec_backup = rec;
  1118. /* Encrypt record */
  1119. ret = mbedtls_ssl_encrypt_buf(&ssl, t_enc, &rec,
  1120. mbedtls_test_rnd_std_rand, NULL);
  1121. if ((mode == 1 || mode == 2) && seen_success) {
  1122. TEST_ASSERT(ret == 0);
  1123. } else {
  1124. TEST_ASSERT(ret == 0 || ret == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  1125. if (ret == 0) {
  1126. seen_success = 1;
  1127. }
  1128. }
  1129. if (ret != 0) {
  1130. continue;
  1131. }
  1132. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  1133. if (rec.cid_len != 0) {
  1134. /* DTLS 1.2 + CID hides the real content type and
  1135. * uses a special CID content type in the protected
  1136. * record. Double-check this. */
  1137. TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_CID);
  1138. }
  1139. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  1140. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1141. if (t_enc->tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1142. /* TLS 1.3 hides the real content type and
  1143. * always uses Application Data as the content type
  1144. * for protected records. Double-check this. */
  1145. TEST_ASSERT(rec.type == MBEDTLS_SSL_MSG_APPLICATION_DATA);
  1146. }
  1147. #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
  1148. /* Decrypt record with t_dec */
  1149. TEST_ASSERT(mbedtls_ssl_decrypt_buf(&ssl, t_dec, &rec) == 0);
  1150. /* Compare results */
  1151. TEST_ASSERT(rec.type == rec_backup.type);
  1152. TEST_ASSERT(memcmp(rec.ctr, rec_backup.ctr, 8) == 0);
  1153. TEST_ASSERT(rec.ver[0] == rec_backup.ver[0]);
  1154. TEST_ASSERT(rec.ver[1] == rec_backup.ver[1]);
  1155. TEST_ASSERT(rec.data_len == rec_backup.data_len);
  1156. TEST_ASSERT(rec.data_offset == rec_backup.data_offset);
  1157. TEST_ASSERT(memcmp(rec.buf + rec.data_offset,
  1158. rec_backup.buf + rec_backup.data_offset,
  1159. rec.data_len) == 0);
  1160. }
  1161. TEST_ASSERT(seen_success == 1);
  1162. }
  1163. exit:
  1164. /* Cleanup */
  1165. mbedtls_ssl_free(&ssl);
  1166. mbedtls_ssl_transform_free(&t0);
  1167. mbedtls_ssl_transform_free(&t1);
  1168. mbedtls_free(buf);
  1169. USE_PSA_DONE();
  1170. }
  1171. /* END_CASE */
  1172. /* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_AES_C:MBEDTLS_SSL_PROTO_TLS1_2 */
  1173. void ssl_decrypt_non_etm_cbc(int cipher_type, int hash_id, int trunc_hmac,
  1174. int length_selector)
  1175. {
  1176. /*
  1177. * Test record decryption for CBC without EtM, focused on the verification
  1178. * of padding and MAC.
  1179. *
  1180. * Actually depends on TLS 1.2 and either AES, ARIA or Camellia, but since
  1181. * the test framework doesn't support alternation in dependency statements,
  1182. * just depend on AES.
  1183. *
  1184. * The length_selector argument is interpreted as follows:
  1185. * - if it's -1, the plaintext length is 0 and minimal padding is applied
  1186. * - if it's -2, the plaintext length is 0 and maximal padding is applied
  1187. * - otherwise it must be in [0, 255] and is padding_length from RFC 5246:
  1188. * it's the length of the rest of the padding, that is, excluding the
  1189. * byte that encodes the length. The minimal non-zero plaintext length
  1190. * that gives this padding_length is automatically selected.
  1191. */
  1192. mbedtls_ssl_context ssl; /* ONLY for debugging */
  1193. mbedtls_ssl_transform t0, t1;
  1194. mbedtls_record rec, rec_save;
  1195. unsigned char *buf = NULL, *buf_save = NULL;
  1196. size_t buflen, olen = 0;
  1197. size_t plaintext_len, block_size, i;
  1198. unsigned char padlen; /* excluding the padding_length byte */
  1199. unsigned char add_data[13];
  1200. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  1201. psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
  1202. size_t sign_mac_length = 0;
  1203. unsigned char mac[PSA_HASH_MAX_SIZE];
  1204. #else
  1205. unsigned char mac[MBEDTLS_MD_MAX_SIZE];
  1206. #endif
  1207. int exp_ret;
  1208. int ret;
  1209. const unsigned char pad_max_len = 255; /* Per the standard */
  1210. USE_PSA_INIT();
  1211. mbedtls_ssl_init(&ssl);
  1212. mbedtls_ssl_transform_init(&t0);
  1213. mbedtls_ssl_transform_init(&t1);
  1214. /* Set up transforms with dummy keys */
  1215. ret = mbedtls_test_ssl_build_transforms(&t0, &t1, cipher_type, hash_id,
  1216. 0, trunc_hmac,
  1217. MBEDTLS_SSL_VERSION_TLS1_2,
  1218. 0, 0);
  1219. TEST_ASSERT(ret == 0);
  1220. /* Determine padding/plaintext length */
  1221. TEST_ASSERT(length_selector >= -2 && length_selector <= 255);
  1222. block_size = t0.ivlen;
  1223. if (length_selector < 0) {
  1224. plaintext_len = 0;
  1225. /* Minimal padding
  1226. * The +1 is for the padding_length byte, not counted in padlen. */
  1227. padlen = block_size - (t0.maclen + 1) % block_size;
  1228. /* Maximal padding? */
  1229. if (length_selector == -2) {
  1230. padlen += block_size * ((pad_max_len - padlen) / block_size);
  1231. }
  1232. } else {
  1233. padlen = length_selector;
  1234. /* Minimal non-zero plaintext_length giving desired padding.
  1235. * The +1 is for the padding_length byte, not counted in padlen. */
  1236. plaintext_len = block_size - (padlen + t0.maclen + 1) % block_size;
  1237. }
  1238. /* Prepare a buffer for record data */
  1239. buflen = block_size
  1240. + plaintext_len
  1241. + t0.maclen
  1242. + padlen + 1;
  1243. ASSERT_ALLOC(buf, buflen);
  1244. ASSERT_ALLOC(buf_save, buflen);
  1245. /* Prepare a dummy record header */
  1246. memset(rec.ctr, 0, sizeof(rec.ctr));
  1247. rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
  1248. mbedtls_ssl_write_version(rec.ver, MBEDTLS_SSL_TRANSPORT_STREAM,
  1249. MBEDTLS_SSL_VERSION_TLS1_2);
  1250. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  1251. rec.cid_len = 0;
  1252. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  1253. /* Prepare dummy record content */
  1254. rec.buf = buf;
  1255. rec.buf_len = buflen;
  1256. rec.data_offset = block_size;
  1257. rec.data_len = plaintext_len;
  1258. memset(rec.buf + rec.data_offset, 42, rec.data_len);
  1259. /* Serialized version of record header for MAC purposes */
  1260. memcpy(add_data, rec.ctr, 8);
  1261. add_data[8] = rec.type;
  1262. add_data[9] = rec.ver[0];
  1263. add_data[10] = rec.ver[1];
  1264. add_data[11] = (rec.data_len >> 8) & 0xff;
  1265. add_data[12] = (rec.data_len >> 0) & 0xff;
  1266. /* Set dummy IV */
  1267. memset(t0.iv_enc, 0x55, t0.ivlen);
  1268. memcpy(rec.buf, t0.iv_enc, t0.ivlen);
  1269. /*
  1270. * Prepare a pre-encryption record (with MAC and padding), and save it.
  1271. */
  1272. /* MAC with additional data */
  1273. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  1274. TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_setup(&operation,
  1275. t0.psa_mac_enc,
  1276. t0.psa_mac_alg));
  1277. TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation, add_data, 13));
  1278. TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation,
  1279. rec.buf + rec.data_offset,
  1280. rec.data_len));
  1281. TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_finish(&operation,
  1282. mac, sizeof(mac),
  1283. &sign_mac_length));
  1284. #else
  1285. TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc, add_data, 13));
  1286. TEST_EQUAL(0, mbedtls_md_hmac_update(&t0.md_ctx_enc,
  1287. rec.buf + rec.data_offset,
  1288. rec.data_len));
  1289. TEST_EQUAL(0, mbedtls_md_hmac_finish(&t0.md_ctx_enc, mac));
  1290. #endif
  1291. memcpy(rec.buf + rec.data_offset + rec.data_len, mac, t0.maclen);
  1292. rec.data_len += t0.maclen;
  1293. /* Pad */
  1294. memset(rec.buf + rec.data_offset + rec.data_len, padlen, padlen + 1);
  1295. rec.data_len += padlen + 1;
  1296. /* Save correct pre-encryption record */
  1297. rec_save = rec;
  1298. rec_save.buf = buf_save;
  1299. memcpy(buf_save, buf, buflen);
  1300. /*
  1301. * Encrypt and decrypt the correct record, expecting success
  1302. */
  1303. TEST_EQUAL(0, mbedtls_test_psa_cipher_encrypt_helper(
  1304. &t0, t0.iv_enc, t0.ivlen, rec.buf + rec.data_offset,
  1305. rec.data_len, rec.buf + rec.data_offset, &olen));
  1306. rec.data_offset -= t0.ivlen;
  1307. rec.data_len += t0.ivlen;
  1308. TEST_EQUAL(0, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
  1309. /*
  1310. * Modify each byte of the pre-encryption record before encrypting and
  1311. * decrypting it, expecting failure every time.
  1312. */
  1313. for (i = block_size; i < buflen; i++) {
  1314. mbedtls_test_set_step(i);
  1315. /* Restore correct pre-encryption record */
  1316. rec = rec_save;
  1317. rec.buf = buf;
  1318. memcpy(buf, buf_save, buflen);
  1319. /* Corrupt one byte of the data (could be plaintext, MAC or padding) */
  1320. rec.buf[i] ^= 0x01;
  1321. /* Encrypt */
  1322. TEST_EQUAL(0, mbedtls_test_psa_cipher_encrypt_helper(
  1323. &t0, t0.iv_enc, t0.ivlen, rec.buf + rec.data_offset,
  1324. rec.data_len, rec.buf + rec.data_offset, &olen));
  1325. rec.data_offset -= t0.ivlen;
  1326. rec.data_len += t0.ivlen;
  1327. /* Decrypt and expect failure */
  1328. TEST_EQUAL(MBEDTLS_ERR_SSL_INVALID_MAC,
  1329. mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
  1330. }
  1331. /*
  1332. * Use larger values of the padding bytes - with small buffers, this tests
  1333. * the case where the announced padlen would be larger than the buffer
  1334. * (and before that, than the buffer minus the size of the MAC), to make
  1335. * sure our padding checking code does not perform any out-of-bounds reads
  1336. * in this case. (With larger buffers, ie when the plaintext is long or
  1337. * maximal length padding is used, this is less relevant but still doesn't
  1338. * hurt to test.)
  1339. *
  1340. * (Start the loop with correct padding, just to double-check that record
  1341. * saving did work, and that we're overwriting the correct bytes.)
  1342. */
  1343. for (i = padlen; i <= pad_max_len; i++) {
  1344. mbedtls_test_set_step(i);
  1345. /* Restore correct pre-encryption record */
  1346. rec = rec_save;
  1347. rec.buf = buf;
  1348. memcpy(buf, buf_save, buflen);
  1349. /* Set padding bytes to new value */
  1350. memset(buf + buflen - padlen - 1, i, padlen + 1);
  1351. /* Encrypt */
  1352. TEST_EQUAL(0, mbedtls_test_psa_cipher_encrypt_helper(
  1353. &t0, t0.iv_enc, t0.ivlen, rec.buf + rec.data_offset,
  1354. rec.data_len, rec.buf + rec.data_offset, &olen));
  1355. rec.data_offset -= t0.ivlen;
  1356. rec.data_len += t0.ivlen;
  1357. /* Decrypt and expect failure except the first time */
  1358. exp_ret = (i == padlen) ? 0 : MBEDTLS_ERR_SSL_INVALID_MAC;
  1359. TEST_EQUAL(exp_ret, mbedtls_ssl_decrypt_buf(&ssl, &t1, &rec));
  1360. }
  1361. exit:
  1362. mbedtls_ssl_free(&ssl);
  1363. mbedtls_ssl_transform_free(&t0);
  1364. mbedtls_ssl_transform_free(&t1);
  1365. mbedtls_free(buf);
  1366. mbedtls_free(buf_save);
  1367. USE_PSA_DONE();
  1368. }
  1369. /* END_CASE */
  1370. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1371. void ssl_tls13_hkdf_expand_label(int hash_alg,
  1372. data_t *secret,
  1373. int label_idx,
  1374. data_t *ctx,
  1375. int desired_length,
  1376. data_t *expected)
  1377. {
  1378. unsigned char dst[100];
  1379. unsigned char const *lbl = NULL;
  1380. size_t lbl_len;
  1381. #define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
  1382. if (label_idx == (int) tls13_label_ ## name) \
  1383. { \
  1384. lbl = mbedtls_ssl_tls13_labels.name; \
  1385. lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
  1386. }
  1387. MBEDTLS_SSL_TLS1_3_LABEL_LIST
  1388. #undef MBEDTLS_SSL_TLS1_3_LABEL
  1389. TEST_ASSERT(lbl != NULL);
  1390. /* Check sanity of test parameters. */
  1391. TEST_ASSERT((size_t) desired_length <= sizeof(dst));
  1392. TEST_ASSERT((size_t) desired_length == expected->len);
  1393. PSA_INIT();
  1394. TEST_ASSERT(mbedtls_ssl_tls13_hkdf_expand_label(
  1395. (psa_algorithm_t) hash_alg,
  1396. secret->x, secret->len,
  1397. lbl, lbl_len,
  1398. ctx->x, ctx->len,
  1399. dst, desired_length) == 0);
  1400. ASSERT_COMPARE(dst, (size_t) desired_length,
  1401. expected->x, (size_t) expected->len);
  1402. PSA_DONE();
  1403. }
  1404. /* END_CASE */
  1405. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1406. void ssl_tls13_traffic_key_generation(int hash_alg,
  1407. data_t *server_secret,
  1408. data_t *client_secret,
  1409. int desired_iv_len,
  1410. int desired_key_len,
  1411. data_t *expected_server_write_key,
  1412. data_t *expected_server_write_iv,
  1413. data_t *expected_client_write_key,
  1414. data_t *expected_client_write_iv)
  1415. {
  1416. mbedtls_ssl_key_set keys;
  1417. /* Check sanity of test parameters. */
  1418. TEST_ASSERT(client_secret->len == server_secret->len);
  1419. TEST_ASSERT(
  1420. expected_client_write_iv->len == expected_server_write_iv->len &&
  1421. expected_client_write_iv->len == (size_t) desired_iv_len);
  1422. TEST_ASSERT(
  1423. expected_client_write_key->len == expected_server_write_key->len &&
  1424. expected_client_write_key->len == (size_t) desired_key_len);
  1425. PSA_INIT();
  1426. TEST_ASSERT(mbedtls_ssl_tls13_make_traffic_keys(
  1427. (psa_algorithm_t) hash_alg,
  1428. client_secret->x,
  1429. server_secret->x,
  1430. client_secret->len /* == server_secret->len */,
  1431. desired_key_len, desired_iv_len,
  1432. &keys) == 0);
  1433. ASSERT_COMPARE(keys.client_write_key,
  1434. keys.key_len,
  1435. expected_client_write_key->x,
  1436. (size_t) desired_key_len);
  1437. ASSERT_COMPARE(keys.server_write_key,
  1438. keys.key_len,
  1439. expected_server_write_key->x,
  1440. (size_t) desired_key_len);
  1441. ASSERT_COMPARE(keys.client_write_iv,
  1442. keys.iv_len,
  1443. expected_client_write_iv->x,
  1444. (size_t) desired_iv_len);
  1445. ASSERT_COMPARE(keys.server_write_iv,
  1446. keys.iv_len,
  1447. expected_server_write_iv->x,
  1448. (size_t) desired_iv_len);
  1449. PSA_DONE();
  1450. }
  1451. /* END_CASE */
  1452. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1453. void ssl_tls13_derive_secret(int hash_alg,
  1454. data_t *secret,
  1455. int label_idx,
  1456. data_t *ctx,
  1457. int desired_length,
  1458. int already_hashed,
  1459. data_t *expected)
  1460. {
  1461. unsigned char dst[100];
  1462. unsigned char const *lbl = NULL;
  1463. size_t lbl_len;
  1464. #define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
  1465. if (label_idx == (int) tls13_label_ ## name) \
  1466. { \
  1467. lbl = mbedtls_ssl_tls13_labels.name; \
  1468. lbl_len = sizeof(mbedtls_ssl_tls13_labels.name); \
  1469. }
  1470. MBEDTLS_SSL_TLS1_3_LABEL_LIST
  1471. #undef MBEDTLS_SSL_TLS1_3_LABEL
  1472. TEST_ASSERT(lbl != NULL);
  1473. /* Check sanity of test parameters. */
  1474. TEST_ASSERT((size_t) desired_length <= sizeof(dst));
  1475. TEST_ASSERT((size_t) desired_length == expected->len);
  1476. PSA_INIT();
  1477. TEST_ASSERT(mbedtls_ssl_tls13_derive_secret(
  1478. (psa_algorithm_t) hash_alg,
  1479. secret->x, secret->len,
  1480. lbl, lbl_len,
  1481. ctx->x, ctx->len,
  1482. already_hashed,
  1483. dst, desired_length) == 0);
  1484. ASSERT_COMPARE(dst, desired_length,
  1485. expected->x, desired_length);
  1486. PSA_DONE();
  1487. }
  1488. /* END_CASE */
  1489. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1490. void ssl_tls13_derive_early_secrets(int hash_alg,
  1491. data_t *secret,
  1492. data_t *transcript,
  1493. data_t *traffic_expected,
  1494. data_t *exporter_expected)
  1495. {
  1496. mbedtls_ssl_tls13_early_secrets secrets;
  1497. /* Double-check that we've passed sane parameters. */
  1498. psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
  1499. size_t const hash_len = PSA_HASH_LENGTH(alg);
  1500. TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
  1501. secret->len == hash_len &&
  1502. transcript->len == hash_len &&
  1503. traffic_expected->len == hash_len &&
  1504. exporter_expected->len == hash_len);
  1505. PSA_INIT();
  1506. TEST_ASSERT(mbedtls_ssl_tls13_derive_early_secrets(
  1507. alg, secret->x, transcript->x, transcript->len,
  1508. &secrets) == 0);
  1509. ASSERT_COMPARE(secrets.client_early_traffic_secret, hash_len,
  1510. traffic_expected->x, traffic_expected->len);
  1511. ASSERT_COMPARE(secrets.early_exporter_master_secret, hash_len,
  1512. exporter_expected->x, exporter_expected->len);
  1513. PSA_DONE();
  1514. }
  1515. /* END_CASE */
  1516. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1517. void ssl_tls13_derive_handshake_secrets(int hash_alg,
  1518. data_t *secret,
  1519. data_t *transcript,
  1520. data_t *client_expected,
  1521. data_t *server_expected)
  1522. {
  1523. mbedtls_ssl_tls13_handshake_secrets secrets;
  1524. /* Double-check that we've passed sane parameters. */
  1525. psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
  1526. size_t const hash_len = PSA_HASH_LENGTH(alg);
  1527. TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
  1528. secret->len == hash_len &&
  1529. transcript->len == hash_len &&
  1530. client_expected->len == hash_len &&
  1531. server_expected->len == hash_len);
  1532. PSA_INIT();
  1533. TEST_ASSERT(mbedtls_ssl_tls13_derive_handshake_secrets(
  1534. alg, secret->x, transcript->x, transcript->len,
  1535. &secrets) == 0);
  1536. ASSERT_COMPARE(secrets.client_handshake_traffic_secret, hash_len,
  1537. client_expected->x, client_expected->len);
  1538. ASSERT_COMPARE(secrets.server_handshake_traffic_secret, hash_len,
  1539. server_expected->x, server_expected->len);
  1540. PSA_DONE();
  1541. }
  1542. /* END_CASE */
  1543. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1544. void ssl_tls13_derive_application_secrets(int hash_alg,
  1545. data_t *secret,
  1546. data_t *transcript,
  1547. data_t *client_expected,
  1548. data_t *server_expected,
  1549. data_t *exporter_expected)
  1550. {
  1551. mbedtls_ssl_tls13_application_secrets secrets;
  1552. /* Double-check that we've passed sane parameters. */
  1553. psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
  1554. size_t const hash_len = PSA_HASH_LENGTH(alg);
  1555. TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
  1556. secret->len == hash_len &&
  1557. transcript->len == hash_len &&
  1558. client_expected->len == hash_len &&
  1559. server_expected->len == hash_len &&
  1560. exporter_expected->len == hash_len);
  1561. PSA_INIT();
  1562. TEST_ASSERT(mbedtls_ssl_tls13_derive_application_secrets(
  1563. alg, secret->x, transcript->x, transcript->len,
  1564. &secrets) == 0);
  1565. ASSERT_COMPARE(secrets.client_application_traffic_secret_N, hash_len,
  1566. client_expected->x, client_expected->len);
  1567. ASSERT_COMPARE(secrets.server_application_traffic_secret_N, hash_len,
  1568. server_expected->x, server_expected->len);
  1569. ASSERT_COMPARE(secrets.exporter_master_secret, hash_len,
  1570. exporter_expected->x, exporter_expected->len);
  1571. PSA_DONE();
  1572. }
  1573. /* END_CASE */
  1574. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1575. void ssl_tls13_derive_resumption_secrets(int hash_alg,
  1576. data_t *secret,
  1577. data_t *transcript,
  1578. data_t *resumption_expected)
  1579. {
  1580. mbedtls_ssl_tls13_application_secrets secrets;
  1581. /* Double-check that we've passed sane parameters. */
  1582. psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
  1583. size_t const hash_len = PSA_HASH_LENGTH(alg);
  1584. TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
  1585. secret->len == hash_len &&
  1586. transcript->len == hash_len &&
  1587. resumption_expected->len == hash_len);
  1588. PSA_INIT();
  1589. TEST_ASSERT(mbedtls_ssl_tls13_derive_resumption_master_secret(
  1590. alg, secret->x, transcript->x, transcript->len,
  1591. &secrets) == 0);
  1592. ASSERT_COMPARE(secrets.resumption_master_secret, hash_len,
  1593. resumption_expected->x, resumption_expected->len);
  1594. PSA_DONE();
  1595. }
  1596. /* END_CASE */
  1597. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1598. void ssl_tls13_create_psk_binder(int hash_alg,
  1599. data_t *psk,
  1600. int psk_type,
  1601. data_t *transcript,
  1602. data_t *binder_expected)
  1603. {
  1604. unsigned char binder[MBEDTLS_HASH_MAX_SIZE];
  1605. /* Double-check that we've passed sane parameters. */
  1606. psa_algorithm_t alg = (psa_algorithm_t) hash_alg;
  1607. size_t const hash_len = PSA_HASH_LENGTH(alg);
  1608. TEST_ASSERT(PSA_ALG_IS_HASH(alg) &&
  1609. transcript->len == hash_len &&
  1610. binder_expected->len == hash_len);
  1611. PSA_INIT();
  1612. TEST_ASSERT(mbedtls_ssl_tls13_create_psk_binder(
  1613. NULL, /* SSL context for debugging only */
  1614. alg,
  1615. psk->x, psk->len,
  1616. psk_type,
  1617. transcript->x,
  1618. binder) == 0);
  1619. ASSERT_COMPARE(binder, hash_len,
  1620. binder_expected->x, binder_expected->len);
  1621. PSA_DONE();
  1622. }
  1623. /* END_CASE */
  1624. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  1625. void ssl_tls13_record_protection(int ciphersuite,
  1626. int endpoint,
  1627. int ctr,
  1628. int padding_used,
  1629. data_t *server_write_key,
  1630. data_t *server_write_iv,
  1631. data_t *client_write_key,
  1632. data_t *client_write_iv,
  1633. data_t *plaintext,
  1634. data_t *ciphertext)
  1635. {
  1636. mbedtls_ssl_key_set keys;
  1637. mbedtls_ssl_transform transform_send;
  1638. mbedtls_ssl_transform transform_recv;
  1639. mbedtls_record rec;
  1640. unsigned char *buf = NULL;
  1641. size_t buf_len;
  1642. int other_endpoint;
  1643. USE_PSA_INIT();
  1644. TEST_ASSERT(endpoint == MBEDTLS_SSL_IS_CLIENT ||
  1645. endpoint == MBEDTLS_SSL_IS_SERVER);
  1646. if (endpoint == MBEDTLS_SSL_IS_SERVER) {
  1647. other_endpoint = MBEDTLS_SSL_IS_CLIENT;
  1648. }
  1649. if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
  1650. other_endpoint = MBEDTLS_SSL_IS_SERVER;
  1651. }
  1652. TEST_ASSERT(server_write_key->len == client_write_key->len);
  1653. TEST_ASSERT(server_write_iv->len == client_write_iv->len);
  1654. memcpy(keys.client_write_key,
  1655. client_write_key->x, client_write_key->len);
  1656. memcpy(keys.client_write_iv,
  1657. client_write_iv->x, client_write_iv->len);
  1658. memcpy(keys.server_write_key,
  1659. server_write_key->x, server_write_key->len);
  1660. memcpy(keys.server_write_iv,
  1661. server_write_iv->x, server_write_iv->len);
  1662. keys.key_len = server_write_key->len;
  1663. keys.iv_len = server_write_iv->len;
  1664. mbedtls_ssl_transform_init(&transform_recv);
  1665. mbedtls_ssl_transform_init(&transform_send);
  1666. TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
  1667. &transform_send, endpoint,
  1668. ciphersuite, &keys, NULL) == 0);
  1669. TEST_ASSERT(mbedtls_ssl_tls13_populate_transform(
  1670. &transform_recv, other_endpoint,
  1671. ciphersuite, &keys, NULL) == 0);
  1672. /* Make sure we have enough space in the buffer even if
  1673. * we use more padding than the KAT. */
  1674. buf_len = ciphertext->len + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
  1675. ASSERT_ALLOC(buf, buf_len);
  1676. rec.type = MBEDTLS_SSL_MSG_APPLICATION_DATA;
  1677. /* TLS 1.3 uses the version identifier from TLS 1.2 on the wire. */
  1678. mbedtls_ssl_write_version(rec.ver,
  1679. MBEDTLS_SSL_TRANSPORT_STREAM,
  1680. MBEDTLS_SSL_VERSION_TLS1_2);
  1681. /* Copy plaintext into record structure */
  1682. rec.buf = buf;
  1683. rec.buf_len = buf_len;
  1684. rec.data_offset = 0;
  1685. TEST_ASSERT(plaintext->len <= ciphertext->len);
  1686. memcpy(rec.buf + rec.data_offset, plaintext->x, plaintext->len);
  1687. rec.data_len = plaintext->len;
  1688. #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
  1689. rec.cid_len = 0;
  1690. #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
  1691. memset(&rec.ctr[0], 0, 8);
  1692. rec.ctr[7] = ctr;
  1693. TEST_ASSERT(mbedtls_ssl_encrypt_buf(NULL, &transform_send, &rec,
  1694. NULL, NULL) == 0);
  1695. if (padding_used == MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) {
  1696. ASSERT_COMPARE(rec.buf + rec.data_offset, rec.data_len,
  1697. ciphertext->x, ciphertext->len);
  1698. }
  1699. TEST_ASSERT(mbedtls_ssl_decrypt_buf(NULL, &transform_recv, &rec) == 0);
  1700. ASSERT_COMPARE(rec.buf + rec.data_offset, rec.data_len,
  1701. plaintext->x, plaintext->len);
  1702. mbedtls_free(buf);
  1703. mbedtls_ssl_transform_free(&transform_send);
  1704. mbedtls_ssl_transform_free(&transform_recv);
  1705. USE_PSA_DONE();
  1706. }
  1707. /* END_CASE */
  1708. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3 */
  1709. void ssl_tls13_key_evolution(int hash_alg,
  1710. data_t *secret,
  1711. data_t *input,
  1712. data_t *expected)
  1713. {
  1714. unsigned char secret_new[MBEDTLS_HASH_MAX_SIZE];
  1715. PSA_INIT();
  1716. TEST_ASSERT(mbedtls_ssl_tls13_evolve_secret(
  1717. (psa_algorithm_t) hash_alg,
  1718. secret->len ? secret->x : NULL,
  1719. input->len ? input->x : NULL, input->len,
  1720. secret_new) == 0);
  1721. ASSERT_COMPARE(secret_new, (size_t) expected->len,
  1722. expected->x, (size_t) expected->len);
  1723. PSA_DONE();
  1724. }
  1725. /* END_CASE */
  1726. /* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_2 */
  1727. void ssl_tls_prf(int type, data_t *secret, data_t *random,
  1728. char *label, data_t *result_str, int exp_ret)
  1729. {
  1730. unsigned char *output;
  1731. output = mbedtls_calloc(1, result_str->len);
  1732. if (output == NULL) {
  1733. goto exit;
  1734. }
  1735. USE_PSA_INIT();
  1736. TEST_ASSERT(mbedtls_ssl_tls_prf(type, secret->x, secret->len,
  1737. label, random->x, random->len,
  1738. output, result_str->len) == exp_ret);
  1739. if (exp_ret == 0) {
  1740. TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
  1741. result_str->len, result_str->len) == 0);
  1742. }
  1743. exit:
  1744. mbedtls_free(output);
  1745. USE_PSA_DONE();
  1746. }
  1747. /* END_CASE */
  1748. /* BEGIN_CASE */
  1749. void ssl_serialize_session_save_load(int ticket_len, char *crt_file,
  1750. int endpoint_type, int tls_version)
  1751. {
  1752. mbedtls_ssl_session original, restored;
  1753. unsigned char *buf = NULL;
  1754. size_t len;
  1755. /*
  1756. * Test that a save-load pair is the identity
  1757. */
  1758. mbedtls_ssl_session_init(&original);
  1759. mbedtls_ssl_session_init(&restored);
  1760. /* Prepare a dummy session to work on */
  1761. ((void) endpoint_type);
  1762. ((void) tls_version);
  1763. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1764. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1765. TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
  1766. &original, 0, endpoint_type) == 0);
  1767. } else
  1768. #endif
  1769. {
  1770. TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
  1771. &original, ticket_len, crt_file) == 0);
  1772. }
  1773. /* Serialize it */
  1774. TEST_ASSERT(mbedtls_ssl_session_save(&original, NULL, 0, &len)
  1775. == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  1776. TEST_ASSERT((buf = mbedtls_calloc(1, len)) != NULL);
  1777. TEST_ASSERT(mbedtls_ssl_session_save(&original, buf, len, &len)
  1778. == 0);
  1779. /* Restore session from serialized data */
  1780. TEST_ASSERT(mbedtls_ssl_session_load(&restored, buf, len) == 0);
  1781. /*
  1782. * Make sure both session structures are identical
  1783. */
  1784. #if defined(MBEDTLS_HAVE_TIME)
  1785. TEST_ASSERT(original.start == restored.start);
  1786. #endif
  1787. TEST_ASSERT(original.tls_version == restored.tls_version);
  1788. TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
  1789. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  1790. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
  1791. TEST_ASSERT(original.id_len == restored.id_len);
  1792. TEST_ASSERT(memcmp(original.id,
  1793. restored.id, sizeof(original.id)) == 0);
  1794. TEST_ASSERT(memcmp(original.master,
  1795. restored.master, sizeof(original.master)) == 0);
  1796. #if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
  1797. #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
  1798. TEST_ASSERT((original.peer_cert == NULL) ==
  1799. (restored.peer_cert == NULL));
  1800. if (original.peer_cert != NULL) {
  1801. TEST_ASSERT(original.peer_cert->raw.len ==
  1802. restored.peer_cert->raw.len);
  1803. TEST_ASSERT(memcmp(original.peer_cert->raw.p,
  1804. restored.peer_cert->raw.p,
  1805. original.peer_cert->raw.len) == 0);
  1806. }
  1807. #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
  1808. TEST_ASSERT(original.peer_cert_digest_type ==
  1809. restored.peer_cert_digest_type);
  1810. TEST_ASSERT(original.peer_cert_digest_len ==
  1811. restored.peer_cert_digest_len);
  1812. TEST_ASSERT((original.peer_cert_digest == NULL) ==
  1813. (restored.peer_cert_digest == NULL));
  1814. if (original.peer_cert_digest != NULL) {
  1815. TEST_ASSERT(memcmp(original.peer_cert_digest,
  1816. restored.peer_cert_digest,
  1817. original.peer_cert_digest_len) == 0);
  1818. }
  1819. #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
  1820. #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
  1821. TEST_ASSERT(original.verify_result == restored.verify_result);
  1822. #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
  1823. TEST_ASSERT(original.mfl_code == restored.mfl_code);
  1824. #endif
  1825. #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
  1826. TEST_ASSERT(original.encrypt_then_mac == restored.encrypt_then_mac);
  1827. #endif
  1828. #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
  1829. TEST_ASSERT(original.ticket_len == restored.ticket_len);
  1830. if (original.ticket_len != 0) {
  1831. TEST_ASSERT(original.ticket != NULL);
  1832. TEST_ASSERT(restored.ticket != NULL);
  1833. TEST_ASSERT(memcmp(original.ticket,
  1834. restored.ticket, original.ticket_len) == 0);
  1835. }
  1836. TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
  1837. #endif
  1838. }
  1839. #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
  1840. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1841. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1842. TEST_ASSERT(original.endpoint == restored.endpoint);
  1843. TEST_ASSERT(original.ciphersuite == restored.ciphersuite);
  1844. TEST_ASSERT(original.ticket_age_add == restored.ticket_age_add);
  1845. TEST_ASSERT(original.ticket_flags == restored.ticket_flags);
  1846. TEST_ASSERT(original.resumption_key_len == restored.resumption_key_len);
  1847. if (original.resumption_key_len != 0) {
  1848. TEST_ASSERT(original.resumption_key != NULL);
  1849. TEST_ASSERT(restored.resumption_key != NULL);
  1850. TEST_ASSERT(memcmp(original.resumption_key,
  1851. restored.resumption_key,
  1852. original.resumption_key_len) == 0);
  1853. }
  1854. #if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
  1855. if (endpoint_type == MBEDTLS_SSL_IS_SERVER) {
  1856. TEST_ASSERT(original.start == restored.start);
  1857. }
  1858. #endif
  1859. #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
  1860. if (endpoint_type == MBEDTLS_SSL_IS_CLIENT) {
  1861. #if defined(MBEDTLS_HAVE_TIME)
  1862. TEST_ASSERT(original.ticket_received == restored.ticket_received);
  1863. #endif
  1864. TEST_ASSERT(original.ticket_lifetime == restored.ticket_lifetime);
  1865. TEST_ASSERT(original.ticket_len == restored.ticket_len);
  1866. if (original.ticket_len != 0) {
  1867. TEST_ASSERT(original.ticket != NULL);
  1868. TEST_ASSERT(restored.ticket != NULL);
  1869. TEST_ASSERT(memcmp(original.ticket,
  1870. restored.ticket,
  1871. original.ticket_len) == 0);
  1872. }
  1873. }
  1874. #endif
  1875. }
  1876. #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
  1877. exit:
  1878. mbedtls_ssl_session_free(&original);
  1879. mbedtls_ssl_session_free(&restored);
  1880. mbedtls_free(buf);
  1881. }
  1882. /* END_CASE */
  1883. /* BEGIN_CASE */
  1884. void ssl_serialize_session_load_save(int ticket_len, char *crt_file,
  1885. int endpoint_type, int tls_version)
  1886. {
  1887. mbedtls_ssl_session session;
  1888. unsigned char *buf1 = NULL, *buf2 = NULL;
  1889. size_t len0, len1, len2;
  1890. /*
  1891. * Test that a load-save pair is the identity
  1892. */
  1893. mbedtls_ssl_session_init(&session);
  1894. /* Prepare a dummy session to work on */
  1895. ((void) endpoint_type);
  1896. ((void) tls_version);
  1897. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1898. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1899. TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
  1900. &session, 0, endpoint_type) == 0);
  1901. } else
  1902. #endif
  1903. {
  1904. TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
  1905. &session, ticket_len, crt_file) == 0);
  1906. }
  1907. /* Get desired buffer size for serializing */
  1908. TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &len0)
  1909. == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  1910. /* Allocate first buffer */
  1911. buf1 = mbedtls_calloc(1, len0);
  1912. TEST_ASSERT(buf1 != NULL);
  1913. /* Serialize to buffer and free live session */
  1914. TEST_ASSERT(mbedtls_ssl_session_save(&session, buf1, len0, &len1)
  1915. == 0);
  1916. TEST_ASSERT(len0 == len1);
  1917. mbedtls_ssl_session_free(&session);
  1918. /* Restore session from serialized data */
  1919. TEST_ASSERT(mbedtls_ssl_session_load(&session, buf1, len1) == 0);
  1920. /* Allocate second buffer and serialize to it */
  1921. buf2 = mbedtls_calloc(1, len0);
  1922. TEST_ASSERT(buf2 != NULL);
  1923. TEST_ASSERT(mbedtls_ssl_session_save(&session, buf2, len0, &len2)
  1924. == 0);
  1925. /* Make sure both serialized versions are identical */
  1926. TEST_ASSERT(len1 == len2);
  1927. TEST_ASSERT(memcmp(buf1, buf2, len1) == 0);
  1928. exit:
  1929. mbedtls_ssl_session_free(&session);
  1930. mbedtls_free(buf1);
  1931. mbedtls_free(buf2);
  1932. }
  1933. /* END_CASE */
  1934. /* BEGIN_CASE */
  1935. void ssl_serialize_session_save_buf_size(int ticket_len, char *crt_file,
  1936. int endpoint_type, int tls_version)
  1937. {
  1938. mbedtls_ssl_session session;
  1939. unsigned char *buf = NULL;
  1940. size_t good_len, bad_len, test_len;
  1941. /*
  1942. * Test that session_save() fails cleanly on small buffers
  1943. */
  1944. mbedtls_ssl_session_init(&session);
  1945. /* Prepare dummy session and get serialized size */
  1946. ((void) endpoint_type);
  1947. ((void) tls_version);
  1948. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1949. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1950. TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
  1951. &session, 0, endpoint_type) == 0);
  1952. } else
  1953. #endif
  1954. {
  1955. TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
  1956. &session, ticket_len, crt_file) == 0);
  1957. }
  1958. TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
  1959. == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  1960. /* Try all possible bad lengths */
  1961. for (bad_len = 1; bad_len < good_len; bad_len++) {
  1962. /* Allocate exact size so that asan/valgrind can detect any overwrite */
  1963. mbedtls_free(buf);
  1964. TEST_ASSERT((buf = mbedtls_calloc(1, bad_len)) != NULL);
  1965. TEST_ASSERT(mbedtls_ssl_session_save(&session, buf, bad_len,
  1966. &test_len)
  1967. == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  1968. TEST_ASSERT(test_len == good_len);
  1969. }
  1970. exit:
  1971. mbedtls_ssl_session_free(&session);
  1972. mbedtls_free(buf);
  1973. }
  1974. /* END_CASE */
  1975. /* BEGIN_CASE */
  1976. void ssl_serialize_session_load_buf_size(int ticket_len, char *crt_file,
  1977. int endpoint_type, int tls_version)
  1978. {
  1979. mbedtls_ssl_session session;
  1980. unsigned char *good_buf = NULL, *bad_buf = NULL;
  1981. size_t good_len, bad_len;
  1982. /*
  1983. * Test that session_load() fails cleanly on small buffers
  1984. */
  1985. mbedtls_ssl_session_init(&session);
  1986. /* Prepare serialized session data */
  1987. ((void) endpoint_type);
  1988. ((void) tls_version);
  1989. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  1990. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  1991. TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
  1992. &session, 0, endpoint_type) == 0);
  1993. } else
  1994. #endif
  1995. {
  1996. TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
  1997. &session, ticket_len, crt_file) == 0);
  1998. }
  1999. TEST_ASSERT(mbedtls_ssl_session_save(&session, NULL, 0, &good_len)
  2000. == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
  2001. TEST_ASSERT((good_buf = mbedtls_calloc(1, good_len)) != NULL);
  2002. TEST_ASSERT(mbedtls_ssl_session_save(&session, good_buf, good_len,
  2003. &good_len) == 0);
  2004. mbedtls_ssl_session_free(&session);
  2005. /* Try all possible bad lengths */
  2006. for (bad_len = 0; bad_len < good_len; bad_len++) {
  2007. /* Allocate exact size so that asan/valgrind can detect any overread */
  2008. mbedtls_free(bad_buf);
  2009. bad_buf = mbedtls_calloc(1, bad_len ? bad_len : 1);
  2010. TEST_ASSERT(bad_buf != NULL);
  2011. memcpy(bad_buf, good_buf, bad_len);
  2012. TEST_ASSERT(mbedtls_ssl_session_load(&session, bad_buf, bad_len)
  2013. == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2014. }
  2015. exit:
  2016. mbedtls_ssl_session_free(&session);
  2017. mbedtls_free(good_buf);
  2018. mbedtls_free(bad_buf);
  2019. }
  2020. /* END_CASE */
  2021. /* BEGIN_CASE */
  2022. void ssl_session_serialize_version_check(int corrupt_major,
  2023. int corrupt_minor,
  2024. int corrupt_patch,
  2025. int corrupt_config,
  2026. int endpoint_type,
  2027. int tls_version)
  2028. {
  2029. unsigned char serialized_session[2048];
  2030. size_t serialized_session_len;
  2031. unsigned cur_byte;
  2032. mbedtls_ssl_session session;
  2033. uint8_t should_corrupt_byte[] = { corrupt_major == 1,
  2034. corrupt_minor == 1,
  2035. corrupt_patch == 1,
  2036. corrupt_config == 1,
  2037. corrupt_config == 1 };
  2038. mbedtls_ssl_session_init(&session);
  2039. ((void) endpoint_type);
  2040. ((void) tls_version);
  2041. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  2042. if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
  2043. TEST_ASSERT(mbedtls_test_ssl_tls13_populate_session(
  2044. &session, 0, endpoint_type) == 0);
  2045. } else
  2046. #endif
  2047. TEST_ASSERT(mbedtls_test_ssl_tls12_populate_session(
  2048. &session, 0, NULL) == 0);
  2049. /* Infer length of serialized session. */
  2050. TEST_ASSERT(mbedtls_ssl_session_save(&session,
  2051. serialized_session,
  2052. sizeof(serialized_session),
  2053. &serialized_session_len) == 0);
  2054. mbedtls_ssl_session_free(&session);
  2055. /* Without any modification, we should be able to successfully
  2056. * de-serialize the session - double-check that. */
  2057. TEST_ASSERT(mbedtls_ssl_session_load(&session,
  2058. serialized_session,
  2059. serialized_session_len) == 0);
  2060. mbedtls_ssl_session_free(&session);
  2061. /* Go through the bytes in the serialized session header and
  2062. * corrupt them bit-by-bit. */
  2063. for (cur_byte = 0; cur_byte < sizeof(should_corrupt_byte); cur_byte++) {
  2064. int cur_bit;
  2065. unsigned char * const byte = &serialized_session[cur_byte];
  2066. if (should_corrupt_byte[cur_byte] == 0) {
  2067. continue;
  2068. }
  2069. for (cur_bit = 0; cur_bit < CHAR_BIT; cur_bit++) {
  2070. unsigned char const corrupted_bit = 0x1u << cur_bit;
  2071. /* Modify a single bit in the serialized session. */
  2072. *byte ^= corrupted_bit;
  2073. /* Attempt to deserialize */
  2074. TEST_ASSERT(mbedtls_ssl_session_load(&session,
  2075. serialized_session,
  2076. serialized_session_len) ==
  2077. MBEDTLS_ERR_SSL_VERSION_MISMATCH);
  2078. /* Undo the change */
  2079. *byte ^= corrupted_bit;
  2080. }
  2081. }
  2082. }
  2083. /* END_CASE */
  2084. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2085. void mbedtls_endpoint_sanity(int endpoint_type)
  2086. {
  2087. enum { BUFFSIZE = 1024 };
  2088. mbedtls_test_ssl_endpoint ep;
  2089. int ret = -1;
  2090. mbedtls_test_handshake_test_options options;
  2091. mbedtls_test_init_handshake_options(&options);
  2092. options.pk_alg = MBEDTLS_PK_RSA;
  2093. ret = mbedtls_test_ssl_endpoint_init(NULL, endpoint_type, &options,
  2094. NULL, NULL, NULL, NULL);
  2095. TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
  2096. ret = mbedtls_test_ssl_endpoint_certificate_init(NULL, options.pk_alg,
  2097. 0, 0, 0);
  2098. TEST_ASSERT(MBEDTLS_ERR_SSL_BAD_INPUT_DATA == ret);
  2099. ret = mbedtls_test_ssl_endpoint_init(&ep, endpoint_type, &options,
  2100. NULL, NULL, NULL, NULL);
  2101. TEST_ASSERT(ret == 0);
  2102. exit:
  2103. mbedtls_test_ssl_endpoint_free(&ep, NULL);
  2104. mbedtls_test_free_handshake_options(&options);
  2105. }
  2106. /* END_CASE */
  2107. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C */
  2108. void move_handshake_to_state(int endpoint_type, int state, int need_pass)
  2109. {
  2110. enum { BUFFSIZE = 1024 };
  2111. mbedtls_test_ssl_endpoint base_ep, second_ep;
  2112. int ret = -1;
  2113. mbedtls_test_handshake_test_options options;
  2114. mbedtls_test_init_handshake_options(&options);
  2115. options.pk_alg = MBEDTLS_PK_RSA;
  2116. USE_PSA_INIT();
  2117. mbedtls_platform_zeroize(&base_ep, sizeof(base_ep));
  2118. mbedtls_platform_zeroize(&second_ep, sizeof(second_ep));
  2119. ret = mbedtls_test_ssl_endpoint_init(&base_ep, endpoint_type, &options,
  2120. NULL, NULL, NULL, NULL);
  2121. TEST_ASSERT(ret == 0);
  2122. ret = mbedtls_test_ssl_endpoint_init(
  2123. &second_ep,
  2124. (endpoint_type == MBEDTLS_SSL_IS_SERVER) ?
  2125. MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,
  2126. &options, NULL, NULL, NULL, NULL);
  2127. TEST_ASSERT(ret == 0);
  2128. ret = mbedtls_test_mock_socket_connect(&(base_ep.socket),
  2129. &(second_ep.socket),
  2130. BUFFSIZE);
  2131. TEST_ASSERT(ret == 0);
  2132. ret = mbedtls_test_move_handshake_to_state(&(base_ep.ssl),
  2133. &(second_ep.ssl),
  2134. state);
  2135. if (need_pass) {
  2136. TEST_ASSERT(ret == 0 ||
  2137. ret == MBEDTLS_ERR_SSL_WANT_READ ||
  2138. ret == MBEDTLS_ERR_SSL_WANT_WRITE);
  2139. TEST_ASSERT(base_ep.ssl.state == state);
  2140. } else {
  2141. TEST_ASSERT(ret != 0 &&
  2142. ret != MBEDTLS_ERR_SSL_WANT_READ &&
  2143. ret != MBEDTLS_ERR_SSL_WANT_WRITE);
  2144. TEST_ASSERT(base_ep.ssl.state != state);
  2145. }
  2146. exit:
  2147. mbedtls_test_free_handshake_options(&options);
  2148. mbedtls_test_ssl_endpoint_free(&base_ep, NULL);
  2149. mbedtls_test_ssl_endpoint_free(&second_ep, NULL);
  2150. USE_PSA_DONE();
  2151. }
  2152. /* END_CASE */
  2153. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2154. void handshake_version(int dtls, int client_min_version, int client_max_version,
  2155. int server_min_version, int server_max_version,
  2156. int expected_negotiated_version)
  2157. {
  2158. mbedtls_test_handshake_test_options options;
  2159. mbedtls_test_init_handshake_options(&options);
  2160. options.client_min_version = client_min_version;
  2161. options.client_max_version = client_max_version;
  2162. options.server_min_version = server_min_version;
  2163. options.server_max_version = server_max_version;
  2164. options.expected_negotiated_version = expected_negotiated_version;
  2165. options.dtls = dtls;
  2166. mbedtls_test_ssl_perform_handshake(&options);
  2167. /* The goto below is used to avoid an "unused label" warning.*/
  2168. goto exit;
  2169. exit:
  2170. mbedtls_test_free_handshake_options(&options);
  2171. }
  2172. /* END_CASE */
  2173. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2174. void handshake_psk_cipher(char *cipher, int pk_alg, data_t *psk_str, int dtls)
  2175. {
  2176. mbedtls_test_handshake_test_options options;
  2177. mbedtls_test_init_handshake_options(&options);
  2178. options.cipher = cipher;
  2179. options.dtls = dtls;
  2180. options.psk_str = psk_str;
  2181. options.pk_alg = pk_alg;
  2182. mbedtls_test_ssl_perform_handshake(&options);
  2183. /* The goto below is used to avoid an "unused label" warning.*/
  2184. goto exit;
  2185. exit:
  2186. mbedtls_test_free_handshake_options(&options);
  2187. }
  2188. /* END_CASE */
  2189. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2190. void handshake_cipher(char *cipher, int pk_alg, int dtls)
  2191. {
  2192. test_handshake_psk_cipher(cipher, pk_alg, NULL, dtls);
  2193. /* The goto below is used to avoid an "unused label" warning.*/
  2194. goto exit;
  2195. }
  2196. /* END_CASE */
  2197. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2198. void handshake_ciphersuite_select(char *cipher, int pk_alg, data_t *psk_str,
  2199. int psa_alg, int psa_alg2, int psa_usage,
  2200. int expected_handshake_result,
  2201. int expected_ciphersuite)
  2202. {
  2203. mbedtls_test_handshake_test_options options;
  2204. mbedtls_test_init_handshake_options(&options);
  2205. options.cipher = cipher;
  2206. options.psk_str = psk_str;
  2207. options.pk_alg = pk_alg;
  2208. options.opaque_alg = psa_alg;
  2209. options.opaque_alg2 = psa_alg2;
  2210. options.opaque_usage = psa_usage;
  2211. options.expected_handshake_result = expected_handshake_result;
  2212. options.expected_ciphersuite = expected_ciphersuite;
  2213. mbedtls_test_ssl_perform_handshake(&options);
  2214. /* The goto below is used to avoid an "unused label" warning.*/
  2215. goto exit;
  2216. exit:
  2217. mbedtls_test_free_handshake_options(&options);
  2218. }
  2219. /* END_CASE */
  2220. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2221. void app_data(int mfl, int cli_msg_len, int srv_msg_len,
  2222. int expected_cli_fragments,
  2223. int expected_srv_fragments, int dtls)
  2224. {
  2225. mbedtls_test_handshake_test_options options;
  2226. mbedtls_test_init_handshake_options(&options);
  2227. options.mfl = mfl;
  2228. options.cli_msg_len = cli_msg_len;
  2229. options.srv_msg_len = srv_msg_len;
  2230. options.expected_cli_fragments = expected_cli_fragments;
  2231. options.expected_srv_fragments = expected_srv_fragments;
  2232. options.dtls = dtls;
  2233. #if !defined(MBEDTLS_SSL_PROTO_TLS1_2)
  2234. options.expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_3;
  2235. #endif
  2236. mbedtls_test_ssl_perform_handshake(&options);
  2237. /* The goto below is used to avoid an "unused label" warning.*/
  2238. goto exit;
  2239. exit:
  2240. mbedtls_test_free_handshake_options(&options);
  2241. }
  2242. /* END_CASE */
  2243. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_ECP_C:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2244. void app_data_tls(int mfl, int cli_msg_len, int srv_msg_len,
  2245. int expected_cli_fragments,
  2246. int expected_srv_fragments)
  2247. {
  2248. test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
  2249. expected_srv_fragments, 0);
  2250. /* The goto below is used to avoid an "unused label" warning.*/
  2251. goto exit;
  2252. }
  2253. /* END_CASE */
  2254. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2255. void app_data_dtls(int mfl, int cli_msg_len, int srv_msg_len,
  2256. int expected_cli_fragments,
  2257. int expected_srv_fragments)
  2258. {
  2259. test_app_data(mfl, cli_msg_len, srv_msg_len, expected_cli_fragments,
  2260. expected_srv_fragments, 1);
  2261. /* The goto below is used to avoid an "unused label" warning.*/
  2262. goto exit;
  2263. }
  2264. /* END_CASE */
  2265. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2266. void handshake_serialization()
  2267. {
  2268. mbedtls_test_handshake_test_options options;
  2269. mbedtls_test_init_handshake_options(&options);
  2270. options.serialize = 1;
  2271. options.dtls = 1;
  2272. mbedtls_test_ssl_perform_handshake(&options);
  2273. /* The goto below is used to avoid an "unused label" warning.*/
  2274. goto exit;
  2275. exit:
  2276. mbedtls_test_free_handshake_options(&options);
  2277. }
  2278. /* END_CASE */
  2279. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_DEBUG_C:MBEDTLS_SSL_MAX_FRAGMENT_LENGTH:MBEDTLS_CIPHER_MODE_CBC:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
  2280. void handshake_fragmentation(int mfl,
  2281. int expected_srv_hs_fragmentation,
  2282. int expected_cli_hs_fragmentation)
  2283. {
  2284. mbedtls_test_handshake_test_options options;
  2285. mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
  2286. srv_pattern.pattern = cli_pattern.pattern = "found fragmented DTLS handshake";
  2287. srv_pattern.counter = 0;
  2288. cli_pattern.counter = 0;
  2289. mbedtls_test_init_handshake_options(&options);
  2290. options.dtls = 1;
  2291. options.mfl = mfl;
  2292. /* Set cipher to one using CBC so that record splitting can be tested */
  2293. options.cipher = "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256";
  2294. options.srv_auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;
  2295. options.srv_log_obj = &srv_pattern;
  2296. options.cli_log_obj = &cli_pattern;
  2297. options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
  2298. options.cli_log_fun = mbedtls_test_ssl_log_analyzer;
  2299. mbedtls_test_ssl_perform_handshake(&options);
  2300. /* Test if the server received a fragmented handshake */
  2301. if (expected_srv_hs_fragmentation) {
  2302. TEST_ASSERT(srv_pattern.counter >= 1);
  2303. }
  2304. /* Test if the client received a fragmented handshake */
  2305. if (expected_cli_hs_fragmentation) {
  2306. TEST_ASSERT(cli_pattern.counter >= 1);
  2307. }
  2308. exit:
  2309. mbedtls_test_free_handshake_options(&options);
  2310. }
  2311. /* END_CASE */
  2312. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2313. void renegotiation(int legacy_renegotiation)
  2314. {
  2315. mbedtls_test_handshake_test_options options;
  2316. mbedtls_test_init_handshake_options(&options);
  2317. options.renegotiate = 1;
  2318. options.legacy_renegotiation = legacy_renegotiation;
  2319. options.dtls = 1;
  2320. mbedtls_test_ssl_perform_handshake(&options);
  2321. /* The goto below is used to avoid an "unused label" warning.*/
  2322. goto exit;
  2323. exit:
  2324. mbedtls_test_free_handshake_options(&options);
  2325. }
  2326. /* END_CASE */
  2327. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2328. void resize_buffers(int mfl, int renegotiation, int legacy_renegotiation,
  2329. int serialize, int dtls, char *cipher)
  2330. {
  2331. mbedtls_test_handshake_test_options options;
  2332. mbedtls_test_init_handshake_options(&options);
  2333. options.mfl = mfl;
  2334. options.cipher = cipher;
  2335. options.renegotiate = renegotiation;
  2336. options.legacy_renegotiation = legacy_renegotiation;
  2337. options.serialize = serialize;
  2338. options.dtls = dtls;
  2339. options.resize_buffers = 1;
  2340. mbedtls_test_ssl_perform_handshake(&options);
  2341. /* The goto below is used to avoid an "unused label" warning.*/
  2342. goto exit;
  2343. exit:
  2344. mbedtls_test_free_handshake_options(&options);
  2345. }
  2346. /* END_CASE */
  2347. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_CONTEXT_SERIALIZATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_SSL_PROTO_DTLS:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2348. void resize_buffers_serialize_mfl(int mfl)
  2349. {
  2350. test_resize_buffers(mfl, 0, MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION, 1, 1,
  2351. (char *) "");
  2352. /* The goto below is used to avoid an "unused label" warning.*/
  2353. goto exit;
  2354. }
  2355. /* END_CASE */
  2356. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH:MBEDTLS_SSL_RENEGOTIATION:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA:MBEDTLS_CAN_HANDLE_RSA_TEST_KEY */
  2357. void resize_buffers_renegotiate_mfl(int mfl, int legacy_renegotiation,
  2358. char *cipher)
  2359. {
  2360. test_resize_buffers(mfl, 1, legacy_renegotiation, 0, 1, cipher);
  2361. /* The goto below is used to avoid an "unused label" warning.*/
  2362. goto exit;
  2363. }
  2364. /* END_CASE */
  2365. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */
  2366. void test_multiple_psks()
  2367. {
  2368. unsigned char psk0[10] = { 0 };
  2369. unsigned char psk0_identity[] = { 'f', 'o', 'o' };
  2370. unsigned char psk1[10] = { 0 };
  2371. unsigned char psk1_identity[] = { 'b', 'a', 'r' };
  2372. mbedtls_ssl_config conf;
  2373. USE_PSA_INIT();
  2374. mbedtls_ssl_config_init(&conf);
  2375. TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
  2376. psk0, sizeof(psk0),
  2377. psk0_identity, sizeof(psk0_identity)) == 0);
  2378. TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
  2379. psk1, sizeof(psk1),
  2380. psk1_identity, sizeof(psk1_identity)) ==
  2381. MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
  2382. exit:
  2383. mbedtls_ssl_config_free(&conf);
  2384. USE_PSA_DONE();
  2385. }
  2386. /* END_CASE */
  2387. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED:MBEDTLS_USE_PSA_CRYPTO */
  2388. void test_multiple_psks_opaque(int mode)
  2389. {
  2390. /*
  2391. * Mode 0: Raw PSK, then opaque PSK
  2392. * Mode 1: Opaque PSK, then raw PSK
  2393. * Mode 2: 2x opaque PSK
  2394. */
  2395. unsigned char psk0_raw[10] = { 0 };
  2396. unsigned char psk0_raw_identity[] = { 'f', 'o', 'o' };
  2397. mbedtls_svc_key_id_t psk0_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 1);
  2398. unsigned char psk0_opaque_identity[] = { 'f', 'o', 'o' };
  2399. unsigned char psk1_raw[10] = { 0 };
  2400. unsigned char psk1_raw_identity[] = { 'b', 'a', 'r' };
  2401. mbedtls_svc_key_id_t psk1_opaque = mbedtls_svc_key_id_make(0x1, (psa_key_id_t) 2);
  2402. unsigned char psk1_opaque_identity[] = { 'b', 'a', 'r' };
  2403. mbedtls_ssl_config conf;
  2404. USE_PSA_INIT();
  2405. mbedtls_ssl_config_init(&conf);
  2406. switch (mode) {
  2407. case 0:
  2408. TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
  2409. psk0_raw, sizeof(psk0_raw),
  2410. psk0_raw_identity, sizeof(psk0_raw_identity))
  2411. == 0);
  2412. TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
  2413. psk1_opaque,
  2414. psk1_opaque_identity,
  2415. sizeof(psk1_opaque_identity))
  2416. == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
  2417. break;
  2418. case 1:
  2419. TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
  2420. psk0_opaque,
  2421. psk0_opaque_identity,
  2422. sizeof(psk0_opaque_identity))
  2423. == 0);
  2424. TEST_ASSERT(mbedtls_ssl_conf_psk(&conf,
  2425. psk1_raw, sizeof(psk1_raw),
  2426. psk1_raw_identity, sizeof(psk1_raw_identity))
  2427. == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
  2428. break;
  2429. case 2:
  2430. TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
  2431. psk0_opaque,
  2432. psk0_opaque_identity,
  2433. sizeof(psk0_opaque_identity))
  2434. == 0);
  2435. TEST_ASSERT(mbedtls_ssl_conf_psk_opaque(&conf,
  2436. psk1_opaque,
  2437. psk1_opaque_identity,
  2438. sizeof(psk1_opaque_identity))
  2439. == MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE);
  2440. break;
  2441. default:
  2442. TEST_ASSERT(0);
  2443. break;
  2444. }
  2445. exit:
  2446. mbedtls_ssl_config_free(&conf);
  2447. USE_PSA_DONE();
  2448. }
  2449. /* END_CASE */
  2450. /* BEGIN_CASE */
  2451. void conf_version(int endpoint, int transport,
  2452. int min_tls_version, int max_tls_version,
  2453. int expected_ssl_setup_result)
  2454. {
  2455. mbedtls_ssl_config conf;
  2456. mbedtls_ssl_context ssl;
  2457. mbedtls_ssl_config_init(&conf);
  2458. mbedtls_ssl_init(&ssl);
  2459. mbedtls_ssl_conf_endpoint(&conf, endpoint);
  2460. mbedtls_ssl_conf_transport(&conf, transport);
  2461. mbedtls_ssl_conf_min_tls_version(&conf, min_tls_version);
  2462. mbedtls_ssl_conf_max_tls_version(&conf, max_tls_version);
  2463. TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == expected_ssl_setup_result);
  2464. mbedtls_ssl_free(&ssl);
  2465. mbedtls_ssl_config_free(&conf);
  2466. }
  2467. /* END_CASE */
  2468. /* BEGIN_CASE depends_on:MBEDTLS_ECP_C:!MBEDTLS_DEPRECATED_REMOVED:!MBEDTLS_DEPRECATED_WARNING:MBEDTLS_ECP_DP_SECP192R1_ENABLED:MBEDTLS_ECP_DP_SECP224R1_ENABLED:MBEDTLS_ECP_DP_SECP256R1_ENABLED */
  2469. void conf_curve()
  2470. {
  2471. mbedtls_ecp_group_id curve_list[] = { MBEDTLS_ECP_DP_SECP192R1,
  2472. MBEDTLS_ECP_DP_SECP224R1,
  2473. MBEDTLS_ECP_DP_SECP256R1,
  2474. MBEDTLS_ECP_DP_NONE };
  2475. uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
  2476. MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
  2477. MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
  2478. MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
  2479. mbedtls_ssl_config conf;
  2480. mbedtls_ssl_config_init(&conf);
  2481. #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
  2482. mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
  2483. mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
  2484. #else
  2485. mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
  2486. mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_3);
  2487. #endif
  2488. mbedtls_ssl_conf_curves(&conf, curve_list);
  2489. mbedtls_ssl_context ssl;
  2490. mbedtls_ssl_init(&ssl);
  2491. TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
  2492. TEST_ASSERT(ssl.handshake != NULL && ssl.handshake->group_list != NULL);
  2493. TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list == NULL);
  2494. TEST_EQUAL(ssl.handshake->
  2495. group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
  2496. MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
  2497. for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
  2498. TEST_EQUAL(iana_tls_group_list[i], ssl.handshake->group_list[i]);
  2499. }
  2500. mbedtls_ssl_free(&ssl);
  2501. mbedtls_ssl_config_free(&conf);
  2502. }
  2503. /* END_CASE */
  2504. /* BEGIN_CASE depends_on:MBEDTLS_DEPRECATED_REMOVED */
  2505. void conf_group()
  2506. {
  2507. uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1,
  2508. MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1,
  2509. MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
  2510. MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
  2511. mbedtls_ssl_config conf;
  2512. mbedtls_ssl_config_init(&conf);
  2513. mbedtls_ssl_conf_max_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
  2514. mbedtls_ssl_conf_min_tls_version(&conf, MBEDTLS_SSL_VERSION_TLS1_2);
  2515. mbedtls_ssl_conf_groups(&conf, iana_tls_group_list);
  2516. mbedtls_ssl_context ssl;
  2517. mbedtls_ssl_init(&ssl);
  2518. TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
  2519. TEST_ASSERT(ssl.conf != NULL && ssl.conf->group_list != NULL);
  2520. TEST_EQUAL(ssl.conf->
  2521. group_list[ARRAY_LENGTH(iana_tls_group_list) - 1],
  2522. MBEDTLS_SSL_IANA_TLS_GROUP_NONE);
  2523. for (size_t i = 0; i < ARRAY_LENGTH(iana_tls_group_list); i++) {
  2524. TEST_EQUAL(iana_tls_group_list[i], ssl.conf->group_list[i]);
  2525. }
  2526. mbedtls_ssl_free(&ssl);
  2527. mbedtls_ssl_config_free(&conf);
  2528. }
  2529. /* END_CASE */
  2530. /* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_CACHE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PKCS1_V15:MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
  2531. void force_bad_session_id_len()
  2532. {
  2533. enum { BUFFSIZE = 1024 };
  2534. mbedtls_test_handshake_test_options options;
  2535. mbedtls_test_ssl_endpoint client, server;
  2536. mbedtls_test_ssl_log_pattern srv_pattern, cli_pattern;
  2537. mbedtls_test_message_socket_context server_context, client_context;
  2538. srv_pattern.pattern = cli_pattern.pattern = "cache did not store session";
  2539. srv_pattern.counter = 0;
  2540. mbedtls_test_init_handshake_options(&options);
  2541. options.srv_log_obj = &srv_pattern;
  2542. options.srv_log_fun = mbedtls_test_ssl_log_analyzer;
  2543. USE_PSA_INIT();
  2544. mbedtls_platform_zeroize(&client, sizeof(client));
  2545. mbedtls_platform_zeroize(&server, sizeof(server));
  2546. mbedtls_test_message_socket_init(&server_context);
  2547. mbedtls_test_message_socket_init(&client_context);
  2548. TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
  2549. &options, NULL, NULL,
  2550. NULL, NULL) == 0);
  2551. TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
  2552. &options, NULL, NULL, NULL,
  2553. NULL) == 0);
  2554. mbedtls_debug_set_threshold(1);
  2555. mbedtls_ssl_conf_dbg(&server.conf, options.srv_log_fun,
  2556. options.srv_log_obj);
  2557. TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket),
  2558. &(server.socket),
  2559. BUFFSIZE) == 0);
  2560. TEST_ASSERT(mbedtls_test_move_handshake_to_state(
  2561. &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_WRAPUP)
  2562. == 0);
  2563. /* Force a bad session_id_len that will be read by the server in
  2564. * mbedtls_ssl_cache_set. */
  2565. server.ssl.session_negotiate->id_len = 33;
  2566. if (options.cli_msg_len != 0 || options.srv_msg_len != 0) {
  2567. /* Start data exchanging test */
  2568. TEST_ASSERT(mbedtls_exchange_data(&(client.ssl), options.cli_msg_len,
  2569. options.expected_cli_fragments,
  2570. &(server.ssl), options.srv_msg_len,
  2571. options.expected_srv_fragments)
  2572. == 0);
  2573. }
  2574. /* Make sure that the cache did not store the session */
  2575. TEST_EQUAL(srv_pattern.counter, 1);
  2576. exit:
  2577. mbedtls_test_ssl_endpoint_free(&client, NULL);
  2578. mbedtls_test_ssl_endpoint_free(&server, NULL);
  2579. mbedtls_test_free_handshake_options(&options);
  2580. mbedtls_debug_set_threshold(0);
  2581. USE_PSA_DONE();
  2582. }
  2583. /* END_CASE */
  2584. /* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE:MBEDTLS_TEST_HOOKS */
  2585. void cookie_parsing(data_t *cookie, int exp_ret)
  2586. {
  2587. mbedtls_ssl_context ssl;
  2588. mbedtls_ssl_config conf;
  2589. size_t len;
  2590. mbedtls_ssl_init(&ssl);
  2591. mbedtls_ssl_config_init(&conf);
  2592. TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER,
  2593. MBEDTLS_SSL_TRANSPORT_DATAGRAM,
  2594. MBEDTLS_SSL_PRESET_DEFAULT),
  2595. 0);
  2596. TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
  2597. TEST_EQUAL(mbedtls_ssl_check_dtls_clihlo_cookie(&ssl, ssl.cli_id,
  2598. ssl.cli_id_len,
  2599. cookie->x, cookie->len,
  2600. ssl.out_buf,
  2601. MBEDTLS_SSL_OUT_CONTENT_LEN,
  2602. &len),
  2603. exp_ret);
  2604. mbedtls_ssl_free(&ssl);
  2605. mbedtls_ssl_config_free(&conf);
  2606. }
  2607. /* END_CASE */
  2608. /* BEGIN_CASE depends_on:MBEDTLS_TIMING_C:MBEDTLS_HAVE_TIME */
  2609. void timing_final_delay_accessor()
  2610. {
  2611. mbedtls_timing_delay_context delay_context;
  2612. mbedtls_timing_set_delay(&delay_context, 50, 100);
  2613. TEST_ASSERT(mbedtls_timing_get_final_delay(&delay_context) == 100);
  2614. }
  2615. /* END_CASE */
  2616. /* BEGIN_CASE depends_on:MBEDTLS_SSL_DTLS_CONNECTION_ID */
  2617. void cid_sanity()
  2618. {
  2619. mbedtls_ssl_context ssl;
  2620. mbedtls_ssl_config conf;
  2621. unsigned char own_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
  2622. unsigned char test_cid[MBEDTLS_SSL_CID_IN_LEN_MAX];
  2623. int cid_enabled;
  2624. size_t own_cid_len;
  2625. mbedtls_test_rnd_std_rand(NULL, own_cid, sizeof(own_cid));
  2626. mbedtls_ssl_init(&ssl);
  2627. mbedtls_ssl_config_init(&conf);
  2628. TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
  2629. MBEDTLS_SSL_IS_CLIENT,
  2630. MBEDTLS_SSL_TRANSPORT_STREAM,
  2631. MBEDTLS_SSL_PRESET_DEFAULT)
  2632. == 0);
  2633. TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0);
  2634. /* Can't use CID functions with stream transport. */
  2635. TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
  2636. sizeof(own_cid))
  2637. == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2638. TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
  2639. &own_cid_len)
  2640. == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2641. TEST_ASSERT(mbedtls_ssl_config_defaults(&conf,
  2642. MBEDTLS_SSL_IS_CLIENT,
  2643. MBEDTLS_SSL_TRANSPORT_DATAGRAM,
  2644. MBEDTLS_SSL_PRESET_DEFAULT)
  2645. == 0);
  2646. /* Attempt to set config cid size too big. */
  2647. TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, MBEDTLS_SSL_CID_IN_LEN_MAX + 1,
  2648. MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
  2649. == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2650. TEST_ASSERT(mbedtls_ssl_conf_cid(&conf, sizeof(own_cid),
  2651. MBEDTLS_SSL_UNEXPECTED_CID_IGNORE)
  2652. == 0);
  2653. /* Attempt to set CID length not matching config. */
  2654. TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
  2655. MBEDTLS_SSL_CID_IN_LEN_MAX - 1)
  2656. == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2657. TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_ENABLED, own_cid,
  2658. sizeof(own_cid))
  2659. == 0);
  2660. /* Test we get back what we put in. */
  2661. TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
  2662. &own_cid_len)
  2663. == 0);
  2664. TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_ENABLED);
  2665. ASSERT_COMPARE(own_cid, own_cid_len, test_cid, own_cid_len);
  2666. /* Test disabling works. */
  2667. TEST_ASSERT(mbedtls_ssl_set_cid(&ssl, MBEDTLS_SSL_CID_DISABLED, NULL,
  2668. 0)
  2669. == 0);
  2670. TEST_ASSERT(mbedtls_ssl_get_own_cid(&ssl, &cid_enabled, test_cid,
  2671. &own_cid_len)
  2672. == 0);
  2673. TEST_EQUAL(cid_enabled, MBEDTLS_SSL_CID_DISABLED);
  2674. mbedtls_ssl_free(&ssl);
  2675. mbedtls_ssl_config_free(&conf);
  2676. }
  2677. /* END_CASE */
  2678. /* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_USE_PSA_CRYPTO:MBEDTLS_PKCS1_V15:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_ECP_DP_SECP256R1_ENABLED:MBEDTLS_RSA_C:MBEDTLS_ECP_DP_SECP384R1_ENABLED:MBEDTLS_PK_CAN_ECDSA_SOME */
  2679. void raw_key_agreement_fail(int bad_server_ecdhe_key)
  2680. {
  2681. enum { BUFFSIZE = 17000 };
  2682. mbedtls_test_ssl_endpoint client, server;
  2683. mbedtls_psa_stats_t stats;
  2684. size_t free_slots_before = -1;
  2685. mbedtls_test_handshake_test_options options;
  2686. uint16_t iana_tls_group_list[] = { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
  2687. MBEDTLS_SSL_IANA_TLS_GROUP_NONE };
  2688. USE_PSA_INIT();
  2689. mbedtls_platform_zeroize(&client, sizeof(client));
  2690. mbedtls_platform_zeroize(&server, sizeof(server));
  2691. mbedtls_test_init_handshake_options(&options);
  2692. options.pk_alg = MBEDTLS_PK_ECDSA;
  2693. /* Client side, force SECP256R1 to make one key bitflip fail
  2694. * the raw key agreement. Flipping the first byte makes the
  2695. * required 0x04 identifier invalid. */
  2696. TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&client, MBEDTLS_SSL_IS_CLIENT,
  2697. &options, NULL, NULL,
  2698. NULL, iana_tls_group_list), 0);
  2699. /* Server side */
  2700. TEST_EQUAL(mbedtls_test_ssl_endpoint_init(&server, MBEDTLS_SSL_IS_SERVER,
  2701. &options, NULL, NULL,
  2702. NULL, NULL), 0);
  2703. TEST_EQUAL(mbedtls_test_mock_socket_connect(&(client.socket),
  2704. &(server.socket),
  2705. BUFFSIZE), 0);
  2706. TEST_EQUAL(mbedtls_test_move_handshake_to_state(
  2707. &(client.ssl), &(server.ssl),
  2708. MBEDTLS_SSL_CLIENT_KEY_EXCHANGE), 0);
  2709. mbedtls_psa_get_stats(&stats);
  2710. /* Save the number of slots in use up to this point.
  2711. * With PSA, one can be used for the ECDH private key. */
  2712. free_slots_before = stats.empty_slots;
  2713. if (bad_server_ecdhe_key) {
  2714. /* Force a simulated bitflip in the server key. to make the
  2715. * raw key agreement in ssl_write_client_key_exchange fail. */
  2716. (client.ssl).handshake->ecdh_psa_peerkey[0] ^= 0x02;
  2717. }
  2718. TEST_EQUAL(mbedtls_test_move_handshake_to_state(
  2719. &(client.ssl), &(server.ssl), MBEDTLS_SSL_HANDSHAKE_OVER),
  2720. bad_server_ecdhe_key ? MBEDTLS_ERR_SSL_HW_ACCEL_FAILED : 0);
  2721. mbedtls_psa_get_stats(&stats);
  2722. /* Make sure that the key slot is already destroyed in case of failure,
  2723. * without waiting to close the connection. */
  2724. if (bad_server_ecdhe_key) {
  2725. TEST_EQUAL(free_slots_before, stats.empty_slots);
  2726. }
  2727. exit:
  2728. mbedtls_test_ssl_endpoint_free(&client, NULL);
  2729. mbedtls_test_ssl_endpoint_free(&server, NULL);
  2730. mbedtls_test_free_handshake_options(&options);
  2731. USE_PSA_DONE();
  2732. }
  2733. /* END_CASE */
  2734. /* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_SSL_PROTO_TLS1_3:!MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_ECP_DP_SECP384R1_ENABLED */
  2735. void tls13_server_certificate_msg_invalid_vector_len()
  2736. {
  2737. int ret = -1;
  2738. mbedtls_test_ssl_endpoint client_ep, server_ep;
  2739. unsigned char *buf, *end;
  2740. size_t buf_len;
  2741. int step = 0;
  2742. int expected_result;
  2743. mbedtls_ssl_chk_buf_ptr_args expected_chk_buf_ptr_args;
  2744. mbedtls_test_handshake_test_options client_options;
  2745. mbedtls_test_handshake_test_options server_options;
  2746. /*
  2747. * Test set-up
  2748. */
  2749. USE_PSA_INIT();
  2750. mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
  2751. mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
  2752. mbedtls_test_init_handshake_options(&client_options);
  2753. client_options.pk_alg = MBEDTLS_PK_ECDSA;
  2754. ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
  2755. &client_options, NULL, NULL, NULL,
  2756. NULL);
  2757. TEST_EQUAL(ret, 0);
  2758. mbedtls_test_init_handshake_options(&server_options);
  2759. server_options.pk_alg = MBEDTLS_PK_ECDSA;
  2760. ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
  2761. &server_options, NULL, NULL, NULL,
  2762. NULL);
  2763. TEST_EQUAL(ret, 0);
  2764. ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
  2765. &(server_ep.socket), 1024);
  2766. TEST_EQUAL(ret, 0);
  2767. while (1) {
  2768. mbedtls_test_set_step(++step);
  2769. ret = mbedtls_test_move_handshake_to_state(
  2770. &(server_ep.ssl), &(client_ep.ssl),
  2771. MBEDTLS_SSL_CERTIFICATE_VERIFY);
  2772. TEST_EQUAL(ret, 0);
  2773. ret = mbedtls_ssl_flush_output(&(server_ep.ssl));
  2774. TEST_EQUAL(ret, 0);
  2775. ret = mbedtls_test_move_handshake_to_state(
  2776. &(client_ep.ssl), &(server_ep.ssl),
  2777. MBEDTLS_SSL_SERVER_CERTIFICATE);
  2778. TEST_EQUAL(ret, 0);
  2779. ret = mbedtls_ssl_tls13_fetch_handshake_msg(&(client_ep.ssl),
  2780. MBEDTLS_SSL_HS_CERTIFICATE,
  2781. &buf, &buf_len);
  2782. TEST_EQUAL(ret, 0);
  2783. end = buf + buf_len;
  2784. /*
  2785. * Tweak server Certificate message and parse it.
  2786. */
  2787. ret = tweak_tls13_certificate_msg_vector_len(
  2788. buf, &end, step, &expected_result, &expected_chk_buf_ptr_args);
  2789. if (ret != 0) {
  2790. break;
  2791. }
  2792. ret = mbedtls_ssl_tls13_parse_certificate(&(client_ep.ssl), buf, end);
  2793. TEST_EQUAL(ret, expected_result);
  2794. TEST_ASSERT(mbedtls_ssl_cmp_chk_buf_ptr_fail_args(
  2795. &expected_chk_buf_ptr_args) == 0);
  2796. mbedtls_ssl_reset_chk_buf_ptr_fail_args();
  2797. ret = mbedtls_ssl_session_reset(&(client_ep.ssl));
  2798. TEST_EQUAL(ret, 0);
  2799. ret = mbedtls_ssl_session_reset(&(server_ep.ssl));
  2800. TEST_EQUAL(ret, 0);
  2801. }
  2802. exit:
  2803. mbedtls_ssl_reset_chk_buf_ptr_fail_args();
  2804. mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
  2805. mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
  2806. mbedtls_test_free_handshake_options(&client_options);
  2807. mbedtls_test_free_handshake_options(&server_options);
  2808. USE_PSA_DONE();
  2809. }
  2810. /* END_CASE */
  2811. /* BEGIN_CASE depends_on:MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
  2812. void ssl_ecjpake_set_password(int use_opaque_arg)
  2813. {
  2814. mbedtls_ssl_context ssl;
  2815. mbedtls_ssl_config conf;
  2816. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  2817. mbedtls_svc_key_id_t pwd_slot = MBEDTLS_SVC_KEY_ID_INIT;
  2818. #else /* MBEDTLS_USE_PSA_CRYPTO */
  2819. (void) use_opaque_arg;
  2820. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  2821. unsigned char pwd_string[sizeof(ECJPAKE_TEST_PWD)] = "";
  2822. size_t pwd_len = 0;
  2823. int ret;
  2824. USE_PSA_INIT();
  2825. mbedtls_ssl_init(&ssl);
  2826. /* test with uninitalized SSL context */
  2827. ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2828. mbedtls_ssl_config_init(&conf);
  2829. TEST_EQUAL(mbedtls_ssl_config_defaults(&conf,
  2830. MBEDTLS_SSL_IS_CLIENT,
  2831. MBEDTLS_SSL_TRANSPORT_STREAM,
  2832. MBEDTLS_SSL_PRESET_DEFAULT), 0);
  2833. TEST_EQUAL(mbedtls_ssl_setup(&ssl, &conf), 0);
  2834. /* test with empty password or unitialized password key (depending on use_opaque_arg) */
  2835. ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
  2836. pwd_len = strlen(ECJPAKE_TEST_PWD);
  2837. memcpy(pwd_string, ECJPAKE_TEST_PWD, pwd_len);
  2838. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  2839. if (use_opaque_arg) {
  2840. psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
  2841. psa_key_attributes_t check_attributes = PSA_KEY_ATTRIBUTES_INIT;
  2842. /* First try with an invalid usage */
  2843. psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_HASH);
  2844. psa_set_key_algorithm(&attributes, PSA_ALG_JPAKE);
  2845. psa_set_key_type(&attributes, PSA_KEY_TYPE_PASSWORD);
  2846. PSA_ASSERT(psa_import_key(&attributes, pwd_string,
  2847. pwd_len, &pwd_slot));
  2848. ECJPAKE_TEST_SET_PASSWORD(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED);
  2849. /* check that the opaque key is still valid after failure */
  2850. TEST_EQUAL(psa_get_key_attributes(pwd_slot, &check_attributes),
  2851. PSA_SUCCESS);
  2852. psa_destroy_key(pwd_slot);
  2853. /* Then set the correct usage */
  2854. psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DERIVE);
  2855. PSA_ASSERT(psa_import_key(&attributes, pwd_string,
  2856. pwd_len, &pwd_slot));
  2857. }
  2858. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  2859. /* final check which should work without errors */
  2860. ECJPAKE_TEST_SET_PASSWORD(0);
  2861. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  2862. if (use_opaque_arg) {
  2863. psa_destroy_key(pwd_slot);
  2864. }
  2865. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  2866. mbedtls_ssl_free(&ssl);
  2867. mbedtls_ssl_config_free(&conf);
  2868. USE_PSA_DONE();
  2869. }
  2870. /* END_CASE */
  2871. /* BEGIN_CASE */
  2872. void elliptic_curve_get_properties()
  2873. {
  2874. psa_ecc_family_t psa_family;
  2875. size_t psa_bits;
  2876. USE_PSA_INIT();
  2877. #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_521)
  2878. TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
  2879. #else
  2880. TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
  2881. #endif
  2882. #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
  2883. TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
  2884. #else
  2885. TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
  2886. #endif
  2887. #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_384)
  2888. TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
  2889. #else
  2890. TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
  2891. #endif
  2892. #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
  2893. TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
  2894. #else
  2895. TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
  2896. #endif
  2897. #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_256)
  2898. TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
  2899. #else
  2900. TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
  2901. #endif
  2902. #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_256)
  2903. TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
  2904. #else
  2905. TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
  2906. #endif
  2907. #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
  2908. TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
  2909. #else
  2910. TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
  2911. #endif
  2912. #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_224)
  2913. TEST_AVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
  2914. #else
  2915. TEST_UNAVAILABLE_ECC(21, MBEDTLS_ECP_DP_SECP224R1, PSA_ECC_FAMILY_SECP_R1, 224);
  2916. #endif
  2917. #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_224)
  2918. TEST_AVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
  2919. #else
  2920. TEST_UNAVAILABLE_ECC(20, MBEDTLS_ECP_DP_SECP224K1, PSA_ECC_FAMILY_SECP_K1, 224);
  2921. #endif
  2922. #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_192)
  2923. TEST_AVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
  2924. #else
  2925. TEST_UNAVAILABLE_ECC(19, MBEDTLS_ECP_DP_SECP192R1, PSA_ECC_FAMILY_SECP_R1, 192);
  2926. #endif
  2927. #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_192)
  2928. TEST_AVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
  2929. #else
  2930. TEST_UNAVAILABLE_ECC(18, MBEDTLS_ECP_DP_SECP192K1, PSA_ECC_FAMILY_SECP_K1, 192);
  2931. #endif
  2932. #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_255)
  2933. TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
  2934. #else
  2935. TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
  2936. #endif
  2937. #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_448)
  2938. TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
  2939. #else
  2940. TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
  2941. #endif
  2942. USE_PSA_DONE();
  2943. }
  2944. /* END_CASE */