Module Name: src Committed By: agc Date: Mon Nov 15 08:03:40 UTC 2010
Modified Files: src/crypto/external/bsd/netpgp/dist/src/lib: compress.c create.c netpgp.c packet-parse.c writer.c Log Message: Changes to help with netpgp key generation and interoperability: + use plain SHA1 for session key s2k negotiation + don't warn on some conditions when inflating (reading a compressed file) since the conditions don't hold for partial block lengths + prompt for a passphrase when generating a new key - used in the upcoming secret-sharing functionality for netpgp To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 \ src/crypto/external/bsd/netpgp/dist/src/lib/compress.c cvs rdiff -u -r1.37 -r1.38 \ src/crypto/external/bsd/netpgp/dist/src/lib/create.c cvs rdiff -u -r1.82 -r1.83 \ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c cvs rdiff -u -r1.47 -r1.48 \ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c cvs rdiff -u -r1.30 -r1.31 \ src/crypto/external/bsd/netpgp/dist/src/lib/writer.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/crypto/external/bsd/netpgp/dist/src/lib/compress.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/compress.c:1.20 src/crypto/external/bsd/netpgp/dist/src/lib/compress.c:1.21 --- src/crypto/external/bsd/netpgp/dist/src/lib/compress.c:1.20 Thu Nov 11 00:58:04 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/compress.c Mon Nov 15 08:03:39 2010 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: compress.c,v 1.20 2010/11/11 00:58:04 agc Exp $"); +__RCSID("$NetBSD: compress.c,v 1.21 2010/11/15 08:03:39 agc Exp $"); #endif #ifdef HAVE_ZLIB_H @@ -133,19 +133,11 @@ z->zstream.next_out == &z->out[z->offset]) { return 0; } - if (pgp_get_debug_level(__FILE__)) { (void) fprintf(stderr, "zlib_compressed_data_reader: length %" PRIsize "d\n", length); } - - if (z->region->readc == z->region->length) { - if (z->inflate_ret != Z_STREAM_END) { - PGP_ERROR(cbinfo->errors, PGP_E_P_DECOMPRESSION_ERROR, - "Compressed data didn't end when region ended."); - } - } for (cc = 0 ; cc < length ; cc += len) { if (&z->out[z->offset] == z->zstream.next_out) { int ret; @@ -221,17 +213,10 @@ (void) fprintf(stderr, "Weird type %d\n", bz->type); return 0; } - if (bz->inflate_ret == BZ_STREAM_END && bz->bzstream.next_out == &bz->out[bz->offset]) { return 0; } - if (bz->region->readc == bz->region->length) { - if (bz->inflate_ret != BZ_STREAM_END) { - PGP_ERROR(cbinfo->errors, PGP_E_P_DECOMPRESSION_ERROR, - "Compressed data didn't end when region ended."); - } - } for (cc = 0 ; cc < length ; cc += len) { if (&bz->out[bz->offset] == bz->bzstream.next_out) { int ret; Index: src/crypto/external/bsd/netpgp/dist/src/lib/create.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.37 src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.38 --- src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.37 Sun Nov 7 08:39:59 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/create.c Mon Nov 15 08:03:39 2010 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: create.c,v 1.37 2010/11/07 08:39:59 agc Exp $"); +__RCSID("$NetBSD: create.c,v 1.38 2010/11/15 08:03:39 agc Exp $"); #endif #include <sys/types.h> @@ -285,7 +285,7 @@ pgp_hash_t hash; unsigned done = 0; unsigned i = 0; - uint8_t hashed[PGP_SHA1_HASH_SIZE]; + uint8_t *hashed; uint8_t sesskey[CAST_KEY_LENGTH]; if (!write_pubkey_body(&key->pubkey, output)) { @@ -360,15 +360,21 @@ /* RFC4880: section 3.7.1.1 and 3.7.1.2 */ for (done = 0, i = 0; done < CAST_KEY_LENGTH; i++) { + unsigned hashsize; unsigned j; + unsigned needed; + unsigned size; uint8_t zero = 0; - int needed; - int size; + /* Hard-coded SHA1 for session key */ + pgp_hash_any(&hash, PGP_HASH_SHA1); + hashsize = pgp_hash_size(key->hash_alg); needed = CAST_KEY_LENGTH - done; - size = MIN(needed, PGP_SHA1_HASH_SIZE); - - pgp_hash_any(&hash, key->hash_alg); + size = MIN(needed, hashsize); + if ((hashed = calloc(1, hashsize)) == NULL) { + (void) fprintf(stderr, "write_seckey_body: bad alloc\n"); + return 0; + } if (!hash.init(&hash)) { (void) fprintf(stderr, "write_seckey_body: bad alloc\n"); return 0; @@ -396,7 +402,7 @@ * if more in hash than is needed by session key, use * the leftmost octets */ - (void) memcpy(&sesskey[i * PGP_SHA1_HASH_SIZE], + (void) memcpy(&sesskey[i * hashsize], hashed, (unsigned)size); done += (unsigned)size; if (done > CAST_KEY_LENGTH) { @@ -435,13 +441,9 @@ pgp_push_enc_crypt(output, &crypted); switch (key->pubkey.alg) { - /* case PGP_PKA_DSA: */ - /* return pgp_write_mpi(output, key->key.dsa.x); */ - case PGP_PKA_RSA: case PGP_PKA_RSA_ENCRYPT_ONLY: case PGP_PKA_RSA_SIGN_ONLY: - if (!pgp_write_mpi(output, key->key.rsa.d) || !pgp_write_mpi(output, key->key.rsa.p) || !pgp_write_mpi(output, key->key.rsa.q) || Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.82 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.83 --- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.82 Sun Nov 7 21:41:38 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c Mon Nov 15 08:03:39 2010 @@ -34,7 +34,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: netpgp.c,v 1.82 2010/11/07 21:41:38 agc Exp $"); +__RCSID("$NetBSD: netpgp.c,v 1.83 2010/11/15 08:03:39 agc Exp $"); #endif #include <sys/types.h> @@ -697,6 +697,45 @@ return cc; } +#define MAX_PASSPHRASE_ATTEMPTS 3 + +/* get the passphrase from the user */ +static int +find_passphrase(FILE *passfp, const char *id, char *passphrase, size_t size) +{ + char prompt[BUFSIZ]; + char buf[128]; + char *cp; + int cc; + int i; + + if (passfp) { + if (fgets(passphrase, size, passfp) == NULL) { + return 0; + } + return strlen(passphrase); + } + for (i = 0 ; i < MAX_PASSPHRASE_ATTEMPTS ; i++) { + (void) snprintf(prompt, sizeof(prompt), "Enter passphrase for %.16s: ", id); + if ((cp = getpass(prompt)) == NULL) { + break; + } + cc = snprintf(buf, sizeof(buf), "%s", cp); + (void) snprintf(prompt, sizeof(prompt), "Repeat passphrase for %.16s: ", id); + if ((cp = getpass(prompt)) == NULL) { + break; + } + cc = snprintf(passphrase, size, "%s", cp); + if (strcmp(buf, passphrase) == 0) { + (void) memset(buf, 0x0, sizeof(buf)); + return cc; + } + } + (void) memset(buf, 0x0, sizeof(buf)); + (void) memset(passphrase, 0x0, size); + return 0; +} + /***************************************************************************/ /* exported functions start here */ /***************************************************************************/ @@ -1086,6 +1125,8 @@ return pgp_keyring_list(io, netpgp->pubring, 0); } +#define ID_OFFSET 38 + /* generate a new key */ int netpgp_generate_key(netpgp_t *netpgp, char *id, int numbits) @@ -1095,11 +1136,13 @@ pgp_key_t *key; pgp_io_t *io; uint8_t *uid; + char passphrase[128]; char newid[1024]; char filename[MAXPATHLEN]; char dir[MAXPATHLEN]; char *cp; char *ringfile; + int passc; int fd; uid = NULL; @@ -1123,7 +1166,7 @@ pgp_sprint_keydata(netpgp->io, NULL, key, &cp, "signature ", &key->key.seckey.pubkey, 0); (void) fprintf(stdout, "%s", cp); /* write public key */ - (void) snprintf(dir, sizeof(dir), "%s/%.16s", netpgp_getvar(netpgp, "homedir"), &cp[38]); + (void) snprintf(dir, sizeof(dir), "%s/%.16s", netpgp_getvar(netpgp, "homedir"), &cp[ID_OFFSET]); if (mkdir(dir, 0700) < 0) { (void) fprintf(io->errs, "can't mkdir '%s'\n", dir); return 0; @@ -1146,7 +1189,9 @@ (void) fprintf(io->errs, "can't append secring '%s'\n", ringfile); return 0; } - if (!pgp_write_xfer_seckey(create, key, NULL, 0, noarmor)) { + /* get the passphrase */ + passc = find_passphrase(netpgp->passfp, &cp[ID_OFFSET], passphrase, sizeof(passphrase)); + if (!pgp_write_xfer_seckey(create, key, (uint8_t *)passphrase, passc, noarmor)) { (void) fprintf(io->errs, "Cannot write seckey\n"); return 0; } Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.47 src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.48 --- src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.47 Thu Nov 11 01:08:26 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c Mon Nov 15 08:03:40 2010 @@ -58,7 +58,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: packet-parse.c,v 1.47 2010/11/11 01:08:26 agc Exp $"); +__RCSID("$NetBSD: packet-parse.c,v 1.48 2010/11/15 08:03:40 agc Exp $"); #endif #include <sys/types.h> @@ -2468,6 +2468,8 @@ return 0; } + /* Hardcoded SHA1 for just now */ + pkt.u.seckey.hash_alg = PGP_HASH_SHA1; hashsize = pgp_hash_size(pkt.u.seckey.hash_alg); if (hashsize == 0 || hashsize > PGP_MAX_HASH_SIZE) { (void) fprintf(stderr, @@ -2573,7 +2575,8 @@ fprintf(stderr, "parse_seckey: end of crypted passphrase\n"); } if (pkt.u.seckey.s2k_usage == PGP_S2KU_ENCRYPTED_AND_HASHED) { - pkt.u.seckey.checkhash = calloc(1, PGP_CHECKHASH_SIZE); + /* XXX - Hard-coded SHA1 here ?? Check */ + pkt.u.seckey.checkhash = calloc(1, PGP_SHA1_HASH_SIZE); if (pkt.u.seckey.checkhash == NULL) { (void) fprintf(stderr, "parse_seckey: bad alloc\n"); return 0; Index: src/crypto/external/bsd/netpgp/dist/src/lib/writer.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.30 src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.31 --- src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.30 Sun Nov 7 08:40:00 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/writer.c Mon Nov 15 08:03:40 2010 @@ -58,7 +58,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: writer.c,v 1.30 2010/11/07 08:40:00 agc Exp $"); +__RCSID("$NetBSD: writer.c,v 1.31 2010/11/15 08:03:40 agc Exp $"); #endif #include <sys/types.h> @@ -1171,7 +1171,7 @@ /* now construct MDC packet and add to the end of the buffer */ pgp_setup_memory_write(&mdcoutput, &mdc, mdcsize); - pgp_calc_mdc_hash(preamble, preamblesize, data, len, &hashed[0]); + pgp_calc_mdc_hash(preamble, preamblesize, data, len, hashed); pgp_write_mdc(mdcoutput, hashed); if (pgp_get_debug_level(__FILE__)) { @@ -1351,15 +1351,18 @@ { /* XXX: push a SHA-1 checksum writer (and change s2k to 254). */ skey_checksum_t *sum; + unsigned hashsize; if ((sum = calloc(1, sizeof(*sum))) == NULL) { (void) fprintf(stderr, "pgp_push_checksum_writer: bad alloc\n"); } else { /* configure the arg */ - sum->hash_alg = seckey->hash_alg; + /* Hardcoded SHA1 for just now */ + sum->hash_alg = PGP_HASH_SHA1; + hashsize = pgp_hash_size(sum->hash_alg); if ((sum->hashed = seckey->checkhash) == NULL) { - sum->hashed = seckey->checkhash = calloc(1, PGP_CHECKHASH_SIZE); + sum->hashed = seckey->checkhash = calloc(1, hashsize); } /* init the hash */ pgp_hash_any(&sum->hash, sum->hash_alg);