* g10.c (main): Use 3DES instead of CAST5 if we don't have CAST5 support.
[gnupg.git] / g10 / build-packet.c
index e24ac3b..269cca3 100644 (file)
@@ -44,7 +44,6 @@ static u32 calc_plaintext( PKT_plaintext *pt );
 static int do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt );
 static int do_encrypted( IOBUF out, int ctb, PKT_encrypted *ed );
 static int do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed );
-static int do_mdc( IOBUF out, PKT_mdc *mdc );
 static int do_compressed( IOBUF out, int ctb, PKT_compressed *cd );
 static int do_signature( IOBUF out, int ctb, PKT_signature *sig );
 static int do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops );
@@ -122,9 +121,6 @@ build_packet( IOBUF out, PACKET *pkt )
       case PKT_ENCRYPTED_MDC:
        rc = do_encrypted_mdc( out, ctb, pkt->pkt.encrypted );
        break;
-      case PKT_MDC:
-       rc = do_mdc( out, pkt->pkt.mdc );
-       break;
       case PKT_COMPRESSED:
        rc = do_compressed( out, ctb, pkt->pkt.compressed );
        break;
@@ -136,6 +132,7 @@ build_packet( IOBUF out, PACKET *pkt )
        break;
       case PKT_RING_TRUST:
        break; /* ignore it (keyring.c does write it directly)*/
+      case PKT_MDC: /* we write it directly, so we should never see it here. */
       default:
        log_bug("invalid packet type in build_packet()\n");
        break;
@@ -393,7 +390,7 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk )
            iobuf_put(a, sk->protect.algo );
            if( sk->protect.s2k.mode >= 1000 ) {
                 /* These modes are not possible in OpenPGP, we use them
-                   to implement our extesnsions, 101 can ve views as a
+                   to implement our extensions, 101 can be seen as a
                    private/experimental extension (this is not
                    specified in rfc2440 but the same scheme is used
                    for all other algorithm identifiers) */
@@ -429,8 +426,20 @@ do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk )
        p = mpi_get_opaque( sk->skey[npkey], &i );
        iobuf_write(a, p, i );
     }
+    else if( sk->is_protected ) {
+        /* The secret key is protected te old v4 way. */
+       for(   ; i < nskey; i++ ) {
+            byte *p;
+            int ndata;
+
+            assert (mpi_is_opaque (sk->skey[i]));
+            p = mpi_get_opaque (sk->skey[i], &ndata);
+            iobuf_write (a, p, ndata);
+        }
+       write_16(a, sk->csum );
+    }
     else {
-        /* v3 way - same code for protected and non- protected key */
+        /* non-protected key */
        for(   ; i < nskey; i++ )
            mpi_write(a, sk->skey[i] );
        write_16(a, sk->csum );
@@ -546,7 +555,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 )
@@ -580,7 +589,8 @@ do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed )
 
     assert( ed->mdc_method );
 
-    n = ed->len ? (ed->len + ed->extralen) : 0;
+    /* Take version number and the following MDC packet in account. */
+    n = ed->len ? (ed->len + ed->extralen + 1 + 22) : 0;
     write_header(out, ctb, n );
     iobuf_put(out, 1 );  /* version */
 
@@ -591,22 +601,15 @@ do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed )
 
 
 static int
-do_mdc( IOBUF out, PKT_mdc *mdc )
-{
-    /* This packet requires a fixed header encoding */
-    iobuf_put( out, 0xd3 ); /* packet ID and 1 byte length */
-    iobuf_put( out, 0x14 ); /* length = 20 */
-    if( iobuf_write( out, mdc->hash, sizeof(mdc->hash) ) )
-       return G10ERR_WRITE_FILE;
-    return 0;
-}
-
-static int
 do_compressed( IOBUF out, int ctb, PKT_compressed *cd )
 {
     int rc = 0;
 
-    /* we must use the old convention and don't use blockmode */
+    /* We must use the old convention and don't use blockmode for tyhe
+       sake of PGP 2 compatibility.  However if the new_ctb flag was
+       set, CTB is already formatted as new style and write_header2
+       does create a partial length encoding using new the new
+       style. */
     write_header2(out, ctb, 0, 0, 0 );
     iobuf_put(out, cd->algorithm );
 
@@ -751,6 +754,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;
       }
@@ -763,8 +784,10 @@ build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
        nlen = 1; /* just a 1 byte length header */
 
     switch( type ) {
-      case SIGSUBPKT_ISSUER:
       case SIGSUBPKT_PRIV_VERIFY_CACHE: /*(obsolete)*/
+       BUG();
+       break;
+      case SIGSUBPKT_ISSUER:
         hashed = 0;
         break;
       default: 
@@ -855,7 +878,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;
@@ -872,8 +899,8 @@ build_sig_subpkt_from_sig( PKT_signature *sig )
 
 void
 build_attribute_subpkt(PKT_user_id *uid,byte type,
-                      const void *buf,int buflen,
-                      const void *header,int headerlen)
+                      const void *buf,u32 buflen,
+                      const void *header,u32 headerlen)
 {
   byte *attrib;
   int idx;
@@ -912,7 +939,8 @@ build_attribute_subpkt(PKT_user_id *uid,byte type,
 
   /* Tack on our data at the end */
 
-  memcpy(&attrib[idx],header,headerlen);
+  if(headerlen>0)
+    memcpy(&attrib[idx],header,headerlen);
   memcpy(&attrib[idx+headerlen],buf,buflen);
   uid->attrib_len+=idx+headerlen+buflen;
 }
@@ -1158,4 +1186,3 @@ write_version( IOBUF out, int ctb )
        return -1;
     return 0;
 }
-