diff --git a/ChangeLog b/ChangeLog index 822861089..526f33eb6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): Fix for freebsd 2.2 + + * configure.in: a lot of changes to allow selection of modules. + Add support for OS/2. + + * acinclude.m4: add some more caching + + * README: Spelling and grammar corrections (John A. Martin) + * INSTALL: Ditto. + Wed Jan 20 21:40:21 CET 1999 Werner Koch * configure.in: --enable-m-guard is now default diff --git a/INSTALL b/INSTALL index 655b79097..e91622adf 100644 --- a/INSTALL +++ b/INSTALL @@ -13,10 +13,10 @@ Configure options for GNUPG --disable-nls Disable NLS support (See ABOUT-NLS) --enable-m-debug Compile with the integrated malloc debugging stuff. - This makes the program slower but is checks every + This makes the program slower but it checks every free operation and can be used to create statistics of memory usage. If this option is used the program - option "--debug 32" displays every call to a a malloc + option "--debug 32" displays every call to a malloc function (this makes the program *really* slow), the option "--debug 128" displays a memory statistic after the program run. @@ -55,8 +55,8 @@ Don't forget to delete "config.cache" and run "./config.status --recheck". The Random Device ================= Random devices are available in Linux, FreeBSD and OpenBSD. -The device files may not exist on your system, please check this -and create them if needed. +The random device files may not exist on your system, please check whether +they do and create them if needed. The Linux files should look like this: cr--r--r-- 1 root sys 1, 8 May 28 1997 /dev/random @@ -72,23 +72,23 @@ You can create them with: mknod /dev/random c 2 3 mknod /dev/urandom c 2 4 -Unices without a random devices must use another entropy collector -which is called rndunix and available as an extension module. You +Unices without a random devices must use another entropy collector. One +entropy collector called rndunix and available as an extension module. You should put this in your ~/.gnupg/options file: ===8<==================== load-extension rndunix ===>8==================== -This collector works by running a lot of tools which yields more or +This collector works by running a lot of commands that yield more or less unpredictable output and feds this as entropy into the random -generator - It should work reliable but you should check whether -it produces good output for your kind of Unix. There are some debug +generator - It should work reliably but you should check whether +it produces good output for your version of Unix. There are some debug options to help you (see cipher/rndunix.c). Installation ============ -gpg is not installed as suid:root; if you want to do it, do it manually. +gpg is not installed as suid:root; if you want to do that, do it manually. We will use capabilities in the future. The ~/.gnupg directory will be created if it does not exist. Your first @@ -135,9 +135,9 @@ diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. + The file `configure.in' is used by the program `autoconf' to create +`configure'. You only need `configure.in' if you want to change it or +regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: @@ -147,7 +147,7 @@ The simplest way to compile this package is: `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. - Running `configure' takes awhile. While running, it prints some + Running `configure' takes a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. @@ -177,19 +177,19 @@ a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure -Or on systems that have the `env' program, you can do it like this: +Or, on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. + You can compile the package for more than one kind of computer at the same +time by placing the object files for each architecture in their own +directory. To do this, you must use a version of `make', such as GNU `make', +that supports the `VPATH' variable. `cd' to the directory where you want the +object files and executables to go and run the `configure' script. +`configure' automatically checks for the source code in the directory that +`configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time diff --git a/Makefile.am b/Makefile.am index eb7e46686..a12267d17 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ all-recursive-am: g10defs.h g10defs.h : config.h @( set -e; \ echo "/* Generated automatically by Makefile */" ; \ - echo "#ifdef __MINGW32__"; \ + echo "#ifdef HAVE_DRIVE_LETTERS"; \ echo "#define G10_LOCALEDIR \"c:/lib/gnupg/locale\""; \ echo "#define GNUPG_LIBDIR \"c:/lib/gnupg\""; \ echo "#define GNUPG_DATADIR \"c:/lib/gnupg\""; \ diff --git a/README b/README index 0bec85ad0..845c15beb 100644 --- a/README +++ b/README @@ -1,19 +1,19 @@ -----BEGIN PGP SIGNED MESSAGE----- - GnuPG - The GNU Privacy Guard - ------------------------------- - Version 0.9 + GnuPG - The GNU Privacy Guard + ------------------------------- + Version 0.9 GnuPG is now in Beta test and you should report all bugs to the - mailing list (see below). The 0.9.x versions are mainly released - to fix all remaining serious bugs. As soon as version 1.0 is out, + mailing list (see below). The 0.9.x versions are released mainly + to fix all remaining serious bugs. As soon as version 1.0 is out, development will continue with a 1.1 series and bug fixes for the - 1.0 version are released as needed. + 1.0 version as needed. GnuPG works best on GNU/Linux or *BSD. Other Unices are - also supported but not as good tested as those Freenix ones. - Please verify the tar file; there is a PGP2 and a GnuPG/PGP5 - signature available. My PGP2 key is well known and published in + also supported but are not as well tested as the Free Unices. + Please verify the tar file with the PGP2 or GnuPG/PGP5 + signatures provided. My PGP2 key is well known and published in the "Global Trust Register for 1998", ISBN 0-9532397-0-5. I have included my pubring as "g10/pubring.asc", which contains @@ -25,33 +25,33 @@ "pub 1024D/621CC013 1998-07-07 Werner Koch " "Key fingerprint = ECAF 7590 EB34 43B5 C7CF 3ACB 6C7E E1B8 621C C013" - You may want add it to your GnuPG pubring and use it in the future to - verify new releases. Because you verified this README file and - _checked_that_it_is_really_my PGP2 key 0C9857A5, you can be sure - that the above fingerprints are correct. + You may want add my new DSA key to your GnuPG pubring and use it in + the future to verify new releases. Because you verified this README + file and _checked_that_it_is_really_my PGP2 key 0C9857A5, you can be + sure that the above fingerprints are correct. Please subscribe to g10@net.lut.ac.uk by sending a mail with the word "subscribe" in the body to "g10-request@net.lut.ac.uk". - This mailing list is a closed one (only subscribers are allowed - to post) to avoid misuse by folks who don't know the Netiquette - and trash your mailspool with commercial junk. + This mailing list is closed (only subscribers are allowed to post) + to avoid misuse by folks who don't know the Netiquette and trash + your mailspool with commercial junk. See the file COPYING for copyright and warranty information. GnuPG is in compliance with RFC2440 (OpenPGP), see doc/OpenPGP for details. - Due to the fact that GnuPG does not use use any patented algorithm, - it cannot be compatible with PGP2 versions; PGP 2.x does only use - IDEA (which is patented worldwide) and RSA (which is patented in - the United States until Sep 20, 2000). + Because GnuPG does not use use any patented algorithm it cannot be + compatible with PGP2 versions. PGP 2.x uses only IDEA (which is + patented worldwide) and RSA (which is patented in the United States + until Sep 20, 2000). The default algorithms are now DSA and ElGamal. ElGamal for signing - is still available, but due to the larger size of such signatures it - is depreciated (Please note that the GnuPG implementation of ElGamal - signatures is *not* insecure). Symmetric algorithms are: 3DES, - Blowfish and CAST5 (Twofish will come soon), available digest - algorithms are MD5, RIPEMD160, SHA1 and TIGER/192. + is still available, but because of the larger size of such + signatures it is deprecated (Please note that the GnuPG + implementation of ElGamal signatures is *not* insecure). Symmetric + algorithms are: 3DES, Blowfish, and CAST5 (Twofish will come soon). + Digest algorithms available are MD5, RIPEMD160, SHA1, and TIGER/192. Installation @@ -61,7 +61,7 @@ Here is a quick summary: - 1) "./configure" + 1) "./configure" 2) "make" @@ -69,24 +69,25 @@ 4) You end up with the binaries "gpg" and "gpgm" in /usr/local/bin. - 5) Optional, but suggested: install the binary "gpg" as suid root. + 5) Optional, but suggested, install the binary "gpg" as suid root. - Intro - ----- - This is a brief overview how to use GnuPG - it is highly suggested - that you read the manual^H^H^H more information about the use - of cryptography. GnuPG is only the technical tool to do it and - the security highly depends on that YOU KNOW WHAT YOU ARE DOING. + Introduction + ------------ + + This is a brief overview how to use GnuPG - it is strongly suggested + that you read the manual^H^H^H more information about the use of + cryptography. GnuPG is only a tool, secure results require that YOU + KNOW WHAT YOU ARE DOING. If you already have a DSA key from PGP 5 (they call them DH/ElGamal) you can simply copy the pgp keyrings over the GnuPG keyrings after - running gpg once, so that it can create the correct directory. + running gpg once to create the correct directory. - The normal way to create a key is: + The normal way to create a key is - gpg --gen-key + gpg --gen-key This asks some questions and then starts key generation. To create good random numbers for the key parameters, GnuPG needs to gather @@ -98,209 +99,212 @@ access - don't do it over the network or on a machine used also by others - especially if you have no access to the root account. - When you are asked for a passphrase; use a good one which you can easy - remember. Don't make the passphrase too long because you have to - type it for every decryption or signing; but - AND THIS IS VERY - IMPORTANT - use a good one which is not easily guessable as the + When you are asked for a passphrase use a good one which you can + easy remember. Don't make the passphrase too long because you have + to type it for every decryption or signing; but, - AND THIS IS VERY + IMPORTANT - use a good one that is not easily to guess because the security of the whole system relies on your secret key and the - passphrase is used to protect this secret key in case someone was - able to get access to your secret keyring. A good way to select - a passphrase is to figure out a short nonsense sentence which makes - some sense for you and modify it by inserting extra spaces, non-letters - and changing the case of some characters - this is really easy to - remember especially if you associate some pictures with it. + passphrase that protects it when someone gains access to your secret + keyring. A good way to select a passphrase is to figure out a short + nonsense sentence which makes some sense for you and modify it by + inserting extra spaces, non-letters and changing the case of some + characters - this is really easy to remember especially if you + associate some pictures with it. - Then you should create a revocation certificate in case someone - gets knowledge of your secret key or you forgot your passphrase: + Next, you should create a revocation certificate in case someone + gets knowledge of your secret key or you forgot your passphrase - gpg --gen-revoke your_user_id + gpg --gen-revoke your_user_id - Run this command and store it away; output is always ASCII armored, - so that you can print it and (hopefully never) re-create it if - your electronic media fails. + Run this command and store the revocation certificate away. The output + is always ASCII armored, so that you can print it and (hopefully + never) re-create it if your electronic media fails. - Now you can use your key to create digital signatures: + Now you can use your key to create digital signatures - gpg -s file + gpg -s file - This creates a file file.gpg which is compressed and has a signature - attached. + This creates a file "file.gpg" which is compressed and has a + signature attached. - gpg -sa file + gpg -sa file - Same as above, but creates the file.asc which is ascii armored and - and ready for sending by mail. Note: It is better to use your + Same as above, but creates a file "file.asc" which is ASCII armored + and and ready for sending by mail. It is better to use your mailers features to create signatures (The mailer uses GnuPG to do this) because the mailer has the ability to MIME encode such signatures - but this is not a security issue. - gpg -s -o out file + gpg -s -o out file - Creates a signature of file, but writes the output to the file "out". + Creates a signature of "file", but writes the output to the file + "out". Everyone who knows your public key (you can and should publish your key by putting it on a key server, a web page or in your .plan - file) is now able to check whether you really signed this text; + file) is now able to check whether you really signed this text - gpg --verify file + gpg --verify file GnuPG now checks whether the signature is valid and prints an appropriate message. If the signature is good, you know at least that the person (or machine) has access to the secret key which corresponds to the published public key. + If you run gpg without an option it will verify the signature and - create a new file which is identical to the original file. gpg - can also run as a filter, so that you can pipe data to verify - trough it: + create a new file that is identical to the original. gpg can also + run as a filter, so that you can pipe data to verify trough it - cat signed-file | gpg | wc -l + cat signed-file | gpg | wc -l - will check the signature of signed-file and then display the + which will check the signature of signed-file and then display the number of lines in the original file. - To send a message encrypted to someone you can use this: + To send a message encrypted to someone you can use - gpg -e -r heine file + gpg -e -r heine file - This encrypts file with the public key of the user "heine" and + This encrypts "file" with the public key of the user "heine" and writes it to "file.gpg" - echo "hallo" | gpg -ea -r heine | mail heine + echo "hello" | gpg -ea -r heine | mail heine - Ditto, but encrypts "hallo\n" and mails it as ascii armored message + Ditto, but encrypts "hello\n" and mails it as ASCII armored message to the user with the mail address heine. - gpg -se -r heine file + gpg -se -r heine file - This encrypts file with the public key of "heine" and writes it + This encrypts "file" with the public key of "heine" and writes it to "file.gpg" after signing it with your user id. - gpg -se -r heine -u Suttner file + gpg -se -r heine -u Suttner file Ditto, but sign the file with your alternative user id "Suttner" - GnuPG has some options to help you publish public keys; this is - called "exporting" a key: + GnuPG has some options to help you publish public keys. This is + called "exporting" a key, thus - gpg --export >all-my-keys + gpg --export >all-my-keys - exports all the keys in the keyring and writes them (in a binary format) - to all-my-keys. You may then mail "all-my-keys" as an MIME attachment - to someone else or put it on an FTP server. To export only some - user IDs, you give them as arguments on the command line. + exports all the keys in the keyring and writes them (in a binary + format) to "all-my-keys". You may then mail "all-my-keys" as an + MIME attachment to someone else or put it on an FTP server. To + export only some user IDs, you give them as arguments on the command + line. To mail a public key or put it on a web page you have to create - the key in ASCII armored format: + the key in ASCII armored format - gpg --export --armor | mail panther@tiger.int + gpg --export --armor | mail panther@tiger.int This will send all your public keys to your friend panther. If you have received a key from someone else you can put it - into your public keyring; is called "importing": + into your public keyring. This is called "importing" - gpg --import [filenames] + gpg --import [filenames] New keys are appended to your keyring and already existing - keys are updated. Note that GnuPG does not allow keys which - are not self-signed by the user. + keys are updated. Note that GnuPG does not import keys that + are not self-signed. - Because anyone can claim that the public key belongs to her - we must have some way to check that the public key really belongs + Because anyone can claim that a public key belongs to her + we must have some way to check that a public key really belongs to the owner. This can be achieved by comparing the key during a phone call. Sure, it is not very easy to compare a binary file by reading the complete hex dump of the file - GnuPG (and nearly every other program used for management of cryptographic keys) - provides other solutions: + provides other solutions. - gpg --fingerprint + gpg --fingerprint - prints the so called "fingerprint" of the given username; this + prints the so called "fingerprint" of the given username which is a sequence of hex bytes (which you may have noticed in mail - sigs or on business cards) which uniquely identify the public - key - two different keys will always have different fingerprints. - It is easy to compare this fingerprint by phone and I suggest + sigs or on business cards) that uniquely identifies the public + key - different keys will always have different fingerprints. + It is easy to compare fingerprints by phone and I suggest that you print your fingerprint on the back of your business card. - If you don't know the owner of the public key you are in trouble; - but wait: A friend of you knows someone who knows someone who - has met the owner of the public key at some computer conference. - So all the persons between you and the public key holder may now - act as introducer to you; this is done by signing the keys and - thereby certifying the other keys. If you then trust all the - introducers to correctly sign other keys, you can be be sure that - the other key really belongs to the one who claims so. + If you don't know the owner of the public key you are in trouble. + Suppose however that friend of yours knows someone who knows someone + who has met the owner of the public key at some computer conference. + Suppose that all the people between you and the public key holder + may now act as introducers to you. Introducers signing keys thereby + certify that they know the owner of the keys they sign. If you then + trust all the introducers to have correctly signed other keys, you + can be be sure that the other key really belongs to the one who + claims to own it.. - There are 2 steps to validate a target key: - 1. First check that there is a complete chain - of signed keys from the public key you want to use - and your key and verify each signature. - 2. Make sure that you have full trust in the certificates - of all the introduces between the public key holder and - you. + There are 2 steps to validate a key: + 1. First check that there is a complete chain + of signed keys from the public key you want to use + and your key and verify each signature. + 2. Make sure that you have full trust in the certificates + of all the introduces between the public key holder and + you. Step 2 is the more complicated part because there is no easy way for a computer to decide who is trustworthy and who is not. GnuPG leaves this decision to you and will ask you for a trust value (here also referenced as the owner-trust of a key) for every key - needed to check the chain of certificates. You may choose from: + needed to check the chain of certificates. You may choose from: a) "I don't know" - then it is not possible to use any - of the chains of certificates, in which this key is used - as an introducer, to validate the target key. Use this if - you don't know the introducer. + of the chains of certificates, in which this key is used + as an introducer, to validate the target key. Use this if + you don't know the introducer. b) "I do not trust" - Use this if you know that the introducer - does not do a good job in certifying other keys. The effect - is the same as with a) but for a) you may later want to - change the value because you got new information about this - introducer. + does not do a good job in certifying other keys. The effect + is the same as with a) but for a) you may later want to + change the value because you got new information about this + introducer. c) "I trust marginally" - Use this if you assume that the - introducer knows what he is doing. Together with some - other marginally trusted keys, GnuPG validates the target - key then as good. + introducer knows what he is doing. Together with some + other marginally trusted keys, GnuPG validates the target + key then as good. d) "I fully trust" - Use this if you really know that this - introducer does a good job when certifying other keys. - If all the introducer are of this trust value, GnuPG - normally needs only one chain of signatures to validate - a target key okay. (But this may be adjusted with the help - of some options). - These information are confidential because they give your - personal opinion on the trustworthy of someone else. Therefore - this data is not stored in the keyring but in the "trustdb" + introducer does a good job when certifying other keys. + If all the introducer are of this trust value, GnuPG + normally needs only one chain of signatures to validate + a target key okay. (But this may be adjusted with the help + of some options). + This information is confidential because it gives your personal + opinion on the trustworthiness of someone else. Therefore this data + is not stored in the keyring but in the "trustdb" (~/.gnupg/trustdb.gpg). Do not assign a high trust value just - because the introducer is a friend of you - decide how far she - understands all the implications of key signatures and you may - want to tell him more about public key cryptography so you - can later change the trust value you assigned. + because the introducer is a friend of yours - decide how well she + understands the implications of key signatures and you may want to + tell her more about public key cryptography so you can later change + the trust value you assigned. - Okay, here is how GnuPG helps you in key management: Most stuff is - done with the --edit-key command: + Okay, here is how GnuPG helps you with key management. Most stuff + is done with the --edit-key command - gpg --edit-key + gpg --edit-key GnuPG displays some information about the key and then prompts for a command (enter "help" to see a list of commands and see the man page for a more detailed explanation). To sign a key you select the user ID you want to sign by entering the number - which is displayed in the leftmost column (or do nothing if the + that is displayed in the leftmost column (or do nothing if the key has only one user ID) and then enter the command "sign" and follow all the prompts. When you are ready, give the command "save" (or use "quit" to cancel your actions). - If you want to sign the key with another user ID of yours, you + If you want to sign the key with another of your user IDs, you must give an "-u" option on the command line together with the "--edit-key". Normally you want to sign only one user ID because GnuPG - does only use one and this keeps the public key certificate + uses only one and this keeps the public key certificate small. Because such key signatures are very important you - should make sure that the signators of your key sign a user ID + should make sure that the signatories of your key sign a user ID which is very likely to stay for a long time - choose one with an email address you have full control of or do not enter an email address at all. In future GnuPG will have a way to tell which user ID is the one with an email address you prefer - because you have no signatures on this email address it is easy to change - this address. Remember: Your signators sign your public key (the + this address. Remember, your signatories sign your public key (the primary one) together with one of your user IDs - so it is not possible to change the user ID later without voiding all the signatures. @@ -310,51 +314,59 @@ trust you assign to a key). - 7 Ways to Specify a User ID + 8 Ways to Specify a User ID -------------------------- - There are several ways to specify a user ID, here are some examples: + There are several ways to specify a user ID, here are some examples. * Only by the short keyid (prepend a zero if it begins with A..F): - "234567C4" - "0F34E556E" - "01347A56A" - "0xAB123456 + "234567C4" + "0F34E556E" + "01347A56A" + "0xAB123456 * By a complete keyid: - "234AABBCC34567C4" - "0F323456784E56EAB" - "01AB3FED1347A5612" - "0x234AABBCC34567C4" + "234AABBCC34567C4" + "0F323456784E56EAB" + "01AB3FED1347A5612" + "0x234AABBCC34567C4" * By a fingerprint: - "1234343434343434C434343434343434" - "123434343434343C3434343434343734349A3434" - "0E12343434343434343434EAB3484343434343434" + "1234343434343434C434343434343434" + "123434343434343C3434343434343734349A3434" + "0E12343434343434343434EAB3484343434343434" The first one is MD5 the others are ripemd160 or sha1. * By an exact string: - "=Heinrich Heine " + "=Heinrich Heine " * By an email address: - "" + "" + + * By word match + + "+Heinrich Heine duesseldorf" + + All words must match excatly (not case sensitive) and appear in + any order in the user ID. Words are any sequences of letters, + digits, the underscore and characters with bit 7 set. * By the Local ID (from the trust DB): - "#34" + "#34" This may be used by a MUA to specify an exact key after selecting - a key from GnuPG (by the use of a special option or an extra utility) + a key from GnuPG (by using a special option or an extra utility) * Or by the usual substring: - "Heine" - "*Heine" + "Heine" + "*Heine" The '*' indicates substring search explicitly. @@ -363,7 +375,7 @@ ---------- If you use the option "--batch", GnuPG runs in non-interactive mode and never prompts for input data. This does not even allow entering the - passphrase; until we have a better solution (something like ssh-agent), + passphrase. Until we have a better solution (something like ssh-agent), you can use the option "--passphrase-fd n", which works like PGPs PGPPASSFD. @@ -375,29 +387,29 @@ ----------- GnuPG returns with an exit status of 1 if in batch mode and a bad signature has been detected or 2 or higher for all other errors. You should parse - stderr or better the output of the fd specified with --status-fd to get + stderr or, better, the output of the fd specified with --status-fd to get detailed information about the errors. Esoteric commands ----------------- - gpg --list-packets datafile + gpg --list-packets datafile Use this to list the contents of a data file. If the file is encrypted you are asked for the passphrase, so that GnuPG is able to look at the - inner structure of a encrypted packet. This command should be able - to list all kinds of rfc2440 messages. + inner structure of a encrypted packet. This command should list all + kinds of rfc2440 messages. - gpgm --list-trustdb + gpgm --list-trustdb List the contents of the trust DB in a human readable format - gpgm --list-trustdb + gpgm --list-trustdb List the tree of certificates for the given usernames - gpgm --list-trust-path username + gpgm --list-trust-path username List the possible trust paths for the given username. The length of such a trust path is limited by the option --max-cert-depth @@ -415,22 +427,21 @@ See http://www.gnupg.org/mirrors.html for a list of FTP mirrors and use them if possible. - Please direct bug reports to or better + Please direct bug reports to or, better, post them to the mailing list (this is a closed list - subscribe before posting, see above (~line 33)). Please direct questions about GnuPG to the mailing list or - one of the pgp newsgroups; this gives me more time to improve + one of the pgp newsgroups and give me more time to improve GnuPG. Commercial support for GnuPG will be available soon. Have fun and remember: Echelon is looking at you kid. - -----BEGIN PGP SIGNATURE----- -Version: GnuPG v0.9.1 (GNU/Linux) +Version: GnuPG v0.9.2 (GNU/Linux) Comment: For info see http://www.gnupg.org -iQB1AwUBNpyIDR0Z9MEMmFelAQGn4gL+IVlEye5I6LplxdUExsrHQpLV21H0UXFa -/Dl1T/HjrGHj41NeW2evO4Ck2K6Z0TG5jPg9CuJdcJp0siJ8odO7BTLaF3r6gwxF -CA4EXgqhSyE8PXRPS4m4M5I7Ru/bsZrF -=HfE0 +iQB1AwUBNr2fPh0Z9MEMmFelAQHqNAL/e7pApR0CGUJ/zuIsjaVhNGPEgKAglcEd +YuVdB+RCN0wq7ZfI0AHU2FdVISRACmSN3xituTTgeiOUsczM40EZ4l1XNfyRF768 +fglui6XxEeYHFY7mSQMgzzFWDG0Squx0 +=enRo -----END PGP SIGNATURE----- diff --git a/TODO b/TODO index b43dac34c..e1dbfb29b 100644 --- a/TODO +++ b/TODO @@ -8,8 +8,13 @@ Bugs * clearsign bug Greg Troxel Jan 11. + * README does not verify okay. verify inserts an extra CR,LF + just before "Esoteric Command" (after ~8k of text). + Important ---------- + * replace gettext by a non exploitable one. + * Check revocation and expire stuff. PLEASE: THIS MUST BE TESTED! * Check calculation of key validity. PLEASE: IT IS IMPORTED THAT @@ -34,6 +39,8 @@ Needed -Wl,-export-dynamic flag from my Makefile and it linked and seems to be working OK so far. + * Use capabilities if available. + Minor Bugs ---------- @@ -56,7 +63,7 @@ Nice to have really make sense? * change the fake_data stuff to mpi_set_opaque * How about letting something like 'gpg --version -v', list the - effective options. + effective options. Too much work. * Stats about used random numbers. diff --git a/acconfig.h b/acconfig.h index d3b6cf02e..fe2ac2fc8 100644 --- a/acconfig.h +++ b/acconfig.h @@ -32,6 +32,7 @@ #undef VERSION #undef PACKAGE #undef PRINTABLE_OS_NAME +#undef IS_DEVELOPMENT_VERSION /* Define if your locale.h file contains LC_MESSAGES. */ #undef HAVE_LC_MESSAGES @@ -64,14 +65,6 @@ #undef HAVE_BROKEN_MLOCK -/* One of the following macros is defined to select which of - * the cipher/rndxxxx.c is linked into the program */ -#undef USE_RNDLINUX -#undef USE_RNDUNIX -#undef USE_RNDOS2 -#undef USE_RNDATARI -#undef USE_RNDW32 -#undef USE_RNDMVS /* defined if we have a /dev/random and /dev/urandom */ #undef HAVE_DEV_RANDOM /* and the real names of the random devices */ @@ -92,6 +85,11 @@ #undef USE_ONLY_8DOT3 /* defined if we must run on a stupid file system */ #undef HAVE_DRIVE_LETTERS +/* defined if we run on some of the PCDOS like systems (DOS, Windoze. OS/2) + * with special properties like no file modes */ +#undef HAVE_DOSISH_SYSTEM + + @BOTTOM@ diff --git a/acinclude.m4 b/acinclude.m4 index ab6fbf33b..42c4ffb35 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1,4 +1,4 @@ -dnl macros to configure g10 +dnl macros to configure g10 7cache_va dnl GNUPG_MSG_PRINT(STRING) @@ -203,6 +203,9 @@ define(GNUPG_CHECK_RDYNAMIC, solaris*) CFLAGS_RDYNAMIC="-Wl,-dy" ;; + freebsd2*) + CFLAGS_RDYNAMIC="" + ;; *) CFLAGS_RDYNAMIC="-Wl,-export-dynamic" ;; @@ -221,8 +224,9 @@ dnl define(GNUPG_CHECK_IPC, [ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h) if test "$ac_cv_header_sys_shm_h" = "yes"; then - AC_MSG_CHECKING(whether shmctl IPC_RMID allowes subsequent attaches) - AC_TRY_RUN([ + AC_MSG_CHECKING(whether IPC_RMID allowes subsequent attaches) + AC_CACHE_VAL(gnupg_cv_ipc_rmid_deferred_release, + AC_TRY_RUN([ #include #include #include @@ -245,19 +249,38 @@ define(GNUPG_CHECK_IPC, exit (0); } ], - AC_DEFINE(IPC_RMID_DEFERRED_RELEASE) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no), - AC_MSG_RESULT(assuming no)) + gnupg_cv_ipc_rmid_deferred_release="yes", + gnupg_cv_ipc_rmid_deferred_release="no", + gnupg_cv_ipc_rmid_deferred_release="assume-no") + ) + if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then + AC_DEFINE(IPC_RMID_DEFERRED_RELEASE) + AC_MSG_RESULT(yes) + else + if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then + AC_MSG_RESULT(no) + else + AC_MSG_RESULT([assuming no]) + fi + fi + AC_MSG_CHECKING(whether SHM_LOCK is available) - AC_TRY_COMPILE([#include + AC_CACHE_VAL(gnupg_cv_ipc_have_shm_lock, + AC_TRY_COMPILE([#include #include #include ],[ int foo( int shm_id ) { shmctl(shm_id, SHM_LOCK, 0); } ], + gnupg_cv_ipc_have_shm_lock="yes", + gnupg_cv_ipc_have_shm_lock="no" + ) + ) + if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then AC_DEFINE(IPC_HAVE_SHM_LOCK) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(no)) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi fi ]) @@ -272,7 +295,8 @@ define(GNUPG_CHECK_MLOCK, [ AC_CHECK_FUNCS(mlock) if test "$ac_cv_func_mlock" = "yes"; then AC_MSG_CHECKING(whether mlock is broken) - AC_TRY_RUN([ + AC_CACHE_VAL(gnupg_cv_have_broken_mlock, + AC_TRY_RUN([ #include #include #include @@ -299,10 +323,21 @@ define(GNUPG_CHECK_MLOCK, } ], - AC_MSG_RESULT(no), - AC_DEFINE(HAVE_BROKEN_MLOCK) - AC_MSG_RESULT(yes), - AC_MSG_RESULT(assuming no)) + gnupg_cv_have_broken_mlock="no", + gnupg_cv_have_broken_mlock="yes", + gnupg_cv_have_broken_mlock="assume-no" + ) + ) + if test "$gnupg_cv_have_broken_mlock" = "yes"; then + AC_DEFINE(HAVE_BROKEN_MLOCK) + AC_MSG_RESULT(yes) + else + if test "$gnupg_cv_have_broken_mlock" = "no"; then + AC_MSG_RESULT(no) + else + AC_MSG_RESULT(assuming no) + fi + fi fi ]) diff --git a/cipher/ChangeLog b/cipher/ChangeLog index 273b6fdee..1858f6a50 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,15 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * Makefile.am: Modules are now figured out by configure + * construct.c: New. Generated by configure. Changed all modules + to work with that. + * sha1.h: Removed. + * md5.h: Removed. + + * twofish.c: Changed interface to allow Twofish/256 + + * rndunix.c (start_gatherer): Die on SIGPIPE. + Wed Jan 20 18:59:49 CET 1999 Werner Koch * rndunix.c (gather_random): Fix to avoid infinite loop. diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 4a7171071..b21dc18f5 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -1,12 +1,33 @@ ## Process this file with automake to produce Makefile.in + INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl noinst_LIBRARIES = libcipher.a -EXTRA_PROGRAMS = tiger twofish rndunix rndlinux +# The configure script greps the module names from the following lines. +# You must also add all these names to EXTRA_PROGRAMS some lines below +# and EXTRA_foo_SOURCES entries. +# Hmmm is there a more easy way to do this? (EXTRA_PROGRAMS +# might also list programs which are not modules) +# MODULES: rndunix rndlinux +# MODULES: sha1 rmd160 md5 tiger +# MODULES: twofish +EXTRA_PROGRAMS = rndunix rndlinux \ + sha1 rmd160 md5 tiger \ + twofish + +EXTRA_rndlinux_SOURCES = rndlinux.c +EXTRA_rndunix_SOURCES = rndunix.c +EXTRA_md5_SOURCES = md5.c +EXTRA_rmd160_SOURCES = rmd160.c +EXTRA_sha1_SOURCES = sha1.c +EXTRA_tiger_SOURCES = tiger.c +EXTRA_twofish_SOURCES = twofish.c + + if ENABLE_GNUPG_EXTENSIONS -pkglib_PROGRAMS = @DYNAMIC_CIPHER_MODS@ @DYNAMIC_RANDOM_MODS@ +pkglib_PROGRAMS = @DYNAMIC_CIPHER_MODS@ else pkglib_PROGRAMS = endif @@ -27,37 +48,41 @@ libcipher_a_SOURCES = cipher.c \ cast5.h \ elgamal.c \ elgamal.h \ - md5.c \ - md5.h \ primegen.c \ random.h \ random.c \ rand-internal.h \ rmd.h \ - rmd160.c \ - sha1.h \ - sha1.c \ dsa.h \ dsa.c \ g10c.c \ - smallprime.c + smallprime.c \ + construct.c + +# configure creates the constructor file +BUILT_SOURCES = construct.c -EXTRA_libcipher_a_SOURCES = rndlinux.c rndunix.c -EXTRA_tiger_SOURCES = tiger.c -EXTRA_twofish_SOURCES = twofish.c +libcipher_a_DEPENDENCIES = @STATIC_CIPHER_OBJS@ +libcipher_a_LIBADD = @STATIC_CIPHER_OBJS@ -libcipher_a_DEPENDENCIES = @STATIC_RANDOM_OBJS@ @STATIC_CIPHER_OBJS@ -libcipher_a_LIBADD = @STATIC_RANDOM_OBJS@ @STATIC_CIPHER_OBJS@ +# If I remember it correct, automake 1.4 has a feature to set +# fooFLAGS depending on the program. So we should check it out. tiger: $(srcdir)/tiger.c `echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o tiger $(srcdir)/tiger.c | \ - sed -e 's/-O[2-9]*/-O1/' ` + sed -e 's/-O[2-9]*/-O1/g' ` + +tiger.o: $(srcdir)/tiger.c + `echo $(COMPILE) $(srcdir)/tiger.c | sed -e 's/-O[2-9]*/-O1/g' ` twofish: $(srcdir)/twofish.c `echo $(COMPILE) $(DYNLINK_MOD_CFLAGS) -o twofish $(srcdir)/twofish.c | \ - sed -e 's/-O[0-9]*/ /' ` + sed -e 's/-O[0-9]*/ /g' ` + +twofish.o: $(srcdir)/twofish.c + `echo $(COMPILE) $(srcdir)/twofish.c | sed -e 's/-O[0-9]*/ /g' ` rndunix: $(srcdir)/rndunix.c diff --git a/cipher/blowfish.c b/cipher/blowfish.c index 3bbc03835..8cffa8b3e 100644 --- a/cipher/blowfish.c +++ b/cipher/blowfish.c @@ -37,6 +37,7 @@ #include "types.h" #include "errors.h" #include "blowfish.h" +#include "dynload.h" diff --git a/cipher/cipher.c b/cipher/cipher.c index f27eec397..37d60251b 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -18,8 +18,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#define DEFINES_CIPHER_HANDLE 1 - #include #include #include @@ -160,6 +158,7 @@ load_cipher_modules() int any = 0; if( !initialized ) { + cipher_modules_constructor(); setup_cipher_table(); /* load static modules on the first call */ initialized = 1; return 1; diff --git a/cipher/dynload.c b/cipher/dynload.c index 6b9263e18..b8c7c67d8 100644 --- a/cipher/dynload.c +++ b/cipher/dynload.c @@ -66,6 +66,7 @@ typedef struct { int seq1; int seq2; void *sym; + int reqalgo; } ENUMCONTEXT; @@ -323,6 +324,7 @@ enum_gnupgext_digests( void **enum_context, if( !*enum_context ) { /* init context */ ctx = m_alloc_clear( sizeof( *ctx ) ); ctx->r = extensions; + ctx->reqalgo = *algo; *enum_context = ctx; } else if( !algo ) { /* release the context */ @@ -333,6 +335,7 @@ enum_gnupgext_digests( void **enum_context, else ctx = *enum_context; + /* fixme: have a look at the hint string */ for( r = ctx->r; r; r = r->next ) { int class, vers; diff --git a/cipher/dynload.h b/cipher/dynload.h index f22f5f3ee..792531cf0 100644 --- a/cipher/dynload.h +++ b/cipher/dynload.h @@ -20,6 +20,8 @@ #ifndef G10_CIPHER_DYNLOAD_H #define G10_CIPHER_DYNLOAD_H +#include "mpi.h" + void register_internal_cipher_extension( const char *module_id, void * (*enumfunc)(int, int*, int*, int*) ); @@ -60,4 +62,7 @@ void (*dynload_getfnc_fast_random_poll(void) )( void (*)(const void*, size_t, int), int ); +/** This function is in construct.c **/ +void cipher_modules_constructor(void); + #endif /*G10_CIPHER_DYNLOAD_H*/ diff --git a/cipher/md.c b/cipher/md.c index 6e335db80..6c4d1124b 100644 --- a/cipher/md.c +++ b/cipher/md.c @@ -18,8 +18,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#define DEFINES_MD_HANDLE 1 - #include #include #include @@ -30,8 +28,6 @@ #include "cipher.h" #include "errors.h" #include "dynload.h" -#include "md5.h" -#include "sha1.h" #include "rmd.h" @@ -57,7 +53,6 @@ struct md_digest_list_s { static struct md_digest_list_s *digest_list; - static struct md_digest_list_s * new_list_item( int algo, const char *(*get_info)( int, size_t*,byte**, int*, int*, @@ -79,33 +74,19 @@ new_list_item( int algo, return r; } -/**************** - * Put the static entries into the table. - */ -static void -setup_digest_list() -{ - struct md_digest_list_s *r; - - r = new_list_item( DIGEST_ALGO_MD5, md5_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } - - r = new_list_item( DIGEST_ALGO_RMD160, rmd160_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } - - r = new_list_item( DIGEST_ALGO_SHA1, sha1_get_info ); - if( r ) { r->next = digest_list; digest_list = r; } -} /**************** - * Try to load all modules and return true if new modules are available + * Try to load the modules with the requeste algorithm + * and return true if new modules are available + * If req_alog is -1 try to load all digest algorithms. */ static int -load_digest_modules() +load_digest_module( int req_algo ) { - static int done = 0; static int initialized = 0; + static u32 checked_algos[256/32]; + static int checked_all = 0; struct md_digest_list_s *r; void *context = NULL; int algo; @@ -116,16 +97,24 @@ load_digest_modules() void (**)(void*),byte *(**)(void*)); if( !initialized ) { - setup_digest_list(); /* load static modules on the first call */ + cipher_modules_constructor(); initialized = 1; - return 1; } - - if( done ) - return 0; - done = 1; + algo = req_algo; + if( algo > 255 || !algo ) + return 0; /* algorithm number too high (does not fit into out bitmap)*/ + if( checked_all ) + return 0; /* already called with -1 */ + if( algo < 0 ) + checked_all = 1; + else if( (checked_algos[algo/32] & (1 << (algo%32))) ) + return 0; /* already checked and not found */ + else + checked_algos[algo/32] |= (1 << (algo%32)); while( enum_gnupgext_digests( &context, &algo, &get_info ) ) { + if( req_algo != -1 && algo != req_algo ) + continue; for(r=digest_list; r; r = r->next ) if( r->algo == algo ) break; @@ -144,6 +133,8 @@ load_digest_modules() r->next = digest_list; digest_list = r; any = 1; + if( req_algo != -1 ) + break; } enum_gnupgext_digests( &context, NULL, NULL ); return any; @@ -163,7 +154,7 @@ string_to_digest_algo( const char *string ) for(r = digest_list; r; r = r->next ) if( !stricmp( r->name, string ) ) return r->algo; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module(-1) ); return 0; } @@ -180,7 +171,7 @@ digest_algo_to_string( int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) return r->name; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); return NULL; } @@ -194,7 +185,7 @@ check_digest_algo( int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) return 0; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module(algo) ); return G10ERR_DIGEST_ALGO; } @@ -241,7 +232,7 @@ md_enable( MD_HANDLE h, int algo ) for(r = digest_list; r; r = r->next ) if( r->algo == algo ) break; - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); if( !r ) { log_error("md_enable: algorithm %d not available\n", algo ); return; @@ -456,7 +447,7 @@ md_digest_length( int algo ) if( r->algo == algo ) return r->mdlen; } - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); log_error("WARNING: no length for md algo %d\n", algo); return 0; } @@ -479,7 +470,7 @@ md_asn_oid( int algo, size_t *asnlen, size_t *mdlen ) return r->asnoid; } } - } while( !r && load_digest_modules() ); + } while( !r && load_digest_module( algo ) ); log_bug("no asn for md algo %d\n", algo); return NULL; } diff --git a/cipher/md5.c b/cipher/md5.c index 214e13727..6a53deda8 100644 --- a/cipher/md5.c +++ b/cipher/md5.c @@ -34,8 +34,8 @@ #include #include #include "util.h" -#include "md5.h" #include "memory.h" +#include "dynload.h" typedef struct { @@ -338,7 +338,7 @@ md5_read( MD5_CONTEXT *hd ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * md5_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -367,5 +367,58 @@ md5_get_info( int algo, size_t *contextsize, } +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "MD5 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))md5_get_info }, + { 11, 1, 1 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) + return NULL; + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: case 21: case 31: ret = &func_table[i].value; break; + default: ret = func_table[i].func; break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +md5_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + + /* end of file */ diff --git a/cipher/md5.h b/cipher/md5.h deleted file mode 100644 index 89fc843cc..000000000 --- a/cipher/md5.h +++ /dev/null @@ -1,34 +0,0 @@ -/* md5.h - message digest 5 - * Copyright (C) 1998 Free Software Foundation, Inc. - * - * This file is part of GnuPG. - * - * GnuPG 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. - * - * GnuPG 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 - */ -#ifndef G10_MD5_H -#define G10_MD5_H - - -const char * -md5_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - - -#endif /*G10_MD5_H*/ diff --git a/cipher/pubkey.c b/cipher/pubkey.c index 2ca8dd854..58ba00007 100644 --- a/cipher/pubkey.c +++ b/cipher/pubkey.c @@ -170,6 +170,7 @@ load_pubkey_modules() if( !initialized ) { + cipher_modules_constructor(); setup_pubkey_table(); initialized = 1; return 1; diff --git a/cipher/random.c b/cipher/random.c index b0bc832e6..bcd017d4c 100644 --- a/cipher/random.c +++ b/cipher/random.c @@ -116,16 +116,7 @@ initialize() keypool = secure_alloc ? m_alloc_secure_clear(POOLSIZE+BLOCKLEN) : m_alloc_clear(POOLSIZE+BLOCKLEN); is_initialized = 1; - - #if USE_RNDLINUX - rndlinux_constructor(); - #elif USE_RNDUNIX - rndunix_constructor(); - #elif USE_RNDW32 - #elif USE_RNDOS2 - #elif USE_RNDATARI - #elif USE_RNDMVS - #endif + cipher_modules_constructor(); } void diff --git a/cipher/rmd.h b/cipher/rmd.h index 0c1fbad99..cd5c453a3 100644 --- a/cipher/rmd.h +++ b/cipher/rmd.h @@ -32,16 +32,4 @@ typedef struct { void rmd160_init( RMD160_CONTEXT *hd ); void rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer ); - - -const char * -rmd160_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - - #endif /*G10_RMD_H*/ diff --git a/cipher/rmd160.c b/cipher/rmd160.c index 4d644756f..70904a144 100644 --- a/cipher/rmd160.c +++ b/cipher/rmd160.c @@ -27,6 +27,7 @@ #include "memory.h" #include "rmd.h" #include "cipher.h" /* only used for the rmd160_hash_buffer() prototype */ +#include "dynload.h" /********************************* * RIPEMD-160 is not patented, see (as of 25.10.97) @@ -554,7 +555,7 @@ rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * rmd160_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -582,3 +583,63 @@ rmd160_get_info( int algo, size_t *contextsize, return "RIPEMD160"; } + +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "RMD160 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))rmd160_get_info }, + { 11, 1, 3 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) { + return NULL; + } + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: + case 21: + case 31: + ret = &func_table[i].value; + break; + default: + ret = func_table[i].func; + break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +rmd160_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + diff --git a/cipher/rndunix.c b/cipher/rndunix.c index 716b02672..0132cd901 100644 --- a/cipher/rndunix.c +++ b/cipher/rndunix.c @@ -642,6 +642,9 @@ start_gatherer( int pipefd ) select(0, NULL, NULL, NULL, &tv); continue; } + if( errno == EPIPE ) /* parent has exited, so give up */ + exit(0); + /* we can't do very much here because stderr is closed */ if( dbgfp ) fprintf(dbgfp, "gatherer can't write to pipe: %s\n", diff --git a/cipher/sha1.c b/cipher/sha1.c index b3da296f8..04bdbac98 100644 --- a/cipher/sha1.c +++ b/cipher/sha1.c @@ -38,7 +38,7 @@ #include #include "util.h" #include "memory.h" -#include "sha1.h" +#include "dynload.h" typedef struct { @@ -331,7 +331,7 @@ sha1_read( SHA1_CONTEXT *hd ) * Returns: A pointer to string describing the algorithm or NULL if * the ALGO is invalid. */ -const char * +static const char * sha1_get_info( int algo, size_t *contextsize, byte **r_asnoid, int *r_asnlen, int *r_mdlen, void (**r_init)( void *c ), @@ -358,3 +358,64 @@ sha1_get_info( int algo, size_t *contextsize, return "SHA1"; } + + +#ifndef IS_MODULE +static +#endif +const char * const gnupgext_version = "SHA1 ($Revision$)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 10, 1, 0, (void(*)(void))sha1_get_info }, + { 11, 1, 2 }, +}; + + +#ifndef IS_MODULE +static +#endif +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) { + return NULL; + } + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: + case 21: + case 31: + ret = &func_table[i].value; + break; + default: + ret = func_table[i].func; + break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} + + + + +#ifndef IS_MODULE +void +sha1_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, gnupgext_enum_func ); +} +#endif + diff --git a/cipher/sha1.h b/cipher/sha1.h deleted file mode 100644 index 3d9302671..000000000 --- a/cipher/sha1.h +++ /dev/null @@ -1,33 +0,0 @@ -/* sha1.h - SHA1 hash function - * Copyright (C) 1998 Free Software Foundation, Inc. - * - * This file is part of GnuPG. - * - * GnuPG 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. - * - * GnuPG 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 - */ -#ifndef G10_SHA1_H -#define G10_SHA1_H - - -const char * -sha1_get_info( int algo, size_t *contextsize, - byte **r_asnoid, int *r_asn_len, int *r_mdlen, - void (**r_init)( void *c ), - void (**r_write)( void *c, byte *buf, size_t nbytes ), - void (**r_final)( void *c ), - byte *(**r_read)( void *c ) - ); - -#endif /*G10_SHA1_H*/ diff --git a/cipher/tiger.c b/cipher/tiger.c index 20d17cae0..0765f0bbd 100644 --- a/cipher/tiger.c +++ b/cipher/tiger.c @@ -909,6 +909,9 @@ tiger_get_info( int algo, size_t *contextsize, +#ifndef IS_MODULE +static +#endif const char * const gnupgext_version = "TIGER ($Revision$)"; static struct { @@ -938,6 +941,9 @@ static struct { * version = interface version of the function/pointer * (currently this is 1 for all functions) */ +#ifndef IS_MODULE +static +#endif void * gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) { @@ -969,5 +975,17 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) return ret; } + + +#ifndef IS_MODULE +void +tiger_constructor(void) +{ + register_internal_cipher_extension( gnupgext_version, + gnupgext_enum_func ); +} +#endif + + #endif /* HAVE_U64_TYPEDEF */ diff --git a/cipher/twofish.c b/cipher/twofish.c index 6ff7dee9f..d1e171bad 100644 --- a/cipher/twofish.c +++ b/cipher/twofish.c @@ -24,6 +24,7 @@ #include "types.h" /* for byte and u32 typedefs */ #include "util.h" #include "errors.h" +#include "dynload.h" /* Prototype for the self-test function. */ @@ -462,7 +463,7 @@ twofish_setkey (TWOFISH_context *ctx, const byte *key, const unsigned keylen) static const char *selftest_failed=0; /* Check key length. */ - if( keylen != 16 ) + if( keylen != 16 ) /* enhance this code for 256 bit keys */ return G10ERR_WRONG_KEYLEN; /* Do self-test if necessary. */ @@ -840,16 +841,18 @@ twofish_get_info (int algo, size_t *keylen, void (**r_decrypt) (void *c, byte *outbuf, byte *inbuf) ) { - *keylen = 128; + *keylen = algo==10? 256 : 128; *blocksize = 16; *contextsize = sizeof (TWOFISH_context); *r_setkey = FNCCAST_SETKEY (twofish_setkey); *r_encrypt= FNCCAST_CRYPT (twofish_encrypt); *r_decrypt= FNCCAST_CRYPT (twofish_decrypt); + if( algo == 10 ) + return "TWOFISH"; if (algo == 102) /* This algorithm number is assigned for * experiments, so we can use it */ - return "TWOFISH"; + return "TWOFISH128"; return NULL; } @@ -863,6 +866,7 @@ static struct { void (*func)(void); } func_table[] = { { 20, 1, 0, (void(*)(void))twofish_get_info }, + { 21, 1, 10 }, { 21, 1, 102 }, }; diff --git a/configure.in b/configure.in index a9975bf69..6ea0a81ac 100644 --- a/configure.in +++ b/configure.in @@ -15,11 +15,15 @@ AM_CONFIG_HEADER(config.h) VERSION=`cat $srcdir/VERSION` PACKAGE=gnupg ALL_LINGUAS="de es_ES fr it pl pt_BR ru" +static_modules="sha1 md5 rmd160" AC_SUBST(VERSION) AC_SUBST(PACKAGE) AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") +MODULES_IN_CIPHER=`awk '/# MODULES: / { for(i=3;i<=NF;i++) print $i}' \ + $srcdir/cipher/Makefile.am` + AC_MSG_CHECKING([whether use of /dev/random is requested]) AC_ARG_ENABLE(dev-random, [ --disable-dev-random disable the use of dev random], @@ -91,6 +95,8 @@ if test "$GCC" = yes; then CFLAGS="$CFLAGS -Wall" fi +try_gettext=yes +try_gdbm=yes case "${target}" in i386--mingw32) # special stuff for Windoze NT @@ -99,9 +105,19 @@ case "${target}" in CPP="i386--mingw32-gcc -E" RANLIB="i386--mingw32-ranlib" ac_cv_have_dev_random=no - AC_DEFINE(USE_RNDW32) AC_DEFINE(USE_ONLY_8DOT3) AC_DEFINE(HAVE_DRIVE_LETTERS) + AC_DEFINE(HAVE_DOSISH_SYSTEM) + try_gettext="no" + try_gdbm="no" + ;; + i386-emx-os2) + # OS/2 with the EMX environment + ac_cv_have_dev_random=no + AC_DEFINE(HAVE_DRIVE_LETTERS) + AC_DEFINE(HAVE_DOSISH_SYSTEM) + try_gettext="no" + try_gdbm="no" ;; *-*-hpux*) if test -z "$GCC" ; then @@ -126,6 +142,9 @@ case "${target}" in i386--mingw32) PRINTABLE_OS_NAME="MingW32" ;; + i386-emx-os2) + PRINTABLE_OS_NAME="OS/2" + ;; *-linux*) PRINTABLE_OS_NAME="GNU/Linux" ;; @@ -154,9 +173,13 @@ AC_DEFINE_UNQUOTED(NAME_OF_DEV_URANDOM, "$NAME_OF_DEV_URANDOM") dnl Checks for libraries. +if test "$try_gettext" = yes; then AM_GNU_GETTEXT +fi +if test "$try_gdbm" = yes; then AC_CHECK_LIB(gdbm,gdbm_firstkey) +fi if test "$try_dynload" = yes ; then @@ -252,7 +275,6 @@ AC_CACHE_CHECK(for random device, ac_cv_have_dev_random, ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi]) if test "$ac_cv_have_dev_random" = yes; then AC_DEFINE(HAVE_DEV_RANDOM) - AC_DEFINE(USE_RNDLINUX) fi else AC_MSG_CHECKING(for random device) @@ -262,42 +284,93 @@ fi dnl -dnl Figure how to link the random modules +dnl Figure out the default linkage mode for cipher modules dnl +dnl (We always need a static rmd160) +static_modules="$static_modules rmd160" if test "$ac_cv_have_dev_random" = yes; then - AC_DEFINE(USE_RNDLINUX) - STATIC_RANDOM_OBJS="rndlinux.o" - DYNAMIC_RANDOM_MODS="" + static_modules="$static_modules rndlinux" else case "${target}" in i386--mingw32) - AC_DEFINE(USE_RNDW32) - STATIC_RANDOM_OBJS="" - DYNAMIC_RANDOM_MODS="" + static_modules="$static_modules rndw32" + ;; + i386-emx-os2) + static_modules="$static_modules rndos2" ;; m68k-atari-mint) - AC_DEFINE(USE_RNDATARI) - STATIC_RANDOM_OBJS="" - DYNAMIC_RANDOM_MODS="" + static_modules="$static_modules rndatari" ;; *) - AC_DEFINE(USE_RNDUNIX) - STATIC_RANDOM_OBJS="rndunix.o" - DYNAMIC_RANDOM_MODS="" + static_modules="$static_modules rndunix" ;; esac fi -AC_SUBST(STATIC_RANDOM_OBJS) -AC_SUBST(DYNAMIC_RANDOM_MODS) +dnl +dnl Parse the modules list and build the list +dnl of static and dymically linked modules +dnl +STATIC_CIPHER_NAMES="" +STATIC_CIPHER_OBJS="" +DYNAMIC_CIPHER_MODS="" +GNUPG_MSG_PRINT([dynamically linked cipher modules:]) +for name in $MODULES_IN_CIPHER; do + x="no" + for i in $static_modules; do + if test "$name" = "$i" ; then + x="yes" + fi + done; + if test $x = yes; then + STATIC_CIPHER_NAMES="$STATIC_CIPHER_NAMES $name" + STATIC_CIPHER_OBJS="$STATIC_CIPHER_OBJS $name.o" + else + DYNAMIC_CIPHER_MODS="$DYNAMIC_CIPHER_MODS $name" + GNUPG_MSG_PRINT([$name]) + fi +done +AC_MSG_RESULT() +AC_SUBST(STATIC_CIPHER_OBJS) +AC_SUBST(STATIC_CIPHER_NAMES) +AC_SUBST(DYNAMIC_CIPHER_MODS) + +dnl +dnl And build the constructor file +dnl +cat <cipher/construct.c +/* automatically generated by configure - do not edit */ + +EOF +GNUPG_MSG_PRINT([statically linked cipher modules:]) +for name in $STATIC_CIPHER_NAMES; do + echo "void ${name}_constructor(void);" >>cipher/construct.c + GNUPG_MSG_PRINT([$name]) +done +AC_MSG_RESULT() +cat <>cipher/construct.c + +void +cipher_modules_constructor(void) +{ + static int done = 0; + if( done ) + return; + done = 1; + +EOF +for name in $STATIC_CIPHER_NAMES; do + echo " ${name}_constructor();" >>cipher/construct.c +done +echo '}' >>cipher/construct.c + + dnl dnl Figure how to link the cipher modules dnl dnl (form now these are only dynamic) -STATIC_CIPHER_OBJS="" -DYNAMIC_CIPHER_MODS="twofish tiger" AC_SUBST(STATIC_CIPHER_OBJS) AC_SUBST(DYNAMIC_CIPHER_MODS) @@ -351,6 +424,10 @@ fi fi AC_SUBST(ZLIBS) +if echo "$VERSION" | grep '[a-zA-Z]' >/dev/null ; then + AC_DEFINE(IS_DEVELOPMENT_VERSION) +fi + GNUPG_DO_LINK_FILES diff --git a/doc/DETAILS b/doc/DETAILS index 5e765728d..ed2ad04c3 100644 --- a/doc/DETAILS +++ b/doc/DETAILS @@ -79,7 +79,7 @@ more arguments in future versions. The used key has been revoked by his owner. No arguments yet. BADARMOR - The ascii armor is corrupted. No arguments yet. + The ASCII armor is corrupted. No arguments yet. RSA_OR_IDEA The RSA or IDEA algorithms has been used in the data. A @@ -175,7 +175,7 @@ Record type 2: (directory record) 1 u32 cache record 1 byte ownertrust 1 byte dirflag - 1 byte validity + 1 byte validity of the key calucalted over all user ids 19 byte reserved @@ -208,7 +208,7 @@ Record type 4: (uid record) 1 u32 pointer to preference record 1 u32 siglist list of valid signatures 1 byte uidflags - 1 byte reserved + 1 byte validity of the key calculated over this user id 20 bytes ripemd160 hash of the username. @@ -418,7 +418,7 @@ Usage of gdbm files for keyrings ================================ The key to store the keyblock is it's fingerprint, other records are used for secondary keys. fingerprints are always 20 bytes - where 16 bit fingerprints are appded with zero. + where 16 bit fingerprints are appended with zero. The first byte of the key gives some information on the type of the key. 1 = key is a 20 bit fingerprint (16 bytes fpr are padded with zeroes) diff --git a/doc/FAQ b/doc/FAQ index b61bc5461..be2b6dc15 100644 --- a/doc/FAQ +++ b/doc/FAQ @@ -23,11 +23,10 @@ GNUPG is also useful for signing things. Things that are encrypted with the secret key can be decrypted with the public key. To sign something, a - hash is taken of the data, and then the hash is in some form encoded - with the secret - key. If someone has your public key, they can verify that it is from - you and that it hasn't changed by checking the encoded form of the - hash with the public key. + hash is taken of the data, and then the hash is in some form encoded with + the secret key. If someone has your public key, they can verify that it + is from you and that it hasn't changed by checking the encoded form of + the hash with the public key. A keyring is just a large file that stores keys. You have a public keyring where you store yours and your friend's public keys. You have a secret @@ -63,12 +62,12 @@ or at a meeting of your local GNU/Linux User Group. Hmm, what else. You may use the option "-o filename" to force output - to this filename (use "-" to force output to stdout). - "-r" just lets you specify the recipient (which public key you encrypt with) - on the command line instead of typing it interactively. + to this filename (use "-" to force output to stdout). "-r" just lets you + specify the recipient (which public key you encrypt with) on the command + line instead of typing it interactively. Oh yeah, this is important. By default all data is encrypted in some weird - binary format. If you want to have things appear in ascii text that is + binary format. If you want to have things appear in ASCII text that is readable, just add the '-a' option. But the preferred method is to use a MIME aware mail reader (Mutt, Pine and many more). @@ -94,31 +93,31 @@ a v3 packet. GNUPG is the only program which had used these v3 ElGamal keys - so this assumption is quite safe. - Q: Why is PGP 5.x not able to encrypt messages with my public key. + Q: Why is PGP 5.x not able to encrypt messages with my public key? A: PGP Inc refuses to accept ElGamal keys of type 20 even for encryption. They only supports type 16 (which are identical - at least for decryption). To be better interoperable, GNUPG + at least for decryption). To be more inter-operable, GNUPG (starting with version 0.3.3) now also uses type 16 for the ElGamal subkey which is created if the default key algorithm is chosen. You may add an type 16 ElGamal key to your public key which is easy as your key signatures are still valid. - Q: Why is PGP 5.x not able to verify my messages. + Q: Why is PGP 5.x not able to verify my messages? A: PGP 5.x does not accept V4 signatures for data material but OpenPGP requires generation of V3 signatures for all kind of data. Use the option "--force-v3-sigs" to generate V3 signatures for data. Q: I can't delete an user id because it is already deleted on my - public keyring. + public keyring? A: Because you can only select from the public key ring, there is - no direct way to do this. However it is not so complicated - do to it anyway: Create a new user id with exactly the same name, - you will notice that there are two identical user ids on the - secret ring now. Now select this user id and delete it; both - user ids from the secret ring will be removed. + no direct way to do this. However it is not very complicated + to do it anyway. Create a new user id with exactly the same name + and you will see that there are now two identical user ids on the + secret ring. Now select this user id and delete it. Both user + ids will be removed from the secret ring. - Q: How can I encrypt a message in way pgp 2.x is able to decrypt it later? + Q: How can I encrypt a message so that pgp 2.x is able to decrypt it? A: You can't do that because pgp 2.x normally uses IDEA which is not supported by GNUPG because it is patented, but if you have a modified version of PGP you can try this: @@ -130,11 +129,11 @@ gpg -c --cipher-algo 3des --compress-algo 1 --no-comment myfile - You may replace "3des" by "cast5"; "blowfish" does not work with + You may replace "3des" by "cast5". "blowfish" does not work with all versions of pgp5. You may also want to put no-comment compress-algo 1 - into your ~/.gnupg/options file - this does not affect the normal + into your ~/.gnupg/options file - this does not affect normal gnupg operation. @@ -142,42 +141,40 @@ A: The problem here is that we need a lot of random bytes and for that we (on Linux the /dev/random device) must collect some random data. It is really not easy to fill the Linux internal entropy buffer; I - talked to Ted Ts'o and he commited that the best way to fill the - buffer is to play with your keyboard. - Good security has it's price. - What I do is to hit several times on the shift,control, alternate, - capslock keys, as these keys do not produce any output to the screen. - This way you get your keys really fast (it's the same thing pgp2 does). + talked to Ted Ts'o and he commented that the best way to fill the buffer + is to play with your keyboard. Good security has it's price. What I do + is to hit several times on the shift, control, alternate, and capslock + keys, because these keys do not produce output to the screen. This way + you get your keys really fast (it's the same thing pgp2 does). Another problem might be another program which eats up your random bytes (a program (look at your daemons) that reads from /dev/[u]random). Q: And it really takes long when I work on a remote system. Why? - A: Don't do this at all! - You should never create keys or even use gnupg on a remote system because - you normally have - no physical control over your secret keyring (which is in most cases - vulnerable to advanced dictionary attacks) - I strongly encourage - everyone to only create keys on a local computer (a disconnected - laptop is probably the best choice) and if you need it on your - connected box (I know: We all do this) be sure to have a strong - password for your account, your secret key and trust your Root. + A: Don't do this at all! You should never create keys or even use gnupg + on a remote system because you normally have no physical control over + your secret keyring (which is in most cases vulnerable to advanced + dictionary attacks) - I strongly encourage everyone to only create keys + on a local computer (a disconnected laptop is probably the best choice) + and if you need it on your connected box (I know: We all do this) be + sure to have a strong password for your account and for your secret key + and trust your Root. When I check gnupg on a remote system via ssh (I have no Alpha here ;-) - I have the same problem too: it takes *very* long to create the keys, - so I use a special option --quick-random to generate insecure keys which are - only good for some tests. + I have the same problem. It takes a *very* long time to create the + keys, so I use a special option, --quick-random, to generate insecure + keys which are only good for some tests. Q: How does the whole trust thing work? - A: It works more or less like PGP. The difference is, that the trust is - computed at the time it is needed; this is one of the reasons for the + A: It works more or less like PGP. The difference is that the trust is + computed at the time it is needed. This is one of the reasons for the trustdb which holds a list of valid key signatures. If you are not running in batch mode you will be asked to assign a trust parameter (ownertrust) to a key. I have plans to use a cache for calculated trust values to speed up calculation. - You can see the validity (calculated trust value) using this command: + You can see the validity (calculated trust value) using this command. gpgm --list-keys --with-colons @@ -193,13 +190,13 @@ is only used for keys for which the secret key is also available. - You can get a list of the assigned trust values (how far you trust - the owner to correctly sign another one's key) + You can get a list of the assigned trust values (how much you trust + the owner to correctly sign another person's key) gpgm --list-ownertrust - The first field is the fingerprint of the primary key, the second one - the assigned value: + The first field is the fingerprint of the primary key, the second field + is the assigned value: - = No Ownertrust value yet assigned. n = Never trust this keyholder to correctly verify others signatures. @@ -207,42 +204,42 @@ f = Assume that the key holder really knows how to sign keys. u = No need to trust ourself because we have the secret key. - Please keep these values confidential, as they express some opinions of - you about others. PGP does store these information with the keyring, so - it is not a good idea to publish the keyring instead of exporting the - keyring - gnupg stores the trust in the trust-DB and therefor it is okay - to give the keyring away (but we have a --export command too). + Keep these values confidential because they express your opinions + about others. PGP stores this information with the keyring thus + it is not a good idea to publish a PGP keyring instead of exporting the + keyring. gnupg stores the trust in the trust-DB so it is okay + to give a gpg keyring away (but we have a --export command too). Q: What is the difference between options and commands? - A: If you do a "gpg --help", you will get two separate lists. The first is a list - of commands. The second is a list of options. Whenever you run GPG, you *must* - pick exactly one command (**with one exception, see below). You *may* pick one - or more options. The command should, just by convention, come at the end of the - argument list, after all the options. If the command takes a file (all the - basic ones do), the filename comes at the very end. So the basic way to - run gpg is: + A: If you do a "gpg --help", you will get two separate lists. The first is + a list of commands. The second is a list of options. Whenever you run GPG, + you *must* pick exactly one command (**with one exception, see below). You + *may* pick one or more options. The command should, just by convention, + come at the end of the argument list, after all the options. If the + command takes a file (all the basic ones do), the filename comes at the + very end. So the basic way to run gpg is: gpg [--option something] [--option2] [--option3 something] --command file Some options take arguments, for example the --output option (which can be - abbreviated -o) is an option which takes a filename. The option's argument - must follow immediately after the option itself: otherwise gpg doesn't know + abbreviated -o) is an option that takes a filename. The option's argument + must follow immediately after the option itself, otherwise gpg doesn't know which option the argument is supposed to go with. As an option, --output and its filename must come before the command. The --remote-user (-r) option takes a name or keyid to encrypt the message to, which must come right after the -r - argument. The --encrypt (or -e) command comes after all the options, followed - by the file you wish to encrypt. So use: + argument. The --encrypt (or -e) command comes after all the options followed + by the file you wish to encrypt. So use gpg -r alice -o secret.txt -e test.txt - If you write the options out in full, it is easier to read: + If you write the options out in full, it is easier to read gpg --remote-user alice --output secret.txt --encrypt test.txt If you're saving it in a file called ".txt" then you'd probably expect to see - ascii-armored text in there, so you need to add the --armor (-a) option, - which doesn't take any arguments: + ASCII-armored text in there, so you need to add the --armor (-a) option, + which doesn't take any arguments. gpg --armor --remote-user alice --output secret.txt --encrypt test.txt @@ -251,7 +248,7 @@ gpg [--armor] [--remote-user alice] [--output secret.txt] --encrypt test.txt - The optional parts can be rearranged any way you want: + The optional parts can be rearranged any way you want. gpg --output secret.txt --remote-user alice --armor --encrypt test.txt @@ -268,30 +265,30 @@ Q: What kind of output is this: "key C26EE891.298, uid 09FB: ...."? A: This is the internal representation of an user id in the trustdb. "C26EE891" is the keyid, "298" is the local id (a record number - in the trustdb) and "09FB" are the last two bytes of a ripe-md-160 + in the trustdb) and "09FB" is the last two bytes of a ripe-md-160 hash of the user id for this key. Q: What is trust, validity and ownertrust? A: "ownertrust" is used instead of "trust" to make clear that - this is the value you have assigned to key to express, how far you + this is the value you have assigned to key to express how much you trust the owner of this key to correctly sign (and so introduce) - other keys. "validity" or calculated trust is a value which - says, how far the gnupg thinks a key is valid (that it really belongs + other keys. "validity", or calculated trust, is a value which + says how much the gnupg thinks a key is valid (that it really belongs to the one who claims to be the owner of the key). For more see the chapter "The Web of Trust" in the Manual [gpg: Oops: Internal error: manual not found - sorry] - Q: How do interpret some of the informational outputs: - A: While checking the validness of a key, GnuPG sometimes print - some informations which are prefixed with information about - the checked item: + Q: How do interpret some of the informational outputs? + A: While checking the validity of a key, GnuPG sometimes prints + some information which is prefixed with information about + the checked item. "key 12345678.3456" This is about the key with key ID 12345678 and the internal number 3456, which is the record number of the so called directory record in the trustdb. "uid 12345678.3456/ACDE" - This is about the user ID for the same key; to identify the + This is about the user ID for the same key. To identify the user ID the last two bytes of a ripe-md-160 over the user ID ring is printed. "sig 12345678.3456/ACDE/9A8B7C6D" @@ -302,15 +299,14 @@ Q: How do I sign a patch file? A: Use "gpg --clearsign --not-dash-escaped ...". - The problem with --clearsign is - that all lines starting with a dash are quoted with "- "; obviously - diff produces many of lines starting with a dash and these are - then quoted and that is not good for patch ;-). In order to use - a patch file without removing the cleartext signature, the special - option --not-dash-escaped may be used to suppress generation of - these escape sequences. You should not mail such a patch because - spaces and line endings are also subject to the signature and a mailer - may not preserve these. If you want to mail a file you can simply sign - it using your MUA. + The problem with --clearsign is that all lines starting with a dash are + quoted with "- "; obviously diff produces many of lines starting with a + dash and these are then quoted and that is not good for patch ;-). To + use a patch file without removing the cleartext signature, the special + option --not-dash-escaped may be used to suppress generation of these + escape sequences. You should not mail such a patch because spaces and + line endings are also subject to the signature and a mailer may not + preserve these. If you want to mail a file you can simply sign it + using your MUA. diff --git a/doc/gpg.1pod b/doc/gpg.1pod index 21cc126bf..f7e5a4ce8 100644 --- a/doc/gpg.1pod +++ b/doc/gpg.1pod @@ -67,7 +67,7 @@ B<-k> [I] [I] Kludge to be somewhat compatible with PGP. Without arguments, all public keyrings are listed. With one argument, only I is listed. - Special combinations are also allowed, but it may + Special combinations are also allowed, but they may give strange results when combined with more options. B<-kv> Same as B<-k> B<-kvv> List the signatures with every key. @@ -130,7 +130,7 @@ B<--edit-key> I Remove a subkey. B Change the key expiration time. If a key is - select, the time of this key will be changed. + selected, the time of this key will be changed. With no selection the key expiration of the primary key is changed. B @@ -154,10 +154,10 @@ B<--edit-key> I key rings. The listing shows you the key with its secondary keys and all user ids. Selected keys or user ids - indicated by an asterisk. The trust value is - displayed with the primary key: The first one is the - assigned owner trust and the second the calculated - trust value; letters are used for the values: + are indicated by an asterisk. The trust value is + displayed with the primary key: the first is the + assigned owner trust and the second is the calculated + trust value. Letters are used for the values: B<-> No ownertrust assigned / not yet calculated. B Trust calculation has failed. B Not enough information for calculation. @@ -201,11 +201,11 @@ B<--export-secret-keys> [I] B<--import>, B<--fast-import> Import/merge keys. The fast version does not build - the trustdb; this can be deon at anytime with the + the trustdb; this can be done at any time with the command B<--update-trustdb>. B<--export-ownertrust> - List the assigned ownertrust values in ascii format + List the assigned ownertrust values in ASCII format for backup purposes [B only]. B<--import-ownertrust> [I] @@ -215,9 +215,9 @@ B<--import-ownertrust> [I] =head1 OPTIONS -Long options can be put in an options file (default F<~/.gnupg/options>); -do not write the 2 dashes, but simply the name of the option and any -arguments if required. Lines with a hash as the first non-white-space +Long options can be put in an options file (default F<~/.gnupg/options>). +Do not write the 2 dashes, but simply the name of the option and any +required arguments. Lines with a hash as the first non-white-space character are ignored. Commands may be put in this file too, but that does not make sense. @@ -250,7 +250,7 @@ B<--trusted-key> I You may also use this option to skip the verification of your own secret keys which is normally done every - time GnuPG starts up: Use for I the one of + time GnuPG starts up by using the I of your key. B<-r> I, B<--recipient> I @@ -268,7 +268,7 @@ B<-q>, B<--quiet> B<-z> I Set compress level to I. A value of 0 for I disables compression. Default is to use the default - compression level of zlib (which is 6). + compression level of zlib (normally 6). B<-t>, B<--textmode> Use canonical text mode. If B<-t> (but not @@ -276,17 +276,17 @@ B<-t>, B<--textmode> and signing, this enables clearsigned messages. This kludge is needed for PGP compatibility; normally you would use B<--sign> or B<--clearsign> - to selected the type os signatures. + to selected the type of the signature. B<-n>, B<--dry-run> Don't make any changes (not yet implemented). B<--batch> - Batch mode; never ask, do not allow interactive + Use batch mode. Never ask, do not allow interactive commands. B<--no-batch> - Disable batch mode; this may be used if B + Disable batch mode. This may be used if B is used in the options file. B<--yes> @@ -297,7 +297,7 @@ B<--no> B<--keyserver> I Use I to lookup keys which are not yet in - your keyring; this is only done while verifying + your keyring. This is only done while verifying messages with signatures. The option is also required for the command B<--send-keys> to specify the keyserver to where the keys should @@ -374,11 +374,11 @@ B<--set-filename> I B<--completes-needed> I Number of completely trusted users to introduce a new - key signator (defaults to 1). + key signer (defaults to 1). B<--marginals-needed> I Number of marginally trusted users to introduce a new - key signator (defaults to 3) + key signer (defaults to 3) B<--max-cert-depth> I Maximum depth of a certification chain (default is 5). @@ -409,7 +409,7 @@ B<--s2k-digest-algo> I encryption if B<--digest-algo> is not given. B<--s2k-mode> I - Selects how passphrases are mangled: A number of I<0> + Selects how passphrases are mangled. A number of I<0> uses the plain passphrase (which is not recommended), a I<1> (default) adds a salt to the passphrase and I<3> iterates the whole process a couple of times. @@ -418,12 +418,12 @@ B<--s2k-mode> I B<--compress-algo> I Use compress algorithm I. Default is I<2> which is - RFC1950 compression; you may use I<1> to use the old zlib - version which is used by PGP. - The default algorithm may give better - results because the window size is not limited to 8K. - If this is not used the OpenPGP behavior is used; i.e. - the compression algorithm is selected from the preferences. + RFC1950 compression. You may use I<1> to use the old zlib + version which is used by PGP. The default algorithm may + give better results because the window size is not limited + to 8K. If this is not used the OpenPGP behavior is used, + i.e. the compression algorithm is selected from the + preferences. B<--digest-algo> I Use I as message digest algorithm. Running the @@ -438,21 +438,20 @@ B<--throw-keyid> process because all available secret keys are tried. B<--not-dash-escaped> - This option changes the behavior of cleartext signature + This option changes the behavior of cleartext signatures so that they can be used for patch files. You should not send such an armored file via email because all spaces and line endings are hashed too. You can not use this - option for data which has 5 dashes somewhere at the - beginning of a line - patch files don't have this. - A special armor header line tells GnuPG about this - cleartext signature framework. + option for data which has 5 dashes at the beginning of a + line, patch files don't have this. A special armor header + line tells GnuPG about this cleartext signature option. B<--escape-from-lines> Because some mailers change lines starting with "From " to ">From " it is good to handle such lines in a special - way when creating cleartext signatures; all other PGP - versions do it this way too. Because this would violate - rfc2440, this option is not enabled per default. + way when creating cleartext signatures. All other PGP + versions do it this way too. This option is not enabled + by default because it would violate rfc2440. B<--passphrase-fd> I Read the passphrase from file descriptor I. If you use @@ -464,10 +463,10 @@ B<--rfc1991> Try to be more RFC1991 (PGP 2.x) compliant. B<--force-v3-sigs> - OpenPGP states that a implementation should generate - v4 signatures but PGP 5.x does only recognize such - signatures on key material. This options forces - v3 signatures for signatures on data. + OpenPGP states that an implementation should generate + v4 signatures but PGP 5.x recognizes v4 signatures only + on key material. This options forces v3 signatures for + signatures on data. B<--lock-once> Lock the file the first time a lock is requested @@ -510,7 +509,7 @@ B<-h>, B<--help> =head1 RETURN VALUE The Program returns 0 if everything was fine, 1 if at least -a signature was bad and other errorcode for fatal errors. +a signature was bad, and other error codes for fatal errors. =head1 EXAMPLES @@ -552,15 +551,15 @@ Use a B password for your user account and a B passphrase to protect your secret key. This passphrase is the weakest part of the whole system. Programs to do dictionary attacks on your secret keyring are very easy to write and so you should protect your B<~/.gnupg/> -directory very good. +directory very well. Keep in mind that, if this program is used over a network (telnet), it is B easy to spy out your passphrase! =head1 BUGS -On many systems this program should be installed as setuid(root); this -is necessary to lock some pages of memory. If you get no warning message -about insecure memory your OS kernel supports locking without being root; -setuid is dropped as soon as this memory is allocated. +On many systems this program should be installed as setuid(root). This +is necessary to lock memory pages. If you get no warning message about +insecure memory your OS kernel supports locking without being root. +The program drops root privileges as soon as locked memory is allocated. diff --git a/g10/ChangeLog b/g10/ChangeLog index 8a09ff324..61551dc5d 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,25 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * g10.c (main): check for development version now in configure + + * tdbio.c (tdbio_write_record): Add uid.validity + (tdbio_read_record) : Ditto. + (tdbio_dump_record) : Ditto. + + * keygen.c (keygen_add_std_prefs): Replaced Blowfish by Twofish, + removed MD5 and Tiger. + * pubkey-enc.c (get_it): Suppress warning about missing Blowfish + in preferences in certain cases. + + * ringedit.c (lock_rentry,unlock_rentry): New. + + * getkey.c (key_byname): Pass ret_kb down to lookup_xx. + + * armor.c (armor_filter): No output of of empty comment lines. + Add option --no-version to suppress the output of the version string. + + * getkey.c: Release the getkey context for auto context variables. + Sun Jan 24 18:16:26 CET 1999 Werner Koch * getkey.c: Changed the internal design to allow simultaneous diff --git a/g10/armor.c b/g10/armor.c index 663e824a6..5aba3322a 100644 --- a/g10/armor.c +++ b/g10/armor.c @@ -876,23 +876,26 @@ armor_filter( void *opaque, int control, iobuf_writestr(a, "-----"); iobuf_writestr(a, head_strings[afx->what] ); iobuf_writestr(a, "-----\n"); - iobuf_writestr(a, "Version: GnuPG v" VERSION " (" - PRINTABLE_OS_NAME ")\n"); + if( !opt.no_version ) + iobuf_writestr(a, "Version: GnuPG v" VERSION " (" + PRINTABLE_OS_NAME ")\n"); if( opt.comment_string ) { const char *s = opt.comment_string; - iobuf_writestr(a, "Comment: " ); - for( ; *s; s++ ) { - if( *s == '\n' ) - iobuf_writestr(a, "\\n" ); - else if( *s == '\r' ) - iobuf_writestr(a, "\\r" ); - else if( *s == '\v' ) - iobuf_writestr(a, "\\v" ); - else - iobuf_put(a, *s ); + if( *s ) { + iobuf_writestr(a, "Comment: " ); + for( ; *s; s++ ) { + if( *s == '\n' ) + iobuf_writestr(a, "\\n" ); + else if( *s == '\r' ) + iobuf_writestr(a, "\\r" ); + else if( *s == '\v' ) + iobuf_writestr(a, "\\v" ); + else + iobuf_put(a, *s ); + } + iobuf_put(a, '\n' ); } - iobuf_put(a, '\n' ); } else iobuf_writestr(a, diff --git a/g10/g10.c b/g10/g10.c index df0cd482c..df35870b7 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -117,6 +117,7 @@ enum cmd_and_opt_values { aNull = 0, oDebugAll, oStatusFD, oNoComment, + oNoVersion, oCompletesNeeded, oMarginalsNeeded, oMaxCertDepth, @@ -307,6 +308,7 @@ static ARGPARSE_OPTS opts[] = { { oRunAsShmCP, "run-as-shm-coprocess", 4, "@" }, { oSetFilename, "set-filename", 2, "@" }, { oComment, "comment", 2, "@" }, + { oNoVersion, "no-version", 0, "@"}, { oNotDashEscaped, "not-dash-escaped", 0, "@" }, { oEscapeFrom, "escape-from-lines", 0, "@" }, { oLockOnce, "lock-once", 0, "@" }, @@ -716,6 +718,7 @@ main( int argc, char **argv ) opt.verbose = 0; opt.list_sigs=0; break; case oQuickRandom: quick_random_gen(1); break; case oNoComment: opt.no_comment=1; break; + case oNoVersion: opt.no_version=1; break; case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break; case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break; case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break; @@ -810,6 +813,9 @@ main( int argc, char **argv ) if( greeting ) { tty_printf("%s %s; %s\n", strusage(11), strusage(13), strusage(14) ); tty_printf("%s\n", strusage(15) ); + #ifdef IS_DEVELOPMENT_VERSION + log_info("NOTE: this is a development version!\n"); + #endif } secmem_set_flags( secmem_get_flags() & ~2 ); /* resume warnings */ @@ -859,12 +865,6 @@ main( int argc, char **argv ) log_error(_("invalid S2K mode; must be 0, 1 or 3\n")); } - { const char *p = strusage(13); - for( ; *p && (isdigit(*p) || *p=='.'); p++ ) - ; - if( *p ) - log_info("NOTE: this is a development version!\n"); - } if( log_get_errorcount(0) ) g10_exit(2); diff --git a/g10/getkey.c b/g10/getkey.c index 770aa5811..f7558703d 100644 --- a/g10/getkey.c +++ b/g10/getkey.c @@ -38,9 +38,9 @@ #define MAX_PK_CACHE_ENTRIES 50 #define MAX_UID_CACHE_ENTRIES 50 -/* Aa map of the all characters valid used for word_match() +/* A map of the all characters valid used for word_match() * Valid characters are in in this table converted to uppercase. - * becuase the upper 128 bytes have special meanin, we assume + * because the upper 128 bytes have special meaning, we assume * that they are all valid. * Note: We must use numerical values here in case that this program * will be converted to those little blue HAL9000s with their strange @@ -95,6 +95,7 @@ struct getkey_ctx_s { KBPOS kbpos; int last_rc; ulong count; + int not_allocated; int nitems; getkey_item_t items[1]; }; @@ -322,11 +323,13 @@ get_pubkey( PKT_public_key *pk, u32 *keyid ) /* do a lookup */ { struct getkey_ctx_s ctx; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.nitems = 1; ctx.items[0].mode = 11; ctx.items[0].keyid[0] = keyid[0]; ctx.items[0].keyid[1] = keyid[1]; rc = lookup_pk( &ctx, pk, NULL ); + get_pubkey_end( &ctx ); } if( !rc ) goto leave; @@ -371,11 +374,13 @@ get_seckey( PKT_secret_key *sk, u32 *keyid ) struct getkey_ctx_s ctx; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.nitems = 1; ctx.items[0].mode = 11; ctx.items[0].keyid[0] = keyid[0]; ctx.items[0].keyid[1] = keyid[1]; rc = lookup_sk( &ctx, sk, NULL ); + get_seckey_end( &ctx ); if( !rc ) { /* check the secret key (this may prompt for a passprase to * unlock the secret key @@ -395,14 +400,18 @@ int get_primary_seckey( PKT_secret_key *sk, u32 *keyid ) { struct getkey_ctx_s ctx; + int rc; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.primary = 1; ctx.nitems = 1; ctx.items[0].mode = 11; ctx.items[0].keyid[0] = keyid[0]; ctx.items[0].keyid[1] = keyid[1]; - return lookup_sk( &ctx, sk, NULL ); + rc = lookup_sk( &ctx, sk, NULL ); + get_seckey_end( &ctx ); + return rc; } @@ -421,11 +430,13 @@ seckey_available( u32 *keyid ) sk = m_alloc_clear( sizeof *sk ); memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.nitems = 1; ctx.items[0].mode = 11; ctx.items[0].keyid[0] = keyid[0]; ctx.items[0].keyid[1] = keyid[1]; rc = lookup_sk( &ctx, sk, NULL ); + get_seckey_end( &ctx ); free_secret_key( sk ); return rc; } @@ -653,9 +664,9 @@ key_byname( GETKEY_CTX *retctx, STRLIST namelist, /* and call the lookup function */ ctx->primary = 1; /* we want to look for the primary key only */ if( sk ) - rc = lookup_sk( ctx, sk, NULL ); + rc = lookup_sk( ctx, sk, ret_kb ); else - rc = lookup_pk( ctx, pk, NULL ); + rc = lookup_pk( ctx, pk, ret_kb ); if( retctx ) /* caller wants the context */ *retctx = ctx; @@ -733,7 +744,8 @@ get_pubkey_end( GETKEY_CTX ctx ) enum_keyblocks( 2, &ctx->kbpos, NULL ); /* close */ for(n=0; n < ctx->nitems; n++ ) m_free( ctx->items[n].namebuf ); - m_free( ctx ); + if( !ctx->not_allocated ) + m_free( ctx ); } } @@ -748,10 +760,12 @@ get_pubkey_byfprint( PKT_public_key *pk, const byte *fprint, size_t fprint_len) if( fprint_len == 20 || fprint_len == 16 ) { struct getkey_ctx_s ctx; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.nitems = 1; ctx.items[0].mode = fprint_len; memcpy( ctx.items[0].fprint, fprint, fprint_len ); rc = lookup_pk( &ctx, pk, NULL ); + get_pubkey_end( &ctx ); } else rc = G10ERR_GENERAL; /* Oops */ @@ -772,10 +786,12 @@ get_keyblock_byfprint( KBNODE *ret_keyblock, const byte *fprint, if( fprint_len == 20 || fprint_len == 16 ) { struct getkey_ctx_s ctx; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.nitems = 1; ctx.items[0].mode = fprint_len; memcpy( ctx.items[0].fprint, fprint, fprint_len ); rc = lookup_pk( &ctx, pk, ret_keyblock ); + get_pubkey_end( &ctx ); } else rc = G10ERR_GENERAL; /* Oops */ @@ -806,10 +822,12 @@ get_seckey_byname( PKT_secret_key *sk, const char *name, int unprotect ) struct getkey_ctx_s ctx; memset( &ctx, 0, sizeof ctx ); + ctx.not_allocated = 1; ctx.primary = 1; ctx.nitems = 1; ctx.items[0].mode = 15; rc = lookup_sk( &ctx, sk, NULL ); + get_seckey_end( &ctx ); } else { add_to_strlist( &namelist, name ); @@ -868,7 +886,8 @@ get_seckey_end( GETKEY_CTX ctx ) enum_keyblocks( 2, &ctx->kbpos, NULL ); /* close */ for(n=0; n < ctx->nitems; n++ ) m_free( ctx->items[n].namebuf ); - m_free( ctx ); + if( !ctx->not_allocated ) + m_free( ctx ); } } @@ -1600,7 +1619,7 @@ lookup_pk( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE *ret_keyblock ) k = find_first( ctx->keyblock, pk ); else if( item->mode == 16 || item->mode == 20 ) k = find_by_fpr( ctx->keyblock, pk, - item->name, item->mode ); + item->fprint, item->mode ); else BUG(); if( k ) { @@ -1687,7 +1706,7 @@ lookup_sk( GETKEY_CTX ctx, PKT_secret_key *sk, KBNODE *ret_keyblock ) k = find_first_sk( ctx->keyblock, sk ); else if( item->mode == 16 || item->mode == 20 ) k = find_by_fpr_sk( ctx->keyblock, sk, - item->name, item->mode ); + item->fprint, item->mode ); else BUG(); if( k ) { diff --git a/g10/keygen.c b/g10/keygen.c index 7431d8c61..12fa9422c 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -83,15 +83,13 @@ keygen_add_std_prefs( PKT_signature *sig, void *opaque ) keygen_add_key_expire( sig, opaque ); - buf[0] = CIPHER_ALGO_BLOWFISH; + buf[0] = CIPHER_ALGO_TWOFISH; buf[1] = CIPHER_ALGO_CAST5; build_sig_subpkt( sig, SIGSUBPKT_PREF_SYM, buf, 2 ); buf[0] = DIGEST_ALGO_RMD160; buf[1] = DIGEST_ALGO_SHA1; - buf[2] = DIGEST_ALGO_TIGER; - buf[3] = DIGEST_ALGO_MD5; - build_sig_subpkt( sig, SIGSUBPKT_PREF_HASH, buf, 4 ); + build_sig_subpkt( sig, SIGSUBPKT_PREF_HASH, buf, 2 ); buf[0] = 2; buf[1] = 1; diff --git a/g10/keylist.c b/g10/keylist.c index 2a471b86c..0bfdb7725 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -169,6 +169,7 @@ list_keyblock( KBNODE keyblock, int secret ) node = find_kbnode( keyblock, secret? PKT_SECRET_KEY : PKT_PUBLIC_KEY ); if( !node ) { log_error("Oops; key lost!\n"); + dump_kbnode( keyblock ); return; } diff --git a/g10/mainproc.c b/g10/mainproc.c index 2e5575dd8..0b3582c50 100644 --- a/g10/mainproc.c +++ b/g10/mainproc.c @@ -252,7 +252,11 @@ proc_plaintext( CTX c, PACKET *pkt ) free_md_filter_context( &c->mfx ); c->mfx.md = md_open( 0, 0); /* fixme: we may need to push the textfilter if we have sigclass 1 - * and no armoring - Not yet tested */ + * and no armoring - Not yet tested + * Hmmm, why don't we need it at all if we have sigclass 1 + * Should we assume that plaintext in mode 't' has always sigclass 1?? + * See: Russ Allbery's mail 1999-02-09 + */ any = clearsig = 0; for(n=c->list; n; n = n->next ) { if( n->pkt->pkttype == PKT_ONEPASS_SIG ) { diff --git a/g10/options.h b/g10/options.h index d7450dba8..39564fb2e 100644 --- a/g10/options.h +++ b/g10/options.h @@ -47,6 +47,7 @@ struct { int def_compress_algo; const char *def_secret_key; int no_comment; + int no_version; int marginals_needed; int completes_needed; int max_cert_depth; diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c index f662c6206..af77a1e52 100644 --- a/g10/pubkey-enc.c +++ b/g10/pubkey-enc.c @@ -31,6 +31,7 @@ #include "trustdb.h" #include "cipher.h" #include "status.h" +#include "options.h" #include "i18n.h" static int get_it( PKT_pubkey_enc *k, @@ -179,9 +180,17 @@ get_it( PKT_pubkey_enc *k, DEK *dek, PKT_secret_key *sk, u32 *keyid ) else if( !pk->local_id && query_trust_record(pk) ) log_error("can't check algorithm against preferences\n"); else if( dek->algo != CIPHER_ALGO_3DES - && !is_algo_in_prefs( pk->local_id, PREFTYPE_SYM, dek->algo ) ) - log_info(_("NOTE: cipher algorithm %d not found in preferences\n"), + && !is_algo_in_prefs( pk->local_id, PREFTYPE_SYM, dek->algo ) ) { + /* Don't print a note while we are not on verbose mode, + * the cipher is blowfish and the preferences have twofish + * listed */ + if( opt.verbose || dek->algo != CIPHER_ALGO_BLOWFISH + || !is_algo_in_prefs( pk->local_id, PREFTYPE_SYM, + CIPHER_ALGO_TWOFISH ) ) + log_info(_( + "NOTE: cipher algorithm %d not found in preferences\n"), dek->algo ); + } free_public_key( pk ); rc = 0; } diff --git a/g10/ringedit.c b/g10/ringedit.c index 4a97f78f8..d5ac6ac77 100644 --- a/g10/ringedit.c +++ b/g10/ringedit.c @@ -72,12 +72,13 @@ struct resource_table_struct { GDBM_FILE dbf; #endif enum resource_type rt; + DOTLOCK lockhd; + int is_locked; }; typedef struct resource_table_struct RESTBL; #define MAX_RESOURCES 10 static RESTBL resource_table[MAX_RESOURCES]; -static const char *keyring_lock; static int search( PACKET *pkt, KBPOS *kbpos, int secret ); @@ -117,15 +118,40 @@ fatal_gdbm_error( const char *string ) #endif /* HAVE_LIBGDBM */ + +/**************** + * Hmmm, how to avoid deadlock? They should not happen if everyone + * locks the key resources in the same order; but who knows. + * A solution is to use only one lock file in the gnupg homedir but + * what will happen with key resources which normally don't belong + * to the gpg homedir? + */ static void -cleanup( void ) +lock_rentry( RESTBL *rentry ) { - if( keyring_lock ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; + if( !rentry->lockhd ) { + rentry->lockhd = create_dotlock( rentry->fname ); + if( !rentry->lockhd ) + log_fatal("can't allocate lock for `%s'\n", rentry->fname ); + rentry->is_locked = 0; + } + if( !rentry->is_locked ) { + if( make_dotlock( rentry->lockhd, -1 ) ) + log_fatal("can't lock `%s'\n", rentry->fname ); + rentry->is_locked = 1; } } +static void +unlock_rentry( RESTBL *rentry ) +{ + if( opt.lock_once ) + return; + if( !release_dotlock( rentry->lockhd ) ) + rentry->is_locked = 0; +} + + /**************************************************************** ****************** public functions **************************** ****************************************************************/ @@ -162,7 +188,6 @@ enum_keyblock_resources( int *sequence, int secret ) int add_keyblock_resource( const char *url, int force, int secret ) { - static int initialized = 0; static int any_secret, any_public; const char *resname = url; IOBUF iobuf = NULL; @@ -171,10 +196,6 @@ add_keyblock_resource( const char *url, int force, int secret ) int rc = 0; enum resource_type rt = rt_UNKNOWN; - if( !initialized ) { - initialized = 1; - atexit( cleanup ); - } /* Do we have an URL? * gnupg-gdbm:filename := this is a GDBM resource @@ -190,7 +211,7 @@ add_keyblock_resource( const char *url, int force, int secret ) rt = rt_GDBM; resname += 11; } - #ifndef __MINGW32__ + #ifndef HAVE_DRIVE_LETTERS else if( strchr( resname, ':' ) ) { log_error("%s: invalid URL\n", url ); rc = G10ERR_GENERAL; @@ -264,7 +285,7 @@ add_keyblock_resource( const char *url, int force, int secret ) if( access(filename, F_OK) ) { if( strlen(filename) >= 7 && !strcmp(filename+strlen(filename)-7, "/.gnupg") ) { - #if __MINGW32__ + #ifdef HAVE_DOSISH_SYSTEM if( mkdir(filename) ) #else if( mkdir(filename, S_IRUSR|S_IWUSR|S_IXUSR) ) @@ -298,10 +319,10 @@ add_keyblock_resource( const char *url, int force, int secret ) else log_info(_("%s: keyring created\n"), filename ); } - #if __MINGW32__ || 1 - /* must close it again */ + #if HAVE_DOSISH_SYSTEM || 1 iobuf_close( iobuf ); iobuf = NULL; + /* must close it again */ #endif break; @@ -1039,7 +1060,7 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf, const char *fname ) kbpos->rt = rt_RING; kbpos->valid = 0; - #if __MINGW32__ || 1 + #if HAVE_DOSISH_SYSTEM || 1 assert(!iobuf); iobuf = iobuf_open( fname ); if( !iobuf ) { @@ -1084,7 +1105,7 @@ keyring_search( PACKET *req, KBPOS *kbpos, IOBUF iobuf, const char *fname ) leave: free_packet(&pkt); set_packet_list_mode(save_mode); - #if __MINGW32__ || 1 + #if HAVE_DOSISH_SYSTEM || 1 iobuf_close(iobuf); #endif return rc; @@ -1276,10 +1297,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) if( kbpos->fp ) BUG(); /* not allowed with such a handle */ - if( !keyring_lock ); - keyring_lock = make_dotlock( rentry->fname, -1 ); - if( !keyring_lock ) - log_fatal("can't lock `%s'\n", rentry->fname ); + lock_rentry( rentry ); /* open the source file */ fp = iobuf_open( rentry->fname ); @@ -1290,10 +1308,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) newfp = iobuf_create( rentry->fname ); if( !newfp ) { log_error(_("%s: can't create: %s\n"), rentry->fname, strerror(errno)); - if( !opt.lock_once ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; - } + unlock_rentry( rentry ); return G10ERR_OPEN_FILE; } else @@ -1305,28 +1320,19 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) log_error("build_packet(%d) failed: %s\n", node->pkt->pkttype, g10_errstr(rc) ); iobuf_cancel(newfp); - if( !opt.lock_once ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; - } + unlock_rentry( rentry ); return G10ERR_WRITE_FILE; } } if( iobuf_close(newfp) ) { log_error("%s: close failed: %s\n", rentry->fname, strerror(errno)); - if( !opt.lock_once ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; - } + unlock_rentry( rentry ); return G10ERR_CLOSE_FILE; } if( chmod( rentry->fname, S_IRUSR | S_IWUSR ) ) { log_error("%s: chmod failed: %s\n", rentry->fname, strerror(errno) ); - if( !opt.lock_once ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; - } + unlock_rentry( rentry ); return G10ERR_WRITE_FILE; } return 0; @@ -1338,7 +1344,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) } /* create the new file */ - #ifdef __MINGW32__ + #ifdef USE_ONLY_8DOT3 /* Here is another Windoze bug?: * you cant rename("pubring.gpg.tmp", "pubring.gpg"); * but rename("pubring.gpg.tmp", "pubring.aaa"); @@ -1451,7 +1457,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) goto leave; } /* if the new file is a secring, restrict the permissions */ - #ifndef __MINGW32__ + #ifndef HAVE_DOSISH_SYSTEM if( rentry->secret ) { if( chmod( tmpfname, S_IRUSR | S_IWUSR ) ) { log_error("%s: chmod failed: %s\n", @@ -1464,7 +1470,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) /* rename and make backup file */ if( !rentry->secret ) { /* but not for secret keyrings */ - #ifdef __MINGW32__ + #ifdef HAVE_DOSISH_SYSTEM remove( bakfname ); #endif if( rename( rentry->fname, bakfname ) ) { @@ -1474,7 +1480,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) goto leave; } } - #ifdef __MINGW32__ + #ifdef HAVE_DOSISH_SYSTEM remove( rentry->fname ); #endif if( rename( tmpfname, rentry->fname ) ) { @@ -1492,10 +1498,7 @@ keyring_copy( KBPOS *kbpos, int mode, KBNODE root ) } leave: - if( !opt.lock_once ) { - release_dotlock( keyring_lock ); - keyring_lock = NULL; - } + unlock_rentry( rentry ); m_free(bakfname); m_free(tmpfname); return rc; diff --git a/g10/signal.c b/g10/signal.c index 364fb47a4..29f99c64b 100644 --- a/g10/signal.c +++ b/g10/signal.c @@ -70,7 +70,7 @@ got_usr_signal( int sig ) caught_sigusr1 = 1; } -#ifndef __MINGW32__ +#ifndef HAVE_DOSISH_SYSTEM static void do_sigaction( int sig, struct sigaction *nact ) { @@ -85,7 +85,7 @@ do_sigaction( int sig, struct sigaction *nact ) void init_signals() { - #ifndef __MINGW32__ + #ifndef HAVE_DOSISH_SYSTEM struct sigaction nact; nact.sa_handler = got_fatal_signal; @@ -100,7 +100,7 @@ init_signals() nact.sa_handler = got_usr_signal; sigaction( SIGUSR1, &nact, NULL ); nact.sa_handler = SIG_IGN; - sigaction( SIGPIPE, &nact, NULL ); + sigaction( SIGPIPE, &nact, NULL ); #endif } @@ -108,7 +108,7 @@ init_signals() void pause_on_sigusr( int which ) { - #ifndef __MINGW32__ + #ifndef HAVE_DOSISH_SYSTEM sigset_t mask, oldmask; assert( which == 1 ); @@ -127,7 +127,7 @@ pause_on_sigusr( int which ) static void do_block( int block ) { - #ifndef __MINGW32__ + #ifndef HAVE_DOSISH_SYSTEM static int is_blocked; static sigset_t oldmask; @@ -146,7 +146,7 @@ do_block( int block ) sigprocmask( SIG_SETMASK, &oldmask, NULL ); is_blocked = 0; } - #endif /*__MINGW32__*/ + #endif /*HAVE_DOSISH_SYSTEM*/ } diff --git a/g10/tdbio.c b/g10/tdbio.c index b69d6c3f0..2eddb4b2d 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -77,7 +77,8 @@ struct cmp_sdir_struct { static char *db_name; -static const char *lockname; +static DOTLOCK lockhandle; +static int is_locked; static int db_fd = -1; static int in_transaction; @@ -236,10 +237,12 @@ put_record_into_cache( ulong recno, const char *data ) int n = dirty_count / 5; /* discard some dirty entries */ if( !n ) n = 1; - if( !lockname ) - lockname = make_dotlock( db_name, -1 ); - if( !lockname ) - log_fatal("can't get a lock - giving up\n"); + if( !is_locked ) { + if( make_dotlock( lockhandle, -1 ) ) + log_fatal("can't acquire lock - giving up\n"); + else + is_locked = 1; + } for( unused = NULL, r = cache_list; r; r = r->next ) { if( r->flags.used && r->flags.dirty ) { int rc = write_cache_item( r ); @@ -254,8 +257,8 @@ put_record_into_cache( ulong recno, const char *data ) } } if( !opt.lock_once ) { - release_dotlock( lockname ); - lockname=NULL; + if( !release_dotlock( lockhandle ) ) + is_locked = 0; } assert( unused ); r = unused; @@ -287,17 +290,20 @@ tdbio_sync() CACHE_CTRL r; int did_lock = 0; + if( db_fd == -1 ) + open_db(); if( in_transaction ) log_bug("tdbio: syncing while in transaction\n"); if( !cache_is_dirty ) return 0; - if( !lockname ) { - lockname = make_dotlock( db_name, -1 ); + if( !is_locked ) { + if( make_dotlock( lockhandle, -1 ) ) + log_fatal("can't acquire lock - giving up\n"); + else + is_locked = 1; did_lock = 1; - if( !lockname ) - log_fatal("can't get a lock - giving up\n"); } for( r = cache_list; r; r = r->next ) { if( r->flags.used && r->flags.dirty ) { @@ -308,8 +314,8 @@ tdbio_sync() } cache_is_dirty = 0; if( did_lock && !opt.lock_once ) { - release_dotlock( lockname ); - lockname=NULL; + if( !release_dotlock( lockhandle ) ) + is_locked = 0; } return 0; } @@ -344,17 +350,19 @@ tdbio_end_transaction() if( !in_transaction ) log_bug("tdbio: no active transaction\n"); - if( !lockname ) - lockname = make_dotlock( db_name, -1 ); - if( !lockname ) - log_fatal("can't get a lock - giving up\n"); + if( !is_locked ) { + if( make_dotlock( lockhandle, -1 ) ) + log_fatal("can't acquire lock - giving up\n"); + else + is_locked = 1; + } block_all_signals(); in_transaction = 0; rc = tdbio_sync(); unblock_all_signals(); if( !opt.lock_once ) { - release_dotlock( lockname ); - lockname=NULL; + if( !release_dotlock( lockhandle ) ) + is_locked = 0; } return rc; } @@ -392,9 +400,9 @@ tdbio_cancel_transaction() static void cleanup(void) { - if( lockname ) { - release_dotlock(lockname); - lockname = NULL; + if( is_locked ) { + if( !release_dotlock(lockhandle) ) + is_locked = 0; } } @@ -428,7 +436,7 @@ tdbio_set_dbname( const char *new_dbname, int create ) if( access( fname, F_OK ) ) { if( strlen(fname) >= 7 && !strcmp(fname+strlen(fname)-7, "/.gnupg" ) ) { - #if __MINGW32__ + #if HAVE_DOSISH_SYSTEM if( mkdir( fname ) ) #else if( mkdir( fname, S_IRUSR|S_IWUSR|S_IXUSR ) ) @@ -450,7 +458,7 @@ tdbio_set_dbname( const char *new_dbname, int create ) fclose(fp); m_free(db_name); db_name = fname; - #ifdef __MINGW32__ + #ifdef HAVE_DOSISH_SYSTEM db_fd = open( db_name, O_RDWR | O_BINARY ); #else db_fd = open( db_name, O_RDWR ); @@ -501,7 +509,10 @@ open_db() TRUSTREC rec; assert( db_fd == -1 ); - #ifdef __MINGW32__ + lockhandle = create_dotlock( db_name ); + if( !lockhandle ) + log_fatal( _("%s: can't create lock\n"), db_name ); + #ifdef HAVE_DOSISH_SYSTEM db_fd = open( db_name, O_RDWR | O_BINARY ); #else db_fd = open( db_name, O_RDWR ); @@ -970,6 +981,8 @@ tdbio_dump_record( TRUSTREC *rec, FILE *fp ) rec->r.uid.prefrec, rec->r.uid.siglist, rec->r.uid.namehash[18], rec->r.uid.namehash[19]); + if( rec->r.uid.uidflags & UIDF_VALVALID ) + fprintf( fp, ", v=%02x", rec->r.uid.validity ); if( rec->r.uid.uidflags & UIDF_CHECKED ) { if( rec->r.uid.uidflags & UIDF_VALID ) fputs(", valid", fp ); @@ -1155,7 +1168,18 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) rec->r.uid.prefrec = buftoulong(p); p += 4; rec->r.uid.siglist = buftoulong(p); p += 4; rec->r.uid.uidflags = *p++; - p ++; + rec->r.uid.validity = *p++; + switch( rec->r.uid.validity ) { + case 0: + case TRUST_UNDEFINED: + case TRUST_NEVER: + case TRUST_MARGINAL: + case TRUST_FULLY: + case TRUST_ULTIMATE: + break; + default: + log_info("lid %lu: invalid validity value - cleared\n", recnum); + } memcpy( rec->r.uid.namehash, p, 20); break; case RECTYPE_PREF: /* preference record */ @@ -1278,7 +1302,7 @@ tdbio_write_record( TRUSTREC *rec ) ulongtobuf(p, rec->r.uid.prefrec); p += 4; ulongtobuf(p, rec->r.uid.siglist); p += 4; *p++ = rec->r.uid.uidflags; - p++; + *p++ = rec->r.uid.validity; memcpy( p, rec->r.uid.namehash, 20 ); p += 20; break; diff --git a/g10/tdbio.h b/g10/tdbio.h index 925c7f93c..62148d361 100644 --- a/g10/tdbio.h +++ b/g10/tdbio.h @@ -59,9 +59,10 @@ #define KEYF_EXPIRED 4 /* this key is expired */ #define KEYF_REVOKED 8 /* this key has been revoked */ -#define UIDF_CHECKED 1 /* user id has been checked - other bits are valid */ -#define UIDF_VALID 2 /* this is a valid user id */ -#define UIDF_REVOKED 8 /* this user id has been revoked */ +#define UIDF_CHECKED 1 /* user id has been checked - other bits are valid */ +#define UIDF_VALID 2 /* this is a valid user id */ +#define UIDF_REVOKED 8 /* this user id has been revoked */ +#define UIDF_VALVALID 16 /* the validity field is valid */ #define SIGF_CHECKED 1 /* signature has been checked - bits 0..6 are valid */ #define SIGF_VALID 2 /* the signature is valid */ @@ -98,7 +99,7 @@ struct trust_record { ulong cacherec; /* the cache record */ byte ownertrust; byte dirflags; - byte validity; /* calculated trustlevel */ + byte validity; /* calculated trustlevel over all uids */ } dir; struct { /* primary public key record */ ulong lid; @@ -114,6 +115,7 @@ struct trust_record { ulong prefrec; /* recno of preference record */ ulong siglist; /* list of valid signatures (w/o self-sig)*/ byte uidflags; + byte validity; /* calculated trustlevel of this uid */ byte namehash[20]; /* ripemd hash of the username */ } uid; struct { /* preference record */ diff --git a/g10/trustdb.c b/g10/trustdb.c index 674240a7b..34890c2da 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -104,6 +104,8 @@ static void release_lid_table( LOCAL_ID_TABLE tbl ); static int ins_lid_table_item( LOCAL_ID_TABLE tbl, ulong lid, unsigned flag ); static int qry_lid_table_flag( LOCAL_ID_TABLE tbl, ulong lid, unsigned *flag ); + + static void print_user_id( const char *text, u32 *keyid ); static void sort_tsl_list( TRUST_SEG_LIST *trust_seg_list ); static int list_sigs( ulong pubkey_id ); @@ -839,42 +841,13 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, ulong rn, uidrn; int marginal=0; int fully=0; - LOCAL_ID_TABLE sigs_seen = NULL; + /*LOCAL_ID_TABLE sigs_seen = NULL;*/ if( depth >= max_depth ) /* max cert_depth reached */ return TRUST_UNDEFINED; - stack[depth].lid = drec->r.dir.lid; - stack[depth].otrust = drec->r.dir.ownertrust; - stack[depth].trust = 0; - { int i; - - for(i=0; i < depth; i++ ) - if( stack[i].lid == drec->r.dir.lid ) - return TRUST_UNDEFINED; /* closed (we already visited this lid) */ - } - if( !qry_lid_table_flag( ultikey_table, drec->r.dir.lid, NULL ) ) { - /* we are at the end of a path */ - TRUST_SEG_LIST tsl; - int i; - - stack[depth].trust = TRUST_ULTIMATE; - stack[depth].otrust = TRUST_ULTIMATE; - if( trust_seg_head ) { - /* we can now put copy our current stack to the trust_seg_list */ - tsl = m_alloc( sizeof *tsl + (depth+1)*sizeof( TRUST_INFO ) ); - for(i=0; i <= depth; i++ ) - tsl->path[i] = stack[i]; - tsl->pathlen = i; - tsl->next = *trust_seg_head; - *trust_seg_head = tsl; - } - return TRUST_ULTIMATE; - } - /* loop over all user-ids */ - if( !all ) - sigs_seen = new_lid_table(); + /*if( !all ) sigs_seen = new_lid_table();*/ for( rn = drec->r.dir.uidlist; rn; rn = uidrn ) { TRUSTREC rec; /* used for uids and sigs */ ulong sigrn; @@ -888,7 +861,36 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, if( (rec.r.uid.uidflags & UIDF_REVOKED) ) continue; /* user id has been revoked */ - /* loop over all signature records */ + stack[depth].lid = drec->r.dir.lid; + stack[depth].otrust = drec->r.dir.ownertrust; + stack[depth].trust = 0; + { int i; + + for(i=0; i < depth; i++ ) + if( stack[i].lid == drec->r.dir.lid ) + return TRUST_UNDEFINED; /* closed (we already visited this lid) */ + } + if( !qry_lid_table_flag( ultikey_table, drec->r.dir.lid, NULL ) ) { + /* we are at the end of a path */ + TRUST_SEG_LIST tsl; + int i; + + stack[depth].trust = TRUST_ULTIMATE; + stack[depth].otrust = TRUST_ULTIMATE; + if( trust_seg_head ) { + /* we can now put copy our current stack to the trust_seg_list */ + tsl = m_alloc( sizeof *tsl + (depth+1)*sizeof( TRUST_INFO ) ); + for(i=0; i <= depth; i++ ) + tsl->path[i] = stack[i]; + tsl->pathlen = i; + tsl->next = *trust_seg_head; + *trust_seg_head = tsl; + } + return TRUST_ULTIMATE; + } + + + /* loop over all signature records of this user id */ for( rn = rec.r.uid.siglist; rn; rn = sigrn ) { int i; @@ -917,11 +919,11 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, } /* visit every signer only once (a signer may have - * signed more than one user ID) */ - if( sigs_seen && ins_lid_table_item( sigs_seen, - rec.r.sig.sig[i].lid, 0) ) - continue; /* we already have this one */ - + * signed more than one user ID) + * if( sigs_seen && ins_lid_table_item( sigs_seen, + * rec.r.sig.sig[i].lid, 0) ) + * continue; we already have this one + */ read_record( rec.r.sig.sig[i].lid, &tmp, 0 ); if( tmp.rectype != RECTYPE_DIR ) { if( tmp.rectype != RECTYPE_SDIR ) @@ -945,8 +947,7 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, /* we have signed this key and only in this special case * we assume that this one is fully trusted */ if( !all ) { - if( sigs_seen ) - release_lid_table( sigs_seen ); + /*if( sigs_seen ) release_lid_table( sigs_seen );*/ return (stack[depth].trust = TRUST_FULLY); } } @@ -962,16 +963,14 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, if( fully >= opt.completes_needed || marginal >= opt.marginals_needed ) { if( !all ) { - if( sigs_seen ) - release_lid_table( sigs_seen ); + /*if( sigs_seen ) release_lid_table( sigs_seen );*/ return (stack[depth].trust = TRUST_FULLY); } } } } } - if( sigs_seen ) - release_lid_table( sigs_seen ); + /*if( sigs_seen ) release_lid_table( sigs_seen ); */ if( all && ( fully >= opt.completes_needed || marginal >= opt.marginals_needed ) ) { return (stack[depth].trust = TRUST_FULLY ); @@ -983,6 +982,145 @@ collect_paths( int depth, int max_depth, int all, TRUSTREC *drec, } +typedef struct { + ulong lid; + ulong uid; +} CERT_ITEM; + +/* structure to hold certification chains. Item[nitems-1] is the + * ultimateley trusted key, item[0] is the key which + * is introduced, indices [1,(nitems-2)] are all introducers. + */ +typedef struct cert_chain *CERT_CHAIN; +struct cert_chain { + CERT_CHAIN next; + int dups; + int nitems; + CERT_ITEM items[1]; +}; + + + +/**************** + * Copy all items to the set SET_HEAD in a way that the requirements + * of a CERT_CHAIN are met. + */ +static void +add_cert_items_to_set( CERT_CHAIN *set_head, CERT_ITEM *items, int nitems ) +{ + CERT_CHAIN ac; + int i; + + ac = m_alloc_clear( sizeof *ac + (nitems-1)*sizeof(CERT_ITEM) ); + ac->nitems = nitems; + for(i=0; i < nitems; i++ ) + ac->items[i] = items[i]; + ac->next = *set_head; + *set_head = ac; +} + + +/**************** + * Find all certification paths of a given LID. + * Limit the search to MAX_DEPTH. stack is a helper variable which + * should have been allocated with size max_depth, stack[0] should + * be setup to the key we are investigating, so the minimal depth + * we should ever see in this function is 1. + * Returns: -1 max_depth reached + * 0 no paths found + * 1 ultimately trusted key found + * certchain_set must be a valid set or point to NULL; this function + * may modifiy it. + */ +static int +find_cert_chain( ulong lid, int depth, int max_depth, + CERT_ITEM *stack, CERT_CHAIN *cert_chain_set ) +{ + TRUSTREC dirrec; + TRUSTREC uidrec; + ulong uidrno; + + if( depth >= max_depth ) + return -1; + + stack[depth].lid = lid; + stack[depth].uid = 0; + + if( !qry_lid_table_flag( ultikey_table, lid, NULL ) ) { + /* this is an ultimately trusted key; + * which means that we have found the end of the chain: + * copy the chain to the set */ + add_cert_items_to_set( cert_chain_set, stack, depth+1 ); + return 1; + } + + + read_record( lid, &dirrec, 0 ); + if( dirrec.rectype != RECTYPE_DIR ) { + if( dirrec.rectype != RECTYPE_SDIR ) + log_debug("lid %lu, has rectype %d" + " - skipped\n", lid, dirrec.rectype ); + return 0; + } + /* Performance hint: add stuff to ignore this one when the + * assigned validity of the key is bad */ + + /* loop over all user ids */ + for( uidrno = dirrec.r.dir.uidlist; uidrno; uidrno = uidrec.r.uid.next ) { + TRUSTREC sigrec; + ulong sigrno; + + stack[depth].uid = uidrno; + read_record( uidrno, &uidrec, RECTYPE_UID ); + + if( !(uidrec.r.uid.uidflags & UIDF_CHECKED) ) + continue; /* user id has not been checked */ + if( !(uidrec.r.uid.uidflags & UIDF_VALID) ) + continue; /* user id is not valid */ + if( (uidrec.r.uid.uidflags & UIDF_REVOKED) ) + continue; /* user id has been revoked */ + + /* loop over all signature records */ + for(sigrno=uidrec.r.uid.siglist; sigrno; sigrno = sigrec.r.sig.next ) { + int i, j; + + read_record( sigrno, &sigrec, RECTYPE_SIG ); + + for(i=0; i < SIGS_PER_RECORD; i++ ) { + if( !sigrec.r.sig.sig[i].lid ) + continue; /* skip deleted sigs */ + if( !(sigrec.r.sig.sig[i].flag & SIGF_CHECKED) ) + continue; /* skip unchecked signatures */ + if( !(sigrec.r.sig.sig[i].flag & SIGF_VALID) ) + continue; /* skip invalid signatures */ + if( (sigrec.r.sig.sig[i].flag & SIGF_EXPIRED) ) + continue; /* skip expired signatures */ + if( (sigrec.r.sig.sig[i].flag & SIGF_REVOKED) ) + continue; /* skip revoked signatures */ + for(j=0; j < depth; j++ ) { + if( stack[j].lid == sigrec.r.sig.sig[i].lid ) + break; + } + if( j < depth ) + continue; /* avoid cycles as soon as possible */ + + if( find_cert_chain( sigrec.r.sig.sig[i].lid, + depth+1, max_depth, + stack, cert_chain_set ) > 0 ) { + /* ultimately trusted key found: + * no need to check more signatures of this uid */ + sigrec.r.sig.next = 0; + break; + } + } + } /* end loop over sig recs */ + } /* end loop over user ids */ + return 0; +} + + + + /**************** * Given the directory record of a key, check whether we can * find a path to an ultimately trusted key. We do this by @@ -1337,6 +1475,7 @@ void list_trust_path( const char *username ) { int rc; + ulong lid; TRUSTREC rec; TRUST_INFO *tmppath; TRUST_SEG_LIST trust_seg_list, tsl, tsl2; @@ -1357,8 +1496,10 @@ list_trust_path( const char *username ) assert( pk->local_id ); } } + lid = pk->local_id; free_public_key( pk ); + #if 0 /* collect the paths */ tmppath = m_alloc_clear( (opt.max_cert_depth+1)* sizeof *tmppath ); trust_seg_list = NULL; @@ -1378,6 +1519,26 @@ list_trust_path( const char *username ) m_free( tsl ); } trust_seg_list = NULL; + #else /* test code */ + { + CERT_ITEM *stack; + CERT_CHAIN chains, r; + int i; + + chains = NULL; + stack = m_alloc_clear( (opt.max_cert_depth+1)* sizeof *stack ); + find_cert_chain( lid, 0, opt.max_cert_depth, stack, &chains); + m_free( stack ); + /* dump chains */ + for(r=chains; r ; r = r->next ) { + printf("chain:" ); + for(i=0; i < r->nitems; i++ ) + printf(" %4lu/%-4lu", r->items[i].lid, r->items[i].uid ); + putchar('\n'); + } + + } + #endif } @@ -2719,15 +2880,17 @@ upd_cert_record( KBNODE keyblock, KBNODE signode, u32 *keyid, continue; /* skip deleted sigs */ } if( rec.r.sig.sig[i].lid == pk_lid ) { + #if 0 /* must take uid into account */ if( found_sig ) { log_info( "sig %08lX.%lu/%02X%02X/%08lX: %s\n", (ulong)keyid[1], lid, uidhash[18], uidhash[19], (ulong)sig->keyid[1], - _("Duplicated certificate - deleted") ); + _("duplicated certificate - deleted") ); rec.r.sig.sig[i].lid = 0; rec.dirty = 1; continue; } + #endif found_sig = 1; } if( !recheck && !revoke && (rec.r.sig.sig[i].flag & SIGF_CHECKED) ) @@ -2811,7 +2974,7 @@ upd_cert_record( KBNODE keyblock, KBNODE signode, u32 *keyid, } } - if( found_sig ) + if( found_sig ) /* fixme: uid stuff */ return; /* at this point, we have verified, that the signature is not in diff --git a/include/ChangeLog b/include/ChangeLog index bfe4dfe98..7f7045738 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * cipher.h (CIPHER_ALGO_TWOFISH): Chnaged ID to 10 and renamed + the old experimenatl algorithm to xx_OLD. + Thu Jan 7 18:00:58 CET 1999 Werner Koch * cipher.h (MD_BUFFER_SIZE): Removed. diff --git a/include/cipher.h b/include/cipher.h index 9cd5b5f3c..55a566264 100644 --- a/include/cipher.h +++ b/include/cipher.h @@ -33,9 +33,10 @@ #define CIPHER_ALGO_BLOWFISH 4 /* blowfish 128 bit key */ #define CIPHER_ALGO_SAFER_SK128 5 #define CIPHER_ALGO_DES_SK 6 +#define CIPHER_ALGO_TWOFISH 10 /* twofish 256 bit */ #define CIPHER_ALGO_BLOWFISH160 42 /* blowfish 160 bit key (not in OpenPGP)*/ #define CIPHER_ALGO_SKIPJACK 101 /* experimental: skipjack */ -#define CIPHER_ALGO_TWOFISH 102 /* experimental: twofish 128 bit */ +#define CIPHER_ALGO_TWOFISH_OLD 102 /* experimental: twofish 128 bit */ #define CIPHER_ALGO_DUMMY 110 /* no encryption at all */ #define PUBKEY_ALGO_RSA 1 @@ -63,11 +64,9 @@ typedef struct { byte key[24]; /* this is the largest used keylen (3des) */ } DEK; +struct cipher_handle_s; typedef struct cipher_handle_s *CIPHER_HANDLE; -#ifndef DEFINES_CIPHER_HANDLE -struct cipher_handle_s { char does_not_matter[1]; }; -#endif #define CIPHER_MODE_ECB 1 #define CIPHER_MODE_CFB 2 @@ -75,6 +74,8 @@ struct cipher_handle_s { char does_not_matter[1]; }; #define CIPHER_MODE_AUTO_CFB 4 #define CIPHER_MODE_DUMMY 5 /* used with algo DUMMY for no encryption */ +struct md_digest_list_s; + typedef struct { int secure; FILE *debug; @@ -85,12 +86,6 @@ typedef struct { } *MD_HANDLE; -#ifndef DEFINES_MD_HANDLE /* not really the handle but the algorithm list */ -struct md_digest_list_s { char does_not_matter[1]; }; -#endif - - - int g10c_debug_mode; int g10_opt_verbose; diff --git a/include/util.h b/include/util.h index 8b8df37e8..6462ddeae 100644 --- a/include/util.h +++ b/include/util.h @@ -127,10 +127,12 @@ const char *strusage( int level ); /*-- dotlock.c --*/ -const char *make_dotlock( const char *file_to_lock, long timeout ); -int release_dotlock( const char *lockfile ); - +struct dotlock_handle; +typedef struct dotlock_handle *DOTLOCK; +DOTLOCK create_dotlock( const char *file_to_lock ); +int make_dotlock( DOTLOCK h, long timeout ); +int release_dotlock( DOTLOCK h ); /*-- fileutil.c --*/ diff --git a/po/ChangeLog b/po/ChangeLog index 42e83fb2c..01a6913d1 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,3 +1,7 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * pl.po: New version. + Wed Jan 20 21:40:21 CET 1999 Werner Koch * es_ES.po: Import of new version. diff --git a/po/pl.po b/po/pl.po index d81cb593b..76f0057d2 100644 --- a/po/pl.po +++ b/po/pl.po @@ -1,26 +1,20 @@ -# GNU PG polish translation +# GNU PG polish translation # Copyright (C) 1998 Free Software Foundation, Inc. # Janusz A. Urbanowicz , 1998. # # msgid "" msgstr "" -"Project-Id-Version: gnupg-0.4.0\n" -"POT-Creation-Date: 1999-01-20 22:45+0100\n" -"PO-Revision-Date: 1998-12-24 03:12+01:00\n" +"Project-Id-Version: gnupg-0.9.2\n" +"POT-Creation-Date: 1999-01-25 23:23+0100\n" +"PO-Revision-Date: 1999-01-26 01:30+01:00\n" "Last-Translator: Janusz A. Urbanowicz \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" -"Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments " -"--keyword=_ --keyword=N_ --files-from=./POTFILES.in\n" -"Files: util/secmem.c util/argparse.c cipher/random.c cipher/rand-dummy.c " -"cipher/rand-unix.c cipher/rand-w32.c g10/g10.c g10/pkclist.c g10/keygen.c " -"g10/decrypt.c g10/encode.c g10/import.c g10/keyedit.c g10/keylist.c " -"g10/mainproc.c g10/passphrase.c g10/plaintext.c g10/pref.c g10/seckey-cert.c " -"g10/sig-check.c g10/sign.c g10/trustdb.c g10/verify.c g10/status.c " -"g10/pubkey-enc.c\n" +"Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments --keywor\\d=_ --keyword=N_ --files-from=./POTFILES.in\n" +"Files: util/secmem.c util/argparse.c cipher/random.c cipher/rand-dummy.c cipher\\/rand-unix.c cipher/rand-w32.c g10/g10.c g10/pkclist.c g10/keygen.c g10/decrypt\\.c g10/encode.c g10/import.c g10/keyedit.c g10/keylist.c g10/mainproc.c g10/pas\\sphrase.c g10/plaintext.c g10/pref.c g10/seckey-cert.c g10/sig-check.c g10/sign\\.c g10/trustdb.c g10/verify.c g10/status.c g10/pubkey-enc.c\n" #: util/secmem.c:77 msgid "Warning: using insecure memory!\n" @@ -36,231 +30,206 @@ msgstr "tT" #: util/errors.c:54 msgid "general error" -msgstr "" +msgstr "błąd ogólny" #: util/errors.c:55 msgid "unknown packet type" -msgstr "" +msgstr "nieznany rodzaj pakietu" #: util/errors.c:56 msgid "unknown version" -msgstr "" +msgstr "nieznana wersja" #: util/errors.c:57 msgid "unknown pubkey algorithm" -msgstr "" +msgstr "nieznany algorytm klucza publicznego" #: util/errors.c:58 msgid "unknown digest algorithm" -msgstr "" +msgstr "nieznany algorytm skrótu" #: util/errors.c:59 -#, fuzzy msgid "bad public key" -msgstr "brak domyślnego zbioru kluczy publicznych\n" +msgstr "niepoprawny klucz publiczny" #: util/errors.c:60 -#, fuzzy msgid "bad secret key" -msgstr "lista kluczy tajnych" +msgstr "niepoprawny klucz prywatny" #: util/errors.c:61 -#, fuzzy msgid "bad signature" -msgstr "1 niepoprawny podpis\n" +msgstr "niepoprawny podpis" #: util/errors.c:62 msgid "checksum error" -msgstr "" +msgstr "błąd sumy kontrolnej" #: util/errors.c:63 -#, fuzzy msgid "bad passphrase" -msgstr "Proszę powtórzyć wyrażenie przejściowe: " +msgstr "niepoprawne wyrażenie przejściowe" #: util/errors.c:64 -#, fuzzy msgid "public key not found" -msgstr "klucz %08lX: brak klucza publicznegoL %s\n" +msgstr "klucz publiczny nie odnaleziony" #: util/errors.c:65 -#, fuzzy msgid "unknown cipher algorithm" -msgstr "|NAZWA|algorytm szyfrujący NAZWA" +msgstr "nieznany algorytm szyfrujący" #: util/errors.c:66 -#, fuzzy msgid "can't open the keyring" -msgstr "nie mogę zapisać zbioru kluczy\n" +msgstr "otwarcie zbioru kluczy jest niemożliwe" #: util/errors.c:67 -#, fuzzy msgid "invalid packet" -msgstr "niepoprawna wartość\n" +msgstr "niepoprawny pakiet" #: util/errors.c:68 -#, fuzzy msgid "invalid armor" -msgstr "niepoprawna wartość\n" +msgstr "błąd w opakowaniu ASCII" #: util/errors.c:69 -#, fuzzy msgid "no such user id" -msgstr "Brak takiego identyfikatora użytkownika.\n" +msgstr "brak takiego identyfikatora użytkownika." #: util/errors.c:70 -#, fuzzy msgid "secret key not available" -msgstr "Dostępny jest klucz tajny.\n" +msgstr "klucz tajny jest niedostępny" #: util/errors.c:71 -#, fuzzy msgid "wrong secret key used" -msgstr "lista kluczy tajnych" +msgstr "został użyty niewłaściwy klucz tajny" #: util/errors.c:72 msgid "not supported" -msgstr "" +msgstr "nie jet obsługiwany" #: util/errors.c:73 -#, fuzzy msgid "bad key" -msgstr "dodkl" +msgstr "klucz niepoprawny" #: util/errors.c:74 -#, fuzzy msgid "file read error" -msgstr "błąd odczytu: %s\n" +msgstr "błąd przy odczycie pliku" #: util/errors.c:75 msgid "file write error" -msgstr "" +msgstr "błąd przy zapisie pliku" #: util/errors.c:76 -#, fuzzy msgid "unknown compress algorithm" -msgstr "|N|algorytm kompresji N" +msgstr "nieznany algorytm kompresji" #: util/errors.c:77 msgid "file open error" -msgstr "" +msgstr "błąd przy otwieraniu pliku" #: util/errors.c:78 msgid "file create error" -msgstr "" +msgstr "błąd przy tworzeniu pliku" #: util/errors.c:79 -#, fuzzy msgid "invalid passphrase" -msgstr "Wyrażenie przejściowe: " +msgstr "niepoprawne wyrażenie przejściowe" #: util/errors.c:80 -#, fuzzy msgid "unimplemented pubkey algorithm" -msgstr "" -"klucz %08lX: nie obsługiwany algorytm szyfrowania z kluczem publicznym\n" +msgstr "algorytm szyfrowania z kluczem publicznym nie jest zaimplementowany" #: util/errors.c:81 -#, fuzzy msgid "unimplemented cipher algorithm" -msgstr "wybrany algorytm szyfrujący jest niepoprawny\n" +msgstr "algorytm szyfrujący nie jest zaimplementowany." #: util/errors.c:82 msgid "unknown signature class" -msgstr "" +msgstr "nieznana klasa podpisu" #: util/errors.c:83 msgid "trust database error" -msgstr "" +msgstr "błąd w bazie zaufania" #: util/errors.c:84 msgid "bad MPI" -msgstr "" +msgstr "błąd MPI" #: util/errors.c:85 msgid "resource limit" -msgstr "" +msgstr "ograniczenie zasobów" #: util/errors.c:86 -#, fuzzy msgid "invalid keyring" -msgstr "niepoprawna wartość\n" +msgstr "błąd w zbiorze kluczy" #: util/errors.c:87 msgid "bad certificate" -msgstr "" +msgstr "niepoprawny certyfikat" #: util/errors.c:88 -#, fuzzy msgid "malformed user id" -msgstr "dodanie nowego identyfikatora użytkownika do klucza" +msgstr "błąd formatu indentyfikatora użytkownika" #: util/errors.c:89 msgid "file close error" -msgstr "" +msgstr "błąd przy zamykaniu pliku" #: util/errors.c:90 msgid "file rename error" -msgstr "" +msgstr "błąd przy zmianie nazwy pliku" #: util/errors.c:91 msgid "file delete error" -msgstr "" +msgstr "błąd przy usuwaniu pliku" #: util/errors.c:92 msgid "unexpected data" -msgstr "" +msgstr "nieoczekiowane dane" #: util/errors.c:93 msgid "timestamp conflict" -msgstr "" +msgstr "konflikt znaczników czasu" #: util/errors.c:94 -#, fuzzy msgid "unusable pubkey algorithm" -msgstr "|N|algorytm kompresji N" +msgstr "nieużyteczny algorytm z kluczem publicznym" #: util/errors.c:95 -#, fuzzy msgid "file exists" -msgstr "Plik `%s' już istnieje. " +msgstr "plik już istnieje" #: util/errors.c:96 msgid "weak key" -msgstr "" +msgstr "klucz słaby" #: util/errors.c:97 -#, fuzzy msgid "invalid argument" -msgstr "niepoprawna wartość\n" +msgstr "błędny argument" #: util/errors.c:98 msgid "bad URI" -msgstr "" +msgstr "niepoprawny URI" #: util/errors.c:99 msgid "unsupported URI" -msgstr "" +msgstr "URI nie obsługiwanego typu" #: util/errors.c:100 msgid "network error" -msgstr "" +msgstr "błąd sieci" #: util/logger.c:178 #, c-format msgid "... this is a bug (%s:%d:%s)\n" -msgstr "" +msgstr "... to jest błąd w programie (%s:%d:%s)\n" #: util/logger.c:184 #, c-format msgid "you found a bug ... (%s:%d)\n" -msgstr "" +msgstr "znalazłeś(aś) błąd w programie ... (%s:%d)\n" #: cipher/random.c:412 -#, fuzzy msgid "WARNING: using insecure random number generator!!\n" msgstr "" -"ostrzeżenie: używany generator liczb losowych\n" +"OSTRZEŻENIE: używany generator liczb losowych\n" "nie jest kryptograficznie bezpieczny!!\n" #: cipher/random.c:413 @@ -371,7 +340,7 @@ msgstr "eksport kluczy do pliku" #: g10/g10.c:189 msgid "export keys to a key server" -msgstr "" +msgstr "eksport kluczy do serwera kluczy" #: g10/g10.c:192 msgid "import/merge keys" @@ -383,22 +352,15 @@ msgstr "wypisane sekwencji pakiet #: g10/g10.c:197 msgid "export the ownertrust values" -msgstr "" -"Przypisanie tych wartości należy do Ciebie, nie będą one udostępnione\n" -"nikomu innemu. Są one używane do stworzenia sieci zaufania i nie ma\n" -"to nic wspólnego z tworzoną siecią certyfikatów." +msgstr "eksport wartości zaufania" #: g10/g10.c:199 msgid "import ownertrust values" -msgstr "" -"Przypisanie tych wartości należy do Ciebie, nie będą one udostępnione\n" -"nikomu innemu. Są one używane do stworzenia sieci zaufania i nie ma\n" -"to nic wspólnego z tworzoną siecią certyfikatów." +msgstr "wczytanie wartośći zaufania" #: g10/g10.c:201 -#, fuzzy msgid "|[NAMES]|update the trust database" -msgstr "|[NAZWY]|sprawdzenie bazy zaufania" +msgstr "|[NAZWY]|naniesienie poprawek do bazy zaufania" #: g10/g10.c:203 msgid "|[NAMES]|check the trust database" @@ -406,7 +368,7 @@ msgstr "|[NAZWY]|sprawdzenie bazy zaufania" #: g10/g10.c:204 msgid "fix a corrupted trust database" -msgstr "" +msgstr "naprawa uszkodzonej Bazy Zaufania" #: g10/g10.c:205 msgid "De-Armor a file or stdin" @@ -440,7 +402,7 @@ msgstr "plik wynikowy w opakowaniu ASCII" #: g10/g10.c:219 msgid "use this user-id to sign or decrypt" -msgstr "użyć tego identyfikatora do podpisania lub odszyfrowania" +msgstr "identyfikator do podpisania lub odszyfrowania" #: g10/g10.c:220 msgid "use this user-id for encryption" @@ -464,12 +426,11 @@ msgstr "z informacjami dodatkowymi" #: g10/g10.c:227 msgid "be somewhat more quiet" -msgstr "" +msgstr "mniej komunikatóww" #: g10/g10.c:228 -#, fuzzy msgid "force v3 signatures" -msgstr "sprawdzenie podpisów kluczy" +msgstr "wymuszenie trzeciej wersji formatu podpisów" #. { oDryRun, "dry-run", 0, N_("do not make any changes") }, #: g10/g10.c:230 @@ -498,12 +459,11 @@ msgstr "|NAZWA|u #: g10/g10.c:236 msgid "|HOST|use this keyserver to lookup keys" -msgstr "" +msgstr "|HOST|serwer kluczy w którym będą poszukiwane" #: g10/g10.c:237 -#, fuzzy msgid "|NAME|set terminal charset to NAME" -msgstr "|NAZWA|algorytm szyfrujący NAZWA" +msgstr "|NAZWA|zestaw znaków terminala NAZWA" #: g10/g10.c:238 msgid "read options from file" @@ -535,31 +495,27 @@ msgstr "(domy #: g10/g10.c:247 msgid "|KEYID|ulimately trust this key" -msgstr "" +msgstr "|KLUCZ|całkowite zaufanie dla tego klucza" #: g10/g10.c:248 -#, fuzzy msgid "|FILE|load extension module FILE" -msgstr "|plik|ładowanie modułu rozszerzenia" +msgstr "|PLIK|ładowanie modułu rozszerzenia z PLIK" #: g10/g10.c:249 msgid "emulate the mode described in RFC1991" msgstr "emulacja trybu opisanego w RFC1991" #: g10/g10.c:250 -#, fuzzy msgid "|N|use passphrase mode N" -msgstr "Wyrażenie przejściowe: " +msgstr "|N|N-ty tryb wprowadzania wyrażenia przejściowego" #: g10/g10.c:252 -#, fuzzy msgid "|NAME|use message digest algorithm NAME for passphrases" -msgstr "|NAZWA|algorytm obliczania skrótów wiadomości NAZWA" +msgstr "|ALG|algorytm obliczania skrótów wiadomości ALG" #: g10/g10.c:254 -#, fuzzy msgid "|NAME|use cipher algorithm NAME for passphrases" -msgstr "|NAZWA|algorytm szyfrujący NAZWA" +msgstr "|ALG|algorytmu szyfrujący ALG dla hasła" #: g10/g10.c:256 msgid "|NAME|use cipher algorithm NAME" @@ -575,10 +531,9 @@ msgstr "|N|algorytm kompresji N" #: g10/g10.c:259 msgid "throw keyid field of encrypted packets" -msgstr "usunięcie identyfikatora klucza zaszyfrowanych pakietów" +msgstr "usunięcie identyfikatorów kluczy pakietów" #: g10/g10.c:267 -#, fuzzy msgid "" "@\n" "Examples:\n" @@ -592,13 +547,12 @@ msgstr "" "@\n" "Przykłady:\n" "\n" -" -se -r Bob [plik] podpisanie i zaszyfrowanie kluczem Boba\n" -" -sat [plik] podpisanie z pozostawieniem czytelnego " -"dokumentu\n" -" -sb [plik] podpisanie z umieszczeniem podpisu w osobnym " +" -se -r Bob [plik] podpisać i zaszyfrować kluczem Boba\n" +" --clearsign [plik] podpisać z pozostawieniem czytelności dokumentu\n" +" --detach-sign [plik] podpisać z umieszczeniem podpisu w osobnym " "pliku\n" -" -k [identyfikator] pokazuje klucz\n" -" -kc [identyfikator] pokazuje odcisk klucza\n" +" --list-keys [nazwy] pokazuje klucze\n" +" --fingerprint [nazwy] pokazuje odciski kluczy\n" #: g10/g10.c:346 msgid "Please report bugs to .\n" @@ -613,13 +567,12 @@ msgid "Usage: gpg [options] [files] (-h for help)" msgstr "Sposób użycia: gpg [opcje] [pliki] (-h podaje pomoc)" #: g10/g10.c:358 -#, fuzzy msgid "" "Syntax: gpgm [options] [files]\n" "GnuPG maintenance utility\n" msgstr "" "Składnia: gpgm [opcje] [pliki]\n" -"GNUPG program obsługujący\n" +"GnuPG program obsługujący\n" #: g10/g10.c:361 msgid "" @@ -627,7 +580,7 @@ msgid "" "sign, check, encrypt or decrypt\n" "default operation depends on the input data\n" msgstr "" -"Składnia: gpg [opcje] [pliki]\\n\n" +"Składnia: gpg [opcje] [pliki]\n" "podpisywanie, sprawdzanie podpisów, szyfrowanie, deszyfrowanie\n" "domyślnie wykonywana operacja zależy od danych wejściowych\n" @@ -652,24 +605,24 @@ msgid "conflicting commands\n" msgstr "sprzeczne polecenia\n" #: g10/g10.c:623 -#, fuzzy, c-format +#, c-format msgid "NOTE: no default option file `%s'\n" -msgstr "uwaga: brak domyślnego pliku opcji '%s\"\n" +msgstr "UWAGA: brak domyślnego pliku opcji '%s'\n" #: g10/g10.c:627 #, c-format msgid "option file `%s': %s\n" -msgstr "plik opcji `%s': %s\n" +msgstr "plik opcji '%s': %s\n" #: g10/g10.c:634 #, c-format msgid "reading options from `%s'\n" -msgstr "odczyt opcji z `%s'\n" +msgstr "odczyt opcji z '%s'\n" #: g10/g10.c:788 -#, fuzzy, c-format +#, c-format msgid "%s is not a valid character set\n" -msgstr "Niewłaściwy znak w komentarzu\n" +msgstr "%s nie jest poprawną nazwą zestawu znaków\n" #: g10/g10.c:824 g10/g10.c:836 msgid "selected cipher algorithm is invalid\n" @@ -686,23 +639,23 @@ msgstr "ustawienie algortytmu kompresji musi pochodzi #: g10/g10.c:847 msgid "completes-needed must be greater than 0\n" -msgstr "opcja completes-needed musi być ustawiona na wartość większą od 0\n" +msgstr "wartość completes-needed musi być większa od 0\n" #: g10/g10.c:849 msgid "marginals-needed must be greater than 1\n" -msgstr "opcja marginals-needed musi być ustawiona na wartość większą od 1\n" +msgstr "wartość marginals-needed musi być większa od 1\n" #: g10/g10.c:851 msgid "max-cert-depth must be in range 1 to 255\n" -msgstr "" +msgstr "wartość max-cert-depth musi mieścić się w zakresie od 1 do 255\n" #: g10/g10.c:854 msgid "NOTE: simple S2K mode (0) is strongly discouraged\n" -msgstr "" +msgstr "UWAGA: prosty tryb S2K (0) jest stanowczo odradzany\n" #: g10/g10.c:858 msgid "invalid S2K mode; must be 0, 1 or 3\n" -msgstr "" +msgstr "Niepoprawny tryb S2K; musi mieć wartość 0, 1 lub 3\n" #: g10/g10.c:941 #, c-format @@ -738,9 +691,8 @@ msgid "--decrypt [filename]" msgstr "--decrypt [plik]" #: g10/g10.c:1024 -#, fuzzy msgid "--edit-key username [commands]" -msgstr "--edit-key nazwa użytkownika" +msgstr "--edit-key nazwa użytkownika [polecenia]" #: g10/g10.c:1040 msgid "--delete-secret-key username" @@ -772,7 +724,7 @@ msgstr "Opakowywanie ASCII nie powiod #: g10/g10.c:1212 #, c-format msgid "invalid hash algorithm `%s'\n" -msgstr "niewłaściwy algorytm skrótu `%s'\n" +msgstr "niewłaściwy algorytm skrótu '%s'\n" #: g10/g10.c:1291 msgid "[filename]" @@ -780,95 +732,95 @@ msgstr "[nazwa pliku]" #: g10/g10.c:1295 msgid "Go ahead and type your message ...\n" -msgstr "" +msgstr "Wpisz tutaj swoją wiadomość ...\n" #: g10/decrypt.c:59 g10/g10.c:1298 g10/verify.c:66 #, c-format msgid "can't open `%s'\n" -msgstr "nie mogę otworzyć '%s\"\n" +msgstr "nie mogę otworzyć '%s'\n" #: g10/armor.c:297 -#, fuzzy, c-format +#, c-format msgid "armor: %s\n" -msgstr "błąd odczytu: %s\n" +msgstr "opakowanie: %s\n" #: g10/armor.c:320 msgid "invalid armor header: " -msgstr "" +msgstr "Niepoprawny nagłówek opakowania: " #: g10/armor.c:327 msgid "armor header: " -msgstr "" +msgstr "nagłówek opakowania: " #: g10/armor.c:338 -#, fuzzy msgid "invalid clearsig header\n" -msgstr "Niewłaściwy znak w imieniu lub nazwisku\n" +msgstr "niewłaściwy nagłówek czytelnego podpisanego dokumentu\n" #: g10/armor.c:390 -#, fuzzy msgid "nested clear text signatures\n" -msgstr "|[plik]|złożenie podpisu na czytelnym dokumencie" +msgstr "zagnieżdżone podpisy na czytelnym dokumencie\n" #: g10/armor.c:508 msgid "invalid dash escaped line: " -msgstr "" +msgstr "niepoprawne oznaczenie linii minusami:" #: g10/armor.c:516 msgid "unexpected armor:" -msgstr "" +msgstr "nieoczekiwane opakowanie:" #: g10/armor.c:632 -#, fuzzy, c-format +#, c-format msgid "invalid radix64 character %02x skipped\n" -msgstr "Niewłaściwy znak w imieniu lub nazwisku\n" +msgstr "niewłaściwy znak formatu radix64 %02x został pominięty\n" #: g10/armor.c:675 msgid "premature eof (no CRC)\n" -msgstr "" +msgstr "przewczesny koniec pliku (brak CRC)\n" #: g10/armor.c:709 msgid "premature eof (in CRC)\n" -msgstr "" +msgstr "przedwczesny koniec pliku (w CRC)\n" #: g10/armor.c:713 msgid "malformed CRC\n" -msgstr "" +msgstr "błąd formatu CRC\n" #: g10/armor.c:717 #, c-format msgid "CRC error; %06lx - %06lx\n" -msgstr "" +msgstr "Błąd sumy CRC; %06lx - %06lx\n" #: g10/armor.c:734 msgid "premature eof (in Trailer)\n" -msgstr "" +msgstr "przedwczesny koniec pliku (w linii kończącej)\n" #: g10/armor.c:738 msgid "error in trailer line\n" -msgstr "" +msgstr "błąd w linii kończącej\n" #: g10/armor.c:999 msgid "no valid OpenPGP data found.\n" -msgstr "" +msgstr "nie odnaleziono poprawnych danych w formacie OpenPGP.\n" #: g10/armor.c:1001 #, c-format msgid "invalid armor: line longer than %d characters\n" -msgstr "" +msgstr "błąd opakowania: linia dłuższa niż %d znaków\n" #: g10/armor.c:1005 msgid "" "quoted printable character in armor - probably a buggy MTA has been used\n" msgstr "" +"znak kodowania quoted-printable w opakowaniu ASCII - prawdopodobnie\n" +"przekłamanie wprowadzone przez program transportowy poczty\n" #: g10/pkclist.c:138 -#, fuzzy, c-format +#, c-format msgid "" "No trust value assigned to %lu:\n" "%4u%c/%08lX %s \"" msgstr "" -"Brak definicji zaufania właściciela dla %lu:\n" +"Brak wartości zaufania dla %lu:\n" "%4u%c/%08lX %s \"" #: g10/pkclist.c:148 @@ -900,13 +852,12 @@ msgstr " p = powr #: g10/pkclist.c:159 msgid " q = quit\n" -msgstr "" +msgstr "w = wyjście\n" #. a string with valid answers #: g10/pkclist.c:164 -#, fuzzy msgid "sSmMqQ" -msgstr "iIpP" +msgstr "iIpPwW" #: g10/pkclist.c:168 msgid "Your decision? " @@ -914,7 +865,7 @@ msgstr "Twoja decyzja? " #: g10/pkclist.c:188 msgid "Certificates leading to an ultimately trusted key:\n" -msgstr "" +msgstr "Certyfikaty prowadzące do ostatecznie zaufanego klucza:\n" #: g10/pkclist.c:223 msgid "" @@ -931,43 +882,48 @@ msgid "" "No path leading to one of our keys found.\n" "\n" msgstr "" +"Brak ścieżki prowadzącej do któregoś z naszych kluczy.\n" +"\n" #: g10/pkclist.c:263 msgid "" "No certificates with undefined trust found.\n" "\n" msgstr "" +"Brak certyfikatów o niezdefiniowanym poziomie zaufania.\n" +"\n" #: g10/pkclist.c:265 -#, fuzzy msgid "" "No trust values changed.\n" "\n" -msgstr "Parametry zaufania właściciela nie zostały zmienione.\n" +msgstr "" +"Parametry zaufania nie zostały zmienione.\n" +"\n" #: g10/pkclist.c:280 -#, fuzzy, c-format +#, c-format msgid "key %08lX: key has been revoked!\n" -msgstr "klucz %08lX: pozostawiony bez zmian\n" +msgstr "klucz %08lX: klucz został unieważniony!\n" #: g10/pkclist.c:286 g10/pkclist.c:381 msgid "Use this key anyway? " msgstr "Użyć tego klucza pomimo to? " #: g10/pkclist.c:308 -#, fuzzy, c-format +#, c-format msgid "%08lX: key has expired\n" -msgstr "Uwaga: Data ważności tego klucza upłynęła!\n" +msgstr "%08lX: data ważności klucza upłynęła\n" #: g10/pkclist.c:314 #, c-format msgid "%08lX: no info to calculate a trust probability\n" -msgstr "" +msgstr "%08lX: brak informacji aby obliczyć prawdopodobieństwo zaufania\n" #: g10/pkclist.c:332 -#, fuzzy, c-format +#, c-format msgid "%08lX: We do NOT trust this key\n" -msgstr "OSTRZEŻENIE: Nie ufamy temu kluczowi!\n" +msgstr "%08lX: OSTRZEŻENIE: Nie ufamy temu kluczowi!\n" #: g10/pkclist.c:338 #, c-format @@ -975,14 +931,17 @@ msgid "" "%08lX: It is not sure that this key really belongs to the owner\n" "but it is accepted anyway\n" msgstr "" +"%08lX: Nie ma pewnośći że ten klucz faktycznie należy do odoby podającej\n" +"się za jego właściciela, ale jest akceptowalny.\n" #: g10/pkclist.c:344 msgid "This key probably belongs to the owner\n" msgstr "" +"Ten klucz prawdopodobnie należy do osoby podającej się za jego właściciela.\n" #: g10/pkclist.c:349 msgid "This key belongs to us\n" -msgstr "" +msgstr "Ten klucz należy do nas\n" #: g10/pkclist.c:376 msgid "" @@ -1019,8 +978,7 @@ msgstr "OSTRZE msgid "" " There is no indication that the signature belongs to the owner.\n" msgstr "" -" Nic nie wskazuje na to że ten podpis należy do właściciela " -"klucza.\n" +" Nic nie wskazuje na to że ten podpis złożył właściciel klucza.\n" #: g10/pkclist.c:468 msgid "WARNING: We do NOT trust this key!\n" @@ -1097,12 +1055,12 @@ msgstr " (%d) DSA (tylko do podpisywania)\n" #: g10/keygen.c:393 #, c-format msgid " (%d) ElGamal (encrypt only)\n" -msgstr " (%d) Klucz dla algorytmu ElGamala (tylko szyfrowanie)\n" +msgstr " (%d) Klucz dla algorytmu ElGamala (tylko do szyfrowanie)\n" #: g10/keygen.c:394 #, c-format msgid " (%d) ElGamal (sign and encrypt)\n" -msgstr " (%d) Klucz dla algorytmu ElGamala (szyfrowanie i podpisywanie)\n" +msgstr " (%d) Klucz dla algorytmu ElGamala (do szyfrowania i podpisywania)\n" #: g10/keygen.c:396 #, c-format @@ -1115,9 +1073,8 @@ msgid "Your selection? " msgstr "Twój wybór? " #: g10/keygen.c:411 -#, fuzzy msgid "Do you really want to create a sign and encrypt key? " -msgstr "Czy na pewno chcesz usunąć wybrane klucze? " +msgstr "Czy na pewno chcesz stworzyć klucz do szyfrowania i podpisywania? " #: g10/keygen.c:432 msgid "Invalid selection.\n" @@ -1154,7 +1111,7 @@ msgid "" "computations take REALLY long!\n" msgstr "" "Klucze dłuższe niż 2048 bitów są odradzane ponieważ obliczenia\n" -"potrzebne do ich wygenerowania trwają BARDZO długo!\n" +"trwają wtedy BARDZO długo!\n" #: g10/keygen.c:464 msgid "Are you sure that you want this keysize? " @@ -1233,7 +1190,7 @@ msgstr "" "Musisz określić identyfikator użytkownika aby można było rozpoznać twój\n" "klucz; program złoży go z twojego imienia i nazwiska, komentarza i adresu\n" "poczty elektronicznej. Będzie on miał taką postać:\n" -" \"Jan Kowalski (Ziutek) \"\n" +" \"Tadeusz Żeleński (Boy) \"\n" "\n" #: g10/keygen.c:595 @@ -1262,7 +1219,7 @@ msgstr "To nie jest poprawny adres poczty elektronicznej\n" #: g10/keygen.c:631 msgid "Comment: " -msgstr "Komentarz:" +msgstr "Komentarz: " #: g10/keygen.c:637 msgid "Invalid character in comment\n" @@ -1294,7 +1251,7 @@ msgid "" "You need a Passphrase to protect your secret key.\n" "\n" msgstr "" -"Musisz podać wyrażenie przejściowe (hasło) aby ochronić swók klucz tajny.\n" +"Musisz podać wyrażenie przejściowe (hasło) aby ochronić swój klucz tajny.\n" #: g10/keyedit.c:389 g10/keygen.c:730 msgid "passphrase not correctly repeated; try again.\n" @@ -1345,27 +1302,24 @@ msgstr "Procedura generacji klucza zosta #: g10/keygen.c:851 #, c-format msgid "writing public certificate to `%s'\n" -msgstr "zapisuję certyfikat publiczny w `%s'\n" +msgstr "zapisuję certyfikat publiczny w '%s'\n" #: g10/keygen.c:852 #, c-format msgid "writing secret certificate to `%s'\n" -msgstr "zapisuję certyfikat prywatny w `%s'\n" +msgstr "zapisuję certyfikat prywatny w '%s'\n" #: g10/keygen.c:929 msgid "public and secret key created and signed.\n" msgstr "Prywatny i publiczny klucz został stworzony i podpisany.\n" #: g10/keygen.c:931 -#, fuzzy msgid "" "Note that this key cannot be used for encryption. You may want to use\n" "the command \"--edit-key\" to generate a secondary key for this purpose.\n" msgstr "" -"Uwaga: ten klucz nie może być wykorzystany do szyfrowania. Jeśli chcesz \n" -"użyć go do szyfrowania, musisz komendą \"--add-key\" dodać do niego " -"podklucz\n" -"do obsługi szyfrowania i deszyfrowania.\n" +"Ten klucz nie może być wykorzystany do szyfrowania. Komendą \"--edit-key\" \n" +"można dodać do niego podklucz używany do szyfrowania.\n" #: g10/keygen.c:945 g10/keygen.c:1044 #, c-format @@ -1373,19 +1327,19 @@ msgid "Key generation failed: %s\n" msgstr "Generacja klucza nie powiodła się: %s\n" #: g10/keygen.c:989 g10/sig-check.c:172 g10/sign.c:52 -#, fuzzy, c-format +#, c-format msgid "" "key has been created %lu second in future (time warp or clock problem)\n" msgstr "" -"Klucz publiczny został stworzony w przyszłości (zaburzenia \n" +"klucz został stworzony %lu sekundę w przyszłości (zaburzenia\n" "czasoprzestrzeni, lub źle ustawiony zegar systemowy)\n" #: g10/keygen.c:991 g10/sig-check.c:174 g10/sign.c:54 -#, fuzzy, c-format +#, c-format msgid "" "key has been created %lu seconds in future (time warp or clock problem)\n" msgstr "" -"Klucz publiczny został stworzony w przyszłości (zaburzenia \n" +"klucz został stworzony %lu sekund w przyszłości (zaburzenia\n" "czasoprzestrzeni, lub źle ustawiony zegar systemowy)\n" #: g10/keygen.c:1022 @@ -1404,52 +1358,51 @@ msgid "error creating passphrase: %s\n" msgstr "błąd podczs tworzenia wyrażenia przejściowego (hasła): %s\n" #: g10/encode.c:155 g10/encode.c:269 -#, fuzzy, c-format +#, c-format msgid "%s: WARNING: empty file\n" -msgstr "%s: ostrzeżenie: plik jest pusty\n" +msgstr "%s: OSTRZEŻENIE: plik jest pusty\n" #: g10/encode.c:222 #, c-format msgid "reading from `%s'\n" -msgstr "odczyt z `%s'\n" +msgstr "odczyt z '%s'\n" #: g10/encode.c:397 -#, fuzzy, c-format +#, c-format msgid "%s/%s encrypted for: %s\n" -msgstr "%s zaszyfrowany dla: %s\n" +msgstr "%s/%s zaszyfrowany dla: %s\n" #: g10/export.c:147 -#, fuzzy, c-format +#, c-format msgid "%s: user not found: %s\n" -msgstr "%s: nie znaleziono użytkownika\n" +msgstr "%s: nie znaleziono użytkownika %s\n" #: g10/export.c:156 #, c-format msgid "certificate read problem: %s\n" -msgstr "" +msgstr "błąd przy odczycie certyfikatu: %s\n" #: g10/export.c:165 -#, fuzzy, c-format +#, c-format msgid "key %08lX: not a rfc2440 key - skipped\n" -msgstr "klucz %08lX: niepoprawny certyfikat unieważnienia: %s - pominięty\n" +msgstr "klucz %08lX: nie jest w formacie RFC 2440 - pominięty\n" #: g10/export.c:203 -#, fuzzy msgid "WARNING: nothing exported\n" -msgstr "OSTRZEŻENIE: używany jest klucz nie obdarzony zaufaniem!\n" +msgstr "OSTRZEŻENIE: nic nie zostało wyeksportowane!\n" #: g10/getkey.c:164 msgid "too many entries in pk cache - disabled\n" -msgstr "" +msgstr "zbyt wiele wpisów w buforze kluczy publicznych - wyłączony\n" #: g10/getkey.c:294 msgid "too many entries in unk cache - disabled\n" -msgstr "" +msgstr "zbyt wiele wpisów w buforze nieznanych kluczy - wyłączony\n" #: g10/getkey.c:1038 #, c-format msgid "using secondary key %08lX instead of primary key %08lX\n" -msgstr "" +msgstr "używany jest podklucz %08lX zamiast klucza głównego %08lX\n" #: g10/import.c:117 g10/trustdb.c:1180 #, c-format @@ -1464,7 +1417,7 @@ msgstr "pomijam blok typu %d\n" #: g10/import.c:172 g10/trustdb.c:1474 g10/trustdb.c:1543 #, c-format msgid "%lu keys so far processed\n" -msgstr "" +msgstr "%lu kluczy przetworzonych do tej chwili\n" #: g10/import.c:177 g10/trustdb.c:1256 #, c-format @@ -1474,57 +1427,57 @@ msgstr "b #: g10/import.c:179 #, c-format msgid "Total number processed: %lu\n" -msgstr "" +msgstr "Ogółem przetworzonych kluczy: %lu\n" #: g10/import.c:181 #, c-format msgid " w/o user IDs: %lu\n" -msgstr "" +msgstr " bez identyfikatora: %lu\n" #: g10/import.c:183 #, c-format msgid " imported: %lu" -msgstr "" +msgstr " dołączono do zbioru: %lu" #: g10/import.c:189 #, c-format msgid " unchanged: %lu\n" -msgstr "" +msgstr " bez zmian: %lu\n" #: g10/import.c:191 #, c-format msgid " new user IDs: %lu\n" -msgstr "" +msgstr " nowych identyfikatorów: %lu\n" #: g10/import.c:193 #, c-format msgid " new subkeys: %lu\n" -msgstr "" +msgstr " nowych podkluczy: %lu\n" #: g10/import.c:195 -#, fuzzy, c-format +#, c-format msgid " new signatures: %lu\n" -msgstr "klucz %08lX: %d nowych podpisów\n" +msgstr " nowych podpisów: %lu\n" #: g10/import.c:197 #, c-format msgid " new key revocations: %lu\n" -msgstr "" +msgstr " nowych unieważnień kluczy: %lu\n" #: g10/import.c:199 -#, fuzzy, c-format +#, c-format msgid " secret keys read: %lu\n" -msgstr "błąd procedury enum_secret_keys: %s\n" +msgstr " tajnych kluczy wczytanych: %lu\n" #: g10/import.c:201 -#, fuzzy, c-format +#, c-format msgid " secret keys imported: %lu\n" -msgstr "Klucz %08lX: klucz tajny wczytany do zbioru\n" +msgstr " tajnych kluczy dodanych: %lu\n" #: g10/import.c:203 -#, fuzzy, c-format +#, c-format msgid " secret keys unchanged: %lu\n" -msgstr "błąd procedury enum_secret_keys: %s\n" +msgstr " tajnych kluczy bez zmian: %lu\n" #: g10/import.c:343 g10/import.c:535 #, c-format @@ -1543,7 +1496,7 @@ msgstr "to mo #: g10/import.c:367 g10/import.c:603 #, c-format msgid "key %08lX: public key not found: %s\n" -msgstr "klucz %08lX: brak klucza publicznegoL %s\n" +msgstr "klucz %08lX: brak klucza publicznego: %s\n" #: g10/import.c:373 msgid "no default public keyring\n" @@ -1552,7 +1505,7 @@ msgstr "brak domy #: g10/import.c:377 g10/openfile.c:105 g10/sign.c:215 g10/sign.c:601 #, c-format msgid "writing to `%s'\n" -msgstr "zapisywanie '%s\"\n" +msgstr "zapis do '%s'\n" #: g10/import.c:381 g10/import.c:441 g10/import.c:657 #, c-format @@ -1567,7 +1520,7 @@ msgstr "niemo #: g10/import.c:388 #, c-format msgid "key %08lX: public key imported\n" -msgstr "klucz %08lX: klucz publiczny wczytany\n" +msgstr "klucz %08lX: klucz publiczny wczytany do zbioru\n" #: g10/import.c:401 #, c-format @@ -1626,7 +1579,7 @@ msgstr "klucz %08lX: %d nowych podkluczy\n" #: g10/import.c:474 #, c-format msgid "key %08lX: not changed\n" -msgstr "klucz %08lX: pozostawiony bez zmian\n" +msgstr "klucz %08lX: bez zmian\n" #: g10/import.c:553 #, c-format @@ -1634,9 +1587,9 @@ msgid "can't lock secret keyring: %s\n" msgstr "nie mogę zablokować zbioru kluczy tajnych: %s\n" #: g10/import.c:556 -#, fuzzy, c-format +#, c-format msgid "can't write keyring: %s\n" -msgstr "niemożliwy jest zapis do zbioru kluczy: %s\n" +msgstr "niemożliwy jest zapis zbioru kluczy: %s\n" #. we are ready #: g10/import.c:559 @@ -1691,14 +1644,14 @@ msgid "key %08lX: invalid self-signature\n" msgstr "klucz %08lX: niepoprawny podpis właściciela klucza\n" #: g10/import.c:722 -#, fuzzy, c-format +#, c-format msgid "key %08lX: no subkey for key binding\n" -msgstr "klucz %08lX: brak identyfikatora użytkownika\n" +msgstr "klucz %08lX: brak podklucza do dowiązania\n" #: g10/import.c:730 -#, fuzzy, c-format +#, c-format msgid "key %08lX: invalid subkey binding\n" -msgstr "klucz %08lX: brak poprawnych identyfikatorów użytkownika\n" +msgstr "klucz %08lX: niepoprawne dowiązanie podklucza\n" #: g10/import.c:761 #, c-format @@ -1706,16 +1659,16 @@ msgid "key %08lX: skipped userid '" msgstr "klucz %08lX: został pominięty identyfikator użytkownika '" #: g10/import.c:781 -#, fuzzy, c-format +#, c-format msgid "key %08lX: skipped subkey\n" -msgstr "klucz %08lX: 1 nowy podklucz\n" +msgstr "klucz %08lX: podklucz pominięty\n" #: g10/import.c:800 #, c-format msgid "key %08lX: revocation certificate at wrong place - skipped\n" msgstr "" -"klucz %08lX: certyfikat unieważnienia umieszczony w niewłaściwym miejscu\n" -"- pominięty\n" +"klucz %08lX: certyfikat unieważnienia umieszczony w niewłaściwym \n" +"miejscu - został pominięty\n" #: g10/import.c:808 #, c-format @@ -1840,7 +1793,7 @@ msgstr "Czy na pewno chcesz to zrobi #: g10/keyedit.c:455 msgid "moving a key signature to the correct place\n" -msgstr "" +msgstr "przenoszę podpis klucza na właściwe miejsce\n" #: g10/keyedit.c:490 msgid "quit" @@ -1967,14 +1920,12 @@ msgid "delete a secondary key" msgstr "usunięcie podklucza" #: g10/keyedit.c:509 -#, fuzzy msgid "expire" -msgstr "opcje" +msgstr "data" #: g10/keyedit.c:509 -#, fuzzy msgid "change the expire date" -msgstr "zmiana wyrażenia przejściowego (hasła)" +msgstr "zmiana daty ważności klucza" #: g10/keyedit.c:510 msgid "toggle" @@ -2027,7 +1978,6 @@ msgid "Command> " msgstr "Polecenie> " #: g10/keyedit.c:617 -#, fuzzy msgid "Need the secret key to do this.\n" msgstr "Do wykonania tej operacji potrzebny jest klucz tajny.\n" @@ -2055,9 +2005,9 @@ msgstr "" "Klucz nie został zmieniony więc nanoszenie poprawek nie jest konieczne.\n" #: g10/keyedit.c:669 g10/keyedit.c:727 -#, fuzzy, c-format +#, c-format msgid "update of trustdb failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "naniesienie poprawek bazy zaufania nie powiodło się: %s\n" #: g10/keyedit.c:701 msgid "Really sign all user ids? " @@ -2097,32 +2047,31 @@ msgstr "Czy na pewno chcesz usun #: g10/keyedit.c:819 msgid "Invalid command (try \"help\")\n" -msgstr "Niepoprawna komenda (spróbuj \"pomoc\")\n" +msgstr "Niepoprawna komenda (spróbuj \"help\")\n" #: g10/keyedit.c:1197 msgid "Please remove selections from the secret keys.\n" -msgstr "" +msgstr "Proszę usunąć znacznik wyboru z kluczy tajnych.\n" #: g10/keyedit.c:1203 -#, fuzzy msgid "Please select at most one secondary key.\n" -msgstr "Musisz wybrać co najmniej jeden klucz.\n" +msgstr "Proszę wybrać najwyżej jeden podklucz.\n" #: g10/keyedit.c:1207 msgid "Changing exiration time for a secondary key.\n" -msgstr "" +msgstr "Zmiana daty ważności podklucza.\n" #: g10/keyedit.c:1209 msgid "Changing exiration time for the primary key.\n" -msgstr "" +msgstr "Zmiana daty ważności głównego klucza.\n" #: g10/keyedit.c:1250 msgid "You can't change the expiration date of a v3 key\n" -msgstr "" +msgstr "Nie można zmienić daty ważności klucza w wersji 3.\n" #: g10/keyedit.c:1266 msgid "No corresponding signature in secret ring\n" -msgstr "" +msgstr "Brak odpowiadającego podpisu w zbiorze kluczy tajnych\n" #: g10/keyedit.c:1326 #, c-format @@ -2135,19 +2084,17 @@ msgid "No secondary key with index %d\n" msgstr "Brak podklucza o indeksie %d\n" #: g10/mainproc.c:199 -#, fuzzy msgid "public key encrypted data: good DEK\n" -msgstr "błąd odszyfrowywania klucza publicznego: %s\n" +msgstr "dane zaszyfrowane kluczem publicznym: poprawny klucz sesyjny\n" #: g10/mainproc.c:202 #, c-format msgid "public key decryption failed: %s\n" -msgstr "błąd odszyfrowywania klucza publicznego: %s\n" +msgstr "błąd odszyfrowywania kluczem publicznym: %s\n" #: g10/mainproc.c:229 -#, fuzzy msgid "decryption okay\n" -msgstr "błąd odszyfrowywania: %s\n" +msgstr "odszyfrowane poprawnie\n" #: g10/mainproc.c:232 #, c-format @@ -2156,16 +2103,16 @@ msgstr "b #: g10/mainproc.c:249 msgid "NOTE: sender requested \"for-your-eyes-only\"\n" -msgstr "" +msgstr "UWAGA: nadawca zaznaczył że wiadomość nie powinna być zapisywana\n" #: g10/mainproc.c:251 #, c-format msgid "original file name='%.*s'\n" -msgstr "" +msgstr "pierwotna nazwa pliku='%.*s'\n" #: g10/mainproc.c:834 msgid "signature verification suppressed\n" -msgstr "" +msgstr "wymuszono pominięcie sprawdzenia podpisu\n" #: g10/mainproc.c:840 #, c-format @@ -2189,24 +2136,24 @@ msgstr "Nie mog #: g10/mainproc.c:957 msgid "old style (PGP 2.x) signature\n" -msgstr "" +msgstr "podpis starego typu (PGP 2.x)\n" #: g10/mainproc.c:962 msgid "invalid root packet detected in proc_tree()\n" -msgstr "" +msgstr "wykryto niepoprawny pakiet pierwotny w proc_tree()\n" #: g10/misc.c:90 -#, fuzzy, c-format +#, c-format msgid "can't disable core dumps: %s\n" -msgstr "nie mogę otworzyć %s: %s\n" +msgstr "nie można wyłączyć zrzucania pamięci: %s\n" #: g10/misc.c:93 msgid "WARNING: program may create a core file!\n" -msgstr "" +msgstr "OSTRZEŻENIE: program może stworzyć plik zrzutu pamięci!\n" #: g10/misc.c:200 msgid "Experimental algorithms should not be used!\n" -msgstr "" +msgstr "Nie należy używać algorytmów doświadczalnych!\n" #: g10/misc.c:214 msgid "" @@ -2219,16 +2166,18 @@ msgstr "" #: g10/misc.c:235 msgid "this cipher algorithm is depreciated; please use a more standard one!\n" msgstr "" +"ten algorytm szyfrujący jest odradzanym proszę używać bardziej " +"standardowych!\n" #: g10/parse-packet.c:113 -#, fuzzy, c-format +#, c-format msgid "can't handle public key algorithm %d\n" -msgstr "nie mogę zablokować zbioru kluczy publicznych: %s\n" +msgstr "algorytm klucza publicznego niemożliwy do obsłużenia: %d\n" #: g10/parse-packet.c:892 #, c-format msgid "subpacket of type %d has critical bit set\n" -msgstr "" +msgstr "podpakiet typu %d ma ustawiony krytyczny bit\n" #: g10/passphrase.c:141 msgid "" @@ -2241,41 +2190,40 @@ msgstr "" "dla użytkownika: \"" #: g10/passphrase.c:150 -#, fuzzy, c-format +#, c-format msgid "%u-bit %s key, ID %08lX, created %s" -msgstr "(długość %u bitów, typ %s, klucz %08lX, stworzony %s)\n" +msgstr "długość %u bitów, typ %s, klucz %08lX, stworzony %s" #: g10/passphrase.c:155 #, c-format msgid " (main key ID %08lX)" -msgstr "" +msgstr " (główny ID klucza %08lX)" #: g10/passphrase.c:183 -#, fuzzy msgid "Enter passphrase: " msgstr "Wyrażenie przejściowe: " #: g10/passphrase.c:187 -#, fuzzy msgid "Repeat passphrase: " -msgstr "Proszę powtórzyć wyrażenie przejściowe: " +msgstr "Powtórzone wyrażenie przejściowe: " #: g10/plaintext.c:63 msgid "data not saved; use option \"--output\" to save it\n" msgstr "" +"dane nie zostały zapisane; należy użyć opcji \"--output\" aby je zapisać\n" #: g10/plaintext.c:208 msgid "Please enter name of data file: " -msgstr "Nazwa pliku: " +msgstr "Nazwa pliku danych: " #: g10/plaintext.c:229 msgid "reading stdin ...\n" -msgstr "" +msgstr "czytam strumień standardowego wejścia\n" #: g10/plaintext.c:292 #, c-format msgid "can't open signed data `%s'\n" -msgstr "nie mogę otworzyć podpisanego pliku `%s'\n" +msgstr "nie można otworzyć podpisanego pliku '%s'\n" #: g10/pubkey-enc.c:78 #, c-format @@ -2283,19 +2231,17 @@ msgid "anonymous receiver; trying secret key %08lX ...\n" msgstr "adresat anonimowy; próbuję klucz tajny %08lX ...\n" #: g10/pubkey-enc.c:84 -#, fuzzy msgid "okay, we are the anonymous recipient.\n" msgstr "OK, to my jesteśmy adresatem anonimowym.\n" #: g10/pubkey-enc.c:136 -#, fuzzy msgid "old encoding of the DEK is not supported\n" -msgstr "%d - algorytm ochrony nie obsługiwany\n" +msgstr "stary, nie obsługiwany algorytm szyfrowania klucza sesyjnego\n" #: g10/pubkey-enc.c:183 -#, fuzzy, c-format +#, c-format msgid "NOTE: cipher algorithm %d not found in preferences\n" -msgstr "uwaga: brak algorytmu szyfrującego %d w ustawieniach\n" +msgstr "UWAGA: brak algorytmu szyfrującego %d w ustawieniach\n" #: g10/seckey-cert.c:56 #, c-format @@ -2308,7 +2254,6 @@ msgstr "" "Niepoprawne wyrażenie przejściowe (hasło); proszę spróbować ponownie ...\n" #: g10/seckey-cert.c:223 -#, fuzzy msgid "WARNING: Weak key detected - please change passphrase again.\n" msgstr "" "Ostrzeżenie: Wykryto klucz słaby algorytmu - należy ponownie zmienić \n" @@ -2318,219 +2263,222 @@ msgstr "" msgid "" "this is a PGP generated ElGamal key which is NOT secure for signatures!\n" msgstr "" +"Klucz algorytmu ElGamala wygenerowany przez PGP - podpisy nim składane\n" +"nie zapewniają bezpieczeństwa!\n" #: g10/sig-check.c:163 -#, fuzzy, c-format +#, c-format msgid "public key is %lu second newer than the signature\n" -msgstr "klucz %08lX: brak identyfikatora użytkownika do podpisu\n" +msgstr "klucz publiczny jest o %lu sekund młodszy od podpisu\n" #: g10/sig-check.c:164 -#, fuzzy, c-format +#, c-format msgid "public key is %lu seconds newer than the signature\n" -msgstr "klucz %08lX: brak identyfikatora użytkownika do podpisu\n" +msgstr "klucz publiczny jest o %lu sekund młodszy od podpisu\n" #: g10/sig-check.c:180 -#, fuzzy, c-format +#, c-format msgid "NOTE: signature key expired %s\n" -msgstr "ostrzeżenie: klucz podpisujący przekroczył datę ważności %s\n" +msgstr "UWAGA: klucz podpisujący przekroczył datę ważności %s\n" #: g10/sig-check.c:237 msgid "assuming bad signature due to an unknown critical bit\n" msgstr "" +"przyjęto nieważność podpisu z powonu ustawienia nieznanego bitu krytycznego\n" #: g10/sign.c:79 -#, fuzzy, c-format +#, c-format msgid "%s signature from: %s\n" -msgstr "NIEPOPRAWNY podpis złożony przez \"" +msgstr "%s podpis złożony przez: %s\n" #: g10/sign.c:210 g10/sign.c:596 -#, fuzzy, c-format +#, c-format msgid "can't create %s: %s\n" -msgstr "nie mogę otworzyć %s: %s\n" +msgstr "nie mogę stworzyć %s: %s\n" #: g10/sign.c:306 -#, fuzzy msgid "signing:" -msgstr "podpis" +msgstr "podpis:" #: g10/sign.c:346 -#, fuzzy, c-format +#, c-format msgid "WARNING: `%s' is an empty file\n" -msgstr "%s: ostrzeżenie: plik jest pusty\n" +msgstr "OSTRZEŻENIE: plik '%s' jest pusty\n" #: g10/textfilter.c:199 #, c-format msgid "can't handle text lines longer than %d characters\n" -msgstr "" +msgstr "nie mogę obsłużyć linii tekstu dłuższej niż %d znaków\n" #: g10/tdbio.c:116 g10/tdbio.c:1418 -#, fuzzy, c-format +#, c-format msgid "trustdb rec %lu: lseek failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "baza zaufania, wpis %lu: lseek() nie powiodła się: %s\n" #: g10/tdbio.c:122 g10/tdbio.c:1425 #, c-format msgid "trustdb rec %lu: write failed (n=%d): %s\n" -msgstr "" +msgstr "baza zaufania, wpis %lu: zapis nie powiódł się (n=%d): %s\n" #: g10/tdbio.c:232 msgid "trustdb transaction too large\n" -msgstr "" +msgstr "zbyt duże zlecenie dla bazy zaufania\n" #: g10/tdbio.c:416 -#, fuzzy, c-format +#, c-format msgid "%s: can't access: %s\n" -msgstr "%s: nie mogę otworzyć: %s\n" +msgstr "%s: dostęp niemożliwy: %s\n" #: g10/ringedit.c:273 g10/tdbio.c:436 -#, fuzzy, c-format +#, c-format msgid "%s: can't create directory: %s\n" -msgstr "%s: nie mogę otworzyć: %s\n" +msgstr "%s: nie mogę utworzyć katalogu: %s\n" #: g10/ringedit.c:279 g10/tdbio.c:439 #, c-format msgid "%s: directory created\n" -msgstr "" +msgstr "%s: katalog utworzony\n" #: g10/tdbio.c:443 #, c-format msgid "%s: directory does not exist!\n" -msgstr "" +msgstr "%s: katalog nie istnieje!\n" #: g10/openfile.c:101 g10/openfile.c:165 g10/ringedit.c:1292 g10/tdbio.c:449 -#, fuzzy, c-format +#, c-format msgid "%s: can't create: %s\n" -msgstr "%s: nie mogę otworzyć: %s\n" +msgstr "%s: nie mogę utworzyć: %s\n" #: g10/tdbio.c:473 #, c-format msgid "%s: failed to create version record: %s" -msgstr "" +msgstr "%s: stworzenie zapisu o wersji nie powiodło się: %s" #: g10/tdbio.c:477 #, c-format msgid "%s: invalid trustdb created\n" -msgstr "" +msgstr "%s: stworzony niepoprawny plik bazy zaufania\n" #: g10/tdbio.c:479 #, c-format msgid "%s: trustdb created\n" -msgstr "" +msgstr "%s: baza zaufania utworzona\n" #: g10/tdbio.c:512 #, c-format msgid "%s: invalid trustdb\n" -msgstr "" +msgstr "%s: niepoprawny plik bazy zaufania\n" #: g10/tdbio.c:545 #, c-format msgid "%s: failed to create hashtable: %s\n" -msgstr "" +msgstr "%s: tworzenie tablicy skrótów nie powiodło się: %s\n" #: g10/tdbio.c:553 -#, fuzzy, c-format +#, c-format msgid "%s: error updating version record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "%s: błąd przy uaktualnianiu numeru wersji: %s\n" #: g10/tdbio.c:569 g10/tdbio.c:608 g10/tdbio.c:633 g10/tdbio.c:1351 #: g10/tdbio.c:1378 -#, fuzzy, c-format +#, c-format msgid "%s: error reading version record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "%s: błąd odczytu numeru wersji: %s\n" #: g10/tdbio.c:582 -#, fuzzy, c-format +#, c-format msgid "%s: error writing version record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "%s: błąd zapisu numeru wersji: %s\n" #: g10/tdbio.c:1058 -#, fuzzy, c-format +#, c-format msgid "trustdb: lseek failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "baza zaufania: procedura lseek() zawiodła: %s\n" #: g10/tdbio.c:1066 -#, fuzzy, c-format +#, c-format msgid "trustdb: read failed (n=%d): %s\n" -msgstr "naniesienie poprawek nie powiodło się: %s\n" +msgstr "baza zaufania: procedura read() (n=%d) zawiodła: %s\n" #: g10/tdbio.c:1087 #, c-format msgid "%s: not a trustdb file\n" -msgstr "" +msgstr "%s: to nie jest plik bazy zaufania\n" #: g10/tdbio.c:1103 #, c-format msgid "%s: version record with recnum %lu\n" -msgstr "" +msgstr "%s: wpis wersji z numerem %lu\n" #: g10/tdbio.c:1108 #, c-format msgid "%s: invalid file version %d\n" -msgstr "" +msgstr "%s: niewłaściwa wersja pliku %d\n" #: g10/tdbio.c:1384 -#, fuzzy, c-format +#, c-format msgid "%s: error reading free record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "%s: błąd odczytu pustego wpisu: %s\n" #: g10/tdbio.c:1392 -#, fuzzy, c-format +#, c-format msgid "%s: error writing dir record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "%s: błąd zapisu wpisu katalogowego: %s\n" #: g10/tdbio.c:1402 #, c-format msgid "%s: failed to zero a record: %s\n" -msgstr "" +msgstr "%s: zerowanie rekordu nie powiodło się: %s\n" #: g10/tdbio.c:1432 #, c-format msgid "%s: failed to append a record: %s\n" -msgstr "" +msgstr "%s: dopisanie rekordu nie powiodło się: %s\n" #: g10/trustdb.c:142 msgid "The trustdb is corrupted; please run \"gpgm --fix-trustdb\".\n" msgstr "" +"Baza zaufania jest uszkodzona; proszę uruchomić \"gpgm --fix-trust-db\".\n" #: g10/trustdb.c:155 #, c-format msgid "trust record %lu, req type %d: read failed: %s\n" -msgstr "" +msgstr "wpis zaufania %lu, typ zapytania %d: odczyt nie powiódł się: %s\n" #: g10/trustdb.c:170 #, c-format msgid "trust record %lu, type %d: write failed: %s\n" -msgstr "" +msgstr "wpis zaufania %lu, typ zapytania %d: zapis nie powiódł się: %s\n" #: g10/trustdb.c:184 -#, fuzzy, c-format +#, c-format msgid "trust record %lu: delete failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "wpis zaufania %lu: usunięcie nie powiodło się %s\n" #: g10/trustdb.c:198 -#, fuzzy, c-format +#, c-format msgid "trustdb: sync failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "baza zaufania: synchronizacja nie powiodła się %s\n" #: g10/trustdb.c:327 -#, fuzzy, c-format +#, c-format msgid "error reading dir record for LID %lu: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "błąd odczytu wpisu katalogowego dla LID %lu: %s\n" #: g10/trustdb.c:334 #, c-format msgid "lid %lu: expected dir record, got type %d\n" -msgstr "" +msgstr "lid %lu: oczekiwany wpis katalogowy, napotkano typ %d\n" #: g10/trustdb.c:339 #, c-format msgid "no primary key for LID %lu\n" -msgstr "" +msgstr "brak klucza głównego dla LID %lu\n" #: g10/trustdb.c:344 -#, fuzzy, c-format +#, c-format msgid "error reading primary key for LID %lu: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "błąd odczytu głównego klucza dla LID %lu: %s\n" #: g10/trustdb.c:420 #, c-format @@ -2540,17 +2488,18 @@ msgstr "powi #: g10/trustdb.c:463 #, c-format msgid "'%s' is not a valid long keyID\n" -msgstr "" +msgstr "'%s\" nie jest właściwym identyfikatorem klucza\n" #: g10/trustdb.c:498 -#, fuzzy, c-format +#, c-format msgid "key %08lX: no public key for trusted key - skipped\n" -msgstr "klucz %08lX: klucz publiczny wczytany\n" +msgstr "" +"klucz %08lX: brak klucza publicznego dla klucza zaufanego - pominięty\n" #: g10/trustdb.c:507 g10/trustdb.c:565 #, c-format msgid "key %08lX: can't put it into the trustdb\n" -msgstr "klucz %08lX: wpisanie do Bazy Zaufania niemożliwe\n" +msgstr "klucz %08lX: wpisanie do bazy zaufania niemożliwe\n" #: g10/trustdb.c:512 g10/trustdb.c:571 #, c-format @@ -2558,24 +2507,24 @@ msgid "key %08lX: query record failed\n" msgstr "klucz %08lX: wyszukanie zapisu nie powiodło się\n" #: g10/trustdb.c:517 g10/trustdb.c:580 -#, fuzzy, c-format +#, c-format msgid "key %08lX: already in trusted key table\n" -msgstr "klucz %08lX: już znajduje się w in ultikey_table\n" +msgstr "klucz %08lX: już znajduje się w tablicy kluczy zaufanych\n" #: g10/trustdb.c:520 g10/trustdb.c:583 -#, fuzzy, c-format +#, c-format msgid "key %08lX: accepted as trusted key.\n" -msgstr "Klucz %08lX.%lu: wprowadzony do bazy zaufania\n" +msgstr "Klucz %08lX: zaakceptowany jako klucz zaufany.\n" #: g10/trustdb.c:536 -#, fuzzy, c-format +#, c-format msgid "NOTE: secret key %08lX is NOT protected.\n" -msgstr "Ten klucz nie jest chroniony.\n" +msgstr "UWAGA: klucz tajny %08lX NIE jest chroniony.\n" #: g10/trustdb.c:548 -#, fuzzy, c-format +#, c-format msgid "key %08lX: secret key without public key - skipped\n" -msgstr "klucz %08lX: klucz tajny bez klucza jawnego\n" +msgstr "klucz %08lX: klucz tajny bez klucza jawnego - pominięty\n" #: g10/trustdb.c:555 #, c-format @@ -2583,68 +2532,67 @@ msgid "key %08lX: secret and public key don't match\n" msgstr "klucz %08lX: klucz tajny nie pasuje do klucza jawnego\n" #: g10/trustdb.c:591 -#, fuzzy, c-format +#, c-format msgid "enumerate secret keys failed: %s\n" -msgstr "błąd procedury enum_secret_keys: %s\n" +msgstr "wyliczenie kluczy tajnych nie powiodło się %s\n" #: g10/trustdb.c:774 -#, fuzzy, c-format +#, c-format msgid "lid %lu: read dir record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "lid %lu: odczyt wpisu katalogowego nie powiódł się: %s\n" #: g10/trustdb.c:783 -#, fuzzy, c-format +#, c-format msgid "lid %lu: read key record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "lid %lu: odczyt wpisu klucza nie powiódł się: %s\n" #: g10/trustdb.c:793 -#, fuzzy, c-format +#, c-format msgid "lid %lu: read uid record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "lid %lu: odczyt wpisu z identyfikatorem nie powiódł się; %s\n" #: g10/trustdb.c:802 -#, fuzzy, c-format +#, c-format msgid "lid %lu: read pref record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "lid %lu: odczyt wpisu ustawień nie powiódł się: %s\n" #: g10/trustdb.c:812 -#, fuzzy, c-format +#, c-format msgid "lid %lu: read sig record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "lid %lu: odczyt wpisu o podpisach nie powiódł się: %s\n" #: g10/trustdb.c:1013 msgid "Ooops, no keys\n" -msgstr "" +msgstr "Oops, brak kluczy\n" #: g10/trustdb.c:1017 -#, fuzzy msgid "Ooops, no user ids\n" -msgstr "lista kluczy i identyfikatorów użytkowników" +msgstr "Oops, brak identyfikatorów użytkowników\n" #: g10/trustdb.c:1088 g10/trustdb.c:1106 #, c-format msgid "user '%s' read problem: %s\n" -msgstr "" +msgstr "użytkownik '%s' błąd przy odczycie: %s\n" #: g10/trustdb.c:1091 g10/trustdb.c:1109 #, c-format msgid "user '%s' list problem: %s\n" -msgstr "" +msgstr "użytkownik '%s' błąd listy: %s\n" #: g10/trustdb.c:1099 g10/trustdb.c:1346 -#, fuzzy, c-format +#, c-format msgid "user '%s' not found: %s\n" -msgstr "%s: nie znaleziono użytkownika\n" +msgstr "użytkownik '%s' nie odnaleziony: %s\n" #: g10/trustdb.c:1101 g10/trustdb.c:1348 #, c-format msgid "problem finding '%s' in trustdb: %s\n" -msgstr "" +msgstr "problem podczas szukania '%s' w bazie zaufania: %s\n" #: g10/trustdb.c:1104 #, c-format msgid "user '%s' not in trustdb\n" -msgstr "" +msgstr "brak użytkownika '%s' w bazie zaufania\n" #: g10/trustdb.c:1139 #, c-format @@ -2652,166 +2600,163 @@ msgid "" "# List of assigned trustvalues, created %s\n" "# (Use \"gpgm --import-ownertrust\" to restore them)\n" msgstr "" +"# Lista przypisanych wartości zaufania, stworzona %s\n" +"# (użyj \"gpgm --import-ownertrust\" aby ją przywrócić)\n" #: g10/trustdb.c:1145 msgid "directory record w/o primary key\n" -msgstr "" +msgstr "wpis katalogowy bez klucza głównego\n" #: g10/trustdb.c:1152 -#, fuzzy, c-format +#, c-format msgid "error reading key record: %s\n" msgstr "błąd odczytu rekordu podpisu: %s\n" #: g10/trustdb.c:1192 msgid "line too long\n" -msgstr "" +msgstr "linia za długa\n" #: g10/trustdb.c:1200 msgid "error: missing colon\n" -msgstr "" +msgstr "błąd: brak dwukropka\n" #: g10/trustdb.c:1205 -#, fuzzy msgid "error: invalid fingerprint\n" -msgstr "okazanie odcisku klucza" +msgstr "błąd: niewłaściwy odcisk klucza\n" #: g10/trustdb.c:1209 -#, fuzzy msgid "error: no ownertrust value\n" -msgstr "" -"Przypisanie tych wartości należy do Ciebie, nie będą one udostępnione\n" -"nikomu innemu. Są one używane do stworzenia sieci zaufania i nie ma\n" -"to nic wspólnego z tworzoną siecią certyfikatów." +msgstr "błąd: brak wartośći zaufania właściciela\n" #: g10/trustdb.c:1234 msgid "key not in trustdb, searching ring.\n" -msgstr "" +msgstr "brak klucza w bazie zaufania, przeszukiwany jest zbiór kluczy\n" #: g10/trustdb.c:1237 -#, fuzzy, c-format +#, c-format msgid "key not in ring: %s\n" -msgstr "Generacja klucza nie powiodła się: %s\n" +msgstr "klucza nie ma w zbiorze: %s\n" #: g10/trustdb.c:1241 msgid "Oops: key is now in trustdb???\n" -msgstr "" +msgstr "Oops: klucz już jest w bazie zaufania???\n" #. update the ownertrust #: g10/trustdb.c:1246 -#, fuzzy, c-format +#, c-format msgid "insert trust record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "wstawienie wpisu zaufania nie powiodło się: %s\n" #. error #: g10/trustdb.c:1252 -#, fuzzy, c-format +#, c-format msgid "error finding dir record: %s\n" -msgstr "błąd odczytu rekordu podpisu: %s\n" +msgstr "błąd podczas poszukiwania wpisu katalogowego: %s\n" #: g10/trustdb.c:1351 #, c-format msgid "user '%s' not in trustdb - inserting\n" -msgstr "" +msgstr "brak użytkownika '%s' w bazie zaufania - dodano\n" #: g10/trustdb.c:1354 -#, fuzzy, c-format +#, c-format msgid "failed to put '%s' into trustdb: %s\n" -msgstr "Inicjowanie Bazy Zaufania nie powiodło się: %s\n" +msgstr "umieszczenie '%s' w Bazie Zaufania nie powiodło się: %s\n" #: g10/trustdb.c:1404 #, c-format msgid "%s: keyblock read problem: %s\n" -msgstr "" +msgstr "%s: problem przy odczycie bloku klucza: %s\n" #: g10/trustdb.c:1418 -#, fuzzy, c-format +#, c-format msgid "%s: update failed: %s\n" -msgstr "naniesienie poprawek nie powiodło się: %s\n" +msgstr "%s: zapis zmian nie powiodł się: %s\n" #: g10/trustdb.c:1421 #, c-format msgid "%s: updated\n" -msgstr "" +msgstr "%s: uaktualniony\n" #: g10/trustdb.c:1423 #, c-format msgid "%s: okay\n" -msgstr "" +msgstr "%s: OK\n" #: g10/trustdb.c:1438 #, c-format msgid "lid %lu: dir record w/o key - skipped\n" -msgstr "" +msgstr "lid %lu: wpis katalogowy bez bloku klucza - pominięty\n" #: g10/trustdb.c:1451 -#, fuzzy, c-format +#, c-format msgid "lid %lu: keyblock not found: %s\n" -msgstr "klucz %08lX: brak klucza publicznegoL %s\n" +msgstr "lid %lu: blok klucza nie został odnaleziony: %s\n" #: g10/trustdb.c:1460 g10/trustdb.c:1529 -#, fuzzy, c-format +#, c-format msgid "lid %lu: update failed: %s\n" -msgstr "naniesienie poprawek nie powiodło się: %s\n" +msgstr "lid %lu: naniesienie poprawek nie powiodło się: %s\n" #: g10/trustdb.c:1466 g10/trustdb.c:1535 #, c-format msgid "lid %lu: updated\n" -msgstr "" +msgstr "lid %lu: uaktualniony\n" #: g10/trustdb.c:1470 g10/trustdb.c:1539 #, c-format msgid "lid %lu: okay\n" -msgstr "" +msgstr "lid %lu: OK\n" #: g10/trustdb.c:1477 g10/trustdb.c:1545 #, c-format msgid "%lu keys processed\n" -msgstr "" +msgstr "%lu kluczy przetworzonych\n" #: g10/trustdb.c:1479 -#, fuzzy, c-format +#, c-format msgid "\t%lu keys skipped\n" -msgstr "%s: pominięty: %s\n" +msgstr "\t%lu kluczy pominiętych\n" #: g10/trustdb.c:1481 g10/trustdb.c:1547 #, c-format msgid "\t%lu keys with errors\n" -msgstr "" +msgstr "\t%lu kluczy z błędami\n" #: g10/trustdb.c:1483 g10/trustdb.c:1549 #, c-format msgid "\t%lu keys updated\n" -msgstr "" +msgstr "\t%lu kluczy uaktualnionych\n" #: g10/trustdb.c:1513 -#, fuzzy, c-format +#, c-format msgid "lid ?: insert failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "lid ?: wpisanie nie powiodło się: %s\n" #: g10/trustdb.c:1518 -#, fuzzy, c-format +#, c-format msgid "lid %lu: insert failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "lid %lu: wpisanie nie powiodło się: %s\n" #: g10/trustdb.c:1524 #, c-format msgid "lid %lu: inserted\n" -msgstr "" +msgstr "lid %lu: wpisany\n" #: g10/trustdb.c:1551 #, c-format msgid "\t%lu keys inserted\n" -msgstr "" +msgstr " %lu kluczy wpisanych\n" #: g10/trustdb.c:1554 -#, fuzzy, c-format +#, c-format msgid "enumerate keyblocks failed: %s\n" -msgstr "błąd procedury enum_secret_keys: %s\n" +msgstr "wyliczenie bloków kluczy nie powiodło się: %s\n" #: g10/trustdb.c:1599 -#, fuzzy, c-format +#, c-format msgid "check_trust: search dir record failed: %s\n" -msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiodło się: %s\n" +msgstr "check_trust: poszukiwanie wpisu katalogowego nie powiodło się: %s\n" #: g10/trustdb.c:1606 #, c-format @@ -2842,213 +2787,219 @@ msgstr "klucz %08lX.%lu: b #: g10/trustdb.c:1842 g10/trustdb.c:1871 g10/trustdb.c:2610 msgid "WARNING: can't yet handle long pref records\n" -msgstr "" +msgstr "OSTRZEŻENIE: długie wpisy ustawień jeszcze nie są obsługiwane.\n" #: g10/trustdb.c:1893 -#, fuzzy, c-format +#, c-format msgid "get_dir_record: search_record failed: %s\n" -msgstr "naniesienie poprawek na kluczu tajnym nie powiodło się: %s\n" +msgstr "get_dir_record: funkcja search_record zawiodła: %s\n" #: g10/trustdb.c:1956 #, c-format msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but marked as checked\n" msgstr "" +"UWAGA: wpis podpisu %lu[%d] znajduje się w liście domyślnej %lu,\n" +"ale jest zaznaczony jako sprawdzony.\n" #: g10/trustdb.c:1960 #, c-format msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but not marked\n" msgstr "" +"UWAGA: wpis podpisu %lu[%d] znajduje się w liście domyślnej %lu,\n" +"ale nie jest zaznaczony.\n" #. we need the dir record #: g10/trustdb.c:1967 #, c-format msgid "sig rec %lu[%d] in hintlist of %lu does not point to a dir record\n" msgstr "" +"wpis oi podpisie %lu[%d] w liście domyślnej %lu nie wskazuje \n" +"na wpis katalogowy\n" #: g10/trustdb.c:1973 #, c-format msgid "lid %lu: no primary key\n" -msgstr "" +msgstr "lid %lu: brak klucza głównego\n" #: g10/trustdb.c:2006 -#, fuzzy, c-format +#, c-format msgid "lid %lu: user id not found in keyblock\n" -msgstr "%s: nie znaleziono użytkownika\n" +msgstr "" +"lid %lu: identyfikator użytkownika nie został odnaleziony w bloku klucza\n" #: g10/trustdb.c:2010 -#, fuzzy, c-format +#, c-format msgid "lid %lu: user id without signature\n" -msgstr "klucz %08lX: brak identyfikatora użytkownika do podpisu\n" +msgstr "lid %lu: niepodpisany identyfikator użytkownika\n" #: g10/trustdb.c:2017 #, c-format msgid "lid %lu: self-signature in hintlist\n" -msgstr "" +msgstr "lid %lu: podpis klucza nim samym w liście domyślnej\n" #: g10/trustdb.c:2028 g10/trustdb.c:2747 g10/trustdb.c:2831 msgid "Valid certificate revocation" -msgstr "" +msgstr "Poprawne unieważnienie certyfikatu" #: g10/trustdb.c:2029 g10/trustdb.c:2748 g10/trustdb.c:2832 msgid "Good certificate" -msgstr "" +msgstr "Poprawny certyfikat" #: g10/trustdb.c:2038 msgid "very strange: no public key\n" -msgstr "" +msgstr "bardzo dziwne: brak klucza publicznego\n" #: g10/trustdb.c:2086 #, c-format msgid "hintlist %lu[%d] of %lu does not point to a dir record\n" -msgstr "" +msgstr "lista domyślna %lu[%d] z %lu nie wskazuje na wpis katalogowy\n" #: g10/trustdb.c:2092 #, c-format msgid "lid %lu does not have a key\n" -msgstr "" +msgstr "lid %lu nie ma klucza\n" #: g10/trustdb.c:2102 -#, fuzzy, c-format +#, c-format msgid "lid %lu: can't get keyblock: %s\n" -msgstr "nie mogę zapisać bloku klucza: %s\n" +msgstr "lid %lu: pobranie bloku klucza niemożliwe: %s\n" #: g10/trustdb.c:2159 g10/trustdb.c:3082 -#, fuzzy, c-format +#, c-format msgid "tdbio_search_dir failed: %s\n" -msgstr "Usunięcie opakowania ASCII nie powiodło się: %s\n" +msgstr "Procedura tdbio_search_dir nie powiodła się: %s\n" #: g10/trustdb.c:2312 -#, fuzzy, c-format +#, c-format msgid "key %08lX.%lu: Good subkey binding\n" -msgstr "klucz %08lX: brak identyfikatora użytkownika\n" +msgstr "klucz %08lX.%lu Dobre dowiązanie podklucza\n" #: g10/trustdb.c:2318 g10/trustdb.c:2360 -#, fuzzy, c-format +#, c-format msgid "key %08lX.%lu: Invalid subkey binding: %s\n" -msgstr "klucz %08lX: brak poprawnych identyfikatorów użytkownika\n" +msgstr "klucz %08lX.%lu: Niepoprawne dowiązanie podklucza %s\n" #: g10/trustdb.c:2333 -#, fuzzy, c-format +#, c-format msgid "key %08lX.%lu: Valid key revocation\n" -msgstr "klucz %08lX.%lu: okres ważności upłynął %s\n" +msgstr "klucz %08lX.%lu: Poprawne unieważnienie klucza\n" #: g10/trustdb.c:2339 -#, fuzzy, c-format +#, c-format msgid "key %08lX.%lu: Invalid key revocation: %s\n" -msgstr "klucz %08lX: brak klucza publicznegoL %s\n" +msgstr "klucz %08lX.%lu: Niewłaściwe unieważnienie klucza: %s\n" #: g10/trustdb.c:2354 -#, fuzzy, c-format +#, c-format msgid "key %08lX.%lu: Valid subkey revocation\n" -msgstr "klucz %08lX: brak poprawnych identyfikatorów użytkownika\n" +msgstr "klucz %08lX.%lu: Poprawne unieważnienie podklucza\n" #: g10/trustdb.c:2454 -#, fuzzy msgid "Good self-signature" -msgstr "[podpis klucza nim samym]" +msgstr "Poprawny podpis klucza nim samym" #: g10/trustdb.c:2465 -#, fuzzy msgid "Invalid self-signature" -msgstr "klucz %08lX: niepoprawny podpis właściciela klucza\n" +msgstr "Niepoprawny podpis klucza nim samym" #: g10/trustdb.c:2475 msgid "Valid user ID revocation skipped due to a newer self signature\n" msgstr "" +"Poprawne unieważnienie identyfikatora użytkownika pominięte z powodu \n" +"nowszego podpisu tym samym kluczem\n" #: g10/trustdb.c:2482 -#, fuzzy msgid "Valid user ID revocation\n" -msgstr "Niewłaściwy wybór.\n" +msgstr "Poprawne unieważnienie identyfikatora użytkownika\n" #: g10/trustdb.c:2489 -#, fuzzy msgid "Invalid user ID revocation" -msgstr "Niewłaściwy wybór.\n" +msgstr "Niepoprawne unieważnienie identyfikatora użytkownika" #: g10/trustdb.c:2573 -#, fuzzy msgid "Too many preferences" -msgstr "lista opcji" +msgstr "Zbyt wiele ustawień." #: g10/trustdb.c:2587 msgid "Too many preference items" -msgstr "" +msgstr "Zbyt wiele pozycji w ustawieniach" #: g10/trustdb.c:2726 msgid "Duplicated certificate - deleted" -msgstr "" +msgstr "Podwójna kopia certyfikatu - usunięta" #: g10/trustdb.c:2759 msgid "Hmmm, public key lost?" -msgstr "" +msgstr "Hmmm, klucz publiczny starcony?" #: g10/trustdb.c:2769 g10/trustdb.c:2852 -#, fuzzy msgid "Invalid certificate revocation" -msgstr "Niewłaściwy wybór.\n" +msgstr "Niepoprawne unieważnienie certyfikatu" #: g10/trustdb.c:2770 g10/trustdb.c:2853 -#, fuzzy msgid "Invalid certificate" -msgstr "Niewłaściwy znak w imieniu lub nazwisku\n" +msgstr "Niepoprawny certyfikat" #: g10/trustdb.c:2785 #, c-format msgid "uid %08lX.%lu/%02X%02X: has shadow dir %lu but is not yet marked.\n" msgstr "" +"identyfikator %08lX.%lu/%02X%02X: ma zdublowany katalog %lu,\n" +"ale nie jest jeszcze zaznaczony.\n" #: g10/trustdb.c:2799 #, c-format msgid "sig record %lu[%d] points to wrong record.\n" -msgstr "" +msgstr "zapis o podpisach %lu[%d] wskazuje na zły wpis.\n" #. that should never happen #: g10/trustdb.c:3052 -#, fuzzy, c-format +#, c-format msgid "insert_trust_record: keyblock not found: %s\n" -msgstr "klucz %08lX: brak klucza tajnego: %s\n" +msgstr "insert_trust_record: brak bloku klucza: %s\n" #: g10/trustdb.c:3070 msgid "did not use primary key for insert_trust_record()\n" -msgstr "" +msgstr "głowny klucz nie został użyty w procedurze insert_trust_record()\n" #: g10/ringedit.c:293 -#, fuzzy, c-format +#, c-format msgid "%s: can't create keyring: %s\n" -msgstr "niemożliwy jest zapis do zbioru kluczy: %s\n" +msgstr "%s: stworzenie zbioru kluczy jest niemożliwe: %s\n" #: g10/ringedit.c:299 g10/ringedit.c:1300 #, c-format msgid "%s: keyring created\n" -msgstr "" +msgstr "%s: zbiór kluczy utworzony\n" #: g10/ringedit.c:1486 msgid "WARNING: 2 files with confidential information exists.\n" -msgstr "" +msgstr "OSTRZEŻENIE: Istnieją dwa pliki z poufnymi informacjami.\n" #: g10/ringedit.c:1487 #, c-format msgid "%s is the unchanged one\n" -msgstr "" +msgstr "%s pozostał bez zmian\n" #: g10/ringedit.c:1488 #, c-format msgid "%s is the new one\n" -msgstr "" +msgstr "%s został utworzony\n" #: g10/ringedit.c:1489 msgid "Please fix this possible security flaw\n" -msgstr "" +msgstr "Proszę usunąć to naruszenie zasad bezpieczeństwa\n" #: g10/skclist.c:88 g10/skclist.c:125 msgid "key is not flagged as insecure - can't use it with the faked RNG!\n" msgstr "" +"klucz nie jest oznaczony jako niepewny - nie można go użyć z atrapą \n" +"generatora liczb losowych!\n" #: g10/skclist.c:113 -#, fuzzy, c-format +#, c-format msgid "skipped `%s': %s\n" -msgstr "%s: pominięty: %s\n" +msgstr "pominięty '%s': %s\n" #: g10/skclist.c:119 #, c-format @@ -3056,48 +3007,48 @@ msgid "" "skipped `%s': this is a PGP generated ElGamal key which is not secure for " "signatures!\n" msgstr "" +"pominięty '%s': wygenerowany przez PGP klucz dla algorytmu ElGamala,\n" +"podpisy składane tym kluczem nie zapewniają bezpieczeństwa!\n" #. do not overwrite #: g10/openfile.c:58 #, c-format msgid "File `%s' exists. " -msgstr "Plik `%s' już istnieje. " +msgstr "Plik '%s' już istnieje. " #: g10/openfile.c:60 msgid "Overwrite (y/N)? " msgstr "Nadpisać (t/N)? " #: g10/openfile.c:85 -#, fuzzy msgid "writing to stdout\n" -msgstr "zapisywanie '%s\"\n" +msgstr "zapisywanie na wyjście standardowe\n" #: g10/openfile.c:134 -#, fuzzy, c-format +#, c-format msgid "assuming signed data in `%s'\n" -msgstr "nie mogę otworzyć podpisanego pliku `%s'\n" +msgstr "przyjęto obecność podpisanych danych w '%s'\n" #: g10/openfile.c:181 #, c-format msgid "%s: new options file created\n" -msgstr "" +msgstr "%s: stworzono nowy plik ustawień\n" #: g10/encr-data.c:59 -#, fuzzy, c-format +#, c-format msgid "%s encrypted data\n" -msgstr "szyfrowanie danych" +msgstr "%s zaszyfrowane dane\n" #: g10/encr-data.c:61 #, c-format msgid "encrypted with unknown algorithm %d\n" -msgstr "" +msgstr "zaszyfrowane nieznanym algorytmem %d\n" #: g10/encr-data.c:74 -#, fuzzy msgid "" "WARNING: message was encrypted with a weak key in the symmetric cipher.\n" msgstr "" -"Ostrzeżenie: Informacje były szyfrowane słabym kluczem szyfru " +"OSTRZEŻENIE: Informacje były szyfrowane słabym kluczem szyfru " "symetrycznego.\n" #: g10/seskey.c:52 @@ -3122,10 +3073,14 @@ msgstr "" #: g10/helptext.c:54 msgid "revoked_key.override" msgstr "" +"Jeśli mimo wszystko chcesz użyć tego unieważnionego klucza, odpowiedz " +"\"tak\"." #: g10/helptext.c:58 msgid "untrusted_key.override" -msgstr "If you want to use this untrusted key anyway, answer \"yes\"." +msgstr "" +"Jeśli mimo wszystko chcesz użyć tego klucza, klucza do którego nie masz\n" +"zaufania, odpowiedz \"tak\"." #: g10/helptext.c:62 msgid "pklist.user_id.enter" @@ -3133,44 +3088,70 @@ msgstr "Podaj identyfikator u #: g10/helptext.c:66 msgid "keygen.algo" -msgstr "Select the algorithm to use:Needs more explanation here." +msgstr "" +"Wybór algorytmu.\n" +"DSA (znany też jako DSS) to Algorytm Podpisu Cyfrowego - używać go można " +"tylko\n" +"do tworzenia cyfrowych podpisów. Jego wybór jest sugerowany ponieważ\n" +"sprawdzanie podpisów złożonych algorytmem DSA jest dużo szybsze niż tych\n" +"złożonych algorytmem ElGamala.\n" +"Algorytm ElGamala to algorytm klucza publicznego który nadaje można " +"stosować\n" +"zarówno do szyfrowania jak i do tworzenia podpisów cyfrowych\n" +"W standardzie OpenPGP algorytm ElGamala występuje w dwóch wersjach:\n" +"obsługującej podpisywanie, oraz obsługującej podpisywanie i szyfrowanie; z\n" +"technicznego punktu widzenia algorytm działa tak samo, ale pewne " +"współczynniki\n" +"muszą być dobrane tak aby klucz nadawał się do składania bezpiecznych\n" +"podpisów. Ten program obsługuje obie wersje, ale inne implementacje OpenPGP\n" +"nie muszą rozumieć obsługiwać klucza przeznaczonego jednocześnie do\n" +"podpisywania i szyfrowania.\n" +"Główny klucz musi być zawsze kluczem służącym umożliwiającym podpisywanie,\n" +"dlatego też ten program nie obsługuje osobnych kluczy ElGamala służących " +"tylko\n" +"do szyfrowania." #: g10/helptext.c:82 -#, fuzzy msgid "keygen.algo.elg_se" -msgstr "Select the algorithm to use:Needs more explanation here." +msgstr "" +"Mimo że ten rodzaj kluczy jest zdefiniowany w RFC 2440, wybór takiego " +"klucza\n" +"nie jest sugerowany. Nie wszystkie programy taki klucz są w stanie " +"obsłużyć,\n" +"a podpisy złożone za jego pomocą są duże i ich sprawdzenie zajmuje dużo " +"czasu." #: g10/helptext.c:89 msgid "keygen.size" -msgstr "" +msgstr "Rozmiar klucza" #: g10/helptext.c:93 msgid "keygen.size.huge.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:98 msgid "keygen.size.large.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:103 msgid "keygen.valid" -msgstr "" +msgstr "Podaj żądaną wartość" #: g10/helptext.c:107 msgid "keygen.valid.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:112 msgid "keygen.name" -msgstr "" +msgstr "Podaj nazwę (imię, nazwisko) właściciela klucza" #: g10/helptext.c:117 msgid "keygen.email" -msgstr "" +msgstr "Adres e-mail (opcjonalny ale warto go wpisać)" #: g10/helptext.c:121 msgid "keygen.comment" -msgstr "" +msgstr "Komentarz (opcjonalny)" #: g10/helptext.c:126 msgid "keygen.userid.cmd" @@ -3189,35 +3170,39 @@ msgstr "" #: g10/helptext.c:139 msgid "sign_uid.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:144 msgid "change_passwd.empty.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:149 msgid "keyedit.cmd" -msgstr "Please enter \"help\"." +msgstr "Podaj \"help\" aby zobaczyć listę poleceń." #: g10/helptext.c:153 msgid "keyedit.save.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:158 msgid "keyedit.cancel.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" lub \"nie\"" #: g10/helptext.c:162 msgid "keyedit.sign_all.okay" msgstr "" +"Odpowiedz \"tak\" jeśli chcesz podpisać wszystkie identyfikatory klucza" #: g10/helptext.c:166 msgid "keyedit.remove.uid.okay" msgstr "" +"Odpowiedz \"tak\" jeśli na pewno chcesz skasować ten identyfikator klucza.\n" +"Utracisz wszystkie podpisy innych użytkowników złożone na tym " +"identyfikatorze!" #: g10/helptext.c:171 msgid "keyedit.remove.subkey.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" jeśli na pewno chcesz skasować ten podklucz" #: g10/helptext.c:175 msgid "passphrase.enter" @@ -3232,11 +3217,11 @@ msgstr "" #: g10/helptext.c:186 msgid "detached_signature.filename" -msgstr "" +msgstr "Nazwa pliku którego dotyczy ten podpis" #: g10/helptext.c:190 msgid "openfile.overwrite.okay" -msgstr "" +msgstr "Odpowiedz \"tak\" jeśli na pewno chcesz nadpisać ten plik" #: g10/helptext.c:204 msgid "No help available" @@ -3245,7 +3230,19 @@ msgstr "Pomoc niedost #: g10/helptext.c:216 #, c-format msgid "No help available for `%s'" -msgstr "Brak informacji o `%s'" +msgstr "Brak pomocy o '%s'" + +#~ msgid "second" +#~ msgstr "sekunda" + +#~ msgid "seconds" +#~ msgstr "sekund" + +#~ msgid "invalid clear text header: " +#~ msgstr "niepoprawny nagłówek tekstu jawnego:" + +#~ msgid "This key belongs to us (we have the secret key)\n" +#~ msgstr "Ten klucz należy do nas (mamy odpowiadający mu klucz tajny).\n" #~ msgid "You will see a list of signators etc. here\n" #~ msgstr "Tu ukaże się lista podpisów itd.\n" diff --git a/scripts/ChangeLog b/scripts/ChangeLog index 9f2241b21..a2b6e9019 100644 --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,7 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * config.sub, config.guess: Support i386-emx-os2 + Sun Jan 17 11:04:33 CET 1999 Werner Koch * autogen.sh: Now checks for installed gettext diff --git a/scripts/config.guess b/scripts/config.guess index 03db0ec08..3aa18a54e 100755 --- a/scripts/config.guess +++ b/scripts/config.guess @@ -708,6 +708,10 @@ main () printf ("i860-alliant-bsd\n"); exit (0); #endif +#ifdef __EMX__ + printf ("i386-emx-os2"); exit(0); +#endif + exit (1); } EOF diff --git a/scripts/config.sub b/scripts/config.sub index 34c7b07b4..4d3675dbd 100755 --- a/scripts/config.sub +++ b/scripts/config.sub @@ -282,6 +282,9 @@ case $basic_machine in atarist) basic_machine=m68k-atari ;; + emx) + basic_machine=i386-emx + ;; aux) basic_machine=m68k-apple os=-aux @@ -971,6 +974,9 @@ case $os in -mint) os=-mint ;; + -os2) + os=-os2 + ;; -none) ;; *) diff --git a/scripts/mkwebpage b/scripts/mkwebpage index 8b6782477..f6b9dbd2b 100755 --- a/scripts/mkwebpage +++ b/scripts/mkwebpage @@ -18,6 +18,10 @@ fix_it () { EOF cvs -Q checkout -p gnupg/NEWS >>$dir/NEWS + here=`pwd` + cd $dir + ln -sf gnupg.html index.html + cd $here } diff --git a/tools/bftest.c b/tools/bftest.c index 0bfb4105e..edfb8e36a 100644 --- a/tools/bftest.c +++ b/tools/bftest.c @@ -22,7 +22,7 @@ #include #include #include -#ifdef __MINGW32__ +#ifdef HAVE_DOSISH_SYSTEM #include #include #endif @@ -67,7 +67,7 @@ main(int argc, char **argv) int n, size=4096; int algo; - #ifdef __MINGW32__ + #ifdef HAVE_DOSISH_SYSTEM setmode( fileno(stdin), O_BINARY ); setmode( fileno(stdout), O_BINARY ); #endif diff --git a/tools/shmtest.c b/tools/shmtest.c index 53637e174..1cfb9b4ed 100644 --- a/tools/shmtest.c +++ b/tools/shmtest.c @@ -19,10 +19,10 @@ #include "ttyio.h" #include "i18n.h" -#ifdef __MINGW32__ +#ifdef HAVE_DOSISH_SYSTEM int main( int argc, char **argv ) { - fprintf(stderr, "Sorry, not yet available for Windoze\n"); + fprintf(stderr, "Sorry, not yet available for DOSish systems\n"); exit(1); } #else @@ -193,4 +193,4 @@ main(int argc, char **argv) } -#endif /* !__MINGW32__ */ +#endif diff --git a/util/ChangeLog b/util/ChangeLog index 0c1597a51..a0a534603 100644 --- a/util/ChangeLog +++ b/util/ChangeLog @@ -1,3 +1,10 @@ +Wed Feb 10 17:15:39 CET 1999 Werner Koch + + * dotlock.c (remove_lockfiles): Add cleanup function. + (make_dotlock): Add deadlock check. + + * secmem.c (secmem_malloc): Changed error message. + Wed Jan 20 21:40:21 CET 1999 Werner Koch * http.c (http_wait_response): Moved the shutdown behind the dup diff --git a/util/dotlock.c b/util/dotlock.c index 71e6178b3..656454ee3 100644 --- a/util/dotlock.c +++ b/util/dotlock.c @@ -35,37 +35,56 @@ #include "util.h" #include "memory.h" +struct dotlock_handle { + struct dotlock_handle *next; + char *tname; /* name of lockfile template */ + char *lockname; /* name of the real lockfile */ + int locked; /* lock status */ +}; + + +static DOTLOCK all_lockfiles; static int read_lockfile( const char *name ); +static void remove_lockfiles(void); /**************** - * Create a lockfile with the given name. A TIMEOUT of 0 - * returns immediately, -1 waits forever (hopefully not), other - * values are timeouts in milliseconds. - * Returns: a char pointer used as handle for release lock - * or NULL in case of an error. + * Create a lockfile with the given name and return an object of + * type DOTLOCK which may be used later to actually do the lock. + * A cleanup routine gets installed to cleanup left over locks + * or other files used together with the lockmechanism. + * Althoug the function is called dotlock, this does not necessarily + * mean that real lockfiles are used - the function may decide to + * use fcntl locking. Calling the function with NULL only install + * the atexit handler and maybe used to assure that the cleanup + * is called after all other atexit handlers. * * Notes: This function creates a lock file in the same directory * as file_to_lock with the name "file_to_lock.lock" * A temporary file ".#lk..pid[.threadid] is used. * This function does nothing for Windoze. */ -const char * -make_dotlock( const char *file_to_lock, long timeout ) +DOTLOCK +create_dotlock( const char *file_to_lock ) { - int fd=-1, pid; + static int initialized; + DOTLOCK h; + int fd = -1; char pidstr[16]; - const char *handle = NULL; - char *lockname = NULL; - char *tname = NULL; - int have_tfile = 0; struct utsname uts; const char *nodename; const char *dirpart; int dirpartlen; - const char *maybe_dead=""; - int backoff=0; + if( !initialized ) { + atexit( remove_lockfiles ); + initialized = 1; + } + if( !file_to_lock ) + return NULL; + + h = m_alloc_clear( sizeof *h ); +#ifndef HAVE_DOSISH_SYSTEM sprintf( pidstr, "%10d\n", getpid() ); /* fixme: add the hostname to the second line (FQDN or IP addr?) */ @@ -84,131 +103,180 @@ make_dotlock( const char *file_to_lock, long timeout ) dirpart = file_to_lock; } - #ifdef _THREAD_SAFE - tname = m_alloc( dirpartlen + 6 + strlen(nodename) + 11+ 20 ); - sprintf( tname, "%.*s/.#lk.%s.%d.%p", - dirpartlen, dirpart, nodename, getpid(), &pid ); - #else - tname = m_alloc( dirpartlen + 6 + strlen(nodename) + 11 ); - sprintf( tname, "%.*s/.#lk.%s.%d", - dirpartlen, dirpart, nodename, getpid() ); + #ifdef _REENTRANT + /* fixme: aquire mutex on all_lockfiles */ #endif + h->next = all_lockfiles; + all_lockfiles = h; + + h->tname = m_alloc( dirpartlen + 6+30+ strlen(nodename) + 11 ); + sprintf( h->tname, "%.*s/.#lk%p.%s.%d", + dirpartlen, dirpart, h, nodename, (int)getpid() ); + do { errno = 0; - fd = open( tname, O_WRONLY|O_CREAT|O_EXCL, + fd = open( h->tname, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR ); } while( fd == -1 && errno == EINTR ); if( fd == -1 ) { log_error( "failed to create temporary file `%s': %s\n", - tname, strerror(errno)); - goto leave; + h->tname, strerror(errno)); + m_free(h->tname); + m_free(h); + return NULL; } - have_tfile = 1; if( write(fd, pidstr, 11 ) != 11 ) { - log_fatal( "error writing to `%s': %s\n", tname, strerror(errno) ); - goto leave; + all_lockfiles = h->next; + #ifdef _REENTRANT + /* release mutex */ + #endif + log_fatal( "error writing to `%s': %s\n", h->tname, strerror(errno) ); + close(fd); + unlink(h->tname); + m_free(h->tname); + m_free(h); + return NULL; } if( close(fd) ) { - log_error( "error closing `%s': %s\n", tname, strerror(errno)); - goto leave; + all_lockfiles = h->next; + #ifdef _REENTRANT + /* release mutex */ + #endif + log_error( "error closing `%s': %s\n", h->tname, strerror(errno)); + unlink(h->tname); + m_free(h->tname); + m_free(h); + return NULL; } - fd = -1; - lockname = m_alloc( strlen(file_to_lock) + 6 ); - strcpy(stpcpy(lockname, file_to_lock), ".lock"); + #ifdef _REENTRANT + /* release mutex */ + #endif +#endif /* !HAVE_DOSISH_SYSTEM */ + h->lockname = m_alloc( strlen(file_to_lock) + 6 ); + strcpy(stpcpy(h->lockname, file_to_lock), ".lock"); + return h; +} - retry: - if( !link(tname, lockname) ) {/* fixme: better use stat to check the link count */ - handle = lockname; - lockname = NULL; +static int +maybe_deadlock( DOTLOCK h ) +{ + DOTLOCK r; + + for( r=all_lockfiles; r; r = r->next ) { + if( r != h && r->locked ) + return 1; } - else if( errno == EEXIST ) { - if( (pid = read_lockfile(lockname)) == -1 ) { - if( errno == ENOENT ) { - log_info( "lockfile disappeared\n"); - goto retry; + return 0; +} + +/**************** + * Do a lock on H. A TIMEOUT of 0 returns immediately, + * -1 waits forever (hopefully not), other + * values are timeouts in milliseconds. + * Returns: 0 on success + */ +int +make_dotlock( DOTLOCK h, long timeout ) +{ +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else + int pid; + const char *maybe_dead=""; + int backoff=0; + + if( h->locked ) { + log_debug("oops, `%s' is already locked\n", h->lockname ); + return 0; + } + + for(;;) { + if( !link(h->tname, h->lockname) ) { + /* fixme: better use stat to check the link count */ + h->locked = 1; + return 0; /* okay */ + } + if( errno != EEXIST ) { + log_error( "lock not made: link() failed: %s\n", strerror(errno) ); + return -1; + } + if( (pid = read_lockfile(h->lockname)) == -1 ) { + if( errno != ENOENT ) { + log_info("cannot read lockfile\n"); + return -1; } - log_info("cannot read lockfile\n"); + log_info( "lockfile disappeared\n"); + continue; } else if( pid == getpid() ) { log_info( "Oops: lock already hold by us\n"); - handle = lockname; - lockname = NULL; + h->locked = 1; + return 0; /* okay */ } else if( kill(pid, 0) && errno == ESRCH ) { maybe_dead = " - probably dead"; #if 0 /* we should not do this without checking the permissions */ /* and the hostname */ log_info( "removing stale lockfile (created by %d)", pid ); - remove( lockname ); - goto retry; #endif } if( timeout == -1 ) { struct timeval tv; - log_info( "waiting for lock (hold by %d%s) ...\n", pid, maybe_dead ); + log_info( "waiting for lock (hold by %d%s) %s...\n", + pid, maybe_dead, maybe_deadlock(h)? "(deadlock?) ":""); + + /* can't use sleep, cause signals may be blocked */ tv.tv_sec = 1 + backoff; tv.tv_usec = 0; select(0, NULL, NULL, NULL, &tv); if( backoff < 10 ) backoff++ ; - goto retry; } - /* fixme: implement timeouts */ + else + return -1; } - else - log_error( "lock not made: link() failed: %s\n", strerror(errno) ); - - leave: - if( fd != -1 ) - close(fd); - if( have_tfile ) - remove(tname); - m_free(tname); - m_free(lockname); - return handle; + /*not reached */ +#endif /* !HAVE_DOSISH_SYSTEM */ } -/**************** - * Create a lockfile for a existing file - * Returns: a char pointer used as handle for release lock - * or NULL in case of an error. - * - * Notes: This function creates a lock file in the same directory - * as file_to_lock with the name "lock." - * - * int - * make_inodelock( const char *file_to_lock ) - * - */ - - - /**************** * release a lock * Returns: 0 := success */ int -release_dotlock( const char *lockfile ) +release_dotlock( DOTLOCK h ) { - int pid = read_lockfile( lockfile ); +#ifdef HAVE_DOSISH_SYSTEM + return 0; +#else + int pid; + + if( !h->locked ) { + log_debug("oops, `%s' is not locked\n", h->lockname ); + return 0; + } + + pid = read_lockfile( h->lockname ); if( pid == -1 ) { - log_error( "release_dotlock: lockfile error"); + log_error( "release_dotlock: lockfile error\n"); return -1; } if( pid != getpid() ) { - log_error( "release_dotlock: not our lock (pid=%d)", pid); + log_error( "release_dotlock: not our lock (pid=%d)\n", pid); return -1; } - if( remove( lockfile ) ) { + if( unlink( h->lockname ) ) { log_error( "release_dotlock: error removing lockfile `%s'", - lockfile); + h->lockname); return -1; } - m_free( (char*)lockfile ); + /* fixme: check that the link count is now 1 */ + h->locked = 0; return 0; +#endif /* !HAVE_DOSISH_SYSTEM */ } @@ -218,6 +286,9 @@ release_dotlock( const char *lockfile ) static int read_lockfile( const char *name ) { + #ifdef HAVE_DOSISH_SYSTEM + return 0; + #else int fd, pid; char pidstr[16]; @@ -241,5 +312,29 @@ read_lockfile( const char *name ) return -1; } return pid; + #endif +} + + +static void +remove_lockfiles() +{ + #ifndef HAVE_DOSISH_SYSTEM + DOTLOCK h, h2; + + h = all_lockfiles; + all_lockfiles = NULL; + + while( h ) { + h2 = h->next; + if( h->locked ) + unlink( h->lockname ); + unlink(h->tname); + m_free(h->tname); + m_free(h->lockname); + m_free(h); + h = h2; + } + #endif } diff --git a/util/fileutil.c b/util/fileutil.c index adf5c7a5d..7910631c2 100644 --- a/util/fileutil.c +++ b/util/fileutil.c @@ -38,16 +38,16 @@ char * make_basename(const char *filepath) { char *p; - + if ( !(p=strrchr(filepath, '/')) ) - #ifdef __MINGW32__ - if ( !(p=strrchr(filepath, '\\')) ) - if ( !(p=strrchr(filepath, ':')) ) + #ifdef HAVE_DRIVE_LETTERS + if ( !(p=strrchr(filepath, '\\')) ) + if ( !(p=strrchr(filepath, ':')) ) #endif - { - return m_strdup(filepath); - } - + { + return m_strdup(filepath); + } + return m_strdup(p+1); } @@ -65,21 +65,21 @@ make_dirname(const char *filepath) char *dirname; int dirname_length; char *p; - + if ( !(p=strrchr(filepath, '/')) ) - #ifdef __MINGW32__ - if ( !(p=strrchr(filepath, '\\')) ) - if ( !(p=strrchr(filepath, ':')) ) + #ifdef HAVE_DRIVE_LETTERS + if ( !(p=strrchr(filepath, '\\')) ) + if ( !(p=strrchr(filepath, ':')) ) #endif - { - return m_strdup("."); - } - + { + return m_strdup("."); + } + dirname_length = p-filepath; dirname = m_alloc(dirname_length+1); strncpy(dirname, filepath, dirname_length); dirname[dirname_length] = 0; - + return dirname; } @@ -126,7 +126,7 @@ compare_filenames( const char *a, const char *b ) /* ? check whether this is an absolute filename and * resolve symlinks? */ - #ifdef __MINGW32__ + #ifdef HAVE_DRIVE_LETTERS return stricmp(a,b); #else return strcmp(a,b); diff --git a/util/iobuf.c b/util/iobuf.c index 9fba1fc0b..037d2cdc3 100644 --- a/util/iobuf.c +++ b/util/iobuf.c @@ -126,8 +126,11 @@ file_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len) *(char**)buf = "file_filter"; } else if( control == IOBUFCTRL_FREE ) { - if( fp != stdin && fp != stdout ) + if( fp != stdin && fp != stdout ) { + if( DBG_IOBUF ) + log_debug("%s: close fd %d\n", a->fname, fileno(fp) ); fclose(fp); + } fp = NULL; m_free(a); /* we can free our context now */ } @@ -545,7 +548,8 @@ iobuf_open( const char *fname ) file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len ); file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len ); if( DBG_IOBUF ) - log_debug("iobuf-%d.%d: open `%s'\n", a->no, a->subno, fname ); + log_debug("iobuf-%d.%d: open `%s' fd=%d\n", + a->no, a->subno, fname, fileno(fcx->fp) ); return a; } diff --git a/util/secmem.c b/util/secmem.c index e9bc05abd..0aa4e9f61 100644 --- a/util/secmem.c +++ b/util/secmem.c @@ -217,7 +217,7 @@ void secmem_init( size_t n ) { if( !n ) { - #ifndef __MINGW32__ + #ifndef HAVE_DOSISH_SYSTEM uid_t uid; disable_secmem=1; @@ -245,8 +245,12 @@ secmem_malloc( size_t size ) MEMBLOCK *mb, *mb2; int compressed=0; - if( !pool_okay ) - log_bug("secmem not initialized\n"); + if( !pool_okay ) { + log_info( + _("operation is not possible without initialized secure memory\n")); + log_info(_("(you may have used the wrong program for this task)\n")); + exit(2); + } if( show_warning && !suspend_warning ) { show_warning = 0; print_warn(); diff --git a/util/ttyio.c b/util/ttyio.c index cfc8f4dac..e457949a0 100644 --- a/util/ttyio.c +++ b/util/ttyio.c @@ -105,6 +105,8 @@ init_ttyfp() SetConsoleMode(con.in, DEF_INPMODE ); SetConsoleMode(con.out, DEF_OUTMODE ); + #elif defined(__EMX__) + ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */ #else ttyfp = fopen("/dev/tty", "r+"); if( !ttyfp )