xref: /aosp_15_r20/external/boringssl/src/ssl/d1_pkt.cc (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker /* DTLS implementation written by Nagendra Modadugu
2*8fb009dcSAndroid Build Coastguard Worker  * ([email protected]) for the OpenSSL project 2005. */
3*8fb009dcSAndroid Build Coastguard Worker /* ====================================================================
4*8fb009dcSAndroid Build Coastguard Worker  * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
5*8fb009dcSAndroid Build Coastguard Worker  *
6*8fb009dcSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
7*8fb009dcSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
8*8fb009dcSAndroid Build Coastguard Worker  * are met:
9*8fb009dcSAndroid Build Coastguard Worker  *
10*8fb009dcSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
11*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
12*8fb009dcSAndroid Build Coastguard Worker  *
13*8fb009dcSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in
15*8fb009dcSAndroid Build Coastguard Worker  *    the documentation and/or other materials provided with the
16*8fb009dcSAndroid Build Coastguard Worker  *    distribution.
17*8fb009dcSAndroid Build Coastguard Worker  *
18*8fb009dcSAndroid Build Coastguard Worker  * 3. All advertising materials mentioning features or use of this
19*8fb009dcSAndroid Build Coastguard Worker  *    software must display the following acknowledgment:
20*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
21*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
22*8fb009dcSAndroid Build Coastguard Worker  *
23*8fb009dcSAndroid Build Coastguard Worker  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
24*8fb009dcSAndroid Build Coastguard Worker  *    endorse or promote products derived from this software without
25*8fb009dcSAndroid Build Coastguard Worker  *    prior written permission. For written permission, please contact
26*8fb009dcSAndroid Build Coastguard Worker  *    [email protected].
27*8fb009dcSAndroid Build Coastguard Worker  *
28*8fb009dcSAndroid Build Coastguard Worker  * 5. Products derived from this software may not be called "OpenSSL"
29*8fb009dcSAndroid Build Coastguard Worker  *    nor may "OpenSSL" appear in their names without prior written
30*8fb009dcSAndroid Build Coastguard Worker  *    permission of the OpenSSL Project.
31*8fb009dcSAndroid Build Coastguard Worker  *
32*8fb009dcSAndroid Build Coastguard Worker  * 6. Redistributions of any form whatsoever must retain the following
33*8fb009dcSAndroid Build Coastguard Worker  *    acknowledgment:
34*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software developed by the OpenSSL Project
35*8fb009dcSAndroid Build Coastguard Worker  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
36*8fb009dcSAndroid Build Coastguard Worker  *
37*8fb009dcSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
38*8fb009dcSAndroid Build Coastguard Worker  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
39*8fb009dcSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
40*8fb009dcSAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
41*8fb009dcSAndroid Build Coastguard Worker  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42*8fb009dcSAndroid Build Coastguard Worker  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
43*8fb009dcSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
44*8fb009dcSAndroid Build Coastguard Worker  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45*8fb009dcSAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
46*8fb009dcSAndroid Build Coastguard Worker  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47*8fb009dcSAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
48*8fb009dcSAndroid Build Coastguard Worker  * OF THE POSSIBILITY OF SUCH DAMAGE.
49*8fb009dcSAndroid Build Coastguard Worker  * ====================================================================
50*8fb009dcSAndroid Build Coastguard Worker  *
51*8fb009dcSAndroid Build Coastguard Worker  * This product includes cryptographic software written by Eric Young
52*8fb009dcSAndroid Build Coastguard Worker  * ([email protected]).  This product includes software written by Tim
53*8fb009dcSAndroid Build Coastguard Worker  * Hudson ([email protected]).
54*8fb009dcSAndroid Build Coastguard Worker  *
55*8fb009dcSAndroid Build Coastguard Worker  */
56*8fb009dcSAndroid Build Coastguard Worker /* Copyright (C) 1995-1998 Eric Young ([email protected])
57*8fb009dcSAndroid Build Coastguard Worker  * All rights reserved.
58*8fb009dcSAndroid Build Coastguard Worker  *
59*8fb009dcSAndroid Build Coastguard Worker  * This package is an SSL implementation written
60*8fb009dcSAndroid Build Coastguard Worker  * by Eric Young ([email protected]).
61*8fb009dcSAndroid Build Coastguard Worker  * The implementation was written so as to conform with Netscapes SSL.
62*8fb009dcSAndroid Build Coastguard Worker  *
63*8fb009dcSAndroid Build Coastguard Worker  * This library is free for commercial and non-commercial use as long as
64*8fb009dcSAndroid Build Coastguard Worker  * the following conditions are aheared to.  The following conditions
65*8fb009dcSAndroid Build Coastguard Worker  * apply to all code found in this distribution, be it the RC4, RSA,
66*8fb009dcSAndroid Build Coastguard Worker  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
67*8fb009dcSAndroid Build Coastguard Worker  * included with this distribution is covered by the same copyright terms
68*8fb009dcSAndroid Build Coastguard Worker  * except that the holder is Tim Hudson ([email protected]).
69*8fb009dcSAndroid Build Coastguard Worker  *
70*8fb009dcSAndroid Build Coastguard Worker  * Copyright remains Eric Young's, and as such any Copyright notices in
71*8fb009dcSAndroid Build Coastguard Worker  * the code are not to be removed.
72*8fb009dcSAndroid Build Coastguard Worker  * If this package is used in a product, Eric Young should be given attribution
73*8fb009dcSAndroid Build Coastguard Worker  * as the author of the parts of the library used.
74*8fb009dcSAndroid Build Coastguard Worker  * This can be in the form of a textual message at program startup or
75*8fb009dcSAndroid Build Coastguard Worker  * in documentation (online or textual) provided with the package.
76*8fb009dcSAndroid Build Coastguard Worker  *
77*8fb009dcSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
78*8fb009dcSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
79*8fb009dcSAndroid Build Coastguard Worker  * are met:
80*8fb009dcSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the copyright
81*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
82*8fb009dcSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
83*8fb009dcSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
84*8fb009dcSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
85*8fb009dcSAndroid Build Coastguard Worker  * 3. All advertising materials mentioning features or use of this software
86*8fb009dcSAndroid Build Coastguard Worker  *    must display the following acknowledgement:
87*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes cryptographic software written by
88*8fb009dcSAndroid Build Coastguard Worker  *     Eric Young ([email protected])"
89*8fb009dcSAndroid Build Coastguard Worker  *    The word 'cryptographic' can be left out if the rouines from the library
90*8fb009dcSAndroid Build Coastguard Worker  *    being used are not cryptographic related :-).
91*8fb009dcSAndroid Build Coastguard Worker  * 4. If you include any Windows specific code (or a derivative thereof) from
92*8fb009dcSAndroid Build Coastguard Worker  *    the apps directory (application code) you must include an acknowledgement:
93*8fb009dcSAndroid Build Coastguard Worker  *    "This product includes software written by Tim Hudson ([email protected])"
94*8fb009dcSAndroid Build Coastguard Worker  *
95*8fb009dcSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
96*8fb009dcSAndroid Build Coastguard Worker  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
97*8fb009dcSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
98*8fb009dcSAndroid Build Coastguard Worker  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
99*8fb009dcSAndroid Build Coastguard Worker  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
100*8fb009dcSAndroid Build Coastguard Worker  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
101*8fb009dcSAndroid Build Coastguard Worker  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
102*8fb009dcSAndroid Build Coastguard Worker  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
103*8fb009dcSAndroid Build Coastguard Worker  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
104*8fb009dcSAndroid Build Coastguard Worker  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
105*8fb009dcSAndroid Build Coastguard Worker  * SUCH DAMAGE.
106*8fb009dcSAndroid Build Coastguard Worker  *
107*8fb009dcSAndroid Build Coastguard Worker  * The licence and distribution terms for any publically available version or
108*8fb009dcSAndroid Build Coastguard Worker  * derivative of this code cannot be changed.  i.e. this code cannot simply be
109*8fb009dcSAndroid Build Coastguard Worker  * copied and put under another distribution licence
110*8fb009dcSAndroid Build Coastguard Worker  * [including the GNU Public Licence.] */
111*8fb009dcSAndroid Build Coastguard Worker 
112*8fb009dcSAndroid Build Coastguard Worker #include <openssl/ssl.h>
113*8fb009dcSAndroid Build Coastguard Worker 
114*8fb009dcSAndroid Build Coastguard Worker #include <assert.h>
115*8fb009dcSAndroid Build Coastguard Worker #include <string.h>
116*8fb009dcSAndroid Build Coastguard Worker 
117*8fb009dcSAndroid Build Coastguard Worker #include <openssl/bio.h>
118*8fb009dcSAndroid Build Coastguard Worker #include <openssl/bytestring.h>
119*8fb009dcSAndroid Build Coastguard Worker #include <openssl/mem.h>
120*8fb009dcSAndroid Build Coastguard Worker #include <openssl/evp.h>
121*8fb009dcSAndroid Build Coastguard Worker #include <openssl/err.h>
122*8fb009dcSAndroid Build Coastguard Worker #include <openssl/rand.h>
123*8fb009dcSAndroid Build Coastguard Worker 
124*8fb009dcSAndroid Build Coastguard Worker #include "../crypto/internal.h"
125*8fb009dcSAndroid Build Coastguard Worker #include "internal.h"
126*8fb009dcSAndroid Build Coastguard Worker 
127*8fb009dcSAndroid Build Coastguard Worker 
128*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_BEGIN
129*8fb009dcSAndroid Build Coastguard Worker 
dtls1_open_app_data(SSL * ssl,Span<uint8_t> * out,size_t * out_consumed,uint8_t * out_alert,Span<uint8_t> in)130*8fb009dcSAndroid Build Coastguard Worker ssl_open_record_t dtls1_open_app_data(SSL *ssl, Span<uint8_t> *out,
131*8fb009dcSAndroid Build Coastguard Worker                                       size_t *out_consumed, uint8_t *out_alert,
132*8fb009dcSAndroid Build Coastguard Worker                                       Span<uint8_t> in) {
133*8fb009dcSAndroid Build Coastguard Worker   assert(!SSL_in_init(ssl));
134*8fb009dcSAndroid Build Coastguard Worker 
135*8fb009dcSAndroid Build Coastguard Worker   uint8_t type;
136*8fb009dcSAndroid Build Coastguard Worker   Span<uint8_t> record;
137*8fb009dcSAndroid Build Coastguard Worker   auto ret = dtls_open_record(ssl, &type, &record, out_consumed, out_alert, in);
138*8fb009dcSAndroid Build Coastguard Worker   if (ret != ssl_open_record_success) {
139*8fb009dcSAndroid Build Coastguard Worker     return ret;
140*8fb009dcSAndroid Build Coastguard Worker   }
141*8fb009dcSAndroid Build Coastguard Worker 
142*8fb009dcSAndroid Build Coastguard Worker   if (type == SSL3_RT_HANDSHAKE) {
143*8fb009dcSAndroid Build Coastguard Worker     // Parse the first fragment header to determine if this is a pre-CCS or
144*8fb009dcSAndroid Build Coastguard Worker     // post-CCS handshake record. DTLS resets handshake message numbers on each
145*8fb009dcSAndroid Build Coastguard Worker     // handshake, so renegotiations and retransmissions are ambiguous.
146*8fb009dcSAndroid Build Coastguard Worker     CBS cbs, body;
147*8fb009dcSAndroid Build Coastguard Worker     struct hm_header_st msg_hdr;
148*8fb009dcSAndroid Build Coastguard Worker     CBS_init(&cbs, record.data(), record.size());
149*8fb009dcSAndroid Build Coastguard Worker     if (!dtls1_parse_fragment(&cbs, &msg_hdr, &body)) {
150*8fb009dcSAndroid Build Coastguard Worker       OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_HANDSHAKE_RECORD);
151*8fb009dcSAndroid Build Coastguard Worker       *out_alert = SSL_AD_DECODE_ERROR;
152*8fb009dcSAndroid Build Coastguard Worker       return ssl_open_record_error;
153*8fb009dcSAndroid Build Coastguard Worker     }
154*8fb009dcSAndroid Build Coastguard Worker 
155*8fb009dcSAndroid Build Coastguard Worker     if (msg_hdr.type == SSL3_MT_FINISHED &&
156*8fb009dcSAndroid Build Coastguard Worker         msg_hdr.seq == ssl->d1->handshake_read_seq - 1) {
157*8fb009dcSAndroid Build Coastguard Worker       if (msg_hdr.frag_off == 0) {
158*8fb009dcSAndroid Build Coastguard Worker         // Retransmit our last flight of messages. If the peer sends the second
159*8fb009dcSAndroid Build Coastguard Worker         // Finished, they may not have received ours. Only do this for the
160*8fb009dcSAndroid Build Coastguard Worker         // first fragment, in case the Finished was fragmented.
161*8fb009dcSAndroid Build Coastguard Worker         if (!dtls1_check_timeout_num(ssl)) {
162*8fb009dcSAndroid Build Coastguard Worker           *out_alert = 0;  // TODO(davidben): Send an alert?
163*8fb009dcSAndroid Build Coastguard Worker           return ssl_open_record_error;
164*8fb009dcSAndroid Build Coastguard Worker         }
165*8fb009dcSAndroid Build Coastguard Worker 
166*8fb009dcSAndroid Build Coastguard Worker         dtls1_retransmit_outgoing_messages(ssl);
167*8fb009dcSAndroid Build Coastguard Worker       }
168*8fb009dcSAndroid Build Coastguard Worker       return ssl_open_record_discard;
169*8fb009dcSAndroid Build Coastguard Worker     }
170*8fb009dcSAndroid Build Coastguard Worker 
171*8fb009dcSAndroid Build Coastguard Worker     // Otherwise, this is a pre-CCS handshake message from an unsupported
172*8fb009dcSAndroid Build Coastguard Worker     // renegotiation attempt. Fall through to the error path.
173*8fb009dcSAndroid Build Coastguard Worker   }
174*8fb009dcSAndroid Build Coastguard Worker 
175*8fb009dcSAndroid Build Coastguard Worker   if (type != SSL3_RT_APPLICATION_DATA) {
176*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_RECORD);
177*8fb009dcSAndroid Build Coastguard Worker     *out_alert = SSL_AD_UNEXPECTED_MESSAGE;
178*8fb009dcSAndroid Build Coastguard Worker     return ssl_open_record_error;
179*8fb009dcSAndroid Build Coastguard Worker   }
180*8fb009dcSAndroid Build Coastguard Worker 
181*8fb009dcSAndroid Build Coastguard Worker   if (record.empty()) {
182*8fb009dcSAndroid Build Coastguard Worker     return ssl_open_record_discard;
183*8fb009dcSAndroid Build Coastguard Worker   }
184*8fb009dcSAndroid Build Coastguard Worker 
185*8fb009dcSAndroid Build Coastguard Worker   *out = record;
186*8fb009dcSAndroid Build Coastguard Worker   return ssl_open_record_success;
187*8fb009dcSAndroid Build Coastguard Worker }
188*8fb009dcSAndroid Build Coastguard Worker 
dtls1_write_app_data(SSL * ssl,bool * out_needs_handshake,size_t * out_bytes_written,Span<const uint8_t> in)189*8fb009dcSAndroid Build Coastguard Worker int dtls1_write_app_data(SSL *ssl, bool *out_needs_handshake,
190*8fb009dcSAndroid Build Coastguard Worker                          size_t *out_bytes_written, Span<const uint8_t> in) {
191*8fb009dcSAndroid Build Coastguard Worker   assert(!SSL_in_init(ssl));
192*8fb009dcSAndroid Build Coastguard Worker   *out_needs_handshake = false;
193*8fb009dcSAndroid Build Coastguard Worker 
194*8fb009dcSAndroid Build Coastguard Worker   if (ssl->s3->write_shutdown != ssl_shutdown_none) {
195*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(SSL, SSL_R_PROTOCOL_IS_SHUTDOWN);
196*8fb009dcSAndroid Build Coastguard Worker     return -1;
197*8fb009dcSAndroid Build Coastguard Worker   }
198*8fb009dcSAndroid Build Coastguard Worker 
199*8fb009dcSAndroid Build Coastguard Worker   // DTLS does not split the input across records.
200*8fb009dcSAndroid Build Coastguard Worker   if (in.size() > SSL3_RT_MAX_PLAIN_LENGTH) {
201*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(SSL, SSL_R_DTLS_MESSAGE_TOO_BIG);
202*8fb009dcSAndroid Build Coastguard Worker     return -1;
203*8fb009dcSAndroid Build Coastguard Worker   }
204*8fb009dcSAndroid Build Coastguard Worker 
205*8fb009dcSAndroid Build Coastguard Worker   if (in.empty()) {
206*8fb009dcSAndroid Build Coastguard Worker     *out_bytes_written = 0;
207*8fb009dcSAndroid Build Coastguard Worker     return 1;
208*8fb009dcSAndroid Build Coastguard Worker   }
209*8fb009dcSAndroid Build Coastguard Worker 
210*8fb009dcSAndroid Build Coastguard Worker   int ret = dtls1_write_record(ssl, SSL3_RT_APPLICATION_DATA, in,
211*8fb009dcSAndroid Build Coastguard Worker                                ssl->d1->w_epoch);
212*8fb009dcSAndroid Build Coastguard Worker   if (ret <= 0) {
213*8fb009dcSAndroid Build Coastguard Worker     return ret;
214*8fb009dcSAndroid Build Coastguard Worker   }
215*8fb009dcSAndroid Build Coastguard Worker   *out_bytes_written = in.size();
216*8fb009dcSAndroid Build Coastguard Worker   return 1;
217*8fb009dcSAndroid Build Coastguard Worker }
218*8fb009dcSAndroid Build Coastguard Worker 
dtls_seal_align_prefix_len(const SSL * ssl,uint16_t epoch)219*8fb009dcSAndroid Build Coastguard Worker static size_t dtls_seal_align_prefix_len(const SSL *ssl, uint16_t epoch) {
220*8fb009dcSAndroid Build Coastguard Worker   return dtls_record_header_write_len(ssl, epoch) +
221*8fb009dcSAndroid Build Coastguard Worker          ssl->s3->aead_write_ctx->ExplicitNonceLen();
222*8fb009dcSAndroid Build Coastguard Worker }
223*8fb009dcSAndroid Build Coastguard Worker 
dtls1_write_record(SSL * ssl,int type,Span<const uint8_t> in,uint16_t epoch)224*8fb009dcSAndroid Build Coastguard Worker int dtls1_write_record(SSL *ssl, int type, Span<const uint8_t> in,
225*8fb009dcSAndroid Build Coastguard Worker                        uint16_t epoch) {
226*8fb009dcSAndroid Build Coastguard Worker   SSLBuffer *buf = &ssl->s3->write_buffer;
227*8fb009dcSAndroid Build Coastguard Worker   assert(in.size() <= SSL3_RT_MAX_PLAIN_LENGTH);
228*8fb009dcSAndroid Build Coastguard Worker   // There should never be a pending write buffer in DTLS. One can't write half
229*8fb009dcSAndroid Build Coastguard Worker   // a datagram, so the write buffer is always dropped in
230*8fb009dcSAndroid Build Coastguard Worker   // |ssl_write_buffer_flush|.
231*8fb009dcSAndroid Build Coastguard Worker   assert(buf->empty());
232*8fb009dcSAndroid Build Coastguard Worker 
233*8fb009dcSAndroid Build Coastguard Worker   if (in.size() > SSL3_RT_MAX_PLAIN_LENGTH) {
234*8fb009dcSAndroid Build Coastguard Worker     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
235*8fb009dcSAndroid Build Coastguard Worker     return -1;
236*8fb009dcSAndroid Build Coastguard Worker   }
237*8fb009dcSAndroid Build Coastguard Worker 
238*8fb009dcSAndroid Build Coastguard Worker   size_t ciphertext_len;
239*8fb009dcSAndroid Build Coastguard Worker   if (!buf->EnsureCap(dtls_seal_align_prefix_len(ssl, epoch),
240*8fb009dcSAndroid Build Coastguard Worker                       in.size() + SSL_max_seal_overhead(ssl)) ||
241*8fb009dcSAndroid Build Coastguard Worker       !dtls_seal_record(ssl, buf->remaining().data(), &ciphertext_len,
242*8fb009dcSAndroid Build Coastguard Worker                         buf->remaining().size(), type, in.data(), in.size(),
243*8fb009dcSAndroid Build Coastguard Worker                         epoch)) {
244*8fb009dcSAndroid Build Coastguard Worker     buf->Clear();
245*8fb009dcSAndroid Build Coastguard Worker     return -1;
246*8fb009dcSAndroid Build Coastguard Worker   }
247*8fb009dcSAndroid Build Coastguard Worker   buf->DidWrite(ciphertext_len);
248*8fb009dcSAndroid Build Coastguard Worker 
249*8fb009dcSAndroid Build Coastguard Worker   int ret = ssl_write_buffer_flush(ssl);
250*8fb009dcSAndroid Build Coastguard Worker   if (ret <= 0) {
251*8fb009dcSAndroid Build Coastguard Worker     return ret;
252*8fb009dcSAndroid Build Coastguard Worker   }
253*8fb009dcSAndroid Build Coastguard Worker   return 1;
254*8fb009dcSAndroid Build Coastguard Worker }
255*8fb009dcSAndroid Build Coastguard Worker 
dtls1_dispatch_alert(SSL * ssl)256*8fb009dcSAndroid Build Coastguard Worker int dtls1_dispatch_alert(SSL *ssl) {
257*8fb009dcSAndroid Build Coastguard Worker   int ret = dtls1_write_record(ssl, SSL3_RT_ALERT, ssl->s3->send_alert,
258*8fb009dcSAndroid Build Coastguard Worker                                ssl->d1->w_epoch);
259*8fb009dcSAndroid Build Coastguard Worker   if (ret <= 0) {
260*8fb009dcSAndroid Build Coastguard Worker     return ret;
261*8fb009dcSAndroid Build Coastguard Worker   }
262*8fb009dcSAndroid Build Coastguard Worker   ssl->s3->alert_dispatch = false;
263*8fb009dcSAndroid Build Coastguard Worker 
264*8fb009dcSAndroid Build Coastguard Worker   // If the alert is fatal, flush the BIO now.
265*8fb009dcSAndroid Build Coastguard Worker   if (ssl->s3->send_alert[0] == SSL3_AL_FATAL) {
266*8fb009dcSAndroid Build Coastguard Worker     BIO_flush(ssl->wbio.get());
267*8fb009dcSAndroid Build Coastguard Worker   }
268*8fb009dcSAndroid Build Coastguard Worker 
269*8fb009dcSAndroid Build Coastguard Worker   ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_ALERT, ssl->s3->send_alert);
270*8fb009dcSAndroid Build Coastguard Worker 
271*8fb009dcSAndroid Build Coastguard Worker   int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
272*8fb009dcSAndroid Build Coastguard Worker   ssl_do_info_callback(ssl, SSL_CB_WRITE_ALERT, alert);
273*8fb009dcSAndroid Build Coastguard Worker 
274*8fb009dcSAndroid Build Coastguard Worker   return 1;
275*8fb009dcSAndroid Build Coastguard Worker }
276*8fb009dcSAndroid Build Coastguard Worker 
277*8fb009dcSAndroid Build Coastguard Worker BSSL_NAMESPACE_END
278