Utilisation de GnuPG

Julien Francoz

Gilles Dartiguelongue

$Id: gpg.xml,v 0.0.2 11/02/2004 $


Table des matières

1. Présentation de GnuPG
Chiffrement par clés asymétriques
Exemple d'utilisation
Echange de clés
Réseau de confiance
2. Installation et Initialisation
Installation
Génération des clés
Clé de revocation
3. Gestion de trousseau de clés
Voir le trousseau
Liste des clés
Liste des signatures
Liste des clés secrètes
Exporter la clé publique
Exporter la clé publique vers un serveur de clés
Ajouter une clé
Supprimer une clé
Afficher le fingerprint d'une clé
Signer une clé
4. Utilisation pour signer et chiffrer
Signer un message
Vérifier la signature
Chiffrer un message
Déchiffrer un message
Signer et chiffrer un message
Déchiffrer et vérifier un message
5. Intégration de GnuPG dans d'autres programmes
Intégration dans des gestionnaires de courriers électroniques
Intégration dans les messageries instantanées
Outils d'administration
6. Astuces / Aller plus loin
GPG Keysigning Party
Conserver son trousseau sur une clé USB
gpg: WARNING: using insecure memory!
7. Annexes
Liste de serveurs de clés
Licence

Ce document décrit les bases de l'utilisation de GnuPG, un clone libre de PGP. GnuPG permet de signer ou crypter des messages, mais cela implique de respecter quelques règles pour obtenir une sécurité optimale.

Chapitre 1. Présentation de GnuPG

GnuPG est l'abréviation de GNU Privacy Guard. GnuPG est un clone de PGP (Pretty Good Privacy).

PGP est une implémentation de l'algorythme RSA créé par Rivest, Shamir et Adleman d'où son nom, réalisée par Philip Zimmerman.

GnuPG est une implémentation libre (au sens de la GNU Public Licence) de PGP. Il respecte la norme OpenPGP (RFC2440).

GnuPG permet de chiffrer des communications par le biais d'un algorythme de chiffrement à clés asymétriques, c'est à dire qu'une clé permet de signer le texte, et qu'une autre clé sert à crypter le texte.

GnuPG et PGP utilisent tous les deux un système de chiffrement par clés asymétriques. Ils sont compatibles, c'est à dire que les clés générées avec l'un sont utilisables avec l'autre, et que les messages chiffrés par l'un peuvent être dechiffrés par l'autre.

Chiffrement par clés asymétriques

Les algorythmes de chiffrement par clés asymétriques fonctionnent grâce à deux clés: une clé publique et une clé privée.

Votre clé publique permet à n'importe qui de chiffrer un message qui vous est destiné, alors que votre clé privée vous permettra de déchiffrer ce message.

Votre clé privée sert aussi à signer un message que vous envoyez, et votre clé publique permet à la personne à qui vous envoyez le message de vérifier que vous en êtes bien l'auteur.

Les clés publique (Cpu) et clés privées (Cpr) sont choisie de telle sorte que :

F(F(message,Cpu),Cpr)=F(F(message,Cpr),Cpu)="une constante indépendante du message"

Exemple d'utilisation

Prenons l'exemple classique d'Alice (A) et Bob (B): Alice dispose de sa propre clé publique (Apu) et de sa clé privée (Apr). Bob dispose aussi de sa propre clé publique (Bpu) et de sa clé privée (Bpr). Chacun des deux dispose de la clé publique de l'autre (on suppose que l'échange de clé publique c'est fait correctement).

Supposons qu'Alice (A) veuille envoyer un message chiffré à Bob (B): Alice (A) va chiffrer le message avec la clé publique de Bob (Bpu), le message chiffré est ensuite envoyé à Bob (B) par email, enfin Bob (B) déchiffre le message avec sa clé privée (Bpr). Le message a été chiffré par Alice (A), et Bob (B) est le seul à pouvoir le déchiffrer.

F(F(message,Bpu),Bpr)=message

Supposons qu'Alice (A) veuille envoyer un message à Bob (B) en prouvant son identité. Elle va commencer par signer le message avec sa clé privée (Apr), puis elle va envoyer le message à Bob (B) par email, puis Bob (B) va vérifier la signature avec la clé publique d'Alice (Apu). Bob (B) peut ainsi verifier que le message a réellement été envoyé par Alice (A).

F(F(mesage,Apr),Apu)=message

Echange de clés

Le problème de ce type de système par chiffrement à clés asymétriques est qu'il faut être sur que la clé que vous possédez appartient bien à la personne à qui vous pensez qu'elle appartient.

En effet, si cela est mal verifié, ou n'est pas verifié du tout, quelqu'un de mal intentionné (C) pourrait se placer entre vous (A) et la personne avec qui vous voulez communiquer (B). Vous (A) penseriez ainsi chiffrer des messages à destination de (B) en les chiffrant réellement avec une clé de (C). (C) pourrait alors les déchiffrer, puis les rechiffrer en les ayant éventuellement modifiés, pour les envoyer à (B) en ce faisant passer pour vous (A).

