1 /* 2 * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sublicense, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 25 #include "inner.h" 26 27 #if 0 28 /* obsolete */ 29 30 /* 31 * If BR_USE_URANDOM is not defined, then try to autodetect its presence 32 * through compiler macros. 33 */ 34 #ifndef BR_USE_URANDOM 35 36 /* 37 * Macro values documented on: 38 * https://sourceforge.net/p/predef/wiki/OperatingSystems/ 39 * 40 * Only the most common systems have been included here for now. This 41 * should be enriched later on. 42 */ 43 #if defined _AIX \ 44 || defined __ANDROID__ \ 45 || defined __FreeBSD__ \ 46 || defined __NetBSD__ \ 47 || defined __OpenBSD__ \ 48 || defined __DragonFly__ \ 49 || defined __linux__ \ 50 || (defined __sun && (defined __SVR4 || defined __svr4__)) \ 51 || (defined __APPLE__ && defined __MACH__) 52 #define BR_USE_URANDOM 1 53 #endif 54 55 #endif 56 57 /* 58 * If BR_USE_WIN32_RAND is not defined, perform autodetection here. 59 */ 60 #ifndef BR_USE_WIN32_RAND 61 62 #if defined _WIN32 || defined _WIN64 63 #define BR_USE_WIN32_RAND 1 64 #endif 65 66 #endif 67 68 #if BR_USE_URANDOM 69 #include <sys/types.h> 70 #include <unistd.h> 71 #include <fcntl.h> 72 #include <errno.h> 73 #endif 74 75 #if BR_USE_WIN32_RAND 76 #include <windows.h> 77 #include <wincrypt.h> 78 #pragma comment(lib, "advapi32") 79 #endif 80 81 #endif 82 83 /* ==================================================================== */ 84 /* 85 * This part of the file does the low-level record management. 86 */ 87 88 /* 89 * IMPLEMENTATION NOTES 90 * ==================== 91 * 92 * In this file, we designate by "input" (and the "i" letter) the "recv" 93 * operations: incoming records from the peer, from which payload data 94 * is obtained, and must be extracted by the application (or the SSL 95 * handshake engine). Similarly, "output" (and the "o" letter) is for 96 * "send": payload data injected by the application (and SSL handshake 97 * engine), to be wrapped into records, that are then conveyed to the 98 * peer over the transport medium. 99 * 100 * The input and output buffers may be distinct or shared. When 101 * shared, input and output cannot occur concurrently; the caller 102 * must make sure that it never needs to output data while input 103 * data has been received. In practice, a shared buffer prevents 104 * pipelining of HTTP requests, or similar protocols; however, a 105 * shared buffer saves RAM. 106 * 107 * The input buffer is pointed to by 'ibuf' and has size 'ibuf_len'; 108 * the output buffer is pointed to by 'obuf' and has size 'obuf_len'. 109 * From the size of these buffers is derived the maximum fragment 110 * length, which will be honoured upon sending records; regardless of 111 * that length, incoming records will be processed as long as they 112 * fit in the input buffer, and their length still complies with the 113 * protocol specification (maximum plaintext payload length is 16384 114 * bytes). 115 * 116 * Three registers are used to manage buffering in ibuf, called ixa, 117 * ixb and ixc. Similarly, three registers are used to manage buffering 118 * in obuf, called oxa, oxb and oxc. 119 * 120 * 121 * At any time, the engine is in one of the following modes: 122 * -- Failed mode: an error occurs, no I/O can happen. 123 * -- Input mode: the engine can either receive record bytes from the 124 * transport layer, or it has some buffered payload bytes to yield. 125 * -- Output mode: the engine can either receive payload bytes, or it 126 * has some record bytes to send to the transport layer. 127 * -- Input/Output mode: both input and output modes are active. When 128 * the buffer is shared, this can happen only when the buffer is empty 129 * (no buffered payload bytes or record bytes in either direction). 130 * 131 * 132 * Failed mode: 133 * ------------ 134 * 135 * I/O failed for some reason (invalid received data, not enough room 136 * for the next record...). No I/O may ever occur again for this context, 137 * until an explicit reset is performed. This mode, and the error code, 138 * are also used for protocol errors, especially handshake errors. 139 * 140 * 141 * Input mode: 142 * ----------- 143 * 144 * ixa index within ibuf[] for the currently read data 145 * ixb maximum index within ibuf[] for the currently read data 146 * ixc number of bytes not yet received for the current record 147 * 148 * -- When ixa == ixb, there is no available data for readers. When 149 * ixa != ixb, there is available data and it starts at offset ixa. 150 * 151 * -- When waiting for the next record header, ixa and ixb are equal 152 * and contain a value ranging from 0 to 4; ixc is equal to 5-ixa. 153 * 154 * -- When the header has been received, record data is obtained. The 155 * ixc field records how many bytes are still needed to reach the 156 * end of the current record. 157 * 158 * ** If encryption is active, then ixa and ixb are kept equal, and 159 * point to the end of the currently received record bytes. When 160 * ixc reaches 0, decryption/MAC is applied, and ixa and ixb are 161 * adjusted. 162 * 163 * ** If encryption is not active, then ixa and ixb are distinct 164 * and data can be read right away. Additional record data is 165 * obtained only when ixa == ixb. 166 * 167 * Note: in input mode and no encryption, records larger than the buffer 168 * size are allowed. When encryption is active, the complete record must 169 * fit within the buffer, since it cannot be decrypted/MACed until it 170 * has been completely received. 171 * 172 * -- When receiving the next record header, 'version_in' contains the 173 * expected input version (0 if not expecting a specific version); on 174 * mismatch, the mode switches to 'failed'. 175 * 176 * -- When the header has been received, 'version_in' contains the received 177 * version. It is up to the caller to check and adjust the 'version_in' field 178 * to implement the required semantics. 179 * 180 * -- The 'record_type_in' field is updated with the incoming record type 181 * when the next record header has been received. 182 * 183 * 184 * Output mode: 185 * ------------ 186 * 187 * oxa index within obuf[] for the currently accumulated data 188 * oxb maximum index within obuf[] for record data 189 * oxc pointer for start of record data, and for record sending 190 * 191 * -- When oxa != oxb, more data can be accumulated into the current 192 * record; when oxa == oxb, a closed record is being sent. 193 * 194 * -- When accumulating data, oxc points to the start of the data. 195 * 196 * -- During record sending, oxa (and oxb) point to the next record byte 197 * to send, and oxc indicates the end of the current record. 198 * 199 * Note: sent records must fit within the buffer, since the header is 200 * adjusted only when the complete record has been assembled. 201 * 202 * -- The 'version_out' and 'record_type_out' fields are used to build the 203 * record header when the mode is switched to 'sending'. 204 * 205 * 206 * Modes: 207 * ------ 208 * 209 * The state register iomode contains one of the following values: 210 * 211 * BR_IO_FAILED I/O failed 212 * BR_IO_IN input mode 213 * BR_IO_OUT output mode 214 * BR_IO_INOUT input/output mode 215 * 216 * Whether encryption is active on incoming records is indicated by the 217 * incrypt flag. For outgoing records, there is no such flag; "encryption" 218 * is always considered active, but initially uses functions that do not 219 * encrypt anything. The 'incrypt' flag is needed because when there is 220 * no active encryption, records larger than the I/O buffer are accepted. 221 * 222 * Note: we do not support no-encryption modes (MAC only). 223 * 224 * TODO: implement GCM support 225 * 226 * 227 * Misc: 228 * ----- 229 * 230 * 'max_frag_len' is the maximum plaintext size for an outgoing record. 231 * By default, it is set to the maximum value that fits in the provided 232 * buffers, in the following list: 512, 1024, 2048, 4096, 16384. The 233 * caller may change it if needed, but the new value MUST still fit in 234 * the buffers, and it MUST be one of the list above for compatibility 235 * with the Maximum Fragment Length extension. 236 * 237 * For incoming records, only the total buffer length and current 238 * encryption mode impact the maximum length for incoming records. The 239 * 'max_frag_len' value is still adjusted so that records up to that 240 * length can be both received and sent. 241 * 242 * 243 * Offsets and lengths: 244 * -------------------- 245 * 246 * When sending fragments with TLS-1.1+, the maximum overhead is: 247 * 5 bytes for the record header 248 * 16 bytes for the explicit IV 249 * 48 bytes for the MAC (HMAC/SHA-384) 250 * 16 bytes for the padding (AES) 251 * so a total of 85 extra bytes. Note that we support block cipher sizes 252 * up to 16 bytes (AES) and HMAC output sizes up to 48 bytes (SHA-384). 253 * 254 * With TLS-1.0 and CBC mode, we apply a 1/n-1 split, for a maximum 255 * overhead of: 256 * 5 bytes for the first record header 257 * 32 bytes for the first record payload (AES-CBC + HMAC/SHA-1) 258 * 5 bytes for the second record header 259 * 20 bytes for the MAC (HMAC/SHA-1) 260 * 16 bytes for the padding (AES) 261 * -1 byte to account for the payload byte in the first record 262 * so a total of 77 extra bytes at most, less than the 85 bytes above. 263 * Note that with TLS-1.0, the MAC is HMAC with either MD5 or SHA-1, but 264 * no other hash function. 265 * 266 * The implementation does not try to send larger records when the current 267 * encryption mode has less overhead. 268 * 269 * Maximum input record overhead is: 270 * 5 bytes for the record header 271 * 16 bytes for the explicit IV (TLS-1.1+) 272 * 48 bytes for the MAC (HMAC/SHA-384) 273 * 256 bytes for the padding 274 * so a total of 325 extra bytes. 275 * 276 * When receiving the next record header, it is written into the buffer 277 * bytes 0 to 4 (inclusive). Record data is always written into buf[] 278 * starting at offset 5. When encryption is active, the plaintext data 279 * may start at a larger offset (e.g. because of an explicit IV). 280 */ 281 282 #define MAX_OUT_OVERHEAD 85 283 #define MAX_IN_OVERHEAD 325 284 285 /* see inner.h */ 286 void 287 br_ssl_engine_fail(br_ssl_engine_context *rc, int err) 288 { 289 if (rc->iomode != BR_IO_FAILED) { 290 rc->iomode = BR_IO_FAILED; 291 rc->err = err; 292 } 293 } 294 295 /* 296 * Adjust registers for a new incoming record. 297 */ 298 static void 299 make_ready_in(br_ssl_engine_context *rc) 300 { 301 rc->ixa = rc->ixb = 0; 302 rc->ixc = 5; 303 if (rc->iomode == BR_IO_IN) { 304 rc->iomode = BR_IO_INOUT; 305 } 306 } 307 308 /* 309 * Adjust registers for a new outgoing record. 310 */ 311 static void 312 make_ready_out(br_ssl_engine_context *rc) 313 { 314 size_t a, b; 315 316 a = 5; 317 b = rc->obuf_len - a; 318 rc->out.vtable->max_plaintext(&rc->out.vtable, &a, &b); 319 if ((b - a) > rc->max_frag_len) { 320 b = a + rc->max_frag_len; 321 } 322 rc->oxa = a; 323 rc->oxb = b; 324 rc->oxc = a; 325 if (rc->iomode == BR_IO_OUT) { 326 rc->iomode = BR_IO_INOUT; 327 } 328 } 329 330 /* see inner.h */ 331 void 332 br_ssl_engine_new_max_frag_len(br_ssl_engine_context *rc, unsigned max_frag_len) 333 { 334 size_t nxb; 335 336 rc->max_frag_len = max_frag_len; 337 nxb = rc->oxc + max_frag_len; 338 if (rc->oxa < rc->oxb && rc->oxb > nxb && rc->oxa < nxb) { 339 rc->oxb = nxb; 340 } 341 } 342 343 /* see bearssl_ssl.h */ 344 void 345 br_ssl_engine_set_buffer(br_ssl_engine_context *rc, 346 void *buf, size_t buf_len, int bidi) 347 { 348 if (buf == NULL) { 349 br_ssl_engine_set_buffers_bidi(rc, NULL, 0, NULL, 0); 350 } else { 351 /* 352 * In bidirectional mode, we want to maximise input 353 * buffer size, since we support arbitrary fragmentation 354 * when sending, but the peer will not necessarily 355 * comply to any low fragment length (in particular if 356 * we are the server, because the maximum fragment 357 * length extension is under client control). 358 * 359 * We keep a minimum size of 512 bytes for the plaintext 360 * of our outgoing records. 361 * 362 * br_ssl_engine_set_buffers_bidi() will compute the maximum 363 * fragment length for outgoing records by using the minimum 364 * of allocated spaces for both input and output records, 365 * rounded down to a standard length. 366 */ 367 if (bidi) { 368 size_t w; 369 370 if (buf_len < (512 + MAX_IN_OVERHEAD 371 + 512 + MAX_OUT_OVERHEAD)) 372 { 373 rc->iomode = BR_IO_FAILED; 374 rc->err = BR_ERR_BAD_PARAM; 375 return; 376 } else if (buf_len < (16384 + MAX_IN_OVERHEAD 377 + 512 + MAX_OUT_OVERHEAD)) 378 { 379 w = 512 + MAX_OUT_OVERHEAD; 380 } else { 381 w = buf_len - (16384 + MAX_IN_OVERHEAD); 382 } 383 br_ssl_engine_set_buffers_bidi(rc, 384 buf, buf_len - w, 385 (unsigned char *)buf + w, w); 386 } else { 387 br_ssl_engine_set_buffers_bidi(rc, 388 buf, buf_len, NULL, 0); 389 } 390 } 391 } 392 393 /* see bearssl_ssl.h */ 394 void 395 br_ssl_engine_set_buffers_bidi(br_ssl_engine_context *rc, 396 void *ibuf, size_t ibuf_len, void *obuf, size_t obuf_len) 397 { 398 rc->iomode = BR_IO_INOUT; 399 rc->incrypt = 0; 400 rc->err = BR_ERR_OK; 401 rc->version_in = 0; 402 rc->record_type_in = 0; 403 rc->version_out = 0; 404 rc->record_type_out = 0; 405 if (ibuf == NULL) { 406 if (rc->ibuf == NULL) { 407 br_ssl_engine_fail(rc, BR_ERR_BAD_PARAM); 408 } 409 } else { 410 unsigned u; 411 412 rc->ibuf = ibuf; 413 rc->ibuf_len = ibuf_len; 414 if (obuf == NULL) { 415 obuf = ibuf; 416 obuf_len = ibuf_len; 417 } 418 rc->obuf = obuf; 419 rc->obuf_len = obuf_len; 420 421 /* 422 * Compute the maximum fragment length, that fits for 423 * both incoming and outgoing records. This length will 424 * be used in fragment length negotiation, so we must 425 * honour it both ways. Regardless, larger incoming 426 * records will be accepted, as long as they fit in the 427 * actual buffer size. 428 */ 429 for (u = 14; u >= 9; u --) { 430 size_t flen; 431 432 flen = (size_t)1 << u; 433 if (obuf_len >= flen + MAX_OUT_OVERHEAD 434 && ibuf_len >= flen + MAX_IN_OVERHEAD) 435 { 436 break; 437 } 438 } 439 if (u == 8) { 440 br_ssl_engine_fail(rc, BR_ERR_BAD_PARAM); 441 return; 442 } else if (u == 13) { 443 u = 12; 444 } 445 rc->max_frag_len = (size_t)1 << u; 446 rc->log_max_frag_len = u; 447 rc->peer_log_max_frag_len = 0; 448 } 449 rc->out.vtable = &br_sslrec_out_clear_vtable; 450 make_ready_in(rc); 451 make_ready_out(rc); 452 } 453 454 /* 455 * Clear buffers in both directions. 456 */ 457 static void 458 engine_clearbuf(br_ssl_engine_context *rc) 459 { 460 make_ready_in(rc); 461 make_ready_out(rc); 462 } 463 464 /* 465 * Make sure the internal PRNG is initialised (but not necessarily 466 * seeded properly yet). 467 */ 468 static int 469 rng_init(br_ssl_engine_context *cc) 470 { 471 const br_hash_class *h; 472 473 if (cc->rng_init_done != 0) { 474 return 1; 475 } 476 477 /* 478 * If using TLS-1.2, then SHA-256 or SHA-384 must be present (or 479 * both); we prefer SHA-256 which is faster for 32-bit systems. 480 * 481 * If using TLS-1.0 or 1.1 then SHA-1 must be present. 482 * 483 * Though HMAC_DRBG/SHA-1 is, as far as we know, as safe as 484 * these things can be, we still prefer the SHA-2 functions over 485 * SHA-1, if only for public relations (known theoretical 486 * weaknesses of SHA-1 with regards to collisions are mostly 487 * irrelevant here, but they still make people nervous). 488 */ 489 h = br_multihash_getimpl(&cc->mhash, br_sha256_ID); 490 if (!h) { 491 h = br_multihash_getimpl(&cc->mhash, br_sha384_ID); 492 if (!h) { 493 h = br_multihash_getimpl(&cc->mhash, 494 br_sha1_ID); 495 if (!h) { 496 br_ssl_engine_fail(cc, BR_ERR_BAD_STATE); 497 return 0; 498 } 499 } 500 } 501 br_hmac_drbg_init(&cc->rng, h, NULL, 0); 502 cc->rng_init_done = 1; 503 return 1; 504 } 505 506 /* see inner.h */ 507 int 508 br_ssl_engine_init_rand(br_ssl_engine_context *cc) 509 { 510 if (!rng_init(cc)) { 511 return 0; 512 } 513 514 /* 515 * We always try OS/hardware seeding once. If it works, then 516 * we assume proper seeding. If not, then external entropy must 517 * have been injected; otherwise, we report an error. 518 */ 519 if (!cc->rng_os_rand_done) { 520 br_prng_seeder sd; 521 522 sd = br_prng_seeder_system(NULL); 523 if (sd != 0 && sd(&cc->rng.vtable)) { 524 cc->rng_init_done = 2; 525 } 526 cc->rng_os_rand_done = 1; 527 } 528 if (cc->rng_init_done < 2) { 529 br_ssl_engine_fail(cc, BR_ERR_NO_RANDOM); 530 return 0; 531 } 532 return 1; 533 } 534 535 /* see bearssl_ssl.h */ 536 void 537 br_ssl_engine_inject_entropy(br_ssl_engine_context *cc, 538 const void *data, size_t len) 539 { 540 /* 541 * Externally provided entropy is assumed to be "good enough" 542 * (we cannot really test its quality) so if the RNG structure 543 * could be initialised at all, then we marked the RNG as 544 * "properly seeded". 545 */ 546 if (!rng_init(cc)) { 547 return; 548 } 549 br_hmac_drbg_update(&cc->rng, data, len); 550 cc->rng_init_done = 2; 551 } 552 553 /* 554 * We define a few internal functions that implement the low-level engine 555 * API for I/O; the external API (br_ssl_engine_sendapp_buf() and similar 556 * functions) is built upon these function, with special processing for 557 * records which are not of type "application data". 558 * 559 * recvrec_buf, recvrec_ack receives bytes from transport medium 560 * sendrec_buf, sendrec_ack send bytes to transport medium 561 * recvpld_buf, recvpld_ack receives payload data from engine 562 * sendpld_buf, sendpld_ack send payload data to engine 563 */ 564 565 static unsigned char * 566 recvrec_buf(const br_ssl_engine_context *rc, size_t *len) 567 { 568 if (rc->shutdown_recv) { 569 *len = 0; 570 return NULL; 571 } 572 573 /* 574 * Bytes from the transport can be injected only if the mode is 575 * compatible (in or in/out), and ixa == ixb; ixc then contains 576 * the number of bytes that are still expected (but it may 577 * exceed our buffer size). 578 * 579 * We cannot get "stuck" here (buffer is full, but still more 580 * data is expected) because oversized records are detected when 581 * their header is processed. 582 */ 583 switch (rc->iomode) { 584 case BR_IO_IN: 585 case BR_IO_INOUT: 586 if (rc->ixa == rc->ixb) { 587 size_t z; 588 589 z = rc->ixc; 590 if (z > rc->ibuf_len - rc->ixa) { 591 z = rc->ibuf_len - rc->ixa; 592 } 593 *len = z; 594 return rc->ibuf + rc->ixa; 595 } 596 break; 597 } 598 *len = 0; 599 return NULL; 600 } 601 602 static void 603 recvrec_ack(br_ssl_engine_context *rc, size_t len) 604 { 605 unsigned char *pbuf; 606 size_t pbuf_len; 607 608 /* 609 * Adjust state if necessary (for a shared input/output buffer): 610 * we got some incoming bytes, so we cannot (temporarily) handle 611 * outgoing data. 612 */ 613 if (rc->iomode == BR_IO_INOUT && rc->ibuf == rc->obuf) { 614 rc->iomode = BR_IO_IN; 615 } 616 617 /* 618 * Adjust data pointers. 619 */ 620 rc->ixb = (rc->ixa += len); 621 rc->ixc -= len; 622 623 /* 624 * If we are receiving a header and did not fully obtained it 625 * yet, then just wait for the next bytes. 626 */ 627 if (rc->ixa < 5) { 628 return; 629 } 630 631 /* 632 * If we just obtained a full header, process it. 633 */ 634 if (rc->ixa == 5) { 635 unsigned version; 636 unsigned rlen; 637 638 /* 639 * Get record type and version. We support only versions 640 * 3.x (if the version major number does not match, then 641 * we suppose that the record format is too alien for us 642 * to process it). 643 * 644 * Note: right now, we reject clients that try to send 645 * a ClientHello in a format compatible with SSL-2.0. It 646 * is unclear whether this will ever be supported; and 647 * if we want to support it, then this might be done in 648 * in the server-specific code, not here. 649 */ 650 rc->record_type_in = rc->ibuf[0]; 651 version = br_dec16be(rc->ibuf + 1); 652 if ((version >> 8) != 3) { 653 br_ssl_engine_fail(rc, BR_ERR_UNSUPPORTED_VERSION); 654 return; 655 } 656 657 /* 658 * We ensure that successive records have the same 659 * version. The handshake code must check and adjust the 660 * variables when necessary to accommodate the protocol 661 * negotiation details. 662 */ 663 if (rc->version_in != 0 && rc->version_in != version) { 664 br_ssl_engine_fail(rc, BR_ERR_BAD_VERSION); 665 return; 666 } 667 rc->version_in = version; 668 669 /* 670 * Decode record length. We must check that the length 671 * is valid (relatively to the current encryption mode) 672 * and also (if encryption is active) that the record 673 * will fit in our buffer. 674 * 675 * When no encryption is active, we can process records 676 * by chunks, and thus accept any record up to the 677 * maximum allowed plaintext length (16384 bytes). 678 */ 679 rlen = br_dec16be(rc->ibuf + 3); 680 if (rc->incrypt) { 681 if (!rc->in.vtable->check_length( 682 &rc->in.vtable, rlen)) 683 { 684 br_ssl_engine_fail(rc, BR_ERR_BAD_LENGTH); 685 return; 686 } 687 if (rlen > (rc->ibuf_len - 5)) { 688 br_ssl_engine_fail(rc, BR_ERR_TOO_LARGE); 689 return; 690 } 691 } else { 692 if (rlen > 16384) { 693 br_ssl_engine_fail(rc, BR_ERR_BAD_LENGTH); 694 return; 695 } 696 } 697 698 /* 699 * If the record is completely empty then we must switch 700 * to a new record. Note that, in that case, we 701 * completely ignore the record type, which is fitting 702 * since we received no actual data of that type. 703 * 704 * A completely empty record is technically allowed as 705 * long as encryption/MAC is not active, i.e. before 706 * completion of the first handshake. It it still weird; 707 * it might conceptually be useful as a heartbeat or 708 * keep-alive mechanism while some lengthy operation is 709 * going on, e.g. interaction with a human user. 710 */ 711 if (rlen == 0) { 712 make_ready_in(rc); 713 } else { 714 rc->ixa = rc->ixb = 5; 715 rc->ixc = rlen; 716 } 717 return; 718 } 719 720 /* 721 * If there is no active encryption, then the data can be read 722 * right away. Note that we do not receive bytes from the 723 * transport medium when we still have payload bytes to be 724 * acknowledged. 725 */ 726 if (!rc->incrypt) { 727 rc->ixa = 5; 728 return; 729 } 730 731 /* 732 * Since encryption is active, we must wait for a full record 733 * before processing it. 734 */ 735 if (rc->ixc != 0) { 736 return; 737 } 738 739 /* 740 * We got the full record. Decrypt it. 741 */ 742 pbuf_len = rc->ixa - 5; 743 pbuf = rc->in.vtable->decrypt(&rc->in.vtable, 744 rc->record_type_in, rc->version_in, rc->ibuf + 5, &pbuf_len); 745 if (pbuf == 0) { 746 br_ssl_engine_fail(rc, BR_ERR_BAD_MAC); 747 return; 748 } 749 rc->ixa = (size_t)(pbuf - rc->ibuf); 750 rc->ixb = rc->ixa + pbuf_len; 751 752 /* 753 * Decryption may have yielded an empty record, in which case 754 * we get back to "ready" state immediately. 755 */ 756 if (rc->ixa == rc->ixb) { 757 make_ready_in(rc); 758 } 759 } 760 761 /* see inner.h */ 762 int 763 br_ssl_engine_recvrec_finished(const br_ssl_engine_context *rc) 764 { 765 switch (rc->iomode) { 766 case BR_IO_IN: 767 case BR_IO_INOUT: 768 return rc->ixc == 0 || rc->ixa < 5; 769 default: 770 return 1; 771 } 772 } 773 774 static unsigned char * 775 recvpld_buf(const br_ssl_engine_context *rc, size_t *len) 776 { 777 /* 778 * There is payload data to be read only if the mode is 779 * compatible, and ixa != ixb. 780 */ 781 switch (rc->iomode) { 782 case BR_IO_IN: 783 case BR_IO_INOUT: 784 *len = rc->ixb - rc->ixa; 785 return (*len == 0) ? NULL : (rc->ibuf + rc->ixa); 786 default: 787 *len = 0; 788 return NULL; 789 } 790 } 791 792 static void 793 recvpld_ack(br_ssl_engine_context *rc, size_t len) 794 { 795 rc->ixa += len; 796 797 /* 798 * If we read all the available data, then we either expect 799 * the remainder of the current record (if the current record 800 * was not finished; this may happen when encryption is not 801 * active), or go to "ready" state. 802 */ 803 if (rc->ixa == rc->ixb) { 804 if (rc->ixc == 0) { 805 make_ready_in(rc); 806 } else { 807 rc->ixa = rc->ixb = 5; 808 } 809 } 810 } 811 812 static unsigned char * 813 sendpld_buf(const br_ssl_engine_context *rc, size_t *len) 814 { 815 /* 816 * Payload data can be injected only if the current mode is 817 * compatible, and oxa != oxb. 818 */ 819 switch (rc->iomode) { 820 case BR_IO_OUT: 821 case BR_IO_INOUT: 822 *len = rc->oxb - rc->oxa; 823 return (*len == 0) ? NULL : (rc->obuf + rc->oxa); 824 default: 825 *len = 0; 826 return NULL; 827 } 828 } 829 830 /* 831 * If some payload bytes have been accumulated, then wrap them into 832 * an outgoing record. Otherwise, this function does nothing, unless 833 * 'force' is non-zero, in which case an empty record is assembled. 834 * 835 * The caller must take care not to invoke this function if the engine 836 * is not currently ready to receive payload bytes to send. 837 */ 838 static void 839 sendpld_flush(br_ssl_engine_context *rc, int force) 840 { 841 size_t xlen; 842 unsigned char *buf; 843 844 if (rc->oxa == rc->oxb) { 845 return; 846 } 847 xlen = rc->oxa - rc->oxc; 848 if (xlen == 0 && !force) { 849 return; 850 } 851 buf = rc->out.vtable->encrypt(&rc->out.vtable, 852 rc->record_type_out, rc->version_out, 853 rc->obuf + rc->oxc, &xlen); 854 rc->oxb = rc->oxa = (size_t)(buf - rc->obuf); 855 rc->oxc = rc->oxa + xlen; 856 } 857 858 static void 859 sendpld_ack(br_ssl_engine_context *rc, size_t len) 860 { 861 /* 862 * If using a shared buffer, then we may have to modify the 863 * current mode. 864 */ 865 if (rc->iomode == BR_IO_INOUT && rc->ibuf == rc->obuf) { 866 rc->iomode = BR_IO_OUT; 867 } 868 rc->oxa += len; 869 if (rc->oxa >= rc->oxb) { 870 /* 871 * Set oxb to one more than oxa so that sendpld_flush() 872 * does not mistakingly believe that a record is 873 * already prepared and being sent. 874 */ 875 rc->oxb = rc->oxa + 1; 876 sendpld_flush(rc, 0); 877 } 878 } 879 880 static unsigned char * 881 sendrec_buf(const br_ssl_engine_context *rc, size_t *len) 882 { 883 /* 884 * When still gathering payload bytes, oxc points to the start 885 * of the record data, so oxc <= oxa. However, when a full 886 * record has been completed, oxc points to the end of the record, 887 * so oxc > oxa. 888 */ 889 switch (rc->iomode) { 890 case BR_IO_OUT: 891 case BR_IO_INOUT: 892 if (rc->oxc > rc->oxa) { 893 *len = rc->oxc - rc->oxa; 894 return rc->obuf + rc->oxa; 895 } 896 break; 897 } 898 *len = 0; 899 return NULL; 900 } 901 902 static void 903 sendrec_ack(br_ssl_engine_context *rc, size_t len) 904 { 905 rc->oxb = (rc->oxa += len); 906 if (rc->oxa == rc->oxc) { 907 make_ready_out(rc); 908 } 909 } 910 911 /* 912 * Test whether there is some buffered outgoing record that still must 913 * sent. 914 */ 915 static inline int 916 has_rec_tosend(const br_ssl_engine_context *rc) 917 { 918 return rc->oxa == rc->oxb && rc->oxa != rc->oxc; 919 } 920 921 /* 922 * The "no encryption" mode has no overhead. It limits the payload size 923 * to the maximum size allowed by the standard (16384 bytes); the caller 924 * is responsible for possibly enforcing a smaller fragment length. 925 */ 926 static void 927 clear_max_plaintext(const br_sslrec_out_clear_context *cc, 928 size_t *start, size_t *end) 929 { 930 size_t len; 931 932 (void)cc; 933 len = *end - *start; 934 if (len > 16384) { 935 *end = *start + 16384; 936 } 937 } 938 939 /* 940 * In "no encryption" mode, encryption is trivial (a no-operation) so 941 * we just have to encode the header. 942 */ 943 static unsigned char * 944 clear_encrypt(br_sslrec_out_clear_context *cc, 945 int record_type, unsigned version, void *data, size_t *data_len) 946 { 947 unsigned char *buf; 948 949 (void)cc; 950 buf = (unsigned char *)data - 5; 951 buf[0] = record_type; 952 br_enc16be(buf + 1, version); 953 br_enc16be(buf + 3, *data_len); 954 *data_len += 5; 955 return buf; 956 } 957 958 /* see bearssl_ssl.h */ 959 const br_sslrec_out_class br_sslrec_out_clear_vtable = { 960 sizeof(br_sslrec_out_clear_context), 961 (void (*)(const br_sslrec_out_class *const *, size_t *, size_t *)) 962 &clear_max_plaintext, 963 (unsigned char *(*)(const br_sslrec_out_class **, 964 int, unsigned, void *, size_t *)) 965 &clear_encrypt 966 }; 967 968 /* ==================================================================== */ 969 /* 970 * In this part of the file, we handle the various record types, and 971 * communications with the handshake processor. 972 */ 973 974 /* 975 * IMPLEMENTATION NOTES 976 * ==================== 977 * 978 * The handshake processor is written in T0 and runs as a coroutine. 979 * It receives the contents of all records except application data, and 980 * is responsible for producing the contents of all records except 981 * application data. 982 * 983 * A state flag is maintained, which specifies whether application data 984 * is acceptable or not. When it is set: 985 * 986 * -- Application data can be injected as payload data (provided that 987 * the output buffer is ready for that). 988 * 989 * -- Incoming application data records are accepted, and yield data 990 * that the caller may retrieve. 991 * 992 * When the flag is cleared, application data is not accepted from the 993 * application, and incoming application data records trigger an error. 994 * 995 * 996 * Records of type handshake, alert or change-cipher-spec are handled 997 * by the handshake processor. The handshake processor is written in T0 998 * and runs as a coroutine; it gets invoked whenever one of the following 999 * situations is reached: 1000 * 1001 * -- An incoming record has type handshake, alert or change-cipher-spec, 1002 * and yields data that can be read (zero-length records are thus 1003 * ignored). 1004 * 1005 * -- An outgoing record has just finished being sent, and the "application 1006 * data" flag is cleared. 1007 * 1008 * -- The caller wishes to perform a close (call to br_ssl_engine_close()). 1009 * 1010 * -- The caller wishes to perform a renegotiation (call to 1011 * br_ssl_engine_renegotiate()). 1012 * 1013 * Whenever the handshake processor is entered, access to the payload 1014 * buffers is provided, along with some information about explicit 1015 * closures or renegotiations. 1016 */ 1017 1018 /* see bearssl_ssl.h */ 1019 void 1020 br_ssl_engine_set_suites(br_ssl_engine_context *cc, 1021 const uint16_t *suites, size_t suites_num) 1022 { 1023 if ((suites_num * sizeof *suites) > sizeof cc->suites_buf) { 1024 br_ssl_engine_fail(cc, BR_ERR_BAD_PARAM); 1025 return; 1026 } 1027 memcpy(cc->suites_buf, suites, suites_num * sizeof *suites); 1028 cc->suites_num = suites_num; 1029 } 1030 1031 /* 1032 * Give control to handshake processor. 'action' is 1 for a close, 1033 * 2 for a renegotiation, or 0 for a jump due to I/O completion. 1034 */ 1035 static void 1036 jump_handshake(br_ssl_engine_context *cc, int action) 1037 { 1038 /* 1039 * We use a loop because the handshake processor actions may 1040 * allow for more actions; namely, if the processor reads all 1041 * input data, then it may allow for output data to be produced, 1042 * in case of a shared in/out buffer. 1043 */ 1044 for (;;) { 1045 size_t hlen_in, hlen_out; 1046 1047 /* 1048 * Get input buffer. We do not want to provide 1049 * application data to the handshake processor (we could 1050 * get called with an explicit close or renegotiation 1051 * while there is application data ready to be read). 1052 */ 1053 cc->hbuf_in = recvpld_buf(cc, &hlen_in); 1054 if (cc->hbuf_in != NULL 1055 && cc->record_type_in == BR_SSL_APPLICATION_DATA) 1056 { 1057 hlen_in = 0; 1058 } 1059 1060 /* 1061 * Get output buffer. The handshake processor never 1062 * leaves an unfinished outgoing record, so if there is 1063 * buffered output, then it MUST be some application 1064 * data, so the processor cannot write to it. 1065 */ 1066 cc->saved_hbuf_out = cc->hbuf_out = sendpld_buf(cc, &hlen_out); 1067 if (cc->hbuf_out != NULL && br_ssl_engine_has_pld_to_send(cc)) { 1068 hlen_out = 0; 1069 } 1070 1071 /* 1072 * Note: hlen_in and hlen_out can be both non-zero only if 1073 * the input and output buffers are disjoint. Thus, we can 1074 * offer both buffers to the handshake code. 1075 */ 1076 1077 cc->hlen_in = hlen_in; 1078 cc->hlen_out = hlen_out; 1079 cc->action = action; 1080 cc->hsrun(&cc->cpu); 1081 if (br_ssl_engine_closed(cc)) { 1082 return; 1083 } 1084 if (cc->hbuf_out != cc->saved_hbuf_out) { 1085 sendpld_ack(cc, cc->hbuf_out - cc->saved_hbuf_out); 1086 } 1087 if (hlen_in != cc->hlen_in) { 1088 recvpld_ack(cc, hlen_in - cc->hlen_in); 1089 if (cc->hlen_in == 0) { 1090 /* 1091 * We read all data bytes, which may have 1092 * released the output buffer in case it 1093 * is shared with the input buffer, and 1094 * the handshake code might be waiting for 1095 * that. 1096 */ 1097 action = 0; 1098 continue; 1099 } 1100 } 1101 break; 1102 } 1103 } 1104 1105 /* see inner.h */ 1106 void 1107 br_ssl_engine_flush_record(br_ssl_engine_context *cc) 1108 { 1109 if (cc->hbuf_out != cc->saved_hbuf_out) { 1110 sendpld_ack(cc, cc->hbuf_out - cc->saved_hbuf_out); 1111 } 1112 if (br_ssl_engine_has_pld_to_send(cc)) { 1113 sendpld_flush(cc, 0); 1114 } 1115 cc->saved_hbuf_out = cc->hbuf_out = sendpld_buf(cc, &cc->hlen_out); 1116 } 1117 1118 /* see bearssl_ssl.h */ 1119 unsigned char * 1120 br_ssl_engine_sendapp_buf(const br_ssl_engine_context *cc, size_t *len) 1121 { 1122 if (!(cc->application_data & 1)) { 1123 *len = 0; 1124 return NULL; 1125 } 1126 return sendpld_buf(cc, len); 1127 } 1128 1129 /* see bearssl_ssl.h */ 1130 void 1131 br_ssl_engine_sendapp_ack(br_ssl_engine_context *cc, size_t len) 1132 { 1133 sendpld_ack(cc, len); 1134 } 1135 1136 /* see bearssl_ssl.h */ 1137 unsigned char * 1138 br_ssl_engine_recvapp_buf(const br_ssl_engine_context *cc, size_t *len) 1139 { 1140 if (!(cc->application_data & 1) 1141 || cc->record_type_in != BR_SSL_APPLICATION_DATA) 1142 { 1143 *len = 0; 1144 return NULL; 1145 } 1146 return recvpld_buf(cc, len); 1147 } 1148 1149 /* see bearssl_ssl.h */ 1150 void 1151 br_ssl_engine_recvapp_ack(br_ssl_engine_context *cc, size_t len) 1152 { 1153 recvpld_ack(cc, len); 1154 } 1155 1156 /* see bearssl_ssl.h */ 1157 unsigned char * 1158 br_ssl_engine_sendrec_buf(const br_ssl_engine_context *cc, size_t *len) 1159 { 1160 return sendrec_buf(cc, len); 1161 } 1162 1163 /* see bearssl_ssl.h */ 1164 void 1165 br_ssl_engine_sendrec_ack(br_ssl_engine_context *cc, size_t len) 1166 { 1167 sendrec_ack(cc, len); 1168 if (len != 0 && !has_rec_tosend(cc) 1169 && (cc->record_type_out != BR_SSL_APPLICATION_DATA 1170 || (cc->application_data & 1) == 0)) 1171 { 1172 jump_handshake(cc, 0); 1173 } 1174 } 1175 1176 /* see bearssl_ssl.h */ 1177 unsigned char * 1178 br_ssl_engine_recvrec_buf(const br_ssl_engine_context *cc, size_t *len) 1179 { 1180 return recvrec_buf(cc, len); 1181 } 1182 1183 /* see bearssl_ssl.h */ 1184 void 1185 br_ssl_engine_recvrec_ack(br_ssl_engine_context *cc, size_t len) 1186 { 1187 unsigned char *buf; 1188 1189 recvrec_ack(cc, len); 1190 if (br_ssl_engine_closed(cc)) { 1191 return; 1192 } 1193 1194 /* 1195 * We just received some bytes from the peer. This may have 1196 * yielded some payload bytes, in which case we must process 1197 * them according to the record type. 1198 */ 1199 buf = recvpld_buf(cc, &len); 1200 if (buf != NULL) { 1201 switch (cc->record_type_in) { 1202 case BR_SSL_CHANGE_CIPHER_SPEC: 1203 case BR_SSL_ALERT: 1204 case BR_SSL_HANDSHAKE: 1205 jump_handshake(cc, 0); 1206 break; 1207 case BR_SSL_APPLICATION_DATA: 1208 if (cc->application_data == 1) { 1209 break; 1210 } 1211 1212 /* 1213 * If we are currently closing, and waiting for 1214 * a close_notify from the peer, then incoming 1215 * application data should be discarded. 1216 */ 1217 if (cc->application_data == 2) { 1218 recvpld_ack(cc, len); 1219 break; 1220 } 1221 1222 /* Fall through */ 1223 default: 1224 br_ssl_engine_fail(cc, BR_ERR_UNEXPECTED); 1225 break; 1226 } 1227 } 1228 } 1229 1230 /* see bearssl_ssl.h */ 1231 void 1232 br_ssl_engine_close(br_ssl_engine_context *cc) 1233 { 1234 if (!br_ssl_engine_closed(cc)) { 1235 jump_handshake(cc, 1); 1236 } 1237 } 1238 1239 /* see bearssl_ssl.h */ 1240 int 1241 br_ssl_engine_renegotiate(br_ssl_engine_context *cc) 1242 { 1243 size_t len; 1244 1245 if (br_ssl_engine_closed(cc) || cc->reneg == 1 1246 || (cc->flags & BR_OPT_NO_RENEGOTIATION) != 0 1247 || br_ssl_engine_recvapp_buf(cc, &len) != NULL) 1248 { 1249 return 0; 1250 } 1251 jump_handshake(cc, 2); 1252 return 1; 1253 } 1254 1255 /* see bearssl.h */ 1256 unsigned 1257 br_ssl_engine_current_state(const br_ssl_engine_context *cc) 1258 { 1259 unsigned s; 1260 size_t len; 1261 1262 if (br_ssl_engine_closed(cc)) { 1263 return BR_SSL_CLOSED; 1264 } 1265 1266 s = 0; 1267 if (br_ssl_engine_sendrec_buf(cc, &len) != NULL) { 1268 s |= BR_SSL_SENDREC; 1269 } 1270 if (br_ssl_engine_recvrec_buf(cc, &len) != NULL) { 1271 s |= BR_SSL_RECVREC; 1272 } 1273 if (br_ssl_engine_sendapp_buf(cc, &len) != NULL) { 1274 s |= BR_SSL_SENDAPP; 1275 } 1276 if (br_ssl_engine_recvapp_buf(cc, &len) != NULL) { 1277 s |= BR_SSL_RECVAPP; 1278 } 1279 return s; 1280 } 1281 1282 /* see bearssl_ssl.h */ 1283 void 1284 br_ssl_engine_flush(br_ssl_engine_context *cc, int force) 1285 { 1286 if (!br_ssl_engine_closed(cc) && (cc->application_data & 1) != 0) { 1287 sendpld_flush(cc, force); 1288 } 1289 } 1290 1291 /* see inner.h */ 1292 void 1293 br_ssl_engine_hs_reset(br_ssl_engine_context *cc, 1294 void (*hsinit)(void *), void (*hsrun)(void *)) 1295 { 1296 engine_clearbuf(cc); 1297 cc->cpu.dp = cc->dp_stack; 1298 cc->cpu.rp = cc->rp_stack; 1299 hsinit(&cc->cpu); 1300 cc->hsrun = hsrun; 1301 cc->shutdown_recv = 0; 1302 cc->application_data = 0; 1303 cc->alert = 0; 1304 jump_handshake(cc, 0); 1305 } 1306 1307 /* see inner.h */ 1308 br_tls_prf_impl 1309 br_ssl_engine_get_PRF(br_ssl_engine_context *cc, int prf_id) 1310 { 1311 if (cc->session.version >= BR_TLS12) { 1312 if (prf_id == br_sha384_ID) { 1313 return cc->prf_sha384; 1314 } else { 1315 return cc->prf_sha256; 1316 } 1317 } else { 1318 return cc->prf10; 1319 } 1320 } 1321 1322 /* see inner.h */ 1323 void 1324 br_ssl_engine_compute_master(br_ssl_engine_context *cc, 1325 int prf_id, const void *pms, size_t pms_len) 1326 { 1327 br_tls_prf_impl iprf; 1328 br_tls_prf_seed_chunk seed[2] = { 1329 { cc->client_random, sizeof cc->client_random }, 1330 { cc->server_random, sizeof cc->server_random } 1331 }; 1332 1333 iprf = br_ssl_engine_get_PRF(cc, prf_id); 1334 iprf(cc->session.master_secret, sizeof cc->session.master_secret, 1335 pms, pms_len, "master secret", 2, seed); 1336 } 1337 1338 /* 1339 * Compute key block. 1340 */ 1341 static void 1342 compute_key_block(br_ssl_engine_context *cc, int prf_id, 1343 size_t half_len, unsigned char *kb) 1344 { 1345 br_tls_prf_impl iprf; 1346 br_tls_prf_seed_chunk seed[2] = { 1347 { cc->server_random, sizeof cc->server_random }, 1348 { cc->client_random, sizeof cc->client_random } 1349 }; 1350 1351 iprf = br_ssl_engine_get_PRF(cc, prf_id); 1352 iprf(kb, half_len << 1, 1353 cc->session.master_secret, sizeof cc->session.master_secret, 1354 "key expansion", 2, seed); 1355 } 1356 1357 /* see inner.h */ 1358 void 1359 br_ssl_engine_switch_cbc_in(br_ssl_engine_context *cc, 1360 int is_client, int prf_id, int mac_id, 1361 const br_block_cbcdec_class *bc_impl, size_t cipher_key_len) 1362 { 1363 unsigned char kb[192]; 1364 unsigned char *cipher_key, *mac_key, *iv; 1365 const br_hash_class *imh; 1366 size_t mac_key_len, mac_out_len, iv_len; 1367 1368 imh = br_ssl_engine_get_hash(cc, mac_id); 1369 mac_out_len = (imh->desc >> BR_HASHDESC_OUT_OFF) & BR_HASHDESC_OUT_MASK; 1370 mac_key_len = mac_out_len; 1371 1372 /* 1373 * TLS 1.1+ uses per-record explicit IV, so no IV to generate here. 1374 */ 1375 if (cc->session.version >= BR_TLS11) { 1376 iv_len = 0; 1377 } else { 1378 iv_len = bc_impl->block_size; 1379 } 1380 compute_key_block(cc, prf_id, 1381 mac_key_len + cipher_key_len + iv_len, kb); 1382 if (is_client) { 1383 mac_key = &kb[mac_key_len]; 1384 cipher_key = &kb[(mac_key_len << 1) + cipher_key_len]; 1385 iv = &kb[((mac_key_len + cipher_key_len) << 1) + iv_len]; 1386 } else { 1387 mac_key = &kb[0]; 1388 cipher_key = &kb[mac_key_len << 1]; 1389 iv = &kb[(mac_key_len + cipher_key_len) << 1]; 1390 } 1391 if (iv_len == 0) { 1392 iv = NULL; 1393 } 1394 cc->icbc_in->init(&cc->in.cbc.vtable, 1395 bc_impl, cipher_key, cipher_key_len, 1396 imh, mac_key, mac_key_len, mac_out_len, iv); 1397 cc->incrypt = 1; 1398 } 1399 1400 /* see inner.h */ 1401 void 1402 br_ssl_engine_switch_cbc_out(br_ssl_engine_context *cc, 1403 int is_client, int prf_id, int mac_id, 1404 const br_block_cbcenc_class *bc_impl, size_t cipher_key_len) 1405 { 1406 unsigned char kb[192]; 1407 unsigned char *cipher_key, *mac_key, *iv; 1408 const br_hash_class *imh; 1409 size_t mac_key_len, mac_out_len, iv_len; 1410 1411 imh = br_ssl_engine_get_hash(cc, mac_id); 1412 mac_out_len = (imh->desc >> BR_HASHDESC_OUT_OFF) & BR_HASHDESC_OUT_MASK; 1413 mac_key_len = mac_out_len; 1414 1415 /* 1416 * TLS 1.1+ uses per-record explicit IV, so no IV to generate here. 1417 */ 1418 if (cc->session.version >= BR_TLS11) { 1419 iv_len = 0; 1420 } else { 1421 iv_len = bc_impl->block_size; 1422 } 1423 compute_key_block(cc, prf_id, 1424 mac_key_len + cipher_key_len + iv_len, kb); 1425 if (is_client) { 1426 mac_key = &kb[0]; 1427 cipher_key = &kb[mac_key_len << 1]; 1428 iv = &kb[(mac_key_len + cipher_key_len) << 1]; 1429 } else { 1430 mac_key = &kb[mac_key_len]; 1431 cipher_key = &kb[(mac_key_len << 1) + cipher_key_len]; 1432 iv = &kb[((mac_key_len + cipher_key_len) << 1) + iv_len]; 1433 } 1434 if (iv_len == 0) { 1435 iv = NULL; 1436 } 1437 cc->icbc_out->init(&cc->out.cbc.vtable, 1438 bc_impl, cipher_key, cipher_key_len, 1439 imh, mac_key, mac_key_len, mac_out_len, iv); 1440 } 1441 1442 /* see inner.h */ 1443 void 1444 br_ssl_engine_switch_gcm_in(br_ssl_engine_context *cc, 1445 int is_client, int prf_id, 1446 const br_block_ctr_class *bc_impl, size_t cipher_key_len) 1447 { 1448 unsigned char kb[72]; 1449 unsigned char *cipher_key, *iv; 1450 1451 compute_key_block(cc, prf_id, cipher_key_len + 4, kb); 1452 if (is_client) { 1453 cipher_key = &kb[cipher_key_len]; 1454 iv = &kb[(cipher_key_len << 1) + 4]; 1455 } else { 1456 cipher_key = &kb[0]; 1457 iv = &kb[cipher_key_len << 1]; 1458 } 1459 cc->igcm_in->init(&cc->in.gcm.vtable.in, 1460 bc_impl, cipher_key, cipher_key_len, cc->ighash, iv); 1461 cc->incrypt = 1; 1462 } 1463 1464 /* see inner.h */ 1465 void 1466 br_ssl_engine_switch_gcm_out(br_ssl_engine_context *cc, 1467 int is_client, int prf_id, 1468 const br_block_ctr_class *bc_impl, size_t cipher_key_len) 1469 { 1470 unsigned char kb[72]; 1471 unsigned char *cipher_key, *iv; 1472 1473 compute_key_block(cc, prf_id, cipher_key_len + 4, kb); 1474 if (is_client) { 1475 cipher_key = &kb[0]; 1476 iv = &kb[cipher_key_len << 1]; 1477 } else { 1478 cipher_key = &kb[cipher_key_len]; 1479 iv = &kb[(cipher_key_len << 1) + 4]; 1480 } 1481 cc->igcm_out->init(&cc->out.gcm.vtable.out, 1482 bc_impl, cipher_key, cipher_key_len, cc->ighash, iv); 1483 } 1484 1485 /* see inner.h */ 1486 void 1487 br_ssl_engine_switch_chapol_in(br_ssl_engine_context *cc, 1488 int is_client, int prf_id) 1489 { 1490 unsigned char kb[88]; 1491 unsigned char *cipher_key, *iv; 1492 1493 compute_key_block(cc, prf_id, 44, kb); 1494 if (is_client) { 1495 cipher_key = &kb[32]; 1496 iv = &kb[76]; 1497 } else { 1498 cipher_key = &kb[0]; 1499 iv = &kb[64]; 1500 } 1501 cc->ichapol_in->init(&cc->in.chapol.vtable.in, 1502 cc->ichacha, cc->ipoly, cipher_key, iv); 1503 cc->incrypt = 1; 1504 } 1505 1506 /* see inner.h */ 1507 void 1508 br_ssl_engine_switch_chapol_out(br_ssl_engine_context *cc, 1509 int is_client, int prf_id) 1510 { 1511 unsigned char kb[88]; 1512 unsigned char *cipher_key, *iv; 1513 1514 compute_key_block(cc, prf_id, 44, kb); 1515 if (is_client) { 1516 cipher_key = &kb[0]; 1517 iv = &kb[64]; 1518 } else { 1519 cipher_key = &kb[32]; 1520 iv = &kb[76]; 1521 } 1522 cc->ichapol_out->init(&cc->out.chapol.vtable.out, 1523 cc->ichacha, cc->ipoly, cipher_key, iv); 1524 } 1525 1526 /* see inner.h */ 1527 void 1528 br_ssl_engine_switch_ccm_in(br_ssl_engine_context *cc, 1529 int is_client, int prf_id, 1530 const br_block_ctrcbc_class *bc_impl, 1531 size_t cipher_key_len, size_t tag_len) 1532 { 1533 unsigned char kb[72]; 1534 unsigned char *cipher_key, *iv; 1535 1536 compute_key_block(cc, prf_id, cipher_key_len + 4, kb); 1537 if (is_client) { 1538 cipher_key = &kb[cipher_key_len]; 1539 iv = &kb[(cipher_key_len << 1) + 4]; 1540 } else { 1541 cipher_key = &kb[0]; 1542 iv = &kb[cipher_key_len << 1]; 1543 } 1544 cc->iccm_in->init(&cc->in.ccm.vtable.in, 1545 bc_impl, cipher_key, cipher_key_len, iv, tag_len); 1546 cc->incrypt = 1; 1547 } 1548 1549 /* see inner.h */ 1550 void 1551 br_ssl_engine_switch_ccm_out(br_ssl_engine_context *cc, 1552 int is_client, int prf_id, 1553 const br_block_ctrcbc_class *bc_impl, 1554 size_t cipher_key_len, size_t tag_len) 1555 { 1556 unsigned char kb[72]; 1557 unsigned char *cipher_key, *iv; 1558 1559 compute_key_block(cc, prf_id, cipher_key_len + 4, kb); 1560 if (is_client) { 1561 cipher_key = &kb[0]; 1562 iv = &kb[cipher_key_len << 1]; 1563 } else { 1564 cipher_key = &kb[cipher_key_len]; 1565 iv = &kb[(cipher_key_len << 1) + 4]; 1566 } 1567 cc->iccm_out->init(&cc->out.ccm.vtable.out, 1568 bc_impl, cipher_key, cipher_key_len, iv, tag_len); 1569 } 1570