summaryrefslogtreecommitdiff
path: root/src/lib/libssl/s3_both.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/s3_both.c')
-rw-r--r--src/lib/libssl/s3_both.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
index a6d869df59..b63460a56d 100644
--- a/src/lib/libssl/s3_both.c
+++ b/src/lib/libssl/s3_both.c
@@ -202,15 +202,38 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
202 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); 202 return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
203 } 203 }
204 204
205#ifndef OPENSSL_NO_NEXTPROTONEG
206/* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */
207static void ssl3_take_mac(SSL *s) {
208 const char *sender;
209 int slen;
210
211 if (s->state & SSL_ST_CONNECT)
212 {
213 sender=s->method->ssl3_enc->server_finished_label;
214 slen=s->method->ssl3_enc->server_finished_label_len;
215 }
216 else
217 {
218 sender=s->method->ssl3_enc->client_finished_label;
219 slen=s->method->ssl3_enc->client_finished_label_len;
220 }
221
222 s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
223 sender,slen,s->s3->tmp.peer_finish_md);
224}
225#endif
226
205int ssl3_get_finished(SSL *s, int a, int b) 227int ssl3_get_finished(SSL *s, int a, int b)
206 { 228 {
207 int al,i,ok; 229 int al,i,ok;
208 long n; 230 long n;
209 unsigned char *p; 231 unsigned char *p;
210 232
211 /* the mac has already been generated when we received the 233#ifdef OPENSSL_NO_NEXTPROTONEG
212 * change cipher spec message and is in s->s3->tmp.peer_finish_md 234 /* the mac has already been generated when we received the change
213 */ 235 * cipher spec message and is in s->s3->tmp.peer_finish_md. */
236#endif
214 237
215 n=s->method->ssl_get_message(s, 238 n=s->method->ssl_get_message(s,
216 a, 239 a,
@@ -514,6 +537,13 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
514 s->init_num += i; 537 s->init_num += i;
515 n -= i; 538 n -= i;
516 } 539 }
540#ifndef OPENSSL_NO_NEXTPROTONEG
541 /* If receiving Finished, record MAC of prior handshake messages for
542 * Finished verification. */
543 if (*s->init_buf->data == SSL3_MT_FINISHED)
544 ssl3_take_mac(s);
545#endif
546 /* Feed this message into MAC computation. */
517 ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4); 547 ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4);
518 if (s->msg_callback) 548 if (s->msg_callback)
519 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg); 549 s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);