Module Name:    src
Committed By:   agc
Date:           Fri Jun 25 03:37:28 UTC 2010

Modified Files:
        src/crypto/external/bsd/netpgp/dist: TODO tst
        src/crypto/external/bsd/netpgp/dist/src/lib: create.c crypto.c
            keyring.c keyring.h misc.c netpgp.c netpgpdefs.h openssl_crypto.c
            ops-ssh.h packet-parse.c packet-print.c packet.h reader.c
            signature.c ssh2pgp.c validate.c version.h writer.c
        src/crypto/external/bsd/netpgp/dist/src/netpgpkeys: netpgpkeys.1
            netpgpkeys.c

Log Message:
Changes to 3.99.5

+ make ssh fingerprints (md5) match netpgp listing
+ use the more functional hexdump function from ssh2pgp in place of the
  older hexdump function from openpgpsdk
+ pass hash type down from command line where needed
+ add test for netpgp/ssh key fingerprint matching
+ make netpgpkeys(1) take a --hash= option

With these changes, netpgp can be made to generate the same fingerprint as
openssh (by default, ssh-keygen(1) uses an md5 digest)

% /usr/bin/netpgpkeys --ssh-keys --sshkeyfile=/etc/ssh/ssh_host_rsa_key.pub 
--list-keys --hash=md5
1 key
pub 1024/RSA (Encrypt or Sign) fcdd1c608bef4c4b 2008-08-11
Key fingerprint: e935 902d ebf1 76ba fcdd 1c60 8bef 4c4b
uid              osx-vm1.crowthorne.alistaircrooks.co.uk 
(/etc/ssh/ssh_host_rsa_key.pub) <r...@osx-vm1.crowthorne.alistaircrooks.co.uk>

% ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
1024 e9:35:90:2d:eb:f1:76:ba:fc:dd:1c:60:8b:ef:4c:4b 
/etc/ssh/ssh_host_rsa_key.pub (RSA)
%


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/crypto/external/bsd/netpgp/dist/TODO
cvs rdiff -u -r1.23 -r1.24 src/crypto/external/bsd/netpgp/dist/tst
cvs rdiff -u -r1.28 -r1.29 \
    src/crypto/external/bsd/netpgp/dist/src/lib/create.c \
    src/crypto/external/bsd/netpgp/dist/src/lib/signature.c
cvs rdiff -u -r1.23 -r1.24 \
    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/writer.c
cvs rdiff -u -r1.37 -r1.38 \
    src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
cvs rdiff -u -r1.26 -r1.27 \
    src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h
cvs rdiff -u -r1.30 -r1.31 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c
cvs rdiff -u -r1.58 -r1.59 \
    src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
cvs rdiff -u -r1.8 -r1.9 \
    src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h
cvs rdiff -u -r1.1 -r1.2 \
    src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h
cvs rdiff -u -r1.36 -r1.37 \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c \
    src/crypto/external/bsd/netpgp/dist/src/lib/reader.c
cvs rdiff -u -r1.31 -r1.32 \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c
cvs rdiff -u -r1.22 -r1.23 \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet.h
cvs rdiff -u -r1.12 -r1.13 \
    src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
cvs rdiff -u -r1.35 -r1.36 \
    src/crypto/external/bsd/netpgp/dist/src/lib/validate.c \
    src/crypto/external/bsd/netpgp/dist/src/lib/version.h
cvs rdiff -u -r1.11 -r1.12 \
    src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1
cvs rdiff -u -r1.12 -r1.13 \
    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/TODO
diff -u src/crypto/external/bsd/netpgp/dist/TODO:1.38 src/crypto/external/bsd/netpgp/dist/TODO:1.39
--- src/crypto/external/bsd/netpgp/dist/TODO:1.38	Sat May  8 02:45:45 2010
+++ src/crypto/external/bsd/netpgp/dist/TODO	Fri Jun 25 03:37:27 2010
@@ -95,3 +95,4 @@
 --list-sigs - these come out in __ops_check_subkey_sig()
 hkp to include sigs too
 make netpgpkeys work - add, import, commit, update, sign, passphrase
+fix ssh fingerprints not matching netpgp

Index: src/crypto/external/bsd/netpgp/dist/tst
diff -u src/crypto/external/bsd/netpgp/dist/tst:1.23 src/crypto/external/bsd/netpgp/dist/tst:1.24
--- src/crypto/external/bsd/netpgp/dist/tst:1.23	Sat May  8 02:18:05 2010
+++ src/crypto/external/bsd/netpgp/dist/tst	Fri Jun 25 03:37:27 2010
@@ -31,7 +31,7 @@
 	su root -c "make install"'
 
 passed=0
-total=32
+total=33
 rm -f passed
 date > passed
 echo "======> sign/verify 180938 file"
@@ -164,5 +164,10 @@
 echo "======> ascii detached armoured sig detection and verification"
 /usr/bin/netpgp --verify i.asc && passed=$(expr $passed + 1)
 echo "32 " $passed >> passed
+echo "======> ssh fingerprint and netpgp fingerprint"
+/usr/bin/netpgpkeys --ssh-keys --sshkeyfile=/etc/ssh/ssh_host_rsa_key.pub --list-keys --hash=md5
+/usr/bin/ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub 
+passed=$(expr $passed + 1)
+echo "33 " $passed >> passed
 rm -f a a.gpg b b.gpg c c.gpg d d.gpg e f f.sig g g.asc g2 a2 a3 a4 a5 h h.sig i i.asc
 echo "Passed ${passed}/${total} tests"

Index: src/crypto/external/bsd/netpgp/dist/src/lib/create.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.28 src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.29
--- src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.28	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/create.c	Fri Jun 25 03:37:27 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.28 2010/05/25 01:05:10 agc Exp $");
+__RCSID("$NetBSD: create.c,v 1.29 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -422,10 +422,8 @@
 	__ops_encrypt_init(&crypted);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\nWRITING:\niv=");
-		hexdump(stderr, key->iv, __ops_block_size(key->alg), " ");
-		(void) fprintf(stderr, "\nkey=");
-		hexdump(stderr, sesskey, CAST_KEY_LENGTH, " ");
+		hexdump(stderr, "writing: iv=", key->iv, __ops_block_size(key->alg));
+		hexdump(stderr, "key= ", sesskey, CAST_KEY_LENGTH);
 		(void) fprintf(stderr, "\nturning encryption on...\n");
 	}
 	__ops_push_enc_crypt(output, &crypted);
@@ -838,9 +836,7 @@
 	cs[1] = (uint8_t)(checksum & 0xff);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr,"\nm buf checksum: ");
-		hexdump(stderr, cs, 2, " ");
-		(void) fprintf(stderr,"\n");
+		hexdump(stderr, "nm buf checksum:", cs, 2);
 	}
 	return 1;
 }
@@ -922,9 +918,7 @@
 	(void) memcpy(EM + i, M, mLen);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "Encoded Message: \n");
-		hexdump(stderr, EM, mLen, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "Encoded Message:", EM, mLen);
 	}
 	return 1;
 }
@@ -984,9 +978,7 @@
 			sizeof(sesskey->key_id));
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "Encrypting for RSA key id : ");
-		hexdump(stderr, key->key_id, sizeof(sesskey->key_id), " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "Encrypting for RSA keyid", key->key_id, sizeof(sesskey->key_id));
 	}
 	if (key->key.pubkey.alg != OPS_PKA_RSA) {
 		(void) fprintf(stderr,
@@ -1002,11 +994,7 @@
 	__ops_random(sesskey->key, CAST_KEY_LENGTH);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr,
-			"CAST5 session key created (len=%d):\n ",
-			CAST_KEY_LENGTH);
-		hexdump(stderr, sesskey->key, CAST_KEY_LENGTH, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "CAST5 sesskey created", sesskey->key, CAST_KEY_LENGTH);
 	}
 	if (create_unencoded_m_buf(sesskey, &unencoded_m_buf[0]) == 0) {
 		free(encoded_m_buf);
@@ -1014,9 +1002,7 @@
 		return NULL;
 	}
 	if (__ops_get_debug_level(__FILE__)) {
-		fprintf(stderr, "unencoded m buf:\n");
-		hexdump(stderr, unencoded_m_buf, SZ_UNENCODED_M_BUF, " ");
-		fprintf(stderr, "\n");
+		hexdump(stderr, "uuencoded m buf", unencoded_m_buf, SZ_UNENCODED_M_BUF);
 	}
 	encode_m_buf(unencoded_m_buf, SZ_UNENCODED_M_BUF, pubkey, encoded_m_buf);
 
