Module Name: src Committed By: agc Date: Fri Aug 13 18:29:41 UTC 2010
Modified Files: src/crypto/external/bsd/netpgp/dist/src/lib: config.h.in create.c crypto.c keyring.c keyring.h misc.c netpgp.c openssl_crypto.c packet-parse.c packet-print.c packet.h reader.c ssh2pgp.c version.h src/crypto/external/bsd/netpgp/dist/src/netpgp: netpgp.1 netpgp.c src/crypto/external/bsd/netpgp/dist/src/netpgpkeys: netpgpkeys.1 netpgpkeys.c Log Message: Changes to 3.99.9/20100809 + add single character options to netpgp(1) and netpgpkeys(1) + add -o long-option(=value)? options to netpgp(1) and netpgpkeys(1) + add some small preparations for using the first subkey for encryption (much more to follow) To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/crypto/external/bsd/netpgp/dist/src/lib/config.h.in cvs rdiff -u -r1.31 -r1.32 \ src/crypto/external/bsd/netpgp/dist/src/lib/create.c cvs rdiff -u -r1.25 -r1.26 \ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c \ src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c \ src/crypto/external/bsd/netpgp/dist/src/lib/packet.h cvs rdiff -u -r1.40 -r1.41 \ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c cvs rdiff -u -r1.29 -r1.30 \ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h cvs rdiff -u -r1.33 -r1.34 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c cvs rdiff -u -r1.66 -r1.67 \ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c cvs rdiff -u -r1.38 -r1.39 \ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c \ src/crypto/external/bsd/netpgp/dist/src/lib/reader.c \ src/crypto/external/bsd/netpgp/dist/src/lib/version.h cvs rdiff -u -r1.35 -r1.36 \ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c cvs rdiff -u -r1.14 -r1.15 \ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c cvs rdiff -u -r1.13 -r1.14 \ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1 cvs rdiff -u -r1.12 -r1.13 \ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c cvs rdiff -u -r1.13 -r1.14 \ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1 cvs rdiff -u -r1.15 -r1.16 \ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.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/config.h.in diff -u src/crypto/external/bsd/netpgp/dist/src/lib/config.h.in:1.9 src/crypto/external/bsd/netpgp/dist/src/lib/config.h.in:1.10 --- src/crypto/external/bsd/netpgp/dist/src/lib/config.h.in:1.9 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/config.h.in Fri Aug 13 18:29:40 2010 @@ -114,10 +114,6 @@ /* Define to 1 if you have the <zlib.h> header file. */ #undef HAVE_ZLIB_H -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - /* Name of package */ #undef PACKAGE Index: src/crypto/external/bsd/netpgp/dist/src/lib/create.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.31 src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.32 --- src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.31 Fri Jul 9 05:35:34 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/create.c Fri Aug 13 18:29:40 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.31 2010/07/09 05:35:34 agc Exp $"); +__RCSID("$NetBSD: create.c,v 1.32 2010/08/13 18:29:40 agc Exp $"); #endif #include <sys/types.h> @@ -961,11 +961,18 @@ const __ops_pubkey_t *pubkey; __ops_pk_sesskey_t *sesskey; + const uint8_t *id; uint8_t unencoded_m_buf[SZ_UNENCODED_M_BUF]; uint8_t *encoded_m_buf; size_t sz_encoded_m_buf; - pubkey = __ops_get_pubkey(key); + if (memcmp(key->encid, "\0\0\0\0\0\0\0\0", 8) == 0) { + pubkey = __ops_get_pubkey(key); + id = key->sigid; + } else { + pubkey = &key->enckey; + id = key->encid; + } sz_encoded_m_buf = BN_num_bytes(pubkey->key.rsa.n); if ((encoded_m_buf = calloc(1, sz_encoded_m_buf)) == NULL) { (void) fprintf(stderr, @@ -986,13 +993,12 @@ return NULL; } sesskey->version = OPS_PKSK_V3; - (void) memcpy(sesskey->key_id, key->key_id, - sizeof(sesskey->key_id)); + (void) memcpy(sesskey->key_id, id, sizeof(sesskey->key_id)); if (__ops_get_debug_level(__FILE__)) { - hexdump(stderr, "Encrypting for RSA keyid", key->key_id, sizeof(sesskey->key_id)); + hexdump(stderr, "Encrypting for RSA keyid", id, sizeof(sesskey->key_id)); } - switch (key->key.pubkey.alg) { + switch (pubkey->alg) { case OPS_PKA_RSA: case OPS_PKA_DSA: case OPS_PKA_ELGAMAL: @@ -1004,7 +1010,7 @@ free(sesskey); return NULL; } - sesskey->alg = key->key.pubkey.alg; + sesskey->alg = pubkey->alg; /* \todo allow user to specify other algorithm */ sesskey->symm_alg = OPS_SA_CAST5; Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.25 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.26 --- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.25 Fri Jul 9 05:35:34 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c Fri Aug 13 18:29:40 2010 @@ -54,7 +54,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: crypto.c,v 1.25 2010/07/09 05:35:34 agc Exp $"); +__RCSID("$NetBSD: crypto.c,v 1.26 2010/08/13 18:29:40 agc Exp $"); #endif #include <sys/types.h> @@ -264,7 +264,7 @@ __ops_encrypt_file(__ops_io_t *io, const char *infile, const char *outfile, - const __ops_key_t *pubkey, + const __ops_key_t *key, const unsigned use_armour, const unsigned allow_overwrite) { @@ -289,7 +289,7 @@ } /* Push the encrypted writer */ - if (!__ops_push_enc_se_ip(output, pubkey)) { + if (!__ops_push_enc_se_ip(output, key)) { __ops_memory_free(inmem); return 0; } Index: src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.25 src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.26 --- src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.25 Fri Jul 9 05:35:34 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c Fri Aug 13 18:29:40 2010 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: openssl_crypto.c,v 1.25 2010/07/09 05:35:34 agc Exp $"); +__RCSID("$NetBSD: openssl_crypto.c,v 1.26 2010/08/13 18:29:40 agc Exp $"); #endif #ifdef HAVE_OPENSSL_DSA_H @@ -821,8 +821,8 @@ RSA_free(rsa); - __ops_keyid(keydata->key_id, OPS_KEY_ID_SIZE, &keydata->key.seckey.pubkey, seckey->hash_alg); - __ops_fingerprint(&keydata->fingerprint, &keydata->key.seckey.pubkey, seckey->hash_alg); + __ops_keyid(keydata->sigid, OPS_KEY_ID_SIZE, &keydata->key.seckey.pubkey, seckey->hash_alg); + __ops_fingerprint(&keydata->sigfingerprint, &keydata->key.seckey.pubkey, seckey->hash_alg); /* Generate checksum */ Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet.h diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.25 src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.26 --- src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.25 Fri Jul 9 15:12:06 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/packet.h Fri Aug 13 18:29:40 2010 @@ -949,13 +949,17 @@ DYNARRAY(__ops_subpacket_t, packet); /* array of raw subpackets */ DYNARRAY(__ops_subsig_t, subsig); /* array of signature subkeys */ DYNARRAY(__ops_revoke_t, revoke); /* array of signature revocations */ - uint8_t key_id[OPS_KEY_ID_SIZE]; - __ops_fingerprint_t fingerprint; /* pgp fingerprint */ __ops_content_enum type; /* type of key */ __ops_keydata_key_t key; /* pubkey/seckey data */ + __ops_pubkey_t sigkey; /* signature key */ + uint8_t sigid[OPS_KEY_ID_SIZE]; + __ops_fingerprint_t sigfingerprint; /* pgp signature fingerprint */ + __ops_pubkey_t enckey; /* encryption key */ + uint8_t encid[OPS_KEY_ID_SIZE]; + __ops_fingerprint_t encfingerprint; /* pgp encryption id fingerprint */ uint32_t uid0; /* primary uid index in uids array */ - uint8_t revoked; - __ops_revoke_t revocation; + uint8_t revoked; /* key has been revoked */ + __ops_revoke_t revocation; /* revocation reason */ }; #define MDC_PKT_TAG 0xd3 Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.40 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.41 --- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.40 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c Fri Aug 13 18:29:40 2010 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: keyring.c,v 1.40 2010/08/07 04:16:40 agc Exp $"); +__RCSID("$NetBSD: keyring.c,v 1.41 2010/08/13 18:29:40 agc Exp $"); #endif #ifdef HAVE_FCNTL_H @@ -338,7 +338,7 @@ const uint8_t * __ops_get_key_id(const __ops_key_t *key) { - return key->key_id; + return key->sigid; } /** @@ -509,7 +509,7 @@ sig = __ops_create_sig_new(); __ops_sig_start_key_sig(sig, &key->key.seckey.pubkey, userid, OPS_CERT_POSITIVE); __ops_add_birthtime(sig, time(NULL)); - __ops_add_issuer_keyid(sig, key->key_id); + __ops_add_issuer_keyid(sig, key->sigid); __ops_add_primary_userid(sig, 1); __ops_end_hashed_subpkts(sig); @@ -823,15 +823,16 @@ { for ( ; keyring && *from < keyring->keyc; *from += 1) { if (__ops_get_debug_level(__FILE__)) { - hexdump(io->errs, "keyring keyid", keyring->keys[*from].key_id, OPS_KEY_ID_SIZE); + hexdump(io->errs, "keyring keyid", keyring->keys[*from].sigid, OPS_KEY_ID_SIZE); hexdump(io->errs, "keyid", keyid, OPS_KEY_ID_SIZE); } - if (memcmp(keyring->keys[*from].key_id, keyid, - OPS_KEY_ID_SIZE) == 0) { + if (memcmp(keyring->keys[*from].sigid, keyid, OPS_KEY_ID_SIZE) == 0 || + memcmp(&keyring->keys[*from].sigid[OPS_KEY_ID_SIZE / 2], + keyid, OPS_KEY_ID_SIZE / 2) == 0) { return &keyring->keys[*from]; } - if (memcmp(&keyring->keys[*from].key_id[OPS_KEY_ID_SIZE / 2], - keyid, OPS_KEY_ID_SIZE / 2) == 0) { + if (memcmp(&keyring->keys[*from].encid, keyid, OPS_KEY_ID_SIZE) == 0 || + memcmp(&keyring->keys[*from].encid[OPS_KEY_ID_SIZE / 2], keyid, OPS_KEY_ID_SIZE / 2) == 0) { return &keyring->keys[*from]; } } @@ -1017,7 +1018,7 @@ "sec", &key->key.seckey.pubkey, psigs); } else { __ops_sprint_mj(io, keyring, key, &obj->value.v[obj->c], - "pub", &key->key.pubkey, psigs); + "signature ", &key->key.pubkey, psigs); } if (obj->value.v[obj->c].type != 0) { obj->c += 1; @@ -1057,24 +1058,37 @@ /* add a key to a public keyring */ int -__ops_add_to_pubring(__ops_keyring_t *keyring, const __ops_pubkey_t *pubkey) +__ops_add_to_pubring(__ops_keyring_t *keyring, const __ops_pubkey_t *pubkey, __ops_content_enum tag) { __ops_key_t *key; time_t duration; if (__ops_get_debug_level(__FILE__)) { - fprintf(stderr, "__ops_add_to_pubring\n"); + fprintf(stderr, "__ops_add_to_pubring (type %u)\n", tag); + } + switch(tag) { + case OPS_PTAG_CT_PUBLIC_KEY: + EXPAND_ARRAY(keyring, key); + key = &keyring->keys[keyring->keyc++]; + duration = key->key.pubkey.duration; + (void) memset(key, 0x0, sizeof(*key)); + key->type = tag; + __ops_keyid(key->sigid, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype); + __ops_fingerprint(&key->sigfingerprint, pubkey, keyring->hashtype); + key->key.pubkey = *pubkey; + key->key.pubkey.duration = duration; + return 1; + case OPS_PTAG_CT_PUBLIC_SUBKEY: + /* subkey is not the first */ + key = &keyring->keys[keyring->keyc - 1]; + __ops_keyid(key->encid, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype); + duration = key->key.pubkey.duration; + (void) memcpy(&key->enckey, pubkey, sizeof(key->enckey)); + key->enckey.duration = duration; + return 1; + default: + return 0; } - EXPAND_ARRAY(keyring, key); - key = &keyring->keys[keyring->keyc++]; - duration = key->key.pubkey.duration; - (void) memset(key, 0x0, sizeof(*key)); - __ops_keyid(key->key_id, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype); - __ops_fingerprint(&key->fingerprint, pubkey, keyring->hashtype); - key->type = OPS_PTAG_CT_PUBLIC_KEY; - key->key.pubkey = *pubkey; - key->key.pubkey.duration = duration; - return 1; } /* add a key to a secret keyring */ @@ -1099,8 +1113,8 @@ key = &keyring->keys[keyring->keyc++]; (void) memset(key, 0x0, sizeof(*key)); pubkey = &seckey->pubkey; - __ops_keyid(key->key_id, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype); - __ops_fingerprint(&key->fingerprint, pubkey, keyring->hashtype); + __ops_keyid(key->sigid, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype); + __ops_fingerprint(&key->sigfingerprint, pubkey, keyring->hashtype); key->type = OPS_PTAG_CT_SECRET_KEY; key->key.seckey = *seckey; if (__ops_get_debug_level(__FILE__)) { Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.29 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.30 --- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.29 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h Fri Aug 13 18:29:40 2010 @@ -143,7 +143,7 @@ char *__ops_export_key(__ops_io_t *, const __ops_key_t *, uint8_t *); -int __ops_add_to_pubring(__ops_keyring_t *, const __ops_pubkey_t *); +int __ops_add_to_pubring(__ops_keyring_t *, const __ops_pubkey_t *, __ops_content_enum tag); int __ops_add_to_secring(__ops_keyring_t *, const __ops_seckey_t *); int __ops_append_keyring(__ops_keyring_t *, __ops_keyring_t *); Index: src/crypto/external/bsd/netpgp/dist/src/lib/misc.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.33 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.34 --- src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.33 Fri Jul 9 05:35:34 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/misc.c Fri Aug 13 18:29:40 2010 @@ -57,7 +57,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: misc.c,v 1.33 2010/07/09 05:35:34 agc Exp $"); +__RCSID("$NetBSD: misc.c,v 1.34 2010/08/13 18:29:40 agc Exp $"); #endif #include <sys/types.h> @@ -118,7 +118,8 @@ keyring = accumulate->keyring; switch (pkt->tag) { case OPS_PTAG_CT_PUBLIC_KEY: - __ops_add_to_pubring(keyring, &content->pubkey); + case OPS_PTAG_CT_PUBLIC_SUBKEY: + __ops_add_to_pubring(keyring, &content->pubkey, pkt->tag); return OPS_KEEP_MEMORY; case OPS_PTAG_CT_SECRET_KEY: case OPS_PTAG_CT_ENCRYPTED_SECRET_KEY: Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.66 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.67 --- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.66 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c Fri Aug 13 18:29:40 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.66 2010/08/07 04:16:40 agc Exp $"); +__RCSID("$NetBSD: netpgp.c,v 1.67 2010/08/13 18:29:40 agc Exp $"); #endif #include <sys/types.h> @@ -319,7 +319,7 @@ int n; (void) memset(id, 0x0, len); - src = pubring->keys[(last) ? pubring->keyc - 1 : 0].key_id; + src = pubring->keys[(last) ? pubring->keyc - 1 : 0].sigid; for (i = 0, n = 0 ; i < OPS_KEY_ID_SIZE ; i += 2) { n += snprintf(&id[n], len - n, "%02x%02x", src[i], src[i + 1]); } @@ -739,7 +739,7 @@ id_array.c, 10, 10, "netpgp_match_keys_json", return 0); __ops_sprint_mj(netpgp->io, netpgp->pubring, key, &id_array.value.v[id_array.c++], - "pub", + "signature ", &key->key.pubkey, psigs); } k += 1; @@ -930,7 +930,7 @@ char *out, int armored) { - const __ops_key_t *keypair; + const __ops_key_t *key; const unsigned overwrite = 1; const char *suffix; __ops_io_t *io; @@ -944,14 +944,14 @@ } suffix = (armored) ? ".asc" : ".gpg"; /* get key with which to sign */ - if ((keypair = resolve_userid(netpgp, netpgp->pubring, userid)) == NULL) { + if ((key = resolve_userid(netpgp, netpgp->pubring, userid)) == NULL) { return 0; } if (out == NULL) { (void) snprintf(outname, sizeof(outname), "%s%s", f, suffix); out = outname; } - return (int)__ops_encrypt_file(io, f, out, keypair, (unsigned)armored, + return (int)__ops_encrypt_file(io, f, out, key, (unsigned)armored, overwrite); } @@ -1015,10 +1015,11 @@ if (pubkey == NULL) { (void) fprintf(io->errs, "netpgp: warning - using pubkey from secring\n"); - __ops_print_keydata(io, netpgp->pubring, keypair, "pub", + __ops_print_keydata(io, netpgp->pubring, keypair, "signature ", &keypair->key.seckey.pubkey, 0); } else { - __ops_print_keydata(io, netpgp->pubring, pubkey, "pub", &pubkey->key.pubkey, 0); + __ops_print_keydata(io, netpgp->pubring, pubkey, "signature ", + &pubkey->key.pubkey, 0); } } if (netpgp_getvar(netpgp, "ssh keys") == NULL) { 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.38 src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.39 --- src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.38 Fri Jul 9 05:35:34 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c Fri Aug 13 18:29: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.38 2010/07/09 05:35:34 agc Exp $"); +__RCSID("$NetBSD: packet-parse.c,v 1.39 2010/08/13 18:29:40 agc Exp $"); #endif #ifdef HAVE_OPENSSL_CAST_H @@ -1237,8 +1237,10 @@ { __ops_packet_t pkt; - if (!parse_pubkey_data(&pkt.u.pubkey, region, stream)) + if (!parse_pubkey_data(&pkt.u.pubkey, region, stream)) { + (void) fprintf(stderr, "parse_pubkey: parse_pubkey_data failed\n"); return 0; + } /* XXX: this test should be done for all packets, surely? */ if (region->readc != region->length) { Index: src/crypto/external/bsd/netpgp/dist/src/lib/reader.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.38 src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.39 --- src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.38 Fri Jul 9 05:35:35 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/reader.c Fri Aug 13 18:29:41 2010 @@ -54,7 +54,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: reader.c,v 1.38 2010/07/09 05:35:35 agc Exp $"); +__RCSID("$NetBSD: reader.c,v 1.39 2010/08/13 18:29:41 agc Exp $"); #endif #include <sys/types.h> @@ -2204,7 +2204,8 @@ } do { /* print out the user id */ - __ops_print_keydata(io, cbinfo->cryptinfo.pubring, pubkey, "pub", &pubkey->key.pubkey, 0); + __ops_print_keydata(io, cbinfo->cryptinfo.pubring, pubkey, + "signature ", &pubkey->key.pubkey, 0); /* now decrypt key */ secret = __ops_decrypt_seckey(keypair, cbinfo->passfp); if (secret == NULL) { @@ -2240,7 +2241,8 @@ if (cbinfo->cryptinfo.keydata == NULL) { (void) fprintf(io->errs, "get_passphrase_cb: NULL keydata\n"); } else { - __ops_print_keydata(io, cbinfo->cryptinfo.pubring, cbinfo->cryptinfo.keydata, "pub", +printf("get_passphrase_cb\n"); + __ops_print_keydata(io, cbinfo->cryptinfo.pubring, cbinfo->cryptinfo.keydata, "signature ", &cbinfo->cryptinfo.keydata->key.pubkey, 0); } switch (pkt->tag) { Index: src/crypto/external/bsd/netpgp/dist/src/lib/version.h diff -u src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.38 src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.39 --- src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.38 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/version.h Fri Aug 13 18:29:41 2010 @@ -58,7 +58,7 @@ #endif /* development versions have .99 suffix */ -#define NETPGP_BASE_VERSION "3.99.8" +#define NETPGP_BASE_VERSION "3.99.9" #define NETPGP_VERSION_CAT(a, b) "NetPGP portable " a "/[" b "]" #define NETPGP_VERSION_STRING \ Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.35 src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.36 --- src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.35 Sat Aug 7 04:16:40 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c Fri Aug 13 18:29:40 2010 @@ -58,7 +58,7 @@ #if defined(__NetBSD__) __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved."); -__RCSID("$NetBSD: packet-print.c,v 1.35 2010/08/07 04:16:40 agc Exp $"); +__RCSID("$NetBSD: packet-print.c,v 1.36 2010/08/13 18:29:40 agc Exp $"); #endif #include <string.h> @@ -362,16 +362,16 @@ /* print the sub key binding signature info */ static int -psubkeybinding(char *buf, size_t size, __ops_subsig_t *subsig, const __ops_pubkey_t *pubkey, const char *expired) +psubkeybinding(char *buf, size_t size, const __ops_key_t *key, const char *expired) { char keyid[512]; char t[32]; - return snprintf(buf, size, "sub %d/%s %s %s %s\n", - numkeybits(pubkey), - __ops_show_pka(subsig->sig.info.key_alg), - strhexdump(keyid, subsig->sig.info.signer_id, OPS_KEY_ID_SIZE, ""), - ptimestr(t, sizeof(t), subsig->sig.info.birthtime), + return snprintf(buf, size, "encryption %d/%s %s %s %s\n", + numkeybits(&key->enckey), + __ops_show_pka(key->enckey.alg), + strhexdump(keyid, key->encid, OPS_KEY_ID_SIZE, ""), + ptimestr(t, sizeof(t), key->enckey.birthtime), expired); } @@ -452,7 +452,7 @@ trustkey = __ops_getkeybyid(io, keyring, key->subsigs[j].sig.info.signer_id, &from); if (key->subsigs[j].sig.info.version == 4 && key->subsigs[j].sig.info.type == OPS_SIG_SUBKEY) { - psubkeybinding(&uidbuf[n], sizeof(uidbuf) - n, &key->subsigs[j], pubkey, expired); + psubkeybinding(&uidbuf[n], sizeof(uidbuf) - n, key, expired); } else { n += snprintf(&uidbuf[n], sizeof(uidbuf) - n, "sig %s %s %s\n", @@ -466,10 +466,10 @@ header, numkeybits(pubkey), __ops_show_pka(pubkey->alg), - strhexdump(keyid, key->key_id, OPS_KEY_ID_SIZE, ""), + strhexdump(keyid, key->sigid, OPS_KEY_ID_SIZE, ""), ptimestr(t, sizeof(t), pubkey->birthtime), expired, - strhexdump(fp, key->fingerprint.fingerprint, key->fingerprint.length, " "), + strhexdump(fp, key->sigfingerprint.fingerprint, key->sigfingerprint.length, " "), uidbuf); } @@ -496,9 +496,9 @@ mj_append_field(keyjson, "header", "string", header); mj_append_field(keyjson, "key bits", "integer", (int64_t) numkeybits(pubkey)); mj_append_field(keyjson, "pka", "string", __ops_show_pka(pubkey->alg)); - mj_append_field(keyjson, "key id", "string", strhexdump(keyid, key->key_id, OPS_KEY_ID_SIZE, "")); + mj_append_field(keyjson, "key id", "string", strhexdump(keyid, key->sigid, OPS_KEY_ID_SIZE, "")); mj_append_field(keyjson, "fingerprint", "string", - strhexdump(fp, key->fingerprint.fingerprint, key->fingerprint.length, " ")); + strhexdump(fp, key->sigfingerprint.fingerprint, key->sigfingerprint.length, " ")); mj_append_field(keyjson, "birthtime", "integer", pubkey->birthtime); mj_append_field(keyjson, "duration", "integer", pubkey->duration); for (i = 0; i < key->uidc; i++) { @@ -528,13 +528,13 @@ mj_create(&sub_obj, "array"); if (key->subsigs[j].sig.info.version == 4 && key->subsigs[j].sig.info.type == OPS_SIG_SUBKEY) { - mj_append(&sub_obj, "integer", (int64_t)numkeybits(pubkey)); + mj_append(&sub_obj, "integer", (int64_t)numkeybits(&key->enckey)); mj_append(&sub_obj, "string", - (const char *)__ops_show_pka(key->subsigs[j].sig.info.key_alg)); + (const char *)__ops_show_pka(key->enckey.alg)); mj_append(&sub_obj, "string", - strhexdump(keyid, key->subsigs[j].sig.info.signer_id, OPS_KEY_ID_SIZE, "")); - mj_append(&sub_obj, "integer", (int64_t)key->subsigs[j].sig.info.birthtime); - mj_append_field(keyjson, "sub", "array", &sub_obj); + strhexdump(keyid, key->encid, OPS_KEY_ID_SIZE, "")); + mj_append(&sub_obj, "integer", (int64_t)key->enckey.birthtime); + mj_append_field(keyjson, "encryption", "array", &sub_obj); mj_delete(&sub_obj); } else { mj_append(&sub_obj, "string", @@ -615,7 +615,7 @@ } } return __ops_asprintf(buf, "pub:%s:%d:%d:%lld:%lld\n%s", - strhexdump(fp, key->fingerprint.fingerprint, OPS_FINGERPRINT_SIZE, ""), + strhexdump(fp, key->sigfingerprint.fingerprint, OPS_FINGERPRINT_SIZE, ""), pubkey->alg, numkeybits(pubkey), (long long)pubkey->birthtime, @@ -689,7 +689,7 @@ int cc; cc = snprintf(out, outsize, "key:%s:%d:%lld:%lld:%d:\n", - strhexdump(fp, key->fingerprint.fingerprint, OPS_FINGERPRINT_SIZE, ""), + strhexdump(fp, key->sigfingerprint.fingerprint, OPS_FINGERPRINT_SIZE, ""), key->key.pubkey.version, (long long)key->key.pubkey.birthtime, (long long)key->key.pubkey.days_valid, Index: src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c diff -u src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.14 src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.15 --- src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.14 Fri Jul 9 05:35:35 2010 +++ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c Fri Aug 13 18:29:41 2010 @@ -317,9 +317,9 @@ hostname, f, owner); - __ops_keyid(key->key_id, sizeof(key->key_id), pubkey, hashtype); + __ops_keyid(key->sigid, sizeof(key->sigid), pubkey, hashtype); __ops_add_userid(key, userid); - __ops_fingerprint(&key->fingerprint, pubkey, hashtype); + __ops_fingerprint(&key->sigfingerprint, pubkey, hashtype); free(userid); if (__ops_get_debug_level(__FILE__)) { /*__ops_print_keydata(io, keyring, key, "pub", pubkey, 0);*/ @@ -415,8 +415,8 @@ crypted.set_crypt_key(&crypted, sesskey); __ops_encrypt_init(&crypted); key->key.seckey.pubkey.alg = OPS_PKA_RSA; - __ops_fingerprint(&key->fingerprint, pubkey, hashtype); - __ops_keyid(key->key_id, sizeof(key->key_id), pubkey, hashtype); + __ops_fingerprint(&key->sigfingerprint, pubkey, hashtype); + __ops_keyid(key->sigid, sizeof(key->sigid), pubkey, hashtype); return 1; } Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1 diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.13 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.14 --- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.13 Fri May 14 17:27:35 2010 +++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1 Fri Aug 13 18:29:41 2010 @@ -1,4 +1,4 @@ -.\" $NetBSD: netpgp.1,v 1.13 2010/05/14 17:27:35 joerg Exp $ +.\" $NetBSD: netpgp.1,v 1.14 2010/08/13 18:29:41 agc Exp $ .\" .\" Copyright (c) 2009 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -27,7 +27,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd March 4, 2010 +.Dd August 9, 2010 .Dt NETPGP 1 .Os .Sh NAME @@ -78,8 +78,12 @@ .Ar file ... .Nm .Fl Fl version +.Nm +.Op Fl Vdesv +.Op Fl olong-option Ns = Ns value +.Ar file ... .Pp -where the options for all commands are: +where the long options for all commands are: .Pp .Op Fl Fl coredumps .br Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.12 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.13 --- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.12 Thu Jul 1 04:27:21 2010 +++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c Fri Aug 13 18:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: netpgp.c,v 1.12 2010/07/01 04:27:21 agc Exp $ */ +/* $NetBSD: netpgp.c,v 1.13 2010/08/13 18:29:41 agc Exp $ */ /*- * Copyright (c) 2009 The NetBSD Foundation, Inc. @@ -35,6 +35,7 @@ #include <sys/stat.h> #include <getopt.h> +#include <regex.h> #include <netpgp.h> #include <stdio.h> #include <stdlib.h> @@ -69,7 +70,7 @@ enum optdefs { /* commands */ - ENCRYPT, + ENCRYPT = 260, DECRYPT, SIGN, CLEARSIGN, @@ -333,6 +334,162 @@ } } +/* set an option */ +static int +setoption(netpgp_t *netpgp, prog_t *p, int val, char *arg, int *homeset) +{ + switch (val) { + case COREDUMPS: + netpgp_setvar(netpgp, "coredumps", "allowed"); + break; + case ENCRYPT: + case SIGN: + case CLEARSIGN: + /* for encryption and signing, we need a userid */ + netpgp_setvar(netpgp, "need userid", "1"); + p->cmd = val; + break; + case DECRYPT: + case VERIFY: + case VERIFY_CAT: + case LIST_PACKETS: + case SHOW_KEYS: + case HELP_CMD: + p->cmd = val; + break; + case VERSION_CMD: + printf( +"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", + netpgp_get_info("version"), + netpgp_get_info("maintainer")); + exit(EXIT_SUCCESS); + /* options */ + case SSHKEYS: + netpgp_setvar(netpgp, "ssh keys", "1"); + break; + case KEYRING: + if (arg == NULL) { + (void) fprintf(stderr, + "No keyring argument provided\n"); + exit(EXIT_ERROR); + } + snprintf(p->keyring, sizeof(p->keyring), "%s", arg); + break; + case USERID: + if (arg == NULL) { + (void) fprintf(stderr, + "No userid argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "userid", arg); + break; + case ARMOUR: + p->armour = 1; + break; + case DETACHED: + p->detached = 1; + break; + case VERBOSE: + netpgp_incvar(netpgp, "verbose", 1); + break; + case HOMEDIR: + if (arg == NULL) { + (void) fprintf(stderr, + "No home directory argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_set_homedir(netpgp, arg, NULL, 0); + *homeset = 1; + break; + case HASH_ALG: + if (arg == NULL) { + (void) fprintf(stderr, + "No hash algorithm argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "hash", arg); + break; + case PASSWDFD: + if (arg == NULL) { + (void) fprintf(stderr, + "No pass-fd argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "pass-fd", arg); + break; + case OUTPUT: + if (arg == NULL) { + (void) fprintf(stderr, + "No output filename argument provided\n"); + exit(EXIT_ERROR); + } + if (p->output) { + (void) free(p->output); + } + p->output = strdup(arg); + break; + case RESULTS: + if (arg == NULL) { + (void) fprintf(stderr, + "No output filename argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "results", arg); + break; + case SSHKEYFILE: + netpgp_setvar(netpgp, "sshkeyfile", arg); + break; + case MAX_MEM_ALLOC: + netpgp_setvar(netpgp, "max mem alloc", arg); + break; + case DURATION: + netpgp_setvar(netpgp, "duration", arg); + break; + case BIRTHTIME: + netpgp_setvar(netpgp, "birthtime", arg); + break; + case OPS_DEBUG: + netpgp_set_debug(arg); + break; + default: + p->cmd = HELP_CMD; + break; + } + return 1; +} + +/* we have -o option=value -- parse, and process */ +static int +parse_option(netpgp_t *netpgp, prog_t *p, const char *s, int *homeset) +{ + static regex_t opt; + struct option *op; + static int compiled; + regmatch_t matches[10]; + char option[128]; + char value[128]; + + if (!compiled) { + compiled = 1; + (void) regcomp(&opt, "([^=]{1,128})(=(.*))?", REG_EXTENDED); + } + if (regexec(&opt, s, 10, matches, 0) == 0) { + (void) snprintf(option, sizeof(option), "%.*s", + (int)(matches[1].rm_eo - matches[1].rm_so), &s[matches[1].rm_so]); + if (matches[2].rm_so > 0) { + (void) snprintf(value, sizeof(value), "%.*s", + (int)(matches[3].rm_eo - matches[3].rm_so), &s[matches[3].rm_so]); + } else { + value[0] = 0x0; + } + for (op = options ; op->name ; op++) { + if (strcmp(op->name, option) == 0) { + return setoption(netpgp, p, op->val, value, homeset); + } + } + } + return 0; +} int main(int argc, char **argv) @@ -360,124 +517,45 @@ netpgp_setvar(&netpgp, "max mem alloc", "4194304"); homeset = 0; optindex = 0; - while ((ch = getopt_long(argc, argv, "", options, &optindex)) != -1) { - switch (options[optindex].val) { - case COREDUMPS: - netpgp_setvar(&netpgp, "coredumps", "allowed"); - p.cmd = options[optindex].val; - break; - case ENCRYPT: - case SIGN: - case CLEARSIGN: - /* for encryption and signing, we need a userid */ - netpgp_setvar(&netpgp, "need userid", "1"); - p.cmd = options[optindex].val; - break; - case DECRYPT: - case VERIFY: - case VERIFY_CAT: - case LIST_PACKETS: - case SHOW_KEYS: - case HELP_CMD: - p.cmd = options[optindex].val; - break; - case VERSION_CMD: - printf( -"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", - netpgp_get_info("version"), - netpgp_get_info("maintainer")); - exit(EXIT_SUCCESS); - /* options */ - case SSHKEYS: - netpgp_setvar(&netpgp, "ssh keys", "1"); - break; - case KEYRING: - if (optarg == NULL) { - (void) fprintf(stderr, - "No keyring argument provided\n"); - exit(EXIT_ERROR); - } - snprintf(p.keyring, sizeof(p.keyring), "%s", optarg); - break; - case USERID: - if (optarg == NULL) { - (void) fprintf(stderr, - "No userid argument provided\n"); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "userid", optarg); - break; - case ARMOUR: - p.armour = 1; - break; - case DETACHED: - p.detached = 1; - break; - case VERBOSE: - netpgp_incvar(&netpgp, "verbose", 1); - break; - case HOMEDIR: - if (optarg == NULL) { - (void) fprintf(stderr, - "No home directory argument provided\n"); - exit(EXIT_ERROR); - } - netpgp_set_homedir(&netpgp, optarg, NULL, 0); - homeset = 1; - break; - case HASH_ALG: - if (optarg == NULL) { - (void) fprintf(stderr, - "No hash algorithm argument provided\n"); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "hash", optarg); - break; - case PASSWDFD: - if (optarg == NULL) { - (void) fprintf(stderr, - "No pass-fd argument provided\n"); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "pass-fd", optarg); - break; - case OUTPUT: - if (optarg == NULL) { - (void) fprintf(stderr, - "No output filename argument provided\n"); - exit(EXIT_ERROR); - } - if (p.output) { - (void) free(p.output); + while ((ch = getopt_long(argc, argv, "Vdeo:sv", options, &optindex)) != -1) { + if (ch >= ENCRYPT) { + /* getopt_long returns 0 for long options */ + if (!setoption(&netpgp, &p, options[optindex].val, optarg, &homeset)) { + (void) fprintf(stderr, "Bad option\n"); } - p.output = strdup(optarg); - break; - case RESULTS: - if (optarg == NULL) { - (void) fprintf(stderr, - "No output filename argument provided\n"); - exit(EXIT_ERROR); + } else { + switch (ch) { + case 'V': + printf( + "%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", + netpgp_get_info("version"), + netpgp_get_info("maintainer")); + exit(EXIT_SUCCESS); + case 'd': + p.cmd = DECRYPT; + break; + case 'e': + /* for encryption and signing, we need a userid */ + netpgp_setvar(&netpgp, "need userid", "1"); + p.cmd = ENCRYPT; + break; + case 'o': + if (!parse_option(&netpgp, &p, optarg, &homeset)) { + (void) fprintf(stderr, "Bad option\n"); + } + break; + case 's': + /* for encryption and signing, we need a userid */ + netpgp_setvar(&netpgp, "need userid", "1"); + p.cmd = SIGN; + break; + case 'v': + p.cmd = VERIFY; + break; + default: + p.cmd = HELP_CMD; + break; } - netpgp_setvar(&netpgp, "results", optarg); - break; - case SSHKEYFILE: - netpgp_setvar(&netpgp, "sshkeyfile", optarg); - break; - case MAX_MEM_ALLOC: - netpgp_setvar(&netpgp, "max mem alloc", optarg); - break; - case DURATION: - netpgp_setvar(&netpgp, "duration", optarg); - break; - case BIRTHTIME: - netpgp_setvar(&netpgp, "birthtime", optarg); - break; - case OPS_DEBUG: - netpgp_set_debug(optarg); - break; - default: - p.cmd = HELP_CMD; - break; } } if (!homeset) { Index: src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1 diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.13 src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.14 --- src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.13 Fri Jun 25 07:40:35 2010 +++ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1 Fri Aug 13 18:29:41 2010 @@ -1,4 +1,4 @@ -.\" $NetBSD: netpgpkeys.1,v 1.13 2010/06/25 07:40:35 wiz Exp $ +.\" $NetBSD: netpgpkeys.1,v 1.14 2010/08/13 18:29:41 agc Exp $ .\" .\" Copyright (c) 2009, 2010 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -27,7 +27,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd June 25, 2010 +.Dd August 9, 2010 .Dt NETPGPKEYS 1 .Os .Sh NAME @@ -60,8 +60,12 @@ .Ar file ... .Nm .Fl Fl version +.Nm +.Op Fl Vgls +.Op Fl olong-option Ns = Ns value +.Ar file ... .Pp -where the options for all commands are: +where the long options for all commands are: .Pp .Op Fl Fl coredumps .br Index: src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.15 src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.16 --- src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.15 Sat Aug 7 04:16:41 2010 +++ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c Fri Aug 13 18:29:41 2010 @@ -33,6 +33,7 @@ #include <sys/stat.h> #include <getopt.h> +#include <regex.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -70,7 +71,7 @@ enum optdefs { /* commands */ - LIST_KEYS = 1, + LIST_KEYS = 260, LIST_SIGS, FIND_KEY, EXPORT_KEY, @@ -276,9 +277,9 @@ pobj(fp, &sub->value.v[0], (psigs) ? 4 : 14); /* human name */ pobj(fp, &sub->value.v[1], 1); /* any revocation */ p(fp, "\n", NULL); - } else if (strcmp(obj->value.v[i].value.s, "sub") == 0) { + } else if (strcmp(obj->value.v[i].value.s, "encryption") == 0) { sub = &obj->value.v[i + 1]; - p(fp, "sub", NULL); + p(fp, "encryption", NULL); pobj(fp, &sub->value.v[0], 1); /* size */ p(fp, "/", NULL); pobj(fp, &sub->value.v[1], 0); /* alg */ @@ -381,6 +382,142 @@ } } +/* set the option */ +static int +setoption(netpgp_t *netpgp, prog_t *p, int val, char *arg, int *homeset) +{ + switch (val) { + case COREDUMPS: + netpgp_setvar(netpgp, "coredumps", "allowed"); + break; + case GENERATE_KEY: + netpgp_setvar(netpgp, "userid checks", "skip"); + p->cmd = val; + break; + case LIST_KEYS: + case LIST_SIGS: + case FIND_KEY: + case EXPORT_KEY: + case IMPORT_KEY: + case GET_KEY: + case HELP_CMD: + p->cmd = val; + break; + case VERSION_CMD: + printf( +"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", + netpgp_get_info("version"), + netpgp_get_info("maintainer")); + exit(EXIT_SUCCESS); + /* options */ + case SSHKEYS: + netpgp_setvar(netpgp, "ssh keys", "1"); + break; + case KEYRING: + if (arg == NULL) { + (void) fprintf(stderr, + "No keyring argument provided\n"); + exit(EXIT_ERROR); + } + snprintf(p->keyring, sizeof(p->keyring), "%s", arg); + break; + case USERID: + if (optarg == NULL) { + (void) fprintf(stderr, + "no userid argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "userid", arg); + break; + case VERBOSE: + netpgp_incvar(netpgp, "verbose", 1); + break; + case HOMEDIR: + if (arg == NULL) { + (void) fprintf(stderr, + "no home directory argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_set_homedir(netpgp, arg, NULL, 0); + *homeset = 1; + break; + case NUMBITS: + if (arg == NULL) { + (void) fprintf(stderr, + "no number of bits argument provided\n"); + exit(EXIT_ERROR); + } + p->numbits = atoi(arg); + break; + case HASH_ALG: + if (arg == NULL) { + (void) fprintf(stderr, + "No hash algorithm argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "hash", arg); + break; + case PASSWDFD: + if (arg == NULL) { + (void) fprintf(stderr, + "no pass-fd argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "pass-fd", arg); + break; + case RESULTS: + if (arg == NULL) { + (void) fprintf(stderr, + "No output filename argument provided\n"); + exit(EXIT_ERROR); + } + netpgp_setvar(netpgp, "res", arg); + break; + case SSHKEYFILE: + netpgp_setvar(netpgp, "sshkeyfile", arg); + break; + case OPS_DEBUG: + netpgp_set_debug(arg); + break; + default: + p->cmd = HELP_CMD; + break; + } +} + +/* we have -o option=value -- parse, and process */ +static int +parse_option(netpgp_t *netpgp, prog_t *p, const char *s, int *homeset) +{ + static regex_t opt; + struct option *op; + static int compiled; + regmatch_t matches[10]; + char option[128]; + char value[128]; + + if (!compiled) { + compiled = 1; + (void) regcomp(&opt, "([^=]{1,128})(=(.*))?", REG_EXTENDED); + } + if (regexec(&opt, s, 10, matches, 0) == 0) { + (void) snprintf(option, sizeof(option), "%.*s", + (int)(matches[1].rm_eo - matches[1].rm_so), &s[matches[1].rm_so]); + if (matches[2].rm_so > 0) { + (void) snprintf(value, sizeof(value), "%.*s", + (int)(matches[3].rm_eo - matches[3].rm_so), &s[matches[3].rm_so]); + } else { + value[0] = 0x0; + } + for (op = options ; op->name ; op++) { + if (strcmp(op->name, option) == 0) { + return setoption(netpgp, p, op->val, value, homeset); + } + } + } + return 0; +} + int main(int argc, char **argv) { @@ -407,108 +544,38 @@ netpgp_setvar(&netpgp, "res", "<stdout>"); netpgp_setvar(&netpgp, "hash", DEFAULT_HASH_ALG); optindex = 0; - while ((ch = getopt_long(argc, argv, "", options, &optindex)) != -1) { - switch (options[optindex].val) { - case COREDUMPS: - netpgp_setvar(&netpgp, "coredumps", "allowed"); - p.cmd = options[optindex].val; - break; - case GENERATE_KEY: - netpgp_setvar(&netpgp, "userid checks", "skip"); - p.cmd = options[optindex].val; - break; - case LIST_KEYS: - case LIST_SIGS: - case FIND_KEY: - case EXPORT_KEY: - case IMPORT_KEY: - case GET_KEY: - case HELP_CMD: - p.cmd = options[optindex].val; - break; - case VERSION_CMD: - printf( -"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", - netpgp_get_info("version"), - netpgp_get_info("maintainer")); - exit(EXIT_SUCCESS); - /* options */ - case SSHKEYS: - netpgp_setvar(&netpgp, "ssh keys", "1"); - break; - case KEYRING: - if (optarg == NULL) { - (void) fprintf(stderr, - "%s: No keyring argument provided\n", - *argv); - exit(EXIT_ERROR); - } - snprintf(p.keyring, sizeof(p.keyring), "%s", optarg); - break; - case USERID: - if (optarg == NULL) { - (void) fprintf(stderr, - "%s: no userid argument provided\n", - *argv); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "userid", optarg); - break; - case VERBOSE: - netpgp_incvar(&netpgp, "verbose", 1); - break; - case HOMEDIR: - if (optarg == NULL) { - (void) fprintf(stderr, - "%s: no home directory argument provided\n", - *argv); - exit(EXIT_ERROR); - } - netpgp_set_homedir(&netpgp, optarg, NULL, 0); - homeset = 1; - break; - case NUMBITS: - if (optarg == NULL) { - (void) fprintf(stderr, - "%s: no number of bits argument provided\n", - *argv); - exit(EXIT_ERROR); + while ((ch = getopt_long(argc, argv, "Vglo:s", options, &optindex)) != -1) { + if (ch >= LIST_KEYS) { + /* getopt_long returns 0 for long options */ + if (!setoption(&netpgp, &p, options[optindex].val, optarg, &homeset)) { + (void) fprintf(stderr, "Bad option\n"); } - p.numbits = atoi(optarg); - break; - case HASH_ALG: - if (optarg == NULL) { - (void) fprintf(stderr, - "No hash algorithm argument provided\n"); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "hash", optarg); - break; - case PASSWDFD: - if (optarg == NULL) { - (void) fprintf(stderr, - "%s: no pass-fd argument provided\n", *argv); - exit(EXIT_ERROR); - } - netpgp_setvar(&netpgp, "pass-fd", optarg); - break; - case RESULTS: - if (optarg == NULL) { - (void) fprintf(stderr, - "No output filename argument provided\n"); - exit(EXIT_ERROR); + } else { + switch (ch) { + case 'V': + printf( + "%s\nAll bug reports, praise and chocolate, please, to:\n%s\n", + netpgp_get_info("version"), + netpgp_get_info("maintainer")); + exit(EXIT_SUCCESS); + case 'g': + p.cmd = GENERATE_KEY; + break; + case 'l': + p.cmd = LIST_KEYS; + break; + case 'o': + if (!parse_option(&netpgp, &p, optarg, &homeset)) { + (void) fprintf(stderr, "Bad option\n"); + } + break; + case 's': + p.cmd = LIST_SIGS; + break; + default: + p.cmd = HELP_CMD; + break; } - netpgp_setvar(&netpgp, "res", optarg); - break; - case SSHKEYFILE: - netpgp_setvar(&netpgp, "sshkeyfile", optarg); - break; - case OPS_DEBUG: - netpgp_set_debug(optarg); - break; - default: - p.cmd = HELP_CMD; - break; } } if (!homeset) {