xref: /netbsd-src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c (revision 7f21db1c0118155e0dd40b75182e30c589d9f63e)
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  * \brief Parser for OpenPGP packets
52  */
53 #include "config.h"
54 
55 #ifdef HAVE_SYS_CDEFS_H
56 #include <sys/cdefs.h>
57 #endif
58 
59 #if defined(__NetBSD__)
60 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
61 __RCSID("$NetBSD: packet-parse.c,v 1.29 2010/02/06 10:50:52 dsl Exp $");
62 #endif
63 
64 #ifdef HAVE_OPENSSL_CAST_H
65 #include <openssl/cast.h>
66 #endif
67 
68 #include <stdarg.h>
69 #include <stdlib.h>
70 #include <string.h>
71 
72 #ifdef HAVE_UNISTD_H
73 #include <unistd.h>
74 #endif
75 
76 #ifdef HAVE_LIMITS_H
77 #include <limits.h>
78 #endif
79 
80 #include "packet.h"
81 #include "packet-parse.h"
82 #include "keyring.h"
83 #include "errors.h"
84 #include "packet-show.h"
85 #include "create.h"
86 #include "readerwriter.h"
87 #include "netpgpdefs.h"
88 #include "crypto.h"
89 #include "netpgpdigest.h"
90 
91 #define ERRP(cbinfo, cont, err)	do {					\
92 	cont.u.error.error = err;					\
93 	CALLBACK(OPS_PARSER_ERROR, cbinfo, &cont);			\
94 	return 0;							\
95 	/*NOTREACHED*/							\
96 } while(/*CONSTCOND*/0)
97 
98 /**
99  * limread_data reads the specified amount of the subregion's data
100  * into a data_t structure
101  *
102  * \param data	Empty structure which will be filled with data
103  * \param len	Number of octets to read
104  * \param subregion
105  * \param stream	How to parse
106  *
107  * \return 1 on success, 0 on failure
108  */
109 static int
110 limread_data(__ops_data_t *data, unsigned int len,
111 		  __ops_region_t *subregion, __ops_stream_t *stream)
112 {
113 	data->len = len;
114 
115 	if (subregion->length - subregion->readc < len) {
116 		(void) fprintf(stderr, "limread_data: bad length\n");
117 		return 0;
118 	}
119 
120 	data->contents = calloc(1, data->len);
121 	if (!data->contents) {
122 		return 0;
123 	}
124 
125 	return __ops_limited_read(data->contents, data->len, subregion,
126 			&stream->errors, &stream->readinfo, &stream->cbinfo);
127 }
128 
129 /**
130  * read_data reads the remainder of the subregion's data
131  * into a data_t structure
132  *
133  * \param data
134  * \param subregion
135  * \param stream
136  *
137  * \return 1 on success, 0 on failure
138  */
139 static int
140 read_data(__ops_data_t *data, __ops_region_t *region, __ops_stream_t *stream)
141 {
142 	int	cc;
143 
144 	cc = region->length - region->readc;
145 	return (cc >= 0) ? limread_data(data, (unsigned)cc, region, stream) : 0;
146 }
147 
148 /**
149  * Reads the remainder of the subregion as a string.
150  * It is the user's responsibility to free the memory allocated here.
151  */
152 
153 static int
154 read_unsig_str(unsigned char **str, __ops_region_t *subregion,
155 		     __ops_stream_t *stream)
156 {
157 	size_t	len;
158 
159 	len = subregion->length - subregion->readc;
160 	if ((*str = calloc(1, len + 1)) == NULL) {
161 		return 0;
162 	}
163 	if (len &&
164 	    !__ops_limited_read(*str, len, subregion, &stream->errors,
165 				     &stream->readinfo, &stream->cbinfo)) {
166 		return 0;
167 	}
168 	(*str)[len] = '\0';
169 	return 1;
170 }
171 
172 static int
173 read_string(char **str, __ops_region_t *subregion, __ops_stream_t *stream)
174 {
175 	return read_unsig_str((unsigned char **) str, subregion, stream);
176 }
177 
178 void
179 __ops_init_subregion(__ops_region_t *subregion, __ops_region_t *region)
180 {
181 	(void) memset(subregion, 0x0, sizeof(*subregion));
182 	subregion->parent = region;
183 }
184 
185 /*
186  * XXX: replace __ops_ptag_t with something more appropriate for limiting reads
187  */
188 
189 /**
190  * low-level function to read data from reader function
191  *
192  * Use this function, rather than calling the reader directly.
193  *
194  * If the accumulate flag is set in *stream, the function
195  * adds the read data to the accumulated data, and updates
196  * the accumulated length. This is useful if, for example,
197  * the application wants access to the raw data as well as the
198  * parsed data.
199  *
200  * This function will also try to read the entire amount asked for, but not
201  * if it is over INT_MAX. Obviously many callers will know that they
202  * never ask for that much and so can avoid the extra complexity of
203  * dealing with return codes and filled-in lengths.
204  *
205  * \param *dest
206  * \param *plength
207  * \param flags
208  * \param *stream
209  *
210  * \return OPS_R_OK
211  * \return OPS_R_PARTIAL_READ
212  * \return OPS_R_EOF
213  * \return OPS_R_EARLY_EOF
214  *
215  * \sa #__ops_reader_ret_t for details of return codes
216  */
217 
218 static int
219 sub_base_read(void *dest, size_t length, __ops_error_t **errors,
220 	      __ops_reader_t *readinfo, __ops_cbdata_t *cbinfo)
221 {
222 	size_t          n;
223 
224 	/* reading more than this would look like an error */
225 	if (length > INT_MAX)
226 		length = INT_MAX;
227 
228 	for (n = 0; n < length;) {
229 		int	r;
230 
231 		r = readinfo->reader((char *) dest + n, length - n, errors,
232 				readinfo, cbinfo);
233 		if (r > (int)(length - n)) {
234 			(void) fprintf(stderr, "sub_base_read: bad read\n");
235 			return 0;
236 		}
237 		if (r < 0) {
238 			return r;
239 		}
240 		if (r == 0) {
241 			break;
242 		}
243 		n += (unsigned)r;
244 	}
245 
246 	if (n == 0) {
247 		return 0;
248 	}
249 	if (readinfo->accumulate) {
250 		if (readinfo->asize < readinfo->alength) {
251 			(void) fprintf(stderr, "sub_base_read: bad size\n");
252 			return 0;
253 		}
254 		if (readinfo->alength + n > readinfo->asize) {
255 			unsigned char	*temp;
256 
257 			readinfo->asize = (readinfo->asize * 2) + n;
258 			temp = realloc(readinfo->accumulated, readinfo->asize);
259 			if (temp == NULL) {
260 				(void) fprintf(stderr,
261 					"sub_base_read: bad alloc\n");
262 				return 0;
263 			}
264 			readinfo->accumulated = temp;
265 		}
266 		if (readinfo->asize < readinfo->alength + n) {
267 			(void) fprintf(stderr, "sub_base_read: bad realloc\n");
268 			return 0;
269 		}
270 		(void) memcpy(readinfo->accumulated + readinfo->alength, dest,
271 				n);
272 	}
273 	/* we track length anyway, because it is used for packet offsets */
274 	readinfo->alength += n;
275 	/* and also the position */
276 	readinfo->position += n;
277 
278 	return n;
279 }
280 
281 int
282 __ops_stacked_read(void *dest, size_t length, __ops_error_t **errors,
283 		 __ops_reader_t *readinfo, __ops_cbdata_t *cbinfo)
284 {
285 	return sub_base_read(dest, length, errors, readinfo->next, cbinfo);
286 }
287 
288 /* This will do a full read so long as length < MAX_INT */
289 static int
290 base_read(unsigned char *dest, size_t length,
291 	  __ops_stream_t *stream)
292 {
293 	return sub_base_read(dest, length, &stream->errors, &stream->readinfo,
294 			     &stream->cbinfo);
295 }
296 
297 /*
298  * Read a full size_t's worth. If the return is < than length, then
299  * *last_read tells you why - < 0 for an error, == 0 for EOF
300  */
301 
302 static size_t
303 full_read(unsigned char *dest,
304 		size_t length,
305 		int *last_read,
306 		__ops_error_t **errors,
307 		__ops_reader_t *readinfo,
308 		__ops_cbdata_t *cbinfo)
309 {
310 	size_t          t;
311 	int             r = 0;	/* preset in case some loon calls with length
312 				 * == 0 */
313 
314 	for (t = 0; t < length;) {
315 		r = sub_base_read(dest + t, length - t, errors, readinfo,
316 				cbinfo);
317 		if (r <= 0) {
318 			*last_read = r;
319 			return t;
320 		}
321 		t += (size_t)r;
322 	}
323 
324 	*last_read = r;
325 
326 	return t;
327 }
328 
329 
330 
331 /** Read a scalar value of selected length from reader.
332  *
333  * Read an unsigned scalar value from reader in Big Endian representation.
334  *
335  * This function does not know or care about packet boundaries. It
336  * also assumes that an EOF is an error.
337  *
338  * \param *result	The scalar value is stored here
339  * \param *reader	Our reader
340  * \param length	How many bytes to read
341  * \return		1 on success, 0 on failure
342  */
343 static unsigned
344 _read_scalar(unsigned *result, unsigned length,
345 	     __ops_stream_t *stream)
346 {
347 	unsigned        t = 0;
348 
349 	if (length > sizeof(*result)) {
350 		(void) fprintf(stderr, "_read_scalar: bad length\n");
351 		return 0;
352 	}
353 
354 	while (length--) {
355 		unsigned char   c;
356 		int             r;
357 
358 		r = base_read(&c, 1, stream);
359 		if (r != 1)
360 			return 0;
361 		t = (t << 8) + c;
362 	}
363 
364 	*result = t;
365 	return 1;
366 }
367 
368 /**
369  * \ingroup Core_ReadPackets
370  * \brief Read bytes from a region within the packet.
371  *
372  * Read length bytes into the buffer pointed to by *dest.
373  * Make sure we do not read over the packet boundary.
374  * Updates the Packet Tag's __ops_ptag_t::readc.
375  *
376  * If length would make us read over the packet boundary, or if
377  * reading fails, we call the callback with an error.
378  *
379  * Note that if the region is indeterminate, this can return a short
380  * read - check region->last_read for the length. EOF is indicated by
381  * a success return and region->last_read == 0 in this case (for a
382  * region of known length, EOF is an error).
383  *
384  * This function makes sure to respect packet boundaries.
385  *
386  * \param dest		The destination buffer
387  * \param length	How many bytes to read
388  * \param region	Pointer to packet region
389  * \param errors    Error stack
390  * \param readinfo		Reader info
391  * \param cbinfo	Callback info
392  * \return		1 on success, 0 on error
393  */
394 unsigned
395 __ops_limited_read(unsigned char *dest,
396 			size_t length,
397 			__ops_region_t *region,
398 			__ops_error_t **errors,
399 			__ops_reader_t *readinfo,
400 			__ops_cbdata_t *cbinfo)
401 {
402 	size_t	r;
403 	int	lr;
404 
405 	if (!region->indeterminate &&
406 	    region->readc + length > region->length) {
407 		OPS_ERROR(errors, OPS_E_P_NOT_ENOUGH_DATA, "Not enough data");
408 		return 0;
409 	}
410 	r = full_read(dest, length, &lr, errors, readinfo, cbinfo);
411 	if (lr < 0) {
412 		OPS_ERROR(errors, OPS_E_R_READ_FAILED, "Read failed");
413 		return 0;
414 	}
415 	if (!region->indeterminate && r != length) {
416 		OPS_ERROR(errors, OPS_E_R_READ_FAILED, "Read failed");
417 		return 0;
418 	}
419 	region->last_read = r;
420 	do {
421 		region->readc += r;
422 		if (region->parent && region->length > region->parent->length) {
423 			(void) fprintf(stderr,
424 				"ops_limited_read: bad length\n");
425 			return 0;
426 		}
427 	} while ((region = region->parent) != NULL);
428 	return 1;
429 }
430 
431 /**
432    \ingroup Core_ReadPackets
433    \brief Call __ops_limited_read on next in stack
434 */
435 unsigned
436 __ops_stacked_limited_read(unsigned char *dest, unsigned length,
437 			 __ops_region_t *region,
438 			 __ops_error_t **errors,
439 			 __ops_reader_t *readinfo,
440 			 __ops_cbdata_t *cbinfo)
441 {
442 	return __ops_limited_read(dest, length, region, errors,
443 				readinfo->next, cbinfo);
444 }
445 
446 static unsigned
447 limread(unsigned char *dest, unsigned length,
448 	     __ops_region_t *region, __ops_stream_t *info)
449 {
450 	return __ops_limited_read(dest, length, region, &info->errors,
451 				&info->readinfo, &info->cbinfo);
452 }
453 
454 static unsigned
455 exact_limread(unsigned char *dest, unsigned len,
456 		   __ops_region_t *region,
457 		   __ops_stream_t *stream)
458 {
459 	unsigned   ret;
460 
461 	stream->exact_read = 1;
462 	ret = limread(dest, len, region, stream);
463 	stream->exact_read = 0;
464 	return ret;
465 }
466 
467 /** Skip over length bytes of this packet.
468  *
469  * Calls limread() to skip over some data.
470  *
471  * This function makes sure to respect packet boundaries.
472  *
473  * \param length	How many bytes to skip
474  * \param *region	Pointer to packet region
475  * \param *stream	How to parse
476  * \return		1 on success, 0 on error (calls the cb with OPS_PARSER_ERROR in limread()).
477  */
478 static int
479 limskip(unsigned length, __ops_region_t *region, __ops_stream_t *stream)
480 {
481 	unsigned char   buf[NETPGP_BUFSIZ];
482 
483 	while (length > 0) {
484 		unsigned	n = length % NETPGP_BUFSIZ;
485 
486 		if (!limread(buf, n, region, stream)) {
487 			return 0;
488 		}
489 		length -= n;
490 	}
491 	return 1;
492 }
493 
494 /** Read a scalar.
495  *
496  * Read a big-endian scalar of length bytes, respecting packet
497  * boundaries (by calling limread() to read the raw data).
498  *
499  * This function makes sure to respect packet boundaries.
500  *
501  * \param *dest		The scalar value is stored here
502  * \param length	How many bytes make up this scalar (at most 4)
503  * \param *region	Pointer to current packet region
504  * \param *stream	How to parse
505  * \param *cb		The callback
506  * \return		1 on success, 0 on error (calls the cb with OPS_PARSER_ERROR in limread()).
507  *
508  * \see RFC4880 3.1
509  */
510 static int
511 limread_scalar(unsigned *dest,
512 			unsigned len,
513 			__ops_region_t *region,
514 			__ops_stream_t *stream)
515 {
516 	unsigned char   c[4] = "";
517 	unsigned        t;
518 	unsigned        n;
519 
520 	if (len > 4) {
521 		(void) fprintf(stderr, "limread_scalar: bad length\n");
522 		return 0;
523 	}
524 	/*LINTED*/
525 	if (/*CONSTCOND*/sizeof(*dest) < 4) {
526 		(void) fprintf(stderr, "limread_scalar: bad dest\n");
527 		return 0;
528 	}
529 	if (!limread(c, len, region, stream)) {
530 		return 0;
531 	}
532 	for (t = 0, n = 0; n < len; ++n) {
533 		t = (t << 8) + c[n];
534 	}
535 	*dest = t;
536 	return 1;
537 }
538 
539 /** Read a scalar.
540  *
541  * Read a big-endian scalar of length bytes, respecting packet
542  * boundaries (by calling limread() to read the raw data).
543  *
544  * The value read is stored in a size_t, which is a different size
545  * from an unsigned on some platforms.
546  *
547  * This function makes sure to respect packet boundaries.
548  *
549  * \param *dest		The scalar value is stored here
550  * \param length	How many bytes make up this scalar (at most 4)
551  * \param *region	Pointer to current packet region
552  * \param *stream	How to parse
553  * \param *cb		The callback
554  * \return		1 on success, 0 on error (calls the cb with OPS_PARSER_ERROR in limread()).
555  *
556  * \see RFC4880 3.1
557  */
558 static int
559 limread_size_t(size_t *dest,
560 				unsigned length,
561 				__ops_region_t *region,
562 				__ops_stream_t *stream)
563 {
564 	unsigned        tmp;
565 
566 	/*
567 	 * Note that because the scalar is at most 4 bytes, we don't care if
568 	 * size_t is bigger than usigned
569 	 */
570 	if (!limread_scalar(&tmp, length, region, stream))
571 		return 0;
572 
573 	*dest = tmp;
574 	return 1;
575 }
576 
577 /** Read a timestamp.
578  *
579  * Timestamps in OpenPGP are unix time, i.e. seconds since The Epoch (1.1.1970).  They are stored in an unsigned scalar
580  * of 4 bytes.
581  *
582  * This function reads the timestamp using limread_scalar().
583  *
584  * This function makes sure to respect packet boundaries.
585  *
586  * \param *dest		The timestamp is stored here
587  * \param *ptag		Pointer to current packet's Packet Tag.
588  * \param *reader	Our reader
589  * \param *cb		The callback
590  * \return		see limread_scalar()
591  *
592  * \see RFC4880 3.5
593  */
594 static int
595 limited_read_time(time_t *dest, __ops_region_t *region,
596 		  __ops_stream_t *stream)
597 {
598 	unsigned char   c;
599 	time_t          mytime = 0;
600 	int             i;
601 
602 	/*
603          * Cannot assume that time_t is 4 octets long -
604 	 * SunOS 5.10 and NetBSD both have 64-bit time_ts.
605          */
606 	if (/* CONSTCOND */sizeof(time_t) == 4) {
607 		return limread_scalar((unsigned *)(void *)dest, 4, region, stream);
608 	}
609 	for (i = 0; i < 4; i++) {
610 		if (!limread(&c, 1, region, stream)) {
611 			return 0;
612 		}
613 		mytime = (mytime << 8) + c;
614 	}
615 	*dest = mytime;
616 	return 1;
617 }
618 
619 /**
620  * \ingroup Core_MPI
621  * Read a multiprecision integer.
622  *
623  * Large numbers (multiprecision integers, MPI) are stored in OpenPGP in two parts.  First there is a 2 byte scalar
624  * indicating the length of the following MPI in Bits.  Then follow the bits that make up the actual number, most
625  * significant bits first (Big Endian).  The most significant bit in the MPI is supposed to be 1 (unless the MPI is
626  * encrypted - then it may be different as the bit count refers to the plain text but the bits are encrypted).
627  *
628  * Unused bits (i.e. those filling up the most significant byte from the left to the first bits that counts) are
629  * supposed to be cleared - I guess. XXX - does anything actually say so?
630  *
631  * This function makes sure to respect packet boundaries.
632  *
633  * \param **pgn		return the integer there - the BIGNUM is created by BN_bin2bn() and probably needs to be freed
634  * 				by the caller XXX right ben?
635  * \param *ptag		Pointer to current packet's Packet Tag.
636  * \param *reader	Our reader
637  * \param *cb		The callback
638  * \return		1 on success, 0 on error (by limread_scalar() or limread() or if the MPI is not properly formed (XXX
639  * 				 see comment below - the callback is called with a OPS_PARSER_ERROR in case of an error)
640  *
641  * \see RFC4880 3.2
642  */
643 static int
644 limread_mpi(BIGNUM **pbn, __ops_region_t *region, __ops_stream_t *stream)
645 {
646 	unsigned char   buf[NETPGP_BUFSIZ] = "";
647 					/* an MPI has a 2 byte length part.
648 					 * Length is given in bits, so the
649 					 * largest we should ever need for
650 					 * the buffer is NETPGP_BUFSIZ bytes. */
651 	unsigned        length;
652 	unsigned        nonzero;
653 	unsigned	ret;
654 
655 	stream->reading_mpi_len = 1;
656 	ret = (unsigned)limread_scalar(&length, 2, region, stream);
657 
658 	stream->reading_mpi_len = 0;
659 	if (!ret)
660 		return 0;
661 
662 	nonzero = length & 7;	/* there should be this many zero bits in the
663 				 * MS byte */
664 	if (!nonzero)
665 		nonzero = 8;
666 	length = (length + 7) / 8;
667 
668 	if (length == 0) {
669 		/* if we try to read a length of 0, then fail */
670 		if (__ops_get_debug_level(__FILE__)) {
671 			(void) fprintf(stderr, "limread_mpi: 0 length\n");
672 		}
673 		return 0;
674 	}
675 	if (length > NETPGP_BUFSIZ) {
676 		(void) fprintf(stderr, "limread_mpi: bad length\n");
677 		return 0;
678 	}
679 	if (!limread(buf, length, region, stream)) {
680 		return 0;
681 	}
682 	if (((unsigned)buf[0] >> nonzero) != 0 ||
683 	    !((unsigned)buf[0] & (1U << (nonzero - 1U)))) {
684 		OPS_ERROR(&stream->errors, OPS_E_P_MPI_FORMAT_ERROR, "MPI Format error");
685 		/* XXX: Ben, one part of
686 		 * this constraint does
687 		 * not apply to
688 		 * encrypted MPIs the
689 		 * draft says. -- peter */
690 		return 0;
691 	}
692 	*pbn = BN_bin2bn(buf, (int)length, NULL);
693 	return 1;
694 }
695 
696 /** Read some data with a New-Format length from reader.
697  *
698  * \sa Internet-Draft RFC4880.txt Section 4.2.2
699  *
700  * \param *length	Where the decoded length will be put
701  * \param *stream	How to parse
702  * \return		1 if OK, else 0
703  *
704  */
705 
706 static unsigned
707 read_new_length(unsigned *length, __ops_stream_t *stream)
708 {
709 	unsigned char   c;
710 
711 	if (base_read(&c, 1, stream) != 1)
712 		return 0;
713 	if (c < 192) {
714 		/* 1. One-octet packet */
715 		*length = c;
716 		return 1;
717 	} else if (c >= 192 && c <= 223) {
718 		/* 2. Two-octet packet */
719 		unsigned        t = (c - 192) << 8;
720 
721 		if (base_read(&c, 1, stream) != 1)
722 			return 0;
723 		*length = t + c + 192;
724 		return 1;
725 	} else if (c == 255) {
726 		/* 3. Five-Octet packet */
727 		return _read_scalar(length, 4, stream);
728 	} else if (c >= 224 && c < 255) {
729 		/* 4. Partial Body Length */
730 		/* XXX - agc - gpg multi-recipient encryption uses this */
731 		OPS_ERROR(&stream->errors, OPS_E_UNIMPLEMENTED,
732 		"New format Partial Body Length fields not yet implemented");
733 		return 0;
734 	}
735 	return 0;
736 }
737 
738 /** Read the length information for a new format Packet Tag.
739  *
740  * New style Packet Tags encode the length in one to five octets.  This function reads the right amount of bytes and
741  * decodes it to the proper length information.
742  *
743  * This function makes sure to respect packet boundaries.
744  *
745  * \param *length	return the length here
746  * \param *ptag		Pointer to current packet's Packet Tag.
747  * \param *reader	Our reader
748  * \param *cb		The callback
749  * \return		1 on success, 0 on error (by limread_scalar() or limread() or if the MPI is not properly formed (XXX
750  * 				 see comment below)
751  *
752  * \see RFC4880 4.2.2
753  * \see __ops_ptag_t
754  */
755 static int
756 limited_read_new_length(unsigned *length, __ops_region_t *region,
757 			__ops_stream_t *stream)
758 {
759 	unsigned char   c = 0x0;
760 
761 	if (!limread(&c, 1, region, stream)) {
762 		return 0;
763 	}
764 	if (c < 192) {
765 		*length = c;
766 		return 1;
767 	}
768 	if (c < 255) {
769 		unsigned        t = (c - 192) << 8;
770 
771 		if (!limread(&c, 1, region, stream)) {
772 			return 0;
773 		}
774 		*length = t + c + 192;
775 		return 1;
776 	}
777 	return limread_scalar(length, 4, region, stream);
778 }
779 
780 /**
781 \ingroup Core_Create
782 \brief Free allocated memory
783 */
784 static void
785 data_free(__ops_data_t *data)
786 {
787 	free(data->contents);
788 	data->contents = NULL;
789 	data->len = 0;
790 }
791 
792 /**
793 \ingroup Core_Create
794 \brief Free allocated memory
795 */
796 static void
797 string_free(char **str)
798 {
799 	free(*str);
800 	*str = NULL;
801 }
802 
803 /**
804 \ingroup Core_Create
805 \brief Free allocated memory
806 */
807 /* ! Free packet memory, set pointer to NULL */
808 void
809 __ops_subpacket_free(__ops_subpacket_t *packet)
810 {
811 	free(packet->raw);
812 	packet->raw = NULL;
813 }
814 
815 /**
816 \ingroup Core_Create
817 \brief Free allocated memory
818 */
819 static void
820 __ops_headers_free(__ops_headers_t *headers)
821 {
822 	unsigned        n;
823 
824 	for (n = 0; n < headers->headerc; ++n) {
825 		free(headers->headers[n].key);
826 		free(headers->headers[n].value);
827 	}
828 	free(headers->headers);
829 	headers->headers = NULL;
830 }
831 
832 /**
833 \ingroup Core_Create
834 \brief Free allocated memory
835 */
836 static void
837 cleartext_trailer_free(__ops_cleartext_trailer_t *trailer)
838 {
839 	free(trailer->hash);
840 	trailer->hash = NULL;
841 }
842 
843 /**
844 \ingroup Core_Create
845 \brief Free allocated memory
846 */
847 static void
848 __ops_cmd_get_passphrase_free(__ops_seckey_passphrase_t *skp)
849 {
850 	if (skp->passphrase && *skp->passphrase) {
851 		free(*skp->passphrase);
852 		*skp->passphrase = NULL;
853 	}
854 }
855 
856 /**
857    \ingroup Core_Create
858    \brief Free the memory used when parsing this signature sub-packet type
859 */
860 static void
861 ss_userdef_free(__ops_ss_userdef_t *ss_userdef)
862 {
863 	data_free(&ss_userdef->data);
864 }
865 
866 /**
867    \ingroup Core_Create
868    \brief Free the memory used when parsing this signature sub-packet type
869 */
870 static void
871 ss_reserved_free(__ops_ss_unknown_t *ss_unknown)
872 {
873 	data_free(&ss_unknown->data);
874 }
875 
876 /**
877    \ingroup Core_Create
878    \brief Free the memory used when parsing this packet type
879 */
880 static void
881 trust_free(__ops_trust_t *trust)
882 {
883 	data_free(&trust->data);
884 }
885 
886 /**
887  * \ingroup Core_Create
888  * \brief Free the memory used when parsing a private/experimental PKA signature
889  * \param unknown_sig
890  */
891 static void
892 free_unknown_sig_pka(__ops_unknown_sig_t *unknown_sig)
893 {
894 	data_free(&unknown_sig->data);
895 }
896 
897 /**
898 \ingroup Core_Create
899 \brief Free allocated memory
900 */
901 static void
902 free_BN(BIGNUM **pp)
903 {
904 	BN_free(*pp);
905 	*pp = NULL;
906 }
907 
908 /**
909  * \ingroup Core_Create
910  * \brief Free the memory used when parsing a signature
911  * \param sig
912  */
913 static void
914 sig_free(__ops_sig_t *sig)
915 {
916 	switch (sig->info.key_alg) {
917 	case OPS_PKA_RSA:
918 	case OPS_PKA_RSA_SIGN_ONLY:
919 		free_BN(&sig->info.sig.rsa.sig);
920 		break;
921 
922 	case OPS_PKA_DSA:
923 		free_BN(&sig->info.sig.dsa.r);
924 		free_BN(&sig->info.sig.dsa.s);
925 		break;
926 
927 	case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
928 		free_BN(&sig->info.sig.elgamal.r);
929 		free_BN(&sig->info.sig.elgamal.s);
930 		break;
931 
932 	case OPS_PKA_PRIVATE00:
933 	case OPS_PKA_PRIVATE01:
934 	case OPS_PKA_PRIVATE02:
935 	case OPS_PKA_PRIVATE03:
936 	case OPS_PKA_PRIVATE04:
937 	case OPS_PKA_PRIVATE05:
938 	case OPS_PKA_PRIVATE06:
939 	case OPS_PKA_PRIVATE07:
940 	case OPS_PKA_PRIVATE08:
941 	case OPS_PKA_PRIVATE09:
942 	case OPS_PKA_PRIVATE10:
943 		free_unknown_sig_pka(&sig->info.sig.unknown);
944 		break;
945 
946 	default:
947 		(void) fprintf(stderr, "sig_free: bad sig type\n");
948 	}
949 }
950 
951 /**
952  \ingroup Core_Create
953  \brief Free the memory used when parsing this signature sub-packet type
954  \param ss_skapref
955 */
956 static void
957 ss_skapref_free(__ops_ss_skapref_t *ss_skapref)
958 {
959 	data_free(&ss_skapref->data);
960 }
961 
962 /**
963    \ingroup Core_Create
964    \brief Free the memory used when parsing this signature sub-packet type
965    \param ss_hashpref
966 */
967 static void
968 ss_hashpref_free(__ops_ss_hashpref_t *ss_hashpref)
969 {
970 	data_free(&ss_hashpref->data);
971 }
972 
973 /**
974    \ingroup Core_Create
975    \brief Free the memory used when parsing this signature sub-packet type
976 */
977 static void
978 ss_zpref_free(__ops_ss_zpref_t *ss_zpref)
979 {
980 	data_free(&ss_zpref->data);
981 }
982 
983 /**
984    \ingroup Core_Create
985    \brief Free the memory used when parsing this signature sub-packet type
986 */
987 static void
988 ss_key_flags_free(__ops_ss_key_flags_t *ss_key_flags)
989 {
990 	data_free(&ss_key_flags->data);
991 }
992 
993 /**
994    \ingroup Core_Create
995    \brief Free the memory used when parsing this signature sub-packet type
996 */
997 static void
998 ss_key_server_prefs_free(__ops_ss_key_server_prefs_t *ss_key_server_prefs)
999 {
1000 	data_free(&ss_key_server_prefs->data);
1001 }
1002 
1003 /**
1004    \ingroup Core_Create
1005    \brief Free the memory used when parsing this signature sub-packet type
1006 */
1007 static void
1008 ss_features_free(__ops_ss_features_t *ss_features)
1009 {
1010 	data_free(&ss_features->data);
1011 }
1012 
1013 /**
1014    \ingroup Core_Create
1015    \brief Free the memory used when parsing this signature sub-packet type
1016 */
1017 static void
1018 ss_notation_free(__ops_ss_notation_t *ss_notation)
1019 {
1020 	data_free(&ss_notation->name);
1021 	data_free(&ss_notation->value);
1022 }
1023 
1024 /**
1025 \ingroup Core_Create
1026 \brief Free allocated memory
1027 */
1028 /* ! Free the memory used when parsing this signature sub-packet type */
1029 static void
1030 ss_regexp_free(__ops_ss_regexp_t *regexp)
1031 {
1032 	string_free(&regexp->regexp);
1033 }
1034 
1035 /**
1036 \ingroup Core_Create
1037 \brief Free allocated memory
1038 */
1039 /* ! Free the memory used when parsing this signature sub-packet type */
1040 static void
1041 ss_policy_free(__ops_ss_policy_t *policy)
1042 {
1043 	string_free(&policy->url);
1044 }
1045 
1046 /**
1047 \ingroup Core_Create
1048 \brief Free allocated memory
1049 */
1050 /* ! Free the memory used when parsing this signature sub-packet type */
1051 static void
1052 ss_keyserv_free(__ops_ss_keyserv_t *preferred_key_server)
1053 {
1054 	string_free(&preferred_key_server->name);
1055 }
1056 
1057 /**
1058    \ingroup Core_Create
1059    \brief Free the memory used when parsing this signature sub-packet type
1060 */
1061 static void
1062 ss_revocation_free(__ops_ss_revocation_t *ss_revocation)
1063 {
1064 	string_free(&ss_revocation->reason);
1065 }
1066 
1067 static void
1068 ss_embedded_sig_free(__ops_ss_embedded_sig_t *ss_embedded_sig)
1069 {
1070 	data_free(&ss_embedded_sig->sig);
1071 }
1072 
1073 /**
1074 \ingroup Core_Create
1075 \brief Free allocated memory
1076 */
1077 /* ! Free any memory allocated when parsing the packet content */
1078 void
1079 __ops_parser_content_free(__ops_packet_t *c)
1080 {
1081 	switch (c->tag) {
1082 	case OPS_PARSER_PTAG:
1083 	case OPS_PTAG_CT_COMPRESSED:
1084 	case OPS_PTAG_SS_CREATION_TIME:
1085 	case OPS_PTAG_SS_EXPIRATION_TIME:
1086 	case OPS_PTAG_SS_KEY_EXPIRY:
1087 	case OPS_PTAG_SS_TRUST:
1088 	case OPS_PTAG_SS_ISSUER_KEY_ID:
1089 	case OPS_PTAG_CT_1_PASS_SIG:
1090 	case OPS_PTAG_SS_PRIMARY_USER_ID:
1091 	case OPS_PTAG_SS_REVOCABLE:
1092 	case OPS_PTAG_SS_REVOCATION_KEY:
1093 	case OPS_PTAG_CT_LITDATA_HEADER:
1094 	case OPS_PTAG_CT_LITDATA_BODY:
1095 	case OPS_PTAG_CT_SIGNED_CLEARTEXT_BODY:
1096 	case OPS_PTAG_CT_UNARMOURED_TEXT:
1097 	case OPS_PTAG_CT_ARMOUR_TRAILER:
1098 	case OPS_PTAG_CT_SIGNATURE_HEADER:
1099 	case OPS_PTAG_CT_SE_DATA_HEADER:
1100 	case OPS_PTAG_CT_SE_IP_DATA_HEADER:
1101 	case OPS_PTAG_CT_SE_IP_DATA_BODY:
1102 	case OPS_PTAG_CT_MDC:
1103 	case OPS_GET_SECKEY:
1104 		break;
1105 
1106 	case OPS_PTAG_CT_SIGNED_CLEARTEXT_HEADER:
1107 		__ops_headers_free(&c->u.cleartext_head.headers);
1108 		break;
1109 
1110 	case OPS_PTAG_CT_ARMOUR_HEADER:
1111 		__ops_headers_free(&c->u.armour_header.headers);
1112 		break;
1113 
1114 	case OPS_PTAG_CT_SIGNED_CLEARTEXT_TRAILER:
1115 		cleartext_trailer_free(&c->u.cleartext_trailer);
1116 		break;
1117 
1118 	case OPS_PTAG_CT_TRUST:
1119 		trust_free(&c->u.trust);
1120 		break;
1121 
1122 	case OPS_PTAG_CT_SIGNATURE:
1123 	case OPS_PTAG_CT_SIGNATURE_FOOTER:
1124 		sig_free(&c->u.sig);
1125 		break;
1126 
1127 	case OPS_PTAG_CT_PUBLIC_KEY:
1128 	case OPS_PTAG_CT_PUBLIC_SUBKEY:
1129 		__ops_pubkey_free(&c->u.pubkey);
1130 		break;
1131 
1132 	case OPS_PTAG_CT_USER_ID:
1133 		__ops_userid_free(&c->u.userid);
1134 		break;
1135 
1136 	case OPS_PTAG_SS_SIGNERS_USER_ID:
1137 		__ops_userid_free(&c->u.ss_signer);
1138 		break;
1139 
1140 	case OPS_PTAG_CT_USER_ATTR:
1141 		__ops_userattr_free(&c->u.userattr);
1142 		break;
1143 
1144 	case OPS_PTAG_SS_PREFERRED_SKA:
1145 		ss_skapref_free(&c->u.ss_skapref);
1146 		break;
1147 
1148 	case OPS_PTAG_SS_PREFERRED_HASH:
1149 		ss_hashpref_free(&c->u.ss_hashpref);
1150 		break;
1151 
1152 	case OPS_PTAG_SS_PREF_COMPRESS:
1153 		ss_zpref_free(&c->u.ss_zpref);
1154 		break;
1155 
1156 	case OPS_PTAG_SS_KEY_FLAGS:
1157 		ss_key_flags_free(&c->u.ss_key_flags);
1158 		break;
1159 
1160 	case OPS_PTAG_SS_KEYSERV_PREFS:
1161 		ss_key_server_prefs_free(&c->u.ss_key_server_prefs);
1162 		break;
1163 
1164 	case OPS_PTAG_SS_FEATURES:
1165 		ss_features_free(&c->u.ss_features);
1166 		break;
1167 
1168 	case OPS_PTAG_SS_NOTATION_DATA:
1169 		ss_notation_free(&c->u.ss_notation);
1170 		break;
1171 
1172 	case OPS_PTAG_SS_REGEXP:
1173 		ss_regexp_free(&c->u.ss_regexp);
1174 		break;
1175 
1176 	case OPS_PTAG_SS_POLICY_URI:
1177 		ss_policy_free(&c->u.ss_policy);
1178 		break;
1179 
1180 	case OPS_PTAG_SS_PREF_KEYSERV:
1181 		ss_keyserv_free(&c->u.ss_keyserv);
1182 		break;
1183 
1184 	case OPS_PTAG_SS_USERDEFINED00:
1185 	case OPS_PTAG_SS_USERDEFINED01:
1186 	case OPS_PTAG_SS_USERDEFINED02:
1187 	case OPS_PTAG_SS_USERDEFINED03:
1188 	case OPS_PTAG_SS_USERDEFINED04:
1189 	case OPS_PTAG_SS_USERDEFINED05:
1190 	case OPS_PTAG_SS_USERDEFINED06:
1191 	case OPS_PTAG_SS_USERDEFINED07:
1192 	case OPS_PTAG_SS_USERDEFINED08:
1193 	case OPS_PTAG_SS_USERDEFINED09:
1194 	case OPS_PTAG_SS_USERDEFINED10:
1195 		ss_userdef_free(&c->u.ss_userdef);
1196 		break;
1197 
1198 	case OPS_PTAG_SS_RESERVED:
1199 		ss_reserved_free(&c->u.ss_unknown);
1200 		break;
1201 
1202 	case OPS_PTAG_SS_REVOCATION_REASON:
1203 		ss_revocation_free(&c->u.ss_revocation);
1204 		break;
1205 
1206 	case OPS_PTAG_SS_EMBEDDED_SIGNATURE:
1207 		ss_embedded_sig_free(&c->u.ss_embedded_sig);
1208 		break;
1209 
1210 	case OPS_PARSER_PACKET_END:
1211 		__ops_subpacket_free(&c->u.packet);
1212 		break;
1213 
1214 	case OPS_PARSER_ERROR:
1215 	case OPS_PARSER_ERRCODE:
1216 		break;
1217 
1218 	case OPS_PTAG_CT_SECRET_KEY:
1219 	case OPS_PTAG_CT_ENCRYPTED_SECRET_KEY:
1220 		__ops_seckey_free(&c->u.seckey);
1221 		break;
1222 
1223 	case OPS_PTAG_CT_PK_SESSION_KEY:
1224 	case OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY:
1225 		__ops_pk_sesskey_free(&c->u.pk_sesskey);
1226 		break;
1227 
1228 	case OPS_GET_PASSPHRASE:
1229 		__ops_cmd_get_passphrase_free(&c->u.skey_passphrase);
1230 		break;
1231 
1232 	default:
1233 		fprintf(stderr, "Can't free %d (0x%x)\n", c->tag, c->tag);
1234 	}
1235 }
1236 
1237 /**
1238 \ingroup Core_Create
1239 \brief Free allocated memory
1240 */
1241 void
1242 __ops_pk_sesskey_free(__ops_pk_sesskey_t *sk)
1243 {
1244 	switch (sk->alg) {
1245 	case OPS_PKA_RSA:
1246 		free_BN(&sk->params.rsa.encrypted_m);
1247 		break;
1248 
1249 	case OPS_PKA_ELGAMAL:
1250 		free_BN(&sk->params.elgamal.g_to_k);
1251 		free_BN(&sk->params.elgamal.encrypted_m);
1252 		break;
1253 
1254 	default:
1255 		(void) fprintf(stderr, "__ops_pk_sesskey_free: bad alg\n");
1256 		break;
1257 	}
1258 }
1259 
1260 /**
1261 \ingroup Core_Create
1262 \brief Free allocated memory
1263 */
1264 /* ! Free the memory used when parsing a public key */
1265 void
1266 __ops_pubkey_free(__ops_pubkey_t *p)
1267 {
1268 	switch (p->alg) {
1269 	case OPS_PKA_RSA:
1270 	case OPS_PKA_RSA_ENCRYPT_ONLY:
1271 	case OPS_PKA_RSA_SIGN_ONLY:
1272 		free_BN(&p->key.rsa.n);
1273 		free_BN(&p->key.rsa.e);
1274 		break;
1275 
1276 	case OPS_PKA_DSA:
1277 		free_BN(&p->key.dsa.p);
1278 		free_BN(&p->key.dsa.q);
1279 		free_BN(&p->key.dsa.g);
1280 		free_BN(&p->key.dsa.y);
1281 		break;
1282 
1283 	case OPS_PKA_ELGAMAL:
1284 	case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
1285 		free_BN(&p->key.elgamal.p);
1286 		free_BN(&p->key.elgamal.g);
1287 		free_BN(&p->key.elgamal.y);
1288 		break;
1289 
1290 	case OPS_PKA_NOTHING:
1291 		/* nothing to free */
1292 		break;
1293 
1294 	default:
1295 		(void) fprintf(stderr, "__ops_pubkey_free: bad alg\n");
1296 	}
1297 }
1298 
1299 /**
1300    \ingroup Core_ReadPackets
1301 */
1302 static int
1303 parse_pubkey_data(__ops_pubkey_t *key, __ops_region_t *region,
1304 		      __ops_stream_t *stream)
1305 {
1306 	unsigned char   c = 0x0;
1307 
1308 	if (region->readc != 0) {
1309 		/* We should not have read anything so far */
1310 		(void) fprintf(stderr, "parse_pubkey_data: bad length\n");
1311 		return 0;
1312 	}
1313 	if (!limread(&c, 1, region, stream)) {
1314 		return 0;
1315 	}
1316 	key->version = (__ops_version_t)c;
1317 	switch (key->version) {
1318 	case OPS_V2:
1319 	case OPS_V3:
1320 	case OPS_V4:
1321 		break;
1322 	default:
1323 		OPS_ERROR_1(&stream->errors, OPS_E_PROTO_BAD_PUBLIC_KEY_VRSN,
1324 			    "Bad public key version (0x%02x)", key->version);
1325 		return 0;
1326 	}
1327 	if (!limited_read_time(&key->birthtime, region, stream)) {
1328 		return 0;
1329 	}
1330 
1331 	key->days_valid = 0;
1332 	if ((key->version == 2 || key->version == 3) &&
1333 	    !limread_scalar(&key->days_valid, 2, region, stream)) {
1334 		return 0;
1335 	}
1336 
1337 	if (!limread(&c, 1, region, stream)) {
1338 		return 0;
1339 	}
1340 	key->alg = c;
1341 
1342 	switch (key->alg) {
1343 	case OPS_PKA_DSA:
1344 		if (!limread_mpi(&key->key.dsa.p, region, stream) ||
1345 		    !limread_mpi(&key->key.dsa.q, region, stream) ||
1346 		    !limread_mpi(&key->key.dsa.g, region, stream) ||
1347 		    !limread_mpi(&key->key.dsa.y, region, stream)) {
1348 			return 0;
1349 		}
1350 		break;
1351 
1352 	case OPS_PKA_RSA:
1353 	case OPS_PKA_RSA_ENCRYPT_ONLY:
1354 	case OPS_PKA_RSA_SIGN_ONLY:
1355 		if (!limread_mpi(&key->key.rsa.n, region, stream) ||
1356 		    !limread_mpi(&key->key.rsa.e, region, stream)) {
1357 			return 0;
1358 		}
1359 		break;
1360 
1361 	case OPS_PKA_ELGAMAL:
1362 	case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
1363 		if (!limread_mpi(&key->key.elgamal.p, region, stream) ||
1364 		    !limread_mpi(&key->key.elgamal.g, region, stream) ||
1365 		    !limread_mpi(&key->key.elgamal.y, region, stream)) {
1366 			return 0;
1367 		}
1368 		break;
1369 
1370 	default:
1371 		OPS_ERROR_1(&stream->errors,
1372 			OPS_E_ALG_UNSUPPORTED_PUBLIC_KEY_ALG,
1373 			"Unsupported Public Key algorithm (%s)",
1374 			__ops_show_pka(key->alg));
1375 		return 0;
1376 	}
1377 
1378 	return 1;
1379 }
1380 
1381 
1382 /**
1383  * \ingroup Core_ReadPackets
1384  * \brief Parse a public key packet.
1385  *
1386  * This function parses an entire v3 (== v2) or v4 public key packet for RSA, ElGamal, and DSA keys.
1387  *
1388  * Once the key has been parsed successfully, it is passed to the callback.
1389  *
1390  * \param *ptag		Pointer to the current Packet Tag.  This function should consume the entire packet.
1391  * \param *reader	Our reader
1392  * \param *cb		The callback
1393  * \return		1 on success, 0 on error
1394  *
1395  * \see RFC4880 5.5.2
1396  */
1397 static int
1398 parse_pubkey(__ops_content_tag_t tag, __ops_region_t *region,
1399 		 __ops_stream_t *stream)
1400 {
1401 	__ops_packet_t pkt;
1402 
1403 	if (!parse_pubkey_data(&pkt.u.pubkey, region, stream))
1404 		return 0;
1405 
1406 	/* XXX: this test should be done for all packets, surely? */
1407 	if (region->readc != region->length) {
1408 		OPS_ERROR_1(&stream->errors, OPS_E_R_UNCONSUMED_DATA,
1409 			    "Unconsumed data (%d)", region->length - region->readc);
1410 		return 0;
1411 	}
1412 	CALLBACK(tag, &stream->cbinfo, &pkt);
1413 
1414 	return 1;
1415 }
1416 
1417 
1418 /**
1419 \ingroup Core_Create
1420 \brief Free allocated memory
1421 */
1422 /* ! Free the memory used when parsing this packet type */
1423 void
1424 __ops_userattr_free(__ops_userattr_t *user_att)
1425 {
1426 	data_free(&user_att->data);
1427 }
1428 
1429 /**
1430  * \ingroup Core_ReadPackets
1431  * \brief Parse one user attribute packet.
1432  *
1433  * User attribute packets contain one or more attribute subpackets.
1434  * For now, handle the whole packet as raw data.
1435  */
1436 
1437 static int
1438 parse_userattr(__ops_region_t *region, __ops_stream_t *stream)
1439 {
1440 
1441 	__ops_packet_t pkt;
1442 
1443 	/*
1444 	 * xxx- treat as raw data for now. Could break down further into
1445 	 * attribute sub-packets later - rachel
1446 	 */
1447 
1448 	if (region->readc != 0) {
1449 		/* We should not have read anything so far */
1450 		(void) fprintf(stderr, "parse_userattr: bad length\n");
1451 		return 0;
1452 	}
1453 
1454 	if (!read_data(&pkt.u.userattr.data, region, stream))
1455 		return 0;
1456 
1457 	CALLBACK(OPS_PTAG_CT_USER_ATTR, &stream->cbinfo, &pkt);
1458 
1459 	return 1;
1460 }
1461 
1462 /**
1463 \ingroup Core_Create
1464 \brief Free allocated memory
1465 */
1466 /* ! Free the memory used when parsing this packet type */
1467 void
1468 __ops_userid_free(__ops_userid_t *id)
1469 {
1470 	free(id->userid);
1471 	id->userid = NULL;
1472 }
1473 
1474 /**
1475  * \ingroup Core_ReadPackets
1476  * \brief Parse a user id.
1477  *
1478  * This function parses an user id packet, which is basically just a char array the size of the packet.
1479  *
1480  * The char array is to be treated as an UTF-8 string.
1481  *
1482  * The userid gets null terminated by this function.  Freeing it is the responsibility of the caller.
1483  *
1484  * Once the userid has been parsed successfully, it is passed to the callback.
1485  *
1486  * \param *ptag		Pointer to the Packet Tag.  This function should consume the entire packet.
1487  * \param *reader	Our reader
1488  * \param *cb		The callback
1489  * \return		1 on success, 0 on error
1490  *
1491  * \see RFC4880 5.11
1492  */
1493 static int
1494 parse_userid(__ops_region_t *region, __ops_stream_t *stream)
1495 {
1496 	__ops_packet_t pkt;
1497 
1498 	 if (region->readc != 0) {
1499 		/* We should not have read anything so far */
1500 		(void) fprintf(stderr, "parse_userid: bad length\n");
1501 		return 0;
1502 	}
1503 
1504 	if ((pkt.u.userid.userid = calloc(1, region->length + 1)) == NULL) {
1505 		(void) fprintf(stderr, "parse_userid: bad alloc\n");
1506 		return 0;
1507 	}
1508 
1509 	if (region->length &&
1510 	    !limread(pkt.u.userid.userid, region->length, region,
1511 			stream)) {
1512 		return 0;
1513 	}
1514 	pkt.u.userid.userid[region->length] = '\0';
1515 	CALLBACK(OPS_PTAG_CT_USER_ID, &stream->cbinfo, &pkt);
1516 	return 1;
1517 }
1518 
1519 static __ops_hash_t     *
1520 parse_hash_find(__ops_stream_t *stream, const unsigned char *keyid)
1521 {
1522 	__ops_hashtype_t	*hp;
1523 	size_t			 n;
1524 
1525 	for (n = 0, hp = stream->hashes; n < stream->hashc; n++, hp++) {
1526 		if (memcmp(hp->keyid, keyid, OPS_KEY_ID_SIZE) == 0) {
1527 			return &hp->hash;
1528 		}
1529 	}
1530 	return NULL;
1531 }
1532 
1533 /**
1534  * \ingroup Core_Parse
1535  * \brief Parse a version 3 signature.
1536  *
1537  * This function parses an version 3 signature packet, handling RSA and DSA signatures.
1538  *
1539  * Once the signature has been parsed successfully, it is passed to the callback.
1540  *
1541  * \param *ptag		Pointer to the Packet Tag.  This function should consume the entire packet.
1542  * \param *reader	Our reader
1543  * \param *cb		The callback
1544  * \return		1 on success, 0 on error
1545  *
1546  * \see RFC4880 5.2.2
1547  */
1548 static int
1549 parse_v3_sig(__ops_region_t *region,
1550 		   __ops_stream_t *stream)
1551 {
1552 	__ops_packet_t	pkt;
1553 	unsigned char	c = 0x0;
1554 
1555 	/* clear signature */
1556 	(void) memset(&pkt.u.sig, 0x0, sizeof(pkt.u.sig));
1557 
1558 	pkt.u.sig.info.version = OPS_V3;
1559 
1560 	/* hash info length */
1561 	if (!limread(&c, 1, region, stream)) {
1562 		return 0;
1563 	}
1564 	if (c != 5) {
1565 		ERRP(&stream->cbinfo, pkt, "bad hash info length");
1566 	}
1567 
1568 	if (!limread(&c, 1, region, stream)) {
1569 		return 0;
1570 	}
1571 	pkt.u.sig.info.type = (__ops_sig_type_t)c;
1572 	/* XXX: check signature type */
1573 
1574 	if (!limited_read_time(&pkt.u.sig.info.birthtime, region, stream)) {
1575 		return 0;
1576 	}
1577 	pkt.u.sig.info.birthtime_set = 1;
1578 
1579 	if (!limread(pkt.u.sig.info.signer_id, OPS_KEY_ID_SIZE, region,
1580 			stream)) {
1581 		return 0;
1582 	}
1583 	pkt.u.sig.info.signer_id_set = 1;
1584 
1585 	if (!limread(&c, 1, region, stream)) {
1586 		return 0;
1587 	}
1588 	pkt.u.sig.info.key_alg = (__ops_pubkey_alg_t)c;
1589 	/* XXX: check algorithm */
1590 
1591 	if (!limread(&c, 1, region, stream)) {
1592 		return 0;
1593 	}
1594 	pkt.u.sig.info.hash_alg = (__ops_hash_alg_t)c;
1595 	/* XXX: check algorithm */
1596 
1597 	if (!limread(pkt.u.sig.hash2, 2, region, stream)) {
1598 		return 0;
1599 	}
1600 
1601 	switch (pkt.u.sig.info.key_alg) {
1602 	case OPS_PKA_RSA:
1603 	case OPS_PKA_RSA_SIGN_ONLY:
1604 		if (!limread_mpi(&pkt.u.sig.info.sig.rsa.sig, region, stream)) {
1605 			return 0;
1606 		}
1607 		break;
1608 
1609 	case OPS_PKA_DSA:
1610 		if (!limread_mpi(&pkt.u.sig.info.sig.dsa.r, region, stream) ||
1611 		    !limread_mpi(&pkt.u.sig.info.sig.dsa.s, region, stream)) {
1612 			return 0;
1613 		}
1614 		break;
1615 
1616 	case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
1617 		if (!limread_mpi(&pkt.u.sig.info.sig.elgamal.r, region,
1618 				stream) ||
1619 		    !limread_mpi(&pkt.u.sig.info.sig.elgamal.s, region,
1620 		    		stream)) {
1621 			return 0;
1622 		}
1623 		break;
1624 
1625 	default:
1626 		OPS_ERROR_1(&stream->errors,
1627 			OPS_E_ALG_UNSUPPORTED_SIGNATURE_ALG,
1628 			"Unsupported signature key algorithm (%s)",
1629 			__ops_show_pka(pkt.u.sig.info.key_alg));
1630 		return 0;
1631 	}
1632 
1633 	if (region->readc != region->length) {
1634 		OPS_ERROR_1(&stream->errors, OPS_E_R_UNCONSUMED_DATA,
1635 			"Unconsumed data (%d)",
1636 			region->length - region->readc);
1637 		return 0;
1638 	}
1639 	if (pkt.u.sig.info.signer_id_set) {
1640 		pkt.u.sig.hash = parse_hash_find(stream,
1641 				pkt.u.sig.info.signer_id);
1642 	}
1643 	CALLBACK(OPS_PTAG_CT_SIGNATURE, &stream->cbinfo, &pkt);
1644 	return 1;
1645 }
1646 
1647 /**
1648  * \ingroup Core_ReadPackets
1649  * \brief Parse one signature sub-packet.
1650  *
1651  * Version 4 signatures can have an arbitrary amount of (hashed and
1652  * unhashed) subpackets.  Subpackets are used to hold optional
1653  * attributes of subpackets.
1654  *
1655  * This function parses one such signature subpacket.
1656  *
1657  * Once the subpacket has been parsed successfully, it is passed to the callback.
1658  *
1659  * \param *ptag		Pointer to the Packet Tag.  This function should consume the entire subpacket.
1660  * \param *reader	Our reader
1661  * \param *cb		The callback
1662  * \return		1 on success, 0 on error
1663  *
1664  * \see RFC4880 5.2.3
1665  */
1666 static int
1667 parse_one_sig_subpacket(__ops_sig_t *sig,
1668 			      __ops_region_t *region,
1669 			      __ops_stream_t *stream)
1670 {
1671 	__ops_region_t	subregion;
1672 	__ops_packet_t	pkt;
1673 	unsigned char   bools = 0x0;
1674 	unsigned char	c = 0x0;
1675 	unsigned	doread = 1;
1676 	unsigned        t8;
1677 	unsigned        t7;
1678 
1679 	__ops_init_subregion(&subregion, region);
1680 	if (!limited_read_new_length(&subregion.length, region, stream)) {
1681 		return 0;
1682 	}
1683 
1684 	if (subregion.length > region->length) {
1685 		ERRP(&stream->cbinfo, pkt, "Subpacket too long");
1686 	}
1687 
1688 	if (!limread(&c, 1, &subregion, stream)) {
1689 		return 0;
1690 	}
1691 
1692 	t8 = (c & 0x7f) / 8;
1693 	t7 = 1 << (c & 7);
1694 
1695 	pkt.critical = (unsigned)c >> 7;
1696 	pkt.tag = (__ops_content_tag_t)(OPS_PTAG_SIG_SUBPKT_BASE + (c & 0x7f));
1697 
1698 	/* Application wants it delivered raw */
1699 	if (stream->ss_raw[t8] & t7) {
1700 		pkt.u.ss_raw.tag = pkt.tag;
1701 		pkt.u.ss_raw.length = subregion.length - 1;
1702 		pkt.u.ss_raw.raw = calloc(1, pkt.u.ss_raw.length);
1703 		if (pkt.u.ss_raw.raw == NULL) {
1704 			(void) fprintf(stderr, "parse_one_sig_subpacket: bad alloc\n");
1705 			return 0;
1706 		}
1707 		if (!limread(pkt.u.ss_raw.raw, pkt.u.ss_raw.length,
1708 				&subregion, stream)) {
1709 			return 0;
1710 		}
1711 		CALLBACK(OPS_PTAG_RAW_SS, &stream->cbinfo, &pkt);
1712 		return 1;
1713 	}
1714 	switch (pkt.tag) {
1715 	case OPS_PTAG_SS_CREATION_TIME:
1716 	case OPS_PTAG_SS_EXPIRATION_TIME:
1717 	case OPS_PTAG_SS_KEY_EXPIRY:
1718 		if (!limited_read_time(&pkt.u.ss_time.time, &subregion, stream))
1719 			return 0;
1720 		if (pkt.tag == OPS_PTAG_SS_CREATION_TIME) {
1721 			sig->info.birthtime = pkt.u.ss_time.time;
1722 			sig->info.birthtime_set = 1;
1723 		}
1724 		if (pkt.tag == OPS_PTAG_SS_EXPIRATION_TIME) {
1725 			sig->info.duration = pkt.u.ss_time.time;
1726 			sig->info.duration_set = 1;
1727 		}
1728 		break;
1729 
1730 	case OPS_PTAG_SS_TRUST:
1731 		if (!limread(&pkt.u.ss_trust.level, 1, &subregion, stream) ||
1732 		    !limread(&pkt.u.ss_trust.amount, 1, &subregion, stream)) {
1733 			return 0;
1734 		}
1735 		break;
1736 
1737 	case OPS_PTAG_SS_REVOCABLE:
1738 		if (!limread(&bools, 1, &subregion, stream)) {
1739 			return 0;
1740 		}
1741 		pkt.u.ss_revocable.revocable = !!bools;
1742 		break;
1743 
1744 	case OPS_PTAG_SS_ISSUER_KEY_ID:
1745 		if (!limread(pkt.u.ss_issuer.key_id, OPS_KEY_ID_SIZE,
1746 				&subregion, stream)) {
1747 			return 0;
1748 		}
1749 		(void) memcpy(sig->info.signer_id,
1750 			pkt.u.ss_issuer.key_id, OPS_KEY_ID_SIZE);
1751 		sig->info.signer_id_set = 1;
1752 		break;
1753 
1754 	case OPS_PTAG_SS_PREFERRED_SKA:
1755 		if (!read_data(&pkt.u.ss_skapref.data, &subregion, stream)) {
1756 			return 0;
1757 		}
1758 		break;
1759 
1760 	case OPS_PTAG_SS_PREFERRED_HASH:
1761 		if (!read_data(&pkt.u.ss_hashpref.data, &subregion, stream)) {
1762 			return 0;
1763 		}
1764 		break;
1765 
1766 	case OPS_PTAG_SS_PREF_COMPRESS:
1767 		if (!read_data(&pkt.u.ss_zpref.data,
1768 				&subregion, stream)) {
1769 			return 0;
1770 		}
1771 		break;
1772 
1773 	case OPS_PTAG_SS_PRIMARY_USER_ID:
1774 		if (!limread(&bools, 1, &subregion, stream)) {
1775 			return 0;
1776 		}
1777 		pkt.u.ss_primary_userid.primary_userid = !!bools;
1778 		break;
1779 
1780 	case OPS_PTAG_SS_KEY_FLAGS:
1781 		if (!read_data(&pkt.u.ss_key_flags.data, &subregion, stream)) {
1782 			return 0;
1783 		}
1784 		break;
1785 
1786 	case OPS_PTAG_SS_KEYSERV_PREFS:
1787 		if (!read_data(&pkt.u.ss_key_server_prefs.data, &subregion,
1788 				stream)) {
1789 			return 0;
1790 		}
1791 		break;
1792 
1793 	case OPS_PTAG_SS_FEATURES:
1794 		if (!read_data(&pkt.u.ss_features.data, &subregion, stream)) {
1795 			return 0;
1796 		}
1797 		break;
1798 
1799 	case OPS_PTAG_SS_SIGNERS_USER_ID:
1800 		if (!read_unsig_str(&pkt.u.ss_signer.userid, &subregion,
1801 				stream)) {
1802 			return 0;
1803 		}
1804 		break;
1805 
1806 	case OPS_PTAG_SS_EMBEDDED_SIGNATURE:
1807 		/* \todo should do something with this sig? */
1808 		if (!read_data(&pkt.u.ss_embedded_sig.sig, &subregion, stream)) {
1809 			return 0;
1810 		}
1811 		break;
1812 
1813 	case OPS_PTAG_SS_NOTATION_DATA:
1814 		if (!limread_data(&pkt.u.ss_notation.flags, 4,
1815 				&subregion, stream)) {
1816 			return 0;
1817 		}
1818 		if (!limread_size_t(&pkt.u.ss_notation.name.len, 2,
1819 				&subregion, stream)) {
1820 			return 0;
1821 		}
1822 		if (!limread_size_t(&pkt.u.ss_notation.value.len, 2,
1823 				&subregion, stream)) {
1824 			return 0;
1825 		}
1826 		if (!limread_data(&pkt.u.ss_notation.name,
1827 				pkt.u.ss_notation.name.len,
1828 				&subregion, stream)) {
1829 			return 0;
1830 		}
1831 		if (!limread_data(&pkt.u.ss_notation.value,
1832 			   pkt.u.ss_notation.value.len,
1833 			   &subregion, stream)) {
1834 			return 0;
1835 		}
1836 		break;
1837 
1838 	case OPS_PTAG_SS_POLICY_URI:
1839 		if (!read_string(&pkt.u.ss_policy.url, &subregion, stream)) {
1840 			return 0;
1841 		}
1842 		break;
1843 
1844 	case OPS_PTAG_SS_REGEXP:
1845 		if (!read_string(&pkt.u.ss_regexp.regexp, &subregion, stream)) {
1846 			return 0;
1847 		}
1848 		break;
1849 
1850 	case OPS_PTAG_SS_PREF_KEYSERV:
1851 		if (!read_string(&pkt.u.ss_keyserv.name, &subregion, stream)) {
1852 			return 0;
1853 		}
1854 		break;
1855 
1856 	case OPS_PTAG_SS_USERDEFINED00:
1857 	case OPS_PTAG_SS_USERDEFINED01:
1858 	case OPS_PTAG_SS_USERDEFINED02:
1859 	case OPS_PTAG_SS_USERDEFINED03:
1860 	case OPS_PTAG_SS_USERDEFINED04:
1861 	case OPS_PTAG_SS_USERDEFINED05:
1862 	case OPS_PTAG_SS_USERDEFINED06:
1863 	case OPS_PTAG_SS_USERDEFINED07:
1864 	case OPS_PTAG_SS_USERDEFINED08:
1865 	case OPS_PTAG_SS_USERDEFINED09:
1866 	case OPS_PTAG_SS_USERDEFINED10:
1867 		if (!read_data(&pkt.u.ss_userdef.data, &subregion, stream)) {
1868 			return 0;
1869 		}
1870 		break;
1871 
1872 	case OPS_PTAG_SS_RESERVED:
1873 		if (!read_data(&pkt.u.ss_unknown.data, &subregion, stream)) {
1874 			return 0;
1875 		}
1876 		break;
1877 
1878 	case OPS_PTAG_SS_REVOCATION_REASON:
1879 		/* first byte is the machine-readable code */
1880 		if (!limread(&pkt.u.ss_revocation.code, 1, &subregion, stream)) {
1881 			return 0;
1882 		}
1883 		/* the rest is a human-readable UTF-8 string */
1884 		if (!read_string(&pkt.u.ss_revocation.reason, &subregion,
1885 				stream)) {
1886 			return 0;
1887 		}
1888 		break;
1889 
1890 	case OPS_PTAG_SS_REVOCATION_KEY:
1891 		/* octet 0 = class. Bit 0x80 must be set */
1892 		if (!limread(&pkt.u.ss_revocation_key.class, 1,
1893 				&subregion, stream)) {
1894 			return 0;
1895 		}
1896 		if (!(pkt.u.ss_revocation_key.class & 0x80)) {
1897 			printf("Warning: OPS_PTAG_SS_REVOCATION_KEY class: "
1898 			       "Bit 0x80 should be set\n");
1899 			return 0;
1900 		}
1901 		/* octet 1 = algid */
1902 		if (!limread(&pkt.u.ss_revocation_key.algid, 1,
1903 				&subregion, stream)) {
1904 			return 0;
1905 		}
1906 		/* octets 2-21 = fingerprint */
1907 		if (!limread(&pkt.u.ss_revocation_key.fingerprint[0],
1908 				OPS_FINGERPRINT_SIZE, &subregion, stream)) {
1909 			return 0;
1910 		}
1911 		break;
1912 
1913 	default:
1914 		if (stream->ss_parsed[t8] & t7) {
1915 			OPS_ERROR_1(&stream->errors, OPS_E_PROTO_UNKNOWN_SS,
1916 				    "Unknown signature subpacket type (%d)",
1917 				    c & 0x7f);
1918 		}
1919 		doread = 0;
1920 		break;
1921 	}
1922 
1923 	/* Application doesn't want it delivered parsed */
1924 	if (!(stream->ss_parsed[t8] & t7)) {
1925 		if (pkt.critical) {
1926 			OPS_ERROR_1(&stream->errors,
1927 				OPS_E_PROTO_CRITICAL_SS_IGNORED,
1928 				"Critical signature subpacket ignored (%d)",
1929 				c & 0x7f);
1930 		}
1931 		if (!doread &&
1932 		    !limskip(subregion.length - 1, &subregion, stream)) {
1933 			return 0;
1934 		}
1935 		if (doread) {
1936 			__ops_parser_content_free(&pkt);
1937 		}
1938 		return 1;
1939 	}
1940 	if (doread && subregion.readc != subregion.length) {
1941 		OPS_ERROR_1(&stream->errors, OPS_E_R_UNCONSUMED_DATA,
1942 			    "Unconsumed data (%d)",
1943 			    subregion.length - subregion.readc);
1944 		return 0;
1945 	}
1946 	CALLBACK(pkt.tag, &stream->cbinfo, &pkt);
1947 	return 1;
1948 }
1949 
1950 /**
1951  * \ingroup Core_ReadPackets
1952  * \brief Parse several signature subpackets.
1953  *
1954  * Hashed and unhashed subpacket sets are preceded by an octet count that specifies the length of the complete set.
1955  * This function parses this length and then calls parse_one_sig_subpacket() for each subpacket until the
1956  * entire set is consumed.
1957  *
1958  * This function does not call the callback directly, parse_one_sig_subpacket() does for each subpacket.
1959  *
1960  * \param *ptag		Pointer to the Packet Tag.
1961  * \param *reader	Our reader
1962  * \param *cb		The callback
1963  * \return		1 on success, 0 on error
1964  *
1965  * \see RFC4880 5.2.3
1966  */
1967 static int
1968 parse_sig_subpkts(__ops_sig_t *sig,
1969 			   __ops_region_t *region,
1970 			   __ops_stream_t *stream)
1971 {
1972 	__ops_region_t	subregion;
1973 	__ops_packet_t	pkt;
1974 
1975 	__ops_init_subregion(&subregion, region);
1976 	if (!limread_scalar(&subregion.length, 2, region, stream)) {
1977 		return 0;
1978 	}
1979 
1980 	if (subregion.length > region->length) {
1981 		ERRP(&stream->cbinfo, pkt, "Subpacket set too long");
1982 	}
1983 
1984 	while (subregion.readc < subregion.length) {
1985 		if (!parse_one_sig_subpacket(sig, &subregion, stream)) {
1986 			return 0;
1987 		}
1988 	}
1989 
1990 	if (subregion.readc != subregion.length) {
1991 		if (!limskip(subregion.length - subregion.readc,
1992 				&subregion, stream)) {
1993 			ERRP(&stream->cbinfo, pkt,
1994 "parse_sig_subpkts: subpacket length read mismatch");
1995 		}
1996 		ERRP(&stream->cbinfo, pkt, "Subpacket length mismatch");
1997 	}
1998 	return 1;
1999 }
2000 
2001 /**
2002  * \ingroup Core_ReadPackets
2003  * \brief Parse a version 4 signature.
2004  *
2005  * This function parses a version 4 signature including all its hashed and unhashed subpackets.
2006  *
2007  * Once the signature packet has been parsed successfully, it is passed to the callback.
2008  *
2009  * \param *ptag		Pointer to the Packet Tag.
2010  * \param *reader	Our reader
2011  * \param *cb		The callback
2012  * \return		1 on success, 0 on error
2013  *
2014  * \see RFC4880 5.2.3
2015  */
2016 static int
2017 parse_v4_sig(__ops_region_t *region, __ops_stream_t *stream)
2018 {
2019 	unsigned char   c = 0x0;
2020 	__ops_packet_t pkt;
2021 
2022 	if (__ops_get_debug_level(__FILE__)) {
2023 		fprintf(stderr, "\nparse_v4_sig\n");
2024 	}
2025 	/* clear signature */
2026 	(void) memset(&pkt.u.sig, 0x0, sizeof(pkt.u.sig));
2027 
2028 	/*
2029 	 * We need to hash the packet data from version through the hashed
2030 	 * subpacket data
2031 	 */
2032 
2033 	pkt.u.sig.v4_hashstart = stream->readinfo.alength - 1;
2034 
2035 	/* Set version,type,algorithms */
2036 
2037 	pkt.u.sig.info.version = OPS_V4;
2038 
2039 	if (!limread(&c, 1, region, stream)) {
2040 		return 0;
2041 	}
2042 	pkt.u.sig.info.type = (__ops_sig_type_t)c;
2043 	if (__ops_get_debug_level(__FILE__)) {
2044 		fprintf(stderr, "signature type=%d (%s)\n",
2045 			pkt.u.sig.info.type,
2046 			__ops_show_sig_type(pkt.u.sig.info.type));
2047 	}
2048 	/* XXX: check signature type */
2049 
2050 	if (!limread(&c, 1, region, stream)) {
2051 		return 0;
2052 	}
2053 	pkt.u.sig.info.key_alg = (__ops_pubkey_alg_t)c;
2054 	/* XXX: check key algorithm */
2055 	if (__ops_get_debug_level(__FILE__)) {
2056 		(void) fprintf(stderr, "key_alg=%d (%s)\n",
2057 			pkt.u.sig.info.key_alg,
2058 			__ops_show_pka(pkt.u.sig.info.key_alg));
2059 	}
2060 	if (!limread(&c, 1, region, stream)) {
2061 		return 0;
2062 	}
2063 	pkt.u.sig.info.hash_alg = (__ops_hash_alg_t)c;
2064 	/* XXX: check hash algorithm */
2065 	if (__ops_get_debug_level(__FILE__)) {
2066 		fprintf(stderr, "hash_alg=%d %s\n",
2067 			pkt.u.sig.info.hash_alg,
2068 		  __ops_show_hash_alg(pkt.u.sig.info.hash_alg));
2069 	}
2070 	CALLBACK(OPS_PTAG_CT_SIGNATURE_HEADER, &stream->cbinfo, &pkt);
2071 
2072 	if (!parse_sig_subpkts(&pkt.u.sig, region, stream)) {
2073 		return 0;
2074 	}
2075 
2076 	pkt.u.sig.info.v4_hashlen = stream->readinfo.alength
2077 					- pkt.u.sig.v4_hashstart;
2078 	if (__ops_get_debug_level(__FILE__)) {
2079 		fprintf(stderr, "v4_hashlen=%zd\n", pkt.u.sig.info.v4_hashlen);
2080 	}
2081 
2082 	/* copy hashed subpackets */
2083 	if (pkt.u.sig.info.v4_hashed) {
2084 		free(pkt.u.sig.info.v4_hashed);
2085 	}
2086 	pkt.u.sig.info.v4_hashed = calloc(1, pkt.u.sig.info.v4_hashlen);
2087 	if (pkt.u.sig.info.v4_hashed == NULL) {
2088 		(void) fprintf(stderr, "parse_v4_sig: bad alloc\n");
2089 		return 0;
2090 	}
2091 
2092 	if (!stream->readinfo.accumulate) {
2093 		/* We must accumulate, else we can't check the signature */
2094 		fprintf(stderr, "*** ERROR: must set accumulate to 1\n");
2095 		return 0;
2096 	}
2097 	(void) memcpy(pkt.u.sig.info.v4_hashed,
2098 	       stream->readinfo.accumulated + pkt.u.sig.v4_hashstart,
2099 	       pkt.u.sig.info.v4_hashlen);
2100 
2101 	if (!parse_sig_subpkts(&pkt.u.sig, region, stream)) {
2102 		return 0;
2103 	}
2104 
2105 	if (!limread(pkt.u.sig.hash2, 2, region, stream)) {
2106 		return 0;
2107 	}
2108 
2109 	switch (pkt.u.sig.info.key_alg) {
2110 	case OPS_PKA_RSA:
2111 		if (!limread_mpi(&pkt.u.sig.info.sig.rsa.sig, region, stream)) {
2112 			return 0;
2113 		}
2114 		if (__ops_get_debug_level(__FILE__)) {
2115 			(void) fprintf(stderr, "parse_v4_sig: RSA: sig is\n");
2116 			BN_print_fp(stderr, pkt.u.sig.info.sig.rsa.sig);
2117 		}
2118 		break;
2119 
2120 	case OPS_PKA_DSA:
2121 		if (!limread_mpi(&pkt.u.sig.info.sig.dsa.r, region, stream)) {
2122 			/*
2123 			 * usually if this fails, it just means we've reached
2124 			 * the end of the keyring
2125 			 */
2126 			if (__ops_get_debug_level(__FILE__)) {
2127 				(void) fprintf(stderr,
2128 				"Error reading DSA r field in signature");
2129 			}
2130 			return 0;
2131 		}
2132 		if (!limread_mpi(&pkt.u.sig.info.sig.dsa.s, region, stream)) {
2133 			ERRP(&stream->cbinfo, pkt,
2134 			"Error reading DSA s field in signature");
2135 		}
2136 		break;
2137 
2138 	case OPS_PKA_ELGAMAL_ENCRYPT_OR_SIGN:
2139 		if (!limread_mpi(&pkt.u.sig.info.sig.elgamal.r, region,
2140 				stream) ||
2141 		    !limread_mpi(&pkt.u.sig.info.sig.elgamal.s, region,
2142 		    		stream)) {
2143 			return 0;
2144 		}
2145 		break;
2146 
2147 	case OPS_PKA_PRIVATE00:
2148 	case OPS_PKA_PRIVATE01:
2149 	case OPS_PKA_PRIVATE02:
2150 	case OPS_PKA_PRIVATE03:
2151 	case OPS_PKA_PRIVATE04:
2152 	case OPS_PKA_PRIVATE05:
2153 	case OPS_PKA_PRIVATE06:
2154 	case OPS_PKA_PRIVATE07:
2155 	case OPS_PKA_PRIVATE08:
2156 	case OPS_PKA_PRIVATE09:
2157 	case OPS_PKA_PRIVATE10:
2158 		if (!read_data(&pkt.u.sig.info.sig.unknown.data, region,
2159 				stream)) {
2160 			return 0;
2161 		}
2162 		break;
2163 
2164 	default:
2165 		OPS_ERROR_1(&stream->errors, OPS_E_ALG_UNSUPPORTED_SIGNATURE_ALG,
2166 			    "Bad v4 signature key algorithm (%s)",
2167 			    __ops_show_pka(pkt.u.sig.info.key_alg));
2168 		return 0;
2169 	}
2170 	if (region->readc != region->length) {
2171 		OPS_ERROR_1(&stream->errors, OPS_E_R_UNCONSUMED_DATA,
2172 			    "Unconsumed data (%d)",
2173 			    region->length - region->readc);
2174 		return 0;
2175 	}
2176 	CALLBACK(OPS_PTAG_CT_SIGNATURE_FOOTER, &stream->cbinfo, &pkt);
2177 	return 1;
2178 }
2179 
2180 /**
2181  * \ingroup Core_ReadPackets
2182  * \brief Parse a signature subpacket.
2183  *
2184  * This function calls the appropriate function to handle v3 or v4 signatures.
2185  *
2186  * Once the signature packet has been parsed successfully, it is passed to the callback.
2187  *
2188  * \param *ptag		Pointer to the Packet Tag.
2189  * \param *reader	Our reader
2190  * \param *cb		The callback
2191  * \return		1 on success, 0 on error
2192  */
2193 static int
2194 parse_sig(__ops_region_t *region, __ops_stream_t *stream)
2195 {
2196 	unsigned char   c = 0x0;
2197 	__ops_packet_t pkt;
2198 
2199 	if (region->readc != 0) {
2200 		/* We should not have read anything so far */
2201 		(void) fprintf(stderr, "parse_sig: bad length\n");
2202 		return 0;
2203 	}
2204 
2205 	(void) memset(&pkt, 0x0, sizeof(pkt));
2206 	if (!limread(&c, 1, region, stream)) {
2207 		return 0;
2208 	}
2209 	if (c == 2 || c == 3) {
2210 		return parse_v3_sig(region, stream);
2211 	}
2212 	if (c == 4) {
2213 		return parse_v4_sig(region, stream);
2214 	}
2215 	OPS_ERROR_1(&stream->errors, OPS_E_PROTO_BAD_SIGNATURE_VRSN,
2216 		    "Bad signature version (%d)", c);
2217 	return 0;
2218 }
2219 
2220 /**
2221  \ingroup Core_ReadPackets
2222  \brief Parse Compressed packet
2223 */
2224 static int
2225 parse_compressed(__ops_region_t *region, __ops_stream_t *stream)
2226 {
2227 	__ops_packet_t	pkt;
2228 	unsigned char	c = 0x0;
2229 
2230 	if (!limread(&c, 1, region, stream)) {
2231 		return 0;
2232 	}
2233 
2234 	pkt.u.compressed.type = (__ops_compression_type_t)c;
2235 
2236 	CALLBACK(OPS_PTAG_CT_COMPRESSED, &stream->cbinfo, &pkt);
2237 
2238 	/*
2239 	 * The content of a compressed data packet is more OpenPGP packets
2240 	 * once decompressed, so recursively handle them
2241 	 */
2242 
2243 	return __ops_decompress(region, stream, pkt.u.compressed.type);
2244 }
2245 
2246 /* XXX: this could be improved by sharing all hashes that are the */
2247 /* same, then duping them just before checking the signature. */
2248 static void
2249 parse_hash_init(__ops_stream_t *stream, __ops_hash_alg_t type,
2250 		    const unsigned char *keyid)
2251 {
2252 	__ops_hashtype_t *hash;
2253 
2254 	hash = realloc(stream->hashes,
2255 			      (stream->hashc + 1) * sizeof(*stream->hashes));
2256 	if (hash == NULL) {
2257 		(void) fprintf(stderr, "parse_hash_init: bad alloc 0\n");
2258 		/* just continue and die here */
2259 		/* XXX - agc - no way to return failure */
2260 	} else {
2261 		stream->hashes = hash;
2262 	}
2263 	hash = &stream->hashes[stream->hashc++];
2264 
2265 	__ops_hash_any(&hash->hash, type);
2266 	if (!hash->hash.init(&hash->hash)) {
2267 		(void) fprintf(stderr, "parse_hash_init: bad alloc\n");
2268 		/* just continue and die here */
2269 		/* XXX - agc - no way to return failure */
2270 	}
2271 	(void) memcpy(hash->keyid, keyid, sizeof(hash->keyid));
2272 }
2273 
2274 /**
2275    \ingroup Core_ReadPackets
2276    \brief Parse a One Pass Signature packet
2277 */
2278 static int
2279 parse_one_pass(__ops_region_t * region, __ops_stream_t * stream)
2280 {
2281 	unsigned char   c = 0x0;
2282 	__ops_packet_t pkt;
2283 
2284 	if (!limread(&pkt.u.one_pass_sig.version, 1, region, stream)) {
2285 		return 0;
2286 	}
2287 	if (pkt.u.one_pass_sig.version != 3) {
2288 		OPS_ERROR_1(&stream->errors, OPS_E_PROTO_BAD_ONE_PASS_SIG_VRSN,
2289 			    "Bad one-pass signature version (%d)",
2290 			    pkt.u.one_pass_sig.version);
2291 		return 0;
2292 	}
2293 	if (!limread(&c, 1, region, stream)) {
2294 		return 0;
2295 	}
2296 	pkt.u.one_pass_sig.sig_type = (__ops_sig_type_t)c;
2297 
2298 	if (!limread(&c, 1, region, stream)) {
2299 		return 0;
2300 	}
2301 	pkt.u.one_pass_sig.hash_alg = (__ops_hash_alg_t)c;
2302 
2303 	if (!limread(&c, 1, region, stream)) {
2304 		return 0;
2305 	}
2306 	pkt.u.one_pass_sig.key_alg = (__ops_pubkey_alg_t)c;
2307 
2308 	if (!limread(pkt.u.one_pass_sig.keyid,
2309 			  sizeof(pkt.u.one_pass_sig.keyid), region, stream)) {
2310 		return 0;
2311 	}
2312 
2313 	if (!limread(&c, 1, region, stream)) {
2314 		return 0;
2315 	}
2316 	pkt.u.one_pass_sig.nested = !!c;
2317 	CALLBACK(OPS_PTAG_CT_1_PASS_SIG, &stream->cbinfo, &pkt);
2318 	/* XXX: we should, perhaps, let the app choose whether to hash or not */
2319 	parse_hash_init(stream, pkt.u.one_pass_sig.hash_alg,
2320 			    pkt.u.one_pass_sig.keyid);
2321 	return 1;
2322 }
2323 
2324 /**
2325  \ingroup Core_ReadPackets
2326  \brief Parse a Trust packet
2327 */
2328 static int
2329 parse_trust(__ops_region_t *region, __ops_stream_t *stream)
2330 {
2331 	__ops_packet_t pkt;
2332 
2333 	if (!read_data(&pkt.u.trust.data, region, stream)) {
2334 		return 0;
2335 	}
2336 	CALLBACK(OPS_PTAG_CT_TRUST, &stream->cbinfo, &pkt);
2337 	return 1;
2338 }
2339 
2340 static void
2341 parse_hash_data(__ops_stream_t *stream, const void *data,
2342 		    size_t length)
2343 {
2344 	size_t          n;
2345 
2346 	for (n = 0; n < stream->hashc; ++n) {
2347 		stream->hashes[n].hash.add(&stream->hashes[n].hash, data, length);
2348 	}
2349 }
2350 
2351 /**
2352    \ingroup Core_ReadPackets
2353    \brief Parse a Literal Data packet
2354 */
2355 static int
2356 parse_litdata(__ops_region_t *region, __ops_stream_t *stream)
2357 {
2358 	__ops_memory_t	*mem;
2359 	__ops_packet_t	 pkt;
2360 	unsigned char	 c = 0x0;
2361 
2362 	if (!limread(&c, 1, region, stream)) {
2363 		return 0;
2364 	}
2365 	pkt.u.litdata_header.format = (__ops_litdata_type_t)c;
2366 	if (!limread(&c, 1, region, stream)) {
2367 		return 0;
2368 	}
2369 	if (!limread((unsigned char *)pkt.u.litdata_header.filename,
2370 			(unsigned)c, region, stream)) {
2371 		return 0;
2372 	}
2373 	pkt.u.litdata_header.filename[c] = '\0';
2374 	if (!limited_read_time(&pkt.u.litdata_header.mtime, region, stream)) {
2375 		return 0;
2376 	}
2377 	CALLBACK(OPS_PTAG_CT_LITDATA_HEADER, &stream->cbinfo, &pkt);
2378 	mem = pkt.u.litdata_body.mem = __ops_memory_new();
2379 	__ops_memory_init(pkt.u.litdata_body.mem,
2380 			(unsigned)((region->length * 101) / 100) + 12);
2381 	pkt.u.litdata_body.data = mem->buf;
2382 
2383 	while (region->readc < region->length) {
2384 		unsigned        readc = region->length - region->readc;
2385 
2386 		if (!limread(mem->buf, readc, region, stream)) {
2387 			return 0;
2388 		}
2389 		pkt.u.litdata_body.length = readc;
2390 		parse_hash_data(stream, pkt.u.litdata_body.data, region->length);
2391 		CALLBACK(OPS_PTAG_CT_LITDATA_BODY, &stream->cbinfo, &pkt);
2392 	}
2393 
2394 	/* XXX - get rid of mem here? */
2395 
2396 	return 1;
2397 }
2398 
2399 /**
2400  * \ingroup Core_Create
2401  *
2402  * __ops_seckey_free() frees the memory associated with "key". Note that
2403  * the key itself is not freed.
2404  *
2405  * \param key
2406  */
2407 
2408 void
2409 __ops_seckey_free(__ops_seckey_t *key)
2410 {
2411 	switch (key->pubkey.alg) {
2412 	case OPS_PKA_RSA:
2413 	case OPS_PKA_RSA_ENCRYPT_ONLY:
2414 	case OPS_PKA_RSA_SIGN_ONLY:
2415 		free_BN(&key->key.rsa.d);
2416 		free_BN(&key->key.rsa.p);
2417 		free_BN(&key->key.rsa.q);
2418 		free_BN(&key->key.rsa.u);
2419 		break;
2420 
2421 	case OPS_PKA_DSA:
2422 		free_BN(&key->key.dsa.x);
2423 		break;
2424 
2425 	default:
2426 		(void) fprintf(stderr,
2427 			"__ops_seckey_free: Unknown algorithm: %d (%s)\n",
2428 			key->pubkey.alg,
2429 			__ops_show_pka(key->pubkey.alg));
2430 	}
2431 	free(key->checkhash);
2432 	__ops_pubkey_free(&key->pubkey);
2433 }
2434 
2435 static int
2436 consume_packet(__ops_region_t *region, __ops_stream_t *stream, unsigned warn)
2437 {
2438 	__ops_packet_t	pkt;
2439 	__ops_data_t	remainder;
2440 
2441 	if (region->indeterminate) {
2442 		ERRP(&stream->cbinfo, pkt,
2443 			"Can't consume indeterminate packets");
2444 	}
2445 
2446 	if (read_data(&remainder, region, stream)) {
2447 		/* now throw it away */
2448 		data_free(&remainder);
2449 		if (warn) {
2450 			OPS_ERROR(&stream->errors, OPS_E_P_PACKET_CONSUMED,
2451 				"Warning: packet consumer");
2452 		}
2453 		return 1;
2454 	}
2455 	OPS_ERROR(&stream->errors, OPS_E_P_PACKET_NOT_CONSUMED,
2456 			(warn) ? "Warning: Packet was not consumed" :
2457 				"Packet was not consumed");
2458 	return warn;
2459 }
2460 
2461 /**
2462  * \ingroup Core_ReadPackets
2463  * \brief Parse a secret key
2464  */
2465 static int
2466 parse_seckey(__ops_region_t *region, __ops_stream_t *stream)
2467 {
2468 	__ops_packet_t		pkt;
2469 	__ops_region_t		encregion;
2470 	__ops_region_t	       *saved_region = NULL;
2471 	unsigned char		c = 0x0;
2472 	__ops_crypt_t		decrypt;
2473 	__ops_hash_t		checkhash;
2474 	unsigned		blocksize;
2475 	unsigned		crypted;
2476 	int			ret = 1;
2477 
2478 	if (__ops_get_debug_level(__FILE__)) {
2479 		fprintf(stderr, "\n---------\nparse_seckey:\n");
2480 		fprintf(stderr,
2481 			"region length=%u, readc=%u, remainder=%u\n",
2482 			region->length, region->readc,
2483 			region->length - region->readc);
2484 	}
2485 	(void) memset(&pkt, 0x0, sizeof(pkt));
2486 	if (!parse_pubkey_data(&pkt.u.seckey.pubkey, region, stream)) {
2487 		return 0;
2488 	}
2489 	if (__ops_get_debug_level(__FILE__)) {
2490 		fprintf(stderr, "parse_seckey: public key parsed\n");
2491 		__ops_print_pubkey(&pkt.u.seckey.pubkey);
2492 	}
2493 	stream->reading_v3_secret = (pkt.u.seckey.pubkey.version != OPS_V4);
2494 
2495 	if (!limread(&c, 1, region, stream)) {
2496 		return 0;
2497 	}
2498 	pkt.u.seckey.s2k_usage = (__ops_s2k_usage_t)c;
2499 
2500 	if (pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED ||
2501 	    pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED) {
2502 		if (!limread(&c, 1, region, stream)) {
2503 			return 0;
2504 		}
2505 		pkt.u.seckey.alg = (__ops_symm_alg_t)c;
2506 		if (!limread(&c, 1, region, stream)) {
2507 			return 0;
2508 		}
2509 		pkt.u.seckey.s2k_specifier = (__ops_s2k_specifier_t)c;
2510 		switch (pkt.u.seckey.s2k_specifier) {
2511 		case OPS_S2KS_SIMPLE:
2512 		case OPS_S2KS_SALTED:
2513 		case OPS_S2KS_ITERATED_AND_SALTED:
2514 			break;
2515 		default:
2516 			(void) fprintf(stderr,
2517 				"parse_seckey: bad seckey\n");
2518 			return 0;
2519 		}
2520 		if (!limread(&c, 1, region, stream)) {
2521 			return 0;
2522 		}
2523 		pkt.u.seckey.hash_alg = (__ops_hash_alg_t)c;
2524 		if (pkt.u.seckey.s2k_specifier != OPS_S2KS_SIMPLE &&
2525 		    !limread(pkt.u.seckey.salt, 8, region, stream)) {
2526 			return 0;
2527 		}
2528 		if (pkt.u.seckey.s2k_specifier ==
2529 					OPS_S2KS_ITERATED_AND_SALTED) {
2530 			if (!limread(&c, 1, region, stream)) {
2531 				return 0;
2532 			}
2533 			pkt.u.seckey.octetc =
2534 				(16 + ((unsigned)c & 15)) <<
2535 						(((unsigned)c >> 4) + 6);
2536 		}
2537 	} else if (pkt.u.seckey.s2k_usage != OPS_S2KU_NONE) {
2538 		/* this is V3 style, looks just like a V4 simple hash */
2539 		pkt.u.seckey.alg = (__ops_symm_alg_t)c;
2540 		pkt.u.seckey.s2k_usage = OPS_S2KU_ENCRYPTED;
2541 		pkt.u.seckey.s2k_specifier = OPS_S2KS_SIMPLE;
2542 		pkt.u.seckey.hash_alg = OPS_HASH_MD5;
2543 	}
2544 	crypted = pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED ||
2545 		pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED;
2546 
2547 	if (crypted) {
2548 		__ops_packet_t	seckey;
2549 		unsigned char   key[OPS_MAX_KEY_SIZE + OPS_MAX_HASH_SIZE];
2550 		__ops_hash_t	hashes[(OPS_MAX_KEY_SIZE + OPS_MIN_HASH_SIZE - 1) / OPS_MIN_HASH_SIZE];
2551 		size_t          passlen;
2552 		char           *passphrase;
2553 		int             hashsize;
2554 		int             keysize;
2555 		int             n;
2556 
2557 		blocksize = __ops_block_size(pkt.u.seckey.alg);
2558 		if (blocksize == 0 || blocksize > OPS_MAX_BLOCK_SIZE) {
2559 			(void) fprintf(stderr,
2560 				"parse_seckey: bad blocksize\n");
2561 			return 0;
2562 		}
2563 
2564 		if (!limread(pkt.u.seckey.iv, blocksize, region, stream)) {
2565 			return 0;
2566 		}
2567 		(void) memset(&seckey, 0x0, sizeof(seckey));
2568 		passphrase = NULL;
2569 		seckey.u.skey_passphrase.passphrase = &passphrase;
2570 		seckey.u.skey_passphrase.seckey = &pkt.u.seckey;
2571 		CALLBACK(OPS_GET_PASSPHRASE, &stream->cbinfo, &seckey);
2572 		if (!passphrase) {
2573 			if (__ops_get_debug_level(__FILE__)) {
2574 				/* \todo make into proper error */
2575 				(void) fprintf(stderr,
2576 				"parse_seckey: can't get passphrase\n");
2577 			}
2578 			if (!consume_packet(region, stream, 0)) {
2579 				return 0;
2580 			}
2581 
2582 			CALLBACK(OPS_PTAG_CT_ENCRYPTED_SECRET_KEY,
2583 				&stream->cbinfo, &pkt);
2584 
2585 			return 1;
2586 		}
2587 		keysize = __ops_key_size(pkt.u.seckey.alg);
2588 		if (keysize == 0 || keysize > OPS_MAX_KEY_SIZE) {
2589 			(void) fprintf(stderr,
2590 				"parse_seckey: bad keysize\n");
2591 			return 0;
2592 		}
2593 
2594 		hashsize = __ops_hash_size(pkt.u.seckey.hash_alg);
2595 		if (hashsize == 0 || hashsize > OPS_MAX_HASH_SIZE) {
2596 			(void) fprintf(stderr,
2597 				"parse_seckey: bad hashsize\n");
2598 			return 0;
2599 		}
2600 
2601 		for (n = 0; n * hashsize < keysize; ++n) {
2602 			int             i;
2603 
2604 			__ops_hash_any(&hashes[n],
2605 				pkt.u.seckey.hash_alg);
2606 			if (!hashes[n].init(&hashes[n])) {
2607 				(void) fprintf(stderr,
2608 					"parse_seckey: bad alloc\n");
2609 				return 0;
2610 			}
2611 			/* preload hashes with zeroes... */
2612 			for (i = 0; i < n; ++i) {
2613 				hashes[n].add(&hashes[n],
2614 					(const unsigned char *) "", 1);
2615 			}
2616 		}
2617 		passlen = strlen(passphrase);
2618 		for (n = 0; n * hashsize < keysize; ++n) {
2619 			unsigned        i;
2620 
2621 			switch (pkt.u.seckey.s2k_specifier) {
2622 			case OPS_S2KS_SALTED:
2623 				hashes[n].add(&hashes[n],
2624 					pkt.u.seckey.salt,
2625 					OPS_SALT_SIZE);
2626 				/* FALLTHROUGH */
2627 			case OPS_S2KS_SIMPLE:
2628 				hashes[n].add(&hashes[n],
2629 					(unsigned char *) passphrase, passlen);
2630 				break;
2631 
2632 			case OPS_S2KS_ITERATED_AND_SALTED:
2633 				for (i = 0; i < pkt.u.seckey.octetc;
2634 						i += passlen + OPS_SALT_SIZE) {
2635 					unsigned	j;
2636 
2637 					j = passlen + OPS_SALT_SIZE;
2638 					if (i + j > pkt.u.seckey.octetc && i != 0) {
2639 						j = pkt.u.seckey.octetc - i;
2640 					}
2641 					hashes[n].add(&hashes[n],
2642 						pkt.u.seckey.salt,
2643 						(unsigned)(j > OPS_SALT_SIZE) ?
2644 							OPS_SALT_SIZE : j);
2645 					if (j > OPS_SALT_SIZE) {
2646 						hashes[n].add(&hashes[n],
2647 						(unsigned char *) passphrase,
2648 						j - OPS_SALT_SIZE);
2649 					}
2650 				}
2651 				break;
2652 			default:
2653 				break;
2654 			}
2655 		}
2656 
2657 		for (n = 0; n * hashsize < keysize; ++n) {
2658 			int	r;
2659 
2660 			r = hashes[n].finish(&hashes[n], key + n * hashsize);
2661 			if (r != hashsize) {
2662 				(void) fprintf(stderr,
2663 					"parse_seckey: bad r\n");
2664 				return 0;
2665 			}
2666 		}
2667 
2668 		__ops_forget(passphrase, passlen);
2669 
2670 		__ops_crypt_any(&decrypt, pkt.u.seckey.alg);
2671 		if (__ops_get_debug_level(__FILE__)) {
2672 			unsigned	i;
2673 
2674 			fprintf(stderr, "\nREADING:\niv=");
2675 			for (i = 0;
2676 			     i < __ops_block_size(pkt.u.seckey.alg);
2677 			     i++) {
2678 				fprintf(stderr, "%02x ", pkt.u.seckey.iv[i]);
2679 			}
2680 			fprintf(stderr, "\nkey=");
2681 			for (i = 0; i < CAST_KEY_LENGTH; i++) {
2682 				fprintf(stderr, "%02x ", key[i]);
2683 			}
2684 			fprintf(stderr, "\n");
2685 		}
2686 		decrypt.set_iv(&decrypt, pkt.u.seckey.iv);
2687 		decrypt.set_crypt_key(&decrypt, key);
2688 
2689 		/* now read encrypted data */
2690 
2691 		__ops_reader_push_decrypt(stream, &decrypt, region);
2692 
2693 		/*
2694 		 * Since all known encryption for PGP doesn't compress, we
2695 		 * can limit to the same length as the current region (for
2696 		 * now).
2697 		 */
2698 		__ops_init_subregion(&encregion, NULL);
2699 		encregion.length = region->length - region->readc;
2700 		if (pkt.u.seckey.pubkey.version != OPS_V4) {
2701 			encregion.length -= 2;
2702 		}
2703 		saved_region = region;
2704 		region = &encregion;
2705 	}
2706 	if (pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED) {
2707 		pkt.u.seckey.checkhash = calloc(1, OPS_CHECKHASH_SIZE);
2708 		if (pkt.u.seckey.checkhash == NULL) {
2709 			(void) fprintf(stderr, "parse_seckey: bad alloc\n");
2710 			return 0;
2711 		}
2712 		__ops_hash_sha1(&checkhash);
2713 		__ops_reader_push_hash(stream, &checkhash);
2714 	} else {
2715 		__ops_reader_push_sum16(stream);
2716 	}
2717 
2718 	switch (pkt.u.seckey.pubkey.alg) {
2719 	case OPS_PKA_RSA:
2720 	case OPS_PKA_RSA_ENCRYPT_ONLY:
2721 	case OPS_PKA_RSA_SIGN_ONLY:
2722 		if (!limread_mpi(&pkt.u.seckey.key.rsa.d, region, stream) ||
2723 		    !limread_mpi(&pkt.u.seckey.key.rsa.p, region, stream) ||
2724 		    !limread_mpi(&pkt.u.seckey.key.rsa.q, region, stream) ||
2725 		    !limread_mpi(&pkt.u.seckey.key.rsa.u, region, stream)) {
2726 			ret = 0;
2727 		}
2728 		break;
2729 
2730 	case OPS_PKA_DSA:
2731 		if (!limread_mpi(&pkt.u.seckey.key.dsa.x, region, stream)) {
2732 			ret = 0;
2733 		}
2734 		break;
2735 
2736 	default:
2737 		OPS_ERROR_2(&stream->errors,
2738 			OPS_E_ALG_UNSUPPORTED_PUBLIC_KEY_ALG,
2739 			"Unsupported Public Key algorithm %d (%s)",
2740 			pkt.u.seckey.pubkey.alg,
2741 			__ops_show_pka(pkt.u.seckey.pubkey.alg));
2742 		ret = 0;
2743 	}
2744 
2745 	if (__ops_get_debug_level(__FILE__)) {
2746 		(void) fprintf(stderr, "4 MPIs read\n");
2747 	}
2748 	stream->reading_v3_secret = 0;
2749 
2750 	if (pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED) {
2751 		unsigned char   hash[OPS_CHECKHASH_SIZE];
2752 
2753 		__ops_reader_pop_hash(stream);
2754 		checkhash.finish(&checkhash, hash);
2755 
2756 		if (crypted &&
2757 		    pkt.u.seckey.pubkey.version != OPS_V4) {
2758 			__ops_reader_pop_decrypt(stream);
2759 			region = saved_region;
2760 		}
2761 		if (ret) {
2762 			if (!limread(pkt.u.seckey.checkhash,
2763 				OPS_CHECKHASH_SIZE, region, stream)) {
2764 				return 0;
2765 			}
2766 
2767 			if (memcmp(hash, pkt.u.seckey.checkhash,
2768 					OPS_CHECKHASH_SIZE) != 0) {
2769 				ERRP(&stream->cbinfo, pkt,
2770 					"Hash mismatch in secret key");
2771 			}
2772 		}
2773 	} else {
2774 		unsigned short  sum;
2775 
2776 		sum = __ops_reader_pop_sum16(stream);
2777 		if (crypted &&
2778 		    pkt.u.seckey.pubkey.version != OPS_V4) {
2779 			__ops_reader_pop_decrypt(stream);
2780 			region = saved_region;
2781 		}
2782 		if (ret) {
2783 			if (!limread_scalar(&pkt.u.seckey.checksum, 2,
2784 					region, stream))
2785 				return 0;
2786 
2787 			if (sum != pkt.u.seckey.checksum) {
2788 				ERRP(&stream->cbinfo, pkt,
2789 					"Checksum mismatch in secret key");
2790 			}
2791 		}
2792 	}
2793 
2794 	if (crypted && pkt.u.seckey.pubkey.version == OPS_V4) {
2795 		__ops_reader_pop_decrypt(stream);
2796 	}
2797 	if (region == NULL) {
2798 		(void) fprintf(stderr, "parse_seckey: NULL region\n");
2799 		return 0;
2800 	}
2801 	if (ret && region->readc != region->length) {
2802 		(void) fprintf(stderr, "parse_seckey: bad length\n");
2803 		return 0;
2804 	}
2805 	if (!ret) {
2806 		return 0;
2807 	}
2808 	CALLBACK(OPS_PTAG_CT_SECRET_KEY, &stream->cbinfo, &pkt);
2809 	if (__ops_get_debug_level(__FILE__)) {
2810 		(void) fprintf(stderr, "--- end of parse_seckey\n\n");
2811 	}
2812 	return 1;
2813 }
2814 
2815 /**
2816    \ingroup Core_ReadPackets
2817    \brief Parse a Public Key Session Key packet
2818 */
2819 static int
2820 parse_pk_sesskey(__ops_region_t *region,
2821 		     __ops_stream_t *stream)
2822 {
2823 	const __ops_seckey_t	*secret;
2824 	__ops_packet_t		 sesskey;
2825 	__ops_packet_t		 pkt;
2826 	unsigned char		*iv;
2827 	unsigned char	   	 c = 0x0;
2828 	unsigned char		 cs[2];
2829 	unsigned		 k;
2830 	BIGNUM			*enc_m;
2831 	int			 n;
2832 
2833 	/* Can't rely on it being CAST5 */
2834 	/* \todo FIXME RW */
2835 	/* const size_t sz_unencoded_m_buf=CAST_KEY_LENGTH+1+2; */
2836 	unsigned char		 unencoded_m_buf[1024];
2837 
2838 	if (!limread(&c, 1, region, stream)) {
2839 		return 0;
2840 	}
2841 	pkt.u.pk_sesskey.version = (__ops_pk_sesskey_version_t)c;
2842 	if (pkt.u.pk_sesskey.version != OPS_PKSK_V3) {
2843 		OPS_ERROR_1(&stream->errors, OPS_E_PROTO_BAD_PKSK_VRSN,
2844 			"Bad public-key encrypted session key version (%d)",
2845 			    pkt.u.pk_sesskey.version);
2846 		return 0;
2847 	}
2848 	if (!limread(pkt.u.pk_sesskey.key_id,
2849 			  sizeof(pkt.u.pk_sesskey.key_id), region, stream)) {
2850 		return 0;
2851 	}
2852 	if (__ops_get_debug_level(__FILE__)) {
2853 		int             i;
2854 		int             x = sizeof(pkt.u.pk_sesskey.key_id);
2855 
2856 		printf("session key: public key id: x=%d\n", x);
2857 		for (i = 0; i < x; i++) {
2858 			printf("%2x ", pkt.u.pk_sesskey.key_id[i]);
2859 		}
2860 		printf("\n");
2861 	}
2862 	if (!limread(&c, 1, region, stream)) {
2863 		return 0;
2864 	}
2865 	pkt.u.pk_sesskey.alg = (__ops_pubkey_alg_t)c;
2866 	switch (pkt.u.pk_sesskey.alg) {
2867 	case OPS_PKA_RSA:
2868 		if (!limread_mpi(&pkt.u.pk_sesskey.params.rsa.encrypted_m,
2869 				      region, stream)) {
2870 			return 0;
2871 		}
2872 		enc_m = pkt.u.pk_sesskey.params.rsa.encrypted_m;
2873 		break;
2874 
2875 	case OPS_PKA_ELGAMAL:
2876 		if (!limread_mpi(&pkt.u.pk_sesskey.params.elgamal.g_to_k,
2877 				      region, stream) ||
2878 		    !limread_mpi(
2879 			&pkt.u.pk_sesskey.params.elgamal.encrypted_m,
2880 					 region, stream)) {
2881 			return 0;
2882 		}
2883 		enc_m = pkt.u.pk_sesskey.params.elgamal.encrypted_m;
2884 		break;
2885 
2886 	default:
2887 		OPS_ERROR_1(&stream->errors,
2888 			OPS_E_ALG_UNSUPPORTED_PUBLIC_KEY_ALG,
2889 			"Unknown public key algorithm in session key (%s)",
2890 			__ops_show_pka(pkt.u.pk_sesskey.alg));
2891 		return 0;
2892 	}
2893 
2894 	(void) memset(&sesskey, 0x0, sizeof(sesskey));
2895 	secret = NULL;
2896 	sesskey.u.get_seckey.seckey = &secret;
2897 	sesskey.u.get_seckey.pk_sesskey = &pkt.u.pk_sesskey;
2898 
2899 	CALLBACK(OPS_GET_SECKEY, &stream->cbinfo, &sesskey);
2900 
2901 	if (!secret) {
2902 		CALLBACK(OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY, &stream->cbinfo,
2903 			&pkt);
2904 		return 1;
2905 	}
2906 	n = __ops_decrypt_decode_mpi(unencoded_m_buf, sizeof(unencoded_m_buf),
2907 			enc_m, secret);
2908 	if (n < 1) {
2909 		ERRP(&stream->cbinfo, pkt, "decrypted message too short");
2910 		return 0;
2911 	}
2912 
2913 	/* PKA */
2914 	pkt.u.pk_sesskey.symm_alg = (__ops_symm_alg_t)unencoded_m_buf[0];
2915 
2916 	if (!__ops_is_sa_supported(pkt.u.pk_sesskey.symm_alg)) {
2917 		/* ERR1P */
2918 		OPS_ERROR_1(&stream->errors, OPS_E_ALG_UNSUPPORTED_SYMMETRIC_ALG,
2919 			    "Symmetric algorithm %s not supported",
2920 			    __ops_show_symm_alg(
2921 				pkt.u.pk_sesskey.symm_alg));
2922 		return 0;
2923 	}
2924 	k = __ops_key_size(pkt.u.pk_sesskey.symm_alg);
2925 
2926 	if ((unsigned) n != k + 3) {
2927 		OPS_ERROR_2(&stream->errors, OPS_E_PROTO_DECRYPTED_MSG_WRONG_LEN,
2928 		      "decrypted message wrong length (got %d expected %d)",
2929 			    n, k + 3);
2930 		return 0;
2931 	}
2932 	if (k > sizeof(pkt.u.pk_sesskey.key)) {
2933 		(void) fprintf(stderr, "parse_pk_sesskey: bad keylength\n");
2934 		return 0;
2935 	}
2936 
2937 	(void) memcpy(pkt.u.pk_sesskey.key, unencoded_m_buf + 1, k);
2938 
2939 	if (__ops_get_debug_level(__FILE__)) {
2940 		unsigned int    j;
2941 		printf("session key recovered (len=%u):\n", k);
2942 		for (j = 0; j < k; j++)
2943 			printf("%2x ", pkt.u.pk_sesskey.key[j]);
2944 		printf("\n");
2945 	}
2946 	pkt.u.pk_sesskey.checksum = unencoded_m_buf[k + 1] +
2947 			(unencoded_m_buf[k + 2] << 8);
2948 	if (__ops_get_debug_level(__FILE__)) {
2949 		printf("session key checksum: %2x %2x\n",
2950 			unencoded_m_buf[k + 1], unencoded_m_buf[k + 2]);
2951 	}
2952 
2953 	/* Check checksum */
2954 	__ops_calc_sesskey_checksum(&pkt.u.pk_sesskey, &cs[0]);
2955 	if (unencoded_m_buf[k + 1] != cs[0] ||
2956 	    unencoded_m_buf[k + 2] != cs[1]) {
2957 		OPS_ERROR_4(&stream->errors, OPS_E_PROTO_BAD_SK_CHECKSUM,
2958 		"Session key checksum wrong: expected %2x %2x, got %2x %2x",
2959 		cs[0], cs[1], unencoded_m_buf[k + 1],
2960 		unencoded_m_buf[k + 2]);
2961 		return 0;
2962 	}
2963 	/* all is well */
2964 	CALLBACK(OPS_PTAG_CT_PK_SESSION_KEY, &stream->cbinfo, &pkt);
2965 
2966 	__ops_crypt_any(&stream->decrypt, pkt.u.pk_sesskey.symm_alg);
2967 	iv = calloc(1, stream->decrypt.blocksize);
2968 	if (iv == NULL) {
2969 		(void) fprintf(stderr, "parse_pk_sesskey: bad alloc\n");
2970 		return 0;
2971 	}
2972 	stream->decrypt.set_iv(&stream->decrypt, iv);
2973 	stream->decrypt.set_crypt_key(&stream->decrypt, pkt.u.pk_sesskey.key);
2974 	__ops_encrypt_init(&stream->decrypt);
2975 	free(iv);
2976 	return 1;
2977 }
2978 
2979 static int
2980 __ops_decrypt_se_data(__ops_content_tag_t tag, __ops_region_t *region,
2981 		    __ops_stream_t *stream)
2982 {
2983 	__ops_crypt_t	*decrypt;
2984 	const int	 printerrors = 1;
2985 	int		 r = 1;
2986 
2987 	decrypt = __ops_get_decrypt(stream);
2988 	if (decrypt) {
2989 		unsigned char   buf[OPS_MAX_BLOCK_SIZE + 2] = "";
2990 		size_t          b = decrypt->blocksize;
2991 		/* __ops_packet_t pkt; */
2992 		__ops_region_t    encregion;
2993 
2994 
2995 		__ops_reader_push_decrypt(stream, decrypt, region);
2996 
2997 		__ops_init_subregion(&encregion, NULL);
2998 		encregion.length = b + 2;
2999 
3000 		if (!exact_limread(buf, b + 2, &encregion, stream)) {
3001 			return 0;
3002 		}
3003 		if (buf[b - 2] != buf[b] || buf[b - 1] != buf[b + 1]) {
3004 			__ops_reader_pop_decrypt(stream);
3005 			OPS_ERROR_4(&stream->errors,
3006 				OPS_E_PROTO_BAD_SYMMETRIC_DECRYPT,
3007 				"Bad symmetric decrypt (%02x%02x vs %02x%02x)",
3008 				buf[b - 2], buf[b - 1], buf[b], buf[b + 1]);
3009 			return 0;
3010 		}
3011 		if (tag == OPS_PTAG_CT_SE_DATA_BODY) {
3012 			decrypt->decrypt_resync(decrypt);
3013 			decrypt->block_encrypt(decrypt, decrypt->civ,
3014 					decrypt->civ);
3015 		}
3016 		r = __ops_parse(stream, !printerrors);
3017 
3018 		__ops_reader_pop_decrypt(stream);
3019 	} else {
3020 		__ops_packet_t pkt;
3021 
3022 		while (region->readc < region->length) {
3023 			unsigned        len;
3024 
3025 			len = region->length - region->readc;
3026 			if (len > sizeof(pkt.u.se_data_body.data))
3027 				len = sizeof(pkt.u.se_data_body.data);
3028 
3029 			if (!limread(pkt.u.se_data_body.data, len,
3030 					region, stream)) {
3031 				return 0;
3032 			}
3033 			pkt.u.se_data_body.length = len;
3034 			CALLBACK(tag, &stream->cbinfo, &pkt);
3035 		}
3036 	}
3037 
3038 	return r;
3039 }
3040 
3041 static int
3042 __ops_decrypt_se_ip_data(__ops_content_tag_t tag, __ops_region_t *region,
3043 		       __ops_stream_t *stream)
3044 {
3045 	__ops_crypt_t	*decrypt;
3046 	const int	 printerrors = 1;
3047 	int		 r = 1;
3048 
3049 	decrypt = __ops_get_decrypt(stream);
3050 	if (decrypt) {
3051 		__ops_reader_push_decrypt(stream, decrypt, region);
3052 		__ops_reader_push_se_ip_data(stream, decrypt, region);
3053 
3054 		r = __ops_parse(stream, !printerrors);
3055 
3056 		__ops_reader_pop_se_ip_data(stream);
3057 		__ops_reader_pop_decrypt(stream);
3058 	} else {
3059 		__ops_packet_t pkt;
3060 
3061 		while (region->readc < region->length) {
3062 			unsigned        len;
3063 
3064 			len = region->length - region->readc;
3065 			if (len > sizeof(pkt.u.se_data_body.data)) {
3066 				len = sizeof(pkt.u.se_data_body.data);
3067 			}
3068 
3069 			if (!limread(pkt.u.se_data_body.data,
3070 					len, region, stream)) {
3071 				return 0;
3072 			}
3073 
3074 			pkt.u.se_data_body.length = len;
3075 
3076 			CALLBACK(tag, &stream->cbinfo, &pkt);
3077 		}
3078 	}
3079 
3080 	return r;
3081 }
3082 
3083 /**
3084    \ingroup Core_ReadPackets
3085    \brief Read a Symmetrically Encrypted packet
3086 */
3087 static int
3088 parse_se_data(__ops_region_t *region, __ops_stream_t *stream)
3089 {
3090 	__ops_packet_t pkt;
3091 
3092 	/* there's no info to go with this, so just announce it */
3093 	CALLBACK(OPS_PTAG_CT_SE_DATA_HEADER, &stream->cbinfo, &pkt);
3094 
3095 	/*
3096 	 * The content of an encrypted data packet is more OpenPGP packets
3097 	 * once decrypted, so recursively handle them
3098 	 */
3099 	return __ops_decrypt_se_data(OPS_PTAG_CT_SE_DATA_BODY, region, stream);
3100 }
3101 
3102 /**
3103    \ingroup Core_ReadPackets
3104    \brief Read a Symmetrically Encrypted Integrity Protected packet
3105 */
3106 static int
3107 parse_se_ip_data(__ops_region_t *region, __ops_stream_t *stream)
3108 {
3109 	__ops_packet_t	pkt;
3110 	unsigned char   c = 0x0;
3111 
3112 	if (!limread(&c, 1, region, stream)) {
3113 		return 0;
3114 	}
3115 	pkt.u.se_ip_data_header.version = (__ops_se_ip_version_t)c;
3116 
3117 	if (pkt.u.se_ip_data_header.version != OPS_SE_IP_V1) {
3118 		(void) fprintf(stderr, "parse_se_ip_data: bad version\n");
3119 		return 0;
3120 	}
3121 
3122 	/*
3123 	 * The content of an encrypted data packet is more OpenPGP packets
3124 	 * once decrypted, so recursively handle them
3125 	 */
3126 	return __ops_decrypt_se_ip_data(OPS_PTAG_CT_SE_IP_DATA_BODY, region,
3127 			stream);
3128 }
3129 
3130 /**
3131    \ingroup Core_ReadPackets
3132    \brief Read a MDC packet
3133 */
3134 static int
3135 parse_mdc(__ops_region_t *region, __ops_stream_t *stream)
3136 {
3137 	__ops_packet_t pkt;
3138 
3139 	pkt.u.mdc.length = OPS_SHA1_HASH_SIZE;
3140 	if ((pkt.u.mdc.data = calloc(1, OPS_SHA1_HASH_SIZE)) == NULL) {
3141 		(void) fprintf(stderr, "parse_mdc: bad alloc\n");
3142 		return 0;
3143 	}
3144 	if (!limread(pkt.u.mdc.data, OPS_SHA1_HASH_SIZE, region, stream)) {
3145 		return 0;
3146 	}
3147 	CALLBACK(OPS_PTAG_CT_MDC, &stream->cbinfo, &pkt);
3148 	free(pkt.u.mdc.data);
3149 	return 1;
3150 }
3151 
3152 /**
3153  * \ingroup Core_ReadPackets
3154  * \brief Parse one packet.
3155  *
3156  * This function parses the packet tag.  It computes the value of the
3157  * content tag and then calls the appropriate function to handle the
3158  * content.
3159  *
3160  * \param *stream	How to parse
3161  * \param *pktlen	On return, will contain number of bytes in packet
3162  * \return 1 on success, 0 on error, -1 on EOF */
3163 static int
3164 __ops_parse_packet(__ops_stream_t *stream, unsigned long *pktlen)
3165 {
3166 	__ops_packet_t	pkt;
3167 	__ops_region_t	region;
3168 	unsigned char	ptag;
3169 	unsigned	indeterminate = 0;
3170 	int		ret;
3171 
3172 	pkt.u.ptag.position = stream->readinfo.position;
3173 
3174 	ret = base_read(&ptag, 1, stream);
3175 
3176 	if (__ops_get_debug_level(__FILE__)) {
3177 		(void) fprintf(stderr,
3178 			"__ops_parse_packet: base_read returned %d\n",
3179 			ret);
3180 	}
3181 
3182 	/* errors in the base read are effectively EOF. */
3183 	if (ret <= 0) {
3184 		return -1;
3185 	}
3186 
3187 	*pktlen = 0;
3188 
3189 	if (!(ptag & OPS_PTAG_ALWAYS_SET)) {
3190 		pkt.u.error.error = "Format error (ptag bit not set)";
3191 		CALLBACK(OPS_PARSER_ERROR, &stream->cbinfo, &pkt);
3192 		return 0;
3193 	}
3194 	pkt.u.ptag.new_format = !!(ptag & OPS_PTAG_NEW_FORMAT);
3195 	if (pkt.u.ptag.new_format) {
3196 		pkt.u.ptag.type = (ptag & OPS_PTAG_NF_CONTENT_TAG_MASK);
3197 		pkt.u.ptag.length_type = 0;
3198 		if (!read_new_length(&pkt.u.ptag.length, stream)) {
3199 			return 0;
3200 		}
3201 	} else {
3202 		unsigned   rb;
3203 
3204 		rb = 0;
3205 		pkt.u.ptag.type = ((unsigned)ptag &
3206 				OPS_PTAG_OF_CONTENT_TAG_MASK)
3207 			>> OPS_PTAG_OF_CONTENT_TAG_SHIFT;
3208 		pkt.u.ptag.length_type = ptag & OPS_PTAG_OF_LENGTH_TYPE_MASK;
3209 		switch (pkt.u.ptag.length_type) {
3210 		case OPS_PTAG_OLD_LEN_1:
3211 			rb = _read_scalar(&pkt.u.ptag.length, 1, stream);
3212 			break;
3213 
3214 		case OPS_PTAG_OLD_LEN_2:
3215 			rb = _read_scalar(&pkt.u.ptag.length, 2, stream);
3216 			break;
3217 
3218 		case OPS_PTAG_OLD_LEN_4:
3219 			rb = _read_scalar(&pkt.u.ptag.length, 4, stream);
3220 			break;
3221 
3222 		case OPS_PTAG_OLD_LEN_INDETERMINATE:
3223 			pkt.u.ptag.length = 0;
3224 			indeterminate = 1;
3225 			rb = 1;
3226 			break;
3227 		}
3228 		if (!rb) {
3229 			return 0;
3230 		}
3231 	}
3232 
3233 	CALLBACK(OPS_PARSER_PTAG, &stream->cbinfo, &pkt);
3234 
3235 	__ops_init_subregion(&region, NULL);
3236 	region.length = pkt.u.ptag.length;
3237 	region.indeterminate = indeterminate;
3238 	if (__ops_get_debug_level(__FILE__)) {
3239 		(void) fprintf(stderr, "__ops_parse_packet: type %u\n",
3240 			       pkt.u.ptag.type);
3241 	}
3242 	switch (pkt.u.ptag.type) {
3243 	case OPS_PTAG_CT_SIGNATURE:
3244 		ret = parse_sig(&region, stream);
3245 		break;
3246 
3247 	case OPS_PTAG_CT_PUBLIC_KEY:
3248 	case OPS_PTAG_CT_PUBLIC_SUBKEY:
3249 		ret = parse_pubkey(pkt.u.ptag.type, &region, stream);
3250 		break;
3251 
3252 	case OPS_PTAG_CT_TRUST:
3253 		ret = parse_trust(&region, stream);
3254 		break;
3255 
3256 	case OPS_PTAG_CT_USER_ID:
3257 		ret = parse_userid(&region, stream);
3258 		break;
3259 
3260 	case OPS_PTAG_CT_COMPRESSED:
3261 		ret = parse_compressed(&region, stream);
3262 		break;
3263 
3264 	case OPS_PTAG_CT_1_PASS_SIG:
3265 		ret = parse_one_pass(&region, stream);
3266 		break;
3267 
3268 	case OPS_PTAG_CT_LITDATA:
3269 		ret = parse_litdata(&region, stream);
3270 		break;
3271 
3272 	case OPS_PTAG_CT_USER_ATTR:
3273 		ret = parse_userattr(&region, stream);
3274 		break;
3275 
3276 	case OPS_PTAG_CT_SECRET_KEY:
3277 		ret = parse_seckey(&region, stream);
3278 		break;
3279 
3280 	case OPS_PTAG_CT_SECRET_SUBKEY:
3281 		ret = parse_seckey(&region, stream);
3282 		break;
3283 
3284 	case OPS_PTAG_CT_PK_SESSION_KEY:
3285 		ret = parse_pk_sesskey(&region, stream);
3286 		break;
3287 
3288 	case OPS_PTAG_CT_SE_DATA:
3289 		ret = parse_se_data(&region, stream);
3290 		break;
3291 
3292 	case OPS_PTAG_CT_SE_IP_DATA:
3293 		ret = parse_se_ip_data(&region, stream);
3294 		break;
3295 
3296 	case OPS_PTAG_CT_MDC:
3297 		ret = parse_mdc(&region, stream);
3298 		break;
3299 
3300 	default:
3301 		OPS_ERROR_1(&stream->errors, OPS_E_P_UNKNOWN_TAG,
3302 			    "Unknown content tag 0x%x",
3303 			    pkt.u.ptag.type);
3304 		ret = 0;
3305 	}
3306 
3307 	/* Ensure that the entire packet has been consumed */
3308 
3309 	if (region.length != region.readc && !region.indeterminate) {
3310 		if (!consume_packet(&region, stream, 0)) {
3311 			ret = -1;
3312 		}
3313 	}
3314 
3315 	/* also consume it if there's been an error? */
3316 	/* \todo decide what to do about an error on an */
3317 	/* indeterminate packet */
3318 	if (ret == 0) {
3319 		if (!consume_packet(&region, stream, 0)) {
3320 			ret = -1;
3321 		}
3322 	}
3323 	/* set pktlen */
3324 
3325 	*pktlen = stream->readinfo.alength;
3326 
3327 	/* do callback on entire packet, if desired and there was no error */
3328 
3329 	if (ret > 0 && stream->readinfo.accumulate) {
3330 		pkt.u.packet.length = stream->readinfo.alength;
3331 		pkt.u.packet.raw = stream->readinfo.accumulated;
3332 		stream->readinfo.accumulated = NULL;
3333 		stream->readinfo.asize = 0;
3334 		CALLBACK(OPS_PARSER_PACKET_END, &stream->cbinfo, &pkt);
3335 	}
3336 	stream->readinfo.alength = 0;
3337 
3338 	return (ret < 0) ? -1 : (ret) ? 1 : 0;
3339 }
3340 
3341 /**
3342  * \ingroup Core_ReadPackets
3343  *
3344  * \brief Parse packets from an input stream until EOF or error.
3345  *
3346  * \details Setup the necessary parsing configuration in "stream"
3347  * before calling __ops_parse().
3348  *
3349  * That information includes :
3350  *
3351  * - a "reader" function to be used to get the data to be parsed
3352  *
3353  * - a "callback" function to be called when this library has identified
3354  * a parseable object within the data
3355  *
3356  * - whether the calling function wants the signature subpackets
3357  * returned raw, parsed or not at all.
3358  *
3359  * After returning, stream->errors holds any errors encountered while parsing.
3360  *
3361  * \param stream	Parsing configuration
3362  * \return		1 on success in all packets, 0 on error in any packet
3363  *
3364  * \sa CoreAPI Overview
3365  *
3366  * \sa __ops_print_errors()
3367  *
3368  */
3369 
3370 int
3371 __ops_parse(__ops_stream_t *stream, const int perrors)
3372 {
3373 	unsigned long   pktlen;
3374 	int             r;
3375 
3376 	do {
3377 		r = __ops_parse_packet(stream, &pktlen);
3378 	} while (r != -1);
3379 	if (perrors) {
3380 		__ops_print_errors(stream->errors);
3381 	}
3382 	return (stream->errors == NULL);
3383 }
3384 
3385 /**
3386  * \ingroup Core_ReadPackets
3387  *
3388  * \brief Specifies whether one or more signature
3389  * subpacket types should be returned parsed; or raw; or ignored.
3390  *
3391  * \param	stream	Pointer to previously allocated structure
3392  * \param	tag	Packet tag. OPS_PTAG_SS_ALL for all SS tags; or one individual signature subpacket tag
3393  * \param	type	Parse type
3394  * \todo Make all packet types optional, not just subpackets */
3395 void
3396 __ops_parse_options(__ops_stream_t *stream,
3397 		  __ops_content_tag_t tag,
3398 		  __ops_parse_type_t type)
3399 {
3400 	unsigned	t7;
3401 	unsigned	t8;
3402 
3403 	if (tag == OPS_PTAG_SS_ALL) {
3404 		int             n;
3405 
3406 		for (n = 0; n < 256; ++n) {
3407 			__ops_parse_options(stream,
3408 				OPS_PTAG_SIG_SUBPKT_BASE + n,
3409 				type);
3410 		}
3411 		return;
3412 	}
3413 	if (tag < OPS_PTAG_SIG_SUBPKT_BASE ||
3414 	    tag > OPS_PTAG_SIG_SUBPKT_BASE + NTAGS - 1) {
3415 		(void) fprintf(stderr, "__ops_parse_options: bad tag\n");
3416 		return;
3417 	}
3418 	t8 = (tag - OPS_PTAG_SIG_SUBPKT_BASE) / 8;
3419 	t7 = 1 << ((tag - OPS_PTAG_SIG_SUBPKT_BASE) & 7);
3420 	switch (type) {
3421 	case OPS_PARSE_RAW:
3422 		stream->ss_raw[t8] |= t7;
3423 		stream->ss_parsed[t8] &= ~t7;
3424 		break;
3425 
3426 	case OPS_PARSE_PARSED:
3427 		stream->ss_raw[t8] &= ~t7;
3428 		stream->ss_parsed[t8] |= t7;
3429 		break;
3430 
3431 	case OPS_PARSE_IGNORE:
3432 		stream->ss_raw[t8] &= ~t7;
3433 		stream->ss_parsed[t8] &= ~t7;
3434 		break;
3435 	}
3436 }
3437 
3438 /**
3439 \ingroup Core_ReadPackets
3440 \brief Free __ops_stream_t struct and its contents
3441 */
3442 void
3443 __ops_stream_delete(__ops_stream_t *stream)
3444 {
3445 	__ops_cbdata_t	*cbinfo;
3446 	__ops_cbdata_t	*next;
3447 
3448 	for (cbinfo = stream->cbinfo.next; cbinfo; cbinfo = next) {
3449 		next = cbinfo->next;
3450 		free(cbinfo);
3451 	}
3452 	if (stream->readinfo.destroyer) {
3453 		stream->readinfo.destroyer(&stream->readinfo);
3454 	}
3455 	__ops_free_errors(stream->errors);
3456 	if (stream->readinfo.accumulated) {
3457 		free(stream->readinfo.accumulated);
3458 	}
3459 	free(stream);
3460 }
3461 
3462 /**
3463 \ingroup Core_ReadPackets
3464 \brief Returns the parse_info's reader_info
3465 \return Pointer to the reader_info inside the parse_info
3466 */
3467 __ops_reader_t *
3468 __ops_readinfo(__ops_stream_t *stream)
3469 {
3470 	return &stream->readinfo;
3471 }
3472 
3473 /**
3474 \ingroup Core_ReadPackets
3475 \brief Sets the parse_info's callback
3476 This is used when adding the first callback in a stack of callbacks.
3477 \sa __ops_callback_push()
3478 */
3479 
3480 void
3481 __ops_set_callback(__ops_stream_t *stream, __ops_cbfunc_t *cb, void *arg)
3482 {
3483 	stream->cbinfo.cbfunc = cb;
3484 	stream->cbinfo.arg = arg;
3485 	stream->cbinfo.errors = &stream->errors;
3486 }
3487 
3488 /**
3489 \ingroup Core_ReadPackets
3490 \brief Adds a further callback to a stack of callbacks
3491 \sa __ops_set_callback()
3492 */
3493 void
3494 __ops_callback_push(__ops_stream_t *stream, __ops_cbfunc_t *cb, void *arg)
3495 {
3496 	__ops_cbdata_t	*cbinfo;
3497 
3498 	if ((cbinfo = calloc(1, sizeof(*cbinfo))) == NULL) {
3499 		(void) fprintf(stderr, "__ops_callback_push: bad alloc\n");
3500 		return;
3501 	}
3502 	(void) memcpy(cbinfo, &stream->cbinfo, sizeof(*cbinfo));
3503 	cbinfo->io = stream->io;
3504 	stream->cbinfo.next = cbinfo;
3505 	__ops_set_callback(stream, cb, arg);
3506 }
3507 
3508 /**
3509 \ingroup Core_ReadPackets
3510 \brief Returns callback's arg
3511 */
3512 void *
3513 __ops_callback_arg(__ops_cbdata_t *cbinfo)
3514 {
3515 	return cbinfo->arg;
3516 }
3517 
3518 /**
3519 \ingroup Core_ReadPackets
3520 \brief Returns callback's errors
3521 */
3522 void *
3523 __ops_callback_errors(__ops_cbdata_t *cbinfo)
3524 {
3525 	return cbinfo->errors;
3526 }
3527 
3528 /**
3529 \ingroup Core_ReadPackets
3530 \brief Calls the parse_cb_info's callback if present
3531 \return Return value from callback, if present; else OPS_FINISHED
3532 */
3533 __ops_cb_ret_t
3534 __ops_callback(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
3535 {
3536 	return (cbinfo->cbfunc) ? cbinfo->cbfunc(pkt, cbinfo) : OPS_FINISHED;
3537 }
3538 
3539 /**
3540 \ingroup Core_ReadPackets
3541 \brief Calls the next callback  in the stack
3542 \return Return value from callback
3543 */
3544 __ops_cb_ret_t
3545 __ops_stacked_callback(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
3546 {
3547 	return __ops_callback(pkt, cbinfo->next);
3548 }
3549 
3550 /**
3551 \ingroup Core_ReadPackets
3552 \brief Returns the parse_info's errors
3553 \return parse_info's errors
3554 */
3555 __ops_error_t    *
3556 __ops_stream_get_errors(__ops_stream_t *stream)
3557 {
3558 	return stream->errors;
3559 }
3560 
3561 __ops_crypt_t    *
3562 __ops_get_decrypt(__ops_stream_t *stream)
3563 {
3564 	return (stream->decrypt.alg) ? &stream->decrypt : NULL;
3565 }
3566