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 */
61typedef 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
70void pgp_init_subregion(pgp_region_t *, pgp_region_t *);
71
72/** pgp_cb_ret_t */
73typedef enum {
74 PGP_RELEASE_MEMORY,
75 PGP_KEEP_MEMORY,
76 PGP_FINISHED
77} pgp_cb_ret_t;
78
79typedef struct pgp_cbdata_t pgp_cbdata_t;
80
81typedef pgp_cb_ret_t pgp_cbfunc_t(const pgp_packet_t *,
82 pgp_cbdata_t *);
83
84pgp_cb_ret_t
85get_passphrase_cb(const pgp_packet_t *, pgp_cbdata_t *);
86
87typedef struct pgp_stream_t pgp_stream_t;
88typedef struct pgp_reader_t pgp_reader_t;
89typedef 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 */
110typedef int pgp_reader_func_t(pgp_stream_t *, void *, size_t, pgp_error_t **,
111 pgp_reader_t *, pgp_cbdata_t *);
112
113typedef void pgp_reader_destroyer_t(pgp_reader_t *);
114
115void pgp_stream_delete(pgp_stream_t *);
116pgp_error_t *pgp_stream_get_errors(pgp_stream_t *);
117pgp_crypt_t *pgp_get_decrypt(pgp_stream_t *);
118
119void pgp_set_callback(pgp_stream_t *, pgp_cbfunc_t *, void *);
120void pgp_callback_push(pgp_stream_t *, pgp_cbfunc_t *, void *);
121void *pgp_callback_arg(pgp_cbdata_t *);
122void *pgp_callback_errors(pgp_cbdata_t *);
123void pgp_reader_set(pgp_stream_t *, pgp_reader_func_t *,
124 pgp_reader_destroyer_t *, void *);
125void pgp_reader_push(pgp_stream_t *, pgp_reader_func_t *,
126 pgp_reader_destroyer_t *, void *);
127void pgp_reader_pop(pgp_stream_t *);
128
129void *pgp_reader_get_arg(pgp_reader_t *);
130
131pgp_cb_ret_t pgp_callback(const pgp_packet_t *,
132 pgp_cbdata_t *);
133pgp_cb_ret_t pgp_stacked_callback(const pgp_packet_t *,
134 pgp_cbdata_t *);
135pgp_reader_t *pgp_readinfo(pgp_stream_t *);
136
137int pgp_parse(pgp_stream_t *, const int);
138
139/** Used to specify whether subpackets should be returned raw, parsed
140* or ignored. */
141typedef 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
147void pgp_parse_options(pgp_stream_t *, pgp_content_enum,
148 pgp_parse_type_t);
149
150unsigned pgp_limited_read(pgp_stream_t *, uint8_t *, size_t, pgp_region_t *,
151 pgp_error_t **, pgp_reader_t *,
152 pgp_cbdata_t *);
153unsigned pgp_stacked_limited_read(pgp_stream_t *, uint8_t *, unsigned,
154 pgp_region_t *, pgp_error_t **,
155 pgp_reader_t *, pgp_cbdata_t *);
156void pgp_parse_hash_init(pgp_stream_t *, pgp_hash_alg_t,
157 const uint8_t *);
158void pgp_parse_hash_data(pgp_stream_t *, const void *, size_t);
159void pgp_parse_hash_finish(pgp_stream_t *);
160pgp_hash_t *pgp_parse_hash_find(pgp_stream_t *, const uint8_t *);
161
162pgp_reader_func_t pgp_stacked_read;
163
164int pgp_decompress(pgp_region_t *, pgp_stream_t *,
165 pgp_compression_type_t);
166unsigned pgp_writez(pgp_output_t *, const uint8_t *,
167 const unsigned);
168
169#endif /* PACKET_PARSE_H_ */
170