@@ -1238,7 +1224,7 @@
 {
 	uint8_t   keyid[OPS_KEY_ID_SIZE];
 
-	__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey);
+	__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey, OPS_HASH_SHA1); /* XXX - hardcoded */
 	return __ops_write_ptag(output, OPS_PTAG_CT_1_PASS_SIG) &&
 		__ops_write_length(output, 1 + 1 + 1 + 1 + 8 + 1) &&
 		__ops_write_scalar(output, 3, 1)	/* version */ &&
Index: src/crypto/external/bsd/netpgp/dist/src/lib/signature.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.28 src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.29
--- src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.28	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/signature.c	Fri Jun 25 03:37:27 2010
@@ -57,7 +57,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: signature.c,v 1.28 2010/05/25 01:05:11 agc Exp $");
+__RCSID("$NetBSD: signature.c,v 1.29 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -335,15 +335,10 @@
 	}
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\nhashbuf_from_sig\n");
-		hexdump(stderr, hashbuf_from_sig, debug_len_decrypted, " ");
-		printf("\nprefix\n");
-		hexdump(stderr, prefix, plen, " ");
-		(void) fprintf(stderr, "\nhash from sig\n");
-		hexdump(stderr, &hashbuf_from_sig[n + plen], hash_length, " ");
-		(void) fprintf(stderr, "\nhash passed in (should match hash from sig)\n");
-		hexdump(stderr, hash, hash_length, " ");
-		printf("\n");
+		hexdump(stderr, "sig hashbuf", hashbuf_from_sig, debug_len_decrypted);
+		hexdump(stderr, "prefix", prefix, plen);
+		hexdump(stderr, "sig hash", &hashbuf_from_sig[n + plen], hash_length);
+		hexdump(stderr, "input hash", hash, hash_length);
 	}
 	return (memcmp(&hashbuf_from_sig[n], prefix, plen) == 0 &&
 	        memcmp(&hashbuf_from_sig[n + plen], hash, hash_length) == 0);
@@ -419,8 +414,7 @@
 	unsigned   ret;
 
 	if (__ops_get_debug_level(__FILE__)) {
-		printf("__ops_check_sig: (length %d) hash=", length);
-		hexdump(stdout, hash, length, "");
+		hexdump(stdout, "hash", hash, length);
 	}
 	ret = 0;
 	switch (sig->info.key_alg) {
@@ -1036,7 +1030,7 @@
 			return 0;
 		}
 
-		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey);
+		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey, hash_alg);
 		ret = __ops_add_issuer_keyid(sig, keyid) &&
 			__ops_end_hashed_subpkts(sig) &&
 			__ops_write_sig(output, sig, &seckey->pubkey, seckey);
@@ -1079,7 +1073,7 @@
 		__ops_add_birthtime(sig, (long long)from);
 		__ops_add_expiration(sig, (long long)duration);
 		/* add key id to signature */
-		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey);
+		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey, hash_alg);
 		__ops_add_issuer_keyid(sig, keyid);
 		__ops_end_hashed_subpkts(sig);
 		__ops_write_sig(output, sig, &seckey->pubkey, seckey);
@@ -1204,7 +1198,7 @@
 		__ops_add_birthtime(sig, from);
 		__ops_add_expiration(sig, (long long)duration);
 		/* add key id to signature */
-		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey);
+		__ops_keyid(keyid, OPS_KEY_ID_SIZE, &seckey->pubkey, hash_alg);
 		__ops_add_issuer_keyid(sig, keyid);
 		__ops_end_hashed_subpkts(sig);
 
@@ -1230,15 +1224,15 @@
 			const unsigned armored, const unsigned overwrite)
 {
 	__ops_create_sig_t	*sig;
-	__ops_hash_alg_t	 alg;
+	__ops_hash_alg_t	 hash_alg;
 	__ops_output_t		*output;
 	__ops_memory_t		*mem;
 	uint8_t	 	 	 keyid[OPS_KEY_ID_SIZE];
 	int			 fd;
 
 	/* find out which hash algorithm to use */
-	alg = __ops_str_to_hash_alg(hash);
-	if (alg == OPS_HASH_UNKNOWN) {
+	hash_alg = __ops_str_to_hash_alg(hash);
+	if (hash_alg == OPS_HASH_UNKNOWN) {
 		(void) fprintf(io->errs,"Unknown hash algorithm: %s\n", hash);
 		return 0;
 	}
@@ -1253,7 +1247,7 @@
 
 	/* create a new signature */
 	sig = __ops_create_sig_new();
-	__ops_start_sig(sig, seckey, alg, OPS_SIG_BINARY);
+	__ops_start_sig(sig, seckey, hash_alg, OPS_SIG_BINARY);
 
 	/* read the contents of 'f', and add that to the signature */
 	mem = __ops_memory_new();
@@ -1271,7 +1265,7 @@
 	/* calculate the signature */
 	__ops_add_birthtime(sig, from);
 	__ops_add_expiration(sig, (long long)duration);
-	__ops_keyid(keyid, sizeof(keyid), &seckey->pubkey);
+	__ops_keyid(keyid, sizeof(keyid), &seckey->pubkey, hash_alg);
 	__ops_add_issuer_keyid(sig, keyid);
 	__ops_end_hashed_subpkts(sig);
 	__ops_write_sig(output, sig, &seckey->pubkey, seckey);

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.23 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.24
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.23	Sun May 16 02:46:25 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c	Fri Jun 25 03:37:27 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.23 2010/05/16 02:46:25 agc Exp $");
+__RCSID("$NetBSD: crypto.c,v 1.24 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -109,9 +109,7 @@
 	}
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\nDECRYPTING\nencrypted data     : ");
-		hexdump(stderr, encmpibuf, 16, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "encrypted", encmpibuf, 16);
 	}
 	n = __ops_rsa_private_decrypt(mpibuf, encmpibuf,
 				(unsigned)(BN_num_bits(encmpi) + 7) / 8,
@@ -122,21 +120,13 @@
 	}
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "decrypted encoded m buf     : ");
-		hexdump(stderr, mpibuf, 16, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "decrypted", mpibuf, 16);
 	}
 	if (n <= 0) {
 		return -1;
 	}
 
-	if (__ops_get_debug_level(__FILE__)) {
-		fprintf(stderr, " decrypted=%d ", n);
-		hexdump(stderr, mpibuf, (unsigned)n, "");
-		fprintf(stderr, "\n");
-	}
 	/* Decode EME-PKCS1_V1_5 (RFC 2437). */
-
 	if (mpibuf[0] != 0 || mpibuf[1] != 2) {
 		return -1;
 	}
@@ -158,9 +148,7 @@
 	}
 
 	if (__ops_get_debug_level(__FILE__)) {
-		fprintf(stderr, "decoded m buf:\n");
-		hexdump(stderr, buf, (size_t)(n - i), " ");
-		fprintf(stderr, "\n");
+		hexdump(stderr, "decoded m", buf, (size_t)(n - i));
 	}
 	return n - i;
 }
@@ -197,9 +185,7 @@
 	skp->rsa.encrypted_m = BN_bin2bn(encmpibuf, n, NULL);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "encrypted mpi buf     : ");
