openssl.c 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462
  1. /*
  2. * Copyright (c) 2016 DeNA Co., Ltd., Kazuho Oku
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to
  6. * deal in the Software without restriction, including without limitation the
  7. * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. * sell copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. * IN THE SOFTWARE.
  21. */
  22. #ifdef _WINDOWS
  23. #include "wincompat.h"
  24. #else
  25. #include <unistd.h>
  26. #endif
  27. #include <assert.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #define OPENSSL_API_COMPAT 0x00908000L
  32. #include <openssl/bn.h>
  33. #include <openssl/crypto.h>
  34. #ifdef OPENSSL_IS_BORINGSSL
  35. #include <openssl/curve25519.h>
  36. #include <openssl/chacha.h>
  37. #include <openssl/poly1305.h>
  38. #endif
  39. #include <openssl/ec.h>
  40. #include <openssl/ecdh.h>
  41. #include <openssl/err.h>
  42. #include <openssl/evp.h>
  43. #include <openssl/objects.h>
  44. #include <openssl/rand.h>
  45. #include <openssl/rsa.h>
  46. #include <openssl/x509.h>
  47. #include <openssl/x509v3.h>
  48. #include <openssl/x509_vfy.h>
  49. #include "picotls.h"
  50. #include "picotls/openssl.h"
  51. #ifdef OPENSSL_IS_BORINGSSL
  52. #include "./chacha20poly1305.h"
  53. #endif
  54. #if PTLS_OPENSSL_HAVE_X25519MLKEM768
  55. #include <openssl/mlkem.h>
  56. #endif
  57. #ifdef PTLS_HAVE_AEGIS
  58. #include "./libaegis.h"
  59. #endif
  60. #ifdef _WINDOWS
  61. #ifndef _CRT_SECURE_NO_WARNINGS
  62. #define _CRT_SECURE_NO_WARNINGS
  63. #endif
  64. #pragma warning(disable : 4996)
  65. #endif
  66. #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
  67. #define OPENSSL_1_1_API 1
  68. #elif defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
  69. #define OPENSSL_1_1_API 1
  70. #else
  71. #define OPENSSL_1_1_API 0
  72. #endif
  73. #if !OPENSSL_1_1_API
  74. #define EVP_PKEY_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_EVP_PKEY)
  75. #define X509_STORE_up_ref(p) CRYPTO_add(&(p)->references, 1, CRYPTO_LOCK_X509_STORE)
  76. #define X509_STORE_get0_param(p) ((p)->param)
  77. static HMAC_CTX *HMAC_CTX_new(void)
  78. {
  79. HMAC_CTX *ctx;
  80. if ((ctx = OPENSSL_malloc(sizeof(*ctx))) == NULL)
  81. return NULL;
  82. HMAC_CTX_init(ctx);
  83. return ctx;
  84. }
  85. static void HMAC_CTX_free(HMAC_CTX *ctx)
  86. {
  87. HMAC_CTX_cleanup(ctx);
  88. OPENSSL_free(ctx);
  89. }
  90. static int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)
  91. {
  92. return EVP_CIPHER_CTX_cleanup(ctx);
  93. }
  94. #endif
  95. static const ptls_openssl_signature_scheme_t rsa_signature_schemes[] = {{PTLS_SIGNATURE_RSA_PSS_RSAE_SHA256, EVP_sha256},
  96. {PTLS_SIGNATURE_RSA_PSS_RSAE_SHA384, EVP_sha384},
  97. {PTLS_SIGNATURE_RSA_PSS_RSAE_SHA512, EVP_sha512},
  98. {UINT16_MAX, NULL}};
  99. static const ptls_openssl_signature_scheme_t secp256r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP256R1_SHA256, EVP_sha256},
  100. {UINT16_MAX, NULL}};
  101. #if PTLS_OPENSSL_HAVE_SECP384R1
  102. static const ptls_openssl_signature_scheme_t secp384r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP384R1_SHA384, EVP_sha384},
  103. {UINT16_MAX, NULL}};
  104. #endif
  105. #if PTLS_OPENSSL_HAVE_SECP521R1
  106. static const ptls_openssl_signature_scheme_t secp521r1_signature_schemes[] = {{PTLS_SIGNATURE_ECDSA_SECP521R1_SHA512, EVP_sha512},
  107. {UINT16_MAX, NULL}};
  108. #endif
  109. #if PTLS_OPENSSL_HAVE_ED25519
  110. static const ptls_openssl_signature_scheme_t ed25519_signature_schemes[] = {{PTLS_SIGNATURE_ED25519, NULL}, {UINT16_MAX, NULL}};
  111. #endif
  112. /**
  113. * The default list sent in ClientHello.signature_algorithms. ECDSA certificates are preferred.
  114. */
  115. static const uint16_t default_signature_schemes[] = {
  116. #if PTLS_OPENSSL_HAVE_ED25519
  117. PTLS_SIGNATURE_ED25519,
  118. #endif
  119. PTLS_SIGNATURE_ECDSA_SECP256R1_SHA256,
  120. #if PTLS_OPENSSL_HAVE_SECP384R1
  121. PTLS_SIGNATURE_ECDSA_SECP384R1_SHA384,
  122. #endif
  123. #if PTLS_OPENSSL_HAVE_SECP521R1
  124. PTLS_SIGNATURE_ECDSA_SECP521R1_SHA512,
  125. #endif
  126. PTLS_SIGNATURE_RSA_PSS_RSAE_SHA512,
  127. PTLS_SIGNATURE_RSA_PSS_RSAE_SHA384,
  128. PTLS_SIGNATURE_RSA_PSS_RSAE_SHA256,
  129. UINT16_MAX};
  130. const ptls_openssl_signature_scheme_t *ptls_openssl_lookup_signature_schemes(EVP_PKEY *key)
  131. {
  132. const ptls_openssl_signature_scheme_t *schemes = NULL;
  133. switch (EVP_PKEY_id(key)) {
  134. case EVP_PKEY_RSA:
  135. schemes = rsa_signature_schemes;
  136. break;
  137. case EVP_PKEY_EC: {
  138. EC_KEY *eckey = EVP_PKEY_get1_EC_KEY(key);
  139. switch (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey))) {
  140. case NID_X9_62_prime256v1:
  141. schemes = secp256r1_signature_schemes;
  142. break;
  143. #if PTLS_OPENSSL_HAVE_SECP384R1
  144. case NID_secp384r1:
  145. schemes = secp384r1_signature_schemes;
  146. break;
  147. #endif
  148. #if PTLS_OPENSSL_HAVE_SECP521R1
  149. case NID_secp521r1:
  150. schemes = secp521r1_signature_schemes;
  151. break;
  152. #endif
  153. default:
  154. break;
  155. }
  156. EC_KEY_free(eckey);
  157. } break;
  158. #if PTLS_OPENSSL_HAVE_ED25519
  159. case EVP_PKEY_ED25519:
  160. schemes = ed25519_signature_schemes;
  161. break;
  162. #endif
  163. default:
  164. break;
  165. }
  166. return schemes;
  167. }
  168. const ptls_openssl_signature_scheme_t *ptls_openssl_select_signature_scheme(const ptls_openssl_signature_scheme_t *available,
  169. const uint16_t *algorithms, size_t num_algorithms)
  170. {
  171. const ptls_openssl_signature_scheme_t *scheme;
  172. /* select the algorithm, driven by server-isde preference of `available` */
  173. for (scheme = available; scheme->scheme_id != UINT16_MAX; ++scheme)
  174. for (size_t i = 0; i != num_algorithms; ++i)
  175. if (algorithms[i] == scheme->scheme_id)
  176. return scheme;
  177. return NULL;
  178. }
  179. void ptls_openssl_random_bytes(void *buf, size_t len)
  180. {
  181. int ret = RAND_bytes(buf, (int)len);
  182. if (ret != 1) {
  183. fprintf(stderr, "RAND_bytes() failed with code: %d\n", ret);
  184. abort();
  185. }
  186. }
  187. static EC_KEY *ecdh_generate_key(EC_GROUP *group)
  188. {
  189. EC_KEY *key;
  190. if ((key = EC_KEY_new()) == NULL)
  191. return NULL;
  192. if (!EC_KEY_set_group(key, group) || !EC_KEY_generate_key(key)) {
  193. EC_KEY_free(key);
  194. return NULL;
  195. }
  196. return key;
  197. }
  198. static int ecdh_calc_secret(ptls_iovec_t *out, const EC_GROUP *group, EC_KEY *privkey, EC_POINT *peer_point)
  199. {
  200. ptls_iovec_t secret;
  201. int ret;
  202. secret.len = (EC_GROUP_get_degree(group) + 7) / 8;
  203. if ((secret.base = malloc(secret.len)) == NULL) {
  204. ret = PTLS_ERROR_NO_MEMORY;
  205. goto Exit;
  206. }
  207. if (ECDH_compute_key(secret.base, secret.len, peer_point, privkey, NULL) <= 0) {
  208. ret = PTLS_ALERT_HANDSHAKE_FAILURE; /* ??? */
  209. goto Exit;
  210. }
  211. ret = 0;
  212. Exit:
  213. if (ret == 0) {
  214. *out = secret;
  215. } else {
  216. free(secret.base);
  217. *out = (ptls_iovec_t){NULL};
  218. }
  219. return ret;
  220. }
  221. static EC_POINT *x9_62_decode_point(const EC_GROUP *group, ptls_iovec_t vec, BN_CTX *bn_ctx)
  222. {
  223. EC_POINT *point = NULL;
  224. if ((point = EC_POINT_new(group)) == NULL)
  225. return NULL;
  226. if (!EC_POINT_oct2point(group, point, vec.base, vec.len, bn_ctx)) {
  227. EC_POINT_free(point);
  228. return NULL;
  229. }
  230. return point;
  231. }
  232. static ptls_iovec_t x9_62_encode_point(const EC_GROUP *group, const EC_POINT *point, BN_CTX *bn_ctx)
  233. {
  234. ptls_iovec_t vec;
  235. if ((vec.len = EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, bn_ctx)) == 0)
  236. return (ptls_iovec_t){NULL};
  237. if ((vec.base = malloc(vec.len)) == NULL)
  238. return (ptls_iovec_t){NULL};
  239. if (EC_POINT_point2oct(group, point, POINT_CONVERSION_UNCOMPRESSED, vec.base, vec.len, bn_ctx) != vec.len) {
  240. free(vec.base);
  241. return (ptls_iovec_t){NULL};
  242. }
  243. return vec;
  244. }
  245. struct st_x9_62_keyex_context_t {
  246. ptls_key_exchange_context_t super;
  247. BN_CTX *bn_ctx;
  248. EC_KEY *privkey;
  249. };
  250. static void x9_62_free_context(struct st_x9_62_keyex_context_t *ctx)
  251. {
  252. free(ctx->super.pubkey.base);
  253. if (ctx->privkey != NULL)
  254. EC_KEY_free(ctx->privkey);
  255. if (ctx->bn_ctx != NULL)
  256. BN_CTX_free(ctx->bn_ctx);
  257. free(ctx);
  258. }
  259. static int x9_62_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret, ptls_iovec_t peerkey)
  260. {
  261. struct st_x9_62_keyex_context_t *ctx = (struct st_x9_62_keyex_context_t *)*_ctx;
  262. const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
  263. EC_POINT *peer_point = NULL;
  264. int ret;
  265. if (secret == NULL) {
  266. ret = 0;
  267. goto Exit;
  268. }
  269. if ((peer_point = x9_62_decode_point(group, peerkey, ctx->bn_ctx)) == NULL) {
  270. ret = PTLS_ALERT_DECODE_ERROR;
  271. goto Exit;
  272. }
  273. if ((ret = ecdh_calc_secret(secret, group, ctx->privkey, peer_point)) != 0)
  274. goto Exit;
  275. Exit:
  276. if (peer_point != NULL)
  277. EC_POINT_free(peer_point);
  278. if (release) {
  279. x9_62_free_context(ctx);
  280. *_ctx = NULL;
  281. }
  282. return ret;
  283. }
  284. static int x9_62_create_context(ptls_key_exchange_algorithm_t *algo, struct st_x9_62_keyex_context_t **ctx)
  285. {
  286. int ret;
  287. if ((*ctx = (struct st_x9_62_keyex_context_t *)malloc(sizeof(**ctx))) == NULL) {
  288. ret = PTLS_ERROR_NO_MEMORY;
  289. goto Exit;
  290. }
  291. **ctx = (struct st_x9_62_keyex_context_t){{algo, {NULL}, x9_62_on_exchange}};
  292. if (((*ctx)->bn_ctx = BN_CTX_new()) == NULL) {
  293. ret = PTLS_ERROR_NO_MEMORY;
  294. goto Exit;
  295. }
  296. ret = 0;
  297. Exit:
  298. if (ret != 0 && *ctx != NULL) {
  299. x9_62_free_context(*ctx);
  300. *ctx = NULL;
  301. }
  302. return ret;
  303. }
  304. static int x9_62_setup_pubkey(struct st_x9_62_keyex_context_t *ctx)
  305. {
  306. const EC_GROUP *group = EC_KEY_get0_group(ctx->privkey);
  307. const EC_POINT *pubkey = EC_KEY_get0_public_key(ctx->privkey);
  308. if ((ctx->super.pubkey = x9_62_encode_point(group, pubkey, ctx->bn_ctx)).base == NULL)
  309. return PTLS_ERROR_NO_MEMORY;
  310. return 0;
  311. }
  312. static int x9_62_create_key_exchange(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
  313. {
  314. EC_GROUP *group = NULL;
  315. struct st_x9_62_keyex_context_t *ctx = NULL;
  316. int ret;
  317. /* FIXME use a global? */
  318. if ((group = EC_GROUP_new_by_curve_name((int)algo->data)) == NULL) {
  319. ret = PTLS_ERROR_LIBRARY;
  320. goto Exit;
  321. }
  322. if ((ret = x9_62_create_context(algo, &ctx)) != 0)
  323. goto Exit;
  324. if ((ctx->privkey = ecdh_generate_key(group)) == NULL) {
  325. ret = PTLS_ERROR_LIBRARY;
  326. goto Exit;
  327. }
  328. if ((ret = x9_62_setup_pubkey(ctx)) != 0)
  329. goto Exit;
  330. ret = 0;
  331. Exit:
  332. if (group != NULL)
  333. EC_GROUP_free(group);
  334. if (ret == 0) {
  335. *_ctx = &ctx->super;
  336. } else {
  337. if (ctx != NULL)
  338. x9_62_free_context(ctx);
  339. *_ctx = NULL;
  340. }
  341. return ret;
  342. }
  343. static int x9_62_init_key(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx, EC_KEY *eckey)
  344. {
  345. struct st_x9_62_keyex_context_t *ctx = NULL;
  346. int ret;
  347. if ((ret = x9_62_create_context(algo, &ctx)) != 0)
  348. goto Exit;
  349. ctx->privkey = eckey;
  350. if ((ret = x9_62_setup_pubkey(ctx)) != 0)
  351. goto Exit;
  352. ret = 0;
  353. Exit:
  354. if (ret == 0) {
  355. *_ctx = &ctx->super;
  356. } else {
  357. if (ctx != NULL)
  358. x9_62_free_context(ctx);
  359. *_ctx = NULL;
  360. }
  361. return ret;
  362. }
  363. static int x9_62_key_exchange(EC_GROUP *group, ptls_iovec_t *pubkey, ptls_iovec_t *secret, ptls_iovec_t peerkey, BN_CTX *bn_ctx)
  364. {
  365. EC_POINT *peer_point = NULL;
  366. EC_KEY *privkey = NULL;
  367. int ret;
  368. *pubkey = (ptls_iovec_t){NULL};
  369. *secret = (ptls_iovec_t){NULL};
  370. /* decode peer key */
  371. if ((peer_point = x9_62_decode_point(group, peerkey, bn_ctx)) == NULL) {
  372. ret = PTLS_ALERT_DECODE_ERROR;
  373. goto Exit;
  374. }
  375. /* create private key */
  376. if ((privkey = ecdh_generate_key(group)) == NULL) {
  377. ret = PTLS_ERROR_NO_MEMORY;
  378. goto Exit;
  379. }
  380. /* encode public key */
  381. if ((*pubkey = x9_62_encode_point(group, EC_KEY_get0_public_key(privkey), bn_ctx)).base == NULL) {
  382. ret = PTLS_ERROR_NO_MEMORY;
  383. goto Exit;
  384. }
  385. /* allocate space for secret */
  386. secret->len = (EC_GROUP_get_degree(group) + 7) / 8;
  387. if ((secret->base = malloc(secret->len)) == NULL) {
  388. ret = PTLS_ERROR_NO_MEMORY;
  389. goto Exit;
  390. }
  391. /* calc secret */
  392. if (ECDH_compute_key(secret->base, secret->len, peer_point, privkey, NULL) <= 0) {
  393. ret = PTLS_ALERT_HANDSHAKE_FAILURE; /* ??? */
  394. goto Exit;
  395. }
  396. ret = 0;
  397. Exit:
  398. if (peer_point != NULL)
  399. EC_POINT_free(peer_point);
  400. if (privkey != NULL)
  401. EC_KEY_free(privkey);
  402. if (ret != 0) {
  403. free(pubkey->base);
  404. *pubkey = (ptls_iovec_t){NULL};
  405. free(secret->base);
  406. *secret = (ptls_iovec_t){NULL};
  407. }
  408. return ret;
  409. }
  410. static int secp_key_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *pubkey, ptls_iovec_t *secret, ptls_iovec_t peerkey)
  411. {
  412. EC_GROUP *group = NULL;
  413. BN_CTX *bn_ctx = NULL;
  414. int ret;
  415. if ((group = EC_GROUP_new_by_curve_name((int)algo->data)) == NULL) {
  416. ret = PTLS_ERROR_LIBRARY;
  417. goto Exit;
  418. }
  419. if ((bn_ctx = BN_CTX_new()) == NULL) {
  420. ret = PTLS_ERROR_NO_MEMORY;
  421. goto Exit;
  422. }
  423. ret = x9_62_key_exchange(group, pubkey, secret, peerkey, bn_ctx);
  424. Exit:
  425. if (bn_ctx != NULL)
  426. BN_CTX_free(bn_ctx);
  427. if (group != NULL)
  428. EC_GROUP_free(group);
  429. return ret;
  430. }
  431. #if PTLS_OPENSSL_HAVE_X25519
  432. struct st_evp_keyex_context_t {
  433. ptls_key_exchange_context_t super;
  434. EVP_PKEY *privkey;
  435. };
  436. static void evp_keyex_free(struct st_evp_keyex_context_t *ctx)
  437. {
  438. if (ctx->privkey != NULL)
  439. EVP_PKEY_free(ctx->privkey);
  440. if (ctx->super.pubkey.base != NULL)
  441. OPENSSL_free(ctx->super.pubkey.base);
  442. free(ctx);
  443. }
  444. static int evp_keyex_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret, ptls_iovec_t peerkey)
  445. {
  446. struct st_evp_keyex_context_t *ctx = (void *)*_ctx;
  447. EVP_PKEY *evppeer = NULL;
  448. EVP_PKEY_CTX *evpctx = NULL;
  449. int ret;
  450. if (secret == NULL) {
  451. ret = 0;
  452. goto Exit;
  453. }
  454. *secret = ptls_iovec_init(NULL, 0);
  455. if (peerkey.len != ctx->super.pubkey.len) {
  456. ret = PTLS_ALERT_DECRYPT_ERROR;
  457. goto Exit;
  458. }
  459. #ifdef OPENSSL_IS_BORINGSSL
  460. #define X25519_KEY_SIZE 32
  461. if (ctx->super.algo->id == PTLS_GROUP_X25519) {
  462. /* allocate memory to return secret */
  463. if ((secret->base = malloc(X25519_KEY_SIZE)) == NULL) {
  464. ret = PTLS_ERROR_NO_MEMORY;
  465. goto Exit;
  466. }
  467. secret->len = X25519_KEY_SIZE;
  468. /* fetch raw key and derive the secret */
  469. uint8_t sk_raw[X25519_KEY_SIZE];
  470. size_t sk_raw_len = sizeof(sk_raw);
  471. if (EVP_PKEY_get_raw_private_key(ctx->privkey, sk_raw, &sk_raw_len) != 1) {
  472. ret = PTLS_ERROR_LIBRARY;
  473. goto Exit;
  474. }
  475. assert(sk_raw_len == sizeof(sk_raw));
  476. X25519(secret->base, sk_raw, peerkey.base);
  477. ptls_clear_memory(sk_raw, sizeof(sk_raw));
  478. /* check bad key */
  479. static const uint8_t zeros[X25519_KEY_SIZE] = {0};
  480. if (ptls_mem_equal(secret->base, zeros, X25519_KEY_SIZE)) {
  481. ret = PTLS_ERROR_INCOMPATIBLE_KEY;
  482. goto Exit;
  483. }
  484. /* success */
  485. ret = 0;
  486. goto Exit;
  487. }
  488. #undef X25519_KEY_SIZE
  489. #endif
  490. if ((evppeer = EVP_PKEY_new()) == NULL) {
  491. ret = PTLS_ERROR_NO_MEMORY;
  492. goto Exit;
  493. }
  494. if (EVP_PKEY_copy_parameters(evppeer, ctx->privkey) <= 0) {
  495. ret = PTLS_ERROR_LIBRARY;
  496. goto Exit;
  497. }
  498. if (EVP_PKEY_set1_tls_encodedpoint(evppeer, peerkey.base, peerkey.len) <= 0) {
  499. ret = PTLS_ERROR_LIBRARY;
  500. goto Exit;
  501. }
  502. if ((evpctx = EVP_PKEY_CTX_new(ctx->privkey, NULL)) == NULL) {
  503. ret = PTLS_ERROR_LIBRARY;
  504. goto Exit;
  505. }
  506. if (EVP_PKEY_derive_init(evpctx) <= 0) {
  507. ret = PTLS_ERROR_LIBRARY;
  508. goto Exit;
  509. }
  510. if (EVP_PKEY_derive_set_peer(evpctx, evppeer) <= 0) {
  511. ret = PTLS_ERROR_LIBRARY;
  512. goto Exit;
  513. }
  514. if (EVP_PKEY_derive(evpctx, NULL, &secret->len) <= 0) {
  515. ret = PTLS_ERROR_LIBRARY;
  516. goto Exit;
  517. }
  518. if ((secret->base = malloc(secret->len)) == NULL) {
  519. ret = PTLS_ERROR_NO_MEMORY;
  520. goto Exit;
  521. }
  522. if (EVP_PKEY_derive(evpctx, secret->base, &secret->len) <= 0) {
  523. ret = PTLS_ERROR_LIBRARY;
  524. goto Exit;
  525. }
  526. ret = 0;
  527. Exit:
  528. if (evpctx != NULL)
  529. EVP_PKEY_CTX_free(evpctx);
  530. if (evppeer != NULL)
  531. EVP_PKEY_free(evppeer);
  532. if (ret != 0) {
  533. free(secret->base);
  534. *secret = ptls_iovec_init(NULL, 0);
  535. }
  536. if (release) {
  537. evp_keyex_free(ctx);
  538. *_ctx = NULL;
  539. }
  540. return ret;
  541. }
  542. /**
  543. * Upon success, ownership of `pkey` is transferred to the object being created. Otherwise, the refcount remains unchanged.
  544. */
  545. static int evp_keyex_init(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx, EVP_PKEY *pkey)
  546. {
  547. struct st_evp_keyex_context_t *ctx = NULL;
  548. int ret;
  549. /* instantiate */
  550. if ((ctx = malloc(sizeof(*ctx))) == NULL) {
  551. ret = PTLS_ERROR_NO_MEMORY;
  552. goto Exit;
  553. }
  554. *ctx = (struct st_evp_keyex_context_t){{algo, {NULL}, evp_keyex_on_exchange}, pkey};
  555. /* set public key */
  556. if ((ctx->super.pubkey.len = EVP_PKEY_get1_tls_encodedpoint(ctx->privkey, &ctx->super.pubkey.base)) == 0) {
  557. ctx->super.pubkey.base = NULL;
  558. ret = PTLS_ERROR_NO_MEMORY;
  559. goto Exit;
  560. }
  561. *_ctx = &ctx->super;
  562. ret = 0;
  563. Exit:
  564. if (ret != 0 && ctx != NULL) {
  565. ctx->privkey = NULL; /* do not decrement refcount of pkey in case of error */
  566. evp_keyex_free(ctx);
  567. }
  568. return ret;
  569. }
  570. static int evp_keyex_create(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **ctx)
  571. {
  572. EVP_PKEY_CTX *evpctx = NULL;
  573. EVP_PKEY *pkey = NULL;
  574. int ret;
  575. /* generate private key */
  576. if ((evpctx = EVP_PKEY_CTX_new_id((int)algo->data, NULL)) == NULL) {
  577. ret = PTLS_ERROR_LIBRARY;
  578. goto Exit;
  579. }
  580. if (EVP_PKEY_keygen_init(evpctx) <= 0) {
  581. ret = PTLS_ERROR_LIBRARY;
  582. goto Exit;
  583. }
  584. if (EVP_PKEY_keygen(evpctx, &pkey) <= 0) {
  585. ret = PTLS_ERROR_LIBRARY;
  586. goto Exit;
  587. }
  588. /* setup */
  589. if ((ret = evp_keyex_init(algo, ctx, pkey)) != 0)
  590. goto Exit;
  591. pkey = NULL;
  592. ret = 0;
  593. Exit:
  594. if (pkey != NULL)
  595. EVP_PKEY_free(pkey);
  596. if (evpctx != NULL)
  597. EVP_PKEY_CTX_free(evpctx);
  598. return ret;
  599. }
  600. static int evp_keyex_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *outpubkey, ptls_iovec_t *secret,
  601. ptls_iovec_t peerkey)
  602. {
  603. ptls_key_exchange_context_t *ctx = NULL;
  604. int ret;
  605. *outpubkey = ptls_iovec_init(NULL, 0);
  606. if ((ret = evp_keyex_create(algo, &ctx)) != 0)
  607. goto Exit;
  608. if ((outpubkey->base = malloc(ctx->pubkey.len)) == NULL) {
  609. ret = PTLS_ERROR_NO_MEMORY;
  610. goto Exit;
  611. }
  612. memcpy(outpubkey->base, ctx->pubkey.base, ctx->pubkey.len);
  613. outpubkey->len = ctx->pubkey.len;
  614. ret = evp_keyex_on_exchange(&ctx, 1, secret, peerkey);
  615. assert(ctx == NULL);
  616. Exit:
  617. if (ctx != NULL)
  618. evp_keyex_on_exchange(&ctx, 1, NULL, ptls_iovec_init(NULL, 0));
  619. if (ret != 0) {
  620. free(outpubkey->base);
  621. *outpubkey = ptls_iovec_init(NULL, 0);
  622. }
  623. return ret;
  624. }
  625. #endif
  626. #if PTLS_OPENSSL_HAVE_X25519MLKEM768
  627. struct st_x25519mlkem768_context_t {
  628. ptls_key_exchange_context_t super;
  629. uint8_t pubkey[MLKEM768_PUBLIC_KEY_BYTES + X25519_PUBLIC_VALUE_LEN];
  630. struct {
  631. uint8_t x25519[X25519_PRIVATE_KEY_LEN];
  632. struct MLKEM768_private_key mlkem;
  633. } privkey;
  634. };
  635. static int x25519mlkem768_on_exchange(ptls_key_exchange_context_t **_ctx, int release, ptls_iovec_t *secret,
  636. ptls_iovec_t ciphertext)
  637. {
  638. struct st_x25519mlkem768_context_t *ctx = (void *)*_ctx;
  639. int ret;
  640. if (secret == NULL) {
  641. ret = 0;
  642. goto Exit;
  643. }
  644. *secret = ptls_iovec_init(NULL, 0);
  645. /* validate length */
  646. if (ciphertext.len != MLKEM768_CIPHERTEXT_BYTES + X25519_PUBLIC_VALUE_LEN) {
  647. ret = PTLS_ALERT_DECRYPT_ERROR;
  648. goto Exit;
  649. }
  650. /* appsocate memory */
  651. secret->len = MLKEM_SHARED_SECRET_BYTES + X25519_SHARED_KEY_LEN;
  652. if ((secret->base = malloc(secret->len)) == NULL) {
  653. ret = PTLS_ERROR_NO_MEMORY;
  654. goto Exit;
  655. }
  656. /* run key exchange */
  657. if (!MLKEM768_decap(secret->base, ciphertext.base, MLKEM768_CIPHERTEXT_BYTES, &ctx->privkey.mlkem) ||
  658. !X25519(secret->base + MLKEM_SHARED_SECRET_BYTES, ctx->privkey.x25519, ciphertext.base + MLKEM768_CIPHERTEXT_BYTES)) {
  659. ret = PTLS_ALERT_ILLEGAL_PARAMETER;
  660. goto Exit;
  661. }
  662. ret = 0;
  663. Exit:
  664. if (secret != NULL && ret != 0) {
  665. free(secret->base);
  666. *secret = ptls_iovec_init(NULL, 0);
  667. }
  668. if (release) {
  669. ptls_clear_memory(&ctx->privkey, sizeof(ctx->privkey));
  670. free(ctx);
  671. *_ctx = NULL;
  672. }
  673. return ret;
  674. }
  675. static int x25519mlkem768_create(ptls_key_exchange_algorithm_t *algo, ptls_key_exchange_context_t **_ctx)
  676. {
  677. struct st_x25519mlkem768_context_t *ctx = NULL;
  678. if ((ctx = malloc(sizeof(*ctx))) == NULL)
  679. return PTLS_ERROR_NO_MEMORY;
  680. ctx->super = (ptls_key_exchange_context_t){algo, ptls_iovec_init(ctx->pubkey, sizeof(ctx->pubkey)), x25519mlkem768_on_exchange};
  681. MLKEM768_generate_key(ctx->pubkey, NULL, &ctx->privkey.mlkem);
  682. X25519_keypair(ctx->pubkey + MLKEM768_PUBLIC_KEY_BYTES, ctx->privkey.x25519);
  683. *_ctx = &ctx->super;
  684. return 0;
  685. }
  686. static int x25519mlkem768_exchange(ptls_key_exchange_algorithm_t *algo, ptls_iovec_t *ciphertext, ptls_iovec_t *secret,
  687. ptls_iovec_t peerkey)
  688. {
  689. struct {
  690. CBS cbs;
  691. struct MLKEM768_public_key key;
  692. } mlkem_peer;
  693. uint8_t x25519_privkey[X25519_PRIVATE_KEY_LEN];
  694. int ret;
  695. *ciphertext = ptls_iovec_init(NULL, 0);
  696. *secret = ptls_iovec_init(NULL, 0);
  697. /* validate input length */
  698. if (peerkey.len != MLKEM768_PUBLIC_KEY_BYTES + X25519_PUBLIC_VALUE_LEN) {
  699. ret = PTLS_ALERT_DECODE_ERROR;
  700. goto Exit;
  701. }
  702. /* allocate memory */
  703. ciphertext->len = MLKEM768_CIPHERTEXT_BYTES + X25519_PUBLIC_VALUE_LEN;
  704. if ((ciphertext->base = malloc(ciphertext->len)) == NULL) {
  705. ret = PTLS_ERROR_NO_MEMORY;
  706. goto Exit;
  707. }
  708. secret->len = MLKEM_SHARED_SECRET_BYTES + X25519_SHARED_KEY_LEN;
  709. if ((secret->base = malloc(secret->len)) == NULL) {
  710. ret = PTLS_ERROR_NO_MEMORY;
  711. goto Exit;
  712. }
  713. /* run key exchange */
  714. CBS_init(&mlkem_peer.cbs, peerkey.base, MLKEM768_PUBLIC_KEY_BYTES);
  715. X25519_keypair(ciphertext->base + MLKEM768_CIPHERTEXT_BYTES, x25519_privkey);
  716. if (!MLKEM768_parse_public_key(&mlkem_peer.key, &mlkem_peer.cbs) ||
  717. !X25519(secret->base + MLKEM_SHARED_SECRET_BYTES, x25519_privkey, peerkey.base + MLKEM768_PUBLIC_KEY_BYTES)) {
  718. ret = PTLS_ALERT_ILLEGAL_PARAMETER;
  719. goto Exit;
  720. }
  721. MLKEM768_encap(ciphertext->base, secret->base, &mlkem_peer.key);
  722. ret = 0;
  723. Exit:
  724. if (ret != 0) {
  725. free(ciphertext->base);
  726. *ciphertext = ptls_iovec_init(NULL, 0);
  727. free(secret->base);
  728. *secret = ptls_iovec_init(NULL, 0);
  729. }
  730. ptls_clear_memory(&x25519_privkey, sizeof(x25519_privkey));
  731. return ret;
  732. }
  733. #endif
  734. int ptls_openssl_create_key_exchange(ptls_key_exchange_context_t **ctx, EVP_PKEY *pkey)
  735. {
  736. int ret, id;
  737. switch (id = EVP_PKEY_id(pkey)) {
  738. case EVP_PKEY_EC: {
  739. /* obtain eckey */
  740. EC_KEY *eckey = EVP_PKEY_get1_EC_KEY(pkey);
  741. /* determine algo */
  742. ptls_key_exchange_algorithm_t *algo;
  743. switch (EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey))) {
  744. case NID_X9_62_prime256v1:
  745. algo = &ptls_openssl_secp256r1;
  746. break;
  747. #if PTLS_OPENSSL_HAVE_SECP384R1
  748. case NID_secp384r1:
  749. algo = &ptls_openssl_secp384r1;
  750. break;
  751. #endif
  752. #if PTLS_OPENSSL_HAVE_SECP521R1
  753. case NID_secp521r1:
  754. algo = &ptls_openssl_secp521r1;
  755. break;
  756. #endif
  757. default:
  758. EC_KEY_free(eckey);
  759. return PTLS_ERROR_INCOMPATIBLE_KEY;
  760. }
  761. /* load key */
  762. if ((ret = x9_62_init_key(algo, ctx, eckey)) != 0) {
  763. EC_KEY_free(eckey);
  764. return ret;
  765. }
  766. return 0;
  767. } break;
  768. #if PTLS_OPENSSL_HAVE_X25519
  769. case NID_X25519:
  770. if ((ret = evp_keyex_init(&ptls_openssl_x25519, ctx, pkey)) != 0)
  771. return ret;
  772. EVP_PKEY_up_ref(pkey);
  773. return 0;
  774. #endif
  775. default:
  776. return PTLS_ERROR_INCOMPATIBLE_KEY;
  777. }
  778. }
  779. #if PTLS_OPENSSL_HAVE_ASYNC
  780. struct async_sign_ctx {
  781. ptls_async_job_t super;
  782. const ptls_openssl_signature_scheme_t *scheme;
  783. EVP_MD_CTX *ctx;
  784. ASYNC_WAIT_CTX *waitctx;
  785. ASYNC_JOB *job;
  786. size_t siglen;
  787. uint8_t sig[0]; // must be last, see `async_sign_ctx_new`
  788. };
  789. static void async_sign_ctx_free(ptls_async_job_t *_self)
  790. {
  791. struct async_sign_ctx *self = (void *)_self;
  792. /* Once the async operation is complete, the user might call `ptls_free` instead of `ptls_handshake`. In such case, to avoid
  793. * desynchronization, let the backend read the result from the socket. The code below is a loop, but it is not going to block;
  794. * it is the responsibility of the user to refrain from calling `ptls_free` until the asynchronous operation is complete. */
  795. if (self->job != NULL) {
  796. int ret;
  797. while (ASYNC_start_job(&self->job, self->waitctx, &ret, NULL, NULL, 0) == ASYNC_PAUSE)
  798. ;
  799. }
  800. EVP_MD_CTX_destroy(self->ctx);
  801. ASYNC_WAIT_CTX_free(self->waitctx);
  802. free(self);
  803. }
  804. int async_sign_ctx_get_fd(ptls_async_job_t *_self)
  805. {
  806. struct async_sign_ctx *self = (void *)_self;
  807. OSSL_ASYNC_FD fds[1];
  808. size_t numfds;
  809. ASYNC_WAIT_CTX_get_all_fds(self->waitctx, NULL, &numfds);
  810. assert(numfds == 1);
  811. ASYNC_WAIT_CTX_get_all_fds(self->waitctx, fds, &numfds);
  812. return (int)fds[0];
  813. }
  814. static ptls_async_job_t *async_sign_ctx_new(const ptls_openssl_signature_scheme_t *scheme, EVP_MD_CTX *ctx, size_t siglen)
  815. {
  816. struct async_sign_ctx *self;
  817. if ((self = malloc(offsetof(struct async_sign_ctx, sig) + siglen)) == NULL)
  818. return NULL;
  819. self->super = (ptls_async_job_t){async_sign_ctx_free, async_sign_ctx_get_fd};
  820. self->scheme = scheme;
  821. self->ctx = ctx;
  822. self->waitctx = ASYNC_WAIT_CTX_new();
  823. self->job = NULL;
  824. self->siglen = siglen;
  825. memset(self->sig, 0, siglen);
  826. return &self->super;
  827. }
  828. static int do_sign_async_job(void *_async)
  829. {
  830. struct async_sign_ctx *async = *(struct async_sign_ctx **)_async;
  831. return EVP_DigestSignFinal(async->ctx, async->sig, &async->siglen);
  832. }
  833. static int do_sign_async(ptls_buffer_t *outbuf, ptls_async_job_t **_async)
  834. {
  835. struct async_sign_ctx *async = (void *)*_async;
  836. int ret;
  837. switch (ASYNC_start_job(&async->job, async->waitctx, &ret, do_sign_async_job, &async, sizeof(async))) {
  838. case ASYNC_PAUSE:
  839. return PTLS_ERROR_ASYNC_OPERATION; // async operation inflight; bail out without getting rid of async context
  840. case ASYNC_ERR:
  841. ret = PTLS_ERROR_LIBRARY;
  842. break;
  843. case ASYNC_NO_JOBS:
  844. ret = PTLS_ERROR_LIBRARY;
  845. break;
  846. case ASYNC_FINISH:
  847. async->job = NULL;
  848. ptls_buffer_pushv(outbuf, async->sig, async->siglen);
  849. ret = 0;
  850. break;
  851. default:
  852. ret = PTLS_ERROR_LIBRARY;
  853. break;
  854. }
  855. Exit:
  856. async_sign_ctx_free(&async->super);
  857. *_async = NULL;
  858. return ret;
  859. }
  860. #endif
  861. static int do_sign(EVP_PKEY *key, const ptls_openssl_signature_scheme_t *scheme, ptls_buffer_t *outbuf, ptls_iovec_t input,
  862. ptls_async_job_t **async)
  863. {
  864. EVP_MD_CTX *ctx = NULL;
  865. const EVP_MD *md = scheme->scheme_md != NULL ? scheme->scheme_md() : NULL;
  866. EVP_PKEY_CTX *pkey_ctx;
  867. size_t siglen;
  868. int ret;
  869. if ((ctx = EVP_MD_CTX_create()) == NULL) {
  870. ret = PTLS_ERROR_NO_MEMORY;
  871. goto Exit;
  872. }
  873. if (EVP_DigestSignInit(ctx, &pkey_ctx, md, NULL, key) != 1) {
  874. ret = PTLS_ERROR_LIBRARY;
  875. goto Exit;
  876. }
  877. #if PTLS_OPENSSL_HAVE_ED25519
  878. if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
  879. /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
  880. if (EVP_DigestSign(ctx, NULL, &siglen, input.base, input.len) != 1) {
  881. ret = PTLS_ERROR_LIBRARY;
  882. goto Exit;
  883. }
  884. if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
  885. goto Exit;
  886. if (EVP_DigestSign(ctx, outbuf->base + outbuf->off, &siglen, input.base, input.len) != 1) {
  887. ret = PTLS_ERROR_LIBRARY;
  888. goto Exit;
  889. }
  890. } else
  891. #endif
  892. {
  893. if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
  894. if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
  895. ret = PTLS_ERROR_LIBRARY;
  896. goto Exit;
  897. }
  898. if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
  899. ret = PTLS_ERROR_LIBRARY;
  900. goto Exit;
  901. }
  902. if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, md) != 1) {
  903. ret = PTLS_ERROR_LIBRARY;
  904. goto Exit;
  905. }
  906. }
  907. if (EVP_DigestSignUpdate(ctx, input.base, input.len) != 1) {
  908. ret = PTLS_ERROR_LIBRARY;
  909. goto Exit;
  910. }
  911. if (EVP_DigestSignFinal(ctx, NULL, &siglen) != 1) {
  912. ret = PTLS_ERROR_LIBRARY;
  913. goto Exit;
  914. }
  915. /* If permitted by the caller (by providing a non-NULL `async` slot), use the asynchronous signing method and return
  916. * immediately. */
  917. #if PTLS_OPENSSL_HAVE_ASYNC
  918. if (async != NULL) {
  919. if ((*async = async_sign_ctx_new(scheme, ctx, siglen)) == NULL) {
  920. ret = PTLS_ERROR_NO_MEMORY;
  921. goto Exit;
  922. }
  923. return do_sign_async(outbuf, async);
  924. }
  925. #endif
  926. /* Otherwise, generate signature synchronously. */
  927. if ((ret = ptls_buffer_reserve(outbuf, siglen)) != 0)
  928. goto Exit;
  929. if (EVP_DigestSignFinal(ctx, outbuf->base + outbuf->off, &siglen) != 1) {
  930. ret = PTLS_ERROR_LIBRARY;
  931. goto Exit;
  932. }
  933. }
  934. outbuf->off += siglen;
  935. ret = 0;
  936. Exit:
  937. if (ctx != NULL)
  938. EVP_MD_CTX_destroy(ctx);
  939. return ret;
  940. }
  941. struct cipher_context_t {
  942. ptls_cipher_context_t super;
  943. EVP_CIPHER_CTX *evp;
  944. };
  945. static void cipher_dispose(ptls_cipher_context_t *_ctx)
  946. {
  947. struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
  948. EVP_CIPHER_CTX_free(ctx->evp);
  949. }
  950. static void cipher_do_init(ptls_cipher_context_t *_ctx, const void *iv)
  951. {
  952. struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
  953. int ret;
  954. ret = EVP_EncryptInit_ex(ctx->evp, NULL, NULL, NULL, iv);
  955. assert(ret);
  956. }
  957. static int cipher_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key, const EVP_CIPHER *cipher,
  958. void (*do_transform)(ptls_cipher_context_t *, void *, const void *, size_t))
  959. {
  960. struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
  961. ctx->super.do_dispose = cipher_dispose;
  962. ctx->super.do_init = cipher_do_init;
  963. ctx->super.do_transform = do_transform;
  964. if ((ctx->evp = EVP_CIPHER_CTX_new()) == NULL)
  965. return PTLS_ERROR_NO_MEMORY;
  966. if (is_enc) {
  967. if (!EVP_EncryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
  968. goto Error;
  969. } else {
  970. if (!EVP_DecryptInit_ex(ctx->evp, cipher, NULL, key, NULL))
  971. goto Error;
  972. EVP_CIPHER_CTX_set_padding(ctx->evp, 0); /* required to disable one block buffering in ECB mode */
  973. }
  974. return 0;
  975. Error:
  976. EVP_CIPHER_CTX_free(ctx->evp);
  977. return PTLS_ERROR_LIBRARY;
  978. }
  979. static void cipher_encrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
  980. {
  981. struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
  982. int len = (int)_len, ret = EVP_EncryptUpdate(ctx->evp, output, &len, input, len);
  983. assert(ret);
  984. assert(len == (int)_len);
  985. }
  986. static void cipher_decrypt(ptls_cipher_context_t *_ctx, void *output, const void *input, size_t _len)
  987. {
  988. struct cipher_context_t *ctx = (struct cipher_context_t *)_ctx;
  989. int len = (int)_len, ret = EVP_DecryptUpdate(ctx->evp, output, &len, input, len);
  990. assert(ret);
  991. assert(len == (int)_len);
  992. }
  993. static int aes128ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  994. {
  995. return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_128_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
  996. }
  997. static int aes256ecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  998. {
  999. return cipher_setup_crypto(ctx, is_enc, key, EVP_aes_256_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
  1000. }
  1001. static int aes128ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  1002. {
  1003. return cipher_setup_crypto(ctx, 1, key, EVP_aes_128_ctr(), cipher_encrypt);
  1004. }
  1005. static int aes256ctr_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  1006. {
  1007. return cipher_setup_crypto(ctx, 1, key, EVP_aes_256_ctr(), cipher_encrypt);
  1008. }
  1009. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  1010. #ifdef OPENSSL_IS_BORINGSSL
  1011. struct boringssl_chacha20_context_t {
  1012. ptls_cipher_context_t super;
  1013. uint8_t key[PTLS_CHACHA20_KEY_SIZE];
  1014. uint8_t iv[12];
  1015. struct {
  1016. uint32_t ctr;
  1017. uint8_t bytes[64];
  1018. size_t len;
  1019. } keystream;
  1020. };
  1021. static void boringssl_chacha20_dispose(ptls_cipher_context_t *_ctx)
  1022. {
  1023. struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
  1024. ptls_clear_memory(ctx->key, sizeof(ctx->key));
  1025. ptls_clear_memory(ctx->iv, sizeof(ctx->iv));
  1026. ptls_clear_memory(ctx->keystream.bytes, sizeof(ctx->keystream.bytes));
  1027. }
  1028. static void boringssl_chacha20_init(ptls_cipher_context_t *_ctx, const void *_iv)
  1029. {
  1030. struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
  1031. const uint8_t *iv = _iv;
  1032. memcpy(ctx->iv, iv + 4, sizeof(ctx->iv));
  1033. ctx->keystream.ctr = iv[0] | ((uint32_t)iv[1] << 8) | ((uint32_t)iv[2] << 16) | ((uint32_t)iv[3] << 24);
  1034. ctx->keystream.len = 0;
  1035. }
  1036. static inline void boringssl_chacha20_transform_buffered(struct boringssl_chacha20_context_t *ctx, uint8_t **output,
  1037. const uint8_t **input, size_t *len)
  1038. {
  1039. size_t apply_len = *len < ctx->keystream.len ? *len : ctx->keystream.len;
  1040. const uint8_t *ks = ctx->keystream.bytes + sizeof(ctx->keystream.bytes) - ctx->keystream.len;
  1041. ctx->keystream.len -= apply_len;
  1042. *len -= apply_len;
  1043. for (size_t i = 0; i < apply_len; ++i)
  1044. *(*output)++ = *(*input)++ ^ *ks++;
  1045. }
  1046. static void boringssl_chacha20_transform(ptls_cipher_context_t *_ctx, void *_output, const void *_input, size_t len)
  1047. {
  1048. struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
  1049. uint8_t *output = _output;
  1050. const uint8_t *input = _input;
  1051. if (len == 0)
  1052. return;
  1053. if (ctx->keystream.len != 0) {
  1054. boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
  1055. if (len == 0)
  1056. return;
  1057. }
  1058. assert(ctx->keystream.len == 0);
  1059. if (len >= sizeof(ctx->keystream.bytes)) {
  1060. size_t blocks = len / CHACHA20POLY1305_BLOCKSIZE;
  1061. CRYPTO_chacha_20(output, input, blocks * CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv, ctx->keystream.ctr);
  1062. ctx->keystream.ctr += blocks;
  1063. output += blocks * CHACHA20POLY1305_BLOCKSIZE;
  1064. input += blocks * CHACHA20POLY1305_BLOCKSIZE;
  1065. len -= blocks * CHACHA20POLY1305_BLOCKSIZE;
  1066. if (len == 0)
  1067. return;
  1068. }
  1069. memset(ctx->keystream.bytes, 0, CHACHA20POLY1305_BLOCKSIZE);
  1070. CRYPTO_chacha_20(ctx->keystream.bytes, ctx->keystream.bytes, CHACHA20POLY1305_BLOCKSIZE, ctx->key, ctx->iv,
  1071. ctx->keystream.ctr++);
  1072. ctx->keystream.len = sizeof(ctx->keystream.bytes);
  1073. boringssl_chacha20_transform_buffered(ctx, &output, &input, &len);
  1074. assert(len == 0);
  1075. }
  1076. static int boringssl_chacha20_setup_crypto(ptls_cipher_context_t *_ctx, int is_enc, const void *key)
  1077. {
  1078. struct boringssl_chacha20_context_t *ctx = (struct boringssl_chacha20_context_t *)_ctx;
  1079. ctx->super.do_dispose = boringssl_chacha20_dispose;
  1080. ctx->super.do_init = boringssl_chacha20_init;
  1081. ctx->super.do_transform = boringssl_chacha20_transform;
  1082. memcpy(ctx->key, key, sizeof(ctx->key));
  1083. return 0;
  1084. }
  1085. #else
  1086. static int chacha20_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  1087. {
  1088. return cipher_setup_crypto(ctx, 1, key, EVP_chacha20(), cipher_encrypt);
  1089. }
  1090. #endif
  1091. #endif
  1092. #if PTLS_OPENSSL_HAVE_BF
  1093. static int bfecb_setup_crypto(ptls_cipher_context_t *ctx, int is_enc, const void *key)
  1094. {
  1095. return cipher_setup_crypto(ctx, is_enc, key, EVP_bf_ecb(), is_enc ? cipher_encrypt : cipher_decrypt);
  1096. }
  1097. #endif
  1098. struct aead_crypto_context_t {
  1099. ptls_aead_context_t super;
  1100. EVP_CIPHER_CTX *evp_ctx;
  1101. uint8_t static_iv[PTLS_MAX_IV_SIZE];
  1102. };
  1103. static void aead_dispose_crypto(ptls_aead_context_t *_ctx)
  1104. {
  1105. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1106. if (ctx->evp_ctx != NULL)
  1107. EVP_CIPHER_CTX_free(ctx->evp_ctx);
  1108. }
  1109. static void aead_get_iv(ptls_aead_context_t *_ctx, void *iv)
  1110. {
  1111. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1112. memcpy(iv, ctx->static_iv, ctx->super.algo->iv_size);
  1113. }
  1114. static void aead_set_iv(ptls_aead_context_t *_ctx, const void *iv)
  1115. {
  1116. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1117. memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
  1118. }
  1119. static void aead_do_encrypt_init(ptls_aead_context_t *_ctx, uint64_t seq, const void *aad, size_t aadlen)
  1120. {
  1121. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1122. uint8_t iv[PTLS_MAX_IV_SIZE];
  1123. int ret;
  1124. ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
  1125. ret = EVP_EncryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
  1126. assert(ret);
  1127. if (aadlen != 0) {
  1128. int blocklen;
  1129. ret = EVP_EncryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
  1130. assert(ret);
  1131. }
  1132. }
  1133. static size_t aead_do_encrypt_update(ptls_aead_context_t *_ctx, void *output, const void *input, size_t inlen)
  1134. {
  1135. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1136. int blocklen, ret;
  1137. ret = EVP_EncryptUpdate(ctx->evp_ctx, output, &blocklen, input, (int)inlen);
  1138. assert(ret);
  1139. return blocklen;
  1140. }
  1141. static size_t aead_do_encrypt_final(ptls_aead_context_t *_ctx, void *_output)
  1142. {
  1143. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1144. uint8_t *output = _output;
  1145. size_t off = 0, tag_size = ctx->super.algo->tag_size;
  1146. int blocklen, ret;
  1147. ret = EVP_EncryptFinal_ex(ctx->evp_ctx, output + off, &blocklen);
  1148. assert(ret);
  1149. off += blocklen;
  1150. ret = EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_GET_TAG, (int)tag_size, output + off);
  1151. assert(ret);
  1152. off += tag_size;
  1153. return off;
  1154. }
  1155. static size_t aead_do_decrypt(ptls_aead_context_t *_ctx, void *_output, const void *input, size_t inlen, uint64_t seq,
  1156. const void *aad, size_t aadlen)
  1157. {
  1158. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1159. uint8_t *output = _output, iv[PTLS_MAX_IV_SIZE];
  1160. size_t off = 0, tag_size = ctx->super.algo->tag_size;
  1161. int blocklen, ret;
  1162. if (inlen < tag_size)
  1163. return SIZE_MAX;
  1164. ptls_aead__build_iv(ctx->super.algo, iv, ctx->static_iv, seq);
  1165. ret = EVP_DecryptInit_ex(ctx->evp_ctx, NULL, NULL, NULL, iv);
  1166. assert(ret);
  1167. if (aadlen != 0) {
  1168. ret = EVP_DecryptUpdate(ctx->evp_ctx, NULL, &blocklen, aad, (int)aadlen);
  1169. assert(ret);
  1170. }
  1171. ret = EVP_DecryptUpdate(ctx->evp_ctx, output + off, &blocklen, input, (int)(inlen - tag_size));
  1172. assert(ret);
  1173. off += blocklen;
  1174. if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_TAG, (int)tag_size, (void *)((uint8_t *)input + inlen - tag_size)))
  1175. return SIZE_MAX;
  1176. if (!EVP_DecryptFinal_ex(ctx->evp_ctx, output + off, &blocklen))
  1177. return SIZE_MAX;
  1178. off += blocklen;
  1179. return off;
  1180. }
  1181. static int aead_setup_crypto(ptls_aead_context_t *_ctx, int is_enc, const void *key, const void *iv, const EVP_CIPHER *cipher)
  1182. {
  1183. struct aead_crypto_context_t *ctx = (struct aead_crypto_context_t *)_ctx;
  1184. int ret;
  1185. ctx->super.dispose_crypto = aead_dispose_crypto;
  1186. ctx->super.do_get_iv = aead_get_iv;
  1187. ctx->super.do_set_iv = aead_set_iv;
  1188. if (is_enc) {
  1189. ctx->super.do_encrypt_init = aead_do_encrypt_init;
  1190. ctx->super.do_encrypt_update = aead_do_encrypt_update;
  1191. ctx->super.do_encrypt_final = aead_do_encrypt_final;
  1192. ctx->super.do_encrypt = ptls_aead__do_encrypt;
  1193. ctx->super.do_encrypt_v = ptls_aead__do_encrypt_v;
  1194. ctx->super.do_decrypt = NULL;
  1195. } else {
  1196. ctx->super.do_encrypt_init = NULL;
  1197. ctx->super.do_encrypt_update = NULL;
  1198. ctx->super.do_encrypt_final = NULL;
  1199. ctx->super.do_encrypt = NULL;
  1200. ctx->super.do_encrypt_v = NULL;
  1201. ctx->super.do_decrypt = aead_do_decrypt;
  1202. }
  1203. ctx->evp_ctx = NULL;
  1204. if ((ctx->evp_ctx = EVP_CIPHER_CTX_new()) == NULL) {
  1205. ret = PTLS_ERROR_NO_MEMORY;
  1206. goto Error;
  1207. }
  1208. if (is_enc) {
  1209. if (!EVP_EncryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
  1210. ret = PTLS_ERROR_LIBRARY;
  1211. goto Error;
  1212. }
  1213. } else {
  1214. if (!EVP_DecryptInit_ex(ctx->evp_ctx, cipher, NULL, key, NULL)) {
  1215. ret = PTLS_ERROR_LIBRARY;
  1216. goto Error;
  1217. }
  1218. }
  1219. if (!EVP_CIPHER_CTX_ctrl(ctx->evp_ctx, EVP_CTRL_GCM_SET_IVLEN, (int)ctx->super.algo->iv_size, NULL)) {
  1220. ret = PTLS_ERROR_LIBRARY;
  1221. goto Error;
  1222. }
  1223. memcpy(ctx->static_iv, iv, ctx->super.algo->iv_size);
  1224. return 0;
  1225. Error:
  1226. aead_dispose_crypto(&ctx->super);
  1227. return ret;
  1228. }
  1229. static int aead_aes128gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
  1230. {
  1231. return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_128_gcm());
  1232. }
  1233. static int aead_aes256gcm_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
  1234. {
  1235. return aead_setup_crypto(ctx, is_enc, key, iv, EVP_aes_256_gcm());
  1236. }
  1237. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  1238. #ifdef OPENSSL_IS_BORINGSSL
  1239. struct boringssl_chacha20poly1305_context_t {
  1240. struct chacha20poly1305_context_t super;
  1241. poly1305_state poly1305;
  1242. };
  1243. static void boringssl_poly1305_init(struct chacha20poly1305_context_t *_ctx, const void *key)
  1244. {
  1245. struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
  1246. CRYPTO_poly1305_init(&ctx->poly1305, key);
  1247. }
  1248. static void boringssl_poly1305_update(struct chacha20poly1305_context_t *_ctx, const void *input, size_t len)
  1249. {
  1250. struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
  1251. CRYPTO_poly1305_update(&ctx->poly1305, input, len);
  1252. }
  1253. static void boringssl_poly1305_finish(struct chacha20poly1305_context_t *_ctx, void *tag)
  1254. {
  1255. struct boringssl_chacha20poly1305_context_t *ctx = (struct boringssl_chacha20poly1305_context_t *)_ctx;
  1256. CRYPTO_poly1305_finish(&ctx->poly1305, tag);
  1257. }
  1258. static int boringssl_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
  1259. {
  1260. return chacha20poly1305_setup_crypto(ctx, is_enc, key, iv, &ptls_openssl_chacha20, boringssl_poly1305_init,
  1261. boringssl_poly1305_update, boringssl_poly1305_finish);
  1262. }
  1263. #else
  1264. static int aead_chacha20poly1305_setup_crypto(ptls_aead_context_t *ctx, int is_enc, const void *key, const void *iv)
  1265. {
  1266. return aead_setup_crypto(ctx, is_enc, key, iv, EVP_chacha20_poly1305());
  1267. }
  1268. #endif
  1269. #endif
  1270. #define _sha256_final(ctx, md) SHA256_Final((md), (ctx))
  1271. ptls_define_hash(sha256, SHA256_CTX, SHA256_Init, SHA256_Update, _sha256_final);
  1272. #define _sha384_final(ctx, md) SHA384_Final((md), (ctx))
  1273. ptls_define_hash(sha384, SHA512_CTX, SHA384_Init, SHA384_Update, _sha384_final);
  1274. #define _sha512_final(ctx, md) SHA512_Final((md), (ctx))
  1275. ptls_define_hash(sha512, SHA512_CTX, SHA512_Init, SHA512_Update, _sha512_final);
  1276. static int sign_certificate(ptls_sign_certificate_t *_self, ptls_t *tls, ptls_async_job_t **async, uint16_t *selected_algorithm,
  1277. ptls_buffer_t *outbuf, ptls_iovec_t input, const uint16_t *algorithms, size_t num_algorithms)
  1278. {
  1279. ptls_openssl_sign_certificate_t *self = (ptls_openssl_sign_certificate_t *)_self;
  1280. const ptls_openssl_signature_scheme_t *scheme;
  1281. /* Just resume the asynchronous operation, if one is in flight. */
  1282. #if PTLS_OPENSSL_HAVE_ASYNC
  1283. if (async != NULL && *async != NULL) {
  1284. struct async_sign_ctx *sign_ctx = (struct async_sign_ctx *)(*async);
  1285. *selected_algorithm = sign_ctx->scheme->scheme_id;
  1286. return do_sign_async(outbuf, async);
  1287. }
  1288. #endif
  1289. /* Select the algorithm or return failure if none found. */
  1290. if ((scheme = ptls_openssl_select_signature_scheme(self->schemes, algorithms, num_algorithms)) == NULL)
  1291. return PTLS_ALERT_HANDSHAKE_FAILURE;
  1292. *selected_algorithm = scheme->scheme_id;
  1293. #if PTLS_OPENSSL_HAVE_ASYNC
  1294. if (!self->async && async != NULL) {
  1295. /* indicate to `do_sign` that async mode is disabled for this operation */
  1296. assert(*async == NULL);
  1297. async = NULL;
  1298. }
  1299. #endif
  1300. return do_sign(self->key, scheme, outbuf, input, async);
  1301. }
  1302. static X509 *to_x509(ptls_iovec_t vec)
  1303. {
  1304. const uint8_t *p = vec.base;
  1305. return d2i_X509(NULL, &p, (long)vec.len);
  1306. }
  1307. static int verify_sign(void *verify_ctx, uint16_t algo, ptls_iovec_t data, ptls_iovec_t signature)
  1308. {
  1309. EVP_PKEY *key = verify_ctx;
  1310. const ptls_openssl_signature_scheme_t *scheme;
  1311. EVP_MD_CTX *ctx = NULL;
  1312. EVP_PKEY_CTX *pkey_ctx = NULL;
  1313. int ret = 0;
  1314. if (data.base == NULL)
  1315. goto Exit;
  1316. if ((scheme = ptls_openssl_lookup_signature_schemes(key)) == NULL) {
  1317. ret = PTLS_ERROR_LIBRARY;
  1318. goto Exit;
  1319. }
  1320. for (; scheme->scheme_id != UINT16_MAX; ++scheme)
  1321. if (scheme->scheme_id == algo)
  1322. goto SchemeFound;
  1323. ret = PTLS_ALERT_ILLEGAL_PARAMETER;
  1324. goto Exit;
  1325. SchemeFound:
  1326. if ((ctx = EVP_MD_CTX_create()) == NULL) {
  1327. ret = PTLS_ERROR_NO_MEMORY;
  1328. goto Exit;
  1329. }
  1330. #if PTLS_OPENSSL_HAVE_ED25519
  1331. if (EVP_PKEY_id(key) == EVP_PKEY_ED25519) {
  1332. /* ED25519 requires the use of the all-at-once function that appeared in OpenSSL 1.1.1, hence different path */
  1333. if (EVP_DigestVerifyInit(ctx, &pkey_ctx, NULL, NULL, key) != 1) {
  1334. ret = PTLS_ERROR_LIBRARY;
  1335. goto Exit;
  1336. }
  1337. if (EVP_DigestVerify(ctx, signature.base, signature.len, data.base, data.len) != 1) {
  1338. ret = PTLS_ERROR_LIBRARY;
  1339. goto Exit;
  1340. }
  1341. } else
  1342. #endif
  1343. {
  1344. if (EVP_DigestVerifyInit(ctx, &pkey_ctx, scheme->scheme_md(), NULL, key) != 1) {
  1345. ret = PTLS_ERROR_LIBRARY;
  1346. goto Exit;
  1347. }
  1348. if (EVP_PKEY_id(key) == EVP_PKEY_RSA) {
  1349. if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) != 1) {
  1350. ret = PTLS_ERROR_LIBRARY;
  1351. goto Exit;
  1352. }
  1353. if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) != 1) {
  1354. ret = PTLS_ERROR_LIBRARY;
  1355. goto Exit;
  1356. }
  1357. if (EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, scheme->scheme_md()) != 1) {
  1358. ret = PTLS_ERROR_LIBRARY;
  1359. goto Exit;
  1360. }
  1361. }
  1362. if (EVP_DigestVerifyUpdate(ctx, data.base, data.len) != 1) {
  1363. ret = PTLS_ERROR_LIBRARY;
  1364. goto Exit;
  1365. }
  1366. if (EVP_DigestVerifyFinal(ctx, signature.base, signature.len) != 1) {
  1367. ret = PTLS_ALERT_DECRYPT_ERROR;
  1368. goto Exit;
  1369. }
  1370. }
  1371. ret = 0;
  1372. Exit:
  1373. if (ctx != NULL)
  1374. EVP_MD_CTX_destroy(ctx);
  1375. EVP_PKEY_free(key);
  1376. return ret;
  1377. }
  1378. int ptls_openssl_init_sign_certificate(ptls_openssl_sign_certificate_t *self, EVP_PKEY *key)
  1379. {
  1380. *self = (ptls_openssl_sign_certificate_t){.super = {sign_certificate}, .async = 0 /* libssl has it off by default too */};
  1381. if ((self->schemes = ptls_openssl_lookup_signature_schemes(key)) == NULL)
  1382. return PTLS_ERROR_INCOMPATIBLE_KEY;
  1383. EVP_PKEY_up_ref(key);
  1384. self->key = key;
  1385. return 0;
  1386. }
  1387. void ptls_openssl_dispose_sign_certificate(ptls_openssl_sign_certificate_t *self)
  1388. {
  1389. EVP_PKEY_free(self->key);
  1390. }
  1391. static int serialize_cert(X509 *cert, ptls_iovec_t *dst)
  1392. {
  1393. int len = i2d_X509(cert, NULL);
  1394. assert(len > 0);
  1395. if ((dst->base = malloc(len)) == NULL)
  1396. return PTLS_ERROR_NO_MEMORY;
  1397. unsigned char *p = dst->base;
  1398. dst->len = i2d_X509(cert, &p);
  1399. assert(len == dst->len);
  1400. return 0;
  1401. }
  1402. int ptls_openssl_load_certificates(ptls_context_t *ctx, X509 *cert, STACK_OF(X509) * chain)
  1403. {
  1404. ptls_iovec_t *list = NULL;
  1405. size_t slot = 0, count = (cert != NULL) + (chain != NULL ? sk_X509_num(chain) : 0);
  1406. int ret;
  1407. assert(ctx->certificates.list == NULL);
  1408. if ((list = malloc(sizeof(*list) * count)) == NULL) {
  1409. ret = PTLS_ERROR_NO_MEMORY;
  1410. goto Exit;
  1411. }
  1412. if (cert != NULL) {
  1413. if ((ret = serialize_cert(cert, list + slot++)) != 0)
  1414. goto Exit;
  1415. }
  1416. if (chain != NULL) {
  1417. int i;
  1418. for (i = 0; i != sk_X509_num(chain); ++i) {
  1419. if ((ret = serialize_cert(sk_X509_value(chain, i), list + slot++)) != 0)
  1420. goto Exit;
  1421. }
  1422. }
  1423. assert(slot == count);
  1424. ctx->certificates.list = list;
  1425. ctx->certificates.count = count;
  1426. ret = 0;
  1427. Exit:
  1428. if (ret != 0 && list != NULL) {
  1429. size_t i;
  1430. for (i = 0; i != slot; ++i)
  1431. free(list[i].base);
  1432. free(list);
  1433. }
  1434. return ret;
  1435. }
  1436. static int verify_cert_chain(X509_STORE *store, X509 *cert, STACK_OF(X509) * chain, int is_server, const char *server_name,
  1437. int *ossl_x509_err)
  1438. {
  1439. X509_STORE_CTX *verify_ctx;
  1440. int ret;
  1441. *ossl_x509_err = 0;
  1442. /* verify certificate chain */
  1443. if ((verify_ctx = X509_STORE_CTX_new()) == NULL) {
  1444. ret = PTLS_ERROR_NO_MEMORY;
  1445. goto Exit;
  1446. }
  1447. if (X509_STORE_CTX_init(verify_ctx, store, cert, chain) != 1) {
  1448. ret = PTLS_ERROR_LIBRARY;
  1449. goto Exit;
  1450. }
  1451. { /* setup verify params */
  1452. X509_VERIFY_PARAM *params = X509_STORE_CTX_get0_param(verify_ctx);
  1453. X509_VERIFY_PARAM_set_purpose(params, is_server ? X509_PURPOSE_SSL_CLIENT : X509_PURPOSE_SSL_SERVER);
  1454. X509_VERIFY_PARAM_set_depth(params, 98); /* use the default of OpenSSL 1.0.2 and above; see `man SSL_CTX_set_verify` */
  1455. /* when _acting_ as client, set the server name if provided*/
  1456. if (!is_server && server_name != NULL) {
  1457. if (ptls_server_name_is_ipaddr(server_name)) {
  1458. X509_VERIFY_PARAM_set1_ip_asc(params, server_name);
  1459. } else {
  1460. X509_VERIFY_PARAM_set1_host(params, server_name, strlen(server_name));
  1461. X509_VERIFY_PARAM_set_hostflags(params, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
  1462. }
  1463. }
  1464. }
  1465. if (X509_verify_cert(verify_ctx) != 1) {
  1466. *ossl_x509_err = X509_STORE_CTX_get_error(verify_ctx);
  1467. switch (*ossl_x509_err) {
  1468. case X509_V_ERR_OUT_OF_MEM:
  1469. ret = PTLS_ERROR_NO_MEMORY;
  1470. break;
  1471. case X509_V_ERR_CERT_REVOKED:
  1472. ret = PTLS_ALERT_CERTIFICATE_REVOKED;
  1473. break;
  1474. case X509_V_ERR_CERT_NOT_YET_VALID:
  1475. case X509_V_ERR_CERT_HAS_EXPIRED:
  1476. ret = PTLS_ALERT_CERTIFICATE_EXPIRED;
  1477. break;
  1478. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
  1479. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  1480. case X509_V_ERR_CERT_UNTRUSTED:
  1481. case X509_V_ERR_CERT_REJECTED:
  1482. ret = PTLS_ALERT_UNKNOWN_CA;
  1483. break;
  1484. case X509_V_ERR_HOSTNAME_MISMATCH:
  1485. case X509_V_ERR_INVALID_CA:
  1486. ret = PTLS_ALERT_BAD_CERTIFICATE;
  1487. break;
  1488. default:
  1489. ret = PTLS_ALERT_CERTIFICATE_UNKNOWN;
  1490. break;
  1491. }
  1492. goto Exit;
  1493. }
  1494. ret = 0;
  1495. Exit:
  1496. if (verify_ctx != NULL)
  1497. X509_STORE_CTX_free(verify_ctx);
  1498. return ret;
  1499. }
  1500. static int verify_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
  1501. int (**verifier)(void *, uint16_t, ptls_iovec_t, ptls_iovec_t), void **verify_data, ptls_iovec_t *certs,
  1502. size_t num_certs)
  1503. {
  1504. ptls_openssl_verify_certificate_t *self = (ptls_openssl_verify_certificate_t *)_self;
  1505. X509 *cert = NULL;
  1506. STACK_OF(X509) *chain = sk_X509_new_null();
  1507. size_t i;
  1508. int ossl_x509_err, ret;
  1509. /* If any certs are given, convert them to OpenSSL representation, then verify the cert chain. If no certs are given, just give
  1510. * the override_callback to see if we want to stay fail open. */
  1511. if (num_certs != 0) {
  1512. if ((cert = to_x509(certs[0])) == NULL) {
  1513. ret = PTLS_ALERT_BAD_CERTIFICATE;
  1514. goto Exit;
  1515. }
  1516. for (i = 1; i != num_certs; ++i) {
  1517. X509 *interm = to_x509(certs[i]);
  1518. if (interm == NULL) {
  1519. ret = PTLS_ALERT_BAD_CERTIFICATE;
  1520. goto Exit;
  1521. }
  1522. sk_X509_push(chain, interm);
  1523. }
  1524. ret = verify_cert_chain(self->cert_store, cert, chain, ptls_is_server(tls), server_name, &ossl_x509_err);
  1525. } else {
  1526. ret = PTLS_ALERT_CERTIFICATE_REQUIRED;
  1527. ossl_x509_err = 0;
  1528. }
  1529. /* When override callback is available, let it override the error. */
  1530. if (self->override_callback != NULL)
  1531. ret = self->override_callback->cb(self->override_callback, tls, ret, ossl_x509_err, cert, chain);
  1532. if (ret != 0 || num_certs == 0)
  1533. goto Exit;
  1534. /* extract public key for verifying the TLS handshake signature */
  1535. if ((*verify_data = X509_get_pubkey(cert)) == NULL) {
  1536. ret = PTLS_ALERT_BAD_CERTIFICATE;
  1537. goto Exit;
  1538. }
  1539. *verifier = verify_sign;
  1540. Exit:
  1541. if (chain != NULL)
  1542. sk_X509_pop_free(chain, X509_free);
  1543. if (cert != NULL)
  1544. X509_free(cert);
  1545. return ret;
  1546. }
  1547. int ptls_openssl_init_verify_certificate(ptls_openssl_verify_certificate_t *self, X509_STORE *store)
  1548. {
  1549. *self = (ptls_openssl_verify_certificate_t){{verify_cert, default_signature_schemes}, NULL};
  1550. if (store != NULL) {
  1551. X509_STORE_up_ref(store);
  1552. self->cert_store = store;
  1553. } else {
  1554. /* use default store */
  1555. if ((self->cert_store = ptls_openssl_create_default_certificate_store()) == NULL)
  1556. return -1;
  1557. }
  1558. return 0;
  1559. }
  1560. void ptls_openssl_dispose_verify_certificate(ptls_openssl_verify_certificate_t *self)
  1561. {
  1562. X509_STORE_free(self->cert_store);
  1563. }
  1564. X509_STORE *ptls_openssl_create_default_certificate_store(void)
  1565. {
  1566. X509_STORE *store;
  1567. X509_LOOKUP *lookup;
  1568. if ((store = X509_STORE_new()) == NULL)
  1569. goto Error;
  1570. if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())) == NULL)
  1571. goto Error;
  1572. X509_LOOKUP_load_file(lookup, NULL, X509_FILETYPE_DEFAULT);
  1573. if ((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_hash_dir())) == NULL)
  1574. goto Error;
  1575. X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
  1576. return store;
  1577. Error:
  1578. if (store != NULL)
  1579. X509_STORE_free(store);
  1580. return NULL;
  1581. }
  1582. static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
  1583. int (**verifier)(void *, uint16_t algo, ptls_iovec_t, ptls_iovec_t), void **verify_data,
  1584. ptls_iovec_t *certs, size_t num_certs)
  1585. {
  1586. ptls_openssl_raw_pubkey_verify_certificate_t *self = (ptls_openssl_raw_pubkey_verify_certificate_t *)_self;
  1587. int ret = PTLS_ALERT_BAD_CERTIFICATE;
  1588. ptls_iovec_t expected_pubkey = {0};
  1589. assert(num_certs != 0);
  1590. if (num_certs != 1)
  1591. goto Exit;
  1592. int r = i2d_PUBKEY(self->expected_pubkey, &expected_pubkey.base);
  1593. if (r <= 0) {
  1594. ret = PTLS_ALERT_BAD_CERTIFICATE;
  1595. goto Exit;
  1596. }
  1597. expected_pubkey.len = r;
  1598. if (certs[0].len != expected_pubkey.len)
  1599. goto Exit;
  1600. if (!ptls_mem_equal(expected_pubkey.base, certs[0].base, certs[0].len))
  1601. goto Exit;
  1602. EVP_PKEY_up_ref(self->expected_pubkey);
  1603. *verify_data = self->expected_pubkey;
  1604. *verifier = verify_sign;
  1605. ret = 0;
  1606. Exit:
  1607. OPENSSL_free(expected_pubkey.base);
  1608. return ret;
  1609. }
  1610. int ptls_openssl_raw_pubkey_init_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self, EVP_PKEY *expected_pubkey)
  1611. {
  1612. EVP_PKEY_up_ref(expected_pubkey);
  1613. *self = (ptls_openssl_raw_pubkey_verify_certificate_t){{verify_raw_cert, default_signature_schemes}, expected_pubkey};
  1614. return 0;
  1615. }
  1616. void ptls_openssl_raw_pubkey_dispose_verify_certificate(ptls_openssl_raw_pubkey_verify_certificate_t *self)
  1617. {
  1618. EVP_PKEY_free(self->expected_pubkey);
  1619. }
  1620. #define TICKET_LABEL_SIZE 16
  1621. #define TICKET_IV_SIZE EVP_MAX_IV_LENGTH
  1622. int ptls_openssl_encrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
  1623. int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
  1624. {
  1625. EVP_CIPHER_CTX *cctx = NULL;
  1626. HMAC_CTX *hctx = NULL;
  1627. uint8_t *dst;
  1628. int clen, ret;
  1629. if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
  1630. ret = PTLS_ERROR_NO_MEMORY;
  1631. goto Exit;
  1632. }
  1633. if ((hctx = HMAC_CTX_new()) == NULL) {
  1634. ret = PTLS_ERROR_NO_MEMORY;
  1635. goto Exit;
  1636. }
  1637. if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
  1638. 0)
  1639. goto Exit;
  1640. dst = buf->base + buf->off;
  1641. /* fill label and iv, as well as obtaining the keys */
  1642. if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
  1643. ret = PTLS_ERROR_LIBRARY;
  1644. goto Exit;
  1645. }
  1646. dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1647. /* encrypt */
  1648. if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
  1649. ret = PTLS_ERROR_LIBRARY;
  1650. goto Exit;
  1651. }
  1652. dst += clen;
  1653. if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
  1654. ret = PTLS_ERROR_LIBRARY;
  1655. goto Exit;
  1656. }
  1657. dst += clen;
  1658. /* append hmac */
  1659. if (!HMAC_Update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) || !HMAC_Final(hctx, dst, NULL)) {
  1660. ret = PTLS_ERROR_LIBRARY;
  1661. goto Exit;
  1662. }
  1663. dst += HMAC_size(hctx);
  1664. assert(dst <= buf->base + buf->capacity);
  1665. buf->off += dst - (buf->base + buf->off);
  1666. ret = 0;
  1667. Exit:
  1668. if (cctx != NULL)
  1669. EVP_CIPHER_CTX_free(cctx);
  1670. if (hctx != NULL)
  1671. HMAC_CTX_free(hctx);
  1672. return ret;
  1673. }
  1674. int ptls_openssl_decrypt_ticket(ptls_buffer_t *buf, ptls_iovec_t src,
  1675. int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc))
  1676. {
  1677. EVP_CIPHER_CTX *cctx = NULL;
  1678. HMAC_CTX *hctx = NULL;
  1679. int clen, ret;
  1680. if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
  1681. ret = PTLS_ERROR_NO_MEMORY;
  1682. goto Exit;
  1683. }
  1684. if ((hctx = HMAC_CTX_new()) == NULL) {
  1685. ret = PTLS_ERROR_NO_MEMORY;
  1686. goto Exit;
  1687. }
  1688. /* obtain cipher and hash context.
  1689. * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
  1690. if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
  1691. ret = PTLS_ALERT_DECODE_ERROR;
  1692. goto Exit;
  1693. }
  1694. if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
  1695. ret = PTLS_ERROR_LIBRARY;
  1696. goto Exit;
  1697. }
  1698. /* check hmac, and exclude label, iv, hmac */
  1699. size_t hmac_size = HMAC_size(hctx);
  1700. if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
  1701. ret = PTLS_ALERT_DECODE_ERROR;
  1702. goto Exit;
  1703. }
  1704. src.len -= hmac_size;
  1705. uint8_t hmac[EVP_MAX_MD_SIZE];
  1706. if (!HMAC_Update(hctx, src.base, src.len) || !HMAC_Final(hctx, hmac, NULL)) {
  1707. ret = PTLS_ERROR_LIBRARY;
  1708. goto Exit;
  1709. }
  1710. if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
  1711. ret = PTLS_ALERT_HANDSHAKE_FAILURE;
  1712. goto Exit;
  1713. }
  1714. src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1715. src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1716. /* decrypt */
  1717. if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
  1718. goto Exit;
  1719. if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
  1720. ret = PTLS_ERROR_LIBRARY;
  1721. goto Exit;
  1722. }
  1723. buf->off += clen;
  1724. if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
  1725. ret = PTLS_ERROR_LIBRARY;
  1726. goto Exit;
  1727. }
  1728. buf->off += clen;
  1729. ret = 0;
  1730. Exit:
  1731. if (cctx != NULL)
  1732. EVP_CIPHER_CTX_free(cctx);
  1733. if (hctx != NULL)
  1734. HMAC_CTX_free(hctx);
  1735. return ret;
  1736. }
  1737. #if OPENSSL_VERSION_NUMBER >= 0x30000000L
  1738. int ptls_openssl_encrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
  1739. int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
  1740. int enc))
  1741. {
  1742. EVP_CIPHER_CTX *cctx = NULL;
  1743. EVP_MAC *mac = NULL;
  1744. EVP_MAC_CTX *hctx = NULL;
  1745. size_t hlen;
  1746. uint8_t *dst;
  1747. int clen, ret;
  1748. if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
  1749. ret = PTLS_ERROR_NO_MEMORY;
  1750. goto Exit;
  1751. }
  1752. if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
  1753. ret = PTLS_ERROR_NO_MEMORY;
  1754. goto Exit;
  1755. }
  1756. if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
  1757. ret = PTLS_ERROR_NO_MEMORY;
  1758. goto Exit;
  1759. }
  1760. if ((ret = ptls_buffer_reserve(buf, TICKET_LABEL_SIZE + TICKET_IV_SIZE + src.len + EVP_MAX_BLOCK_LENGTH + EVP_MAX_MD_SIZE)) !=
  1761. 0)
  1762. goto Exit;
  1763. dst = buf->base + buf->off;
  1764. /* fill label and iv, as well as obtaining the keys */
  1765. if (!(*cb)(dst, dst + TICKET_LABEL_SIZE, cctx, hctx, 1)) {
  1766. ret = PTLS_ERROR_LIBRARY;
  1767. goto Exit;
  1768. }
  1769. dst += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1770. /* encrypt */
  1771. if (!EVP_EncryptUpdate(cctx, dst, &clen, src.base, (int)src.len)) {
  1772. ret = PTLS_ERROR_LIBRARY;
  1773. goto Exit;
  1774. }
  1775. dst += clen;
  1776. if (!EVP_EncryptFinal_ex(cctx, dst, &clen)) {
  1777. ret = PTLS_ERROR_LIBRARY;
  1778. goto Exit;
  1779. }
  1780. dst += clen;
  1781. /* append hmac */
  1782. if (!EVP_MAC_update(hctx, buf->base + buf->off, dst - (buf->base + buf->off)) ||
  1783. !EVP_MAC_final(hctx, dst, &hlen, EVP_MAC_CTX_get_mac_size(hctx))) {
  1784. ret = PTLS_ERROR_LIBRARY;
  1785. goto Exit;
  1786. }
  1787. dst += hlen;
  1788. assert(dst <= buf->base + buf->capacity);
  1789. buf->off += dst - (buf->base + buf->off);
  1790. ret = 0;
  1791. Exit:
  1792. if (cctx != NULL)
  1793. EVP_CIPHER_CTX_free(cctx);
  1794. if (hctx != NULL)
  1795. EVP_MAC_CTX_free(hctx);
  1796. if (mac != NULL)
  1797. EVP_MAC_free(mac);
  1798. return ret;
  1799. }
  1800. int ptls_openssl_decrypt_ticket_evp(ptls_buffer_t *buf, ptls_iovec_t src,
  1801. int (*cb)(unsigned char *key_name, unsigned char *iv, EVP_CIPHER_CTX *ctx, EVP_MAC_CTX *hctx,
  1802. int enc))
  1803. {
  1804. EVP_CIPHER_CTX *cctx = NULL;
  1805. EVP_MAC *mac = NULL;
  1806. EVP_MAC_CTX *hctx = NULL;
  1807. size_t hlen;
  1808. int clen, ret;
  1809. if ((cctx = EVP_CIPHER_CTX_new()) == NULL) {
  1810. ret = PTLS_ERROR_NO_MEMORY;
  1811. goto Exit;
  1812. }
  1813. if ((mac = EVP_MAC_fetch(NULL, "HMAC", NULL)) == NULL) {
  1814. ret = PTLS_ERROR_NO_MEMORY;
  1815. goto Exit;
  1816. }
  1817. if ((hctx = EVP_MAC_CTX_new(mac)) == NULL) {
  1818. ret = PTLS_ERROR_NO_MEMORY;
  1819. goto Exit;
  1820. }
  1821. /* obtain cipher and hash context.
  1822. * Note: no need to handle renew, since in picotls we always send a new ticket to minimize the chance of ticket reuse */
  1823. if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE) {
  1824. ret = PTLS_ALERT_DECODE_ERROR;
  1825. goto Exit;
  1826. }
  1827. if (!(*cb)(src.base, src.base + TICKET_LABEL_SIZE, cctx, hctx, 0)) {
  1828. ret = PTLS_ERROR_LIBRARY;
  1829. goto Exit;
  1830. }
  1831. /* check hmac, and exclude label, iv, hmac */
  1832. size_t hmac_size = EVP_MAC_CTX_get_mac_size(hctx);
  1833. if (src.len < TICKET_LABEL_SIZE + TICKET_IV_SIZE + hmac_size) {
  1834. ret = PTLS_ALERT_DECODE_ERROR;
  1835. goto Exit;
  1836. }
  1837. src.len -= hmac_size;
  1838. uint8_t hmac[EVP_MAX_MD_SIZE];
  1839. if (!EVP_MAC_update(hctx, src.base, src.len) || !EVP_MAC_final(hctx, hmac, &hlen, sizeof(hmac))) {
  1840. ret = PTLS_ERROR_LIBRARY;
  1841. goto Exit;
  1842. }
  1843. if (!ptls_mem_equal(src.base + src.len, hmac, hmac_size)) {
  1844. ret = PTLS_ALERT_HANDSHAKE_FAILURE;
  1845. goto Exit;
  1846. }
  1847. src.base += TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1848. src.len -= TICKET_LABEL_SIZE + TICKET_IV_SIZE;
  1849. /* decrypt */
  1850. if ((ret = ptls_buffer_reserve(buf, src.len)) != 0)
  1851. goto Exit;
  1852. if (!EVP_DecryptUpdate(cctx, buf->base + buf->off, &clen, src.base, (int)src.len)) {
  1853. ret = PTLS_ERROR_LIBRARY;
  1854. goto Exit;
  1855. }
  1856. buf->off += clen;
  1857. if (!EVP_DecryptFinal_ex(cctx, buf->base + buf->off, &clen)) {
  1858. ret = PTLS_ERROR_LIBRARY;
  1859. goto Exit;
  1860. }
  1861. buf->off += clen;
  1862. ret = 0;
  1863. Exit:
  1864. if (cctx != NULL)
  1865. EVP_CIPHER_CTX_free(cctx);
  1866. if (hctx != NULL)
  1867. EVP_MAC_CTX_free(hctx);
  1868. if (mac != NULL)
  1869. EVP_MAC_free(mac);
  1870. return ret;
  1871. }
  1872. #endif
  1873. ptls_key_exchange_algorithm_t ptls_openssl_secp256r1 = {.id = PTLS_GROUP_SECP256R1,
  1874. .name = PTLS_GROUP_NAME_SECP256R1,
  1875. .create = x9_62_create_key_exchange,
  1876. .exchange = secp_key_exchange,
  1877. .data = NID_X9_62_prime256v1};
  1878. #if PTLS_OPENSSL_HAVE_SECP384R1
  1879. ptls_key_exchange_algorithm_t ptls_openssl_secp384r1 = {.id = PTLS_GROUP_SECP384R1,
  1880. .name = PTLS_GROUP_NAME_SECP384R1,
  1881. .create = x9_62_create_key_exchange,
  1882. .exchange = secp_key_exchange,
  1883. .data = NID_secp384r1};
  1884. #endif
  1885. #if PTLS_OPENSSL_HAVE_SECP521R1
  1886. ptls_key_exchange_algorithm_t ptls_openssl_secp521r1 = {.id = PTLS_GROUP_SECP521R1,
  1887. .name = PTLS_GROUP_NAME_SECP521R1,
  1888. .create = x9_62_create_key_exchange,
  1889. .exchange = secp_key_exchange,
  1890. .data = NID_secp521r1};
  1891. #endif
  1892. #if PTLS_OPENSSL_HAVE_X25519
  1893. ptls_key_exchange_algorithm_t ptls_openssl_x25519 = {.id = PTLS_GROUP_X25519,
  1894. .name = PTLS_GROUP_NAME_X25519,
  1895. .create = evp_keyex_create,
  1896. .exchange = evp_keyex_exchange,
  1897. .data = NID_X25519};
  1898. #endif
  1899. #if PTLS_OPENSSL_HAVE_X25519MLKEM768
  1900. ptls_key_exchange_algorithm_t ptls_openssl_x25519mlkem768 = {.id = PTLS_GROUP_X25519MLKEM768,
  1901. .name = PTLS_GROUP_NAME_X25519MLKEM768,
  1902. .create = x25519mlkem768_create,
  1903. .exchange = x25519mlkem768_exchange};
  1904. #endif
  1905. ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges[] = {&ptls_openssl_secp256r1, NULL};
  1906. ptls_key_exchange_algorithm_t *ptls_openssl_key_exchanges_all[] = {
  1907. #if PTLS_OPENSSL_HAVE_X25519MLKEM768
  1908. &ptls_openssl_x25519mlkem768,
  1909. #endif
  1910. #if PTLS_OPENSSL_HAVE_SECP521R1
  1911. &ptls_openssl_secp521r1,
  1912. #endif
  1913. #if PTLS_OPENSSL_HAVE_SECP384R1
  1914. &ptls_openssl_secp384r1,
  1915. #endif
  1916. #if PTLS_OPENSSL_HAVE_X25519
  1917. &ptls_openssl_x25519,
  1918. #endif
  1919. &ptls_openssl_secp256r1, NULL};
  1920. ptls_cipher_algorithm_t ptls_openssl_aes128ecb = {
  1921. "AES128-ECB", PTLS_AES128_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
  1922. aes128ecb_setup_crypto};
  1923. ptls_cipher_algorithm_t ptls_openssl_aes128ctr = {
  1924. "AES128-CTR", PTLS_AES128_KEY_SIZE, 1, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t), aes128ctr_setup_crypto};
  1925. ptls_aead_algorithm_t ptls_openssl_aes128gcm = {"AES128-GCM",
  1926. PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
  1927. PTLS_AESGCM_INTEGRITY_LIMIT,
  1928. &ptls_openssl_aes128ctr,
  1929. &ptls_openssl_aes128ecb,
  1930. PTLS_AES128_KEY_SIZE,
  1931. PTLS_AESGCM_IV_SIZE,
  1932. PTLS_AESGCM_TAG_SIZE,
  1933. {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
  1934. 0,
  1935. 0,
  1936. sizeof(struct aead_crypto_context_t),
  1937. aead_aes128gcm_setup_crypto};
  1938. ptls_cipher_algorithm_t ptls_openssl_aes256ecb = {
  1939. "AES256-ECB", PTLS_AES256_KEY_SIZE, PTLS_AES_BLOCK_SIZE, 0 /* iv size */, sizeof(struct cipher_context_t),
  1940. aes256ecb_setup_crypto};
  1941. ptls_cipher_algorithm_t ptls_openssl_aes256ctr = {
  1942. "AES256-CTR", PTLS_AES256_KEY_SIZE, 1 /* block size */, PTLS_AES_IV_SIZE, sizeof(struct cipher_context_t),
  1943. aes256ctr_setup_crypto};
  1944. ptls_aead_algorithm_t ptls_openssl_aes256gcm = {"AES256-GCM",
  1945. PTLS_AESGCM_CONFIDENTIALITY_LIMIT,
  1946. PTLS_AESGCM_INTEGRITY_LIMIT,
  1947. &ptls_openssl_aes256ctr,
  1948. &ptls_openssl_aes256ecb,
  1949. PTLS_AES256_KEY_SIZE,
  1950. PTLS_AESGCM_IV_SIZE,
  1951. PTLS_AESGCM_TAG_SIZE,
  1952. {PTLS_TLS12_AESGCM_FIXED_IV_SIZE, PTLS_TLS12_AESGCM_RECORD_IV_SIZE},
  1953. 0,
  1954. 0,
  1955. sizeof(struct aead_crypto_context_t),
  1956. aead_aes256gcm_setup_crypto};
  1957. ptls_hash_algorithm_t ptls_openssl_sha256 = {"sha256", PTLS_SHA256_BLOCK_SIZE, PTLS_SHA256_DIGEST_SIZE, sha256_create,
  1958. PTLS_ZERO_DIGEST_SHA256};
  1959. ptls_hash_algorithm_t ptls_openssl_sha384 = {"sha384", PTLS_SHA384_BLOCK_SIZE, PTLS_SHA384_DIGEST_SIZE, sha384_create,
  1960. PTLS_ZERO_DIGEST_SHA384};
  1961. ptls_hash_algorithm_t ptls_openssl_sha512 = {"sha512", PTLS_SHA512_BLOCK_SIZE, PTLS_SHA512_DIGEST_SIZE, sha512_create,
  1962. PTLS_ZERO_DIGEST_SHA512};
  1963. ptls_cipher_suite_t ptls_openssl_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_AES_128_GCM_SHA256,
  1964. .name = PTLS_CIPHER_SUITE_NAME_AES_128_GCM_SHA256,
  1965. .aead = &ptls_openssl_aes128gcm,
  1966. .hash = &ptls_openssl_sha256};
  1967. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  1968. .name =
  1969. PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  1970. .aead = &ptls_openssl_aes128gcm,
  1971. .hash = &ptls_openssl_sha256};
  1972. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256 = {
  1973. .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  1974. .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  1975. .aead = &ptls_openssl_aes128gcm,
  1976. .hash = &ptls_openssl_sha256};
  1977. ptls_cipher_suite_t ptls_openssl_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_AES_256_GCM_SHA384,
  1978. .name = PTLS_CIPHER_SUITE_NAME_AES_256_GCM_SHA384,
  1979. .aead = &ptls_openssl_aes256gcm,
  1980. .hash = &ptls_openssl_sha384};
  1981. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384 = {.id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  1982. .name =
  1983. PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  1984. .aead = &ptls_openssl_aes256gcm,
  1985. .hash = &ptls_openssl_sha384};
  1986. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384 = {
  1987. .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  1988. .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  1989. .aead = &ptls_openssl_aes256gcm,
  1990. .hash = &ptls_openssl_sha384};
  1991. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  1992. ptls_cipher_algorithm_t ptls_openssl_chacha20 = {
  1993. .name = "CHACHA20",
  1994. .key_size = PTLS_CHACHA20_KEY_SIZE,
  1995. .block_size = 1,
  1996. .iv_size = PTLS_CHACHA20_IV_SIZE,
  1997. #ifdef OPENSSL_IS_BORINGSSL
  1998. .context_size = sizeof(struct boringssl_chacha20_context_t),
  1999. .setup_crypto = boringssl_chacha20_setup_crypto,
  2000. #else
  2001. .context_size = sizeof(struct cipher_context_t),
  2002. .setup_crypto = chacha20_setup_crypto,
  2003. #endif
  2004. };
  2005. ptls_aead_algorithm_t ptls_openssl_chacha20poly1305 = {
  2006. .name = "CHACHA20-POLY1305",
  2007. .confidentiality_limit = PTLS_CHACHA20POLY1305_CONFIDENTIALITY_LIMIT,
  2008. .integrity_limit = PTLS_CHACHA20POLY1305_INTEGRITY_LIMIT,
  2009. .ctr_cipher = &ptls_openssl_chacha20,
  2010. .ecb_cipher = NULL,
  2011. .key_size = PTLS_CHACHA20_KEY_SIZE,
  2012. .iv_size = PTLS_CHACHA20POLY1305_IV_SIZE,
  2013. .tag_size = PTLS_CHACHA20POLY1305_TAG_SIZE,
  2014. .tls12 = {.fixed_iv_size = PTLS_TLS12_CHACHAPOLY_FIXED_IV_SIZE, .record_iv_size = PTLS_TLS12_CHACHAPOLY_RECORD_IV_SIZE},
  2015. .non_temporal = 0,
  2016. .align_bits = 0,
  2017. #ifdef OPENSSL_IS_BORINGSSL
  2018. .context_size = sizeof(struct boringssl_chacha20poly1305_context_t),
  2019. .setup_crypto = boringssl_chacha20poly1305_setup_crypto,
  2020. #else
  2021. .context_size = sizeof(struct aead_crypto_context_t),
  2022. .setup_crypto = aead_chacha20poly1305_setup_crypto,
  2023. #endif
  2024. };
  2025. ptls_cipher_suite_t ptls_openssl_chacha20poly1305sha256 = {.id = PTLS_CIPHER_SUITE_CHACHA20_POLY1305_SHA256,
  2026. .name = PTLS_CIPHER_SUITE_NAME_CHACHA20_POLY1305_SHA256,
  2027. .aead = &ptls_openssl_chacha20poly1305,
  2028. .hash = &ptls_openssl_sha256};
  2029. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256 = {
  2030. .id = PTLS_CIPHER_SUITE_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  2031. .name = PTLS_CIPHER_SUITE_NAME_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  2032. .aead = &ptls_openssl_chacha20poly1305,
  2033. .hash = &ptls_openssl_sha256};
  2034. ptls_cipher_suite_t ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256 = {
  2035. .id = PTLS_CIPHER_SUITE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
  2036. .name = PTLS_CIPHER_SUITE_NAME_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
  2037. .aead = &ptls_openssl_chacha20poly1305,
  2038. .hash = &ptls_openssl_sha256};
  2039. #endif
  2040. #if PTLS_HAVE_AEGIS
  2041. ptls_aead_algorithm_t ptls_openssl_aegis128l = {
  2042. .name = "AEGIS-128L",
  2043. .confidentiality_limit = PTLS_AEGIS128L_CONFIDENTIALITY_LIMIT,
  2044. .integrity_limit = PTLS_AEGIS128L_INTEGRITY_LIMIT,
  2045. .ctr_cipher = NULL,
  2046. .ecb_cipher = NULL,
  2047. .key_size = PTLS_AEGIS128L_KEY_SIZE,
  2048. .iv_size = PTLS_AEGIS128L_IV_SIZE,
  2049. .tag_size = PTLS_AEGIS128L_TAG_SIZE,
  2050. .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
  2051. .non_temporal = 0,
  2052. .align_bits = 0,
  2053. .context_size = sizeof(struct aegis128l_context_t),
  2054. .setup_crypto = aegis128l_setup_crypto,
  2055. };
  2056. ptls_cipher_suite_t ptls_openssl_aegis128lsha256 = {.id = PTLS_CIPHER_SUITE_AEGIS128L_SHA256,
  2057. .name = PTLS_CIPHER_SUITE_NAME_AEGIS128L_SHA256,
  2058. .aead = &ptls_openssl_aegis128l,
  2059. .hash = &ptls_openssl_sha256};
  2060. ptls_aead_algorithm_t ptls_openssl_aegis256 = {
  2061. .name = "AEGIS-256",
  2062. .confidentiality_limit = PTLS_AEGIS256_CONFIDENTIALITY_LIMIT,
  2063. .integrity_limit = PTLS_AEGIS256_INTEGRITY_LIMIT,
  2064. .ctr_cipher = NULL,
  2065. .ecb_cipher = NULL,
  2066. .key_size = PTLS_AEGIS256_KEY_SIZE,
  2067. .iv_size = PTLS_AEGIS256_IV_SIZE,
  2068. .tag_size = PTLS_AEGIS256_TAG_SIZE,
  2069. .tls12 = {.fixed_iv_size = 0, .record_iv_size = 0},
  2070. .non_temporal = 0,
  2071. .align_bits = 0,
  2072. .context_size = sizeof(struct aegis256_context_t),
  2073. .setup_crypto = aegis256_setup_crypto,
  2074. };
  2075. ptls_cipher_suite_t ptls_openssl_aegis256sha512 = {.id = PTLS_CIPHER_SUITE_AEGIS256_SHA512,
  2076. .name = PTLS_CIPHER_SUITE_NAME_AEGIS256_SHA512,
  2077. .aead = &ptls_openssl_aegis256,
  2078. .hash = &ptls_openssl_sha512};
  2079. #endif
  2080. ptls_cipher_suite_t *ptls_openssl_cipher_suites[] = { // ciphers used with sha384 (must be first)
  2081. &ptls_openssl_aes256gcmsha384,
  2082. // ciphers used with sha256
  2083. &ptls_openssl_aes128gcmsha256,
  2084. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  2085. &ptls_openssl_chacha20poly1305sha256,
  2086. #endif
  2087. NULL};
  2088. ptls_cipher_suite_t *ptls_openssl_cipher_suites_all[] = { // ciphers used with sha384 (must be first)
  2089. #if PTLS_HAVE_AEGIS
  2090. &ptls_openssl_aegis256sha512,
  2091. #endif
  2092. &ptls_openssl_aes256gcmsha384,
  2093. // ciphers used with sha256
  2094. #if PTLS_HAVE_AEGIS
  2095. &ptls_openssl_aegis128lsha256,
  2096. #endif
  2097. &ptls_openssl_aes128gcmsha256,
  2098. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  2099. &ptls_openssl_chacha20poly1305sha256,
  2100. #endif
  2101. NULL};
  2102. ptls_cipher_suite_t *ptls_openssl_tls12_cipher_suites[] = {&ptls_openssl_tls12_ecdhe_rsa_aes128gcmsha256,
  2103. &ptls_openssl_tls12_ecdhe_ecdsa_aes128gcmsha256,
  2104. &ptls_openssl_tls12_ecdhe_rsa_aes256gcmsha384,
  2105. &ptls_openssl_tls12_ecdhe_ecdsa_aes256gcmsha384,
  2106. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  2107. &ptls_openssl_tls12_ecdhe_rsa_chacha20poly1305sha256,
  2108. &ptls_openssl_tls12_ecdhe_ecdsa_chacha20poly1305sha256,
  2109. #endif
  2110. NULL};
  2111. #if PTLS_OPENSSL_HAVE_BF
  2112. ptls_cipher_algorithm_t ptls_openssl_bfecb = {"BF-ECB", PTLS_BLOWFISH_KEY_SIZE, PTLS_BLOWFISH_BLOCK_SIZE,
  2113. 0 /* iv size */, sizeof(struct cipher_context_t), bfecb_setup_crypto};
  2114. #endif
  2115. ptls_hpke_kem_t ptls_openssl_hpke_kem_p256sha256 = {PTLS_HPKE_KEM_P256_SHA256, &ptls_openssl_secp256r1, &ptls_openssl_sha256};
  2116. ptls_hpke_kem_t ptls_openssl_hpke_kem_p384sha384 = {PTLS_HPKE_KEM_P384_SHA384, &ptls_openssl_secp384r1, &ptls_openssl_sha384};
  2117. #if PTLS_OPENSSL_HAVE_X25519
  2118. ptls_hpke_kem_t ptls_openssl_hpke_kem_x25519sha256 = {PTLS_HPKE_KEM_X25519_SHA256, &ptls_openssl_x25519, &ptls_openssl_sha256};
  2119. #endif
  2120. ptls_hpke_kem_t *ptls_openssl_hpke_kems[] = {&ptls_openssl_hpke_kem_p384sha384,
  2121. #if PTLS_OPENSSL_HAVE_X25519
  2122. &ptls_openssl_hpke_kem_x25519sha256,
  2123. #endif
  2124. &ptls_openssl_hpke_kem_p256sha256, NULL};
  2125. ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha256 = {
  2126. .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
  2127. .name = "HKDF-SHA256/AES-128-GCM",
  2128. .hash = &ptls_openssl_sha256,
  2129. .aead = &ptls_openssl_aes128gcm};
  2130. ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes128gcmsha512 = {
  2131. .id = {.kdf = PTLS_HPKE_HKDF_SHA512, .aead = PTLS_HPKE_AEAD_AES_128_GCM},
  2132. .name = "HKDF-SHA512/AES-128-GCM",
  2133. .hash = &ptls_openssl_sha512,
  2134. .aead = &ptls_openssl_aes128gcm};
  2135. ptls_hpke_cipher_suite_t ptls_openssl_hpke_aes256gcmsha384 = {
  2136. .id = {.kdf = PTLS_HPKE_HKDF_SHA384, .aead = PTLS_HPKE_AEAD_AES_256_GCM},
  2137. .name = "HKDF-SHA384/AES-256-GCM",
  2138. .hash = &ptls_openssl_sha384,
  2139. .aead = &ptls_openssl_aes256gcm};
  2140. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  2141. ptls_hpke_cipher_suite_t ptls_openssl_hpke_chacha20poly1305sha256 = {
  2142. .id = {.kdf = PTLS_HPKE_HKDF_SHA256, .aead = PTLS_HPKE_AEAD_CHACHA20POLY1305},
  2143. .name = "HKDF-SHA256/ChaCha20Poly1305",
  2144. .hash = &ptls_openssl_sha256,
  2145. .aead = &ptls_openssl_chacha20poly1305};
  2146. #endif
  2147. ptls_hpke_cipher_suite_t *ptls_openssl_hpke_cipher_suites[] = {&ptls_openssl_hpke_aes128gcmsha256,
  2148. &ptls_openssl_hpke_aes256gcmsha384,
  2149. #if PTLS_OPENSSL_HAVE_CHACHA20_POLY1305
  2150. &ptls_openssl_hpke_chacha20poly1305sha256,
  2151. #endif
  2152. &ptls_openssl_hpke_aes128gcmsha512, /* likely only for tests */
  2153. NULL};