Aller au contenu principal

B2. Fenêtre anti-rejeu

Le récepteur maintiendra une fenêtre anti-rejeu de taille W. Cette fenêtre limitera à quel point un paquet peut être hors ordre, par rapport au paquet avec le numéro de séquence le plus élevé qui a été authentifié jusqu'à présent. (Aucune exigence n'est établie pour les tailles minimales ou recommandées pour cette fenêtre, au-delà des valeurs de 32 et 64 paquets déjà établies pour les fenêtres de numéros de séquence de 32 bits. Cependant, il est suggéré qu'un implémenteur dimensionne ces valeurs de manière cohérente avec la vitesse d'interface prise en charge par une implémentation qui utilise l'option ESN. De plus, l'algorithme décrit ci-dessous suppose que la fenêtre n'est pas supérieure à 2^31 paquets de largeur.) Tous les 2^32 numéros de séquence associés à une valeur fixe quelconque pour les 32 bits de poids fort (Seqh) seront désormais appelés un sous-espace de numéro de séquence. Le tableau suivant répertorie les variables pertinentes et leurs définitions.

Var. NameSize (bits)Meaning
W32Taille de la fenêtre
T64Numéro de séquence le plus élevé authentifié jusqu'à présent, limite supérieure de la fenêtre
Tl3232 bits inférieurs de T
Th3232 bits supérieurs de T
B64Limite inférieure de la fenêtre
Bl3232 bits inférieurs de B
Bh3232 bits supérieurs de B
Seq64Numéro de séquence du paquet reçu
Seql3232 bits inférieurs de Seq
Seqh3232 bits supérieurs de Seq

Lors de l'exécution de la vérification anti-rejeu, ou lors de la détermination des bits de poids fort à utiliser pour authentifier un paquet entrant, il y a deux cas:

  • Cas A: Tl >= (W - 1). Dans ce cas, la fenêtre est dans un sous-espace de numéro de séquence. (Voir Figure 1)
  • Cas B: Tl < (W - 1). Dans ce cas, la fenêtre s'étend sur deux sous-espaces de numéros de séquence. (Voir Figure 2)

Dans les figures ci-dessous, la ligne du bas ("----") montre deux sous-espaces de numéros de séquence consécutifs, avec des zéros indiquant le début de chaque sous-espace. Les deux lignes plus courtes au-dessus montrent les bits d'ordre supérieur qui s'appliquent. Le "====" représente la fenêtre. Le "****" représente les numéros de séquence futurs, c'est-à-dire ceux au-delà du numéro de séquence le plus élevé actuellement authentifié (ThTl).

    Th+1                         *********

Th =======*****

--0--------+-----+-----0--------+-----------0--
Bl Tl Bl
(Bl+2^32) mod 2^32

Figure 1 -- Cas A


Th ====**************

Th-1 ===

--0-----------------+--0--+--------------+--0--
Bl Tl Bl
(Bl+2^32) mod 2^32

Figure 2 -- Cas B

B2.1. Gestion et utilisation de la fenêtre anti-rejeu

La fenêtre anti-rejeu peut être considérée comme une chaîne de bits où 'W' définit la longueur de la chaîne. W = T - B + 1 et ne peut pas dépasser 2^32 - 1 en valeur. Le bit le plus bas correspond à B et le bit le plus haut correspond à T, et chaque numéro de séquence de Bl à Tl est représenté par un bit correspondant. La valeur du bit indique si un paquet avec ce numéro de séquence a été reçu et authentifié, de sorte que les rejeux peuvent être détectés et rejetés.

Lorsqu'un paquet avec un numéro de séquence de 64 bits (Seq) supérieur à T est reçu et validé,

  • B est augmenté de (Seq - T)
  • (Seq - T) bits sont supprimés de l'extrémité inférieure de la fenêtre
  • (Seq - T) bits sont ajoutés à l'extrémité supérieure de la fenêtre
  • Le bit supérieur est défini pour indiquer qu'un paquet avec ce numéro de séquence a été reçu et authentifié
  • Les nouveaux bits entre T et le bit supérieur sont définis pour indiquer qu'aucun paquet avec ces numéros de séquence n'a encore été reçu.
  • T est défini sur le nouveau numéro de séquence

Lors de la vérification des paquets rejoués,

  • Dans le cas A: Si Seql >= Bl (où Bl = Tl - W + 1) ET Seql <= Tl, alors vérifier le bit correspondant dans la fenêtre pour voir si ce Seql a déjà été vu. Si oui, rejeter le paquet. Si non, effectuer la vérification d'intégrité (voir Annexe B2.2 ci-dessous pour la détermination de SeqH).

  • Dans le cas B: Si Seql >= Bl (où Bl = Tl - W + 1) OU Seql <= Tl, alors vérifier le bit correspondant dans la fenêtre pour voir si ce Seql a déjà été vu. Si oui, rejeter le paquet. Si non, effectuer la vérification d'intégrité (voir Annexe B2.2 ci-dessous pour la détermination de Seqh).

B2.2. Détermination des bits d'ordre supérieur (Seqh) du numéro de séquence

Parce que seul 'Seql' sera transmis avec le paquet, le récepteur doit déduire et suivre le sous-espace de numéro de séquence dans lequel chaque paquet tombe, c'est-à-dire déterminer la valeur de Seqh. Les équations suivantes définissent comment sélectionner Seqh dans des conditions "normales"; voir Annexe B3 pour une discussion sur la façon de récupérer d'une perte de paquets extrême.

Dans le cas A (Figure 1):

  • Si Seql >= Bl (où Bl = Tl - W + 1), alors Seqh = Th
  • Si Seql < Bl (où Bl = Tl - W + 1), alors Seqh = Th + 1

Dans le cas B (Figure 2):

  • Si Seql >= Bl (où Bl = Tl - W + 1), alors Seqh = Th - 1
  • Si Seql < Bl (où Bl = Tl - W + 1), alors Seqh = Th

B2.3. Exemple de pseudo-code

Le pseudo-code suivant illustre les algorithmes ci-dessus pour les vérifications anti-rejeu et d'intégrité. Les valeurs pour 'Seql', 'Tl', 'Th', et 'W' sont des entiers non signés de 32 bits. L'arithmétique est mod 2^32.

If (Tl >= W - 1)                            Case A
If (Seql >= Tl - W + 1)
Seqh = Th
If (Seql <= Tl)
If (pass replay check)
If (pass integrity check)
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else reject packet
Else
If (pass integrity check)
Tl = Seql (shift bits)
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else
Seqh = Th + 1
If (pass integrity check)
Tl = Seql (shift bits)
Th = Th + 1
Set bit corresponding to Seql
Pass the packet on
Else reject packet
Else Case B
If (Seql >= Tl - W + 1)
Seqh = Th - 1
If (pass replay check)
If (pass integrity check)
Set the bit corresponding to Seql
Pass packet on
Else reject packet
Else reject packet
Else
Seqh = Th
If (Seql <= Tl)
If (pass replay check)
If (pass integrity check)
Set the bit corresponding to Seql
Pass packet on
Else reject packet
Else reject packet
Else
If (pass integrity check)
Tl = Seql (shift bits)
Set the bit corresponding to Seql
Pass packet on
Else reject packet