diff options
Diffstat (limited to 'usr.sbin/pkg_install/sign/gzip.c')
-rw-r--r-- | usr.sbin/pkg_install/sign/gzip.c | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/usr.sbin/pkg_install/sign/gzip.c b/usr.sbin/pkg_install/sign/gzip.c new file mode 100644 index 00000000000..63f45ecf9f6 --- /dev/null +++ b/usr.sbin/pkg_install/sign/gzip.c @@ -0,0 +1,136 @@ +/* $OpenBSD: gzip.c,v 1.1 1999/09/27 21:40:04 espie Exp $ */ +/*- + * Copyright (c) 1999 Marc Espie. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Marc Espie for the OpenBSD + * Project. + * + * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD + * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include <sys/types.h> +#include <stdio.h> +#include <string.h> +#include "stand.h" +#include "gzip.h" +#include "pgp.h" + +/* For now, signatures follow a hardcoded format + (endianess was chosen to conform to gzip header format) + */ +static char tagsign[] = + {'S', 'i', 'g', 'P', 'G', 'P', + (char)(SIGNSIZE /256), (char)(SIGNSIZE & 255) }; + +/* retrieve a gzip header, including PGP signatures */ +int +gzip_read_header(f, h, sign) + FILE *f; + struct mygzip_header *h; + char sign[]; +{ + { + int c, d; + + c = fgetc(f); + d = fgetc(f); + if ((unsigned char)c != (unsigned char)GZIP_MAGIC0 + || (unsigned char)d != (unsigned char)GZIP_MAGIC1) + return GZIP_NOT_GZIP; + } + { + int method, flags; + + method = fgetc(f); + flags = fgetc(f); + + if (method == EOF || flags == EOF || fread(h->stamp, 1, 6, f) != 6) + return GZIP_NOT_GZIP; + h->method = (char)method; + h->flags = (char)flags; + } + + if ((h->flags & CONTINUATION) != 0) + if (fread(h->part, 1, 2, f) != 2) + return GZIP_NOT_GZIP; + if ((h->flags & EXTRA_FIELD) != 0) { + char match[sizeof(tagsign)]; + unsigned int len; + int c; + + c = fgetc(f); + if (c == EOF) + return GZIP_NOT_PGPSIGNED; + len = (unsigned)c; + c = fgetc(f); + if (c == EOF) + return GZIP_NOT_PGPSIGNED; + len |= ((unsigned) c) << 8; + if (len != sizeof(tagsign) + SIGNSIZE) + return GZIP_NOT_PGPSIGNED; + if (fread(match, 1, sizeof(match), f) != sizeof(match) || + memcmp(match, tagsign, sizeof(match)) != 0) + return GZIP_NOT_PGPSIGNED; + if (sign != NULL) { + if (fread(sign, 1, SIGNSIZE, f) == SIGNSIZE) + return GZIP_SIGNED; + else + return GZIP_NOT_PGPSIGNED; + } else + return GZIP_UNSIGNED; + } else + return GZIP_UNSIGNED; +} + +int +gzip_write_header(f, h, sign) + FILE *f; + const struct mygzip_header *h; + const char sign[]; +{ + char flags; + + flags = h->flags; + + if (sign != NULL) + flags |= EXTRA_FIELD; + else + flags &= ~EXTRA_FIELD; + if (fputc(GZIP_MAGIC0, f) == EOF || + fputc(GZIP_MAGIC1, f) == EOF || + fputc(h->method, f) == EOF || + fputc(flags, f) == EOF || + fwrite(h->stamp, 1, 6, f) != 6) + return 0; + if ((h->flags & CONTINUATION) != 0) + if (fwrite(h->part, 1, 2, f) != 2) + return 0; + if (sign != NULL) { + unsigned short len = sizeof(tagsign) + SIGNSIZE; + if (fputc(len & 255, f) == EOF || + fputc(len/256, f) == EOF || + fwrite(tagsign, 1, sizeof(tagsign), f) != sizeof(tagsign) || + fwrite(sign, 1, SIGNSIZE, f) != SIGNSIZE) + return 0; + } + return 1; +} |