Format des listings "---with-colons"
====================================

sec::1024:17:6C7EE1B8621CC013:1998-07-07:0:::Werner Koch <werner.koch@guug.de>:
ssb::1536:20:5CE086B5B5A18FF4:1998-07-07:0:::

 1. Champ:  Type d'enregistrement
	    pub = clef publique
	    sub = sous-clef (clef secondaire)
	    sec = clef secrète
	    ssb = sous-clef secrète (clef secondaire)
	    uid = id d'utilisateur (seul le champ 10 est utilisé)
            sig = signature
	    fpr = fingerprint: (le champ 10 est le fingerprint)
	    pkd = données publiques de la clef
		(champ au format spécial, voir ci-dessous)

 2. Champ:  Une lettre décrivant la confiance calculée. Ce n'est qu'une
	seule lettre, mais elle fera peut-être l'objet d'une information
	supplémentaire pour les versions futures, comme décrit ici
	(ceci ne sera pas utilisé pour les clefs privées)
		o = Inconnu (cette clef est nouvelle au système)
                i = La clef est invalide (eg. il manque sa propre signature)
		d = La clef a été désactivée
		r = La clef a été révoquée
		e = La clef a expiré
		q = Non-défini (pas de valeur attribuée)
		n = Ne jamais faire confiance à cette clef
		m = Cette clef dispose d'une confiance marginale
		f = Cette clef dispose d'une confiance totale
		u = Cette clef dispose d'une confiance ultime. Cette valeur
			n'est utilisée que pour les clefs où la clef secrète est
			également disponibles.
 3. Champ:  taille de la clef en bits.
 4. Champ:  Algorithme utilisé:	1 = RSA
		       16 = ElGamal (chiffrement uniquement)
		       17 = DSA (parfois appellé DH, signature seulement)
		       20 = ElGamal (signe et chiffre)
	    (pour d'autres is, consultez include/cipher.h)
 5. Champ:  ID de clef (KeyID)
 6. Champ:  Date de création (en UTC)
 7. Champ:  Date d'expiration de la clef, vide si aucune.
 8. Champ:  ID local : numéro d'enregistrement du répertoire dans la
			trustdb. Cette valeur n'est valide que tant que la
			trustdb n'est pas effacée. Vous pouvez utiliser
			"#<local-id>" comme id d'utilisateur lorsque vous spécifiez
			la clef. Ceci est requis puisque les id de clef ne sont pas
			toujours uniques - un programme peut donc utiliser ce numéro
			pour accéder aux clefs ultérieurement.
 9. Champ:  Confiance propre (clef publiques primaires uniquement)
	    C'est une simple lettre, mais une information supplémentaire pourrait
		se voir ajoutée dans les versions futures.
10. Champ:  ID utilisateur. La valeur est placée entre guillemets comme une
		chaîne en C, par exemple : "\x3a".
11. Champ:  Classe de signature. C'est un nombre hexadécimal à deux chiffres
		suivi par la lettre "x" si la signature peut être exportée ou la
		lettre "l" si la signature est uniquement locale.
12. Champ:  Capacités de la clef :
                e = chiffrement
                s = signature
                c = certification
            Une clef peut disposer de toute combinaison de ces caractéristiques.
		La clef primaire dispose, en plus de ces lettres, une version en
		majuscule des lettres pour marquer les capacités "d'utilisation"
		de la totalité de la clef.

Toutes les dates sont affichées dans le format :

yyyy-mm-dd

Sauf si vous utilisez l'option --fixed-list-mode où dans ce cas précis les
dates sont affichées en secondes depuis Epoch. Plus de champs feront l'objet
d'additions dans les futures versions et les parsers doivent y être préparés.
Lorsque le parser traitera ces données, il devra s'arrêter au premier
caractère non-numérique afin que des informations supplémentaires soient
ajoutées à l'avenir.

Le champ 1 dispose d'un tag "pkd" dont le listing ressemble à ceci :

pkd:0:1024:B665B1435F4C2 .... FF26ABB:
    !  !   !-- la valeur
    !  !------ indicateur du nombre de bits de la valeur
    !--------- index (eg. DSA va de 0 à 3 : p,q,g,y)



Format de la sortie "--status-fd"
=================================

Chaque ligne dispose d'un préfixe :

"[GNUPG:] "

Suivie par un mot clef indiquant le type de la ligne de statut,
et quelques arguments selon le type (probablement aucun) ; une application
devrait toujours assumer que des arguments supplémentaires seront
présents dans les versions futures.

    GOODSIG	<long keyid>  <username>
	La signature keyid est valide.
	Pour chaque signature seul l'un des trois codes GOODSIG, BADSIG ou
	ERRSIG seront produits et ils pourront être utilisés comme
	marqueurs pour les nouvelles signatures.

    BADSIG	<long keyid>  <username>
	La signature keyid n'a pas été vérifiée correctement.

    ERRSIG  <long keyid>  <pubkey_algo> <hash_algo> \
	    <sig_class> <timestamp> <rc>
	Il n'a pas été possible de vérifier la signature. Ceci peut provenir
	d'une clef publique manquante, ou bien à cause d'un algorithme non-
	supporté. Un RC de 4 indique un algorithme inconnu, un 9 indique
	une clef publique manquante. Les autres champs donnent plus d'information
	sur la signature. sig_class est une valeur hexadécimale de 2 octets.

    VALIDSIG	<fingerprint in hex> <sig_creation_date> <sig-timestamp>
	La signature keyid est valide. C'est ici la même chose que GOODSIG
	mais avec le fingerprint comme argument. Les lignes de statut seront
	émises pour une bonne signature.
	sig-timestamp est la date de création de la signature en secondes
	depuis Epoch.

    SIG_ID  <radix64_string>  <sig_creation_date>  <sig-timestamp>
	N'est émis que pour les signatures de classe 0 ou 1 qui ont été
	vérifiées comme valides. Le chaîne est un identifiant d'utilisateur
	et peut être utilisée dans les applications pour détecter les
	attaques par rejeu de messages signés. Notez que seuls les
	algorithmes DLP offrent des identifiants uniques ; les autres peuvent
	produire des id dupliqués lorsqu'ils furent créés à la même seconde.

    ENC_TO  <long keyid>  <keytype>  <keylength>
	Le message est chiffré avec ce keyid.
	keytype est une valeur numérique de l'algorithme à clef publique,
	keylength est la taille de la clef ou 0 si elle n'est pas connue
	(ce qui est toujours le cas).

    NODATA  <what>
	Aucune donnée n'a été trouvée. Les codes suivants sont utilisés :
	    1 - Pas de données sous ARMOR.
	    2 - Un paquet attendu n'a pas été trouvé.
	    3 - Paquet invalide trouvé ; ceci peut indiquer un message
		non-OpenPGP. Vous devez vous attendre à une extension
		de ces lignes de statu à l'avenir.

    UNEXPECTED <what>
        Des données innatendues ont été rencontrées
            0 - pas de détail supplémentaire

    TRUST_UNDEFINED
    TRUST_NEVER
    TRUST_MARGINAL
    TRUST_FULLY
    TRUST_ULTIMATE
	Pour les signatures valides, l'une de ces lignes de statut sera produite
	pour indiquer le niveau de confiance attribué à la clef. Pas d'arguments
	pour l'instant.

    SIGEXPIRED
	La clef de signature a expiré. Pas d'arguments pour l'instant.

    KEYREVOKED
	L'utilisateur a révoqué sa clef. Pas d'arguments pour l'instant.

    BADARMOR
	L'ARMOR ASCII est corrompu. Pas d'arguments pour l'instant.

    RSA_OR_IDEA
	Les algorithmes IDEA ont été utilisés sur les données. Un programme
	pourra basculer sur un autre programme de traitement si GnuPG échoue.
	Ce message de statut sera affiché pour le RSA aussi, mais ceci a été
	abandonné puisque le brevêt sur le RSA a expiré.
	Toutefois, nous ne pouvons modifier le nom du message.

    SHM_INFO
    SHM_GET
    SHM_GET_BOOL
    SHM_GET_HIDDEN

    GET_BOOL
    GET_LINE
    GET_HIDDEN
    GOT_IT

    NEED_PASSPHRASE <long main keyid> <long keyid> <keytype> <keylength>
	Sera affiché à chaque fois qu'une phrase passe sera requise.
	keytype est la valeur numérique de l'algorithme à clef publique
	ou bien 0 si cela n'est pas applicable. keylength est la taille de la
	clef ou 0 si la taille n'est pas connue (ceci est actuellement
	toujours le cas).

    NEED_PASSPHRASE_SYM <cipher_algo> <s2k_mode> <s2k_hash>
	Affiché à chaque fois qu'une phrase passe pour un chiffrement
	symétrique sera requise.

    MISSING_PASSPHRASE
	Aucune phrase passe n'a été fournie. Une application qui rencontre
	ce message devrait stopper immédiatement le parsing car le prochain
	message sera probablement BAD_PASSPHRASE. Toutefois, si l'application
	n'est qu'un wrapper autour de la fonctionnalité d'édition de clefs,
	ceci pourrait avoir un autre sens et stopper le parsing pourrait
	être incorrect, et il faudra ignorer le BAD_PASSPHRASE.

    BAD_PASSPHRASE <long keyid>
	La phrase passe fournie est soit invalide, soit n'a pas été fournie.
	Dans le seconde cas vous devriez voir un MISSING_PASSPHRASE.

    GOOD_PASSPHRASE
	La phrase passe fournie est valide et le matériel de clefs secrète
	est utilisable.

    DECRYPTION_FAILED
	La déchiffrement symétrique a échoué. Il s'agit généralement d'une
	mauvaise phrase passe ne correspondant pas au message chiffré.

    DECRYPTION_OKAY
	Succès du déchiffrement. Ceci signifie que soit la clef secrète
	adaptée a été utilisée avec succès, soit que la phrase passe
	valide pour un chiffrement symétrique aura conduit au déchiffrement.
	Le programme pourait toutefois renvoyer un message d'erreur s'il
	n'a pas été possible de vérifier la signature.

    NO_PUBKEY  <long keyid>
    NO_SECKEY  <long keyid>
	La clef n'est pas utilisable.

    IMPORTED   <long keyid>  <username>
	Le keyid et la signature ont été importés.

    IMPORTED_RES <count> <no_user_id> <imported> <imported_rsa> <unchanged>
	<n_uids> <n_subk> <n_sigs> <n_revoc> <sec_read> <sec_imported> <sec_dups>
	Statistiques finales sur le processus d'importation (cette ligne est longue!)

    FILE_START <what> <filename>
	Début de traitement du fichier <filename>. <what> indique l'opération
	réalisée :
	    1 - vérifier

    FILE_DONE
	Marque la fin de traitement d'un fichier, ayant débuté avec FILE_START.

    BEGIN_DECRYPTION
    END_DECRYPTION
	Marque le début et la fin du processus de déchiffrement. Ces messages
	seront également produits lors de l'utilisation du mode --list-only.

    BEGIN_ENCRYPTION
    END_ENCRYPTION
	Marque le début et la fin du processus de chiffrement.

    DELETE_PROBLEM reason_code
	L'effacement d'une clef a échoué. Un code indique la raison de l'erreur :
	    1 - La clef spécifiée n'existe pas
	    2 - La clef privée doit être détruite avant !

    PROGRESS what char cur total
	Utilisé par les fonctions primegen et de clef publique pour indiquer
	la progression de l'opération. "char" est le caractère affiché sans
	--status-fd avec les retours à la ligne marqués par "X". "cur" indique
	la quantitité de traitement terminée et "total" indique la valeur
	finale à atteindre. Un total de 0 indique que le total n'est pas
	connu. 100/100 peut être utilisé pour détecter la fin de l'opération.

    SIG_CREATED <type> <pubkey algo> <hash algo> <class> <timestamp> <key fpr>
	Une signature a été créée à l'aide de ces paramètres.
	    type:  'D' = détachée
		   'C' = en texte clair
		   'S' = standard
		   (seul le premier caractère doit être vérifié)
	    class: 2 chiffres hexadécimaux avec la classe de signature
        
    KEY_CREATED <type>
        Une clef a été créée
            type: 'B' = primaire et sous-clef
                  'P' = primaire
                  'S' = sous-clef

    SESSION_KEY  <algo>:<hexdigits>
	La clef de session utilisée pour déchiffrer le message. Ce message
	sera seulement affiché si l'option --show-session est utilisée.
	Le format est utilisable pour un passage direct à la fonction
	--override-session-key.

    NOTATION_NAME <name> 
    NOTATION_DATA <string>
	Le nom et la chaîne sont "escaped" à l'aide de %XX et les données
	peuvent être découpées sur plusieurs lignes notation_data.

    USERID_HINT <long main keyid> <string>
	Donne un indice sur l'ID utilisateur pour un keyID donné.

    POLICY_URL <string>
	La chaîne est "escaped" en %XX

    BEGIN_STREAM
    END_STREAM
	Produit par pipemode.