-		hexdump(stderr, encmpibuf, 16, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "encrypted mpi", encmpibuf, 16);
 	}
 	return 1;
 }
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.23 src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.24
--- src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.23	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c	Fri Jun 25 03:37:27 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.23 2010/05/25 01:05:10 agc Exp $");
+__RCSID("$NetBSD: openssl_crypto.c,v 1.24 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_DSA_H
@@ -538,9 +538,7 @@
 	odsa->pub_key = dsa->y;
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "hash passed in:\n");
-		hexdump(stderr, hash, hash_length, " ");
-		(void) fprintf(stderr, "\nhash_length=%" PRIsize "d\n", hash_length);
+		hexdump(stderr, "input hash", hash, hash_length);
 		(void) fprintf(stderr, "Q=%d\n", BN_num_bytes(odsa->q));
 	}
 	if ((qlen = (unsigned)BN_num_bytes(odsa->q)) < hash_length) {
@@ -823,8 +821,8 @@
 
 	RSA_free(rsa);
 
-	__ops_keyid(keydata->key_id, OPS_KEY_ID_SIZE, &keydata->key.seckey.pubkey);
-	__ops_fingerprint(&keydata->fingerprint, &keydata->key.seckey.pubkey);
+	__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);
 
 	/* Generate checksum */
 
