| 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 |  * Parser for OpenPGP packets - headers. | 
| 52 |  */ | 
| 53 |  | 
| 54 | #ifndef PACKET_PARSE_H_ | 
| 55 | #define PACKET_PARSE_H_ | 
| 56 |  | 
| 57 | #include "types.h" | 
| 58 | #include "packet.h" | 
| 59 |  | 
| 60 | /** pgp_region_t */ | 
| 61 | typedef struct pgp_region_t { | 
| 62 | 	struct pgp_region_t	*parent; | 
| 63 | 	unsigned		 length; | 
| 64 | 	unsigned		 readc;		/* length read */ | 
| 65 | 	unsigned		 last_read; | 
| 66 | 		/* length of last read, only valid in deepest child */ | 
| 67 | 	unsigned		 indeterminate:1; | 
| 68 | } pgp_region_t; | 
| 69 |  | 
| 70 | void pgp_init_subregion(pgp_region_t *, pgp_region_t *); | 
| 71 |  | 
| 72 | /** pgp_cb_ret_t */ | 
| 73 | typedef enum { | 
| 74 | 	PGP_RELEASE_MEMORY, | 
| 75 | 	PGP_KEEP_MEMORY, | 
| 76 | 	PGP_FINISHED | 
| 77 | } pgp_cb_ret_t; | 
| 78 |  | 
| 79 | typedef struct pgp_cbdata_t	 pgp_cbdata_t; | 
| 80 |  | 
| 81 | typedef pgp_cb_ret_t pgp_cbfunc_t(const pgp_packet_t *, | 
| 82 | 					pgp_cbdata_t *); | 
| 83 |  | 
| 84 | pgp_cb_ret_t | 
| 85 | get_passphrase_cb(const pgp_packet_t *, pgp_cbdata_t *); | 
| 86 |  | 
| 87 | typedef struct pgp_stream_t	pgp_stream_t; | 
| 88 | typedef struct pgp_reader_t		pgp_reader_t; | 
| 89 | typedef struct pgp_cryptinfo_t	pgp_cryptinfo_t; | 
| 90 |  | 
| 91 | /* | 
| 92 |    A reader MUST read at least one byte if it can, and should read up | 
| 93 |    to the number asked for. Whether it reads more for efficiency is | 
| 94 |    its own decision, but if it is a stacked reader it should never | 
| 95 |    read more than the length of the region it operates in (which it | 
| 96 |    would have to be given when it is stacked). | 
| 97 |  | 
| 98 |    If a read is short because of EOF, then it should return the short | 
| 99 |    read (obviously this will be zero on the second attempt, if not the | 
| 100 |    first). Because a reader is not obliged to do a full read, only a | 
| 101 |    zero return can be taken as an indication of EOF. | 
| 102 |  | 
| 103 |    If there is an error, then the callback should be notified, the | 
| 104 |    error stacked, and -1 should be returned. | 
| 105 |  | 
| 106 |    Note that although length is a size_t, a reader will never be asked | 
| 107 |    to read more than INT_MAX in one go. | 
| 108 |  | 
| 109 |  */ | 
| 110 | typedef int pgp_reader_func_t(pgp_stream_t *, void *, size_t, pgp_error_t **, | 
| 111 | 				pgp_reader_t *, pgp_cbdata_t *); | 
| 112 |  | 
| 113 | typedef void pgp_reader_destroyer_t(pgp_reader_t *); | 
| 114 |  | 
| 115 | void pgp_stream_delete(pgp_stream_t *); | 
| 116 | pgp_error_t *pgp_stream_get_errors(pgp_stream_t *); | 
| 117 | pgp_crypt_t *pgp_get_decrypt(pgp_stream_t *); | 
| 118 |  | 
| 119 | void pgp_set_callback(pgp_stream_t *, pgp_cbfunc_t *, void *); | 
| 120 | void pgp_callback_push(pgp_stream_t *, pgp_cbfunc_t *, void *); | 
| 121 | void *pgp_callback_arg(pgp_cbdata_t *); | 
| 122 | void *pgp_callback_errors(pgp_cbdata_t *); | 
| 123 | void pgp_reader_set(pgp_stream_t *, pgp_reader_func_t *, | 
| 124 | 			pgp_reader_destroyer_t *, void *); | 
| 125 | void pgp_reader_push(pgp_stream_t *, pgp_reader_func_t *, | 
| 126 | 			pgp_reader_destroyer_t *, void *); | 
| 127 | void pgp_reader_pop(pgp_stream_t *); | 
| 128 |  | 
| 129 | void *pgp_reader_get_arg(pgp_reader_t *); | 
| 130 |  | 
| 131 | pgp_cb_ret_t pgp_callback(const pgp_packet_t *, | 
| 132 | 					pgp_cbdata_t *); | 
| 133 | pgp_cb_ret_t pgp_stacked_callback(const pgp_packet_t *, | 
| 134 | 					pgp_cbdata_t *); | 
| 135 | pgp_reader_t *pgp_readinfo(pgp_stream_t *); | 
| 136 |  | 
| 137 | int pgp_parse(pgp_stream_t *, const int); | 
| 138 |  | 
| 139 | /** Used to specify whether subpackets should be returned raw, parsed | 
| 140 | * or ignored.  */ | 
| 141 | typedef enum { | 
| 142 | 	PGP_PARSE_RAW,		/* Callback Raw */ | 
| 143 | 	PGP_PARSE_PARSED,	/* Callback Parsed */ | 
| 144 | 	PGP_PARSE_IGNORE	/* Don't callback */ | 
| 145 | } pgp_parse_type_t; | 
| 146 |  | 
| 147 | void pgp_parse_options(pgp_stream_t *, pgp_content_enum, | 
| 148 | 			pgp_parse_type_t); | 
| 149 |  | 
| 150 | unsigned pgp_limited_read(pgp_stream_t *, uint8_t *, size_t, pgp_region_t *, | 
| 151 | 			pgp_error_t **, pgp_reader_t *, | 
| 152 | 			pgp_cbdata_t *); | 
| 153 | unsigned pgp_stacked_limited_read(pgp_stream_t *, uint8_t *, unsigned, | 
| 154 | 			pgp_region_t *, pgp_error_t **, | 
| 155 | 			pgp_reader_t *, pgp_cbdata_t *); | 
| 156 | void pgp_parse_hash_init(pgp_stream_t *, pgp_hash_alg_t, | 
| 157 | 			const uint8_t *); | 
| 158 | void pgp_parse_hash_data(pgp_stream_t *, const void *, size_t); | 
| 159 | void pgp_parse_hash_finish(pgp_stream_t *); | 
| 160 | pgp_hash_t *pgp_parse_hash_find(pgp_stream_t *, const uint8_t *); | 
| 161 |  | 
| 162 | pgp_reader_func_t    pgp_stacked_read; | 
| 163 |  | 
| 164 | int pgp_decompress(pgp_region_t *, pgp_stream_t *, | 
| 165 | 			pgp_compression_type_t); | 
| 166 | unsigned pgp_writez(pgp_output_t *, const uint8_t *, | 
| 167 | 			const unsigned); | 
| 168 |  | 
| 169 | #endif /* PACKET_PARSE_H_ */ | 
| 170 |  |