$Id: gpg.xml,v 0.0.2 11/02/2004 $
Copyright © 2003 Julien Francoz - CoCoZ
Table des matières
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.
Table des matières
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.
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"
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
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.
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.
Table des matières
Il faut tout d'abord installer le programme GnuPG, puis générer les premières clés pour pouvoir ensuite commencer à utiliser GPG.
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.
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.
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.
Table des matières
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.
Il existe plusieurs commandes pemettant d'afficher certaines parties du trousseau de clefs, en voici quelques une:
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.
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é.
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.
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.
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$
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$
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
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.
Table des matières
Nous allons maintenant enfin utiliser GnuPG pour envoyer et recevoir des messages signés et/ou chiffrés.
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).
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.
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é.
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.
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é.
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.
Table des matières
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.
GPG est intégré dans la plupart des bons gestionnaires de courrier électroniques:
Table des matières
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.
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.
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.
Table des matières
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.