Génération de clef
==================

La génération de clef marque sa progression à l'aide de différents caractères, dont
voici la signification :

"." : les 10 derniers tests Miller-Rabin ont échoué.
"+" : réussite du test Miller-Rabin.
"!" : Rechargement du pool avec des nombres premiers frais.
"^" : Vérification d'une nouvelle valeur pour le générateur.
"<" : La taille d'un facteur a été réduite.
">" : La taille d'un facteur a été augmentée.

Le nombre premier pour l'ElGamal est généré de la manière suivante :

1. On crée un nombre premier q de 160, 200 ou 240 bits (selon la taille
	de la clef).
2. On sélectionne la taille de l'autre facteur premier, afin qu'elle soit
	au moins de la taille de q et on calcule le nombre de facteurs premiers
	requis.
3. On crée un pool de nombres premiers, chacun dont la longueur fut déterminée
	à l'étape 2.
4. On obtient une nouvelle permutation du pool et nous continuons avec
	l'étape 3 une fois toutes les permutations testées.
5. Le premier cancidat est calculé par p = 2 * q * p[1] * ... * p[n] + 1
6. On vérifie que ce premier dispose de la taille désirée (ceci peut changer
	q s'il ne semble pas possible de produire un premier de la taille voulue)
7. On vérifie si ce nombre est premier à l'aide de divisions d'essai et par
	le test de Miller-Rabin.
8. On continue à l'étape 4 si on n'a pas trouvé de premier à l'étape 7.
9. On trouve un générateur pour ce premier.

Cet algorithme se base sur la suggestion de Lim et Lee du Crypto' 97 (p. 260).

Génération de clef innatendue
=============================

Cette fonction est actuellement expérimentale et permet la production de
clefs innatendues avec un contrôle depuis un fichier de paramètres.
Cette fonctionnalité n'a pas fait l'objet de tests poussés ! Veuillez ne
PAS vous plaindre si nous décidons d'apporter des modifications importantes
à cette commande.

Pour utiliser cette fonctionnalité, vous devez utiliser --gen-key en
combinaison avec --batch et fournir les paramètres soit depuis stdin,
soit depuis un fichier dont le nom est fourni en ligne de commande.

Ce fichier devra utiliser le format suivant :

 o En texte uniquement, chaque ligne étant limitée à environ 1000 caractères.
 o Vous devez utiliser un codage UTF-8 pour marquer les caractères non ASCII.
 o Les lignes vides seront ignorées.
 o Les espaces en début et fin de ligne seront ignorés.
 o Un signe "-" en tant que premier caractère "non white space" marque
	une ligne de commentaire.
 o Les commandes sont marquées par un signe "%" en début de ligne,
	suivi par la commande et ses arguments sont séparés par des espaces.
 o Les paramètres sont indiqués par un mot clef, suivi par un ":". Les
	arguments sont séparés par des espaces.
 o Le premier paramètre doit être "Key-Type" et ses contrôles peuvent
	être placés à votre discrétion.
 o La génération de clef aura lieu soit à la fin du fichier de paramètres,
	soit lorsque le premier "Key-Type" est rencontré au sein du fichier,
	dans un ensenble de contrôle "%commit".
 o Les ensembles de contrôle sont :
	%echo <texte>
	Affiche <texte>

	%dry-run
	Ne réalise pas la production de clef (pratique pour vérifier la
	syntaxe).

	%commit
	Réalise la production de clef. Un commit implicite est produit
	à chaque rencontre de "Key-Type".

    %pubring <filename>
    %secring <filename>
	Ne renvoie pas la clef vers le sortie par défaut ou dans le keyring
	indiqué en ligne de commande, mais vers le fichier <filename>. Ce
	contrôle doit être utilisé avant que le commit ne soit rencontré.	
	Toute double mention sera ignorée et le dernier nom de fichier
	rencontré sera celui utilisé. Le fichier sera utilisé jusqu'à ce
	qu'un nouveau fichier soit spécifié (au points de commit) sinon
	toutes les clefs seront placées dans le même fichier. Si un nouveau
	nom de fichier est indiqué, le fichier sera créé (et tout ancien
	fichier sera alors écrasé). Les deux indications doivent être
	fournies au contrôle.

 o L'ordre des paramètres n'a pas d'importance, sauf pour "Key-Type" qui
	doit être le premier paramètre rencontré. Les paramètres ne sont
	destinés qu'au bloc keybloc généré et les paramètres des productions
	précédentes de clefs ne seront pas pris en compte. Certaines
	vérifications syntaxiques seront mises en place et peuvent être
	ou non actives. Les paramètres actuellement définis sont :

     Key-Type: <algo-number>|<algo-string>
	Débute un nouveau bloc de paramètres indiquant le type de la clef
	primaire à produire. L'algorithme doit être capable de produire
	des signatures. Ce paramètre est indispensable !

     Key-Length: <length-in-bits>
	Indique la taille de la clef, en bits. La valeur par défaut est
	1024.

     Subkey-Type: <algo-number>|<algo-string>
	Permet de produire une clef secondaire. Actuellement, seule une
	sous-clef peut être gérée.

     Subkey-Length: <length-in-bits>
	Taille de la sous-clef en bits. La valeur par défaut est
	1024.

     Passphrase: <string>
	Si vous souhaitez spécifier une phrase passe pour la clef
	secrète vous pouvez utiliser cette commande. Par défaut,
	aucune phrase passe ne sera associée aux clefs privées.

     Name-Real: <string>
     Name-Comment: <string>
     Name-Email: <string>
	Voici les trois composantes d'une clef. Vous devez ici
	n'utiliser que de l'UTF-8. Si vous ne fournissez aucune
	de ces indications, aucun ID d'utilisateur ne sera créé.

     Expire-Date: <iso-date>|(<number>[d|w|m|y])
	Spécifie la date d'expiration de la clef (et de sa sous-clef)
	La date doit être entrée sous la forme d'une date au format
	ISO (année-mois-jour) ou bien sous forme d'un nombre de
	jours, de semaines, de mois ou d'années. Si vous n'utilisez
	pas de lettre pour indiquer la durée, des "jours" sont
	assumés par défaut.

Voici un exemple :
$ cat >foo <<EOF
     %echo Génération d'une clef standard
     Key-Type: DSA
     Key-Length: 1024
     Subkey-Type: ELG-E
     Subkey-Length: 1024
     Name-Real: Joe le testeur
     Name-Comment: ma phrase passe est stupide
     Name-Email: joe@foo.bar
     Expire-Date: 0
     Passphrase: abc
     %pubring foo.pub
     %secring foo.sec
     # Un commit est requis ici, pour pouvoir afficher un "done" :-)
     %commit
     %echo done
EOF
$ gpg --batch --gen-key -a foo
 [...]
$ gpg --no-default-keyring --secret-keyring foo.sec \
				  --keyring foo.pub --list-secret-keys
/home/wk/work/gnupg-stable/scratch/foo.sec
------------------------------------------
sec  1024D/915A878D 2000-03-09 Joe le testeur (ma phrase passe est stupide) <joe@foo.bar>
ssb  1024g/8F70E2C0 2000-03-09



Composition de la TrustDB
=========================

La TrustDB est construire à partir d'enregistrements à taille fixe, où le premier
octet décrit le type d'enregistrement. Toutes les valeurs numériques sont
conservées dans un réseau d'ordre d'octets. La longueur de chaque enregistrement
est de 40 octets. Le premier enregistrement de la TrustDB est toujours de type 1
et c'est le seul enregistrement de ce type.

  Record type 0:
  --------------

	Cet enregistrement n'est pas utilisé. Il peut être utilisé
	à votre discrétion.

  Record type 1:
  --------------

	Indique la version de la TrustDB. Cet enregistrement doit toujours être
	le premier enregistrement de la base de données et c'est le seul
	enregistrement de type 1.

     1 octet valeur : 1
     3 octets 'gpg'  valeur "magic"
     1 octet Version de la TrustDB (2)
     1 octet marginales requises
     1 octet complètes requises
     1 octet max_cert_depth

	Ces trois éléments sont utilisés pour vérifier si la valeur de validité
	mise en cache dans l'enregistrement du répertoire peut être utilisée :

     1 u32  locked flags
     1 u32  datation de la création de la trustdb
     1 u32  datation de la dernière modification

	Cette datation pourrait affecter la validité des clefs dans la base de
	données. Cette valeur sera comparée à celle de la datation de validité
	des enregistrements dir :

     1 u32  datation de la dernière validation

	Cette valeur sera utilisée pour stocker le passage du temps, lorsque
	cette TrustDB sera comparée au trousseau de clefs publiques :

     1 u32  numéro de l'enregistrement du keyhashtable
     1 u32  premier enregistrement libre
     1 u32  numéro de l'enregistrement répertoire shadow de la table de hachage

	Cette table ne devrait pas être combinée avec la table de clefs car le
	keyid n'est pas dans chaque cas un élément du fingerprint.

     4 bytes réservés pour l'enregistrement d'extension de version


  Record type 2: (enregistrement répertoire)
  --------------

	Regroupe les informations sur un certificat de clef publique.
	Ces valeur sont statiques et ne sont jamais modifiées sans une
	interaction avec l'utilisateur :

     1 octet valeur : 2
     1 octet  réservé
     1 u32   LID     .	(numéro d'enregistrement de cet enregistrement)
     1 u32   Liste de key-records (le premier est la clef primaire)
     1 u32   Liste de uid-records
     1 u32   cache record
     1 octet  ownertrust
     1 octet  dirflag
     1 octet  validité maximale de tous les id utilisateurs
     1 u32   datation de la dernière vérification de validité
     1 u32   Vérification requise lorsque cette datation sera atteinte
	     (0 = pas de vérification requise)


  Record type 3:  (enregistrement de clef)
  --------------

	Regroupe les informations sur une clef publique primaire.
	(ces informations sont principalement utilisées pour réaliser les lookup
	dans l'enregistrement trust)

     1 octet valeur : 3
     1 octet  réservé
     1 u32   LID
     1 u32   next   - prochain enregistrement
     7 octets réservés
     1 octet  keyflags
     1 octet  algorithme de la clef publique
     1 octet  taille du fingerprint (en octets)
     20 octets fingerprint de la clef publique
	      (Cette valeur est utilisée pour identifier toute clef)

  Record type 4: (enregistrement uid)
  --------------

	Regroupe les informations sur un id utilisateur (un "uid").
	Nous ne stockons par l'uid mais un hachage de l'uid : cela semble suffire.

     1 octet valeur : 4
     1 octet réservé
     1 u32  LID  pointe vers l'enregistrement directory
     1 u32  next   le userid suivant
     1 u32  pointeur vers l'enregistrement preference
     1 u32  siglist  liste de signatures valides
     1 octet uidflags
     1 octet validité de la clef calculée pour cet userid
     20 bytes ripemd160 hachage du nom de l'utilisateur


  Record type 5: (enregistrement pref)
  --------------

	Regroupe les informations formant les préférences.

     1 octet valeur : 5
     1 octet   réservé
     1 u32  LID; pointe vers l'enregistrement directory (et PAS vers le uid !!!)
	    (égal à 0 pour un enregistrement de préférences standard)
     1 u32  suivant
     30 byte données de préférences

  Record type 6  (sigrec)
  -------------

	Cet enregistrement est utilisé pour traquer les signatures de clefs. Les
	auto-signatures ne sont pas conservées. Si une clef publique ne se trouve
	pas dans la TrustDB, la signature pointe vers un enregistrement dir fantôme,
	lequel contient une liste des enregistrements qui seraient intéressés
	par cette clef (et l'enregistrement signature en fait partie).

     1 octet   valeur : 6
     1 octet   réservé
     1 u32    LID	    pointe en retour vers l'enregistrment dir
     1 u32    next   prochain sigrec de cet uid ou bien 0 pour indiquer que ce
					sigrec est le dernier.
     6 times
	1 u32  Local_id des dir signatures ou de l'enregistrement dir fantôme
	1 octet Flag: Bit 0 = vérifié: Bit 1 est valide (nous avons un
				véritable enregistrement directory)
			 1 = valide est vrai (mais pourrait être révoqué)



  Record type 8: (enregistrement répertoire (dir) fantôme)
  --------------

	Cet enregistrement est utilisé pour réserver un LID pour une clef publique.
	Nous avons besoin de cet enregistrement pour créer les enregistrements sigs
	des autres clefs, même si nous ne disposons pas d'une signature de la clef
	publique.
	Cet enregistrement (le numéro d'enregistrement pour être plus précis)
	sera réutilisé dans l'enregistrement dir lorsque nous importerons la
	véritable clef publique.

     1 octet valeur : 8
     1 octet  réservé
     1 u32   LID      (Ceci est simplement le numéro d'enregistrement de ce record.)
     2 u32   keyid
     1 octet  algorithme de la clef publique
     3 octets réservé
     1 u32   hintlist

	hintlist contient la liste des enregistrements qui ont des références qui pointent
	vers cette clef. Nous utilisons cet élément pour augmenter la vitesse d'accès
	des enregistrements de signature qui ne sont pas encore vérifiés. Notez que ces
	données ne sont qu'un indice, une indication ("hint") mais les enregistrements actuels	
	pourraient ne pas détenir d'enregistrement de signature pour la clef, mais le
	code du programme saura prendre soin de tout cela.

    18 octets réservés



  Record Type 10 (table de hachage)
  --------------

	Comme nous utilisons les fingerprint pour accéder aux clefs, nous devons
	implémenter un accès rapide en utilisant des méthodes de hachages simples,
	afin d'éviter une surcharge de gdbm. La propriété des fingerprint
	est qu'ils permettent un usage direct en tant que valeurs hachées (ils
	peuvent être considérés comme des nombres aléatoires cryptographiquement
	forts).
	Nous utilisons une architecture à multiples niveaux dynamique, qui combine
	les tables de hachage, les listes d'enregistrements et les listes
	chaînées.

	Cet enregistrement est une table de hachages de 256 entrées ; une propriété
	spéciale est que tous les enregistrements sont stockés consécutivement
	pour produire une grande table. La valeur hachée est simplement le 1er,
	2nd.. octet du fingerprint (selon le niveau d'indirection).

	Lorsque nous les utilisons pour hacher les enregistrements de répertoires
	shadow, une différente table est utilisée, et elle se trouve indexée
	par le keyid.

     1 octet valeur : 10
     1 octet réservé
     n u32  recnum; n dépend de la taille de l'enregistrement :
	    n = (reclen-2)/4  ce qui donne 9 pour la taille actuelle
		d'enregistrement de 40 octets.

	Le nombre total de ces enregistrements constituant la table est :

	 m = (256+n-1) / n

	ce qui donne 29 pour une taille d'enregistrement de 40.

	Pour rechercher une clef, nous utilisons le premier octet du fingerprint
	pour obtenir le recnum de la table de hachage et nous étudions l'enregistrement
	adressé :

	o Si cet enregistrement est une autre table de hachage, nous pouvons
	utiliser le second octet pour indexer cette table de hachage et continuer.

	o Si cet enregistrement est une liste de hachages, nous pouvons parcourir
	toutes les entrées jusqu'à trouver la bonne.

	o Si cet enregistrement est un enregistrement de clef, nous comparons
	le fingerprint avec celui recherché et nous déterminons s'il s'agit
	de la clef recherchée.



  Record type 11 (liste hachée)
  --------------

	Consultez la table hachée pour une explication.
	Ceci sera également utilisé à d'autres fins.

    1 octet valeur : 11
    1 octet réservé
    1 u32  next 	 enregistrement de liste hachée suivant
    n times		 n = (reclen-5)/5
	1 u32  recnum

	Pour la taille actuelle utilisée par les enregistrements (taille 40) nous avons n = 7.




  Record type 254 (enregistrement libre)
  ---------------

Tous ces enregistrements forment une liste chaînée d'enregistrements non-utilisés.

     1 octet  valeur 254
     1 octet  réservé (0)
     1 u32   next_free



En-têtes de paquets
===================

GnuPG utilise des en-têtes PGP 2 et il est aussi capable de comprendre
les en-têtes de type OpenPGP. C'est une amélioration utilisée sur les anciens
en-têtes de paquets :

Les CTB bits 10, les "packet-length length bits" ont leurs valeurs listées
dans la table suivante :

      00 - 1-octet champ packet-length
      01 - 2-octets champ packet-length
      10 - 4-octets champ packet-length
      11 - pas de taille de paquet fournie, taille inconnue

Comme indiqué dans cette table, selon la taille du packet-length les
octets restants (1, 2, 4 ou 0) du champ de structure de paquets sont
un "champ packet-length". Ce champ est une valeur numérique à part entière.
La valeur du champ packet-length est définie par la valeur de la
totalité du champ numérique.

La valeur 11 est actuellement utilisée dans un cas : les données
compressées. C''est à dire qu'un bloc de données compressées
ressemble à : <A3 01 .. .. > où A3 est le binaire "10 1000 11" et
produit ici un paquet de taille non-définie. L'interprétation
correcte en est : "jusqu'à la fin de la structure englobante"
bien qu'en fait la structure englobante soit généralement
le fichier.

+ Ceci sera modifié dans une future version, où la signification de la
+ valeur 11 (voir ci-dessous) aura aussi sa place.
+
+ Une valeur de 11 pour d'autres paquets active un codage spécial
+ de la taille, où la taille du paquet suivant ne pourra pas être
+ déterminée avant l'écriture du paquet, en particulier ceci sera
+ utilisé si de grande quantités de données sont à traiter dans
+ un mode filtre.
+
+ Ceci fonctionne de la manière suivante : après le CTB (qui est un
+ champ de longueur de 11) un champ marqueur sera utilisé, il indiquera
+ alors la taille du bloc de données suivant. C'est un simple champ
+ de deux octets (MSB en premier) contenant la quantité de données qui
+ suivent le champ, sans inclure le champ de taille toutefois. Après
+ ce bloc de données un autre champ de taille suivra, qui donnera la taille
+ du bloc de données suivant. Une valeur de 0 indique une fin de paquet.
+ La taille maximale d'un bloc de données est limitée à 65534, ce qui
+ réserve la valeur 0xffff pour des extensions futures. Ces marqueurs de
+ taille devront être insérés dans le flux de données avant que les
+ données ne soient envoyées en sortie.
+
+ Ce champ de deux octets est largement suffisant, car l'application
+ doit placer en tampon cette quantité de données pour précéder le
+ marqueur de taille avant de produire une sortie. Les blocs de données
+ d'une taille supérieure à 32 Ko n'ont aucun sens. Notez que ceci pourra
+ également être utilisé pour les flux de données compressées, mais
+ nous devrons alors utiliser une autre version de paquet afin de dire à
+ l'application qu'elle ne peut assumer qu'il s'agit du dernier paquet.


Extensions GNU à l'algorithme S2K
=================================

Le S2K mode 101 est utilisé pour identifier ces extensions.
Après l'algorithme de hachage les trois octets "GNU" sont utilisés
pour indiquer clairement qu'il s'agit d'extensions GNU et les octets
qui suivent donnent le mode de protection GNU utilisé : 1000. Les
modes définis sont :

  1001 - ne pas conserver du tout de partie secrète



Usage des fichiers gdbm pour les trousseaux de clefs
====================================================

La clef utilisé pour stocker le keyblock est son propre fingerprint,
les autres enregistrements sont utilisés pour les clefs secondaires.
Les fingerprint font toujours 20 octets où 16 bits de fingerprint
sont suivis par 0. Le premier octet de chaque clef indique une
information sur le type de clef :

      1 = la clef est un fingerprint de 20 octets (16 octets fpr "paddés" de 0)
	  les données sont le keyblock
      2 = la clef est un keyid complet de 8 octets
	  les données sont une liste de 20 octets fingerprints
      3 = la clef est un keyid court de 4 octets
	  les données sont une liste de 20 octets fingerprints
      4 = la clef est une adresse email
	  les données sont une liste de 20 octets fingerprints

	Les données sont pre-appended (précédées) par un octet de type :

      1 = keyblock
      2 = liste de 20 octets fingerprints "paddés"
      3 = liste de liste de fingerprints ("but how to we key them?")



Pipemode
========

Ce mode est utilisé pour réaliser des opérations multiples avec un
unique appel à gpg. C'est assez pratique lorsqu'il faut pouvoir vérifier
un grand nombre de signatures. Actuellement nous n'avons qu'un support
des signatures détachées. Ce mode est une astuce qui permet d'éviter
de faire fonctionner gpg n en daemon mode et d'utiliser les Unix Domain
Sockets pour lui faire passer les données. Il n'existe aucun moyen
pratique de portabilité de ce concept sous Windows, alors nous utilisons
des pipes simples pour faire fonctionner ce mode sous Windows. Comme nous
n'avons aucun moyen de signaler des EOF multiples dans un pipe nous
devons laisser le contrôle s'insérer dans le flux de données lui-même.
Nous réalisons alors une distinction entre les données du flux et un
état de contrôle. A son lancement, le système se trouve dans un état
de données mais n'acceptera aucune donnée. Il attend en fait une
transition vers un mode de contrôle qui s'obtient en envoyant un simple
caractère '@'. Une fois dans le mode de contrôle, des commandes sont
attendues et ces commandes sont à un octet après lequel le système
revient au mode de données (mais cela n'implique pas qu'il acceptera
des données immédiatement). La commande de contrôle la plus simple
est '@' qui permet d'insérer ce caractère dans le flux de données.

Voici le format que nous utilisons pour les signatures détachées :

"@<"  - Début d'un nouveau flux
"@B"  - La signature détachée suit.
        Ceci émet le paquet de contrôle (1,'B')
<detached_signature>
"@t"  - Le texte signé suit. 
        Ceci émet le paquet de contrôle (2, 'B')
<signed_text>
"@."  - Fin de l'opération. Le paquet de contrôle final force la
	vérification de la signature.
"@>"  - Fin du flux.



Autres notes
============

Dans la version* 3 de version de paquet nous calculons les keyid de cette manière :

RSA : les 64 bits de poids faible de n
ELGAMAL : nous construisons un paquet de clef publique v3 (avec CTB 0x99)
	et nous calculons une valeur hachée rmd160 à partir de ce paquet.
	Il est utilisé comme fingerprint avec les 64 bits de poids faible
	qui produisent le keyid.

* Les certificats de révocation ne comportent qu'un paquet de signature ;
"import" sait comment traiter ces paquets. L'idée derrière ce principe
est de conserver une petite taille de paquet.



Format des messages Keyserver
=============================

Le serveur de clef peut être contacté par un Unix Domain Socket ou via TCP.

Le format des requêtes est :

====
command-tag
"Content-length:" digits
CRLF
=======

Où le command-tag est :

NOOP
GET <user-name>
PUT
DELETE <user-name>


Le format de réponse utilisé est :

======
"GNUPG/1.0" status-code status-text
"Content-length:" digits
CRLF
============

suivi par <digits> octets de données.


Les codes de statut utilisés sont :

     o	1xx: Information: requête reçue, traitement en cours.

     o	2xx: Succès - L'action a été reçue, comprise et acceptée.

     o	4xx: Erreur client : la requête contient une erreur, mauvaise syntaxe
		ou demande irréalisable.

     o	5xx: Erreur serveur - Le serveur n'a pu traiter une demande
		qui semble valide.


Documentation sur HKP (le protocol de serveurs de clefs http)
=============================================================

Un serveur HTTP minimal sur port 11371 reconnaît les requêtes GET
pour /pks/lookup. Les paramètres standard encodés URL de la requête
sont toujours ceux-ci : (toujours key=valeur)

- op=index (comme pgp -kv), op=vindex (comme pgp -kvv) and op=get (comme
  pgp -kxa)

- search=<stringlist>. Nous avons ici une liste de mots qui doivent
	apparaître dans la clef. Ces mots sont séparés par des espaces,
	points, @, etc. Les délimiteurs ne feront pas partie de la
	recherche et l'ordre des mots n'a aucune importance (mais consultez
	l'option suivante).

- exact=on. Ce switch permet d'indiquer au serveur hkp qu'il ne doit
	rechercher que les correspondances exactes. Dans ce cas, les
	délimiteurs et l'ordre des mots sera considéré.

- fingerprint=on. Renvoie également les fingerprint, lorsque utilisé
	avec 'index' ou 'vindex'

Les serveurs de clefs savent aussi reconnaître le format http-POST vers /pks/add.
Vous utilisez ceci pour envoyer des clefs au serveur.

Le mieux pour produire une requête reste :

   /pks/lookup/<gnupg_formatierte_user_id>?op=<operation>

Ceci peut être implémenté en utilisant le mécanisme de traduction Hurd.
Toutefois, nous pensons que les traitements du serveur de clef doivent
faire l'objet d'une refonte.