Index: src/crypto/external/bsd/netpgp/dist/src/lib/writer.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.23 src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.24
--- src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.23	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/writer.c	Fri Jun 25 03:37:28 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.23 2010/05/25 01:05:11 agc Exp $");
+__RCSID("$NetBSD: writer.c,v 1.24 2010/06/25 03:37:28 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -955,11 +955,8 @@
 					src + done, size);
 
 		if (__ops_get_debug_level(__FILE__)) {
-			(void) fprintf(stderr, "WRITING:\nunencrypted: ");
-			hexdump(stderr, &src[done], 16, " ");
-			(void) fprintf(stderr, "\nencrypted:   ");
-			hexdump(stderr, encbuf, 16, " ");
-			(void) fprintf(stderr, "\n");
+			hexdump(stderr, "unencrypted", &src[done], 16);
+			hexdump(stderr, "encrypted", encbuf, 16);
 		}
 		if (!stacked_write(writer, encbuf, size, errors)) {
 			if (__ops_get_debug_level(__FILE__)) {
@@ -1165,9 +1162,7 @@
 	preamble[crypted->blocksize + 1] = preamble[crypted->blocksize - 1];
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\npreamble: ");
-		hexdump(stderr, preamble, preamblesize, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "preamble", preamble, preamblesize);
 	}
 
 	/* now construct MDC packet and add to the end of the buffer */
@@ -1176,11 +1171,8 @@
 	__ops_write_mdc(mdcoutput, hashed);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\nplaintext: ");
-		hexdump(stderr, data, len, " ");
-		(void) fprintf(stderr, "\nmdc: ");
-		hexdump(stderr, __ops_mem_data(mdc), OPS_SHA1_HASH_SIZE + 1 + 1, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "plaintext", data, len);
+		hexdump(stderr, "mdc", __ops_mem_data(mdc), OPS_SHA1_HASH_SIZE + 1 + 1);
 	}
 
 	/* and write it out */

Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.37 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.38
--- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.37	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c	Fri Jun 25 03:37:27 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.37 2010/05/25 01:05:10 agc Exp $");
+__RCSID("$NetBSD: keyring.c,v 1.38 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #ifdef HAVE_FCNTL_H
@@ -822,12 +822,8 @@
 {
 	for ( ; keyring && *from < keyring->keyc; *from += 1) {
 		if (__ops_get_debug_level(__FILE__)) {
-			(void) fprintf(io->errs,
-				"__ops_getkeybyid: keyring keyid ");
-			hexdump(io->errs, keyring->keys[*from].key_id, OPS_KEY_ID_SIZE, "");
-			(void) fprintf(io->errs, ", keyid ");
-			hexdump(io->errs, keyid, OPS_KEY_ID_SIZE, "");
-			(void) fprintf(io->errs, "\n");
+			hexdump(io->errs, "keyring keyid", keyring->keys[*from].key_id, 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) {
@@ -904,7 +900,7 @@
 	(void) memset(keyid, 0x0, sizeof(keyid));
 	str2keyid(name, keyid, sizeof(keyid));
 	if (__ops_get_debug_level(__FILE__)) {
-		hexdump(io->outs, keyid, 4, "");
+		hexdump(io->outs, "keyid", keyid, 4);
 	}
 	savedstart = *from;
 	if ((kp = __ops_getkeybyid(io, keyring, keyid, from)) != NULL) {
@@ -1031,8 +1027,8 @@
 	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);
-	__ops_fingerprint(&key->fingerprint, pubkey);
+	__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;
@@ -1050,8 +1046,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);
-	__ops_fingerprint(&key->fingerprint, pubkey);
+	__ops_keyid(key->key_id, OPS_KEY_ID_SIZE, pubkey, keyring->hashtype);
+	__ops_fingerprint(&key->fingerprint, pubkey, keyring->hashtype);
 	key->type = OPS_PTAG_CT_SECRET_KEY;
 	key->key.seckey = *seckey;
 	return 1;

Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.26 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.27
--- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h:1.26	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.h	Fri Jun 25 03:37:27 2010
@@ -68,6 +68,7 @@
  */
 typedef struct __ops_keyring_t {
 	DYNARRAY(__ops_key_t,	key);
+	__ops_hash_alg_t	hashtype;
 } __ops_keyring_t;
 
 const __ops_key_t *__ops_getkeybyid(__ops_io_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.30 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.31
--- src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.30	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/misc.c	Fri Jun 25 03:37:27 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.30 2010/05/25 01:05:10 agc Exp $");
+__RCSID("$NetBSD: misc.c,v 1.31 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -98,7 +98,7 @@
 
 
 typedef struct {
-	__ops_keyring_t  *keyring;
+	__ops_keyring_t		*keyring;
 } accumulate_t;
 
 /**
@@ -402,6 +402,60 @@
 	}
 }
 
+/* hash a 32-bit integer */
+static int
+hash_uint32(__ops_hash_t *hash, uint32_t n)
+{
+	uint8_t	ibuf[4];
+
+	ibuf[0] = (uint8_t)(n >> 24) & 0xff;
+	ibuf[1] = (uint8_t)(n >> 16) & 0xff;
+	ibuf[2] = (uint8_t)(n >> 8) & 0xff;
+	ibuf[3] = (uint8_t)n & 0xff;
+	(*hash->add)(hash, (const uint8_t *)(void *)ibuf, sizeof(ibuf));
+	return sizeof(ibuf);
+}
+
+/* hash a string - first length, then string itself */
+static int
+hash_string(__ops_hash_t *hash, const uint8_t *buf, uint32_t len)
+{
+	if (__ops_get_debug_level(__FILE__)) {
+		hexdump(stderr, "hash_string", buf, len);
+	}
+	hash_uint32(hash, len);
+	(*hash->add)(hash, buf, len);
+	return sizeof(len) + (int)len;
+}
+
+/* hash a bignum, possibly padded - first length, then string itself */
+static int
+hash_bignum(__ops_hash_t *hash, BIGNUM *bignum)
+{
+	uint8_t	*bn;
+	size_t	 len;
+	int	 padbyte;
+
+	if (BN_is_zero(bignum)) {
+		hash_uint32(hash, 0);
+		return sizeof(len);
+	}
+	if ((len = (size_t) BN_num_bytes(bignum)) < 1) {
+		(void) fprintf(stderr, "hash_bignum: bad size\n");
+		return 0;
+	}
+	if ((bn = calloc(1, len)) == NULL) {
+		(void) fprintf(stderr, "hash_bignum: bad bn alloc\n");
+		return 0;
+	}
+	BN_bn2bin(bignum, bn + 1);
+	bn[0] = 0x0;
+	padbyte = (bn[1] & 0x80) ? 1 : 0;
+	hash_string(hash, bn + 1 - padbyte, len + padbyte);
+	free(bn);
+	return sizeof(len) + len + padbyte;
+}
+
 /** \file
  */
 
@@ -411,83 +465,81 @@
  * \param fp Where to put the calculated fingerprint
  * \param key The key for which the fingerprint is calculated
  */
-
-void 
-__ops_fingerprint(__ops_fingerprint_t *fp, const __ops_pubkey_t *key)
+int 
+__ops_fingerprint(__ops_fingerprint_t *fp, const __ops_pubkey_t *key, __ops_hash_alg_t hashtype)
 {
-	if (key->version == 2 || key->version == 3) {
-		unsigned char  *bn;
-		size_t		n;
-		__ops_hash_t	md5;
+	__ops_memory_t	*mem;
+	__ops_hash_t	 hash;
+	const char	*type;
+	uint32_t	 len;
 
+	mem = __ops_memory_new();
+	if (key->version == 2 || key->version == 3) {
 		if (key->alg != OPS_PKA_RSA &&
 		    key->alg != OPS_PKA_RSA_ENCRYPT_ONLY &&
 		    key->alg != OPS_PKA_RSA_SIGN_ONLY) {
 			(void) fprintf(stderr,
 				"__ops_fingerprint: bad algorithm\n");
-			return;
+			return 0;
 		}
-
-		__ops_hash_md5(&md5);
-		if (!md5.init(&md5)) {
+		__ops_hash_md5(&hash);
+		if (!hash.init(&hash)) {
 			(void) fprintf(stderr,
 				"__ops_fingerprint: bad md5 alloc\n");
-				return;
+			return 0;
 		}
-
-		n = (size_t) BN_num_bytes(key->key.rsa.n);
-		if ((bn = calloc(1, n)) == NULL) {
-			(void) fprintf(stderr,
-				"__ops_fingerprint: bad bn alloc\n");
-			return;
+		hash_bignum(&hash, key->key.rsa.n);
+		hash_bignum(&hash, key->key.rsa.e);
+		fp->length = hash.finish(&hash, fp->fingerprint);
+		if (__ops_get_debug_level(__FILE__)) {
+			hexdump(stderr, "v2/v3 fingerprint", fp->fingerprint, fp->length);
 		}
-		BN_bn2bin(key->key.rsa.n, bn);
-		md5.add(&md5, bn, n);
-		free(bn);
-
-		n = (size_t) BN_num_bytes(key->key.rsa.e);
-		if ((bn = calloc(1, n)) == NULL) {
+	} else if (hashtype == OPS_HASH_MD5) {
+		__ops_hash_md5(&hash);
+		if (!hash.init(&hash)) {
 			(void) fprintf(stderr,
-				"__ops_fingerprint: bad bn alloc 2\n");
-			return;
+				"__ops_fingerprint: bad md5 alloc\n");
+			return 0;
 		}
-		BN_bn2bin(key->key.rsa.e, bn);
-		md5.add(&md5, bn, n);
-		free(bn);
-
-		md5.finish(&md5, fp->fingerprint);
-		fp->length = 16;
-	} else {
-		__ops_memory_t	*mem = __ops_memory_new();
-		__ops_hash_t	 sha1;
-		size_t		 len;
-
-		__ops_build_pubkey(mem, key, 0);
-
+		type = (key->alg == OPS_PKA_RSA) ? "ssh-rsa" : "ssh-dsa";
+		hash_string(&hash, (const uint8_t *)(const void *)type, strlen(type));
+		switch(key->alg) {
+		case OPS_PKA_RSA:
+			hash_bignum(&hash, key->key.rsa.e);
+			hash_bignum(&hash, key->key.rsa.n);
+			break;
+		case OPS_PKA_DSA:
+			hash_bignum(&hash, key->key.dsa.p);
+			hash_bignum(&hash, key->key.dsa.q);
+			hash_bignum(&hash, key->key.dsa.g);
+			hash_bignum(&hash, key->key.dsa.y);
+			break;
+		default:
+			break;
+		}
+		fp->length = hash.finish(&hash, fp->fingerprint);
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "-> creating key fingerprint\n");
+			hexdump(stderr, "md5 fingerprint", fp->fingerprint, fp->length);
 		}
-		__ops_hash_sha1(&sha1);
-		if (!sha1.init(&sha1)) {
+	} else {
+		__ops_build_pubkey(mem, key, 0);
+		__ops_hash_sha1(&hash);
+		if (!hash.init(&hash)) {
 			(void) fprintf(stderr,
 				"__ops_fingerprint: bad sha1 alloc\n");
-			return;
+			return 0;
 		}
-
 		len = __ops_mem_len(mem);
-
-		__ops_hash_add_int(&sha1, 0x99, 1);
-		__ops_hash_add_int(&sha1, len, 2);
-		sha1.add(&sha1, __ops_mem_data(mem), len);
-		sha1.finish(&sha1, fp->fingerprint);
-
+		__ops_hash_add_int(&hash, 0x99, 1);
+		__ops_hash_add_int(&hash, len, 2);
+		hash.add(&hash, __ops_mem_data(mem), len);
+		fp->length = hash.finish(&hash, fp->fingerprint);
+		__ops_memory_free(mem);
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "<- finished making key fingerprint\n");
+			hexdump(stderr, "sha1 fingerprint", fp->fingerprint, fp->length);
 		}
-		fp->length = OPS_FINGERPRINT_SIZE;
-
-		__ops_memory_free(mem);
 	}
+	return 1;
 }
 
 /**
@@ -497,8 +549,8 @@
  * \param key The key for which the ID is calculated
  */
 
-void 
-__ops_keyid(uint8_t *keyid, const size_t idlen, const __ops_pubkey_t *key)
+int 
+__ops_keyid(uint8_t *keyid, const size_t idlen, const __ops_pubkey_t *key, __ops_hash_alg_t hashtype)
 {
 	__ops_fingerprint_t finger;
 
@@ -509,22 +561,23 @@
 		n = (unsigned) BN_num_bytes(key->key.rsa.n);
 		if (n > sizeof(bn)) {
 			(void) fprintf(stderr, "__ops_keyid: bad num bytes\n");
-			return;
+			return 0;
 		}
 		if (key->alg != OPS_PKA_RSA &&
 		    key->alg != OPS_PKA_RSA_ENCRYPT_ONLY &&
 		    key->alg != OPS_PKA_RSA_SIGN_ONLY) {
 			(void) fprintf(stderr, "__ops_keyid: bad algorithm\n");
-			return;
+			return 0;
 		}
 		BN_bn2bin(key->key.rsa.n, bn);
 		(void) memcpy(keyid, bn + n - idlen, idlen);
 	} else {
-		__ops_fingerprint(&finger, key);
+		__ops_fingerprint(&finger, key, hashtype);
 		(void) memcpy(keyid,
 				finger.fingerprint + finger.length - idlen,
 				idlen);
 	}
+	return 1;
 }
 
 /**
@@ -698,11 +751,8 @@
 	uint8_t		c;
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "__ops_calc_mdc_hash():\npreamble: ");
-		hexdump(stderr, preamble, sz_preamble, " ");
-		(void) fprintf(stderr, "\nplaintext (len=%u): ", sz_plaintext);
-		hexdump(stderr, plaintext, sz_plaintext, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "preamble", preamble, sz_preamble);
+		hexdump(stderr, "plaintext", plaintext, sz_plaintext);
 	}
 	/* init */
 	__ops_hash_any(&hash, OPS_HASH_SHA1);
@@ -727,9 +777,7 @@
 	hash.finish(&hash, hashed);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		(void) fprintf(stderr, "\nhashed (len=%d): ", OPS_SHA1_HASH_SIZE);
-		hexdump(stderr, hashed, OPS_SHA1_HASH_SIZE, " ");
-		(void) fprintf(stderr, "\n");
+		hexdump(stderr, "hashed", hashed, OPS_SHA1_HASH_SIZE);
 	}
 }
 
@@ -1041,14 +1089,35 @@
 	return (str) ? str : "Unknown";
 }
 
+#define LINELEN	16
+
+/* show hexadecimal/ascii dump */
 void 
-hexdump(FILE *fp, const uint8_t *src, size_t length, const char *sep)
+hexdump(FILE *fp, const char *header, const uint8_t *src, size_t length)
 {
-	unsigned i;
+	size_t	i;
+	char	line[LINELEN + 1];
 
-	for (i = 0 ; i < length ; i += 2) {
-		(void) fprintf(fp, "%02x", *src++);
-		(void) fprintf(fp, "%02x%s", *src++, sep);
+	(void) fprintf(fp, "%s%s", (header) ? header : "", (header) ? "\n" : "");
+	(void) fprintf(fp, "[%d chars]\n", length);
+	for (i = 0 ; i < length ; i++) {
+		if (i % LINELEN == 0) {
+			(void) fprintf(fp, "%.5d | ", i);
+		}
+		(void) fprintf(fp, "%.02x ", (uint8_t)src[i]);
+		line[i % LINELEN] = (isprint(src[i])) ? src[i] : '.';
+		if (i % LINELEN == LINELEN - 1) {
+			line[LINELEN] = 0x0;
+			(void) fprintf(fp, " | %s\n", line);
+		}
+	}
+	if (i % LINELEN != 0) {
+		for ( ; i % LINELEN != 0 ; i++) {
+			(void) fprintf(fp, "   ");
+			line[i % LINELEN] = ' ';
+		}
+		line[LINELEN] = 0x0;
+		(void) fprintf(fp, " | %s\n", line);
 	}
 }
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.58 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.59
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.58	Wed Jun  2 03:38:01 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c	Fri Jun 25 03:37:27 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.58 2010/06/02 03:38:01 agc Exp $");
+__RCSID("$NetBSD: netpgp.c,v 1.59 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -249,6 +249,8 @@
 {
 	__ops_keyring_t	*pubring;
 	__ops_keyring_t	*secring;
+	unsigned	 hashtype;
+	char		*hash;
 	char		 f[MAXPATHLEN];
 	char		*filename;
 
@@ -260,7 +262,19 @@
 		(void) fprintf(stderr, "readsshkeys: bad alloc\n");
 		return 0;
 	}
-	if (!__ops_ssh2_readkeys(netpgp->io, pubring, NULL, filename, NULL)) {
+	/* openssh2 keys use md5 by default */
+	hashtype = OPS_HASH_MD5;
+	if ((hash = netpgp_getvar(netpgp, "hash")) != NULL) {
+		/* openssh 2 hasn't really caught up to anything else yet */
+		if (strcasecmp(hash, "md5") == 0) {
+			hashtype = OPS_HASH_MD5;
+		} else if (strcasecmp(hash, "sha1") == 0) {
+			hashtype = OPS_HASH_SHA1;
+		} else if (strcasecmp(hash, "sha256") == 0) {
+			hashtype = OPS_HASH_SHA256;
+		}
+	}
+	if (!__ops_ssh2_readkeys(netpgp->io, pubring, NULL, filename, NULL, hashtype)) {
 		free(pubring);
 		(void) fprintf(stderr, "readsshkeys: can't read %s\n",
 				filename);
@@ -284,7 +298,7 @@
 		(void) fprintf(stderr, "readsshkeys: bad alloc\n");
 		return 0;
 	}
-	if (__ops_ssh2_readkeys(netpgp->io, pubring, secring, NULL, filename)) {
+	if (__ops_ssh2_readkeys(netpgp->io, pubring, secring, NULL, filename, hashtype)) {
 		netpgp->secring = secring;
 		netpgp_setvar(netpgp, "sshsecfile", filename);
 	} else {

Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h:1.8 src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h:1.9
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h:1.8	Fri Mar  5 16:01:09 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgpdefs.h	Fri Jun 25 03:37:27 2010
@@ -47,7 +47,7 @@
 /* number of elements in an array */
 #define OPS_ARRAY_SIZE(a)       (sizeof(a)/sizeof(*(a)))
 
-void            hexdump(FILE *, const uint8_t *, size_t, const char *);
+void            hexdump(FILE *, const char *, const uint8_t *, size_t);
 
 const char     *__ops_str_from_map(int, __ops_map_t *);
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h:1.1 src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h:1.2
--- src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h:1.1	Sat Dec  5 07:08:19 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/ops-ssh.h	Fri Jun 25 03:37:27 2010
@@ -32,10 +32,10 @@
 #include "keyring.h"
 #include "types.h"
 
-int __ops_ssh2pubkey(__ops_io_t *, const char *, __ops_key_t *);
-int __ops_ssh2seckey(__ops_io_t *, const char *, __ops_key_t *, __ops_pubkey_t *);
+int __ops_ssh2pubkey(__ops_io_t *, const char *, __ops_key_t *, __ops_hash_alg_t);
+int __ops_ssh2seckey(__ops_io_t *, const char *, __ops_key_t *, __ops_pubkey_t *, __ops_hash_alg_t);
 
 int __ops_ssh2_readkeys(__ops_io_t *, __ops_keyring_t *, __ops_keyring_t *,
-		const char *, const char *);
+		const char *, const char *, unsigned);
 
 #endif

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.36 src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.37
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.36	Tue Jun  1 03:19:26 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c	Fri Jun 25 03:37:27 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.36 2010/06/01 03:19:26 agc Exp $");
+__RCSID("$NetBSD: packet-parse.c,v 1.37 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_CAST_H
@@ -2485,11 +2485,8 @@
 
 		__ops_crypt_any(&decrypt, pkt.u.seckey.alg);
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "\nREADING:\niv=");
-			hexdump(stderr, pkt.u.seckey.iv, __ops_block_size(pkt.u.seckey.alg), " ");
-			fprintf(stderr, "\nkey=");
-			hexdump(stderr, key, CAST_KEY_LENGTH, " ");
-			fprintf(stderr, "\n");
+			hexdump(stderr, "input iv", pkt.u.seckey.iv, __ops_block_size(pkt.u.seckey.alg));
+			hexdump(stderr, "key", key, CAST_KEY_LENGTH);
 		}
 		decrypt.set_iv(&decrypt, pkt.u.seckey.iv);
 		decrypt.set_crypt_key(&decrypt, key);
@@ -2658,9 +2655,7 @@
 		return 0;
 	}
 	if (__ops_get_debug_level(__FILE__)) {
-		fprintf(stderr, "session key: public key id: x=%" PRIsize "d\n", sizeof(pkt.u.pk_sesskey.key_id));
-		hexdump(stderr, pkt.u.pk_sesskey.key_id, sizeof(pkt.u.pk_sesskey.key_id), " ");
-		fprintf(stderr, "\n");
+		hexdump(stderr, "sesskey: pubkey id", pkt.u.pk_sesskey.key_id, sizeof(pkt.u.pk_sesskey.key_id));
 	}
 	if (!limread(&c, 1, region, stream)) {
 		return 0;
@@ -2740,9 +2735,7 @@
 	(void) memcpy(pkt.u.pk_sesskey.key, unencoded_m_buf + 1, k);
 
 	if (__ops_get_debug_level(__FILE__)) {
-		fprintf(stderr, "session key recovered (len=%u):\n", k);
-		hexdump(stderr, pkt.u.pk_sesskey.key, k, " ");
-		fprintf(stderr, "\n");
+		hexdump(stderr, "recovered sesskey", pkt.u.pk_sesskey.key, k);
 	}
 	pkt.u.pk_sesskey.checksum = unencoded_m_buf[k + 1] +
 			(unencoded_m_buf[k + 2] << 8);
Index: src/crypto/external/bsd/netpgp/dist/src/lib/reader.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.36 src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.37
--- src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.36	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/reader.c	Fri Jun 25 03:37:27 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.36 2010/05/25 01:05:11 agc Exp $");
+__RCSID("$NetBSD: reader.c,v 1.37 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -1465,11 +1465,8 @@
 					encrypted->decrypted, buffer, n);
 
 				if (__ops_get_debug_level(__FILE__)) {
-					(void) fprintf(stderr, "READING:\nencrypted: ");
-					hexdump(stderr, buffer, 16, " ");
-					(void) fprintf(stderr, "\ndecrypted: ");
-					hexdump(stderr, encrypted->decrypted, 16, " ");
-					(void) fprintf(stderr, "\n");
+					hexdump(stderr, "encrypted", buffer, 16);
+					hexdump(stderr, "decrypted", encrypted->decrypted, 16);
 				}
 			} else {
 				(void) memcpy(
@@ -1601,17 +1598,11 @@
 			return -1;
 		}
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "\n\nentire SE IP packet (len=%d):\n",
-					decrypted_region.length);
-			hexdump(stderr, buf, decrypted_region.length, " "); 
-			fprintf(stderr, "\n\n");
+			hexdump(stderr, "SE IP packet", buf, decrypted_region.length); 
 		}
 		/* verify leading preamble */
-
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "\npreamble: ");
-			hexdump(stderr, buf, se_ip->decrypt->blocksize , " ");
-			fprintf(stderr, "\n");
+			hexdump(stderr, "preamble", buf, se_ip->decrypt->blocksize);
 		}
 		b = se_ip->decrypt->blocksize;
 		if (buf[b - 2] != buf[b] || buf[b - 1] != buf[b + 1]) {
@@ -1636,12 +1627,8 @@
 		mdc_hash = mdc + 2;
 
 		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "\nplaintext (len=%" PRIsize "u): ",
-				sz_plaintext);
-			hexdump(stderr, plaintext, sz_plaintext, " ");
-			fprintf(stderr, "\nmdc (len=%" PRIsize "u): ", sz_mdc);
-			hexdump(stderr, mdc, sz_mdc, " ");
-			fprintf(stderr, "\n");
+			hexdump(stderr, "plaintext", plaintext, sz_plaintext);
+			hexdump(stderr, "mdc", mdc, sz_mdc);
 		}
 		__ops_calc_mdc_hash(preamble, sz_preamble, plaintext,
 				sz_plaintext, hashed);

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.31 src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.32
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.31	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c	Fri Jun 25 03:37:27 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.31 2010/05/25 01:05:11 agc Exp $");
+__RCSID("$NetBSD: packet-print.c,v 1.32 2010/06/25 03:37:27 agc Exp $");
 #endif
 
 #include <string.h>
