Take the version parameter out of ssl_do_msg_callback.
This will make it a little easier to store the normalized version rather
than the wire version. Also document the V2ClientHello behavior.
Change-Id: I5ce9ccce44ca48be2e60ddf293c0fab6bba1356e
Reviewed-on: https://boringssl-review.googlesource.com/11121
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index 256e3a0..c68dc12 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -2801,7 +2801,10 @@
* For each handshake message, ChangeCipherSpec, and alert, |version| is the
* protocol version and |content_type| is the corresponding record type. The
* |len| bytes from |buf| contain the handshake message, one-byte
- * ChangeCipherSpec body, and two-byte alert, respectively. */
+ * ChangeCipherSpec body, and two-byte alert, respectively.
+ *
+ * For a V2ClientHello, |version| is |SSL2_VERSION|, |content_type| is zero, and
+ * the |len| bytes from |buf| contain the V2ClientHello structure. */
OPENSSL_EXPORT void SSL_CTX_set_msg_callback(
SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type,
const void *buf, size_t len, SSL *ssl, void *arg));
diff --git a/ssl/d1_both.c b/ssl/d1_both.c
index 5ea29da..7bb2de2 100644
--- a/ssl/d1_both.c
+++ b/ssl/d1_both.c
@@ -437,8 +437,8 @@
return -1;
}
- ssl_do_msg_callback(ssl, 0 /* read */, ssl->version, SSL3_RT_HANDSHAKE,
- frag->data, ssl->init_num + DTLS1_HM_HEADER_LENGTH);
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HANDSHAKE, frag->data,
+ ssl->init_num + DTLS1_HM_HEADER_LENGTH);
return 1;
}
@@ -567,9 +567,8 @@
return ret;
}
- ssl_do_msg_callback(ssl, 1 /* write */, ssl->version,
- SSL3_RT_CHANGE_CIPHER_SPEC, kChangeCipherSpec,
- sizeof(kChangeCipherSpec));
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_CHANGE_CIPHER_SPEC,
+ kChangeCipherSpec, sizeof(kChangeCipherSpec));
return 1;
}
@@ -667,8 +666,7 @@
offset += todo;
} while (CBS_len(&body) != 0);
- ssl_do_msg_callback(ssl, 1 /* write */, ssl->version, SSL3_RT_HANDSHAKE, in,
- len);
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HANDSHAKE, in, len);
ret = 1;
diff --git a/ssl/d1_pkt.c b/ssl/d1_pkt.c
index 574fd4c..099de5d 100644
--- a/ssl/d1_pkt.c
+++ b/ssl/d1_pkt.c
@@ -312,8 +312,8 @@
return -1;
}
- ssl_do_msg_callback(ssl, 0 /* read */, ssl->version,
- SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, rr->length);
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data,
+ rr->length);
rr->length = 0;
ssl_read_buffer_discard(ssl);
@@ -409,8 +409,8 @@
BIO_flush(ssl->wbio);
}
- ssl_do_msg_callback(ssl, 1 /* write */, ssl->version, SSL3_RT_ALERT,
- ssl->s3->send_alert, 2);
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_ALERT, ssl->s3->send_alert,
+ 2);
int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
ssl_do_info_callback(ssl, SSL_CB_WRITE_ALERT, alert);
diff --git a/ssl/dtls_record.c b/ssl/dtls_record.c
index e784e55..ffe4053 100644
--- a/ssl/dtls_record.c
+++ b/ssl/dtls_record.c
@@ -198,7 +198,7 @@
return ssl_open_record_discard;
}
- ssl_do_msg_callback(ssl, 0 /* read */, 0, SSL3_RT_HEADER, in,
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HEADER, in,
DTLS1_RT_HEADER_LENGTH);
uint16_t epoch = (((uint16_t)sequence[0]) << 8) | sequence[1];
@@ -302,7 +302,7 @@
*out_len = DTLS1_RT_HEADER_LENGTH + ciphertext_len;
- ssl_do_msg_callback(ssl, 1 /* write */, 0, SSL3_RT_HEADER, out,
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HEADER, out,
DTLS1_RT_HEADER_LENGTH);
return 1;
diff --git a/ssl/internal.h b/ssl/internal.h
index 0bc0b8e..bdb392c 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -683,7 +683,7 @@
void ssl_do_info_callback(const SSL *ssl, int type, int value);
/* ssl_do_msg_callback calls |ssl|'s message callback, if set. */
-void ssl_do_msg_callback(SSL *ssl, int is_write, int version, int content_type,
+void ssl_do_msg_callback(SSL *ssl, int is_write, int content_type,
const void *buf, size_t len);
diff --git a/ssl/s3_both.c b/ssl/s3_both.c
index 23cda92..e77e8ca 100644
--- a/ssl/s3_both.c
+++ b/ssl/s3_both.c
@@ -181,7 +181,7 @@
/* ssl3_write_bytes writes the data in its entirety. */
assert((size_t)ret == len);
- ssl_do_msg_callback(ssl, 1 /* write */, ssl->version, type, data, len);
+ ssl_do_msg_callback(ssl, 1 /* write */, type, data, len);
return 1;
}
@@ -477,7 +477,7 @@
return -1;
}
- ssl_do_msg_callback(ssl, 0 /* read */, SSL2_VERSION, 0,
+ ssl_do_msg_callback(ssl, 0 /* read */, 0 /* V2ClientHello */,
CBS_data(&v2_client_hello), CBS_len(&v2_client_hello));
uint8_t msg_type;
@@ -631,8 +631,8 @@
}
/* We have now received a complete message. */
- ssl_do_msg_callback(ssl, 0 /* read */, ssl->version, SSL3_RT_HANDSHAKE,
- ssl->init_buf->data, ssl->init_buf->length);
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HANDSHAKE, ssl->init_buf->data,
+ ssl->init_buf->length);
ssl->s3->tmp.message_type = ((const uint8_t *)ssl->init_buf->data)[0];
ssl->init_msg = (uint8_t*)ssl->init_buf->data + SSL3_HM_HEADER_LENGTH;
diff --git a/ssl/s3_pkt.c b/ssl/s3_pkt.c
index b1a6aa9..fda9a25 100644
--- a/ssl/s3_pkt.c
+++ b/ssl/s3_pkt.c
@@ -407,8 +407,8 @@
return -1;
}
- ssl_do_msg_callback(ssl, 0 /* read */, ssl->version,
- SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, rr->length);
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data,
+ rr->length);
rr->length = 0;
ssl_read_buffer_discard(ssl);
@@ -487,8 +487,8 @@
BIO_flush(ssl->wbio);
}
- ssl_do_msg_callback(ssl, 1 /* write */, ssl->version, SSL3_RT_ALERT,
- ssl->s3->send_alert, 2);
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_ALERT, ssl->s3->send_alert,
+ 2);
int alert = (ssl->s3->send_alert[0] << 8) | ssl->s3->send_alert[1];
ssl_do_info_callback(ssl, SSL_CB_WRITE_ALERT, alert);
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index aa03999..3e27f37 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -2913,12 +2913,29 @@
}
}
-void ssl_do_msg_callback(SSL *ssl, int is_write, int version, int content_type,
+void ssl_do_msg_callback(SSL *ssl, int is_write, int content_type,
const void *buf, size_t len) {
- if (ssl->msg_callback != NULL) {
- ssl->msg_callback(is_write, version, content_type, buf, len, ssl,
- ssl->msg_callback_arg);
+ if (ssl->msg_callback == NULL) {
+ return;
}
+
+ /* |version| is zero when calling for |SSL3_RT_HEADER| and |SSL2_VERSION| for
+ * a V2ClientHello. */
+ int version;
+ switch (content_type) {
+ case 0:
+ /* V2ClientHello */
+ version = SSL2_VERSION;
+ break;
+ case SSL3_RT_HEADER:
+ version = 0;
+ break;
+ default:
+ version = ssl->version;
+ }
+
+ ssl->msg_callback(is_write, version, content_type, buf, len, ssl,
+ ssl->msg_callback_arg);
}
int SSL_CTX_sess_connect(const SSL_CTX *ctx) { return 0; }
diff --git a/ssl/tls_record.c b/ssl/tls_record.c
index 8915b39..7041ce3 100644
--- a/ssl/tls_record.c
+++ b/ssl/tls_record.c
@@ -232,7 +232,7 @@
return ssl_open_record_partial;
}
- ssl_do_msg_callback(ssl, 0 /* read */, 0, SSL3_RT_HEADER, in,
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_HEADER, in,
SSL3_RT_HEADER_LENGTH);
/* Decrypt the body in-place. */
@@ -349,7 +349,7 @@
*out_len = SSL3_RT_HEADER_LENGTH + ciphertext_len;
- ssl_do_msg_callback(ssl, 1 /* write */, 0, SSL3_RT_HEADER, out,
+ ssl_do_msg_callback(ssl, 1 /* write */, SSL3_RT_HEADER, out,
SSL3_RT_HEADER_LENGTH);
return 1;
}
@@ -414,7 +414,7 @@
return ssl_open_record_error;
}
- ssl_do_msg_callback(ssl, 0 /* read */, ssl->version, SSL3_RT_ALERT, in, in_len);
+ ssl_do_msg_callback(ssl, 0 /* read */, SSL3_RT_ALERT, in, in_len);
const uint8_t alert_level = in[0];
const uint8_t alert_descr = in[1];