Fix SSL_get_{read,write}_sequence.
I switched up the endianness. Add some tests to make sure those work right.
Also tweak the DTLS semantics. SSL_get_read_sequence should return the highest
sequence number received so far. Include the epoch number in both so we don't
need a second API for it.
Change-Id: I9901a1665b41224c46fadb7ce0b0881dcb466bcc
Reviewed-on: https://boringssl-review.googlesource.com/7141
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index 542dc17..0a3c8f7 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -2545,19 +2545,29 @@
}
static uint64_t be_to_u64(const uint8_t in[8]) {
- return (((uint64_t)in[7]) << 56) | (((uint64_t)in[6]) << 48) |
- (((uint64_t)in[5]) << 40) | (((uint64_t)in[4]) << 32) |
- (((uint64_t)in[3]) << 24) | (((uint64_t)in[2]) << 16) |
- (((uint64_t)in[1]) << 8) | ((uint64_t)in[0]);
+ return (((uint64_t)in[0]) << 56) | (((uint64_t)in[1]) << 48) |
+ (((uint64_t)in[2]) << 40) | (((uint64_t)in[3]) << 32) |
+ (((uint64_t)in[4]) << 24) | (((uint64_t)in[5]) << 16) |
+ (((uint64_t)in[6]) << 8) | ((uint64_t)in[7]);
}
uint64_t SSL_get_read_sequence(const SSL *ssl) {
/* TODO(davidben): Internally represent sequence numbers as uint64_t. */
+ if (SSL_IS_DTLS(ssl)) {
+ /* max_seq_num already includes the epoch. */
+ assert(ssl->d1->r_epoch == (ssl->d1->bitmap.max_seq_num >> 48));
+ return ssl->d1->bitmap.max_seq_num;
+ }
return be_to_u64(ssl->s3->read_sequence);
}
uint64_t SSL_get_write_sequence(const SSL *ssl) {
- return be_to_u64(ssl->s3->write_sequence);
+ uint64_t ret = be_to_u64(ssl->s3->write_sequence);
+ if (SSL_IS_DTLS(ssl)) {
+ assert((ret >> 48) == 0);
+ ret |= ((uint64_t)ssl->d1->w_epoch) << 48;
+ }
+ return ret;
}
uint8_t SSL_get_server_key_exchange_hash(const SSL *ssl) {