Le premier octet d'un en-tête de paquet s'appelle << signature du paquet >>. Il détermine le format de l'en-tête et informe sur le contenu du paquet. Le reste de l'en-tête détermine la taille du paquet.
Il faut noter que le bit le plus important est celui le plus à gauche, il est appelé bit 7. Un masque pour ce bit est 0x80 en hexadécimal.
+-----------------+ PTag | 7 6 5 4 3 2 1 0 | +-----------------+ |
Le bit 7 vaut toujours 1, le bit 6 indique le nouveau format du paquet s'il est positionné.
PGP 2.6.x utilise seulement les paquets dans l'ancien format. Ainsi, les logiciels qui doivent utiliser cette version de PGP ne doivent utiliser que les paquets d'ancien format. Si la compatibilité n'est pas une question importante, l'un ou l'autre format peut être utilisé. Remarquez que les paquets dans l'ancien format possèdent 4 bits de signature du contenu, et que les paquets dans le nouveau format en possèdent 6 ; certaines possibilités ne peuvent pas être utilisées et restent tout de même compatibles.
Paquets dans l'ancien format :
bits 5-2 -- signature de contenu bits 1-0 - type de longueur |
Les paquets dans le nouveau format contiennent :
Bits 5-0 -- signature du contenu |
Signification du type de longueur dans les paquets en ancien format.
Le paquet a une longueur de 1 octet. L'en-tête fait 2 octets.
Le paquet a une longueur de 2 octets. L'en-tête fait 3 octets.
Le paquet a une longueur de 4 octets. L'en-tête fait 5 octets.
Le paquet est d'une taille indéterminée. L'en-tête fait 1 octet, et la longueur est à déterminer à l'implémentation. Si le paquet est dans un fichier, cela signifie que le paquet s'étend jusqu'à la fin du fichier. En général, l'implémentation NE DOIT PAS utiliser des paquets de tailles indéterminées sauf si la fin des données est proche d'après le contexte, et même dans ce cas il est mieux d'utiliser une taille précise, ou un en-tête dans le nouveau format. L'en-tête du nouveau format décrit ci-dessous possède un mécanisme pour encoder avec précision des données de tailles inconnues.
Les paquets du nouveau format présentent 4 possibilités pour coder la longueur.
Un en-tête d'un octet autorise des longueurs de paquets de 191 octets maximum.
Un en-tête de deux octets permet d'encoder des paquets de tailles comprises entre 192 et 8383 octets.
Un en-tête de 5 octets peut encoder des paquets qui peuvent aller jusqu'à 4,294,967,295 (0xFFFFFFFF) octets en longueur. (Ce qui revient à coder un nombre scalaire de 4 octets).
Quand la longueur d'un paquet n'est pas connue à l'avance par celui qui en a besoin, les en-têtes qui renseignent sur des longueurs de corps partiel, codent un paquet de taille indéterminée, en le transformant en une chaîne.
Un en-tête d'un octet code une longueur de 0 à 191 octets. Ce type de longueur d'en-tête est reconnu, car la valeur de l'octet est inférieure à 192. La longueur du corps vaut :
LongueurCorps = 1er_octet; |
Un en-tête de deux octets code une longueur comprise entre 192 et 8383 octets. On le reconnaît grâce au premier octet qui est compris entre 192 et 223. La longueur du corps est égale à:
LongueurCorps = ((1er_octet - 192) << 8)+ (2eme_octet) + 192 |
Un en-tête d'une longueur de 5 octets consiste en un simple octet qui vaut 255, suivi par un scalaire de 4 octets. La longueur du corps est égale à :
LongueurCorps = (2eme_octet << 24) | (3eme_octet << 16) | (4eme_octet << 8) | 5eme_octet |
Un en-tête de longueur partielle est mis sur un octet et code seulement la longueur de la partie donnée du paquet. Cette longueur est une puissance de 2, comprise entre 1 et 1 073 741 824 (2 puissance 30). Cet octet est reconnu par le fait qu'il est supérieur ou égal à 224, et inférieur à 255. La longueur partielle est égale à :
LongueurPartielleCorps = 1 << (1er_octet & 0x1F); |
Ces exemples montrent l'encodage de la taille des paquets suivant le nouveau format de paquet.
Un paquet avec une taille de 100 peut avoir sa longueur codée sur un octet : 0x64. Cet octet est suivi de 100 autres de données.
Un paquet d'une longueur de 1723 peut avoir une longueur codée sur deux octets : 0xC5, 0xFB. Cet en-tête par exemple est suivi par 1723 octets de données.
Un paquet d'une longueur de 100000 peut avoir sa longueur codée sur 5 octets : 0xFF, 0x00, 0x01, 0x86,0xA0.
Il pourrait aussi être encodé dans le flux d'octets suivants : 0xEF, d'abord 32768 octets de données; 0xE1, suivi de deux octets de données; 0XE0, suivi d'un octet de donnée; 0XF0, suivi de 65536 octets de données; 0xC5, 0xDD, suivi des derniers 1693 octets de données. Ceci n'est qu'un des codages possibles, et beaucoup de variations sont possibles sur la taille des corps intermédiaires d'en-têtes, du moment qu'une en-tête de longueur de corps normal code la dernière portion des données. Il faut aussi savoir que le dernier en-tête de longueur de corps peut être un en-tête de taille nulle.
Une implémentation PEUT utiliser des longueurs de corps de données partielles pour les paquets de données, qu'ils soient à l'état brut, compressés, ou cryptés. La première longueur partielle doit être au moins de 512 octets. Les longueurs partielles de corps NE DOIVENT être utilisées pour aucun autre type de paquets.
Remarquez que dans toutes ces explications, la longueur totale du paquet est la longueur de l'en-tête plus celle du corps.
Précédent | Sommaire | Suivant |
Syntaxe des paquets | Niveau supérieur | Marqueurs de paquet |