g10: Fix memory leak.
[gnupg.git] / g10 / packet.h
index 194c134..efccc76 100644 (file)
  * 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, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #ifndef G10_PACKET_H
 #define G10_PACKET_H
 
-#include "types.h"
+#include "../common/types.h"
 #include "../common/iobuf.h"
 #include "../common/strlist.h"
 #include "dek.h"
 #include "filter.h"
 #include "../common/openpgpdefs.h"
 #include "../common/userids.h"
-#include "util.h"
+#include "../common/util.h"
 
 #define DEBUG_PARSE_PACKET 1
 
@@ -95,7 +95,9 @@ typedef struct
 typedef struct {
   /* RFC 4880: this must be 4.  */
   byte version;
-  /* The cipher algorithm used.  */
+  /* The cipher algorithm used to encrypt the session key.  (This may
+     be different from the algorithm that is used to encrypt the SED
+     packet.)  */
   byte cipher_algo;
   /* The string-to-key specifier.  */
   STRING2KEY s2k;
@@ -230,6 +232,9 @@ typedef struct
   int numrevkeys;
   pka_info_t *pka_info;      /* Malloced PKA data or NULL if not
                                 available.  See also flags.pka_tried. */
+  char *signers_uid;         /* Malloced value of the SIGNERS_UID
+                              * subpacket or NULL.  This string has
+                              * already been sanitized.  */
   subpktarea_t *hashed;      /* All subpackets with hashed data (v4 only). */
   subpktarea_t *unhashed;    /* Ditto for unhashed data. */
   /* First 2 bytes of the digest.  (Serialized.  Note: this is not
@@ -266,7 +271,7 @@ typedef struct
   struct user_attribute *attribs;
   int numattribs;
   /* If this is not NULL, the packet is a user attribute rather than a
-     user id.  (Serialized.)  */
+     user id (See RFC 4880 5.12).  (Serialized.)  */
   byte *attrib_data;
   /* The length of ATTRIB_DATA.  */
   unsigned long attrib_len;
@@ -275,23 +280,23 @@ typedef struct
   u32 help_key_expire;
   int help_full_count;
   int help_marginal_count;
-  int is_primary;       /* 2 if set via the primary flag, 1 if calculated */
-  int is_revoked;
-  int is_expired;
   u32 expiredate;       /* expires at this date or 0 if not at all */
   prefitem_t *prefs;    /* list of preferences (may be NULL)*/
   u32 created;          /* according to the self-signature */
   byte selfsigversion;
   struct
   {
-    /* TODO: Move more flags here */
     unsigned int mdc:1;
     unsigned int ks_modify:1;
     unsigned int compacted:1;
+    unsigned int primary:2;       /* 2 if set via the primary flag, 1 if calculated */
+    unsigned int revoked:1;
+    unsigned int expired:1;
   } flags;
+  char *mbox;   /* NULL or the result of mailbox_from_userid.  */
   /* The text contained in the user id packet, which is normally the
      name and email address of the key holder (See RFC 4880 5.11).
-     (Serialized.)  */
+     (Serialized.). For convenience an extra Nul is always appended.  */
   char name[1];
 } PKT_user_id;
 
@@ -531,12 +536,14 @@ struct notation
   /* The notation's name.  */
   char *name;
   /* If the notation is human readable, then the value is stored here
-     as a NUL-terminated string.  */
+     as a NUL-terminated string.  If it is not human readable a human
+     readable approximation of the binary value _may_ be stored
+     here.  */
   char *value;
   /* Sometimes we want to %-expand the value.  In these cases, we save
      that transformed value here.  */
   char *altvalue;
-  /* If the notation is not human readable, then the value is strored
+  /* If the notation is not human readable, then the value is stored
      here.  */
   unsigned char *bdat;
   /* The amount of data stored in BDAT.
@@ -552,6 +559,8 @@ struct notation
   {
     /* The notation is critical.  */
     unsigned int critical:1;
+    /* The notation is human readable.  */
+    unsigned int human:1;
     /* The notation should be deleted.  */
     unsigned int ignore:1;
   } flags;
@@ -559,6 +568,7 @@ struct notation
   /* A field to facilitate creating a list of notations.  */
   struct notation *next;
 };
+typedef struct notation *notation_t;
 
 /*-- mainproc.c --*/
 void reset_literals_seen(void);
@@ -757,7 +767,7 @@ gpg_error_t gpg_mpi_write_nohdr (iobuf_t out, gcry_mpi_t a);
 u32 calc_packet_length( PACKET *pkt );
 void build_sig_subpkt( PKT_signature *sig, sigsubpkttype_t type,
                        const byte *buffer, size_t buflen );
-void build_sig_subpkt_from_sig( PKT_signature *sig );
+void build_sig_subpkt_from_sig (PKT_signature *sig, PKT_public_key *pksk);
 int  delete_sig_subpkt(subpktarea_t *buffer, sigsubpkttype_t type );
 void build_attribute_subpkt(PKT_user_id *uid,byte type,
                            const void *buf,u32 buflen,
@@ -793,13 +803,13 @@ int cmp_user_ids( PKT_user_id *a, PKT_user_id *b );
 int check_signature (PKT_signature *sig, gcry_md_hd_t digest);
 
 /* Check a signature.  Looks up the public key from the key db.  (If
  RET_PK is not NULL, it is returned in *RET_PK.)  DIGEST contains a
  valid hash context that already includes the signed data.  This
  function adds the relevant meta-data to the hash before finalizing
  it and verifying the signature.  */
-int check_signature2 (PKT_signature *sig, gcry_md_hd_t digest,
-                     u32 *r_expiredate, int *r_expired, int *r_revoked,
-                     PKT_public_key *ret_pk);
* R_PK is not NULL, it is stored at RET_PK.)  DIGEST contains a
* valid hash context that already includes the signed data.  This
* function adds the relevant meta-data to the hash before finalizing
* it and verifying the signature.  */
+gpg_error_t check_signature2 (PKT_signature *sig, gcry_md_hd_t digest,
+                              u32 *r_expiredate, int *r_expired, int *r_revoked,
+                              PKT_public_key **r_pk);
 
 
 /*-- pubkey-enc.c --*/