2 * Copyright 2005-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "../ssl_locl.h"
11 #include "record_locl.h"
13 /* mod 128 saturating subtract of two 64-bit values in big-endian order */
14 static int satsub64be(const unsigned char *v1, const unsigned char *v2)
18 if (sizeof(long) == 8)
30 /* not reached on little-endians */
32 * following test is redundant, because input is always aligned,
33 * but I take no chances...
35 if (((size_t)v1 | (size_t)v2) & 0x7)
48 ret = (int)v1[7] - (int)v2[7];
50 brw = ret >> 8; /* brw is either 0 or -1 */
52 for (i = 6; i >= 0; i--) {
53 brw += (int)v1[i] - (int)v2[i];
58 for (i = 6; i >= 0; i--) {
59 brw += (int)v1[i] - (int)v2[i];
64 brw <<= 8; /* brw is either 0 or -256 */
69 return brw + (ret & 0xFF);
72 int dtls1_record_replay_check(SSL *s, DTLS1_BITMAP *bitmap)
76 const unsigned char *seq = s->rlayer.read_sequence;
78 cmp = satsub64be(seq, bitmap->max_seq_num);
80 SSL3_RECORD_set_seq_num(RECORD_LAYER_get_rrec(&s->rlayer), seq);
81 return 1; /* this record in new */
84 if (shift >= sizeof(bitmap->map) * 8)
85 return 0; /* stale, outside the window */
86 else if (bitmap->map & (1UL << shift))
87 return 0; /* record previously received */
89 SSL3_RECORD_set_seq_num(RECORD_LAYER_get_rrec(&s->rlayer), seq);
93 void dtls1_record_bitmap_update(SSL *s, DTLS1_BITMAP *bitmap)
97 const unsigned char *seq = RECORD_LAYER_get_read_sequence(&s->rlayer);
99 cmp = satsub64be(seq, bitmap->max_seq_num);
102 if (shift < sizeof(bitmap->map) * 8)
103 bitmap->map <<= shift, bitmap->map |= 1UL;
106 memcpy(bitmap->max_seq_num, seq, SEQ_NUM_SIZE);
109 if (shift < sizeof(bitmap->map) * 8)
110 bitmap->map |= 1UL << shift;