Il faut donc trouver un moyen de vérifier que la clé publique de (B) que vous avez proviens réellement de (B).

Pour cela, il suffit de donner à (B), en vérifiant son identité, l'identifiant et le fingerprint (empreinte) de sa propre clé publique. Ceci se fait généralement lorsque l'on rencontre physiquement une autre personnes utilisant GPG, en vérifiant mutuellement l'identité de l'autre personne grâce à la présentation d'une pièce d'identité, et par l'échange de cartes de visites sur lesquelles figurent l'identifiant et le fingerprint des clés GPG de chacun.

Si nous nous rencontrons un jour, et que d'ici la vous utilisez GPG, je vous prouverai mon identité, et je vous donnerai une carte de visite sur laquelle vous trouverez en outre ceci:

Julien Francoz  CoCoZ
julien@francoz.net
1024D/920625BC: 5D4B 4D11 66D5 A49D 6E89  A4B0 1CF9 51FE 9206 25BC

1024D/920625BC est l'identifiant de ma clé : il permet par exemple de la télécharger depuis un serveur de clés (nous verrons ça plus loin). Il se compose de la taille de la clé, suivi des 8 derniers caractères du fingerprint.

5D4B 4D11 66D5 A49D 6E89 A4B0 1CF9 51FE 9206 25BC est le fingerprint : c'est une sorte d'empreinte digitale de ma clé publique. Si deux empreintes sont identiques, alors c'est que les clés d'origines de ces deux empreintes sont identiques.

Il faut ensuite signer la clef: cela certifie que l'identité de la personne a été verifiée. Cette opération sera expliquée en détail dans la suite.

Pour réaliser un échange de clé securisée il faut donc:

  • S'échanger les cartes de visites en vérifiant les identités.

  • Récupérer la clé dont l'identifiant se trouve sur la carte de visite.

  • vérifier que le fingerprint calculé à partir de cette clé est identique à celui imprimé sur la carte de visite.

  • Signer la clef.

Réseau de confiance

Il y a maintenant une autre difficulté: comment faire confiance à des gens qu'on n'a jamais rencontré et/ou qu'on ne pourra jamais rencontrer ? Il n'est en effet pas possible de faire un échange de clés de façon securisé avec tout le monde.

La solution est en faite très simple. Je vais l'illustrer par un exemple.

Si (A) et (B) se font confiance absolument, si (B) et (C) se font confiance absolument, si (C) et (D) se font confiance absolument, alors (A) et (D) peuvent se faire confiance sans risques.

Il existe quatre états pour la méthode de vérification de l'identité:

GnuPG calculera donc automatiquement en fonction du niveau de confiance et de la méthode de vérification de chaque lien le niveau de confiance de quelqu'un dont vous ne pouvez pas vérifier l'identité physiquement.

Ce système permet donc d'établir petit à petit un réseau de confiance d'envergure internationale, qui permet d'établir des communications sécurisées sans risques d'interception de la communication par quelqu'un de malveillant.

Chapitre 2. Installation et Initialisation

Il faut tout d'abord installer le programme GnuPG, puis générer les premières clés pour pouvoir ensuite commencer à utiliser GPG.

Installation

Vous pouvez trouver la dernière version de GnuPG sur http://www.gnupg.org/

La version la plus récente est actuellement la 1.2.3, on la télécharge :

bash-2.05b$ wget --passive-ftp ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.2.3.tar.bz2

Plusieurs méthodes sont possibles pour vérifier que l'archive téléchargée n'a pas été modifiée : la première méthode consiste à vérifier la signature de l'archive grâce à une ancienne version de gpg. Une autre méthode, un peu moins sûre, consiste à vérifier le md5sum de l'archive. Ces deux méthodes sont détaillées sur la page http://www.gnupg.org/(en)/download/integrity_check.html

L'installation est tout ce qu'il y a de plus classique:

On décompresse l'archive :

bash-2.05b$ tar -jxf gnupg-1.2.3.tar.bz2

On va dans le répertoire gnupg-VERSION

bash-2.05b$ cd gnupg-1.2.3

On lance ensuite ./configure ; les options par défaut devraient parfaitement fonctionner, mais on peut toujours affiner la configuration en faisant ./configure --help:

bash-2.05b$ ./configure

On compile GnuPG

bash-2.05b$ make

On vérifie que la compilation s'est effectuée corrrectement:

bash-2.05b$ make check
...
===================
All 25 tests passed
===================
...
bash-2.05b$

On installe, en étant 'root'

bash-2.05b$ su
bash-2.05b# make install
bash-2.05b# exit
bash-2.05b$

TODO: suid root pour ne plus avoir d'avertissement WARNING using insecure memory.

Ca y est, GnuPG est installé, il ne reste plus qu'à le configurer.

Génération des clés

On lance gpg --gen-key pour générer les clés

