DtlsReplayWindow
using System;
namespace Org.BouncyCastle.Tls
{
internal sealed class DtlsReplayWindow
{
private const long ValidSeqMask = 281474976710655;
private const long WindowSize = 64;
private long m_latestConfirmedSeq = -1;
private ulong m_bitmap;
internal bool ShouldDiscard(long seq)
{
if ((seq & 281474976710655) != seq)
return true;
if (seq <= m_latestConfirmedSeq) {
long num = m_latestConfirmedSeq - seq;
if (num >= 64)
return true;
if (((long)m_bitmap & (1 << (int)num)) != 0)
return true;
}
return false;
}
internal void ReportAuthenticated(long seq, out bool isLatestConfirmed)
{
if ((seq & 281474976710655) != seq)
throw new ArgumentException("out of range", "seq");
if (seq <= m_latestConfirmedSeq) {
long num = m_latestConfirmedSeq - seq;
if (num < 64)
m_bitmap |= (ulong)(1 << (int)num);
isLatestConfirmed = false;
} else {
long num2 = seq - m_latestConfirmedSeq;
if (num2 >= 64)
m_bitmap = 1;
else {
m_bitmap <<= (int)num2;
m_bitmap |= 1;
}
m_latestConfirmedSeq = seq;
isLatestConfirmed = true;
}
}
internal void Reset(long seq)
{
if ((seq & 281474976710655) != seq)
throw new ArgumentException("out of range", "seq");
m_latestConfirmedSeq = seq;
m_bitmap = ulong.MaxValue >> (int)System.Math.Max(0, 63 - seq);
}
}
}