1 | /*- |
2 | * Copyright (c) 2009 The NetBSD Foundation, Inc. |
3 | * All rights reserved. |
4 | * |
5 | * This code is derived from software contributed to The NetBSD Foundation |
6 | * by Alistair Crooks (agc@NetBSD.org) |
7 | * |
8 | * Redistribution and use in source and binary forms, with or without |
9 | * modification, are permitted provided that the following conditions |
10 | * are met: |
11 | * 1. Redistributions of source code must retain the above copyright |
12 | * notice, this list of conditions and the following disclaimer. |
13 | * 2. Redistributions in binary form must reproduce the above copyright |
14 | * notice, this list of conditions and the following disclaimer in the |
15 | * documentation and/or other materials provided with the distribution. |
16 | * |
17 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
18 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
19 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
20 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
21 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
22 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
23 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
24 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
25 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
26 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | * POSSIBILITY OF SUCH DAMAGE. |
28 | */ |
29 | /* |
30 | * Copyright (c) 2005-2008 Nominet UK (www.nic.uk) |
31 | * All rights reserved. |
32 | * Contributors: Ben Laurie, Rachel Willmer. The Contributors have asserted |
33 | * their moral rights under the UK Copyright Design and Patents Act 1988 to |
34 | * be recorded as the authors of this copyright work. |
35 | * |
36 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
37 | * use this file except in compliance with the License. |
38 | * |
39 | * You may obtain a copy of the License at |
40 | * http://www.apache.org/licenses/LICENSE-2.0 |
41 | * |
42 | * Unless required by applicable law or agreed to in writing, software |
43 | * distributed under the License is distributed on an "AS IS" BASIS, |
44 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
45 | * |
46 | * See the License for the specific language governing permissions and |
47 | * limitations under the License. |
48 | */ |
49 | |
50 | /** \file |
51 | * packet related headers. |
52 | */ |
53 | |
54 | #ifndef PACKET_H_ |
55 | #define PACKET_H_ |
56 | |
57 | #include <time.h> |
58 | |
59 | #ifdef HAVE_OPENSSL_BN_H |
60 | #include <openssl/bn.h> |
61 | #endif |
62 | |
63 | #include "types.h" |
64 | #include "errors.h" |
65 | |
66 | /* structure to keep track of printing state variables */ |
67 | typedef struct pgp_printstate_t { |
68 | unsigned unarmoured; |
69 | unsigned skipping; |
70 | int indent; |
71 | } pgp_printstate_t; |
72 | |
73 | /** General-use structure for variable-length data |
74 | */ |
75 | |
76 | typedef struct { |
77 | size_t len; |
78 | uint8_t *contents; |
79 | uint8_t mmapped; /* contents need an munmap(2) */ |
80 | } pgp_data_t; |
81 | |
82 | /************************************/ |
83 | /* Packet Tags - RFC4880, 4.2 */ |
84 | /************************************/ |
85 | |
86 | /** Packet Tag - Bit 7 Mask (this bit is always set). |
87 | * The first byte of a packet is the "Packet Tag". It always |
88 | * has bit 7 set. This is the mask for it. |
89 | * |
90 | * \see RFC4880 4.2 |
91 | */ |
92 | #define PGP_PTAG_ALWAYS_SET 0x80 |
93 | |
94 | /** Packet Tag - New Format Flag. |
95 | * Bit 6 of the Packet Tag is the packet format indicator. |
96 | * If it is set, the new format is used, if cleared the |
97 | * old format is used. |
98 | * |
99 | * \see RFC4880 4.2 |
100 | */ |
101 | #define PGP_PTAG_NEW_FORMAT 0x40 |
102 | |
103 | |
104 | /** Old Packet Format: Mask for content tag. |
105 | * In the old packet format bits 5 to 2 (including) |
106 | * are the content tag. This is the mask to apply |
107 | * to the packet tag. Note that you need to |
108 | * shift by #PGP_PTAG_OF_CONTENT_TAG_SHIFT bits. |
109 | * |
110 | * \see RFC4880 4.2 |
111 | */ |
112 | #define PGP_PTAG_OF_CONTENT_TAG_MASK 0x3c |
113 | /** Old Packet Format: Offset for the content tag. |
114 | * As described at #PGP_PTAG_OF_CONTENT_TAG_MASK the |
115 | * content tag needs to be shifted after being masked |
116 | * out from the Packet Tag. |
117 | * |
118 | * \see RFC4880 4.2 |
119 | */ |
120 | #define PGP_PTAG_OF_CONTENT_TAG_SHIFT 2 |
121 | /** Old Packet Format: Mask for length type. |
122 | * Bits 1 and 0 of the packet tag are the length type |
123 | * in the old packet format. |
124 | * |
125 | * See #pgp_ptag_of_lt_t for the meaning of the values. |
126 | * |
127 | * \see RFC4880 4.2 |
128 | */ |
129 | #define PGP_PTAG_OF_LENGTH_TYPE_MASK 0x03 |
130 | |
131 | |
132 | /** Old Packet Format Lengths. |
133 | * Defines the meanings of the 2 bits for length type in the |
134 | * old packet format. |
135 | * |
136 | * \see RFC4880 4.2.1 |
137 | */ |
138 | typedef enum { |
139 | PGP_PTAG_OLD_LEN_1 = 0x00, /* Packet has a 1 byte length - |
140 | * header is 2 bytes long. */ |
141 | PGP_PTAG_OLD_LEN_2 = 0x01, /* Packet has a 2 byte length - |
142 | * header is 3 bytes long. */ |
143 | PGP_PTAG_OLD_LEN_4 = 0x02, /* Packet has a 4 byte |
144 | * length - header is 5 bytes |
145 | * long. */ |
146 | PGP_PTAG_OLD_LEN_INDETERMINATE = 0x03 /* Packet has a |
147 | * indeterminate length. */ |
148 | } pgp_ptag_of_lt_t; |
149 | |
150 | |
151 | /** New Packet Format: Mask for content tag. |
152 | * In the new packet format the 6 rightmost bits |
153 | * are the content tag. This is the mask to apply |
154 | * to the packet tag. Note that you need to |
155 | * shift by #PGP_PTAG_NF_CONTENT_TAG_SHIFT bits. |
156 | * |
157 | * \see RFC4880 4.2 |
158 | */ |
159 | #define PGP_PTAG_NF_CONTENT_TAG_MASK 0x3f |
160 | /** New Packet Format: Offset for the content tag. |
161 | * As described at #PGP_PTAG_NF_CONTENT_TAG_MASK the |
162 | * content tag needs to be shifted after being masked |
163 | * out from the Packet Tag. |
164 | * |
165 | * \see RFC4880 4.2 |
166 | */ |
167 | #define PGP_PTAG_NF_CONTENT_TAG_SHIFT 0 |
168 | |
169 | /* PTag Content Tags */ |
170 | /***************************/ |
171 | |
172 | /** Package Tags (aka Content Tags) and signature subpacket types. |
173 | * This enumerates all rfc-defined packet tag values and the |
174 | * signature subpacket type values that we understand. |
175 | * |
176 | * \see RFC4880 4.3 |
177 | * \see RFC4880 5.2.3.1 |
178 | */ |
179 | typedef enum { |
180 | PGP_PTAG_CT_RESERVED = 0, /* Reserved - a packet tag must |
181 | * not have this value */ |
182 | PGP_PTAG_CT_PK_SESSION_KEY = 1, /* Public-Key Encrypted Session |
183 | * Key Packet */ |
184 | PGP_PTAG_CT_SIGNATURE = 2, /* Signature Packet */ |
185 | PGP_PTAG_CT_SK_SESSION_KEY = 3, /* Symmetric-Key Encrypted Session |
186 | * Key Packet */ |
187 | PGP_PTAG_CT_1_PASS_SIG = 4, /* One-Pass Signature |
188 | * Packet */ |
189 | PGP_PTAG_CT_SECRET_KEY = 5, /* Secret Key Packet */ |
190 | PGP_PTAG_CT_PUBLIC_KEY = 6, /* Public Key Packet */ |
191 | PGP_PTAG_CT_SECRET_SUBKEY = 7, /* Secret Subkey Packet */ |
192 | PGP_PTAG_CT_COMPRESSED = 8, /* Compressed Data Packet */ |
193 | PGP_PTAG_CT_SE_DATA = 9,/* Symmetrically Encrypted Data Packet */ |
194 | PGP_PTAG_CT_MARKER = 10,/* Marker Packet */ |
195 | PGP_PTAG_CT_LITDATA = 11, /* Literal Data Packet */ |
196 | PGP_PTAG_CT_TRUST = 12, /* Trust Packet */ |
197 | PGP_PTAG_CT_USER_ID = 13, /* User ID Packet */ |
198 | PGP_PTAG_CT_PUBLIC_SUBKEY = 14, /* Public Subkey Packet */ |
199 | PGP_PTAG_CT_RESERVED2 = 15, /* reserved */ |
200 | PGP_PTAG_CT_RESERVED3 = 16, /* reserved */ |
201 | PGP_PTAG_CT_USER_ATTR = 17, /* User Attribute Packet */ |
202 | PGP_PTAG_CT_SE_IP_DATA = 18, /* Sym. Encrypted and Integrity |
203 | * Protected Data Packet */ |
204 | PGP_PTAG_CT_MDC = 19, /* Modification Detection Code Packet */ |
205 | |
206 | PGP_PARSER_PTAG = 0x100,/* Internal Use: The packet is the "Packet |
207 | * Tag" itself - used when callback sends |
208 | * back the PTag. */ |
209 | PGP_PTAG_RAW_SS = 0x101,/* Internal Use: content is raw sig subtag */ |
210 | PGP_PTAG_SS_ALL = 0x102,/* Internal Use: select all subtags */ |
211 | PGP_PARSER_PACKET_END = 0x103, |
212 | |
213 | /* signature subpackets (0x200-2ff) (type+0x200) */ |
214 | /* only those we can parse are listed here */ |
215 | PGP_PTAG_SIG_SUBPKT_BASE = 0x200, /* Base for signature |
216 | * subpacket types - All |
217 | * signature type values |
218 | * are relative to this |
219 | * value. */ |
220 | PGP_PTAG_SS_CREATION_TIME = 0x200 + 2, /* signature creation time */ |
221 | PGP_PTAG_SS_EXPIRATION_TIME = 0x200 + 3, /* signature |
222 | * expiration time */ |
223 | |
224 | PGP_PTAG_SS_EXPORT_CERT = 0x200 + 4, /* exportable certification */ |
225 | PGP_PTAG_SS_TRUST = 0x200 + 5, /* trust signature */ |
226 | PGP_PTAG_SS_REGEXP = 0x200 + 6, /* regular expression */ |
227 | PGP_PTAG_SS_REVOCABLE = 0x200 + 7, /* revocable */ |
228 | PGP_PTAG_SS_KEY_EXPIRY = 0x200 + 9, /* key expiration |
229 | * time */ |
230 | PGP_PTAG_SS_RESERVED = 0x200 + 10, /* reserved */ |
231 | PGP_PTAG_SS_PREFERRED_SKA = 0x200 + 11, /* preferred symmetric |
232 | * algs */ |
233 | PGP_PTAG_SS_REVOCATION_KEY = 0x200 + 12, /* revocation key */ |
234 | PGP_PTAG_SS_ISSUER_KEY_ID = 0x200 + 16, /* issuer key ID */ |
235 | PGP_PTAG_SS_NOTATION_DATA = 0x200 + 20, /* notation data */ |
236 | PGP_PTAG_SS_PREFERRED_HASH = 0x200 + 21, /* preferred hash |
237 | * algs */ |
238 | PGP_PTAG_SS_PREF_COMPRESS = 0x200 + 22, /* preferred |
239 | * compression |
240 | * algorithms */ |
241 | PGP_PTAG_SS_KEYSERV_PREFS = 0x200 + 23, /* key server |
242 | * preferences */ |
243 | PGP_PTAG_SS_PREF_KEYSERV = 0x200 + 24, /* Preferred Key |
244 | * Server */ |
245 | PGP_PTAG_SS_PRIMARY_USER_ID = 0x200 + 25, /* primary User ID */ |
246 | PGP_PTAG_SS_POLICY_URI = 0x200 + 26, /* Policy URI */ |
247 | PGP_PTAG_SS_KEY_FLAGS = 0x200 + 27, /* key flags */ |
248 | PGP_PTAG_SS_SIGNERS_USER_ID = 0x200 + 28, /* Signer's User ID */ |
249 | PGP_PTAG_SS_REVOCATION_REASON = 0x200 + 29, /* reason for |
250 | * revocation */ |
251 | PGP_PTAG_SS_FEATURES = 0x200 + 30, /* features */ |
252 | PGP_PTAG_SS_SIGNATURE_TARGET = 0x200 + 31, /* signature target */ |
253 | PGP_PTAG_SS_EMBEDDED_SIGNATURE = 0x200 + 32, /* embedded signature */ |
254 | |
255 | PGP_PTAG_SS_USERDEFINED00 = 0x200 + 100, /* internal or |
256 | * user-defined */ |
257 | PGP_PTAG_SS_USERDEFINED01 = 0x200 + 101, |
258 | PGP_PTAG_SS_USERDEFINED02 = 0x200 + 102, |
259 | PGP_PTAG_SS_USERDEFINED03 = 0x200 + 103, |
260 | PGP_PTAG_SS_USERDEFINED04 = 0x200 + 104, |
261 | PGP_PTAG_SS_USERDEFINED05 = 0x200 + 105, |
262 | PGP_PTAG_SS_USERDEFINED06 = 0x200 + 106, |
263 | PGP_PTAG_SS_USERDEFINED07 = 0x200 + 107, |
264 | PGP_PTAG_SS_USERDEFINED08 = 0x200 + 108, |
265 | PGP_PTAG_SS_USERDEFINED09 = 0x200 + 109, |
266 | PGP_PTAG_SS_USERDEFINED10 = 0x200 + 110, |
267 | |
268 | /* pseudo content types */ |
269 | = 0x300, |
270 | PGP_PTAG_CT_LITDATA_BODY = 0x300 + 1, |
271 | = 0x300 + 2, |
272 | = 0x300 + 3, |
273 | = 0x300 + 4, |
274 | PGP_PTAG_CT_ARMOUR_TRAILER = 0x300 + 5, |
275 | = 0x300 + 6, |
276 | PGP_PTAG_CT_SIGNED_CLEARTEXT_BODY = 0x300 + 7, |
277 | PGP_PTAG_CT_SIGNED_CLEARTEXT_TRAILER = 0x300 + 8, |
278 | PGP_PTAG_CT_UNARMOURED_TEXT = 0x300 + 9, |
279 | PGP_PTAG_CT_ENCRYPTED_SECRET_KEY = 0x300 + 10, /* In this case the |
280 | * algorithm specific |
281 | * fields will not be |
282 | * initialised */ |
283 | = 0x300 + 11, |
284 | PGP_PTAG_CT_SE_DATA_BODY = 0x300 + 12, |
285 | = 0x300 + 13, |
286 | PGP_PTAG_CT_SE_IP_DATA_BODY = 0x300 + 14, |
287 | PGP_PTAG_CT_ENCRYPTED_PK_SESSION_KEY = 0x300 + 15, |
288 | |
289 | /* commands to the callback */ |
290 | PGP_GET_PASSPHRASE = 0x400, |
291 | PGP_GET_SECKEY = 0x400 + 1, |
292 | |
293 | /* Errors */ |
294 | PGP_PARSER_ERROR = 0x500, /* Internal Use: Parser Error */ |
295 | PGP_PARSER_ERRCODE = 0x500 + 1 /* Internal Use: Parser Error |
296 | * with errcode returned */ |
297 | } pgp_content_enum; |
298 | |
299 | enum { |
300 | PGP_REVOCATION_NO_REASON = 0, |
301 | PGP_REVOCATION_SUPERSEDED = 1, |
302 | PGP_REVOCATION_COMPROMISED = 2, |
303 | PGP_REVOCATION_RETIRED = 3, |
304 | PGP_REVOCATION_NO_LONGER_VALID = 0x20 |
305 | }; |
306 | |
307 | /** Structure to hold one error code */ |
308 | typedef struct { |
309 | pgp_errcode_t errcode; |
310 | } pgp_parser_errcode_t; |
311 | |
312 | /** Structure to hold one packet tag. |
313 | * \see RFC4880 4.2 |
314 | */ |
315 | typedef struct { |
316 | unsigned new_format; /* Whether this packet tag is new |
317 | * (1) or old format (0) */ |
318 | unsigned type; /* content_tag value - See |
319 | * #pgp_content_enum for meanings */ |
320 | pgp_ptag_of_lt_t length_type; /* Length type (#pgp_ptag_of_lt_t) |
321 | * - only if this packet tag is old |
322 | * format. Set to 0 if new format. */ |
323 | unsigned length; /* The length of the packet. This value |
324 | * is set when we read and compute the length |
325 | * information, not at the same moment we |
326 | * create the packet tag structure. Only |
327 | * defined if #readc is set. *//* XXX: Ben, is this correct? */ |
328 | unsigned position; /* The position (within the |
329 | * current reader) of the packet */ |
330 | unsigned size; /* number of bits */ |
331 | } pgp_ptag_t; |
332 | |
333 | /** Public Key Algorithm Numbers. |
334 | * OpenPGP assigns a unique Algorithm Number to each algorithm that is part of OpenPGP. |
335 | * |
336 | * This lists algorithm numbers for public key algorithms. |
337 | * |
338 | * \see RFC4880 9.1 |
339 | */ |
340 | typedef enum { |
341 | PGP_PKA_NOTHING = 0, /* No PKA */ |
342 | PGP_PKA_RSA = 1, /* RSA (Encrypt or Sign) */ |
343 | PGP_PKA_RSA_ENCRYPT_ONLY = 2, /* RSA Encrypt-Only (deprecated - |
344 | * \see RFC4880 13.5) */ |
345 | PGP_PKA_RSA_SIGN_ONLY = 3, /* RSA Sign-Only (deprecated - |
346 | * \see RFC4880 13.5) */ |
347 | PGP_PKA_ELGAMAL = 16, /* Elgamal (Encrypt-Only) */ |
348 | PGP_PKA_DSA = 17, /* DSA (Digital Signature Algorithm) */ |
349 | PGP_PKA_RESERVED_ELLIPTIC_CURVE = 18, /* Reserved for Elliptic |
350 | * Curve */ |
351 | PGP_PKA_RESERVED_ECDSA = 19, /* Reserved for ECDSA */ |
352 | PGP_PKA_ELGAMAL_ENCRYPT_OR_SIGN = 20, /* Deprecated. */ |
353 | PGP_PKA_RESERVED_DH = 21, /* Reserved for Diffie-Hellman |
354 | * (X9.42, as defined for |
355 | * IETF-S/MIME) */ |
356 | PGP_PKA_PRIVATE00 = 100,/* Private/Experimental Algorithm */ |
357 | PGP_PKA_PRIVATE01 = 101,/* Private/Experimental Algorithm */ |
358 | PGP_PKA_PRIVATE02 = 102,/* Private/Experimental Algorithm */ |
359 | PGP_PKA_PRIVATE03 = 103,/* Private/Experimental Algorithm */ |
360 | PGP_PKA_PRIVATE04 = 104,/* Private/Experimental Algorithm */ |
361 | PGP_PKA_PRIVATE05 = 105,/* Private/Experimental Algorithm */ |
362 | PGP_PKA_PRIVATE06 = 106,/* Private/Experimental Algorithm */ |
363 | PGP_PKA_PRIVATE07 = 107,/* Private/Experimental Algorithm */ |
364 | PGP_PKA_PRIVATE08 = 108,/* Private/Experimental Algorithm */ |
365 | PGP_PKA_PRIVATE09 = 109,/* Private/Experimental Algorithm */ |
366 | PGP_PKA_PRIVATE10 = 110 /* Private/Experimental Algorithm */ |
367 | } pgp_pubkey_alg_t; |
368 | |
369 | /** Structure to hold one DSA public key params. |
370 | * |
371 | * \see RFC4880 5.5.2 |
372 | */ |
373 | typedef struct { |
374 | BIGNUM *p; /* DSA prime p */ |
375 | BIGNUM *q; /* DSA group order q */ |
376 | BIGNUM *g; /* DSA group generator g */ |
377 | BIGNUM *y; /* DSA public key value y (= g^x mod p |
378 | * with x being the secret) */ |
379 | } pgp_dsa_pubkey_t; |
380 | |
381 | /** Structure to hold an RSA public key. |
382 | * |
383 | * \see RFC4880 5.5.2 |
384 | */ |
385 | typedef struct { |
386 | BIGNUM *n; /* RSA public modulus n */ |
387 | BIGNUM *e; /* RSA public encryption exponent e */ |
388 | } pgp_rsa_pubkey_t; |
389 | |
390 | /** Structure to hold an ElGamal public key params. |
391 | * |
392 | * \see RFC4880 5.5.2 |
393 | */ |
394 | typedef struct { |
395 | BIGNUM *p; /* ElGamal prime p */ |
396 | BIGNUM *g; /* ElGamal group generator g */ |
397 | BIGNUM *y; /* ElGamal public key value y (= g^x mod p |
398 | * with x being the secret) */ |
399 | } pgp_elgamal_pubkey_t; |
400 | |
401 | /** Version. |
402 | * OpenPGP has two different protocol versions: version 3 and version 4. |
403 | * |
404 | * \see RFC4880 5.2 |
405 | */ |
406 | typedef enum { |
407 | PGP_V2 = 2, /* Version 2 (essentially the same as v3) */ |
408 | PGP_V3 = 3, /* Version 3 */ |
409 | PGP_V4 = 4 /* Version 4 */ |
410 | } pgp_version_t; |
411 | |
412 | /** Structure to hold a pgp public key */ |
413 | typedef struct { |
414 | pgp_version_t version;/* version of the key (v3, v4...) */ |
415 | time_t birthtime; |
416 | time_t duration; |
417 | /* validity period of the key in days since |
418 | * creation. A value of 0 has a special meaning |
419 | * indicating this key does not expire. Only used with |
420 | * v3 keys. */ |
421 | unsigned days_valid; /* v4 duration */ |
422 | pgp_pubkey_alg_t alg; /* Public Key Algorithm type */ |
423 | union { |
424 | pgp_dsa_pubkey_t dsa; /* A DSA public key */ |
425 | pgp_rsa_pubkey_t rsa; /* An RSA public key */ |
426 | pgp_elgamal_pubkey_t elgamal; /* An ElGamal public key */ |
427 | } key; /* Public Key Parameters */ |
428 | } pgp_pubkey_t; |
429 | |
430 | /** Structure to hold data for one RSA secret key |
431 | */ |
432 | typedef struct { |
433 | BIGNUM *d; |
434 | BIGNUM *p; |
435 | BIGNUM *q; |
436 | BIGNUM *u; |
437 | } pgp_rsa_seckey_t; |
438 | |
439 | /** pgp_dsa_seckey_t */ |
440 | typedef struct { |
441 | BIGNUM *x; |
442 | } pgp_dsa_seckey_t; |
443 | |
444 | /** pgp_elgamal_seckey_t */ |
445 | typedef struct { |
446 | BIGNUM *x; |
447 | } pgp_elgamal_seckey_t; |
448 | |
449 | /** s2k_usage_t |
450 | */ |
451 | typedef enum { |
452 | PGP_S2KU_NONE = 0, |
453 | PGP_S2KU_ENCRYPTED_AND_HASHED = 254, |
454 | PGP_S2KU_ENCRYPTED = 255 |
455 | } pgp_s2k_usage_t; |
456 | |
457 | /** s2k_specifier_t |
458 | */ |
459 | typedef enum { |
460 | PGP_S2KS_SIMPLE = 0, |
461 | PGP_S2KS_SALTED = 1, |
462 | PGP_S2KS_ITERATED_AND_SALTED = 3 |
463 | } pgp_s2k_specifier_t; |
464 | |
465 | /** Symmetric Key Algorithm Numbers. |
466 | * OpenPGP assigns a unique Algorithm Number to each algorithm that is |
467 | * part of OpenPGP. |
468 | * |
469 | * This lists algorithm numbers for symmetric key algorithms. |
470 | * |
471 | * \see RFC4880 9.2 |
472 | */ |
473 | typedef enum { |
474 | PGP_SA_PLAINTEXT = 0, /* Plaintext or unencrypted data */ |
475 | PGP_SA_IDEA = 1, /* IDEA */ |
476 | PGP_SA_TRIPLEDES = 2, /* TripleDES */ |
477 | PGP_SA_CAST5 = 3, /* CAST5 */ |
478 | PGP_SA_BLOWFISH = 4, /* Blowfish */ |
479 | PGP_SA_AES_128 = 7, /* AES with 128-bit key (AES) */ |
480 | PGP_SA_AES_192 = 8, /* AES with 192-bit key */ |
481 | PGP_SA_AES_256 = 9, /* AES with 256-bit key */ |
482 | PGP_SA_TWOFISH = 10, /* Twofish with 256-bit key (TWOFISH) */ |
483 | PGP_SA_CAMELLIA_128 = 100, /* Camellia with 128-bit key (CAMELLIA) */ |
484 | PGP_SA_CAMELLIA_192 = 101, /* Camellia with 192-bit key */ |
485 | PGP_SA_CAMELLIA_256 = 102 /* Camellia with 256-bit key */ |
486 | } pgp_symm_alg_t; |
487 | |
488 | #define PGP_SA_DEFAULT_CIPHER PGP_SA_CAST5 |
489 | |
490 | /** Hashing Algorithm Numbers. |
491 | * OpenPGP assigns a unique Algorithm Number to each algorithm that is |
492 | * part of OpenPGP. |
493 | * |
494 | * This lists algorithm numbers for hash algorithms. |
495 | * |
496 | * \see RFC4880 9.4 |
497 | */ |
498 | typedef enum { |
499 | PGP_HASH_UNKNOWN = -1, /* used to indicate errors */ |
500 | PGP_HASH_MD5 = 1, /* MD5 */ |
501 | PGP_HASH_SHA1 = 2, /* SHA-1 */ |
502 | PGP_HASH_RIPEMD = 3, /* RIPEMD160 */ |
503 | |
504 | PGP_HASH_SHA256 = 8, /* SHA256 */ |
505 | PGP_HASH_SHA384 = 9, /* SHA384 */ |
506 | PGP_HASH_SHA512 = 10, /* SHA512 */ |
507 | PGP_HASH_SHA224 = 11 /* SHA224 */ |
508 | } pgp_hash_alg_t; |
509 | |
510 | #define PGP_DEFAULT_HASH_ALGORITHM PGP_HASH_SHA256 |
511 | |
512 | void pgp_calc_mdc_hash(const uint8_t *, |
513 | const size_t, |
514 | const uint8_t *, |
515 | const unsigned, |
516 | uint8_t *); |
517 | unsigned pgp_is_hash_alg_supported(const pgp_hash_alg_t *); |
518 | |
519 | /* Maximum block size for symmetric crypto */ |
520 | #define PGP_MAX_BLOCK_SIZE 16 |
521 | |
522 | /* Maximum key size for symmetric crypto */ |
523 | #define PGP_MAX_KEY_SIZE 32 |
524 | |
525 | /* Salt size for hashing */ |
526 | #define PGP_SALT_SIZE 8 |
527 | |
528 | /* Max hash size */ |
529 | #define PGP_MAX_HASH_SIZE 64 |
530 | |
531 | /** pgp_seckey_t |
532 | */ |
533 | typedef struct pgp_seckey_t { |
534 | pgp_pubkey_t pubkey; /* public key */ |
535 | pgp_s2k_usage_t s2k_usage; |
536 | pgp_s2k_specifier_t s2k_specifier; |
537 | pgp_symm_alg_t alg; /* symmetric alg */ |
538 | pgp_hash_alg_t hash_alg; /* hash algorithm */ |
539 | uint8_t salt[PGP_SALT_SIZE]; |
540 | unsigned octetc; |
541 | uint8_t iv[PGP_MAX_BLOCK_SIZE]; |
542 | union { |
543 | pgp_rsa_seckey_t rsa; |
544 | pgp_dsa_seckey_t dsa; |
545 | pgp_elgamal_seckey_t elgamal; |
546 | } key; |
547 | unsigned checksum; |
548 | uint8_t *checkhash; |
549 | } pgp_seckey_t; |
550 | |
551 | /** Signature Type. |
552 | * OpenPGP defines different signature types that allow giving |
553 | * different meanings to signatures. Signature types include 0x10 for |
554 | * generitc User ID certifications (used when Ben signs Weasel's key), |
555 | * Subkey binding signatures, document signatures, key revocations, |
556 | * etc. |
557 | * |
558 | * Different types are used in different places, and most make only |
559 | * sense in their intended location (for instance a subkey binding has |
560 | * no place on a UserID). |
561 | * |
562 | * \see RFC4880 5.2.1 |
563 | */ |
564 | typedef enum { |
565 | PGP_SIG_BINARY = 0x00, /* Signature of a binary document */ |
566 | PGP_SIG_TEXT = 0x01, /* Signature of a canonical text document */ |
567 | PGP_SIG_STANDALONE = 0x02, /* Standalone signature */ |
568 | |
569 | PGP_CERT_GENERIC = 0x10,/* Generic certification of a User ID and |
570 | * Public Key packet */ |
571 | PGP_CERT_PERSONA = 0x11,/* Persona certification of a User ID and |
572 | * Public Key packet */ |
573 | PGP_CERT_CASUAL = 0x12, /* Casual certification of a User ID and |
574 | * Public Key packet */ |
575 | PGP_CERT_POSITIVE = 0x13, /* Positive certification of a |
576 | * User ID and Public Key packet */ |
577 | |
578 | PGP_SIG_SUBKEY = 0x18, /* Subkey Binding Signature */ |
579 | PGP_SIG_PRIMARY = 0x19, /* Primary Key Binding Signature */ |
580 | PGP_SIG_DIRECT = 0x1f, /* Signature directly on a key */ |
581 | |
582 | PGP_SIG_REV_KEY = 0x20, /* Key revocation signature */ |
583 | PGP_SIG_REV_SUBKEY = 0x28, /* Subkey revocation signature */ |
584 | PGP_SIG_REV_CERT = 0x30,/* Certification revocation signature */ |
585 | |
586 | PGP_SIG_TIMESTAMP = 0x40, /* Timestamp signature */ |
587 | |
588 | PGP_SIG_3RD_PARTY = 0x50/* Third-Party Confirmation signature */ |
589 | } pgp_sig_type_t; |
590 | |
591 | /** Struct to hold params of an RSA signature */ |
592 | typedef struct pgp_rsa_sig_t { |
593 | BIGNUM *sig; /* the signature value (m^d % n) */ |
594 | } pgp_rsa_sig_t; |
595 | |
596 | /** Struct to hold params of a DSA signature */ |
597 | typedef struct pgp_dsa_sig_t { |
598 | BIGNUM *r; /* DSA value r */ |
599 | BIGNUM *s; /* DSA value s */ |
600 | } pgp_dsa_sig_t; |
601 | |
602 | /** pgp_elgamal_signature_t */ |
603 | typedef struct pgp_elgamal_sig_t { |
604 | BIGNUM *r; |
605 | BIGNUM *s; |
606 | } pgp_elgamal_sig_t; |
607 | |
608 | #define PGP_KEY_ID_SIZE 8 |
609 | #define PGP_FINGERPRINT_SIZE 20 |
610 | |
611 | /** Struct to hold a signature packet. |
612 | * |
613 | * \see RFC4880 5.2.2 |
614 | * \see RFC4880 5.2.3 |
615 | */ |
616 | typedef struct pgp_sig_info_t { |
617 | pgp_version_t version;/* signature version number */ |
618 | pgp_sig_type_t type; /* signature type value */ |
619 | time_t birthtime; /* creation time of the signature */ |
620 | time_t duration; /* number of seconds it's valid for */ |
621 | uint8_t signer_id[PGP_KEY_ID_SIZE]; /* Eight-octet key ID |
622 | * of signer */ |
623 | pgp_pubkey_alg_t key_alg; /* public key algorithm number */ |
624 | pgp_hash_alg_t hash_alg; /* hashing algorithm number */ |
625 | union { |
626 | pgp_rsa_sig_t rsa; /* An RSA Signature */ |
627 | pgp_dsa_sig_t dsa; /* A DSA Signature */ |
628 | pgp_elgamal_sig_t elgamal; /* deprecated */ |
629 | pgp_data_t unknown; /* private or experimental */ |
630 | } sig; /* signature params */ |
631 | size_t v4_hashlen; |
632 | uint8_t *v4_hashed; |
633 | unsigned birthtime_set:1; |
634 | unsigned signer_id_set:1; |
635 | unsigned duration_set:1; |
636 | } pgp_sig_info_t; |
637 | |
638 | /** Struct used when parsing a signature */ |
639 | typedef struct pgp_sig_t { |
640 | pgp_sig_info_t info; /* The signature information */ |
641 | /* The following fields are only used while parsing the signature */ |
642 | uint8_t hash2[2]; /* high 2 bytes of hashed value */ |
643 | size_t v4_hashstart; /* only valid if accumulate is set */ |
644 | pgp_hash_t *hash; /* the hash filled in for the data so far */ |
645 | } pgp_sig_t; |
646 | |
647 | /** The raw bytes of a signature subpacket */ |
648 | |
649 | typedef struct pgp_ss_raw_t { |
650 | pgp_content_enum tag; |
651 | size_t length; |
652 | uint8_t *raw; |
653 | } pgp_ss_raw_t; |
654 | |
655 | /** Signature Subpacket : Trust Level */ |
656 | |
657 | typedef struct pgp_ss_trust_t { |
658 | uint8_t level; /* Trust Level */ |
659 | uint8_t amount; /* Amount */ |
660 | } pgp_ss_trust_t; |
661 | |
662 | /** Signature Subpacket : Notation Data */ |
663 | typedef struct pgp_ss_notation_t { |
664 | pgp_data_t flags; |
665 | pgp_data_t name; |
666 | pgp_data_t value; |
667 | } pgp_ss_notation_t; |
668 | |
669 | /** Signature Subpacket : Signature Target */ |
670 | typedef struct pgp_ss_sig_target_t { |
671 | pgp_pubkey_alg_t pka_alg; |
672 | pgp_hash_alg_t hash_alg; |
673 | pgp_data_t hash; |
674 | } pgp_ss_sig_target_t; |
675 | |
676 | /** pgp_subpacket_t */ |
677 | typedef struct pgp_subpacket_t { |
678 | pgp_content_enum tag; |
679 | size_t length; |
680 | uint8_t *raw; |
681 | } pgp_subpacket_t; |
682 | |
683 | /** Types of Compression */ |
684 | typedef enum { |
685 | PGP_C_NONE = 0, |
686 | PGP_C_ZIP = 1, |
687 | PGP_C_ZLIB = 2, |
688 | PGP_C_BZIP2 = 3 |
689 | } pgp_compression_type_t; |
690 | |
691 | /** pgp_one_pass_sig_t */ |
692 | typedef struct { |
693 | uint8_t version; |
694 | pgp_sig_type_t sig_type; |
695 | pgp_hash_alg_t hash_alg; |
696 | pgp_pubkey_alg_t key_alg; |
697 | uint8_t keyid[PGP_KEY_ID_SIZE]; |
698 | unsigned nested; |
699 | } pgp_one_pass_sig_t; |
700 | |
701 | /** Signature Subpacket : Revocation Key */ |
702 | typedef struct { |
703 | uint8_t class; |
704 | uint8_t algid; |
705 | uint8_t fingerprint[PGP_FINGERPRINT_SIZE]; |
706 | } pgp_ss_revocation_key_t; |
707 | |
708 | /** Signature Subpacket : Revocation Reason */ |
709 | typedef struct { |
710 | uint8_t code; |
711 | char *reason; |
712 | } pgp_ss_revocation_t; |
713 | |
714 | /** litdata_type_t */ |
715 | typedef enum { |
716 | PGP_LDT_BINARY = 'b', |
717 | PGP_LDT_TEXT = 't', |
718 | PGP_LDT_UTF8 = 'u', |
719 | PGP_LDT_LOCAL = 'l', |
720 | PGP_LDT_LOCAL2 = '1' |
721 | } pgp_litdata_enum; |
722 | |
723 | /** pgp_litdata_header_t */ |
724 | typedef struct { |
725 | pgp_litdata_enum format; |
726 | char filename[256]; |
727 | time_t mtime; |
728 | } ; |
729 | |
730 | /** pgp_litdata_body_t */ |
731 | typedef struct { |
732 | unsigned length; |
733 | uint8_t *data; |
734 | void *mem; /* pgp_memory_t pointer */ |
735 | } pgp_litdata_body_t; |
736 | |
737 | /** pgp_header_var_t */ |
738 | typedef struct { |
739 | char *key; |
740 | char *value; |
741 | } ; |
742 | |
743 | /** pgp_headers_t */ |
744 | typedef struct { |
745 | pgp_header_var_t *; |
746 | unsigned ; |
747 | } ; |
748 | |
749 | /** pgp_armour_header_t */ |
750 | typedef struct { |
751 | const char *type; |
752 | pgp_headers_t ; |
753 | } ; |
754 | |
755 | /** pgp_fixed_body_t */ |
756 | typedef struct pgp_fixed_body_t { |
757 | unsigned length; |
758 | uint8_t data[8192]; /* \todo fix hard-coded value? */ |
759 | } pgp_fixed_body_t; |
760 | |
761 | /** pgp_dyn_body_t */ |
762 | typedef struct pgp_dyn_body_t { |
763 | unsigned length; |
764 | uint8_t *data; |
765 | } pgp_dyn_body_t; |
766 | |
767 | enum { |
768 | PGP_SE_IP_DATA_VERSION = 1, |
769 | PGP_PKSK_V3 = 3 |
770 | }; |
771 | |
772 | /** pgp_pk_sesskey_params_rsa_t */ |
773 | typedef struct { |
774 | BIGNUM *encrypted_m; |
775 | BIGNUM *m; |
776 | } pgp_pk_sesskey_params_rsa_t; |
777 | |
778 | /** pgp_pk_sesskey_params_elgamal_t */ |
779 | typedef struct { |
780 | BIGNUM *g_to_k; |
781 | BIGNUM *encrypted_m; |
782 | } pgp_pk_sesskey_params_elgamal_t; |
783 | |
784 | /** pgp_pk_sesskey_params_t */ |
785 | typedef union { |
786 | pgp_pk_sesskey_params_rsa_t rsa; |
787 | pgp_pk_sesskey_params_elgamal_t elgamal; |
788 | } pgp_pk_sesskey_params_t; |
789 | |
790 | /** pgp_pk_sesskey_t */ |
791 | typedef struct { |
792 | unsigned version; |
793 | uint8_t key_id[PGP_KEY_ID_SIZE]; |
794 | pgp_pubkey_alg_t alg; |
795 | pgp_pk_sesskey_params_t params; |
796 | pgp_symm_alg_t symm_alg; |
797 | uint8_t key[PGP_MAX_KEY_SIZE]; |
798 | uint16_t checksum; |
799 | } pgp_pk_sesskey_t; |
800 | |
801 | /** pgp_seckey_passphrase_t */ |
802 | typedef struct { |
803 | const pgp_seckey_t *seckey; |
804 | char **passphrase; /* point somewhere that gets filled |
805 | * in to work around constness of |
806 | * content */ |
807 | } pgp_seckey_passphrase_t; |
808 | |
809 | /** pgp_get_seckey_t */ |
810 | typedef struct { |
811 | const pgp_seckey_t **seckey; |
812 | const pgp_pk_sesskey_t *pk_sesskey; |
813 | } pgp_get_seckey_t; |
814 | |
815 | /** pgp_parser_union_content_t */ |
816 | typedef union { |
817 | const char *error; |
818 | pgp_parser_errcode_t errcode; |
819 | pgp_ptag_t ptag; |
820 | pgp_pubkey_t pubkey; |
821 | pgp_data_t trust; |
822 | uint8_t *userid; |
823 | pgp_data_t userattr; |
824 | pgp_sig_t sig; |
825 | pgp_ss_raw_t ss_raw; |
826 | pgp_ss_trust_t ss_trust; |
827 | unsigned ss_revocable; |
828 | time_t ss_time; |
829 | uint8_t ss_issuer[PGP_KEY_ID_SIZE]; |
830 | pgp_ss_notation_t ss_notation; |
831 | pgp_subpacket_t packet; |
832 | pgp_compression_type_t compressed; |
833 | pgp_one_pass_sig_t one_pass_sig; |
834 | pgp_data_t ss_skapref; |
835 | pgp_data_t ss_hashpref; |
836 | pgp_data_t ss_zpref; |
837 | pgp_data_t ss_key_flags; |
838 | pgp_data_t ss_key_server_prefs; |
839 | unsigned ss_primary_userid; |
840 | char *ss_regexp; |
841 | char *ss_policy; |
842 | char *ss_keyserv; |
843 | pgp_ss_revocation_key_t ss_revocation_key; |
844 | pgp_data_t ss_userdef; |
845 | pgp_data_t ss_unknown; |
846 | pgp_litdata_header_t ; |
847 | pgp_litdata_body_t litdata_body; |
848 | pgp_dyn_body_t mdc; |
849 | pgp_data_t ss_features; |
850 | pgp_ss_sig_target_t ss_sig_target; |
851 | pgp_data_t ss_embedded_sig; |
852 | pgp_ss_revocation_t ss_revocation; |
853 | pgp_seckey_t seckey; |
854 | uint8_t *ss_signer; |
855 | pgp_armour_header_t ; |
856 | const char *armour_trailer; |
857 | pgp_headers_t cleartext_head; |
858 | pgp_fixed_body_t cleartext_body; |
859 | struct pgp_hash_t *cleartext_trailer; |
860 | pgp_dyn_body_t unarmoured_text; |
861 | pgp_pk_sesskey_t pk_sesskey; |
862 | pgp_seckey_passphrase_t skey_passphrase; |
863 | unsigned ; |
864 | pgp_dyn_body_t se_ip_data_body; |
865 | pgp_fixed_body_t se_data_body; |
866 | pgp_get_seckey_t get_seckey; |
867 | } pgp_contents_t; |
868 | |
869 | /** pgp_packet_t */ |
870 | struct pgp_packet_t { |
871 | pgp_content_enum tag; /* type of contents */ |
872 | uint8_t critical; /* for sig subpackets */ |
873 | pgp_contents_t u; /* union for contents */ |
874 | }; |
875 | |
876 | /** pgp_fingerprint_t */ |
877 | typedef struct { |
878 | uint8_t fingerprint[PGP_FINGERPRINT_SIZE]; |
879 | unsigned length; |
880 | pgp_hash_alg_t hashtype; |
881 | } pgp_fingerprint_t; |
882 | |
883 | int pgp_keyid(uint8_t *, const size_t, const pgp_pubkey_t *, pgp_hash_alg_t); |
884 | int pgp_fingerprint(pgp_fingerprint_t *, const pgp_pubkey_t *, pgp_hash_alg_t); |
885 | |
886 | void pgp_finish(void); |
887 | void pgp_pubkey_free(pgp_pubkey_t *); |
888 | void pgp_userid_free(uint8_t **); |
889 | void pgp_data_free(pgp_data_t *); |
890 | void pgp_sig_free(pgp_sig_t *); |
891 | void pgp_ss_notation_free(pgp_ss_notation_t *); |
892 | void pgp_ss_revocation_free(pgp_ss_revocation_t *); |
893 | void pgp_ss_sig_target_free(pgp_ss_sig_target_t *); |
894 | |
895 | void pgp_subpacket_free(pgp_subpacket_t *); |
896 | void pgp_parser_content_free(pgp_packet_t *); |
897 | void pgp_seckey_free(pgp_seckey_t *); |
898 | void pgp_pk_sesskey_free(pgp_pk_sesskey_t *); |
899 | |
900 | int pgp_print_packet(pgp_printstate_t *, const pgp_packet_t *); |
901 | |
902 | #define DYNARRAY(type, arr) \ |
903 | unsigned arr##c; unsigned arr##vsize; type *arr##s |
904 | |
905 | #define EXPAND_ARRAY(str, arr) do { \ |
906 | if (str->arr##c == str->arr##vsize) { \ |
907 | void *__newarr; \ |
908 | char *__newarrc; \ |
909 | unsigned __newsize; \ |
910 | __newsize = (str->arr##vsize * 2) + 10; \ |
911 | if ((__newarrc = __newarr = realloc(str->arr##s, \ |
912 | __newsize * sizeof(*str->arr##s))) == NULL) { \ |
913 | (void) fprintf(stderr, "EXPAND_ARRAY - bad realloc\n"); \ |
914 | } else { \ |
915 | (void) memset(&__newarrc[str->arr##vsize * sizeof(*str->arr##s)], \ |
916 | 0x0, (__newsize - str->arr##vsize) * sizeof(*str->arr##s)); \ |
917 | str->arr##s = __newarr; \ |
918 | str->arr##vsize = __newsize; \ |
919 | } \ |
920 | } \ |
921 | } while(/*CONSTCOND*/0) |
922 | |
923 | /** pgp_keydata_key_t |
924 | */ |
925 | typedef union { |
926 | pgp_pubkey_t pubkey; |
927 | pgp_seckey_t seckey; |
928 | } pgp_keydata_key_t; |
929 | |
930 | |
931 | /* sigpacket_t */ |
932 | typedef struct { |
933 | uint8_t **userid; |
934 | pgp_subpacket_t *packet; |
935 | } sigpacket_t; |
936 | |
937 | /* user revocation info */ |
938 | typedef struct pgp_revoke_t { |
939 | uint32_t uid; /* index in uid array */ |
940 | uint8_t code; /* revocation code */ |
941 | char *reason; /* c'mon, spill the beans */ |
942 | } pgp_revoke_t; |
943 | |
944 | /** signature subpackets */ |
945 | typedef struct pgp_subsig_t { |
946 | uint32_t uid; /* index in userid array in key */ |
947 | pgp_sig_t sig; /* trust signature */ |
948 | uint8_t trustlevel; /* level of trust */ |
949 | uint8_t trustamount; /* amount of trust */ |
950 | } pgp_subsig_t; |
951 | |
952 | /* describes a user's key */ |
953 | struct pgp_key_t { |
954 | DYNARRAY(uint8_t *, uid); /* array of user ids */ |
955 | DYNARRAY(pgp_subpacket_t, packet); /* array of raw subpackets */ |
956 | DYNARRAY(pgp_subsig_t, subsig); /* array of signature subkeys */ |
957 | DYNARRAY(pgp_revoke_t, revoke); /* array of signature revocations */ |
958 | pgp_content_enum type; /* type of key */ |
959 | pgp_keydata_key_t key; /* pubkey/seckey data */ |
960 | pgp_pubkey_t sigkey; /* signature key */ |
961 | uint8_t sigid[PGP_KEY_ID_SIZE]; |
962 | pgp_fingerprint_t sigfingerprint; /* pgp signature fingerprint */ |
963 | pgp_pubkey_t enckey; /* encryption key */ |
964 | uint8_t encid[PGP_KEY_ID_SIZE]; |
965 | pgp_fingerprint_t encfingerprint; /* pgp encryption id fingerprint */ |
966 | uint32_t uid0; /* primary uid index in uids array */ |
967 | uint8_t revoked; /* key has been revoked */ |
968 | pgp_revoke_t revocation; /* revocation reason */ |
969 | }; |
970 | |
971 | #define MDC_PKT_TAG 0xd3 |
972 | |
973 | #endif /* PACKET_H_ */ |
974 | |