@@ -103,20 +103,14 @@
 print_hexdump(int indent, const char *name, const uint8_t *data, unsigned len)
 {
 	print_name(indent, name);
-
-	printf("len=%u, data=0x", len);
-	hexdump(stdout, data, len, "");
-	printf("\n");
+	hexdump(stdout, NULL, data, len);
 }
 
 static void 
 hexdump_data(int indent, const char *name, const uint8_t *data, unsigned len)
 {
 	print_name(indent, name);
-
-	printf("0x");
-	hexdump(stdout, data, len, "");
-	printf("\n");
+	hexdump(stdout, NULL, data, len);
 }
 
 static void 
@@ -177,24 +171,7 @@
 static void 
 print_packet_hex(const __ops_subpacket_t *pkt)
 {
-	unsigned	rem;
-	unsigned	blksz = 4;
-	uint8_t		*cur;
-	int             i;
-
-	printf("\nhexdump of packet contents follows:\n");
-	for (i = 1, cur = pkt->raw;
-	     cur < (pkt->raw + pkt->length);
-	     cur += blksz, i++) {
-		rem = pkt->raw + pkt->length - cur;
-		hexdump(stdout, cur, (rem <= blksz) ? rem : blksz, "");
-		printf(" ");
-		if (i % 8 == 0) {
-			printf("\n");
-		}
-
-	}
-	printf("\n");
+	hexdump(stdout, "packet contents:", pkt->raw, pkt->length);
 }
 
 static void 
