Module Name:    src
Committed By:   agc
Date:           Fri Jul  9 05:35:35 UTC 2010

Modified Files:
        src/crypto/external/bsd/netpgp/dist/src/lib: create.c crypto.c
            keyring.c misc.c netpgp.c openssl_crypto.c packet-parse.c
            packet-print.c packet.h reader.c readerwriter.h ssh2pgp.c version.h
            writer.c

Log Message:
Changes to 3.99.7/20100701

+ recognise ascii-armoured encrypted messages properly, in memory and
  in files
+ print error message and exit for now when trying to encrypt with a DSA key
+ fix bug reported by dyoung when trying to print out the encryption key
  fingerprint


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 \
    src/crypto/external/bsd/netpgp/dist/src/lib/create.c
cvs rdiff -u -r1.24 -r1.25 \
    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.38 -r1.39 \
    src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
cvs rdiff -u -r1.32 -r1.33 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c
cvs rdiff -u -r1.63 -r1.64 \
    src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
cvs rdiff -u -r1.37 -r1.38 \
    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.23 -r1.24 \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet.h
cvs rdiff -u -r1.10 -r1.11 \
    src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h
cvs rdiff -u -r1.13 -r1.14 \
    src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
cvs rdiff -u -r1.36 -r1.37 \
    src/crypto/external/bsd/netpgp/dist/src/lib/version.h

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/create.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.30 src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.31
--- src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.30	Wed Jun 30 15:18:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/create.c	Fri Jul  9 05:35:34 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.30 2010/06/30 15:18:10 agc Exp $");
+__RCSID("$NetBSD: create.c,v 1.31 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -453,10 +453,10 @@
 			return 0;
 		}
 		break;
-
-		/* case OPS_PKA_ELGAMAL: */
-		/* return __ops_write_mpi(output, key->key.elgamal.x); */
-
+	case OPS_PKA_DSA:
+		return __ops_write_mpi(output, key->key.dsa.x);
+	case OPS_PKA_ELGAMAL:
+		return __ops_write_mpi(output, key->key.elgamal.x);
 	default:
 		return 0;
 	}
@@ -892,8 +892,14 @@
 	unsigned        i;
 
 	/* implementation of EME-PKCS1-v1_5-ENCODE, as defined in OpenPGP RFC */
