Chapitre 6. Conversions Radix-64

Table des matières
Une implémentation du CRC-24 en <<  C  >>
Création de l'armure ASCII
Encoder des données binaires en Radix-64
Décoder du Radix-64
Exemples de Radix-64
Exemple d'un message ASCII de type Armor

Comme il a été dit dans l'introduction, la représentation sous-jacente native des objets OpenPGP est un flux d'octets aléatoires. Certains systèmes requièrent que ces objets soient à l'abri de tout dommage issu de conversion de jeux de caractères, de données, etc.

En théorie, tout schéma d'encodage des données correspondant aux exigences des canaux non sûrs serait suffisant, puisqu'il ne modifierait pas le flux de bit sous-jacent des structures de donnée natives d'OpenPGP. La norme d'OpenPGP spécifie un schéma d'encodage de ce type pour assurer l'interopérabilité.

L'encodage Radix-64 d'OpenPGP est constitué de deux parties: l'encodage des données binaires en base64 et un checksum. L'encodage en base64 est identique au content-transfer-encoding (contenu-transfert-encodage) en base64 MIME [RFC2231,Section 6.8]. Une implémentation OpenPGP peut utiliser une armure ASCII pour protéger les données binaires brutes.

Le checksum est le résultat d'un CRC sur 24 bits converti en quatre caractères d'encodage radix-64 encodés par le même procédé MIME base64, et précédé d'un signe égal (=). Le CRC est calculé en utilisant le générateur 0x864CFB et une initialisation à 0xB704CE. La somme est effectuée sur les données avant leur conversion en radix-64 plutôt qu'après. Un exemple d'implémentation de cet algorithme est disponible dans la prochaine section.

On peut faire apparaitre le résultat du checksum, précédé du signe égal, sur la première ligne suivant les données encodées.

Le CRC-24 repose sur la logique suivante: une taille de 24 bits lui permet de s'adapter parfaitement à une base64 imprimable. L'initialisation non nul permet de détecter plus d'erreur qu'une initialisation à zéro.

Une implémentation du CRC-24 en <<  C  >>

#define CRC24_INIT 0xb704ceL
       #define CRC24_POLY 0x1864cfbL

       typedef long crc24;
       crc24 crc_octets(unsigned char *octets, size_t len)
       {
           crc24 crc = CRC24_INIT;
           int i;

           while (len--) {
               crc ^= (*octets++) << 16;
               for (i = 0; i < 8; i++) {
                   crc <<= 1;
                   if (crc & 0x1000000)
                       crc ^= CRC24_POLY;
               }
           }
           return crc & 0xffffffL;
       }