See ChangeLog: Tue Apr 6 19:58:12 CEST 1999 Werner Koch
authorWerner Koch <wk@gnupg.org>
Tue, 6 Apr 1999 18:04:55 +0000 (18:04 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 6 Apr 1999 18:04:55 +0000 (18:04 +0000)
12 files changed:
BUGS
cipher/ChangeLog
cipher/cipher.c
cipher/random.c
doc/FAQ
doc/HACKING
doc/OpenPGP
g10/ChangeLog
g10/build-packet.c
g10/import.c
include/ChangeLog
include/cipher.h

diff --git a/BUGS b/BUGS
index 785a1d6..ab9c95f 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -50,21 +50,19 @@ and after about half a day in the rsync snapshots.
 
 [  *] #13 1999-04-05
     Trying to generate very large keys fails with a BUG in read_pool()
+    FIX: 1999-04-06
 
 
 [  *] #14 1999-04-05 <anonymous>
-    If you have the following lines in your "options" file:
-      load-extension twofish
-      cipher-algo twofish
-      s2k-cipher-algo twofish
-    and then try to "gpg --gen-key", everything goes along fine until you
-    verify your password. Then the program crashes with a BUG at line 226
-    of passphrase.c.
+    If you use --s2k-cipher-algo twofish, the the program crashes with
+    a BUG at line 226 of passphrase.c.
+    FIX: 1999-04-06
 
 
-[ **] #15 199-04-05
+[ **] #15 1999-04-05
     Hash calculation for subkey bindings is not according to rfc2440 if
     a 4 byte length header is used for the subkey.
+    FIX: 1999-04-06
 
 
 Next #16
index bfb5860..b1000c8 100644 (file)
@@ -1,3 +1,10 @@
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c (get_random_bits): Can now handle requests > POOLSIZE
+
+       * cipher.c (cipher_open): Now uses standard CFB for automode if
+       the blocksize is gt 8 (according to rfc2440).
+
 Sat Mar 20 11:44:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * rndlinux.c (tty_printf) [IS_MODULE]: Removed.
index ca79fa9..338b2b9 100644 (file)
@@ -340,7 +340,8 @@ cipher_open( int algo, int mode, int secure )
     if( algo == CIPHER_ALGO_DUMMY )
        hd->mode = CIPHER_MODE_DUMMY;
     else if( mode == CIPHER_MODE_AUTO_CFB ) {
-       if( algo == CIPHER_ALGO_BLOWFISH160 || algo >= 100 )
+       if( hd->blocksize > 8
+           || algo == CIPHER_ALGO_BLOWFISH160 || algo >= 100 )
            hd->mode = CIPHER_MODE_CFB;
        else
            hd->mode = CIPHER_MODE_PHILS_CFB;
index eedfcfa..a201c1d 100644 (file)
@@ -169,14 +169,19 @@ random_is_faked()
 byte *
 get_random_bits( size_t nbits, int level, int secure )
 {
-    byte *buf;
+    byte *buf, *p;
     size_t nbytes = (nbits+7)/8;
 
     if( quick_test && level > 1 )
        level = 1;
     MASK_LEVEL(level);
     buf = secure && secure_alloc ? m_alloc_secure( nbytes ) : m_alloc( nbytes );
-    read_pool( buf, nbytes, level );
+    for( p = buf; nbytes > 0; ) {
+       size_t n = nbytes > POOLSIZE? POOLSIZE : nbytes;
+       read_pool( p, n, level );
+       nbytes -= n;
+       p += n;
+    }
     return buf;
 }
 
diff --git a/doc/FAQ b/doc/FAQ
index 751d99c..97bf94a 100644 (file)
--- a/doc/FAQ
+++ b/doc/FAQ
     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 some keys?
  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 more inter-operable, GNUPG
+    encryption.  They only support type 16 (which is identical
+    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
 
  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
+    OpenPGP requires generation of V4 signatures for all kind of
     data.  Use the option "--force-v3-sigs" to generate V3 signatures
     for data.
 
  Q: How can I conventional encrypt a message, so that PGP can decrypt it?
  A: You can't do this for PGP 2.  For PGP 5 you should use this:
 
-       gpg -c --cipher-algo 3des --compress-algo 1 --no-comment myfile
+       gpg -c --cipher-algo 3des --compress-algo 1 myfile
 
     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 normal
     gnupg operation.
   (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
+  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
   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 ;-)
+  When I check GnuPG on a remote system via ssh (I have no Alpha here ;-)
   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.
   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.
+  (ownertrust) to a key.
 
   You can see the validity (calculated trust value) using this command.
 
       gpgm --list-keys --with-colons
 
-  If the first field is "pub", the second field shows you the trust:
+  If the first field is "pub" or "uid", the second field shows you the trust:
 
      o = Unknown (this key is new to the system)
      e = The key has expired
         is only used for keys for which
         the secret key is also available.
 
+  The value in the "pub" record is the best one of all "uid" records.
+
   You can get a list of the assigned trust values (how much you trust
   the owner to correctly sign another person's 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 much 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 much the gnupg thinks a key is valid (that it really belongs
+     says how much 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?
+  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.
      the displayed charset is the one you have activated on your system
      "iso-8859-1" is the most used one, so this is the default.  You can
      change the charset with the option "--charset".  It is important that
-     you active characterset matches the one displayed - if not restrict
+     you active characterset matches the one displayed - if not, restrict
      yourself to plain 7 bit ASCII and no mapping has to be done.
 
index 17ac742..24119a8 100644 (file)
@@ -33,6 +33,14 @@ by sending a mail with "subscribe" in the body to
 Please run scripts/autogen.sh to create some required files.
 
 
+RSYNC access
+============
+The FTP archive is also available by anonymous rsync.  A daily snapshot
+of the CVS head revision is also available.  See rsync(1) and try
+"rsync ftp.gnupg.org::" to see available resources.
+
+
+
 RFCs
 ====
 
@@ -86,8 +94,8 @@ Directory Layout
   ./cipher     Cryptographic functions
   ./g10        GnuPG application
   ./tools      Some helper and demo programs
-  ./keybox     The keybox library
-  ./gcrypt     Stuff needed to build libgcrypt
+  ./keybox     The keybox library (under construction)
+  ./gcrypt     Stuff needed to build libgcrypt (under construction)
 
 
 
@@ -127,13 +135,20 @@ The same option table is also used to parse resource files.
 
 
 
-What is an iobuf
+What is an IOBUF
 ----------------
 This is the data structure used for most I/O of gnupg. It is similar
-to System V Streams but much simpler.  It should be replaced by a cleaner
-and faster implementation.  We are doing to much copying and the semantics
-of "filter" removing are not very clean.  EOF handling is also a problem.
-
+to System V Streams but much simpler.  Because OpenPGP messages are nested
+in different ways; the use of such a system has big advantages.  Here is
+an example, how it works:  If the parser sees a packet header with a partial
+length, it pushes the block_filter onto the IOBUF to handle these partial
+length packets: from now on you don't have to worry about this.  When it sees
+a compressed packet it pushes the uncompress filter and the next read byte
+is one which has already been uncompressed by this filter. Same goes for
+enciphered packet, plaintext packets and so on.  The file g10/encode.c
+might be a good staring point to see how it is used  - actually this is
+the other way: constructing messages using pushed filters but it may be
+easier to understand.
 
 
 How to use the message digest functions
@@ -171,11 +186,33 @@ Both methods may be combined. [Please see the source for the real syntax]
 
 How to use the cipher functions
 -------------------------------
+cipher/cipher.c implements the interface to symmetric encryption functions.
+As usual you have a function to open a cipher (which returns a handle to be used
+with all other functions), some functions to set the key and other stuff and
+a encrypt and decrypt function which does the real work.  YOu probably know
+how to work with files - so it should really be easy to work with these
+functions.  Here is an example:
+
+    CIPHER_HANDLE hd;
 
+    hd = cipher_open( CIPHER_ALGO_TWOFISH, CIPHER_MODE_CFB, 0 );
+    if( !hd )
+       oops( use other funtion to check for the real error );
+    rc = cipher_setkey( hd, key256bit, 32 ) )
+    if( rc )
+       oops( weak key or something like this );
+    cipher_setiv( hd, some_IV_or_NULL_for_all_zeroes );
+    cipher_encrypt( hd, plain, cipher, size );
+    cipher_close( hd );
 
 
 
 How to use the public key functions
 -----------------------------------
+cipher/pubkey.c implements the interface to asymmetric encryption and
+signature functions. This is basically the same as with the symmetric
+counterparts, but due to their nature it is a little bit more complicated.
+
+   [Give an example]
 
 
index e461df7..a32da47 100644 (file)
@@ -2,7 +2,7 @@
                    =================
 
    See RFC2440 for a description of OpenPGP.  I have an annotated version
-   of this RFC online: http://www.d.shuttle.de/isil/gnupg/rfc2440.html
+   of this RFC online: http://www.gnupg.org/rfc2440.html
 
 
 
   ===================
    GnuPG (>0.4.5) is in compliance with RFC2440 despite these exceptions:
 
-    ===> Please can someone check this <=========
-
-    * (5.2) GnuPG generates V4 signatures for all V4 keys.  The option
-      --force-v3-sigs allows to override.
-
-    * (5.3) GnuPG has an option to use simple S2K for "Symmetric-Key
-      Encrypted Session-Key Packets"; however a warning message is
-      issued if this option is active.
-
     * (9.1) states that RSA SHOULD be implemented.  This is not done
       (except with an extension, usable outside the U.S.) due to
       patent problems.
     * (9.2) states that IDEA SHOULD be implemented.  This is not done
       due to patent problems.
 
-    * (12.1) states that an implementation MUST NOT use a symmetric
-      algorithm which is not in the preference list.  GnuPG has an
-      option to override this.
-
-    * A special format of partial packet length exists for v3 packets
-      which can be considered to be in compliance with RFC1991;  this
-      format is only created if a special option is active.
 
    All MAY features are implemented with this exception:
 
 
    Most of the OPTIONAL stuff is implemented.
 
+   There are a couple of options which can be used to override some
+   RFC requirements.  This is always mentioned with the description
+   of that options.
 
+   A special format of partial packet length exists for v3 packets
+   which can be considered to be in compliance with RFC1991;  this
+   format is only created if a special option is active.
 
 
   Some Notes on OpenPGP / PGP Compatibility:
   ==========================================
 
      * PGP 5.x does not accept V4 signatures for anything other than
-       key material.
+       key material.  The GnuPG option --force-v3-sigs mimics this
+       behaviour.
 
      * PGP 5.x does not recognize the "five-octet" lengths in
        new-format headers or in signature subpacket lengths.
index 274637a..91a45a9 100644 (file)
@@ -1,3 +1,12 @@
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c: Removed duped include (John Bley)
+       * mainproc.c: Ditto.
+
+       * build-packet.c (hash_public_key): Fixed hashing of the header.
+
+       * import.c (delete_inv_parts): Allow import of own non-exportable sigs.
+
 Sat Mar 20 13:59:47 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * armor.c (fake_packet): Fix for not not-dash-escaped
index 810bd0d..ca0837f 100644 (file)
@@ -241,6 +241,8 @@ hash_public_key( MD_HANDLE md, PKT_public_key *pk )
 {
     PACKET pkt;
     int rc = 0;
+    int ctb;
+    ulong pktlen;
     int c;
     IOBUF a = iobuf_temp();
   #if 0
@@ -256,6 +258,38 @@ hash_public_key( MD_HANDLE md, PKT_public_key *pk )
     pkt.pkt.public_key = pk;
     if( (rc = build_packet( a, &pkt )) )
        log_fatal("build public_key for hashing failed: %s\n", g10_errstr(rc));
+    /* skip the constructed header */
+    ctb = iobuf_get_noeof(a);
+    pktlen = 0;
+    if( (ctb & 0x40) ) {
+       c = iobuf_get_noeof(a);
+       if( c < 192 )
+           pktlen = c;
+       else if( c < 224 ) {
+           pktlen = (c - 192) * 256;
+           c = iobuf_get_noeof(a);
+           pktlen += c + 192;
+       }
+       else if( c == 255 ) {
+           pktlen  = iobuf_get_noeof(a) << 24;
+           pktlen |= iobuf_get_noeof(a) << 16;
+           pktlen |= iobuf_get_noeof(a) << 8;
+           pktlen |= iobuf_get_noeof(a);
+       }
+    }
+    else {
+       int lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
+       for( ; lenbytes; lenbytes-- ) {
+           pktlen <<= 8;
+           pktlen |= iobuf_get_noeof(a);
+       }
+    }
+    /* hash a header */
+    md_putc( md, 0x99 );
+    pktlen &= 0xffff; /* can't handle longer packets */
+    md_putc( md, pktlen >> 8 );
+    md_putc( md, pktlen & 0xff );
+    /* hash the packet body (don't use pktlen here!) */
     while( (c=iobuf_get(a)) != -1 ) {
       #if 0
        fprintf( fp," %02x", c );
index 920aafb..deab7f4 100644 (file)
@@ -796,7 +796,12 @@ delete_inv_parts( const char *fname, KBNODE keyblock, u32 *keyid )
        else if( node->pkt->pkttype == PKT_SIGNATURE
                 && (p = parse_sig_subpkt2( node->pkt->pkt.signature,
                                            SIGSUBPKT_EXPORTABLE, NULL ))
-                && !*p ) {
+                && !*p
+                && seckey_available( node->pkt->pkt.signature->keyid ) ) {
+           /* here we violate the rfc a bit by still allowing
+            * to import non-exportable signature when we have the
+            * the secret key used to create this signature - it
+            * seems that this makes sense */
            log_info_f(fname, _("key %08lX: non exportable signature "
                                    "(class %02x) - skipped\n"),
                                    (ulong)keyid[1],
index bbb1bc1..0fa6e99 100644 (file)
@@ -1,3 +1,8 @@
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.h (DEK): increased max. key length to 32 bytes
+
+
 Sat Feb 20 21:40:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
        * g10lib.h: Removed file and changed all files that includes this.
index 3c4edc7..75a7b71 100644 (file)
@@ -61,7 +61,7 @@
 typedef struct {
     int algo;
     int keylen;
-    byte key[24]; /* this is the largest used keylen (3des) */
+    byte key[32]; /* this is the largest used keylen (256 bit) */
 } DEK;
 
 struct cipher_handle_s;