test release
[gnupg.git] / g10 / packet.h
index 57adebe..8b1e3c4 100644 (file)
@@ -1,14 +1,14 @@
 /* packet.h - packet read/write stuff
- *     Copyright (c) 1997 by Werner Koch (dd9jn)
+ *     Copyright (C) 1998 Free Software Foundation, Inc.
  *
- * This file is part of G10.
+ * This file is part of GNUPG.
  *
- * G10 is free software; you can redistribute it and/or modify
+ * 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.
  *
- * G10 is distributed in the hope that it will be useful,
+ * 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.
 #include "cipher.h"
 #include "filter.h"
 
+#ifndef HAVE_RSA_CIPHER
+/* although we don't have RSA we need these structures to handle keyrings */
+typedef struct { MPI e, n;            } RSA_public_key;
+typedef struct { MPI e, n, p, q, d, u; } RSA_secret_key;
+#endif
+
 typedef enum {
        PKT_NONE           =0,
        PKT_PUBKEY_ENC     =1, /* public key encrypted packet */
@@ -42,23 +48,23 @@ typedef enum {
        PKT_PLAINTEXT     =11, /* plaintext data with filename and mode */
        PKT_RING_TRUST    =12, /* keyring trust packet */
        PKT_USER_ID       =13, /* user id packet */
-       PKT_COMMENT       =14, /* comment packet */
        PKT_PUBKEY_SUBCERT=14, /* subkey certificate (OpenPGP) */
-       PKT_NEW_COMMENT   =16  /* new comment packet (OpenPGP) */
+       PKT_COMMENT       =16  /* new comment packet (OpenPGP) */
 } pkttype_t;
 
 typedef struct packet_struct PACKET;
 
 typedef struct {
     u32     keyid[2];      /* 64 bit keyid */
+    byte    version;
     byte    pubkey_algo;    /* algorithm used for public key scheme */
     union {
       struct {
-       MPI  rsa_integer;   /* integer containing the DEK */
-      } rsa;
-      struct {
        MPI  a, b;          /* integers with the encrypteded DEK */
       } elg;
+      struct {
+       MPI  rsa_integer;   /* integer containing the DEK */
+      } rsa;
     } d;
 } PKT_pubkey_enc;
 
@@ -74,21 +80,26 @@ typedef struct {
 
 typedef struct {
     u32     keyid[2];      /* 64 bit keyid */
+    ulong   local_id;      /* internal use, valid if > 0 */
     u32     timestamp;     /* signature made */
+    byte    version;
     byte    sig_class;     /* sig classification, append for MD calculation*/
     byte    pubkey_algo;    /* algorithm used for public key scheme */
                            /* (PUBKEY_ALGO_xxx) */
+    byte digest_algo;      /* algorithm used for digest (DIGEST_ALGO_xxxx) */
+    byte *hashed_data;     /* all subpackets with hashed  data (v4 only) */
+    byte *unhashed_data;    /* ditto for unhashed data */
+    byte digest_start[2];   /* first 2 bytes of the digest */
     union {
       struct {
-       byte digest_algo;     /* algorithm used for digest (DIGEST_ALGO_xxxx) */
-       byte digest_start[2]; /* first 2 byte of the digest */
-       MPI  rsa_integer;     /* the encrypted digest */
-      } rsa;
-      struct {
-       byte digest_algo;     /* algorithm used for digest (DIGEST_ALGO_xxxx) */
-       byte digest_start[2]; /* first 2 byte of the digest */
        MPI  a, b;            /* integers with the digest */
       } elg;
+      struct {
+       MPI  r, s;            /* integers with the digest */
+      } dsa;
+      struct {
+       MPI  rsa_integer;     /* the encrypted digest */
+      } rsa;
     } d;
 } PKT_signature;
 
@@ -96,63 +107,41 @@ typedef struct {
 typedef struct {
     u32     timestamp;     /* certificate made */
     u16     valid_days;     /* valid for this number of days */
+    byte    hdrbytes;      /* number of header bytes */
+    byte    version;
     byte    pubkey_algo;    /* algorithm used for public key scheme */
-    md_filter_context_t mfx;
+    ulong   local_id;      /* internal use, valid if > 0 */
     union {
-      struct {
-       MPI rsa_n;          /* public modulus */
-       MPI rsa_e;          /* public exponent */
-      } rsa;
-      struct {
-       MPI p;              /* prime */
-       MPI g;              /* group generator */
-       MPI y;              /* g^x mod p */
-      } elg;
+       ELG_public_key elg;
+       DSA_public_key dsa;
+       RSA_public_key rsa;
     } d;
 } PKT_public_cert;
 
 typedef struct {
     u32     timestamp;     /* certificate made */
     u16     valid_days;     /* valid for this number of days */
+    byte    hdrbytes;      /* number of header bytes */
+    byte    version;
     byte    pubkey_algo;    /* algorithm used for public key scheme */
+    byte is_protected; /* The secret infos are protected and must */
+                       /* be decrypteded before use, the protected */
+                       /* MPIs are simply (void*) pointers to memory */
+                       /* and should never be passed to a mpi_xxx() */
+    struct {
+       byte algo;  /* cipher used to protect the secret informations*/
+       byte s2k;
+       byte hash;
+       byte salt[8];
+       byte count;
+       byte iv[8]; /* initialization vector for CFB mode */
+    } protect;
     union {
-      struct {
-       MPI rsa_n;          /* public modulus */
-       MPI rsa_e;          /* public exponent */
-       MPI rsa_d;          /* secret descryption exponent */
-       MPI rsa_p;          /* secret first prime number */
-       MPI rsa_q;          /* secret second prime number */
-       MPI rsa_u;          /* secret multiplicative inverse */
-       u16 csum;           /* checksum */
-       byte is_protected;  /* The above infos are protected and must */
-                           /* be decrypteded before use */
-       byte protect_algo;  /* cipher used to protect the secret informations*/
-       union {             /* information for the protection */
-         struct {
-           byte iv[8];     /* initialization vector for CFB mode */
-                           /* when protected, the MPIs above are pointers
-                            * to plain storage */
-         } blowfish;
-       } protect;
-      } rsa;
-      struct {
-       MPI p;              /* prime */
-       MPI g;              /* group generator */
-       MPI y;              /* g^x mod p */
-       MPI x;              /* secret exponent */
-       u16 csum;           /* checksum */
-       byte is_protected;  /* The above infos are protected and must */
-                           /* be decrypteded before use */
-       byte protect_algo;  /* cipher used to protect the secret informations*/
-       union {             /* information for the protection */
-         struct {
-           byte iv[8];     /* initialization vector for CFB mode */
-                           /* when protected, the MPIs above are pointers
-                            * to plain storage */
-         } blowfish;
-       } protect;
-      } elg;
+       ELG_secret_key elg;
+       DSA_secret_key dsa;
+       RSA_secret_key rsa;
     } d;
+    u16 csum;          /* checksum */
 } PKT_secret_cert;
 
 
@@ -210,32 +199,46 @@ struct packet_struct {
 
 /*-- mainproc.c --*/
 int proc_packets( IOBUF a );
+int proc_signature_packets( IOBUF a, STRLIST signedfiles );
+int proc_encryption_packets( IOBUF a );
+int list_packets( IOBUF a );
 
 /*-- parse-packet.c --*/
 int set_packet_list_mode( int mode );
+int search_packet( IOBUF inp, PACKET *pkt, int pkttype, ulong *retpos );
 int parse_packet( IOBUF inp, PACKET *ret_pkt);
+int copy_all_packets( IOBUF inp, IOBUF out );
+int copy_some_packets( IOBUF inp, IOBUF out, ulong stopoff );
+int skip_some_packets( IOBUF inp, unsigned n );
 
 /*-- build-packet.c --*/
 int build_packet( IOBUF inp, PACKET *pkt );
 u32 calc_packet_length( PACKET *pkt );
-void hash_public_cert( MD_HANDLE *md, PKT_public_cert *pkc );
+void hash_public_cert( MD_HANDLE md, PKT_public_cert *pkc );
 
 /*-- free-packet.c --*/
 void free_pubkey_enc( PKT_pubkey_enc *enc );
 void free_seckey_enc( PKT_signature *enc );
+int  digest_algo_from_sig( PKT_signature *sig );
+void release_public_cert_parts( PKT_public_cert *cert );
 void free_public_cert( PKT_public_cert *cert );
+void release_secret_cert_parts( PKT_secret_cert *cert );
 void free_secret_cert( PKT_secret_cert *cert );
 void free_user_id( PKT_user_id *uid );
 void free_comment( PKT_comment *rem );
 void free_packet( PACKET *pkt );
 PKT_public_cert *copy_public_cert( PKT_public_cert *d, PKT_public_cert *s );
 PKT_secret_cert *copy_secret_cert( PKT_secret_cert *d, PKT_secret_cert *s );
+int cmp_public_certs( PKT_public_cert *a, PKT_public_cert *b );
+int cmp_public_secret_cert( PKT_public_cert *pkc, PKT_secret_cert *skc );
+int cmp_user_ids( PKT_user_id *a, PKT_user_id *b );
 
 
 /*-- sig-check.c --*/
-int signature_check( PKT_signature *sig, MD_HANDLE *digest );
+int signature_check( PKT_signature *sig, MD_HANDLE digest );
 
 /*-- seckey-cert.c --*/
+int is_secret_key_protected( PKT_secret_cert *cert );
 int check_secret_key( PKT_secret_cert *cert );
 int protect_secret_key( PKT_secret_cert *cert, DEK *dek );
 
@@ -243,7 +246,8 @@ int protect_secret_key( PKT_secret_cert *cert, DEK *dek );
 int get_session_key( PKT_pubkey_enc *k, DEK *dek );
 
 /*-- compress.c --*/
-int handle_compressed( PKT_compressed *zd );
+int handle_compressed( PKT_compressed *cd,
+                      int (*callback)(IOBUF, void *), void *passthru );
 
 /*-- encr-data.c --*/
 int decrypt_data( PKT_encrypted *ed, DEK *dek );
@@ -251,7 +255,7 @@ int encrypt_data( PKT_encrypted *ed, DEK *dek );
 
 /*-- plaintext.c --*/
 int handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx );
-int ask_for_detached_datafile( md_filter_context_t *mfx );
+int ask_for_detached_datafile( md_filter_context_t *mfx, const char *inname );
 
 /*-- comment.c --*/
 int write_comment( IOBUF out, const char *s );