summaryrefslogtreecommitdiffstats
path: root/g10/packet.h
blob: c41f32006fc890c8206c512d1cf7d8417cdfaf96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/* packet.h - packet read/write stuff
 *	Copyright (c) 1997 by Werner Koch (dd9jn)
 *
 * This file is part of G10.
 *
 * G10 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,
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#ifndef G10_PACKET_H
#define G10_PACKET_H

#include "types.h"
#include "iobuf.h"
#include "mpi.h"
#include "cipher.h"
#include "filter.h"

typedef enum {
	PKT_NONE	   =0,
	PKT_PUBKEY_ENC	   =1, /* public key encrypted packet */
	PKT_SIGNATURE	   =2, /* secret key encrypted packet */
	PKT_SESSION_KEY    =3, /* session key packet (OpenPGP)*/
	PKT_ONEPASS_SIG    =4, /* one pass sig packet (OpenPGP)*/
	PKT_SECRET_CERT    =5, /* secret key certificate */
	PKT_PUBLIC_CERT    =6, /* public key certificate */
	PKT_SECKEY_SUBCERT =7, /* secret subkey certificate (OpenPGP) */
	PKT_COMPRESSED	   =8, /* compressed data packet */
	PKT_ENCRYPTED	   =9, /* conventional encrypted data */
	PKT_MARKER	  =10, /* marker packet (OpenPGP) */
	PKT_PLAINTEXT	  =11, /* plaintext data with filename and mode */
	PKT_RING_TRUST	  =12, /* keyring trust packet */
	PKT_USER_ID	  =13, /* user id packet */
	PKT_PUBKEY_SUBCERT=14, /* subkey certificate (OpenPGP) */
	PKT_COMMENT	  =16  /* new comment packet (OpenPGP) */
} pkttype_t;

typedef struct packet_struct PACKET;

typedef struct {
    u32     keyid[2];	    /* 64 bit keyid */
    byte    pubkey_algo;    /* algorithm used for public key scheme */
    union {
      struct {
	MPI  a, b;	    /* integers with the encrypteded DEK */
      } elg;
      struct {
	MPI  rsa_integer;   /* integer containing the DEK */
      } rsa;
    } d;
} PKT_pubkey_enc;


typedef struct {
    u32     keyid[2];	    /* 64 bit keyid */
    byte    sig_class;	    /* sig classification */
    byte    digest_algo;    /* algorithm used for digest */
    byte    pubkey_algo;    /* algorithm used for public key scheme */
    byte    last;	    /* a stupid flag */
} PKT_onepass_sig;


typedef struct {
    u32     keyid[2];	    /* 64 bit keyid */
    ulong   local_id;	    /* internal use, valid if > 0 */
    u32     timestamp;	    /* signature made */
    byte    sig_class;	    /* sig classification, append for MD calculation*/
    byte    pubkey_algo;    /* algorithm used for public key scheme */
			    /* (PUBKEY_ALGO_xxx) */
    union {
      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 {
	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;
    } d;
} PKT_signature;


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 */
    ulong   local_id;	    /* internal use, valid if > 0 */
    union {
      struct {
	MPI p;		    /* prime */
	MPI g;		    /* group generator */
	MPI y;		    /* g^x mod p */
      } elg;
      struct {
	MPI rsa_n;	    /* public modulus */
	MPI rsa_e;	    /* public exponent */
      } 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 */
    union {
      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;
      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;
    } d;
} PKT_secret_cert;


typedef struct {
    int  len;		  /* length of data */
    char data[1];
} PKT_comment;

typedef struct {
    int  len;		  /* length of the name */
    char name[1];
} PKT_user_id;

typedef struct {
    u32  len;		  /* reserved */
    byte  algorithm;
    IOBUF buf;		  /* IOBUF reference */
} PKT_compressed;

typedef struct {
    u32  len;		  /* length of encrypted data */
    IOBUF buf;		  /* IOBUF reference */
} PKT_encrypted;

typedef struct {
    u32  len;		  /* length of encrypted data */
    IOBUF buf;		  /* IOBUF reference */
    int mode;
    u32 timestamp;
    int  namelen;
    char name[1];
} PKT_plaintext;

/* combine all packets into a union */
struct packet_struct {
    pkttype_t pkttype;
    union {
	void *generic;
	PKT_pubkey_enc	*pubkey_enc;	/* PKT_PUBKEY_ENC */
	PKT_onepass_sig *onepass_sig;	/* PKT_ONEPASS_SIG */
	PKT_signature	*signature;	/* PKT_SIGNATURE */
	PKT_public_cert *public_cert;	/* PKT_PUBLIC_CERT */
	PKT_secret_cert *secret_cert;	/* PKT_SECRET_CERT */
	PKT_comment	*comment;	/* PKT_COMMENT */
	PKT_user_id	*user_id;	/* PKT_USER_ID */
	PKT_compressed	*compressed;	/* PKT_COMPRESSED */
	PKT_encrypted	*encrypted;	/* PKT_ENCRYPTED */
	PKT_plaintext	*plaintext;	/* PKT_PLAINTEXT */
    } pkt;
};

#define init_packet(a) do { (a)->pkttype = 0;		\
			    (a)->pkt.generic = NULL;	\
		       } while(0)

/*-- mainproc.c --*/
int proc_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 );

/*-- 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 );

/*-- 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 );

/*-- pubkey-enc.c --*/
int get_session_key( PKT_pubkey_enc *k, DEK *dek );

/*-- compress.c --*/
int handle_compressed( PKT_compressed *zd );

/*-- encr-data.c --*/
int decrypt_data( PKT_encrypted *ed, DEK *dek );
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, const char *inname );

/*-- comment.c --*/
int write_comment( IOBUF out, const char *s );

/*-- sign.c --*/
int make_keysig_packet( PKT_signature **ret_sig, PKT_public_cert *pkc,
			PKT_user_id *uid, PKT_secret_cert *skc,
			int sigclass, int digest_algo );

#endif /*G10_PACKET_H*/