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) {

Reply via email to