summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_both.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_both.c')
-rw-r--r--src/lib/libssl/ssl_both.c148
1 files changed, 1 insertions, 147 deletions
diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c
index cfd32387d6..801b5bea29 100644
--- a/src/lib/libssl/ssl_both.c
+++ b/src/lib/libssl/ssl_both.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_both.c,v 1.42 2022/02/05 14:54:10 jsing Exp $ */ 1/* $OpenBSD: ssl_both.c,v 1.43 2022/10/01 16:23:15 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -161,152 +161,6 @@ ssl3_do_write(SSL *s, int type)
161 return (0); 161 return (0);
162} 162}
163 163
164int
165ssl3_send_finished(SSL *s, int state_a, int state_b)
166{
167 CBB cbb, finished;
168
169 memset(&cbb, 0, sizeof(cbb));
170
171 if (s->s3->hs.state == state_a) {
172 if (!tls12_derive_finished(s))
173 goto err;
174
175 /* Copy finished so we can use it for renegotiation checks. */
176 if (!s->server) {
177 memcpy(s->s3->previous_client_finished,
178 s->s3->hs.finished, s->s3->hs.finished_len);
179 s->s3->previous_client_finished_len =
180 s->s3->hs.finished_len;
181 } else {
182 memcpy(s->s3->previous_server_finished,
183 s->s3->hs.finished, s->s3->hs.finished_len);
184 s->s3->previous_server_finished_len =
185 s->s3->hs.finished_len;
186 }
187
188 if (!ssl3_handshake_msg_start(s, &cbb, &finished,
189 SSL3_MT_FINISHED))
190 goto err;
191 if (!CBB_add_bytes(&finished, s->s3->hs.finished,
192 s->s3->hs.finished_len))
193 goto err;
194 if (!ssl3_handshake_msg_finish(s, &cbb))
195 goto err;
196
197 s->s3->hs.state = state_b;
198 }
199
200 return (ssl3_handshake_write(s));
201
202 err:
203 CBB_cleanup(&cbb);
204
205 return (-1);
206}
207
208int
209ssl3_get_finished(SSL *s, int a, int b)
210{
211 int al, md_len, ret;
212 CBS cbs;
213
214 /* should actually be 36+4 :-) */
215 if ((ret = ssl3_get_message(s, a, b, SSL3_MT_FINISHED, 64)) <= 0)
216 return ret;
217
218 /* If this occurs, we have missed a message */
219 if (!s->s3->change_cipher_spec) {
220 al = SSL_AD_UNEXPECTED_MESSAGE;
221 SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS);
222 goto fatal_err;
223 }
224 s->s3->change_cipher_spec = 0;
225
226 md_len = TLS1_FINISH_MAC_LENGTH;
227
228 if (s->internal->init_num < 0) {
229 al = SSL_AD_DECODE_ERROR;
230 SSLerror(s, SSL_R_BAD_DIGEST_LENGTH);
231 goto fatal_err;
232 }
233
234 CBS_init(&cbs, s->internal->init_msg, s->internal->init_num);
235
236 if (s->s3->hs.peer_finished_len != md_len ||
237 CBS_len(&cbs) != md_len) {
238 al = SSL_AD_DECODE_ERROR;
239 SSLerror(s, SSL_R_BAD_DIGEST_LENGTH);
240 goto fatal_err;
241 }
242
243 if (!CBS_mem_equal(&cbs, s->s3->hs.peer_finished, CBS_len(&cbs))) {
244 al = SSL_AD_DECRYPT_ERROR;
245 SSLerror(s, SSL_R_DIGEST_CHECK_FAILED);
246 goto fatal_err;
247 }
248
249 /* Copy finished so we can use it for renegotiation checks. */
250 OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE);
251 if (s->server) {
252 memcpy(s->s3->previous_client_finished,
253 s->s3->hs.peer_finished, md_len);
254 s->s3->previous_client_finished_len = md_len;
255 } else {
256 memcpy(s->s3->previous_server_finished,
257 s->s3->hs.peer_finished, md_len);
258 s->s3->previous_server_finished_len = md_len;
259 }
260
261 return (1);
262 fatal_err:
263 ssl3_send_alert(s, SSL3_AL_FATAL, al);
264 return (0);
265}
266
267int
268ssl3_send_change_cipher_spec(SSL *s, int a, int b)
269{
270 size_t outlen;
271 CBB cbb;
272
273 memset(&cbb, 0, sizeof(cbb));
274
275 if (s->s3->hs.state == a) {
276 if (!CBB_init_fixed(&cbb, s->internal->init_buf->data,
277 s->internal->init_buf->length))
278 goto err;
279 if (!CBB_add_u8(&cbb, SSL3_MT_CCS))
280 goto err;
281 if (!CBB_finish(&cbb, NULL, &outlen))
282 goto err;
283
284 if (outlen > INT_MAX)
285 goto err;
286
287 s->internal->init_num = (int)outlen;
288 s->internal->init_off = 0;
289
290 if (SSL_is_dtls(s)) {
291 s->d1->handshake_write_seq =
292 s->d1->next_handshake_write_seq;
293 dtls1_set_message_header_int(s, SSL3_MT_CCS, 0,
294 s->d1->handshake_write_seq, 0, 0);
295 dtls1_buffer_message(s, 1);
296 }
297
298 s->s3->hs.state = b;
299 }
300
301 /* SSL3_ST_CW_CHANGE_B */
302 return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC);
303
304 err:
305 CBB_cleanup(&cbb);
306
307 return -1;
308}
309
310static int 164static int
311ssl3_add_cert(CBB *cbb, X509 *x) 165ssl3_add_cert(CBB *cbb, X509 *x)
312{ 166{