Home | History | Annotate | Download | only in ssl

Lines Matching refs:ssl

4  * This package is an SSL implementation written
6 * The implementation was written so as to conform with Netscapes SSL.
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
109 #include <openssl/ssl.h>
125 static int do_ssl3_write(SSL *ssl, int type, const uint8_t *buf, unsigned len);
128 * |ssl->s3->rrec| and returns one. Otherwise it returns <= 0 on error or if
130 static int ssl3_get_record(SSL *ssl) {
132 switch (ssl->s3->recv_shutdown) {
136 OPENSSL_PUT_ERROR(SSL, SSL_R_PROTOCOL_IS_SHUTDOWN);
146 tls_open_record(ssl, &type, &body, &consumed, &alert,
147 ssl_read_buffer(ssl), ssl_read_buffer_len(ssl));
149 ssl_read_buffer_consume(ssl, consumed);
153 int read_ret = ssl_read_buffer_extend_to(ssl, consumed);
162 OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
166 SSL3_RECORD *rr = &ssl->s3->rrec;
183 ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);
188 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
192 int ssl3_write_app_data(SSL *ssl, int *out_needs_handshake, const uint8_t *buf,
194 assert(ssl_can_write(ssl));
195 assert(ssl->s3->aead_write_ctx != NULL);
201 assert(ssl->s3->wnum <= INT_MAX);
202 tot = ssl->s3->wnum;
203 ssl->s3->wnum = 0;
213 OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_LENGTH);
218 !ssl->server && SSL_in_early_data(ssl) && ssl->s3->hs->can_early_write;
224 unsigned max = ssl->max_send_fragment;
225 if (is_early_data_write && max > ssl->session->ticket_max_early_data -
226 ssl->s3->hs->early_data_written) {
227 max = ssl->session->ticket_max_early_data - ssl->s3->hs->early_data_written;
229 ssl->s3->wnum = tot;
230 ssl->s3->hs->can_early_write = 0;
242 int ret = do_ssl3_write(ssl, SSL3_RT_APPLICATION_DATA, &buf[tot], nw);
244 ssl->s3->wnum = tot;
249 ssl->s3->hs->early_data_written += ret;
252 if (ret == (int)n || (ssl->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) {
261 static int ssl3_write_pending(SSL *ssl, int type, const uint8_t *buf,
263 if (ssl->s3->wpend_tot > (int)len ||
264 (!(ssl->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER) &&
265 ssl->s3->wpend_buf != buf) ||
266 ssl->s3->wpend_type != type) {
267 OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_WRITE_RETRY);
271 int ret = ssl_write_buffer_flush(ssl);
275 ssl->s3->wpend_pending = 0;
276 return ssl->s3->wpend_ret;
279 /* do_ssl3_write writes an SSL record of the given type. */
280 static int do_ssl3_write(SSL *ssl, int type, const uint8_t *buf, unsigned len) {
282 if (ssl->s3->wpend_pending) {
283 return ssl3_write_pending(ssl, type, buf, len);
287 OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
296 if (ssl->s3->pending_flight != NULL) {
298 ssl->s3->pending_flight->length - ssl->s3->pending_flight_offset;
301 size_t max_out = len + SSL_max_seal_overhead(ssl);
303 OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
310 if (!ssl_write_buffer_init(ssl, &out, max_out)) {
318 if (ssl->s3->pending_flight != NULL) {
320 out, ssl->s3->pending_flight->data + ssl->s3->pending_flight_offset,
322 BUF_MEM_free(ssl->s3->pending_flight);
323 ssl->s3->pending_flight = NULL;
324 ssl->s3->pending_flight_offset = 0;
327 if (!tls_seal_record(ssl, out + flight_len, &ciphertext_len,
331 ssl_write_buffer_set_len(ssl, flight_len + ciphertext_len);
335 ssl->s3->key_update_pending = 0;
339 ssl->s3->wpend_tot = len;
340 ssl->s3->wpend_buf = buf;
341 ssl->s3->wpend_type = type;
342 ssl->s3->wpend_ret = len;
343 ssl->s3->wpend_pending = 1;
346 return ssl3_write_pending(ssl, type, buf, len);
349 static int consume_record(SSL *ssl, uint8_t *out, int len, int peek) {
350 SSL3_RECORD *rr = &ssl->s3->rrec;
366 ssl_read_buffer_discard(ssl);
372 int ssl3_read_app_data(SSL *ssl, int *out_got_handshake, uint8_t *buf, int len,
374 assert(ssl_can_read(ssl));
375 assert(ssl->s3->aead_read_ctx != NULL);
378 ssl->method->release_current_message(ssl, 0 /* don't free buffer */);
380 SSL3_RECORD *rr = &ssl->s3->rrec;
385 int has_hs_data = ssl->init_buf != NULL && ssl->init_buf->length > 0;
389 int ret = ssl3_get_record(ssl);
398 if (SSL_in_init(ssl)) {
399 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
400 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
407 if (ssl->server && ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
408 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_NO_RENEGOTIATION);
409 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_RENEGOTIATION);
414 int ret = ssl3_get_message(ssl);
422 const int is_early_data_read = ssl->server &&
423 ssl->s3->hs != NULL &&
424 ssl->s3->hs->can_early_read &&
425 ssl3_protocol_version(ssl) >= TLS1_3_VERSION;
435 ssl_read_buffer_discard(ssl);
437 ssl->s3->hs->can_early_read = 0;
443 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
444 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
449 if (rr->length > kMaxEarlyDataAccepted - ssl->s3->hs->early_data_read) {
450 OPENSSL_PUT_ERROR(SSL, SSL_R_TOO_MUCH_READ_EARLY_DATA);
451 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL3_AD_UNEXPECTED_MESSAGE);
455 ssl->s3->hs->early_data_read += rr->length;
459 return consume_record(ssl, buf, len, peek);
466 int ssl3_read_change_cipher_spec(SSL *ssl) {
467 SSL3_RECORD *rr = &ssl->s3->rrec;
470 int ret = ssl3_get_record(ssl);
477 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
478 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
483 OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_CHANGE_CIPHER_SPEC);
484 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
488 ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data,
492 ssl_read_buffer_discard(ssl);
496 void ssl3_read_close_notify(SSL *ssl) {
498 while (ssl3_get_record(ssl) > 0) {
503 int ssl3_read_handshake_bytes(SSL *ssl, uint8_t *buf, int len) {
504 SSL3_RECORD *rr = &ssl->s3->rrec;
509 int ret = ssl3_get_record(ssl);
519 if (!ssl->server && rr->type == SSL3_RT_APPLICATION_DATA &&
520 ssl->s3->aead_read_ctx == NULL) {
521 OPENSSL_PUT_ERROR(SSL, SSL_R_APPLICATION_DATA_INSTEAD_OF_HANDSHAKE);
522 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
529 !(!ssl->server &&
530 ssl->tls13_variant == tls13_record_type_experiment &&
531 ssl->s3->aead_read_ctx == NULL &&
533 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
534 ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
539 return consume_record(ssl, buf, len, 0 /* consume data */);
546 int ssl3_send_alert(SSL *ssl, int level, int desc) {
548 if (ssl->s3->send_shutdown != ssl_shutdown_none) {
549 OPENSSL_PUT_ERROR(SSL, SSL_R_PROTOCOL_IS_SHUTDOWN);
554 ssl->s3->send_shutdown = ssl_shutdown_close_notify;
557 ssl->s3->send_shutdown = ssl_shutdown_fatal_alert;
560 ssl->s3->alert_dispatch = 1;
561 ssl->s3->send_alert[0] = level;
562 ssl->s3->send_alert[1] = desc;
563 if (!ssl_write_buffer_is_pending(ssl)) {
566 return ssl->method->dispatch_alert(ssl);
573 int ssl3_dispatch_alert(SSL *ssl) {
574 int ret = do_ssl3_write(ssl, SSL3_RT_ALERT, &ssl->s3->send_alert[0], 2);
578 ssl->s3->alert_dispatch = 0;
581 if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
582 BIO_flush(ssl->wbio);
585 ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_ALERT, ssl->s3->send_alert,
588 int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
589 ssl_do_info_callback(ssl, SSL_CB_WRITE_ALERT, alert);