@@ -491,7 +468,7 @@
 		strhexdump(keyid, key->key_id, OPS_KEY_ID_SIZE, ""),
 		ptimestr(t, sizeof(t), pubkey->birthtime),
 		expired,
-		strhexdump(fp, key->fingerprint.fingerprint, OPS_FINGERPRINT_SIZE, " "),
+		strhexdump(fp, key->fingerprint.fingerprint, key->fingerprint.length, " "),
 		uidbuf);
 }
 
@@ -840,12 +817,8 @@
 	case OPS_PTAG_CT_SE_IP_DATA_BODY:
 		print_tagname(print->indent, 
 			"SYMMETRIC ENCRYPTED INTEGRITY PROTECTED DATA BODY");
-		printf("  data body length=%u\n",
-		       content->se_data_body.length);
-		printf("    data=");
-		hexdump(stdout, content->se_data_body.data,
-			content->se_data_body.length, "");
-		printf("\n");
+		hexdump(stdout, "data", content->se_data_body.data,
+			content->se_data_body.length);
 		break;
 
 	case OPS_PTAG_CT_PUBLIC_KEY:
@@ -1016,10 +989,8 @@
 			printf(" (sensitive)");
 		}
 		printf(", algid=0x%x", content->ss_revocation_key.algid);
-		printf(", fingerprint=");
-		hexdump(stdout, content->ss_revocation_key.fingerprint,
-				OPS_FINGERPRINT_SIZE, "");
-		printf("\n");
+		hexdump(stdout, "fingerprint", content->ss_revocation_key.fingerprint,
+				OPS_FINGERPRINT_SIZE);
 		end_subpacket(&print->indent);
 		break;
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.22 src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.23
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.22	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet.h	Fri Jun 25 03:37:27 2010
@@ -872,13 +872,15 @@
 
 /** __ops_fingerprint_t */
 typedef struct {
-	uint8_t		fingerprint[OPS_FINGERPRINT_SIZE];
-	unsigned        length;
+	uint8_t			fingerprint[OPS_FINGERPRINT_SIZE];
+	unsigned        	length;
+	__ops_hash_alg_t	hashtype;
 } __ops_fingerprint_t;
 
+int __ops_keyid(uint8_t *, const size_t, const __ops_pubkey_t *, __ops_hash_alg_t);
+int __ops_fingerprint(__ops_fingerprint_t *, const __ops_pubkey_t *, __ops_hash_alg_t);
+
 void __ops_finish(void);
-void __ops_keyid(uint8_t *, const size_t, const __ops_pubkey_t *);
-void __ops_fingerprint(__ops_fingerprint_t *, const __ops_pubkey_t *);
 void __ops_pubkey_free(__ops_pubkey_t *);
 void __ops_userid_free(uint8_t **);
 void __ops_data_free(__ops_data_t *);

Index: src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.12 src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.13
--- src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.12	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c	Fri Jun 25 03:37:27 2010
@@ -141,36 +141,6 @@
 	return dstc;
 }
 
-#define LINELEN	16
-
-/* show hexadecimal/ascii dump */
-static void
-show(const char *header, char *in, int len)
-{
-	char	line[LINELEN + 1];
-	int	i;
-
-	printf("%s%s", (header) ? header : "", (header) ? "\n" : "");
-	printf("[%d chars]\n", len);
-	for (i = 0 ; i < len ; i++) {
-		if (i % LINELEN == 0) {
-			printf("%.5d | ", i);
-		}
-		printf("%.02x ", (uint8_t)in[i]);
-		line[i % LINELEN] = (isprint(in[i])) ? in[i] : '.';
-		if (i % LINELEN == LINELEN - 1) {
-			line[LINELEN] = 0x0;
-			printf(" | %s\n", line);
-		}
-	}
-	for ( ; i % LINELEN != 0 ; i++) {
-		printf("   ");
-		line[i % LINELEN] = ' ';
-	}
-	line[LINELEN] = 0x0;
-	printf(" | %s\n", line);
-}
-
 /* get a bignum from the buffer gap */
 static BIGNUM *
 getbignum(bufgap_t *bg, char *buf, const char *header)