test@nutella:~$ gpg --gen-key
gpg (GnuPG) 1.2.3; Copyright (C) 2003 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
gpg: /home/test/.gnupg: directory created
gpg: new configuration file `/home/test/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/test/.gnupg/gpg.conf' are not yet
active during this run
gpg: keyring `/home/test/.gnupg/secring.gpg' created
gpg: keyring `/home/test/.gnupg/pubring.gpg' created

On remarque de GPG crée un repertoire .gnupg a la racine de compte de l'utilisateur, pour y stoquer sa configuration et ses clefs.

Please select what kind of key you want:
   (1) DSA and ElGamal (default)
   (2) DSA (sign only)
   (5) RSA (sign only)
Your selection? 1

Tout d'abord il faut choisir le type de clé à générer. L'option par défaut est conseillée, puisqu'elle génère les deux types de clés possibles simultanément (DSA et ElGamal).

DSA keypair will have 1024 bits.
About to generate a new ELG-E keypair.
    minimum keysize is  768 bits
    default keysize is 1024 bits
    highest suggested keysize is 2048 bits
What keysize do you want? (1024) 2048
Requested keysize is 2048 bits

gpg nous demande ensuite la taille que l'on désire pour la clef. 1024 est l'idéal pour avoir un bon chiffrement tout en conservant une bonne rapidité de traitement.

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct (y/n)? y

Il faut ensuite spécifier la durée de validité des clés. Il est conseillé au debut de mettre un petit délais, dans le but de tester un peu gpg. Dans tous les cas, même si la duree est indeterminée, il est possible d'annuler la validité d'une clé, grâce à une clé de révocation. Nous verrons cela un peu plus loin.

Real name: Julien Francoz
Email address: julien@francoz.net
Comment: CoCoZ
You selected this USER-ID:
    "Julien Francoz (CoCoZ) <julien@francoz.net>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

Il faut ensuite rentrer quelques informations sur l'utilisateur: son nom, son adresse email et un commentaire. Le nom servira d'identificateur de la clé et ne pourra pas être modifié, par contre il sera possible d'associer plusieurs adresses email à une seule clé.

You need a Passphrase to protect your secret key.
Enter passphrase: *******
Repeat passphrase: *******

La passphrase sera le mot de passe de votre clef. Sans cette passphrase la clé sera inutilisable pendant quelques temps à celui qui aura votre clé privée.

Il faut quelque chose de pas trop simple, mais de facile à retenir car il faudra la taper avant d'envoyer/recevoir chaque mail signé/crypté.

We need to generate a lot of random bytes. It is a good idea to perform
other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++++++++++++++++++++++.+++++++++++++++..++++++++++++++++++++++++++++++++
++++++++++++++++++.++++++++++.++++++++++.+++++...++++++++++>++++++++++..>+++++..
................................................................................
........+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++++++++++++..+++++++++++++++++++++++++.+++++++++++++++.+++++.++++++++++.+++
++++++++++++++++++++++++++++++++.+++++.+++++.+++++..++++++++++.++++++++++..+++++>
.++++++++++>.+++++>.+++++...................................................+++++
^^^
gpg: /home/test/.gnupg/trustdb.gpg: trustdb created
public and secret key created and signed.
key marked as ultimately trusted.
pub  1024D/920625BC 2003-11-07 Julien Francoz (CoCoZ) <julien@francoz.net>
     Key fingerprint = 5D4B 4D11 66D5 A49D 6E89  A4B0 1CF9 51FE 9206 25BC
sub  2048g/D8E761F0 2003-11-07

Les clés sont alors générées (la succesion de +.^>...).

Il se peut que GPG indique que le systeme n'est pas assez aléatoire, ce qui signifie que la clé sera pseudo-périodique. Il faudra donc relancer la génération en faisant travailler un peu le système.

la ligne gpg: /home/test/.gnupg/trustdb.gpg: trustdb created indique que la base de donnée du réseau de confiance a été générée. C'est dans cette base que seront stoquées plus tard les clés publiques des personnes dont vous aurez certifié l'authenticité.

Les 3 dernières lignes donnent un récapitulatif des clés générées:

pub 1024D/920625BC 2003-11-07 Julien Francoz (CoCoZ) <julien@francoz.net> indique la taille et l'identifiant de la clé publique: 1024 bits, et numéro 920625BC. Ce numéro permettra à n'importe qui de facilement importer votre clé publique depuis un serveur de clé par exemple. Ensuite il y a la date de création de la clé, le nom de la personne, la commentaire et enfin son adresse email.

Key fingerprint =5D4B 4D11 66D5 A49D 6E89 A4B0 1CF9 51FE 9206 25BC indique le fingerprint de la clé, c'est à dire l'empreinte. C'est un calcul qui permet de vérifier qu'il s'agit bien de la bonne clé (un peu comme md5sum pour un fichier): si deux clés ont le même fingerprint, il y a de très fortes chances pour que ce soit la même clé.

sub 2048g/D8E761F0 2003-11-07 indique la taille, le numéro de série et la date de la clé privée.

Clé de revocation

La clé de révocation permet d'annuler la validité d'une clé. Si par exemple votre clé privée a été volée, ou si vous avez perdu votre passphrase, il vous faudra alors un nouveau couple de clés publique/privée, et faire connaître au reste du monde que votre ancienne clé n'est plus valide.

C'est pour ces raisons qu'il faut créer au moins une clé de révocation. Cette clé étant signée par votre clé privée, elle permet à toutes les personnes ayant votre clé publique de vérifier qu'elle est valide, et donc qu'elle annule bien la clé publique.

Il est donc très important de créer une clé de révocation juste après avoir créé le couple de clés publique/privée, et de la stoquer dans un endroit sûr. Ceci est vrai pour plusieurs raisons: si vous perdez par exemple votre clé privée, vous n'aurez plus la possiblité de générer la clé de révocation. Si vous oubliez votre passphrase, vous ne pourrez plus utiliser votre clé privée, donc vous ne pourrez pas créer de clé de révocation.

Par contre, faites attention à ne pas divulguer votre clé de révocation: si celle ci était connue n'importe qui pourrait révoquer une clé que vous utilisez.

Passons maintenant à la creation de cette clé:

bash-2.05b$ gpg --gen-revoke CoCoZ
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information

sec 1024D/920625BC 2003-12-26 Julien Francoz <julien@francoz.net>

Create a revocation certificate for this key? y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here)
Your decision? 1

Il faut alors indiquer la raison de la révocation de la clé. Cela n'a rien d'obligatoire, vous pouvez donc, si vous le voulez, ne pas indiquer de raison (choix 0), mais vous pouvez aussi générer une clé de chaque type, pour pouvoir choisir laquelle publier quand votre clé sera corrompue, plus utilisée ...

Ici, j'ai choisi le cas 1: la clé a été compromise:

Enter an optional description; end it with an empty line:
> Vol d'ordinateur portable
> 
Reason for revocation: Key has been compromised
Vol d'ordinateur portable
Is this okay? y

Il faut ensuite entrer la passphrase de la clé privée pour pouvoir génèrer la clé de révocation:

You need a passphrase to unlock the secret key for
user: "Julien Francoz <julien@francoz.net>"
1024-bit DSA key, ID 04419552, created 2003-12-26

ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.3 (GNU/Linux)
Comment: A revocation certificate should follow
... vous me croyez quand même pas assez fou pour publier mon certificat de revocation ;o)
-----END PGP PUBLIC KEY BLOCK-----
bash-2.05b$

Voila, vous n'avez plus qu'à conserver cette clé a l'abri, c'est à dire à l'extérieur de l'ordinateur.

J'utilise personnellement un CD pour stoquer cette clé, j'en ai aussi une version imprimée

Faites attention si vous l'imprimez (ce qui n'est pas conseillé) à ce qu'il ne reste pas de trace dans le répertoire de spool du serveur d'impression par exemple.

Voila, c'est fini pour tout ce qui concerne l'initialisation de GnuPG.

Pour utiliser GPG il nous faut maintenant géréner le contenu du trousseau de clés, et ensuite nous pourrons enfin signer et chiffrer nos messages.

Chapitre 3. Gestion de trousseau de clés

Nous allons maintenant commencer par apprendre à manipuler le trousseau de clés. Le trousseau, comme son nom l'indique, est l'endroit où vous allez stoquer l'ensemble des clés, c'est à dire les vôtres, mais aussi toutes les clés publiques des gens que vous connaissez.

Voir le trousseau

Il existe plusieurs commandes pemettant d'afficher certaines parties du trousseau de clefs, en voici quelques une:

Liste des clés

Tout d'abord, la commande gpg --list-key affiche la liste des clés du trousseau:

bash-2.05b$ gpg --list-key
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
/home/cocoz/.gnupg/pubring.gpg
------------------------------
pub  1024D/920625BC 2003-11-07 Julien Francoz (CoCoZ) <julien@francoz.net>
sub  2048g/D8E761F0 2003-11-07

pub  1024D/40102233 2003-02-26 Slackware Linux Project <security@slackware.com>
sub  1024g/4E523569 2003-02-26 [expires: 2012-12-21]

...

Pour chaque clef, on voit l'identifiant des clés publiques et privées de chaque personne que vous connaissez, la date de création de la clef, les informations sur le propriétaire de la clef, et eventuellement la date d'expiration, si il y en a une.

Liste des signatures

La commande gpg --list-sigs affiche le détail des signatures de chaque clefs.

Voici ce qu'affiche GPG pour le couple de clés de la mailing liste Slackware Security

pub   2003-02-26 Slackware Linux Project <security@slackware.com>
sig         6D49DC3F 2003-03-20   [User id not found]
sig         677BA1EC 2003-06-26   [User id not found]
sig 2       D1932F26 2003-10-20   [User id not found]
sig 2       BA00B9AC 2003-05-06   [User id not found]
sig 3       40102233 2003-02-26   Slackware Linux Project <security@slackware.com>
sig 2       1E535F14 2003-07-03   [User id not found]
sig 2       54731E0F 2003-09-28   [User id not found]
sig 3       2319FB0C 2003-11-05   [User id not found]
sig 1       350F761A 2003-08-21   [User id not found]
sig 3       8C6B99B9 2003-03-01   [User id not found]
sig 2       FF56CADD 2003-03-01   [User id not found]
sig         37DB8393 2003-05-11   [User id not found]
sig 2       A27818E9 2003-09-20   [User id not found]
sig 3       9BAEA226 2003-03-16   [User id not found]
sig         0AFFE50C 2003-08-20   [User id not found]
sig 3       74423266 2003-09-25   [User id not found]
sub  1024g/4E523569 2003-02-26 [expires: 2012-12-21]
sig         40102233 2003-02-26   Slackware Linux Project <security@slackware.com>

On voit clairement que la clé publique a été signée par une vingtaine de personnes, que je ne connais pas personellement, car dans ce cas il y aurait leur nom a la place de [User id not found].

On voit aussi que la clé publique a été signée avec la clé privée lors de la création de la clé.

La clé privée par contre n'est signée que par le propriétaire de cette clé.

Les numéros se trouvant juste après sig indiquent le niveau de confiance que les gens qui ont signé la clé accordent à cette clé.

Liste des clés secrètes

La commande gpg --list-secret-keys permet d'afficher le détail de vos clés privées.

Exporter la clé publique

Nous allons maintenant exporter la clé publique, c'est à dire que nous allons communiquer la clé publique au reste du monde.

Pour cela nous utilisons la commande gpg --export --armor

L'option --armor permet de convertir la clé dans un format 7 bits, la clé se trouvera donc alors en hexadécimal.

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP PUBLIC KEY BLOCK-----

J'ai volontairement remplacé la clé par ..., elle était un peu trop longue.

Voila, vous avez votre clé publique, vous n'avez plus qu'à la diffuser. Pour cela vous avez plusieurs solutions:

  • L'envoyer par mail en pièce jointe.

  • L'envoyer à un serveur de clefs.

  • La mettre sur votre site web.

  • La conserver sur un CD ou une clé USB

Cette liste n'est pas exhaustive.

Exporter la clé publique vers un serveur de clés

La commande gpg --send-keys CoCoZ --keyserver ldap://serveurdeclef permet d'exporter la clé CoCoZ vers un serveur de clés.

Il existe plusieurs types de serveurs de clés, c'est pour cela qu'il faut préciser le protocol à utiliser.

Les types par defaut sont :

  • HKP pour les serveurs de type Horowitz ou compatible.

  • LDAP pour les serveurs de type NAI LDAP.

  • MAILTO pour les serveurs de clés par mail de type Horowitz.

Si vous ne précisez pas l'identifiant de la clé à exporter, l'ensemble des clés publiques que vous connaissez sera exporté.

La plus part des serveurs de clés disposent aussi d'une interface web, dans ce cas vous pouvez aussi exporter votre clé en hexadécimal, puis copier cette clé dans un formulaire du site.

Vous trouverez une liste de serveurs de clés en annexe.

Ajouter une clé

Maintenant, voyons comment ajouter une clé à votre trousseau:

Il faut tout d'abord récupérer la clé que vous voulez ajouter.

Si vous la recevez en pièce jointe dans un mail, sauvegardez la dans un répertoire quelconque, ensuite allez dans ce répertoire et tapez gpg --import nomdufichier. GPG se débrouillera alors pour savoir si la clé a été armée ou non.

Si vous récuperez directement la clé sous forme hexadécimale, copiez la, tapez gpg --import dans un terminal, et collez y la clé (avec les lignes BEGIN PGP et END PGP). Tapez ensuite Ctrl+D.

bash-2.05b$ gpg --import
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP PUBLIC KEY BLOCK-----
gpg: key 2F3C1A23: public key "Antoine (ToTo) <toto@toto.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
bash-2.05b$

Supprimer une clé

La commande gpg --delete-key slack supprime la clé dont la description ressemble le plus à slack. Dans ce cas, j'obtiens le résultat suivant:

bash-2.05b$ gpg --delete-key slack
gpg (GnuPG) 1.2.3; Copyright (C) 2003 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
pub  1024D/40102233 2003-02-26   Slackware Linux Project <security@slackware.com>

Delete this key from the keyring? y
bash-2.05b$

Si je réponds y alors la clé sera supprimée.

La commande gpg --delete-secret-key CoCoZ supprime la clé privée de CoCoZ :

bash-2.05b$ gpg --delete-secret-key CoCoZ
gpg (GnuPG) 1.2.3; Copyright (C) 2003 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
sec  1024D/920625BC 2003-11-07   Julien Francoz (CoCoZ) <julien@francoz.net>

Delete this key from the keyring? y
This is a secret key! - really delete? y
bash-2.05b$

Afficher le fingerprint d'une clé

Nous allons maintenant afficher le fingerprint d'une clé.

Le fingerprint est le résultat d'un calcul effectué sur la clé. C'est une sorte d'empreinte digitale de la clé. Si deux clés ont le même fingerprint, c'est que les deux clés sont identiques.

Le fingerprint permet de rapidement vérifier qu'une clé proviens bien de la personne à qui on pense qu'elle appartient.

Si je fais un échange de clé avec Toto, lorsque Toto me prouvera son identité il me donnera son fingerprint. Je téléchargerai ensuite une clé correspondant à Toto, et j'en calculerai le fingerprint. Si le fingerprint calculé à partir de cette clé est identique à celui que m'a donné Toto lors de l'échange, alors je peux faire confiance à cette clé. Sinon, c'est que ce n'est pas la vraie clé de Toto.

Pour afficher le fingerprint, il faut importer la clé dans le trousseau.

Il faut ensuite exécuter la commande gpg --fingerprint toto.

bash-2.05b$ gpg --fingerprint toto
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
pub  1024D/2F3C1A23 2003-12-27 Antoine (ToTo) <toto@toto.com>
     Key fingerprint = 7A8F B076 96CC 09A6 1088  A50D B5AF F234 2F3C 1A23
sub  1024g/68045E90 2003-12-27 [expires: 2004-01-01]

bash-2.05b$

On voit donc que le fingerprint de Toto est 7A8F B076 96CC 09A6 1088 A50D B5AF F234 2F3C 1A23

Signer une clé

Nous allons maintenant signer les clés publiques que nous avons obtenues d'autres personnes.

Il est très important de bien vérifier l'identité des personnes dont vous signez les clés. Si l'identité de la personne n'est pas vérifiée correctement, et que vous signez la clé, cela signifie que vous avez confiance en cette personne, et par conséquent que toute personne qui a confiance en vous a alors confiance en cette personne.

En résumé, si vous signez n'importe quoi, vous détruisez le reseau de confiance.

Pour signer la clef, nous avons besoin d'editer la clef; pour cela nous tapons la commande gpg --edit-key toto

bash-2.05b$ gpg --edit-key toto
gpg (GnuPG) 1.2.3; Copyright (C) 2003 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information

gpg: checking the trustdb
gpg: checking at depth 0 signed=1 ot(-/q/n/m/f/u)=0/0/0/0/0/2
gpg: checking at depth 1 signed=0 ot(-/q/n/m/f/u)=0/0/0/0/1/0
gpg: next trustdb check due at 2012-12-21
pub  1024D/2F3C1A23  created: 2003-12-27 expires: 2004-01-01 trust: -/-
sub  1024g/68045E90  created: 2003-12-27 expires: 2004-01-01
(1). Antoine (ToTo) <toto@toto.com>

Command>

On remarquera le trust: -/- à la fin de la ligne décrivant la clé publique. Cela signifie que nous n'accordons pour le moment aucune confiance à cette clef.

La signature se fait en deux parties :

  • trust pour indiquer votre niveau de confiance en la personne.

  • sign pour indiquer comment la vérification de l'identité a été faite.

Il faut maintenant taper la commande trust après le prompt de GPG :

Command> trust
pub  1024D/2F3C1A23  created: 2003-12-27 expires: 2004-01-01 trust: -/-
sub  1024g/68045E90  created: 2003-12-27 expires: 2004-01-01
(1). Antoine (ToTo) <toto@toto.com>

Please decide how far you trust this user to correctly
verify other users' keys (by looking at passports,
checking fingerprints from different sources...)?

 1 = Don't know
 2 = I do NOT trust
 3 = I trust marginally
 4 = I trust fully
 5 = I trust ultimately
 m = back to the main menu

Your decision?

Il faut maintenant indiquer à quel point vous faites confiance à la personne dont vous signez la clef.

Vous avez 5 choix :

  • 1: Ne sais pas (valeur par défaut)

  • 2: Ne fais pas confiance

  • 3: Je fais un peu confiance

  • 4: Je fais confiance

  • 5: J'ai une confiance absolue

Your decision? 5
Do you really want to set this key to ultimate trust? y
                                                       
pub  1024D/2F3C1A23  created: 2003-12-27 expires: 2004-01-01 trust: u/-
sub  1024g/68045E90  created: 2003-12-27 expires: 2004-01-01
(1). Antoine (ToTo) <toto@toto.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

Command>

Il faut maintenant indiquer comment s'est déroulé la vérification de la clé.

Pour cela il faut utiliser la commande sign

Command> sign
             
pub  1024D/2F3C1A23  created: 2003-12-27 expires: 2004-01-01 trust: u/u
 Primary key fingerprint: 7A8F B076 96CC 09A6 1088  A50D B5AF F234 2F3C 1A23

     Antoine (ToTo) <toto@toto.com>

This key is due to expire on 2004-01-01.
Do you want your signature to expire at the same time? (Y/n) y
How carefully have you verified the key you are about to sign actually belongs
to the person named above?  If you don't know what to answer, enter "0".

   (0) I will not answer. (default)
   (1) I have not checked at all.
   (2) I have done casual checking.
   (3) I have done very careful checking.

Your selection? (enter '?' for more information):

Vous avez alors 4 possibilités

  • 0: pas de réponse (valeur par défaut)

  • 1: aucune vérification

  • 2: petite vérification

  • 3: vraie vérification, avec fingerprint et pièce d'identité.

Entrez votre choix, puis entrez votre passphrase pour signer la clé.

Your selection? (enter '?' for more information): 3
Are you really sure that you want to sign this key
with your key: "Julien Francoz (CoCoZ) <julien@francoz.net>" (920625BC)

I have checked this key very carefully.

Really sign? y
              
You need a passphrase to unlock the secret key for
user: "Julien Francoz (CoCoZ) <julien@francoz.net>"
1024-bit DSA key, ID 920625BC, created 2003-11-07

                  
Command>

La commande list toto permet d'afficher la clé de toto. On peut ainsi voir qu'une ligne a changée: trust: u/u

La commande save permet de sauvegrader les changements.

La commande quit permet de sortir du mode interactif. Si les changements n'ont pas été sauvegardés, GPG proposera alors de le faire.

Ca y est, la clé est signée. Vous pouvez si vous le voulez exporter la clé publique pour signaler au reste du monde que vous avez signé la clef.

Nous avons fait le tour des bases de la gestion du trousseau de clefs.

Les autres options d'édition du trousseau sont disponibles dans le mode intéractif d'édition des clés gpg --edit-key, en tapant un point d'interrogation après le prompt.

Chapitre 4. Utilisation pour signer et chiffrer

Nous allons maintenant enfin utiliser GnuPG pour envoyer et recevoir des messages signés et/ou chiffrés.

Signer un message

Pour envoyer un message signé, il suffit de taper la commande gpg -s -u toto -a fichierdumessage

-s signifie --sign, -u signifie --local-user et -a signifie --armor.

On peut aussi signer un message en mode interactif: Il ne faut pas donner de nom de fichier, puis taper le message sur l'entrée standard et faire Ctrl+D.

L'option -u toto est facultative. Elle n'est nécessaire que si vous avez plusieurs clés privées pour plusieurs adresses mail.

Une signature est alors générée par GPG:

bash-2.05b$ gpg --sign -u toto -a
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information

You need a passphrase to unlock the secret key for
user: "Antoine (ToTo) <toto@toto.com>"
1024-bit DSA key, ID 2F3C1A23, created 2003-12-27

azerty            
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP MESSAGE-----
bash-2.05b$

Il ne reste plus qu'à envoyer cette signature et le message non chiffré au destinataire

Il est aussi possible de faire générer un message contenant le message en clair et sa signature avec la commande gpg -a --clearsign

GPG générera alors un message comme celui-ci :

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

azerty
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP SIGNATURE-----

Il suffit alors de n'envoyer que ce message au destinataire.

Dans tous les cas, on peut enlever l'option -a / --armor pour obtenir une sortie binaire. Par contre il faut mieux armer la signature si elle transite par mail (sur 7 bits).

Vérifier la signature

Pour vérifier la signature, il faut exécuter la commande gpg -r CoCoZ --verify message.asc message ou message.asc est la signature du message reçu, et message est le message reçu.

Exemple d'utilisation:

bash-2.05b$ gpg --verify test.asc     
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
gpg: Signature made Sat Dec 27 22:27:42 2003 CET using DSA key ID 2F3C1A23
gpg: Good signature from "Antoine (ToTo) <toto@toto.com>"
bash-2.05b$

Toto est donc bien l'auteur de ce message.

Si le message et sa signature sont dans le même fichier (généré avec l'option --clearsign), alors il suffit d'exécuter la commande gpg --verify message.asc.

Chiffrer un message

Nous allons maintenant chiffrer un message.

La commande gpg -r CoCoZ -e -a message chiffre le message à destination de CoCoZ

Comme pour la signature, on peut aussi entrer le message sur l'entrée standard.

bash-2.05b$ gpg -r cocoz -e -a
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
azerty
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP MESSAGE-----
bash-2.05b$

On peut maintenant envoyer ce message crypté.

Déchiffrer un message

La commande gpg --decrypt message.asc ou gpg --d message.asc déchiffre le message.

Comme le montre l'exemple ci-desous, on peut aussi effectuer cette operation depuis l'entrée standard.

bash-2.05b$ gpg --decrypt
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP MESSAGE-----

You need a passphrase to unlock the secret key for
user: "Julien Francoz (CoCoZ) <julien@francoz.net>"
2048-bit ELG-E key, ID 541A4468, created 2003-11-07 (main key ID 920625BC)

gpg: encrypted with 2048-bit ELG-E key, ID 541A4468, created 2003-11-07
      "Julien Francoz (CoCoZ) <julien@francoz.net>"
azerty
bash-2.05b$

Le message azerty a donc été correctement transmis entre Toto et CoCoZ.

Signer et chiffrer un message

Pour signer et chiffrer un message il suffit de mettre tous les paramètres de chacune de ces commandes à la suite:

gpg -u toto -r cocoz -a -e -s message

bash-2.05b$ gpg -u toto -r cocoz -a -e -s test   
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information

You need a passphrase to unlock the secret key for
user: "Antoine (ToTo) <toto@toto.com>"
1024-bit DSA key, ID 2F3C1A23, created 2003-12-27

bash-2.05b$

Le fichier test.asc a été créé et contient le message signé et chiffré.

Déchiffrer et vérifier un message

On applique la même méthode pour déchiffrer un message et en vérifier la signature:

gpg -d -v

bash-2.05b$ gpg -d -v
gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.2.3 (GNU/Linux)
...
-----END PGP MESSAGE-----
gpg: armor header: Version: GnuPG v1.2.3 (GNU/Linux)
gpg: public key is 541A4468
gpg: using secondary key 541A4468 instead of primary key 920625BC

You need a passphrase to unlock the secret key for
user: "Julien Francoz (CoCoZ) <julien@francoz.net>"
gpg: using secondary key 541A4468 instead of primary key 920625BC
2048-bit ELG-E key, ID 541A4468, created 2003-11-07 (main key ID 920625BC)

gpg: encrypted with 2048-bit ELG-E key, ID 541A4468, created 2003-11-07
      "Julien Francoz (CoCoZ) <julien@francoz.net>"
gpg: AES encrypted data
gpg: original file name='test'
azerty
gpg: Signature made Sat Dec 27 23:13:53 2003 CET using DSA key ID 2F3C1A23
gpg: Good signature from "Antoine (ToTo) <toto@toto.com>"
gpg: binary signature, digest algorithm SHA1
bash-2.05b$

On voit donc que le message azerty a été correctement signé et chiffré par Toto, et correctement déchiffré et vérifié par CoCoZ.

Chapitre 5. Intégration de GnuPG dans d'autres programmes

Nous venons de voir comment utiliser GPG pour chiffrer ou signer des messages, nous allons maintenant voir que son utilisation est automatisée grâce à l'intégration de GPG dans divers clients mails, environnements graphiques ou encore systèmes de messagerie instantanée.

Une liste plus complète peut être trouvée ici.

Intégration dans des gestionnaires de courriers électroniques

GPG est intégré dans la plupart des bons gestionnaires de courrier électroniques:

  • Mozilla / Thunderbird / Netscape 6: EnigMail est un plugin qui permet de facilement envoyer et recevoir des mails signés et chiffrés depuis ces différents gestionnaires de courrier électronique.

    EnigMail

  • Mutt : client mail en ligne de commande

    mutt.org

  • KMail : client mail intégré à KDE.

    KMail

Intégration dans les messageries instantanées

  • PSI : PSI est un client de messagerie instantanée respectant le protocol Jabber. Il est capable de signer et de chiffrer les messages grâce a GPG.

    PSI

  • Gabber : Gabber est un client Jabber pour Gnome. Il intègre GnuPG.

    Gabber

Outils d'administration

  • GPA : GPA est une interface graphique en GTK pour GPG.

    GPA

  • Seahorse : Seahorse est une interface graphique d'administration et d'utilisation de GPG pour Gnome.

    Seahorse

Chapitre 6. Astuces / Aller plus loin

GPG Keysigning Party

Des GPG Keysigning Party sont regulièrement organisées par différentes associations lors de différents évènements autour du Logiel Libre.

Lors de ces évènements, une methode relativement simple permet de très rapidement échanger et signer dans les règles beaucoup de clés.

Tous les détails sont dans le GPG Keysigning Party HOWTO.

Conserver son trousseau sur une clé USB

Si vous n'êtes pas le seul à avoir physiquement accès à la machine depuis laquelle vous utilisez GPG, ou si vous l'utilisez depuis beaucoup de machines, vous pouvez alors conserver votre trousseau de clés sur une clé USB.

Pour cela, copiez votre trousseau dans votre clé usb (/mnt/clefusb par exemple), et créez les liens entre vôtre trousseau et le répertoire ~/.gnupg/:

ln -s /mnt/clefusb/gnupg/* ~/.gnupg/

Il vous suffit maintenant de monter la clé pour l'utiliser.

Vous pouvez faire en sorte que la clé soit montée automatiquement lorsque vous la connectez à l'ordinateur. Il suffit d'ajouter le patch supermount au noyau et de modifier une ligne dans /etc/fstab.

Sachant qu'une clé privée connue par quelqu'un d'autre, même avec une passphrase très longue, ne résistera pas très longtemps, vous pouvez utiliser un système de fichier chiffré sur la clé usb.

gpg: WARNING: using insecure memory!

Vous avez du remarquer qu'à chaque fois que vous utilisez gpg il écrit la ligne gpg: WARNING: using insecure memory!.

Cela signifie que GPG ne s'exécute pas avec les droits du root, et donc que la mémoire dans laquelle s'exécute GPG, et donc dans laquelle se trouve la clé privée, peut être enregistré dans le disque lors d'un swap par exemple.

Il faut donc faire tourner GPG avec des droits de root (setuid root) pour se débarasser de cet avertissement, mais cela implique d'avoir bien verifié la signature de l'archive de GPG avant l'installation.

Chapitre 7. Annexes

Liste de serveurs de clés

Voici quelques uns des serveurs de clés :

Licence

Ce document est couvert par la licence GPL.

La dernière version de ce document se trouve ici.

		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.