-
-	if (pubkey->alg != OPS_PKA_RSA) {
+	switch (pubkey->alg) {
+	case OPS_PKA_RSA:
+		break;
+	case OPS_PKA_DSA:
+	case OPS_PKA_ELGAMAL:
+		(void) fprintf(stderr, "encode_m_buf: DSA/Elgamal encryption not implemented yet\n");
+		break;
+	default:
 		(void) fprintf(stderr, "encode_m_buf: pubkey algorithm\n");
 		return 0;
 	}
@@ -986,7 +992,12 @@
 	if (__ops_get_debug_level(__FILE__)) {
 		hexdump(stderr, "Encrypting for RSA keyid", key->key_id, sizeof(sesskey->key_id));
 	}
-	if (key->key.pubkey.alg != OPS_PKA_RSA) {
+	switch (key->key.pubkey.alg) {
+	case OPS_PKA_RSA:
+	case OPS_PKA_DSA:
+	case OPS_PKA_ELGAMAL:
+		break;
+	default:
 		(void) fprintf(stderr,
 			"__ops_create_pk_sesskey: bad pubkey algorithm\n");
 		free(encoded_m_buf);
@@ -1013,11 +1024,24 @@
 	encode_m_buf(unencoded_m_buf, SZ_UNENCODED_M_BUF, pubkey, encoded_m_buf);
 
 	/* and encrypt it */
-	if (!__ops_rsa_encrypt_mpi(encoded_m_buf, sz_encoded_m_buf, pubkey,
-			&sesskey->params)) {
+	switch (key->key.pubkey.alg) {
+	case OPS_PKA_RSA:
+		if (!__ops_rsa_encrypt_mpi(encoded_m_buf, sz_encoded_m_buf, pubkey,
+				&sesskey->params)) {
+			free(encoded_m_buf);
+			free(sesskey);
+			return NULL;
+		}
+		break;
+	case OPS_PKA_DSA:
+	case OPS_PKA_ELGAMAL:
+		(void) fprintf(stderr, "DSA/Elgamal encryption not supported yet\n");
 		free(encoded_m_buf);
 		free(sesskey);
 		return NULL;
+	default:
+		/* will not get here - for lint only */
+		break;
 	}
 	free(encoded_m_buf);
 	return sesskey;
@@ -1039,20 +1063,26 @@
 			"__ops_write_pk_sesskey: NULL pksk\n");
 		return 0;
 	}
-	if (pksk->alg != OPS_PKA_RSA) {
+	switch (pksk->alg) {
+	case OPS_PKA_RSA:
+		return __ops_write_ptag(output, OPS_PTAG_CT_PK_SESSION_KEY) &&
+			__ops_write_length(output, (unsigned)(1 + 8 + 1 +
+				BN_num_bytes(pksk->params.rsa.encrypted_m) + 2)) &&
+			__ops_write_scalar(output, (unsigned)pksk->version, 1) &&
+			__ops_write(output, pksk->key_id, 8) &&
+			__ops_write_scalar(output, (unsigned)pksk->alg, 1) &&
+			__ops_write_mpi(output, pksk->params.rsa.encrypted_m)
+			/* ??	&& __ops_write_scalar(output, 0, 2); */
+			;
+	case OPS_PKA_DSA:
+	case OPS_PKA_ELGAMAL:
+		(void) fprintf(stderr, "__ops_write_pk_sesskey: DSA/Elgamal encryption not implemented yet\n");
+		return 0;
+	default:
 		(void) fprintf(stderr,
 			"__ops_write_pk_sesskey: bad algorithm\n");
 		return 0;
 	}
-	return __ops_write_ptag(output, OPS_PTAG_CT_PK_SESSION_KEY) &&
-		__ops_write_length(output, (unsigned)(1 + 8 + 1 +
-			BN_num_bytes(pksk->params.rsa.encrypted_m) + 2)) &&
-		__ops_write_scalar(output, (unsigned)pksk->version, 1) &&
-		__ops_write(output, pksk->key_id, 8) &&
-		__ops_write_scalar(output, (unsigned)pksk->alg, 1) &&
-		__ops_write_mpi(output, pksk->params.rsa.encrypted_m)
-	/* ??	&& __ops_write_scalar(output, 0, 2); */
-		;
 }
 
 /**

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.24 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.25
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.24	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c	Fri Jul  9 05:35:34 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.24 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: crypto.c,v 1.25 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -89,11 +89,11 @@
 				const BIGNUM *encmpi,
 				const __ops_seckey_t *seckey)
 {
-	uint8_t   encmpibuf[NETPGP_BUFSIZ];
-	uint8_t   mpibuf[NETPGP_BUFSIZ];
 	unsigned        mpisize;
-	int             n;
+	uint8_t		encmpibuf[NETPGP_BUFSIZ];
+	uint8_t		mpibuf[NETPGP_BUFSIZ];
 	int             i;
+	int             n;
 
 	mpisize = (unsigned)BN_num_bytes(encmpi);
 	/* MPI can't be more than 65,536 */
@@ -103,54 +103,52 @@
 	}
 	BN_bn2bin(encmpi, encmpibuf);
 
-	if (seckey->pubkey.alg != OPS_PKA_RSA) {
+	switch (seckey->pubkey.alg) {
+	case OPS_PKA_RSA:
+		if (__ops_get_debug_level(__FILE__)) {
+			hexdump(stderr, "encrypted", encmpibuf, 16);
+		}
+		n = __ops_rsa_private_decrypt(mpibuf, encmpibuf,
+					(unsigned)(BN_num_bits(encmpi) + 7) / 8,
+					&seckey->key.rsa, &seckey->pubkey.key.rsa);
+		if (n == -1) {
+			(void) fprintf(stderr, "ops_rsa_private_decrypt failure\n");
+			return -1;
+		}
+		if (__ops_get_debug_level(__FILE__)) {
+			hexdump(stderr, "decrypted", mpibuf, 16);
+		}
+		if (n <= 0) {
+			return -1;
+		}
+		/* Decode EME-PKCS1_V1_5 (RFC 2437). */
+		if (mpibuf[0] != 0 || mpibuf[1] != 2) {
+			return -1;
+		}
+		/* Skip the random bytes. */
+		for (i = 2; i < n && mpibuf[i]; ++i) {
+		}
+		if (i == n || i < 10) {
+			return -1;
+		}
+		/* Skip the zero */
+		i += 1;
+		/* this is the unencoded m buf */
+		if ((unsigned) (n - i) <= buflen) {
+			(void) memcpy(buf, mpibuf + i, (unsigned)(n - i)); /* XXX - Flexelint */
+		}
+		if (__ops_get_debug_level(__FILE__)) {
+			hexdump(stderr, "decoded m", buf, (size_t)(n - i));
+		}
+		return n - i;
+	case OPS_PKA_DSA:
+	case OPS_PKA_ELGAMAL:
+		(void) fprintf(stderr, "XXX - no support for DSA/Elgamal yet\n");
+		return 0;
+	default:
 		(void) fprintf(stderr, "pubkey algorithm wrong\n");
 		return -1;
 	}
-
-	if (__ops_get_debug_level(__FILE__)) {
-		hexdump(stderr, "encrypted", encmpibuf, 16);
-	}
-	n = __ops_rsa_private_decrypt(mpibuf, encmpibuf,
-				(unsigned)(BN_num_bits(encmpi) + 7) / 8,
-				&seckey->key.rsa, &seckey->pubkey.key.rsa);
-	if (n == -1) {
-		(void) fprintf(stderr, "ops_rsa_private_decrypt failure\n");
-		return -1;
-	}
-
-	if (__ops_get_debug_level(__FILE__)) {
-		hexdump(stderr, "decrypted", mpibuf, 16);
-	}
-	if (n <= 0) {
-		return -1;
-	}
-
-	/* Decode EME-PKCS1_V1_5 (RFC 2437). */
-	if (mpibuf[0] != 0 || mpibuf[1] != 2) {
-		return -1;
-	}
-
-	/* Skip the random bytes. */
-	for (i = 2; i < n && mpibuf[i]; ++i) {
-	}
-
-	if (i == n || i < 10) {
-		return -1;
-	}
-
-	/* Skip the zero */
-	i += 1;
-
-	/* this is the unencoded m buf */
-	if ((unsigned) (n - i) <= buflen) {
-		(void) memcpy(buf, mpibuf + i, (unsigned)(n - i)); /* XXX - Flexelint */
-	}
-
-	if (__ops_get_debug_level(__FILE__)) {
-		hexdump(stderr, "decoded m", buf, (size_t)(n - i));
-	}
-	return n - i;
 }
 
 /**
@@ -215,16 +213,16 @@
 		break;
 
 	case OPS_PTAG_CT_PK_SESSION_KEY:
-		return pk_sesskey_cb(pkt, cbinfo);
+		return __ops_pk_sesskey_cb(pkt, cbinfo);
 
 	case OPS_GET_SECKEY:
-		return get_seckey_cb(pkt, cbinfo);
+		return __ops_get_seckey_cb(pkt, cbinfo);
 
 	case OPS_GET_PASSPHRASE:
 		return cbinfo->cryptinfo.getpassphrase(pkt, cbinfo);
 
 	case OPS_PTAG_CT_LITDATA_BODY:
-		return litdata_cb(pkt, cbinfo);
+		return __ops_litdata_cb(pkt, cbinfo);
 
 	case OPS_PTAG_CT_ARMOUR_HEADER:
 	case OPS_PTAG_CT_ARMOUR_TRAILER:
@@ -291,7 +289,10 @@
 	}
 
 	/* Push the encrypted writer */
-	__ops_push_enc_se_ip(output, pubkey);
+	if (!__ops_push_enc_se_ip(output, pubkey)) {
+		__ops_memory_free(inmem);
+		return 0;
+	}
 
 	/* This does the writing */
 	__ops_write(output, __ops_mem_data(inmem), __ops_mem_len(inmem));
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.24 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.24	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c	Fri Jul  9 05:35:34 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.24 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: openssl_crypto.c,v 1.25 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_DSA_H
@@ -834,9 +834,8 @@
 	__ops_push_checksum_writer(output, seckey);
 
 	switch (seckey->pubkey.alg) {
-		/* case OPS_PKA_DSA: */
-		/* return __ops_write_mpi(output, key->key.dsa.x); */
-
+	case OPS_PKA_DSA:
+		return __ops_write_mpi(output, seckey->key.dsa.x);
 	case OPS_PKA_RSA:
 	case OPS_PKA_RSA_ENCRYPT_ONLY:
 	case OPS_PKA_RSA_SIGN_ONLY:
@@ -847,9 +846,8 @@
 			return 0;
 		}
 		break;
-
-		/* case OPS_PKA_ELGAMAL: */
-		/* return __ops_write_mpi(output, key->key.elgamal.x); */
+	case OPS_PKA_ELGAMAL:
+		return __ops_write_mpi(output, seckey->key.elgamal.x);
 
 	default:
 		(void) fprintf(stderr, "Bad seckey->pubkey.alg\n");
Index: src/crypto/external/bsd/netpgp/dist/src/lib/writer.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.24 src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.25
--- src/crypto/external/bsd/netpgp/dist/src/lib/writer.c:1.24	Fri Jun 25 03:37:28 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/writer.c	Fri Jul  9 05:35:35 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.24 2010/06/25 03:37:28 agc Exp $");
+__RCSID("$NetBSD: writer.c,v 1.25 2010/07/09 05:35:35 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -1025,7 +1025,7 @@
 \ingroup Core_WritersNext
 \brief Push Encrypted SE IP Writer onto stack
 */
-void 
+int 
 __ops_push_enc_se_ip(__ops_output_t *output, const __ops_key_t *pubkey)
 {
 	__ops_pk_sesskey_t *encrypted_pk_sesskey;
@@ -1035,25 +1035,28 @@
 
 	if ((se_ip = calloc(1, sizeof(*se_ip))) == NULL) {
 		(void) fprintf(stderr, "__ops_push_enc_se_ip: bad alloc\n");
-		return;
+		return 0;
 	}
 
 	/* Create and write encrypted PK session key */
-	encrypted_pk_sesskey = __ops_create_pk_sesskey(pubkey);
+	if ((encrypted_pk_sesskey = __ops_create_pk_sesskey(pubkey)) == NULL) {
+		(void) fprintf(stderr, "__ops_push_enc_se_ip: null pk sesskey\n");
+		return 0;
+	}
 	__ops_write_pk_sesskey(output, encrypted_pk_sesskey);
 
 	/* Setup the se_ip */
 	if ((encrypted = calloc(1, sizeof(*encrypted))) == NULL) {
 		free(se_ip);
 		(void) fprintf(stderr, "__ops_push_enc_se_ip: bad alloc\n");
-		return;
+		return 0;
 	}
 	__ops_crypt_any(encrypted, encrypted_pk_sesskey->symm_alg);
 	if ((iv = calloc(1, encrypted->blocksize)) == NULL) {
 		free(se_ip);
 		free(encrypted);
 		(void) fprintf(stderr, "__ops_push_enc_se_ip: bad alloc\n");
-		return;
+		return 0;
 	}
 	encrypted->set_iv(encrypted, iv);
 	encrypted->set_crypt_key(encrypted, &encrypted_pk_sesskey->key[0]);
@@ -1067,6 +1070,7 @@
 	/* tidy up */
 	free(encrypted_pk_sesskey);
 	free(iv);
+	return 1;
 }
 
 static unsigned 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.38 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.39
--- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.38	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c	Fri Jul  9 05:35:34 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.38 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: keyring.c,v 1.39 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #ifdef HAVE_FCNTL_H
@@ -377,12 +377,13 @@
 __ops_is_key_supported(const __ops_key_t *key)
 {
 	if (key->type == OPS_PTAG_CT_PUBLIC_KEY) {
-		if (key->key.pubkey.alg == OPS_PKA_RSA) {
-			return 1;
-		}
-	} else if (key->type == OPS_PTAG_CT_PUBLIC_KEY) {
-		if (key->key.pubkey.alg == OPS_PKA_DSA) {
+		switch(key->key.pubkey.alg) {
+		case OPS_PKA_RSA:
+		case OPS_PKA_DSA:
+		case OPS_PKA_ELGAMAL:
 			return 1;
+		default:
+			break;
 		}
 	}
 	return 0;
@@ -1023,6 +1024,9 @@
 	__ops_key_t	*key;
 	time_t		 duration;
 
+	if (__ops_get_debug_level(__FILE__)) {
+		fprintf(stderr, "__ops_add_to_pubring\n");
+	}
 	EXPAND_ARRAY(keyring, key);
 	key = &keyring->keys[keyring->keyc++];
 	duration = key->key.pubkey.duration;
@@ -1042,6 +1046,17 @@
 	const __ops_pubkey_t	*pubkey;
 	__ops_key_t		*key;
 
+	if (__ops_get_debug_level(__FILE__)) {
+		fprintf(stderr, "__ops_add_to_secring\n");
+	}
+	if (keyring->keyc > 0) {
+		key = &keyring->keys[keyring->keyc - 1];
+		if (__ops_get_debug_level(__FILE__) &&
+		    key->key.pubkey.alg == OPS_PKA_DSA &&
+		    seckey->pubkey.alg == OPS_PKA_ELGAMAL) {
+			fprintf(stderr, "__ops_add_to_secring: found elgamal seckey\n");
+		}
+	}
 	EXPAND_ARRAY(keyring, key);
 	key = &keyring->keys[keyring->keyc++];
 	(void) memset(key, 0x0, sizeof(*key));
@@ -1050,6 +1065,9 @@
 	__ops_fingerprint(&key->fingerprint, pubkey, keyring->hashtype);
 	key->type = OPS_PTAG_CT_SECRET_KEY;
 	key->key.seckey = *seckey;
+	if (__ops_get_debug_level(__FILE__)) {
+		fprintf(stderr, "__ops_add_to_secring: keyc %u\n", keyring->keyc);
+	}
 	return 1;
 }
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/misc.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.32 src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.33
--- src/crypto/external/bsd/netpgp/dist/src/lib/misc.c:1.32	Fri Jun 25 18:30:16 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/misc.c	Fri Jul  9 05:35:34 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.32 2010/06/25 18:30:16 agc Exp $");
+__RCSID("$NetBSD: misc.c,v 1.33 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -111,21 +111,18 @@
 	__ops_keyring_t		*keyring;
 	accumulate_t		*accumulate;
 
+	if (__ops_get_debug_level(__FILE__)) {
+		(void) fprintf(stderr, "accumulate callback: packet tag %u\n", pkt->tag);
+	}
 	accumulate = __ops_callback_arg(cbinfo);
 	keyring = accumulate->keyring;
 	switch (pkt->tag) {
 	case OPS_PTAG_CT_PUBLIC_KEY:
+		__ops_add_to_pubring(keyring, &content->pubkey);
+		return OPS_KEEP_MEMORY;
 	case OPS_PTAG_CT_SECRET_KEY:
 	case OPS_PTAG_CT_ENCRYPTED_SECRET_KEY:
-		if (__ops_get_debug_level(__FILE__)) {
-			(void) fprintf(stderr, "Creating key %u - tag %u\n",
-				keyring->keyc, pkt->tag);
-		}
-		if (pkt->tag == OPS_PTAG_CT_PUBLIC_KEY) {
-			__ops_add_to_pubring(keyring, &content->pubkey);
-		} else {
-			__ops_add_to_secring(keyring, &content->seckey);
-		}
+		__ops_add_to_secring(keyring, &content->seckey);
 		return OPS_KEEP_MEMORY;
 	case OPS_PTAG_CT_USER_ID:
 		if (__ops_get_debug_level(__FILE__)) {
@@ -133,14 +130,12 @@
 					content->userid,
 					keyring->keyc - 1);
 		}
-		if (keyring->keyc > 0) {
-			__ops_add_userid(&keyring->keys[keyring->keyc - 1],
-						content->userid);
-			return OPS_KEEP_MEMORY;
+		if (keyring->keyc == 0) {
+			OPS_ERROR(cbinfo->errors, OPS_E_P_NO_USERID, "No userid found");
+		} else {
+			__ops_add_userid(&keyring->keys[keyring->keyc - 1], content->userid);
 		}
-		OPS_ERROR(cbinfo->errors, OPS_E_P_NO_USERID, "No userid found");
 		return OPS_KEEP_MEMORY;
-
 	case OPS_PARSER_PACKET_END:
 		if (keyring->keyc > 0) {
 			__ops_add_subpacket(&keyring->keys[keyring->keyc - 1],
@@ -148,20 +143,16 @@
 			return OPS_KEEP_MEMORY;
 		}
 		return OPS_RELEASE_MEMORY;
-
 	case OPS_PARSER_ERROR:
 		(void) fprintf(stderr, "Error: %s\n", content->error);
 		return OPS_FINISHED;
-
 	case OPS_PARSER_ERRCODE:
 		(void) fprintf(stderr, "parse error: %s\n",
 				__ops_errcode(content->errcode.errcode));
 		break;
-
 	default:
 		break;
 	}
-
 	/* XXX: we now exclude so many things, we should either drop this or */
 	/* do something to pass on copies of the stuff we keep */
 	return __ops_stacked_callback(pkt, cbinfo);
@@ -501,7 +492,7 @@
 				"__ops_fingerprint: bad md5 alloc\n");
 			return 0;
 		}
-		type = (key->alg == OPS_PKA_RSA) ? "ssh-rsa" : "ssh-dsa";
+		type = (key->alg == OPS_PKA_RSA) ? "ssh-rsa" : "ssh-dss";
 		hash_string(&hash, (const uint8_t *)(const void *)type, strlen(type));
 		switch(key->alg) {
 		case OPS_PKA_RSA:
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.32 src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.33
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c:1.32	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-print.c	Fri Jul  9 05:35:34 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.32 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: packet-print.c,v 1.33 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #include <string.h>
@@ -411,7 +411,7 @@
 	int			 n;
 	int			 r;
 
-	if (key->revoked) {
+	if (key == NULL || key->revoked) {
 		return -1;
 	}
 	now = time(NULL);

Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.63 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.64
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.63	Thu Jul  1 04:27:21 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c	Fri Jul  9 05:35:34 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.63 2010/07/01 04:27:21 agc Exp $");
+__RCSID("$NetBSD: netpgp.c,v 1.64 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -245,7 +245,7 @@
 
 /* read keys from ssh key files */
 static int
-readsshkeys(netpgp_t *netpgp, char *homedir)
+readsshkeys(netpgp_t *netpgp, char *homedir, const char *needseckey)
 {
 	__ops_keyring_t	*pubring;
 	__ops_keyring_t	*secring;
@@ -285,25 +285,26 @@
 	} else {
 		__ops_append_keyring(netpgp->pubring, pubring);
 	}
-	netpgp_setvar(netpgp, "sshpubfile", filename);
-	/* try to take the ".pub" off the end */
-	if (filename == f) {
-		f[strlen(f) - 4] = 0x0;
-	} else {
-		(void) snprintf(f, sizeof(f), "%.*s",
-				(int)strlen(filename) - 4, filename);
-		filename = f;
-	}
-	if ((secring = calloc(1, sizeof(*secring))) == NULL) {
-		(void) fprintf(stderr, "readsshkeys: bad alloc\n");
-		return 0;
-	}
-	if (__ops_ssh2_readkeys(netpgp->io, pubring, secring, NULL, filename, hashtype)) {
+	if (needseckey) {
+		netpgp_setvar(netpgp, "sshpubfile", filename);
+		/* try to take the ".pub" off the end */
+		if (filename == f) {
+			f[strlen(f) - 4] = 0x0;
+		} else {
+			(void) snprintf(f, sizeof(f), "%.*s",
+					(int)strlen(filename) - 4, filename);
+			filename = f;
+		}
+		if ((secring = calloc(1, sizeof(*secring))) == NULL) {
+			(void) fprintf(stderr, "readsshkeys: bad alloc\n");
+			return 0;
+		}
+		if (!__ops_ssh2_readkeys(netpgp->io, pubring, secring, NULL, filename, hashtype)) {
+			(void) fprintf(stderr, "readsshkeys: can't read sec %s\n", filename);
+			return 0;
+		}
 		netpgp->secring = secring;
 		netpgp_setvar(netpgp, "sshsecfile", filename);
-	} else {
-		(void) fprintf(stderr, "readsshkeys: can't read sec %s (%d)\n",
-				filename, errno);
 	}
 	return 1;
 }
@@ -439,21 +440,25 @@
 
 /* return 1 if the file contains ascii-armoured text */
 static unsigned
-isarmoured(__ops_io_t *io, const char *f, const char *text)
+isarmoured(__ops_io_t *io, const char *f, const void *memory, const char *text)
 {
 	unsigned	 armoured;
 	FILE		*fp;
 	char	 	 buf[BUFSIZ];
 
 	armoured = 0;
-	if ((fp = fopen(f, "r")) == NULL) {
-		(void) fprintf(io->errs, "isarmoured: can't open '%s'\n", f);
-		return 0;
-	}
-	if (fgets(buf, sizeof(buf), fp) != NULL) {
-		armoured = (strncmp(buf, text, strlen(text)) == 0);
+	if (f) {
+		if ((fp = fopen(f, "r")) == NULL) {
+			(void) fprintf(io->errs, "isarmoured: can't open '%s'\n", f);
+			return 0;
+		}
+		if (fgets(buf, sizeof(buf), fp) != NULL) {
+			armoured = (strncmp(buf, text, strlen(text)) == 0);
+		}
+		(void) fclose(fp);
+	} else {
+		armoured = (strncmp(memory, text, strlen(text)) == 0);
 	}
-	(void) fclose(fp);
 	return armoured;
 }
 
@@ -563,8 +568,8 @@
 		}
 	} else {
 		last = (netpgp->pubring != NULL);
-		if (!readsshkeys(netpgp, homedir)) {
-			(void) fprintf(io->errs, "Can't read ssh pub key\n");
+		if (!readsshkeys(netpgp, homedir, netpgp_getvar(netpgp, "need userid"))) {
+			(void) fprintf(io->errs, "Can't read ssh keys\n");
 			return 0;
 		}
 		if ((userid = netpgp_getvar(netpgp, "userid")) == NULL) {
@@ -769,31 +774,17 @@
 int
 netpgp_import_key(netpgp_t *netpgp, char *f)
 {
-#if 0
-	__ops_keyring_t	*keyring;
-#endif
 	__ops_io_t	*io;
 	unsigned	 realarmor;
-#if 0
-	char		 ringfile[MAXPATHLEN];
-#endif
 	int		 done;
 
 	io = netpgp->io;
-	realarmor = isarmoured(io, f, IMPORT_ARMOR_HEAD);
+	realarmor = isarmoured(io, f, NULL, IMPORT_ARMOR_HEAD);
 	done = __ops_keyring_fileread(netpgp->pubring, realarmor, f);
 	if (!done) {
 		(void) fprintf(io->errs, "Cannot import key from file %s\n", f);
 		return 0;
 	}
-#if 0
-	keyring = netpgp->pubring;
-	(void) snprintf(ringfile, sizeof(ringfile), "%s/pubring.gpg", netpgp_getvar(netpgp, "homedir"));
-	if (!appendkey(io, &keyring->keys[keyring->keyc - 1], ringfile)) {
-		(void) fprintf(io->errs, "Cannot append imported key to pubring %s\n", ringfile);
-		return 0;
-	}
-#endif
 	return __ops_keyring_list(io, netpgp->pubring, 0);
 }
 
@@ -900,7 +891,7 @@
 					overwrite);
 }
 
-#define ARMOR_HEAD	"-----BEGIN PGP MESSAGE-----\r\n"
+#define ARMOR_HEAD	"-----BEGIN PGP MESSAGE-----"
 
 /* decrypt a file */
 int
@@ -917,7 +908,7 @@
 			"netpgp_decrypt_file: no filename specified\n");
 		return 0;
 	}
-	realarmor = isarmoured(io, f, ARMOR_HEAD);
+	realarmor = isarmoured(io, f, NULL, ARMOR_HEAD);
 	return __ops_decrypt_file(netpgp->io, f, out, netpgp->secring,
 				netpgp->pubring,
 				realarmor, overwrite,
@@ -1019,7 +1010,7 @@
 			"netpgp_verify_file: no filename specified\n");
 		return 0;
 	}
-	realarmor = isarmoured(io, in, ARMOR_SIG_HEAD);
+	realarmor = isarmoured(io, in, NULL, ARMOR_SIG_HEAD);
 	if (__ops_validate_file(io, &result, in, out, (const int)realarmor, netpgp->pubring)) {
 		resultp(io, in, &result, netpgp->pubring);
 		return 1;
@@ -1212,20 +1203,20 @@
 {
 	__ops_memory_t	*mem;
 	__ops_io_t	*io;
-	unsigned	 realarmor;
+	unsigned	 realarmour;
 	size_t		 m;
 
+	__OPS_USED(armored);
 	io = netpgp->io;
-	realarmor = (unsigned) armored;
 	if (input == NULL) {
 		(void) fprintf(io->errs,
 			"netpgp_decrypt_memory: no memory\n");
 		return 0;
 	}
-	realarmor = (strncmp(input, ARMOR_HEAD, sizeof(ARMOR_HEAD) - 1) == 0);
+	realarmour = isarmoured(io, NULL, input, ARMOR_HEAD);
 	mem = __ops_decrypt_buf(netpgp->io, input, insize, netpgp->secring,
 				netpgp->pubring,
-				realarmor, netpgp->passfp,
+				realarmour, netpgp->passfp,
 				get_passphrase_cb);
 	m = MIN(__ops_mem_len(mem), outsize);
 	(void) memcpy(out, __ops_mem_data(mem), m);

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.37 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.37	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c	Fri Jul  9 05:35:34 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.37 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: packet-parse.c,v 1.38 2010/07/09 05:35:34 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_CAST_H
@@ -2370,6 +2370,9 @@
 		int             keysize;
 		int             n;
 
+		if (__ops_get_debug_level(__FILE__)) {
+			(void) fprintf(stderr, "crypted seckey\n");
+		}
 		blocksize = __ops_block_size(pkt.u.seckey.alg);
 		if (blocksize == 0 || blocksize > OPS_MAX_BLOCK_SIZE) {
 			(void) fprintf(stderr,
@@ -2508,6 +2511,9 @@
 		saved_region = region;
 		region = &encregion;
 	}
+	if (__ops_get_debug_level(__FILE__)) {
+		fprintf(stderr, "parse_seckey: end of crypted passphrase\n");
+	}
 	if (pkt.u.seckey.s2k_usage == OPS_S2KU_ENCRYPTED_AND_HASHED) {
 		pkt.u.seckey.checkhash = calloc(1, OPS_CHECKHASH_SIZE);
 		if (pkt.u.seckey.checkhash == NULL) {
@@ -2519,7 +2525,9 @@
 	} else {
 		__ops_reader_push_sum16(stream);
 	}
-
+	if (__ops_get_debug_level(__FILE__)) {
+		fprintf(stderr, "parse_seckey: checkhash, reading MPIs\n");
+	}
 	switch (pkt.u.seckey.pubkey.alg) {
 	case OPS_PKA_RSA:
 	case OPS_PKA_RSA_ENCRYPT_ONLY:
@@ -2538,6 +2546,13 @@
 		}
 		break;
 
+	case OPS_PKA_ELGAMAL:
+printf("elgamal reading\n");
+		if (!limread_mpi(&pkt.u.seckey.key.elgamal.x, region, stream)) {
+			ret = 0;
+		}
+		break;
+
 	default:
 		OPS_ERROR_2(&stream->errors,
 			OPS_E_ALG_UNSUPPORTED_PUBLIC_KEY_ALG,
Index: src/crypto/external/bsd/netpgp/dist/src/lib/reader.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.37 src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.38
--- src/crypto/external/bsd/netpgp/dist/src/lib/reader.c:1.37	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/reader.c	Fri Jul  9 05:35:35 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.37 2010/06/25 03:37:27 agc Exp $");
+__RCSID("$NetBSD: reader.c,v 1.38 2010/07/09 05:35:35 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -2081,12 +2081,12 @@
 }
 
 __ops_cb_ret_t
-litdata_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
+__ops_litdata_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
 {
 	const __ops_contents_t	*content = &pkt->u;
 
 	if (__ops_get_debug_level(__FILE__)) {
-		printf("litdata_cb: ");
+		printf("__ops_litdata_cb: ");
 		__ops_print_packet(&cbinfo->printstate, pkt);
 	}
 	/* Read data from packet into static buffer */
@@ -2095,7 +2095,7 @@
 		/* if writer enabled, use it */
 		if (cbinfo->output) {
 			if (__ops_get_debug_level(__FILE__)) {
-				printf("litdata_cb: length is %u\n",
+				printf("__ops_litdata_cb: length is %u\n",
 					content->litdata_body.length);
 			}
 			__ops_write(cbinfo->output,
@@ -2116,7 +2116,7 @@
 }
 
 __ops_cb_ret_t
-pk_sesskey_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
+__ops_pk_sesskey_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
 {
 	const __ops_contents_t	*content = &pkt->u;
 	unsigned		 from;
@@ -2134,7 +2134,7 @@
 		}
 		if (!cbinfo->cryptinfo.secring) {
 			(void) fprintf(io->errs,
-				"pk_sesskey_cb: bad keyring\n");
+				"__ops_pk_sesskey_cb: bad keyring\n");
 			return (__ops_cb_ret_t)0;
 		}
 		from = 0;
@@ -2168,7 +2168,7 @@
 */
 
 __ops_cb_ret_t
-get_seckey_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
+__ops_get_seckey_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
 {
 	const __ops_contents_t	*content = &pkt->u;
 	const __ops_seckey_t	*secret;
@@ -2199,9 +2199,12 @@
 			return (__ops_cb_ret_t)0;
 		}
 		keypair = cbinfo->cryptinfo.keydata;
+		if (pubkey == NULL) {
+			pubkey = keypair;
+		}
 		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, "pub", &pubkey->key.pubkey, 0);
 			/* now decrypt key */
 			secret = __ops_decrypt_seckey(keypair, cbinfo->passfp);
 			if (secret == NULL) {

Index: src/crypto/external/bsd/netpgp/dist/src/lib/packet.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.23 src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.24
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet.h:1.23	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet.h	Fri Jul  9 05:35:35 2010
@@ -444,10 +444,16 @@
 	BIGNUM         *x;
 } __ops_dsa_seckey_t;
 
+/** __ops_elgamal_seckey_t */
+typedef struct {
+	BIGNUM         *x;
+} __ops_elgamal_seckey_t;
+
 /** __ops_seckey_union_t */
 typedef union {
 	__ops_rsa_seckey_t rsa;
 	__ops_dsa_seckey_t dsa;
+	__ops_elgamal_seckey_t elgamal;
 } __ops_seckey_union_t;
 
 /** s2k_usage_t

Index: src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h:1.10 src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h:1.11
--- src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h:1.10	Fri Mar  5 16:01:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/readerwriter.h	Fri Jul  9 05:35:35 2010
@@ -75,7 +75,7 @@
 		       const unsigned,
 		       __ops_crypt_t *);
 void __ops_push_enc_crypt(__ops_output_t *, __ops_crypt_t *);
-void __ops_push_enc_se_ip(__ops_output_t *, const __ops_key_t *);
+int __ops_push_enc_se_ip(__ops_output_t *, const __ops_key_t *);
 
 /* Secret Key checksum */
 void __ops_push_checksum_writer(__ops_output_t *, __ops_seckey_t *);
@@ -117,9 +117,9 @@
 unsigned __ops_reader_set_accumulate(__ops_stream_t *, unsigned);
 
 /* useful callbacks */
-__ops_cb_ret_t litdata_cb(const __ops_packet_t *, __ops_cbdata_t *);
-__ops_cb_ret_t pk_sesskey_cb(const __ops_packet_t *, __ops_cbdata_t *);
-__ops_cb_ret_t get_seckey_cb(const __ops_packet_t *, __ops_cbdata_t *);
+__ops_cb_ret_t __ops_litdata_cb(const __ops_packet_t *, __ops_cbdata_t *);
+__ops_cb_ret_t __ops_pk_sesskey_cb(const __ops_packet_t *, __ops_cbdata_t *);
+__ops_cb_ret_t __ops_get_seckey_cb(const __ops_packet_t *, __ops_cbdata_t *);
 
 int __ops_getpassphrase(void *, char *, size_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.13 src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.14
--- src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.13	Fri Jun 25 03:37:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c	Fri Jul  9 05:35:35 2010
@@ -180,6 +180,7 @@
 
 static str_t	pkatypes[] = {
 	{	"ssh-rsa",	7,	OPS_PKA_RSA	},
+	{	"ssh-dss",	7,	OPS_PKA_DSA	},
 	{	"ssh-dsa",	7,	OPS_PKA_DSA	},
 	{	NULL,		0,	0		}
 };
@@ -435,7 +436,10 @@
 		if (__ops_get_debug_level(__FILE__)) {
 			(void) fprintf(io->errs, "__ops_ssh2_readkeys: pubfile '%s'\n", pubfile);
 		}
-		__ops_ssh2pubkey(io, pubfile, &key, hashtype);
+		if (!__ops_ssh2pubkey(io, pubfile, &key, hashtype)) {
+			(void) fprintf(io->errs, "__ops_ssh2_readkeys: can't read pubkeys '%s'\n", pubfile);
+			return 0;
+		}
 		EXPAND_ARRAY(pubring, key);
 		pubkey = &pubring->keys[pubring->keyc++];
 		(void) memcpy(pubkey, &key, sizeof(key));
@@ -448,7 +452,10 @@
 		if (pubkey == NULL) {
 			pubkey = &pubring->keys[0];
 		}
-		(void) __ops_ssh2seckey(io, secfile, &key, &pubkey->key.pubkey, hashtype);
+		if (!__ops_ssh2seckey(io, secfile, &key, &pubkey->key.pubkey, hashtype)) {
+			(void) fprintf(io->errs, "__ops_ssh2_readkeys: can't read seckeys '%s'\n", secfile);
+			return 0;
+		}
 		EXPAND_ARRAY(secring, key);
 		seckey = &secring->keys[secring->keyc++];
 		(void) memcpy(seckey, &key, sizeof(key));

Index: src/crypto/external/bsd/netpgp/dist/src/lib/version.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.36 src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.37
--- src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.36	Fri Jun 25 03:37:28 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/version.h	Fri Jul  9 05:35:35 2010
@@ -58,7 +58,7 @@
 #endif
 
 /* development versions have .99 suffix */
-#define NETPGP_BASE_VERSION	"3.99.5"
+#define NETPGP_BASE_VERSION	"3.99.7"
 
 #define NETPGP_VERSION_CAT(a, b)	"NetPGP portable " a "/[" b "]"
 #define NETPGP_VERSION_STRING \

Reply via email to