@@ -184,12 +154,30 @@
 	(void) bufgap_getbin(bg, buf, len);
 	bignum = BN_bin2bn((const uint8_t *)buf, (int)len, NULL);
 	if (__ops_get_debug_level(__FILE__)) {
-		show(header, buf, (int)len);
+		hexdump(stderr, header, (const uint8_t *)(void *)buf, len);
 	}
 	(void) bufgap_seek(bg, len, BGFromHere, BGByte);
 	return bignum;
 }
 
+#if 0
+static int
+putbignum(bufgap_t *bg, BIGNUM *bignum)
+{
+	uint32_t	 len;
+
+	len = BN_num_bytes(bignum);
+	(void) bufgap_insert(bg, &len, sizeof(len));
+	(void) bufgap_insert(bg, buf, len);
+	bignum = BN_bin2bn((const uint8_t *)buf, (int)len, NULL);
+	if (__ops_get_debug_level(__FILE__)) {
+		hexdump(stderr, header, buf, (int)len);
+	}
+	(void) bufgap_seek(bg, len, BGFromHere, BGByte);
+	return bignum;
+}
+#endif
+
 static str_t	pkatypes[] = {
 	{	"ssh-rsa",	7,	OPS_PKA_RSA	},
 	{	"ssh-dsa",	7,	OPS_PKA_DSA	},
@@ -212,7 +200,7 @@
 
 /* convert an ssh (host) pubkey to a pgp pubkey */
 int
-__ops_ssh2pubkey(__ops_io_t *io, const char *f, __ops_key_t *key)
+__ops_ssh2pubkey(__ops_io_t *io, const char *f, __ops_key_t *key, __ops_hash_alg_t hashtype)
 {
 	__ops_pubkey_t	*pubkey;
 	struct stat	 st;
@@ -259,11 +247,11 @@
 		cc = (int)(space - buf);
 	}
 	if (__ops_get_debug_level(__FILE__)) {
-		show(NULL, buf, cc);
+		hexdump(stderr, NULL, (const uint8_t *)(const void *)buf, (size_t)cc);
 	}
 	cc = frombase64(bin, buf, (size_t)cc, 0);
 	if (__ops_get_debug_level(__FILE__)) {
-		show("decoded base64:", bin, cc);
+		hexdump(stderr, "decoded base64:", (const uint8_t *)(const void *)bin, (size_t)cc);
 	}
 	bufgap_delete(&bg, (uint64_t)bufgap_tell(&bg, BGFromEOF, BGByte));
 	bufgap_insert(&bg, bin, cc);
@@ -328,9 +316,9 @@
 						hostname,
 						f,
 						owner);
-		__ops_keyid(key->key_id, sizeof(key->key_id), pubkey);
+		__ops_keyid(key->key_id, sizeof(key->key_id), pubkey, hashtype);
 		__ops_add_userid(key, userid);
