1 /* $OpenBSD: ssl_methods.c,v 1.32 2024/07/23 14:40:54 jsing Exp $ */ 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 59 #include "dtls_local.h" 60 #include "ssl_local.h" 61 #include "tls13_internal.h" 62 63 static const SSL_METHOD DTLS_method_data = { 64 .dtls = 1, 65 .server = 1, 66 .version = DTLS1_2_VERSION, 67 .min_tls_version = TLS1_1_VERSION, 68 .max_tls_version = TLS1_2_VERSION, 69 .ssl_new = dtls1_new, 70 .ssl_clear = dtls1_clear, 71 .ssl_free = dtls1_free, 72 .ssl_accept = ssl3_accept, 73 .ssl_connect = ssl3_connect, 74 .ssl_shutdown = ssl3_shutdown, 75 .ssl_renegotiate = ssl3_renegotiate, 76 .ssl_renegotiate_check = ssl3_renegotiate_check, 77 .ssl_pending = ssl3_pending, 78 .ssl_read_bytes = dtls1_read_bytes, 79 .ssl_write_bytes = dtls1_write_app_data_bytes, 80 .enc_flags = TLSV1_2_ENC_FLAGS, 81 }; 82 83 static const SSL_METHOD DTLS_client_method_data = { 84 .dtls = 1, 85 .server = 0, 86 .version = DTLS1_2_VERSION, 87 .min_tls_version = TLS1_1_VERSION, 88 .max_tls_version = TLS1_2_VERSION, 89 .ssl_new = dtls1_new, 90 .ssl_clear = dtls1_clear, 91 .ssl_free = dtls1_free, 92 .ssl_accept = ssl_undefined_function, 93 .ssl_connect = ssl3_connect, 94 .ssl_shutdown = ssl3_shutdown, 95 .ssl_renegotiate = ssl3_renegotiate, 96 .ssl_renegotiate_check = ssl3_renegotiate_check, 97 .ssl_pending = ssl3_pending, 98 .ssl_read_bytes = dtls1_read_bytes, 99 .ssl_write_bytes = dtls1_write_app_data_bytes, 100 .enc_flags = TLSV1_2_ENC_FLAGS, 101 }; 102 103 static const SSL_METHOD DTLSv1_method_data = { 104 .dtls = 1, 105 .server = 1, 106 .version = DTLS1_VERSION, 107 .min_tls_version = TLS1_1_VERSION, 108 .max_tls_version = TLS1_1_VERSION, 109 .ssl_new = dtls1_new, 110 .ssl_clear = dtls1_clear, 111 .ssl_free = dtls1_free, 112 .ssl_accept = ssl3_accept, 113 .ssl_connect = ssl3_connect, 114 .ssl_shutdown = ssl3_shutdown, 115 .ssl_renegotiate = ssl3_renegotiate, 116 .ssl_renegotiate_check = ssl3_renegotiate_check, 117 .ssl_pending = ssl3_pending, 118 .ssl_read_bytes = dtls1_read_bytes, 119 .ssl_write_bytes = dtls1_write_app_data_bytes, 120 .enc_flags = TLSV1_1_ENC_FLAGS, 121 }; 122 123 static const SSL_METHOD DTLSv1_client_method_data = { 124 .dtls = 1, 125 .server = 0, 126 .version = DTLS1_VERSION, 127 .min_tls_version = TLS1_1_VERSION, 128 .max_tls_version = TLS1_1_VERSION, 129 .ssl_new = dtls1_new, 130 .ssl_clear = dtls1_clear, 131 .ssl_free = dtls1_free, 132 .ssl_accept = ssl_undefined_function, 133 .ssl_connect = ssl3_connect, 134 .ssl_shutdown = ssl3_shutdown, 135 .ssl_renegotiate = ssl3_renegotiate, 136 .ssl_renegotiate_check = ssl3_renegotiate_check, 137 .ssl_pending = ssl3_pending, 138 .ssl_read_bytes = dtls1_read_bytes, 139 .ssl_write_bytes = dtls1_write_app_data_bytes, 140 .enc_flags = TLSV1_1_ENC_FLAGS, 141 }; 142 143 static const SSL_METHOD DTLSv1_2_method_data = { 144 .dtls = 1, 145 .server = 1, 146 .version = DTLS1_2_VERSION, 147 .min_tls_version = TLS1_2_VERSION, 148 .max_tls_version = TLS1_2_VERSION, 149 .ssl_new = dtls1_new, 150 .ssl_clear = dtls1_clear, 151 .ssl_free = dtls1_free, 152 .ssl_accept = ssl3_accept, 153 .ssl_connect = ssl3_connect, 154 .ssl_shutdown = ssl3_shutdown, 155 .ssl_renegotiate = ssl3_renegotiate, 156 .ssl_renegotiate_check = ssl3_renegotiate_check, 157 .ssl_pending = ssl3_pending, 158 .ssl_read_bytes = dtls1_read_bytes, 159 .ssl_write_bytes = dtls1_write_app_data_bytes, 160 .enc_flags = TLSV1_2_ENC_FLAGS, 161 }; 162 163 static const SSL_METHOD DTLSv1_2_client_method_data = { 164 .dtls = 1, 165 .server = 0, 166 .version = DTLS1_2_VERSION, 167 .min_tls_version = TLS1_2_VERSION, 168 .max_tls_version = TLS1_2_VERSION, 169 .ssl_new = dtls1_new, 170 .ssl_clear = dtls1_clear, 171 .ssl_free = dtls1_free, 172 .ssl_accept = ssl_undefined_function, 173 .ssl_connect = ssl3_connect, 174 .ssl_shutdown = ssl3_shutdown, 175 .ssl_renegotiate = ssl3_renegotiate, 176 .ssl_renegotiate_check = ssl3_renegotiate_check, 177 .ssl_pending = ssl3_pending, 178 .ssl_read_bytes = dtls1_read_bytes, 179 .ssl_write_bytes = dtls1_write_app_data_bytes, 180 .enc_flags = TLSV1_2_ENC_FLAGS, 181 }; 182 183 const SSL_METHOD * 184 DTLSv1_client_method(void) 185 { 186 return &DTLSv1_client_method_data; 187 } 188 LSSL_ALIAS(DTLSv1_client_method); 189 190 const SSL_METHOD * 191 DTLSv1_method(void) 192 { 193 return &DTLSv1_method_data; 194 } 195 LSSL_ALIAS(DTLSv1_method); 196 197 const SSL_METHOD * 198 DTLSv1_server_method(void) 199 { 200 return &DTLSv1_method_data; 201 } 202 LSSL_ALIAS(DTLSv1_server_method); 203 204 const SSL_METHOD * 205 DTLSv1_2_client_method(void) 206 { 207 return &DTLSv1_2_client_method_data; 208 } 209 LSSL_ALIAS(DTLSv1_2_client_method); 210 211 const SSL_METHOD * 212 DTLSv1_2_method(void) 213 { 214 return &DTLSv1_2_method_data; 215 } 216 LSSL_ALIAS(DTLSv1_2_method); 217 218 const SSL_METHOD * 219 DTLSv1_2_server_method(void) 220 { 221 return &DTLSv1_2_method_data; 222 } 223 LSSL_ALIAS(DTLSv1_2_server_method); 224 225 const SSL_METHOD * 226 DTLS_client_method(void) 227 { 228 return &DTLS_client_method_data; 229 } 230 LSSL_ALIAS(DTLS_client_method); 231 232 const SSL_METHOD * 233 DTLS_method(void) 234 { 235 return &DTLS_method_data; 236 } 237 LSSL_ALIAS(DTLS_method); 238 239 const SSL_METHOD * 240 DTLS_server_method(void) 241 { 242 return &DTLS_method_data; 243 } 244 LSSL_ALIAS(DTLS_server_method); 245 246 static const SSL_METHOD TLS_method_data = { 247 .dtls = 0, 248 .server = 1, 249 .version = TLS1_3_VERSION, 250 .min_tls_version = TLS1_VERSION, 251 .max_tls_version = TLS1_3_VERSION, 252 .ssl_new = tls1_new, 253 .ssl_clear = tls1_clear, 254 .ssl_free = tls1_free, 255 .ssl_accept = tls13_legacy_accept, 256 .ssl_connect = tls13_legacy_connect, 257 .ssl_shutdown = tls13_legacy_shutdown, 258 .ssl_renegotiate = ssl_undefined_function, 259 .ssl_renegotiate_check = ssl_ok, 260 .ssl_pending = tls13_legacy_pending, 261 .ssl_read_bytes = tls13_legacy_read_bytes, 262 .ssl_write_bytes = tls13_legacy_write_bytes, 263 .enc_flags = TLSV1_3_ENC_FLAGS, 264 }; 265 266 static const SSL_METHOD TLS_legacy_method_data = { 267 .dtls = 0, 268 .server = 1, 269 .version = TLS1_2_VERSION, 270 .min_tls_version = TLS1_VERSION, 271 .max_tls_version = TLS1_2_VERSION, 272 .ssl_new = tls1_new, 273 .ssl_clear = tls1_clear, 274 .ssl_free = tls1_free, 275 .ssl_accept = ssl3_accept, 276 .ssl_connect = ssl3_connect, 277 .ssl_shutdown = ssl3_shutdown, 278 .ssl_renegotiate = ssl_undefined_function, 279 .ssl_renegotiate_check = ssl_ok, 280 .ssl_pending = ssl3_pending, 281 .ssl_read_bytes = ssl3_read_bytes, 282 .ssl_write_bytes = ssl3_write_bytes, 283 .enc_flags = TLSV1_2_ENC_FLAGS, 284 }; 285 286 static const SSL_METHOD TLS_client_method_data = { 287 .dtls = 0, 288 .server = 0, 289 .version = TLS1_3_VERSION, 290 .min_tls_version = TLS1_VERSION, 291 .max_tls_version = TLS1_3_VERSION, 292 .ssl_new = tls1_new, 293 .ssl_clear = tls1_clear, 294 .ssl_free = tls1_free, 295 .ssl_accept = tls13_legacy_accept, 296 .ssl_connect = tls13_legacy_connect, 297 .ssl_shutdown = tls13_legacy_shutdown, 298 .ssl_renegotiate = ssl_undefined_function, 299 .ssl_renegotiate_check = ssl_ok, 300 .ssl_pending = tls13_legacy_pending, 301 .ssl_read_bytes = tls13_legacy_read_bytes, 302 .ssl_write_bytes = tls13_legacy_write_bytes, 303 .enc_flags = TLSV1_3_ENC_FLAGS, 304 }; 305 306 static const SSL_METHOD TLSv1_method_data = { 307 .dtls = 0, 308 .server = 1, 309 .version = TLS1_VERSION, 310 .min_tls_version = TLS1_VERSION, 311 .max_tls_version = TLS1_VERSION, 312 .ssl_new = tls1_new, 313 .ssl_clear = tls1_clear, 314 .ssl_free = tls1_free, 315 .ssl_accept = ssl3_accept, 316 .ssl_connect = ssl3_connect, 317 .ssl_shutdown = ssl3_shutdown, 318 .ssl_renegotiate = ssl3_renegotiate, 319 .ssl_renegotiate_check = ssl3_renegotiate_check, 320 .ssl_pending = ssl3_pending, 321 .ssl_read_bytes = ssl3_read_bytes, 322 .ssl_write_bytes = ssl3_write_bytes, 323 .enc_flags = TLSV1_ENC_FLAGS, 324 }; 325 326 static const SSL_METHOD TLSv1_client_method_data = { 327 .dtls = 0, 328 .server = 0, 329 .version = TLS1_VERSION, 330 .min_tls_version = TLS1_VERSION, 331 .max_tls_version = TLS1_VERSION, 332 .ssl_new = tls1_new, 333 .ssl_clear = tls1_clear, 334 .ssl_free = tls1_free, 335 .ssl_accept = ssl_undefined_function, 336 .ssl_connect = ssl3_connect, 337 .ssl_shutdown = ssl3_shutdown, 338 .ssl_renegotiate = ssl3_renegotiate, 339 .ssl_renegotiate_check = ssl3_renegotiate_check, 340 .ssl_pending = ssl3_pending, 341 .ssl_read_bytes = ssl3_read_bytes, 342 .ssl_write_bytes = ssl3_write_bytes, 343 .enc_flags = TLSV1_ENC_FLAGS, 344 }; 345 346 static const SSL_METHOD TLSv1_1_method_data = { 347 .dtls = 0, 348 .server = 1, 349 .version = TLS1_1_VERSION, 350 .min_tls_version = TLS1_1_VERSION, 351 .max_tls_version = TLS1_1_VERSION, 352 .ssl_new = tls1_new, 353 .ssl_clear = tls1_clear, 354 .ssl_free = tls1_free, 355 .ssl_accept = ssl3_accept, 356 .ssl_connect = ssl3_connect, 357 .ssl_shutdown = ssl3_shutdown, 358 .ssl_renegotiate = ssl3_renegotiate, 359 .ssl_renegotiate_check = ssl3_renegotiate_check, 360 .ssl_pending = ssl3_pending, 361 .ssl_read_bytes = ssl3_read_bytes, 362 .ssl_write_bytes = ssl3_write_bytes, 363 .enc_flags = TLSV1_1_ENC_FLAGS, 364 }; 365 366 static const SSL_METHOD TLSv1_1_client_method_data = { 367 .dtls = 0, 368 .server = 0, 369 .version = TLS1_1_VERSION, 370 .min_tls_version = TLS1_1_VERSION, 371 .max_tls_version = TLS1_1_VERSION, 372 .ssl_new = tls1_new, 373 .ssl_clear = tls1_clear, 374 .ssl_free = tls1_free, 375 .ssl_accept = ssl_undefined_function, 376 .ssl_connect = ssl3_connect, 377 .ssl_shutdown = ssl3_shutdown, 378 .ssl_renegotiate = ssl3_renegotiate, 379 .ssl_renegotiate_check = ssl3_renegotiate_check, 380 .ssl_pending = ssl3_pending, 381 .ssl_read_bytes = ssl3_read_bytes, 382 .ssl_write_bytes = ssl3_write_bytes, 383 .enc_flags = TLSV1_1_ENC_FLAGS, 384 }; 385 386 static const SSL_METHOD TLSv1_2_method_data = { 387 .dtls = 0, 388 .server = 1, 389 .version = TLS1_2_VERSION, 390 .min_tls_version = TLS1_2_VERSION, 391 .max_tls_version = TLS1_2_VERSION, 392 .ssl_new = tls1_new, 393 .ssl_clear = tls1_clear, 394 .ssl_free = tls1_free, 395 .ssl_accept = ssl3_accept, 396 .ssl_connect = ssl3_connect, 397 .ssl_shutdown = ssl3_shutdown, 398 .ssl_renegotiate = ssl3_renegotiate, 399 .ssl_renegotiate_check = ssl3_renegotiate_check, 400 .ssl_pending = ssl3_pending, 401 .ssl_read_bytes = ssl3_read_bytes, 402 .ssl_write_bytes = ssl3_write_bytes, 403 .enc_flags = TLSV1_2_ENC_FLAGS, 404 }; 405 406 static const SSL_METHOD TLSv1_2_client_method_data = { 407 .dtls = 0, 408 .server = 0, 409 .version = TLS1_2_VERSION, 410 .min_tls_version = TLS1_2_VERSION, 411 .max_tls_version = TLS1_2_VERSION, 412 .ssl_new = tls1_new, 413 .ssl_clear = tls1_clear, 414 .ssl_free = tls1_free, 415 .ssl_accept = ssl_undefined_function, 416 .ssl_connect = ssl3_connect, 417 .ssl_shutdown = ssl3_shutdown, 418 .ssl_renegotiate = ssl3_renegotiate, 419 .ssl_renegotiate_check = ssl3_renegotiate_check, 420 .ssl_pending = ssl3_pending, 421 .ssl_read_bytes = ssl3_read_bytes, 422 .ssl_write_bytes = ssl3_write_bytes, 423 .enc_flags = TLSV1_2_ENC_FLAGS, 424 }; 425 426 const SSL_METHOD * 427 TLS_client_method(void) 428 { 429 return (&TLS_client_method_data); 430 } 431 LSSL_ALIAS(TLS_client_method); 432 433 const SSL_METHOD * 434 TLS_method(void) 435 { 436 return (&TLS_method_data); 437 } 438 LSSL_ALIAS(TLS_method); 439 440 const SSL_METHOD * 441 TLS_server_method(void) 442 { 443 return TLS_method(); 444 } 445 LSSL_ALIAS(TLS_server_method); 446 447 const SSL_METHOD * 448 tls_legacy_method(void) 449 { 450 return (&TLS_legacy_method_data); 451 } 452 453 const SSL_METHOD * 454 SSLv23_client_method(void) 455 { 456 return TLS_client_method(); 457 } 458 LSSL_ALIAS(SSLv23_client_method); 459 460 const SSL_METHOD * 461 SSLv23_method(void) 462 { 463 return TLS_method(); 464 } 465 LSSL_ALIAS(SSLv23_method); 466 467 const SSL_METHOD * 468 SSLv23_server_method(void) 469 { 470 return TLS_method(); 471 } 472 LSSL_ALIAS(SSLv23_server_method); 473 474 const SSL_METHOD * 475 TLSv1_client_method(void) 476 { 477 return (&TLSv1_client_method_data); 478 } 479 LSSL_ALIAS(TLSv1_client_method); 480 481 const SSL_METHOD * 482 TLSv1_method(void) 483 { 484 return (&TLSv1_method_data); 485 } 486 LSSL_ALIAS(TLSv1_method); 487 488 const SSL_METHOD * 489 TLSv1_server_method(void) 490 { 491 return (&TLSv1_method_data); 492 } 493 LSSL_ALIAS(TLSv1_server_method); 494 495 const SSL_METHOD * 496 TLSv1_1_client_method(void) 497 { 498 return (&TLSv1_1_client_method_data); 499 } 500 LSSL_ALIAS(TLSv1_1_client_method); 501 502 const SSL_METHOD * 503 TLSv1_1_method(void) 504 { 505 return (&TLSv1_1_method_data); 506 } 507 LSSL_ALIAS(TLSv1_1_method); 508 509 const SSL_METHOD * 510 TLSv1_1_server_method(void) 511 { 512 return (&TLSv1_1_method_data); 513 } 514 LSSL_ALIAS(TLSv1_1_server_method); 515 516 const SSL_METHOD * 517 TLSv1_2_client_method(void) 518 { 519 return (&TLSv1_2_client_method_data); 520 } 521 LSSL_ALIAS(TLSv1_2_client_method); 522 523 const SSL_METHOD * 524 TLSv1_2_method(void) 525 { 526 return (&TLSv1_2_method_data); 527 } 528 LSSL_ALIAS(TLSv1_2_method); 529 530 const SSL_METHOD * 531 TLSv1_2_server_method(void) 532 { 533 return (&TLSv1_2_method_data); 534 } 535 LSSL_ALIAS(TLSv1_2_server_method); 536 537 const SSL_METHOD * 538 ssl_get_method(uint16_t version) 539 { 540 if (version == TLS1_3_VERSION) 541 return (TLS_method()); 542 if (version == TLS1_2_VERSION) 543 return (TLSv1_2_method()); 544 if (version == TLS1_1_VERSION) 545 return (TLSv1_1_method()); 546 if (version == TLS1_VERSION) 547 return (TLSv1_method()); 548 if (version == DTLS1_VERSION) 549 return (DTLSv1_method()); 550 if (version == DTLS1_2_VERSION) 551 return (DTLSv1_2_method()); 552 553 return (NULL); 554 } 555