2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "../ssl_local.h"
11 #include "record_local.h"
13 void SSL3_BUFFER_set_data(SSL3_BUFFER
*b
, const unsigned char *d
, size_t n
)
22 * Clear the contents of an SSL3_BUFFER but retain any memory allocated. Also
23 * retains the default_len setting
25 void SSL3_BUFFER_clear(SSL3_BUFFER
*b
)
31 void SSL3_BUFFER_release(SSL3_BUFFER
*b
)
37 int ssl3_setup_read_buffer(SSL
*s
)
40 size_t len
, align
= 0, headerlen
;
43 b
= RECORD_LAYER_get_rbuf(&s
->rlayer
);
46 headerlen
= DTLS1_RT_HEADER_LENGTH
;
48 headerlen
= SSL3_RT_HEADER_LENGTH
;
50 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
51 align
= (-SSL3_RT_HEADER_LENGTH
) & (SSL3_ALIGN_PAYLOAD
- 1);
55 len
= SSL3_RT_MAX_PLAIN_LENGTH
56 + SSL3_RT_MAX_ENCRYPTED_OVERHEAD
+ headerlen
+ align
;
57 #ifndef OPENSSL_NO_COMP
58 if (ssl_allow_compression(s
))
59 len
+= SSL3_RT_MAX_COMPRESSED_OVERHEAD
;
61 if (b
->default_len
> len
)
63 if ((p
= OPENSSL_malloc(len
)) == NULL
) {
65 * We've got a malloc failure, and we're still initialising buffers.
66 * We assume we're so doomed that we won't even be able to send an
69 SSLfatal(s
, SSL_AD_NO_ALERT
, SSL_F_SSL3_SETUP_READ_BUFFER
,
70 ERR_R_MALLOC_FAILURE
);
77 RECORD_LAYER_set_packet(&s
->rlayer
, &(b
->buf
[0]));
81 int ssl3_setup_write_buffer(SSL
*s
, size_t numwpipes
, size_t len
)
84 size_t align
= 0, headerlen
;
88 s
->rlayer
.numwpipes
= numwpipes
;
92 headerlen
= DTLS1_RT_HEADER_LENGTH
+ 1;
94 headerlen
= SSL3_RT_HEADER_LENGTH
;
96 #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
97 align
= (-SSL3_RT_HEADER_LENGTH
) & (SSL3_ALIGN_PAYLOAD
- 1);
100 len
= ssl_get_max_send_fragment(s
)
101 + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
+ headerlen
+ align
;
102 #ifndef OPENSSL_NO_COMP
103 if (ssl_allow_compression(s
))
104 len
+= SSL3_RT_MAX_COMPRESSED_OVERHEAD
;
106 if (!(s
->options
& SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
))
107 len
+= headerlen
+ align
+ SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
;
110 wb
= RECORD_LAYER_get_wbuf(&s
->rlayer
);
111 for (currpipe
= 0; currpipe
< numwpipes
; currpipe
++) {
112 SSL3_BUFFER
*thiswb
= &wb
[currpipe
];
114 if (thiswb
->len
!= len
) {
115 OPENSSL_free(thiswb
->buf
);
116 thiswb
->buf
= NULL
; /* force reallocation */
119 if (thiswb
->buf
== NULL
) {
120 if (s
->wbio
== NULL
|| !BIO_get_ktls_send(s
->wbio
)) {
121 p
= OPENSSL_malloc(len
);
123 s
->rlayer
.numwpipes
= currpipe
;
125 * We've got a malloc failure, and we're still initialising
126 * buffers. We assume we're so doomed that we won't even be able
129 SSLfatal(s
, SSL_AD_NO_ALERT
,
130 SSL_F_SSL3_SETUP_WRITE_BUFFER
, ERR_R_MALLOC_FAILURE
);
136 memset(thiswb
, 0, sizeof(SSL3_BUFFER
));
145 int ssl3_setup_buffers(SSL
*s
)
147 if (!ssl3_setup_read_buffer(s
)) {
148 /* SSLfatal() already called */
151 if (!ssl3_setup_write_buffer(s
, 1, 0)) {
152 /* SSLfatal() already called */
158 int ssl3_release_write_buffer(SSL
*s
)
163 pipes
= s
->rlayer
.numwpipes
;
165 wb
= &RECORD_LAYER_get_wbuf(&s
->rlayer
)[pipes
- 1];
167 if (s
->wbio
== NULL
|| !BIO_get_ktls_send(s
->wbio
))
168 OPENSSL_free(wb
->buf
);
172 s
->rlayer
.numwpipes
= 0;
176 int ssl3_release_read_buffer(SSL
*s
)
180 b
= RECORD_LAYER_get_rbuf(&s
->rlayer
);
181 OPENSSL_free(b
->buf
);