+
+ /* --- We've found a match, so check the sequence number --- */
+
+match:
+ iseq = LOAD32(pseq);
+ IF_TRACING(T_KEYSET, {
+ trace(T_KEYSET, "keyset: decrypted OK (sequence = %lu)",
+ (unsigned long)iseq);
+ trace_block(T_CRYPTO, "crypto: decrypted packet", q, sz);
+ })
+ if (iseq < ks->iseq) {
+ a_warn("received packet has old sequence number (possible replay)");
+ return (-1);
+ }
+ if (iseq >= ks->iseq + KS_SEQWINSZ) {
+ uint32 n = iseq - (ks->iseq + KS_SEQWINSZ - 1);
+ if (n < KS_SEQWINSZ)
+ ks->iwin >>= n;
+ else
+ ks->iwin = 0;
+ ks->iseq += n;
+ }
+ seqbit = 1 << (iseq - ks->iseq);
+ if (ks->iwin & seqbit) {
+ a_warn("received packet repeats old sequence number");
+ return (-1);
+ }
+ ks->iwin |= seqbit;
+ return (0);