Home | History | Annotate | Line # | Download | only in lib
      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 (at) 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