* build-packet.c (build_sig_subpkt): Comments.
[gnupg.git] / g10 / build-packet.c
index a1f9309..3fec9a8 100644 (file)
@@ -1,5 +1,6 @@
 /* build-packet.c - assemble packets and write them
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -528,14 +529,7 @@ do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc )
 static u32
 calc_plaintext( PKT_plaintext *pt )
 {
-#ifndef __riscos__
     return pt->len? (1 + 1 + pt->namelen + 4 + pt->len) : 0;
-#else
-    /* Under RISC OS, we add ",xxx" to the file name in order to
-       be able to recreate the correct file type on the recipients'
-       side. Therefore we need 4 bytes more. */
-    return pt->len? (1 + 1 + pt->namelen + 4 + pt->len + 4) : 0;
-#endif
 }
 
 static int
@@ -546,28 +540,17 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
     byte buf[1000]; /* this buffer has the plaintext! */
     int nbytes;
 
+    /* Truncate namelen to the maximum 255 characters.  This does mean
+       that a function that calls build_packet with an illegal literal
+       packet will get it back legalized. */
+    if(pt->namelen>255)
+      pt->namelen=255;
+
     write_header(out, ctb, calc_plaintext( pt ) );
     iobuf_put(out, pt->mode );
-#ifndef __riscos__
     iobuf_put(out, pt->namelen );
     for(i=0; i < pt->namelen; i++ )
        iobuf_put(out, pt->name[i] );
-#else
-    /* Under RISC OS, we add ",xxx" to the file name in order to
-       be able to recreate the correct file type on the recipients'
-       side. Therefore we need 4 bytes more. */
-    iobuf_put(out, pt->namelen + 4);
-    for(i=0; i < pt->namelen; i++ )
-        if( pt->name[i] != '/' )
-            iobuf_put(out, pt->name[i] );
-        else
-            iobuf_put(out, '.' );
-    i = riscos_get_filetype( iobuf_get_real_fname( pt->buf ) );
-    iobuf_put(out, ',');
-    iobuf_put(out, "0123456789abcdef"[(i >> 8) & 0xf]);
-    iobuf_put(out, "0123456789abcdef"[(i >> 4) & 0xf]);
-    iobuf_put(out, "0123456789abcdef"[(i >> 0) & 0xf]);
-#endif
     if( write_32(out, pt->timestamp ) )
        rc = G10ERR_WRITE_FILE;
 
@@ -579,7 +562,7 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
        }
        n += nbytes;
     }
-    memset(buf,0,1000); /* at least burn the buffer */
+    wipememory(buf,1000); /* burn the buffer */
     if( !pt->len )
        iobuf_set_block_mode(out, 0 ); /* write end marker */
     else if( n != pt->len )
@@ -778,6 +761,24 @@ build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
          sig->flags.revocable=0;
        break;
 
+      case SIGSUBPKT_TRUST:
+       sig->trust_depth=buffer[0];
+       sig->trust_value=buffer[1];
+       break;
+
+      case SIGSUBPKT_REGEXP:
+       sig->trust_regexp=buffer;
+       break;
+
+       /* This should never happen since we don't currently allow
+          creating such a subpacket, but just in case... */
+      case SIGSUBPKT_SIG_EXPIRE:
+       if(buffer_to_u32(buffer)+sig->timestamp<=make_timestamp())
+         sig->flags.expired=1;
+       else
+         sig->flags.expired=0;
+       break;
+
       default:
        break;
       }
@@ -793,6 +794,10 @@ build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
       case SIGSUBPKT_PRIV_VERIFY_CACHE: /*(obsolete)*/
        BUG();
        break;
+       /* The issuer being unhashed is a historical oddity.  It
+          should work equally as well hashed.  Of course, if even an
+          unhashed issuer is tampered with, it makes it awfully hard
+          to verify the sig... */
       case SIGSUBPKT_ISSUER:
         hashed = 0;
         break;
@@ -884,7 +889,11 @@ build_sig_subpkt_from_sig( PKT_signature *sig )
 
     if(sig->expiredate)
       {
-       u = sig->expiredate-sig->timestamp;
+       if(sig->expiredate>sig->timestamp)
+         u=sig->expiredate-sig->timestamp;
+       else
+         u=0;
+
        buf[0] = (u >> 24) & 0xff;
        buf[1] = (u >> 16) & 0xff;
        buf[2] = (u >>  8) & 0xff;
@@ -1188,4 +1197,3 @@ write_version( IOBUF out, int ctb )
        return -1;
     return 0;
 }
-