| 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 |  |