-		__ops_fingerprint(&key->fingerprint, pubkey);
+		__ops_fingerprint(&key->fingerprint, pubkey, hashtype);
 		free(userid);
 		if (__ops_get_debug_level(__FILE__)) {
 			/*__ops_print_keydata(io, keyring, key, "pub", pubkey, 0);*/
@@ -345,7 +333,7 @@
 
 /* convert an ssh (host) seckey to a pgp seckey */
 int
-__ops_ssh2seckey(__ops_io_t *io, const char *f, __ops_key_t *key, __ops_pubkey_t *pubkey)
+__ops_ssh2seckey(__ops_io_t *io, const char *f, __ops_key_t *key, __ops_pubkey_t *pubkey, __ops_hash_alg_t hashtype)
 {
 	__ops_crypt_t	crypted;
 	__ops_hash_t	hash;
@@ -353,6 +341,7 @@
 	unsigned	i = 0;
 	uint8_t		sesskey[CAST_KEY_LENGTH];
 	uint8_t		hashed[OPS_SHA1_HASH_SIZE];
+	BIGNUM		*tmp;
 
 	__OPS_USED(io);
 	/* XXX - check for rsa/dsa */
@@ -369,6 +358,12 @@
 	key->key.seckey.alg = OPS_SA_CAST5;
 	key->key.seckey.s2k_specifier = OPS_S2KS_SALTED;
 	key->key.seckey.hash_alg = OPS_HASH_SHA1;
+	if (key->key.seckey.pubkey.alg == OPS_PKA_RSA) {
+		/* openssh and openssl have p and q swapped */
+		tmp = key->key.seckey.key.rsa.p;
+		key->key.seckey.key.rsa.p = key->key.seckey.key.rsa.q;
+		key->key.seckey.key.rsa.q = tmp;
+	}
 	for (done = 0, i = 0; done < CAST_KEY_LENGTH; i++) {
 		unsigned 	j;
 		uint8_t		zero = 0;
@@ -419,8 +414,8 @@
 	crypted.set_crypt_key(&crypted, sesskey);
 	__ops_encrypt_init(&crypted);
 	key->key.seckey.pubkey.alg = OPS_PKA_RSA;
-	__ops_fingerprint(&key->fingerprint, pubkey);
-	__ops_keyid(key->key_id, sizeof(key->key_id), pubkey);
+	__ops_fingerprint(&key->fingerprint, pubkey, hashtype);
+	__ops_keyid(key->key_id, sizeof(key->key_id), pubkey, hashtype);
 	return 1;
 }
 
@@ -428,7 +423,7 @@
 int
 __ops_ssh2_readkeys(__ops_io_t *io, __ops_keyring_t *pubring,
 		__ops_keyring_t *secring, const char *pubfile,
-		const char *secfile)
+		const char *secfile, unsigned hashtype)
 {
 	__ops_key_t		*pubkey;
 	__ops_key_t		*seckey;
@@ -440,7 +435,7 @@
 		if (__ops_get_debug_level(__FILE__)) {
 			(void) fprintf(io->errs, "__ops_ssh2_readkeys: pubfile '%s'\n", pubfile);
 		}
-		__ops_ssh2pubkey(io, pubfile, &key);
+		__ops_ssh2pubkey(io, pubfile, &key, hashtype);
 		EXPAND_ARRAY(pubring, key);
 		pubkey = &pubring->keys[pubring->keyc++];
 		(void) memcpy(pubkey, &key, sizeof(key));
@@ -453,7 +448,7 @@
 		if (pubkey == NULL) {
 			pubkey = &pubring->keys[0];
 		}
-		(void) __ops_ssh2seckey(io, secfile, &key, &pubkey->key.pubkey);
+		(void) __ops_ssh2seckey(io, secfile, &key, &pubkey->key.pubkey, hashtype);
 		EXPAND_ARRAY(secring, key);
 		seckey = &secring->keys[secring->keyc++];
 		(void) memcpy(seckey, &key, sizeof(key));

Index: src/crypto/external/bsd/netpgp/dist/src/lib/validate.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.35 src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.36
--- src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.35	Tue May 25 01:05:11 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/validate.c	Fri Jun 25 03:37:28 2010
@@ -54,7 +54,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: validate.c,v 1.35 2010/05/25 01:05:11 agc Exp $");
+__RCSID("$NetBSD: validate.c,v 1.36 2010/06/25 03:37:28 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -204,11 +204,8 @@
 
 	case OPS_V4:
 		if (__ops_get_debug_level(__FILE__)) {
-			(void) fprintf(stderr, "v4_hashlen %zu\n",
+			hexdump(stderr, "v4 hash", sig->info.v4_hashed,
 					sig->info.v4_hashlen);
-			hexdump(stderr, sig->info.v4_hashed,
-					sig->info.v4_hashlen, " ");
-			(void) fprintf(stderr, "\n");
 		}
 		hash.add(&hash, sig->info.v4_hashed, sig->info.v4_hashlen);
 		trailer[0] = 0x04;	/* version */
@@ -229,9 +226,7 @@
 
 	n = hash.finish(&hash, hashout);
 	if (__ops_get_debug_level(__FILE__)) {
-		printf("check_binary_sig: hash length %" PRIsize "u\n",
-			hash.size);
-		hexdump(stdout, hashout, n, "");
+		hexdump(stdout, "hash out", hashout, n);
 	}
 	return __ops_check_sig(hashout, n, sig, signer);
 }
@@ -471,14 +466,10 @@
 	case OPS_PTAG_CT_SIGNATURE:	/* V3 sigs */
 	case OPS_PTAG_CT_SIGNATURE_FOOTER:	/* V4 sigs */
 		if (__ops_get_debug_level(__FILE__)) {
-			(void) fprintf(io->outs, "\n*** hashed data:\n");
-			hexdump(io->outs, content->sig.info.v4_hashed,
-					content->sig.info.v4_hashlen, " ");
-			(void) fprintf(io->outs, "\ntype=%02x signer_id=",
-					content->sig.info.type);
-			hexdump(io->outs, content->sig.info.signer_id,
-				sizeof(content->sig.info.signer_id), "");
-			(void) fprintf(io->outs, "\n");
+			hexdump(io->outs, "hashed data", content->sig.info.v4_hashed,
+					content->sig.info.v4_hashlen);
+			hexdump(io->outs, "signer id", content->sig.info.signer_id,
+				sizeof(content->sig.info.signer_id));
 		}
 		from = 0;
 		signer = __ops_getkeybyid(io, data->keyring,
@@ -514,9 +505,8 @@
 				__ops_mem_readfile(data->mem, data->detachname);
 			}
 			if (__ops_get_debug_level(__FILE__)) {
-				(void) fprintf(stderr, "about to check_binary_sig, dump of sig:\n");
-				hexdump(stderr, (const uint8_t *)(const void *)&content->sig,
-					sizeof(content->sig), "");
+				hexdump(stderr, "sig dump", (const uint8_t *)(const void *)&content->sig,
+					sizeof(content->sig));
 			}
 			valid = check_binary_sig(__ops_mem_data(data->mem),
 					__ops_mem_len(data->mem),
Index: src/crypto/external/bsd/netpgp/dist/src/lib/version.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.35 src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.36
--- src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.35	Wed Jun  2 03:15:14 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/version.h	Fri Jun 25 03:37:28 2010
@@ -58,7 +58,7 @@
 #endif
 
 /* development versions have .99 suffix */
-#define NETPGP_BASE_VERSION	"3.99.4"
+#define NETPGP_BASE_VERSION	"3.99.5"
 
 #define NETPGP_VERSION_CAT(a, b)	"NetPGP portable " a "/[" b "]"
 #define NETPGP_VERSION_STRING \

Index: src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.11 src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.12
--- src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1:1.11	Tue Jun  1 05:55:56 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.1	Fri Jun 25 03:37:28 2010
@@ -1,4 +1,4 @@
-.\" $NetBSD: netpgpkeys.1,v 1.11 2010/06/01 05:55:56 agc Exp $
+.\" $NetBSD: netpgpkeys.1,v 1.12 2010/06/25 03:37:28 agc Exp $
 .\"
 .\" Copyright (c) 2009, 2010 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -65,6 +65,8 @@
 .Pp
 .Op Fl Fl coredumps
 .br
+.Op Fl Fl hash Ns = Ns Ar hash-algorithm
+.br
 .Op Fl Fl homedir Ns = Ns Ar home-directory
 .br
 .Op Fl Fl keyring Ns = Ns Ar keyring
@@ -190,6 +192,13 @@
 In addition to one of the preceding commands, a number of qualifiers
 or options may be given.
 .Bl -tag -width Ar
+.It Fl Fl hash Ar hash-algorithm
+Specify the hash algorithm which is used during fingerprint calculation.
+For reference, at the present time,
+.Xr ssh-keygen 1
+uses
+.Dq MD5
+for its fingerprint values.
 .It Fl Fl homedir Ar home-directory
 Keyrings are normally located, for historical reasons, within
 the user's home directory in a subdirectory called
@@ -304,11 +313,14 @@
 or 2 if any other error occurs.
 .Sh EXAMPLES
 .Bd -literal
-% netpgpkeys --ssh-keys --sshkeyfile=/etc/ssh/ssh_host_rsa_key.pub --list-keys
+% /usr/bin/netpgpkeys --ssh-keys --sshkeyfile=/etc/ssh/ssh_host_rsa_key.pub --list-keys --hash=md5
 1 key
-pub 1024/RSA (Encrypt or Sign) 040180871e00404a 2008-08-11
-Key fingerprint: c4aa b385 4796 e6ce 606c f0c2 0401 8087 1e00 404a
-uid              netbsd-vm1.crowthorne.alistaircrooks.co.uk (/etc/ssh/ssh_host_rsa_key.pub) \*[lt]r...@netbsd-vm1.crowthorne.alistaircrooks.co.uk\*[gt]
+pub 1024/RSA (Encrypt or Sign) fcdd1c608bef4c4b 2008-08-11 
+Key fingerprint: e935 902d ebf1 76ba fcdd 1c60 8bef 4c4b 
+uid              osx-vm1.crowthorne.alistaircrooks.co.uk (/etc/ssh/ssh_host_rsa_key.pub) <r...@osx-vm1.crowthorne.alistaircrooks.co.uk>
+
+% ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub 
+1024 e9:35:90:2d:eb:f1:76:ba:fc:dd:1c:60:8b:ef:4c:4b /etc/ssh/ssh_host_rsa_key.pub (RSA)
 %
 .Ed
 .Pp
@@ -338,6 +350,7 @@
 .Sh SEE ALSO
 .Xr netpgp 1 ,
 .Xr ssh 1 ,
+.Xr ssh-keygen 1 ,
 .Xr getpass 3 ,
 .\" .Xr libbz2 3 ,
 .Xr libnetpgp 3 ,

Index: src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.12 src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.13
--- src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.12	Sun May 16 06:48:53 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c	Fri Jun 25 03:37:28 2010
@@ -46,6 +46,8 @@
  */
 #define DEFAULT_NUMBITS 2048
 
+#define DEFAULT_HASH_ALG "SHA256"
+
 static const char *usage =
 	" --help OR\n"
 	"\t--export-keys [options] OR\n"
@@ -58,6 +60,7 @@
 	"\t--version\n"
 	"where options are:\n"
 	"\t[--coredumps] AND/OR\n"
+	"\t[--hash=<hash alg>] AND/OR\n"
 	"\t[--homedir=<homedir>] AND/OR\n"
 	"\t[--keyring=<keyring>] AND/OR\n"
 	"\t[--userid=<userid>] AND/OR\n"
@@ -81,6 +84,7 @@
 	USERID,
 	HOMEDIR,
 	NUMBITS,
+	HASH_ALG,
 	VERBOSE,
 	COREDUMPS,
 	PASSWDFD,
@@ -111,6 +115,9 @@
 	{"coredumps",	no_argument, 		NULL,	COREDUMPS},
 	{"keyring",	required_argument, 	NULL,	KEYRING},
 	{"userid",	required_argument, 	NULL,	USERID},
+	{"hash-alg",	required_argument, 	NULL,	HASH_ALG},
+	{"hash",	required_argument, 	NULL,	HASH_ALG},
+	{"algorithm",	required_argument, 	NULL,	HASH_ALG},
 	{"home",	required_argument, 	NULL,	HOMEDIR},
 	{"homedir",	required_argument, 	NULL,	HOMEDIR},
 	{"numbits",	required_argument, 	NULL,	NUMBITS},
@@ -206,6 +213,7 @@
 	netpgp_set_homedir(&netpgp, getenv("HOME"), "/.gnupg", 1);
 	netpgp_setvar(&netpgp, "sshkeydir", "/etc/ssh");
 	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) {
@@ -275,6 +283,14 @@
 			}
 			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,

Reply via email to