int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) { unsigned char *p,*d; int i; unsigned long l; if (s->state == a) { d=(unsigned char *)s->init_buf->data; p= &(d[4]); i=s->method->ssl3_enc->final_finish_mac(s, &(s->s3->finish_dgst1), &(s->s3->finish_dgst2), sender,slen,s->s3->tmp.finish_md); s->s3->tmp.finish_md_len = i; memcpy(p, s->s3->tmp.finish_md, i); p+=i; l=i; *(d++)=SSL3_MT_FINISHED; l2n3(l,d); s->init_num=(int)l+4; s->init_off=0; s->state=b; } /* SSL3_ST_SEND_xxxxxx_HELLO_B */ return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); }
int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) { unsigned char *p,*d; int i; unsigned long l; if (s->state == a) { d=(unsigned char *)s->init_buf->data; p= &(d[4]); i=s->method->ssl3_enc->final_finish_mac(s, &(s->s3->finish_dgst1), &(s->s3->finish_dgst2), sender,slen,s->s3->tmp.finish_md); s->s3->tmp.finish_md_len = i; memcpy(p, s->s3->tmp.finish_md, i); p+=i; l=i; /* Copy the finished so we can use it for renegotiation checks */ if(s->type == SSL_ST_CONNECT) { OPENSSL_assert(i <= EVP_MAX_MD_SIZE); memcpy(s->s3->previous_client_finished, s->s3->tmp.finish_md, i); s->s3->previous_client_finished_len=i; } else { OPENSSL_assert(i <= EVP_MAX_MD_SIZE); memcpy(s->s3->previous_server_finished, s->s3->tmp.finish_md, i); s->s3->previous_server_finished_len=i; } #ifdef OPENSSL_SYS_WIN16 /* MSVC 1.5 does not clear the top bytes of the word unless * I do this. */ l&=0xffff; #endif *(d++)=SSL3_MT_FINISHED; l2n3(l,d); s->init_num=(int)l+4; s->init_off=0; s->state=b; } /* SSL3_ST_SEND_xxxxxx_HELLO_B */ return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); }
int ssl3_send_change_cipher_spec(SSL *ssl, int a, int b) { if (ssl->state == a) { *((uint8_t *)ssl->init_buf->data) = SSL3_MT_CCS; ssl->init_num = 1; ssl->state = b; } /* SSL3_ST_CW_CHANGE_B */ return ssl3_do_write(ssl, SSL3_RT_CHANGE_CIPHER_SPEC); }
/*- * for these 2 messages, we need to * ssl->enc_read_ctx re-init * ssl->s3->read_sequence zero * ssl->s3->read_mac_secret re-init * ssl->session->read_sym_enc assign * ssl->session->read_compression assign * ssl->session->read_hash assign */ int ssl3_send_change_cipher_spec(SSL *s, int a, int b) { unsigned char *p; if (s->state == a) { p = (unsigned char *)s->init_buf->data; *p = SSL3_MT_CCS; s->init_num = 1; s->init_off = 0; s->state = b; } /* SSL3_ST_CW_CHANGE_B */ return (ssl3_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC)); }
int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) { unsigned char *p,*d; int i; unsigned long l; if (s->state == a) { d=(unsigned char *)s->init_buf->data; p= &(d[4]); i=s->method->ssl3_enc->final_finish_mac(s, &(s->s3->finish_dgst1), &(s->s3->finish_dgst2), sender,slen,s->s3->tmp.finish_md); s->s3->tmp.finish_md_len = i; memcpy(p, s->s3->tmp.finish_md, i); p+=i; l=i; #ifdef OPENSSL_SYS_WIN16 /* MSVC 1.5 does not clear the top bytes of the word unless * I do this. */ l&=0xffff; #endif *(d++)=SSL3_MT_FINISHED; l2n3(l,d); s->init_num=(int)l+4; s->init_off=0; s->state=b; } /* SSL3_ST_SEND_xxxxxx_HELLO_B */ return(ssl3_do_write(s,SSL3_RT_HANDSHAKE)); }
int ssl3_handshake_write(SSL *s) { return ssl3_do_write(s, SSL3_RT_HANDSHAKE); }