Module Name:    src
Committed By:   agc
Date:           Tue Dec 22 06:03:25 UTC 2009

Modified Files:
        src/crypto/external/bsd/netpgp/dist: TODO configure configure.ac
        src/crypto/external/bsd/netpgp/dist/include: netpgp.h
        src/crypto/external/bsd/netpgp/dist/src/lib: Makefile.in crypto.c
            crypto.h libnetpgp.3 netpgp.c signature.c ssh2pgp.c validate.c
            validate.h version.h
        src/crypto/external/bsd/netpgp/dist/src/netpgp: Makefile netpgp.1
            netpgp.c
        src/crypto/external/bsd/netpgp/dist/src/netpgpverify: Makefile
        src/crypto/external/bsd/netpgp/lib: config.h

Log Message:
Netpgp changes to 1.99.15/20091221

+ some ssh host keys do not have the username of the generator included
  in the key itself. If there is no username in there, create one.
+ added netpgp_encrypt_memory() and netpgp_decrypt_memory()
+ overhaul netpgp(1) to work with stdin/stdout if no filenames specified:

% netpgp --encrypt < a | netpgp --decrypt > b
netpgp: default key set to "C0596823"
netpgp: default key set to "C0596823"
pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
netpgp passphrase:
% diff a b
% ls -al a b
-rw-r--r--  1 agc  agc  15243 Dec 20 08:55 a
-rw-r--r--  1 agc  agc  15243 Dec 21 17:15 b
%

% netpgp --sign < a | netpgp --cat > b
netpgp: default key set to "C0596823"
netpgp: default key set to "C0596823"
pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
netpgp passphrase:
Good signature for <stdin> made Mon Dec 21 18:25:02 2009
using RSA (Encrypt or Sign) key 1b68dcfcc0596823
pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks <[email protected]>
uid              Alistair Crooks (Yahoo!) <[email protected]>
%

+ add explanations of memory-based operations to manual pages


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/crypto/external/bsd/netpgp/dist/TODO
cvs rdiff -u -r1.20 -r1.21 src/crypto/external/bsd/netpgp/dist/configure
cvs rdiff -u -r1.19 -r1.20 src/crypto/external/bsd/netpgp/dist/configure.ac
cvs rdiff -u -r1.13 -r1.14 \
    src/crypto/external/bsd/netpgp/dist/include/netpgp.h
cvs rdiff -u -r1.6 -r1.7 \
    src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in
cvs rdiff -u -r1.17 -r1.18 \
    src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
cvs rdiff -u -r1.12 -r1.13 \
    src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
cvs rdiff -u -r1.10 -r1.11 \
    src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3 \
    src/crypto/external/bsd/netpgp/dist/src/lib/validate.h
cvs rdiff -u -r1.33 -r1.34 \
    src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
cvs rdiff -u -r1.23 -r1.24 \
    src/crypto/external/bsd/netpgp/dist/src/lib/signature.c
cvs rdiff -u -r1.5 -r1.6 \
    src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
cvs rdiff -u -r1.24 -r1.25 \
    src/crypto/external/bsd/netpgp/dist/src/lib/validate.c
cvs rdiff -u -r1.21 -r1.22 \
    src/crypto/external/bsd/netpgp/dist/src/lib/version.h
cvs rdiff -u -r1.5 -r1.6 \
    src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile \
    src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1
cvs rdiff -u -r1.8 -r1.9 \
    src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
cvs rdiff -u -r1.4 -r1.5 \
    src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile
cvs rdiff -u -r1.2 -r1.3 src/crypto/external/bsd/netpgp/lib/config.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/TODO
diff -u src/crypto/external/bsd/netpgp/dist/TODO:1.27 src/crypto/external/bsd/netpgp/dist/TODO:1.28
--- src/crypto/external/bsd/netpgp/dist/TODO:1.27	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/TODO	Tue Dec 22 06:03:24 2009
@@ -10,10 +10,8 @@
 separate from libcrypto?
 64-bit offsets
 thresholds
-Multiple recipients for encryption - ssss
 default compression when signing?
 elgamal enc/decryption?
-convert tests from ./tst to the autotest ./tests/
 hkpd
 
 Done
@@ -76,3 +74,7 @@
 don't complain if no .gnupg dir (even when using --homedir)
 make it work with ssh host keys
 regex matching for names and signatures
+in memory encryption and decryption
+netpgpagent
+ssss
+make netpgp work from stdin/to stdout

Index: src/crypto/external/bsd/netpgp/dist/configure
diff -u src/crypto/external/bsd/netpgp/dist/configure:1.20 src/crypto/external/bsd/netpgp/dist/configure:1.21
--- src/crypto/external/bsd/netpgp/dist/configure:1.20	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/configure	Tue Dec 22 06:03:24 2009
@@ -1,7 +1,7 @@
 #! /bin/sh
-# From configure.ac Revision: 1.18 .
+# From configure.ac Revision: 1.19 .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for netpgp 20091210.
+# Generated by GNU Autoconf 2.63 for netpgp 20091221.
 #
 # Report bugs to <Alistair Crooks <[email protected]> c0596823>.
 #
@@ -751,8 +751,8 @@
 # Identity of this package.
 PACKAGE_NAME='netpgp'
 PACKAGE_TARNAME='netpgp'
-PACKAGE_VERSION='20091210'
-PACKAGE_STRING='netpgp 20091210'
+PACKAGE_VERSION='20091221'
+PACKAGE_STRING='netpgp 20091221'
 PACKAGE_BUGREPORT='Alistair Crooks <[email protected]> c0596823'
 
 ac_unique_file="src/netpgp/netpgp.c"
@@ -1483,7 +1483,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures netpgp 20091210 to adapt to many kinds of systems.
+\`configure' configures netpgp 20091221 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1553,7 +1553,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of netpgp 20091210:";;
+     short | recursive ) echo "Configuration of netpgp 20091221:";;
    esac
   cat <<\_ACEOF
 
@@ -1660,7 +1660,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-netpgp configure 20091210
+netpgp configure 20091221
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1674,7 +1674,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by netpgp $as_me 20091210, which was
+It was created by netpgp $as_me 20091221, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -2561,7 +2561,7 @@
 
 # Define the identity of the package.
  PACKAGE='netpgp'
- VERSION='20091210'
+ VERSION='20091221'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -22306,7 +22306,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by netpgp $as_me 20091210, which was
+This file was extended by netpgp $as_me 20091221, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -22369,7 +22369,7 @@
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-netpgp config.status 20091210
+netpgp config.status 20091221
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 

Index: src/crypto/external/bsd/netpgp/dist/configure.ac
diff -u src/crypto/external/bsd/netpgp/dist/configure.ac:1.19 src/crypto/external/bsd/netpgp/dist/configure.ac:1.20
--- src/crypto/external/bsd/netpgp/dist/configure.ac:1.19	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/configure.ac	Tue Dec 22 06:03:24 2009
@@ -1,10 +1,10 @@
-# $NetBSD: configure.ac,v 1.19 2009/12/14 23:29:56 agc Exp $
+# $NetBSD: configure.ac,v 1.20 2009/12/22 06:03:24 agc Exp $
 #
 # Process this file with autoconf to produce a configure script.
 
-AC_INIT([netpgp],[20091210],[Alistair Crooks <[email protected]> c0596823])
+AC_INIT([netpgp],[20091221],[Alistair Crooks <[email protected]> c0596823])
 AC_PREREQ(2.63)
-AC_REVISION([$Revision: 1.19 $])
+AC_REVISION([$Revision: 1.20 $])
 
 AS_SHELL_SANITIZE
 

Index: src/crypto/external/bsd/netpgp/dist/include/netpgp.h
diff -u src/crypto/external/bsd/netpgp/dist/include/netpgp.h:1.13 src/crypto/external/bsd/netpgp/dist/include/netpgp.h:1.14
--- src/crypto/external/bsd/netpgp/dist/include/netpgp.h:1.13	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/include/netpgp.h	Tue Dec 22 06:03:24 2009
@@ -86,9 +86,11 @@
 int netpgp_sign_file(netpgp_t *, const char *, const char *, char *, int, int, int);
 int netpgp_verify_file(netpgp_t *, const char *, const char *, int);
 
-/* memory signing */
+/* memory signing and encryption */
 int netpgp_sign_memory(netpgp_t *, const char *, char *, size_t, char *, size_t, const unsigned, const unsigned);
-int netpgp_verify_memory(netpgp_t *, const void *, const size_t, const int);
+int netpgp_verify_memory(netpgp_t *, const void *, const size_t, void *, size_t, const int);
+int netpgp_encrypt_memory(netpgp_t *, const char *, void *, const size_t, char *, size_t, int);
+int netpgp_decrypt_memory(netpgp_t *, const void *, const size_t, char *, size_t, const int);
 
 __END_DECLS
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in:1.6 src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in:1.7
--- src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in:1.6	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/Makefile.in	Tue Dec 22 06:03:24 2009
@@ -52,17 +52,16 @@
 libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libnetpgp_la_LIBADD =
-am_libnetpgp_la_OBJECTS = libnetpgp_la-compress.lo \
-	libnetpgp_la-bufgap.lo \
-	libnetpgp_la-create.lo libnetpgp_la-crypto.lo \
-	libnetpgp_la-fastctype.lo \
+am_libnetpgp_la_OBJECTS = libnetpgp_la-bufgap.lo \
+	libnetpgp_la-compress.lo libnetpgp_la-create.lo \
+	libnetpgp_la-crypto.lo libnetpgp_la-fastctype.lo \
 	libnetpgp_la-keyring.lo libnetpgp_la-misc.lo \
 	libnetpgp_la-netpgp.lo libnetpgp_la-openssl_crypto.lo \
 	libnetpgp_la-packet-parse.lo libnetpgp_la-packet-print.lo \
 	libnetpgp_la-packet-show.lo libnetpgp_la-reader.lo \
-	libnetpgp_la-signature.lo libnetpgp_la-symmetric.lo \
-	libnetpgp_la-ssh2pgp.lo \
-	libnetpgp_la-validate.lo libnetpgp_la-writer.lo
+	libnetpgp_la-signature.lo libnetpgp_la-ssh2pgp.lo \
+	libnetpgp_la-symmetric.lo libnetpgp_la-validate.lo \
+	libnetpgp_la-writer.lo
 libnetpgp_la_OBJECTS = $(am_libnetpgp_la_OBJECTS)
 DEFAULT_INCLUDES = -...@am__isrc@
 depcomp = $(SHELL) $(top_srcdir)/buildaux/depcomp

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.17 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.18
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.17	Tue Oct  6 02:26:05 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c	Tue Dec 22 06:03:24 2009
@@ -54,7 +54,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: crypto.c,v 1.17 2009/10/06 02:26:05 agc Exp $");
+__RCSID("$NetBSD: crypto.c,v 1.18 2009/12/22 06:03:24 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -215,8 +215,68 @@
 	return 1;
 }
 
-static          __ops_cb_ret_t
-callback_write_parsed(const __ops_packet_t *, __ops_cbdata_t *);
+static __ops_cb_ret_t
+write_parsed_cb(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
+{
+	const __ops_contents_t	*content = &pkt->u;
+	static unsigned		 skipping;	/* XXX - put skipping into pkt? */
+
+	if (__ops_get_debug_level(__FILE__)) {
+		printf("write_parsed_cb: ");
+		__ops_print_packet(pkt);
+	}
+	if (pkt->tag != OPS_PTAG_CT_UNARMOURED_TEXT && skipping) {
+		puts("...end of skip");
+		skipping = 0;
+	}
+	switch (pkt->tag) {
+	case OPS_PTAG_CT_UNARMOURED_TEXT:
+		printf("OPS_PTAG_CT_UNARMOURED_TEXT\n");
+		if (!skipping) {
+			puts("Skipping...");
+			skipping = 1;
+		}
+		fwrite(content->unarmoured_text.data, 1,
+		       content->unarmoured_text.length, stdout);
+		break;
+
+	case OPS_PTAG_CT_PK_SESSION_KEY:
+		return pk_sesskey_cb(pkt, cbinfo);
+
+	case OPS_GET_SECKEY:
+		return 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);
+
+	case OPS_PTAG_CT_ARMOUR_HEADER:
+	case OPS_PTAG_CT_ARMOUR_TRAILER:
+	case OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY:
+	case OPS_PTAG_CT_COMPRESSED:
+	case OPS_PTAG_CT_LITDATA_HEADER:
+	case OPS_PTAG_CT_SE_IP_DATA_BODY:
+	case OPS_PTAG_CT_SE_IP_DATA_HEADER:
+	case OPS_PTAG_CT_SE_DATA_BODY:
+	case OPS_PTAG_CT_SE_DATA_HEADER:
+		/* Ignore these packets  */
+		/* They're handled in __ops_parse_packet() */
+		/* and nothing else needs to be done */
+		break;
+
+	default:
+		if (__ops_get_debug_level(__FILE__)) {
+			fprintf(stderr, "Unexpected packet tag=%d (0x%x)\n",
+				pkt->tag,
+				pkt->tag);
+		}
+		break;
+	}
+
+	return OPS_RELEASE_MEMORY;
+}
 
 /**
 \ingroup HighLevel_Crypto
@@ -269,6 +329,44 @@
 	return 1;
 }
 
+/* encrypt the contents of the input buffer, and return the mem structure */
+__ops_memory_t *
+__ops_encrypt_buf(__ops_io_t *io,
+			const void *input,
+			const size_t insize,
+			const __ops_key_t *pubkey,
+			const unsigned use_armour)
+{
+	__ops_output_t	*output;
+	__ops_memory_t	*outmem;
+
+	__OPS_USED(io);
+	if (input == NULL) {
+		(void) fprintf(io->errs,
+			"__ops_encrypt_buf: null memory\n");
+		return 0;
+	}
+
+	__ops_setup_memory_write(&output, &outmem, insize);
+
+	/* set armoured/not armoured here */
+	if (use_armour) {
+		__ops_writer_push_armor_msg(output);
+	}
+
+	/* Push the encrypted writer */
+	__ops_push_enc_se_ip(output, pubkey);
+
+	/* This does the writing */
+	__ops_write(output, input, insize);
+
+	/* tidy up */
+	__ops_writer_close(output);
+	__ops_output_delete(output);
+
+	return outmem;
+}
+
 /**
    \ingroup HighLevel_Crypto
    \brief Decrypt a file.
@@ -299,7 +397,7 @@
 	/* setup for reading from given input file */
 	fd_in = __ops_setup_file_read(io, &parse, infile,
 				    NULL,
-				    callback_write_parsed,
+				    write_parsed_cb,
 				    0);
 	if (fd_in < 0) {
 		perror(infile);
@@ -373,65 +471,65 @@
 	return 1;
 }
 
-static __ops_cb_ret_t
-callback_write_parsed(const __ops_packet_t *pkt, __ops_cbdata_t *cbinfo)
+/* decrypt an area of memory */
+__ops_memory_t *
+__ops_decrypt_buf(__ops_io_t *io,
+			const void *input,
+			const size_t insize,
+			__ops_keyring_t *keyring,
+			const unsigned use_armour,
+			void *passfp,
+			__ops_cbfunc_t *getpassfunc)
 {
-	const __ops_contents_t	*content = &pkt->u;
-	static unsigned		 skipping;	/* XXX - put skipping into pkt? */
+	__ops_stream_t	*parse = NULL;
+	__ops_memory_t	*outmem;
+	__ops_memory_t	*inmem;
+	const int	 printerrors = 1;
 
-	if (__ops_get_debug_level(__FILE__)) {
-		printf("callback_write_parsed: ");
-		__ops_print_packet(pkt);
-	}
-	if (pkt->tag != OPS_PTAG_CT_UNARMOURED_TEXT && skipping) {
-		puts("...end of skip");
-		skipping = 0;
+	if (input == NULL) {
+		(void) fprintf(io->errs,
+			"__ops_encrypt_buf: null memory\n");
+		return 0;
 	}
-	switch (pkt->tag) {
-	case OPS_PTAG_CT_UNARMOURED_TEXT:
-		printf("OPS_PTAG_CT_UNARMOURED_TEXT\n");
-		if (!skipping) {
-			puts("Skipping...");
-			skipping = 1;
-		}
-		fwrite(content->unarmoured_text.data, 1,
-		       content->unarmoured_text.length, stdout);
-		break;
 
-	case OPS_PTAG_CT_PK_SESSION_KEY:
-		return pk_sesskey_cb(pkt, cbinfo);
+	inmem = __ops_memory_new();
+	__ops_memory_add(inmem, input, insize);
 
-	case OPS_GET_SECKEY:
-		return get_seckey_cb(pkt, cbinfo);
+	/* set up to read from memory */
+	__ops_setup_memory_read(io, &parse, inmem,
+				    NULL,
+				    write_parsed_cb,
+				    0);
 
-	case OPS_GET_PASSPHRASE:
-		return cbinfo->cryptinfo.getpassphrase(pkt, cbinfo);
+	/* setup for writing decrypted contents to given output file */
+	__ops_setup_memory_write(&parse->cbinfo.output, &outmem, insize);
 
-	case OPS_PTAG_CT_LITDATA_BODY:
-		return litdata_cb(pkt, cbinfo);
+	/* setup keyring and passphrase callback */
+	parse->cbinfo.cryptinfo.keyring = keyring;
+	parse->cbinfo.passfp = passfp;
+	parse->cbinfo.cryptinfo.getpassphrase = getpassfunc;
 
-	case OPS_PTAG_CT_ARMOUR_HEADER:
-	case OPS_PTAG_CT_ARMOUR_TRAILER:
-	case OPS_PTAG_CT_ENCRYPTED_PK_SESSION_KEY:
-	case OPS_PTAG_CT_COMPRESSED:
-	case OPS_PTAG_CT_LITDATA_HEADER:
-	case OPS_PTAG_CT_SE_IP_DATA_BODY:
-	case OPS_PTAG_CT_SE_IP_DATA_HEADER:
-	case OPS_PTAG_CT_SE_DATA_BODY:
-	case OPS_PTAG_CT_SE_DATA_HEADER:
-		/* Ignore these packets  */
-		/* They're handled in __ops_parse_packet() */
-		/* and nothing else needs to be done */
-		break;
+	/* Set up armour/passphrase options */
+	if (use_armour) {
+		__ops_reader_push_dearmour(parse);
+	}
 
-	default:
-		if (__ops_get_debug_level(__FILE__)) {
-			fprintf(stderr, "Unexpected packet tag=%d (0x%x)\n",
-				pkt->tag,
-				pkt->tag);
-		}
-		break;
+	/* Do it */
+	__ops_parse(parse, printerrors);
+
+	/* Unsetup */
+	if (use_armour) {
+		__ops_reader_pop_dearmour(parse);
 	}
 
-	return OPS_RELEASE_MEMORY;
+	/* tidy up */
+	__ops_teardown_memory_read(parse, inmem);
+	__ops_memory_release(inmem);
+	free(inmem);
+
+	__ops_writer_close(parse->cbinfo.output);
+	__ops_output_delete(parse->cbinfo.output);
+
+	return outmem;
 }
+

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.12 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.13
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.12	Sat Dec  5 07:08:18 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h	Tue Dec 22 06:03:24 2009
@@ -55,6 +55,7 @@
 
 #include "keyring.h"
 #include "packet.h"
+#include "memory.h"
 #include "packet-parse.h"
 
 #include <openssl/dsa.h>
@@ -191,6 +192,21 @@
 			void *,
 			__ops_cbfunc_t *);
 
+__ops_memory_t *
+__ops_encrypt_buf(__ops_io_t *,
+			const void *,
+			const size_t,
+			const __ops_key_t *,
+			const unsigned);
+__ops_memory_t *
+__ops_decrypt_buf(__ops_io_t *,
+			const void *,
+			const size_t,
+			__ops_keyring_t *,
+			const unsigned,
+			void *,
+			__ops_cbfunc_t *);
+
 /* Keys */
 __ops_key_t  *__ops_rsa_new_selfsign_key(const int,
 			const unsigned long, __ops_userid_t *);

Index: src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3:1.10 src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3:1.11
--- src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3:1.10	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/libnetpgp.3	Tue Dec 22 06:03:24 2009
@@ -1,4 +1,4 @@
-.\" $NetBSD: libnetpgp.3,v 1.10 2009/12/14 23:29:56 agc Exp $
+.\" $NetBSD: libnetpgp.3,v 1.11 2009/12/22 06:03:24 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 November 19, 2009
+.Dd December 21, 2009
 .Dt LIBNETPGP 3
 .Os
 .Sh NAME
@@ -37,6 +37,8 @@
 .Lb libnetpgp
 .Sh SYNOPSIS
 .In netpgp.h
+.Pp
+The following functions relate to initialisations and finalisations:
 .Ft int
 .Fo netpgp_init
 .Fa "netpgp_t *netpgp" "char *userid" "char *pubringfile" "char *secringfile"
@@ -45,14 +47,62 @@
 .Fo netpgp_end
 .Fa "netpgp_t *netpgp"
 .Fc
+.Pp
+The following functions are for debugging, reflection and information:
+.Ft int
+.Fo netpgp_set_debug
+.Fa "const char *filename"
+.Fc
+.Ft int
+.Fo netpgp_get_debug
+.Fa "const char *filename"
+.Fc
+.Ft int
+.Fo netpgp_get_info
+.Fa "const char *type"
+.Fc
+.Ft int
+.Fo netpgp_list_packets
+.Fa "netpgp_t *netpgp" "char *filename" "int armour" "char *pubringname"
+.Fc
+.Pp
+The following functions are for variable management:
+.Ft int
+.Fo netpgp_setvar
+.Fa "netpgp_t *netpgp" "const char *name" "const char *value"
+.Fc
+.Ft char *
+.Fo netpgp_getvar
+.Fa "netpgp_t *netpgp" "const char *name"
+.Fc
+.Ft int
+.Fo netpgp_incvar
+.Fa "netpgp_t *netpgp" "const char *name" "const int delta"
+.Fc
+.Pp
+The following function sets the home directory:
+.Ft int
+.Fo netpgp_set_homedir
+.Fa "netpgp_t *netpgp" "char *homedir" "char *subdir" "const int quiet"
+.Fc
+.Pp
+The following functions are used for key management:
 .Ft int
 .Fo netpgp_list_keys
 .Fa "netpgp_t *netpgp"
 .Fc
 .Ft int
+.Fo netpgp_match_list_keys
+.Fa "netpgp_t *netpgp" "char *pattern"
+.Fc
+.Ft int
 .Fo netpgp_find_key
 .Fa "netpgp_t *netpgp" "char *userid"
 .Fc
+.Ft char *
+.Fo netpgp_get_key
+.Fa "netpgp_t *netpgp" "const char *id"
+.Fc
 .Ft int
 .Fo netpgp_export_key
 .Fa "netpgp_t *netpgp" "char *userid"
@@ -65,6 +115,8 @@
 .Fo netpgp_generate_key
 .Fa "netpgp_t *netpgp" "char *userid" "int numbits"
 .Fc
+.Pp
+The following functions are used for file management:
 .Ft int
 .Fo netpgp_encrypt_file
 .Fa "netpgp_t *netpgp" "char *userid" "char *filename" "char *out"
@@ -83,6 +135,18 @@
 .Fo netpgp_verify_file
 .Fa "netpgp_t *netpgp" "char *f" "int armored"
 .Fc
+.Pp
+The following functions are used for memory signing and encryption:
+.Ft int
+.Fo netpgp_encrypt_memory
+.Fa "netpgp_t *netpgp" "char *userid" "void *in" "const size_t insize"
+.Fa "char *out" "size_t outsize" "int armored"
+.Fc
+.Ft int
+.Fo netpgp_decrypt_memory
+.Fa "netpgp_t *netpgp" "const void *input" "const size_t insize"
+.Fa "char *out" "size_t outsize" "const int armored"
+.Fc
 .Ft int
 .Fo netpgp_sign_memory
 .Fa "netpgp_t *netpgp" "const char *userid" "char *mem"
@@ -91,39 +155,8 @@
 .Fc
 .Ft int
 .Fo netpgp_verify_memory
-.Fa "netpgp_t *netpgp" "const void *in" "const size_t size" "const int armored"
-.Fc
-.Ft char *
-.Fo netpgp_get_key
-.Fa "netpgp_t *netpgp" "const char *id"
-.Fc
-.Ft int
-.Fo netpgp_set_debug
-.Fa "const char *filename"
-.Fc
-.Ft int
-.Fo netpgp_get_debug
-.Fa "const char *filename"
-.Fc
-.Ft int
-.Fo netpgp_get_info
-.Fa "const char *type"
-.Fc
-.Ft int
-.Fo netpgp_list_packets
-.Fa "netpgp_t *netpgp" "char *filename" "int armour" "char *pubringname"
-.Fc
-.Ft int
-.Fo netpgp_setvar
-.Fa "netpgp_t *netpgp" "const char *name" "const char *value"
-.Fc
-.Ft char *
-.Fo netpgp_getvar
-.Fa "netpgp_t *netpgp" "const char *name"
-.Fc
-.Ft int
-.Fo netpgp_incvar
-.Fa "netpgp_t *netpgp" "const char *name" "const int delta"
+.Fa "netpgp_t *netpgp" "const void *in" "const size_t insize"
+.Fa "void *out" "size_t outsize" "const int armored"
 .Fc
 .Sh DESCRIPTION
 .Nm
Index: src/crypto/external/bsd/netpgp/dist/src/lib/validate.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/validate.h:1.10 src/crypto/external/bsd/netpgp/dist/src/lib/validate.h:1.11
--- src/crypto/external/bsd/netpgp/dist/src/lib/validate.h:1.10	Tue Jun  9 00:51:02 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/validate.h	Tue Dec 22 06:03:25 2009
@@ -106,6 +106,7 @@
 unsigned   __ops_validate_mem(__ops_io_t *,
 			__ops_validation_t *,
 			__ops_memory_t *,
+			__ops_memory_t **,
 			const int,
 			const __ops_keyring_t *);
 

Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.33 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.34
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.33	Mon Dec 14 23:29:56 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c	Tue Dec 22 06:03:24 2009
@@ -34,7 +34,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: netpgp.c,v 1.33 2009/12/14 23:29:56 agc Exp $");
+__RCSID("$NetBSD: netpgp.c,v 1.34 2009/12/22 06:03:24 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -145,7 +145,7 @@
 	for (i = 0; i < res->validc; i++) {
 		(void) fprintf(io->res,
 			"Good signature for %s made %susing %s key %s\n",
-			f,
+			(f) ? f : "<stdin>",
 			ctime(&res->valid_sigs[i].birthtime),
 			__ops_show_pka(res->valid_sigs[i].key_alg),
 			userid_to_id(res->valid_sigs[i].signer_id, id));
@@ -643,12 +643,17 @@
 					overwrite);
 }
 
+#define ARMOR_HEAD	"-----BEGIN PGP MESSAGE-----\r\n"
+
 /* decrypt a file */
 int
 netpgp_decrypt_file(netpgp_t *netpgp, const char *f, char *out, int armored)
 {
-	const unsigned	overwrite = 1;
-	__ops_io_t		*io;
+	const unsigned	 overwrite = 1;
+	__ops_io_t	*io;
+	unsigned	 realarmour;
+	FILE		*fp;
+	char		 buf[BUFSIZ];
 
 	io = netpgp->io;
 	if (f == NULL) {
@@ -656,9 +661,21 @@
 			"netpgp_decrypt_file: no filename specified\n");
 		return 0;
 	}
+	realarmour = (unsigned)armored;
+	if ((fp = fopen(f, "r")) == NULL) {
+		(void) fprintf(io->errs,
+			"netpgp_decrypt_file: can't open '%s'\n", f);
+		return 0;
+	}
+	if (fgets(buf, sizeof(buf), fp) == NULL) {
+		realarmour = 0;
+	} else {
+		realarmour = (strcmp(buf, ARMOR_HEAD) == 0);
+	}
+	(void) fclose(fp);
 	return __ops_decrypt_file(netpgp->io, f, out, netpgp->secring,
-				(unsigned)armored, overwrite, netpgp->passfp,
-				get_passphrase_cb);
+				(unsigned)realarmour, overwrite,
+				netpgp->passfp, get_passphrase_cb);
 }
 
 /* sign a file */
@@ -809,6 +826,9 @@
 		m = MIN(__ops_mem_len(signedmem), outsize);
 		(void) memcpy(out, __ops_mem_data(signedmem), m);
 		__ops_memory_free(signedmem);
+		ret = (int)m;
+	} else {
+		ret = 0;
 	}
 	__ops_forget(seckey, sizeof(*seckey));
 	return ret;
@@ -817,11 +837,13 @@
 /* verify memory */
 int
 netpgp_verify_memory(netpgp_t *netpgp, const void *in, const size_t size,
-			const int armored)
+			void *out, size_t outsize, const int armored)
 {
 	__ops_validation_t	 result;
 	__ops_memory_t		*signedmem;
+	__ops_memory_t		*cat;
 	__ops_io_t		*io;
+	size_t			 m;
 	int			 ret;
 
 	(void) memset(&result, 0x0, sizeof(result));
@@ -833,12 +855,20 @@
 	}
 	signedmem = __ops_memory_new();
 	__ops_memory_add(signedmem, in, size);
-	ret = __ops_validate_mem(io, &result, signedmem, armored,
-						netpgp->pubring);
+	ret = __ops_validate_mem(io, &result, signedmem,
+				(out) ? &cat : NULL,
+				armored, netpgp->pubring);
 	__ops_memory_free(signedmem);
 	if (ret) {
-		resultp(io, in, &result, netpgp->pubring);
-		return 1;
+		resultp(io, "<stdin>", &result, netpgp->pubring);
+		if (out) {
+			m = MIN(__ops_mem_len(cat), outsize);
+			(void) memcpy(out, __ops_mem_data(cat), m);
+			__ops_memory_free(cat);
+		} else {
+			m = 1;
+		}
+		return (int)m;
 	}
 	if (result.validc + result.invalidc + result.unknownc == 0) {
 		(void) fprintf(io->errs,
@@ -851,6 +881,80 @@
 	return 0;
 }
 
+/* encrypt some memory */
+int
+netpgp_encrypt_memory(netpgp_t *netpgp,
+			const char *userid,
+			void *in,
+			const size_t insize,
+			char *out,
+			size_t outsize,
+			int armored)
+{
+	const __ops_key_t	*keypair;
+	__ops_memory_t		*enc;
+	__ops_io_t		*io;
+	size_t			 m;
+
+	io = netpgp->io;
+	if (in == NULL) {
+		(void) fprintf(io->errs,
+			"netpgp_encrypt_buf: no memory to encrypt\n");
+		return 0;
+	}
+	if (userid == NULL) {
+		userid = netpgp_getvar(netpgp, "userid");
+	}
+	keypair = __ops_getkeybyname(io, netpgp->pubring, userid);
+	if (keypair == NULL) {
+		(void) fprintf(io->errs, "Userid '%s' not found in keyring\n",
+					userid);
+		return 0;
+	}
+	if (in == out) {
+		(void) fprintf(io->errs,
+			"netpgp_encrypt_buf: input and output bufs need to be different\n");
+		return 0;
+	}
+	if (outsize < insize) {
+		(void) fprintf(io->errs,
+			"netpgp_encrypt_buf: input size is larger than output size\n");
+		return 0;
+	}
+	enc = __ops_encrypt_buf(io, in, insize, keypair, (unsigned)armored);
+	m = MIN(__ops_mem_len(enc), outsize);
+	(void) memcpy(out, __ops_mem_data(enc), m);
+	__ops_memory_free(enc);
+	return (int)m;
+}
+
+/* decrypt a chunk of memory */
+int
+netpgp_decrypt_memory(netpgp_t *netpgp, const void *input, const size_t insize,
+			char *out, size_t outsize, const int armored)
+{
+	__ops_memory_t	*mem;
+	__ops_io_t	*io;
+	unsigned	 realarmour;
+	size_t		 m;
+
+	io = netpgp->io;
+	realarmour = (unsigned) armored;
+	if (input == NULL) {
+		(void) fprintf(io->errs,
+			"netpgp_decrypt_memory: no memory\n");
+		return 0;
+	}
+	realarmour = (strncmp(input, ARMOR_HEAD, sizeof(ARMOR_HEAD) - 1) == 0);
+	mem = __ops_decrypt_buf(netpgp->io, input, insize, netpgp->secring,
+				realarmour, netpgp->passfp,
+				get_passphrase_cb);
+	m = MIN(__ops_mem_len(mem), outsize);
+	(void) memcpy(out, __ops_mem_data(mem), m);
+	__ops_memory_free(mem);
+	return (int)m;
+}
+
 /* wrappers for the ops_debug_level functions we added to openpgpsdk */
 
 /* set the debugging level per filename */
@@ -998,3 +1102,4 @@
 	}
 	return 1;
 }
+

Index: src/crypto/external/bsd/netpgp/dist/src/lib/signature.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.23 src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.24
--- src/crypto/external/bsd/netpgp/dist/src/lib/signature.c:1.23	Fri Nov 20 07:17:07 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/signature.c	Tue Dec 22 06:03:25 2009
@@ -57,7 +57,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: signature.c,v 1.23 2009/11/20 07:17:07 agc Exp $");
+__RCSID("$NetBSD: signature.c,v 1.24 2009/12/22 06:03:25 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -1138,8 +1138,8 @@
 
 	if (input == NULL) {
 		(void) fprintf(io->errs,
-			"__ops_sign_buf_as_cleartext: null cleartext\n");
-		return 0;
+			"__ops_sign_buf: null input\n");
+		return NULL;
 	}
 
 	/* set up signature */

Index: src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.5 src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.6
--- src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.5	Mon Dec 14 23:29:57 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c	Tue Dec 22 06:03:25 2009
@@ -221,6 +221,7 @@
 	uint32_t	 len;
 	int64_t		 off;
 	char		 hostname[256];
+	char		 owner[256];
 	char		*space;
 	char	 	*buf;
 	char	 	*bin;
@@ -314,12 +315,19 @@
 	if (ok) {
 		(void) memset(&userid, 0x0, sizeof(userid));
 		(void) gethostname(hostname, sizeof(hostname));
-		(void) __ops_asprintf((char **)(void *)&userid.userid,
-				"%s (%s) <%.*s>",
-				hostname,
-				f,
+		if (strlen(space + 1) - 1 == 0) {
+			(void) snprintf(owner, sizeof(owner), "<r...@%s>",
+					hostname);
+		} else {
+			(void) snprintf(owner, sizeof(owner), "<%.*s>",
 				(int)strlen(space + 1) - 1,
 				space + 1);
+		}
+		(void) __ops_asprintf((char **)(void *)&userid.userid,
+						"%s (%s) %s",
+						hostname,
+						f,
+						owner);
 		__ops_keyid(key->key_id, sizeof(key->key_id), pubkey);
 		__ops_add_userid(key, &userid);
 		__ops_fingerprint(&key->fingerprint, pubkey);

Index: src/crypto/external/bsd/netpgp/dist/src/lib/validate.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.24 src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.25
--- src/crypto/external/bsd/netpgp/dist/src/lib/validate.c:1.24	Mon Dec  7 16:17:17 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/validate.c	Tue Dec 22 06:03:25 2009
@@ -54,7 +54,7 @@
 
 #if defined(__NetBSD__)
 __COPYRIGHT("@(#) Copyright (c) 2009 The NetBSD Foundation, Inc. All rights reserved.");
-__RCSID("$NetBSD: validate.c,v 1.24 2009/12/07 16:17:17 agc Exp $");
+__RCSID("$NetBSD: validate.c,v 1.25 2009/12/22 06:03:25 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -331,6 +331,7 @@
 				__ops_get_pubkey(signer),
 				key->reader->key->packets[
 					key->reader->packet].raw);
+			/* XXX - agc - put subkey logic here? */
 			break;
 
 		case OPS_SIG_DIRECT:
@@ -815,11 +816,12 @@
 __ops_validate_mem(__ops_io_t *io,
 			__ops_validation_t *result,
 			__ops_memory_t *mem,
+			__ops_memory_t **cat,
 			const int armoured,
 			const __ops_keyring_t *keyring)
 {
 	validate_data_cb_t	 validation;
-	__ops_stream_t	*stream = NULL;
+	__ops_stream_t		*stream = NULL;
 	const int		 printerrors = 1;
 
 	__ops_setup_memory_read(io, &stream, mem, &validation, validate_data_cb, 1);
@@ -845,7 +847,14 @@
 		__ops_reader_pop_dearmour(stream);
 	}
 	__ops_teardown_memory_read(stream, mem);
-	__ops_memory_free(validation.mem);
+
+	/* this is triggered only for --cat output */
+	if (*cat) {
+		/* need to send validated output somewhere */
+		*cat = validation.mem;
+	} else {
+		__ops_memory_free(validation.mem);
+	}
 
 	return validate_result_status(result);
 }

Index: src/crypto/external/bsd/netpgp/dist/src/lib/version.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.21 src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.22
--- src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.21	Mon Dec 14 23:35:06 2009
+++ src/crypto/external/bsd/netpgp/dist/src/lib/version.h	Tue Dec 22 06:03:25 2009
@@ -58,7 +58,7 @@
 #endif
 
 /* development versions have .99 suffix */
-#define NETPGP_BASE_VERSION	"1.99.14"
+#define NETPGP_BASE_VERSION	"1.99.15"
 
 #define NETPGP_VERSION_CAT(a, b)	"NetPGP portable " a "/[" b "]"
 #define NETPGP_VERSION_STRING \

Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile:1.5 src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile:1.6
--- src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile:1.5	Mon Dec 14 23:29:57 2009
+++ src/crypto/external/bsd/netpgp/dist/src/netpgp/Makefile	Tue Dec 22 06:03:25 2009
@@ -117,16 +117,16 @@
 PACKAGE = netpgp
 PACKAGE_BUGREPORT = Alistair Crooks <[email protected]> c0596823
 PACKAGE_NAME = netpgp
-PACKAGE_STRING = netpgp 20091210
+PACKAGE_STRING = netpgp 20091221
 PACKAGE_TARNAME = netpgp
-PACKAGE_VERSION = 20091210
+PACKAGE_VERSION = 20091221
 PATH_SEPARATOR = :
 RANLIB = ranlib
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/ksh
 STRIP = strip
-VERSION = 20091210
+VERSION = 20091221
 WARNCFLAGS = -Werror -Wall -Wpointer-arith
 abs_builddir = /usr/src/crypto/external/bsd/netpgp/dist/src/netpgp
 abs_srcdir = /usr/src/crypto/external/bsd/netpgp/dist/src/netpgp
@@ -169,7 +169,7 @@
 mkdir_p = $(top_builddir)/buildaux/install-sh -c -d
 oldincludedir = /usr/include
 pdfdir = ${docdir}
-prefix = /usr/local
+prefix = /usr/pkg
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin
Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.5 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.6
--- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1:1.5	Sat Dec  5 10:05:54 2009
+++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.1	Tue Dec 22 06:03:25 2009
@@ -1,4 +1,4 @@
-.\" $NetBSD: netpgp.1,v 1.5 2009/12/05 10:05:54 wiz Exp $
+.\" $NetBSD: netpgp.1,v 1.6 2009/12/22 06:03:25 agc Exp $
 .\"
 .\" Copyright (c) 2009 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -372,6 +372,44 @@
 netpgp passphrase:
 %
 .Ed
+.Pp
+If no file name is provided, the data will be read from standard input,
+and displayed on standard output:
+.Bd -literal
+% netpgp --encrypt \*[Lt] a | netpgp --decrypt \*[Gt] b
+netpgp: default key set to "C0596823"
+netpgp: default key set to "C0596823"
+pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
+Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+netpgp passphrase:
+%
+.Ed
+.Bd -literal
+% netpgp --sign \*[Lt] a | netpgp --cat \*[Gt] b 
+netpgp: default key set to "C0596823"
+netpgp: default key set to "C0596823"
+pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
+Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823 
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+netpgp passphrase: 
+Good signature for \*[Lt]stdin\*[Gt] made Mon Dec 21 18:25:02 2009
+using RSA (Encrypt or Sign) key 1b68dcfcc0596823
+pub 2048/RSA (Encrypt or Sign) 1b68dcfcc0596823 2004-01-12
+Key fingerprint: d415 9deb 336d e4cc cdfa 00cd 1b68 dcfc c059 6823 
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks \*[lt][email protected]\*[gt]
+uid              Alistair Crooks (Yahoo!) \*[lt][email protected]\*[gt]
+%
+.Ed
 .Sh RETURN VALUES
 The
 .Nm

Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.8 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.9
--- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.8	Mon Dec 14 23:29:57 2009
+++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c	Tue Dec 22 06:03:25 2009
@@ -63,6 +63,7 @@
 	"\t[--homedir=<homedir>] AND/OR\n"
 	"\t[--keyring=<keyring>] AND/OR\n"
 	"\t[--userid=<userid>] AND/OR\n"
+	"\t[--maxmemalloc=<number of bytes>] AND/OR\n"
 	"\t[--verbose]\n";
 
 enum optdefs {
@@ -91,6 +92,7 @@
 	COREDUMPS,
 	PASSWDFD,
 	SSHKEYFILE,
+	MAX_MEM_ALLOC,
 
 	/* debug */
 	OPS_DEBUG
@@ -136,6 +138,9 @@
 	{"pass-fd",	required_argument, 	NULL,	PASSWDFD},
 	{"output",	required_argument, 	NULL,	OUTPUT},
 	{"results",	required_argument, 	NULL,	RESULTS},
+	{"maxmemalloc",	required_argument, 	NULL,	MAX_MEM_ALLOC},
+	{"max-mem",	required_argument, 	NULL,	MAX_MEM_ALLOC},
+	{"max-alloc",	required_argument, 	NULL,	MAX_MEM_ALLOC},
 	{ NULL,		0,			NULL,	0},
 };
 
@@ -174,42 +179,139 @@
 	return 1;
 }
 
+/* read all of stdin into memory */
+static int
+stdin_to_mem(netpgp_t *netpgp, char **temp, char **out, unsigned *maxsize)
+{
+	unsigned	 newsize;
+	unsigned	 size;
+	char		 buf[BUFSIZ * 8];
+	char		*loc;
+	int	 	 n;
+
+	*maxsize = (unsigned)atoi(netpgp_getvar(netpgp, "max mem alloc"));
+	size = 0;
+	*temp = NULL;
+	while ((n = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
+		newsize = size + ((n / BUFSIZ) + 1) * BUFSIZ;
+		if (newsize > *maxsize) {
+			(void) fprintf(stderr, "bounds check\n");
+			return size;
+		}
+		loc = realloc(*temp, newsize);
+		if (loc == NULL) {
+			(void) fprintf(stderr, "short read\n");
+			return size;
+		}
+		*temp = loc;
+		(void) memcpy(&(*temp)[size], buf, n);
+		size += n;
+	}
+	if ((*out = calloc(1, *maxsize)) == NULL) {
+		(void) fprintf(stderr, "Bad alloc\n");
+		return 0;
+	}
+	return (int)size;
+}
+
+/* output the text to stdout */
+static int
+showoutput(char *out, int size, const char *header)
+{
+	int	cc;
+	int	n;
+	int	i;
+
+	if (size <= 0) {
+		(void) fprintf(stderr, "%s\n", header);
+		return 0;
+	}
+	for (cc = 0 ; cc < size ; cc += n) {
+		if ((n = write(STDOUT_FILENO, &out[cc], size - cc)) <= 0) {
+			break;
+		}
+	}
+	if (cc < size) {
+		(void) fprintf(stderr, "Short write\n");
+		return 0;
+	}
+	return cc == size;
+}
+
 /* do a command once for a specified file 'f' */
 static int
 netpgp_cmd(netpgp_t *netpgp, prog_t *p, char *f)
 {
-	const int	cleartext = 1;
+	const int	 cleartext = 1;
+	unsigned	 maxsize;
+	char		*out;
+	char		*in;
+	int		 ret;
+	int		 cc;
 
 	switch (p->cmd) {
 	case ENCRYPT:
-		return nonnull(f, p->progname) &&
-			netpgp_encrypt_file(netpgp,
+		if (f == NULL) {
+			cc = stdin_to_mem(netpgp, &in, &out, &maxsize);
+			ret = netpgp_encrypt_memory(netpgp,
+					netpgp_getvar(netpgp, "userid"),
+					in, cc, out, maxsize, p->armour);
+			ret = showoutput(out, ret, "Bad memory encryption");
+			free(in);
+			free(out);
+			return ret;
+		}
+		return netpgp_encrypt_file(netpgp,
 					netpgp_getvar(netpgp, "userid"),
 					f, p->output,
 					p->armour);
 	case DECRYPT:
-		return nonnull(f, p->progname) &&
-			netpgp_decrypt_file(netpgp, f, p->output, p->armour);
+		if (f == NULL) {
+			cc = stdin_to_mem(netpgp, &in, &out, &maxsize);
+			ret = netpgp_decrypt_memory(netpgp, in, cc, out,
+					maxsize, 0);
+			ret = showoutput(out, ret, "Bad memory decryption");
+			free(in);
+			free(out);
+			return ret;
+		}
+		return netpgp_decrypt_file(netpgp, f, p->output, p->armour);
+	case CLEARSIGN:
 	case SIGN:
-		return nonnull(f, p->progname) &&
-			netpgp_sign_file(netpgp,
+		if (f == NULL) {
+			cc = stdin_to_mem(netpgp, &in, &out, &maxsize);
+			ret = netpgp_sign_memory(netpgp,
 					netpgp_getvar(netpgp, "userid"),
-					f, p->output,
-					p->armour, !cleartext, p->detached);
-	case CLEARSIGN:
-		return nonnull(f, p->progname) &&
-			netpgp_sign_file(netpgp,
+					in, cc, out,
+					maxsize, p->armour,
+					(p->cmd == CLEARSIGN) ? cleartext :
+								!cleartext);
+			ret = showoutput(out, ret, "Bad memory signature");
+			free(in);
+			free(out);
+			return ret;
+		}
+		return netpgp_sign_file(netpgp,
 					netpgp_getvar(netpgp, "userid"),
 					f, p->output,
-					p->armour, cleartext, p->detached);
+					p->armour,
+					(p->cmd == CLEARSIGN) ? cleartext :
+								!cleartext,
+					p->detached);
 	case VERIFY:
-		return nonnull(f, p->progname) &&
-			netpgp_verify_file(netpgp, f, NULL, p->armour);
 	case VERIFY_CAT:
-		return nonnull(f, p->progname) &&
-			netpgp_verify_file(netpgp, f,
-					(p->output) ? p->output : "-",
+		if (f == NULL) {
+			cc = stdin_to_mem(netpgp, &in, &out, &maxsize);
+			ret = netpgp_verify_memory(netpgp, in, cc,
+					(p->cmd == VERIFY_CAT) ? out : NULL,
+					(p->cmd == VERIFY_CAT) ? maxsize : 0,
 					p->armour);
+			ret = showoutput(out, ret, "Bad memory verification");
+			free(in);
+			free(out);
+			return ret;
+		}
+		return netpgp_verify_file(netpgp, f, NULL, p->armour);
 	case LIST_PACKETS:
 		return nonnull(f, p->progname) &&
 			netpgp_list_packets(netpgp, f, p->armour, NULL);
@@ -242,6 +344,8 @@
 	}
 	/* set some defaults */
 	netpgp_setvar(&netpgp, "hash", DEFAULT_HASH_ALG);
+	/* 4 MiB for a memory file */
+	netpgp_setvar(&netpgp, "max mem alloc", "4194304");
 	netpgp_set_homedir(&netpgp, getenv("HOME"), "/.gnupg", 1);
 	optindex = 0;
 	while ((ch = getopt_long(argc, argv, "", options, &optindex)) != -1) {
@@ -345,6 +449,9 @@
 		case SSHKEYFILE:
 			netpgp_setvar(&netpgp, "sshkeyfile", optarg);
 			break;
+		case MAX_MEM_ALLOC:
+			netpgp_setvar(&netpgp, "max mem alloc", optarg);
+			break;
 		case OPS_DEBUG:
 			netpgp_set_debug(optarg);
 			break;

Index: src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile:1.4 src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile:1.5
--- src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile:1.4	Mon Dec 14 23:29:57 2009
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpverify/Makefile	Tue Dec 22 06:03:25 2009
@@ -117,16 +117,16 @@
 PACKAGE = netpgp
 PACKAGE_BUGREPORT = Alistair Crooks <[email protected]> c0596823
 PACKAGE_NAME = netpgp
-PACKAGE_STRING = netpgp 20091210
+PACKAGE_STRING = netpgp 20091221
 PACKAGE_TARNAME = netpgp
-PACKAGE_VERSION = 20091210
+PACKAGE_VERSION = 20091221
 PATH_SEPARATOR = :
 RANLIB = ranlib
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/ksh
 STRIP = strip
-VERSION = 20091210
+VERSION = 20091221
 WARNCFLAGS = -Werror -Wall -Wpointer-arith
 abs_builddir = /usr/src/crypto/external/bsd/netpgp/dist/src/netpgpverify
 abs_srcdir = /usr/src/crypto/external/bsd/netpgp/dist/src/netpgpverify
@@ -169,7 +169,7 @@
 mkdir_p = $(top_builddir)/buildaux/install-sh -c -d
 oldincludedir = /usr/include
 pdfdir = ${docdir}
-prefix = /usr/local
+prefix = /usr/pkg
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin

Index: src/crypto/external/bsd/netpgp/lib/config.h
diff -u src/crypto/external/bsd/netpgp/lib/config.h:1.2 src/crypto/external/bsd/netpgp/lib/config.h:1.3
--- src/crypto/external/bsd/netpgp/lib/config.h:1.2	Mon Dec 14 23:29:57 2009
+++ src/crypto/external/bsd/netpgp/lib/config.h	Tue Dec 22 06:03:25 2009
@@ -125,19 +125,19 @@
 #define PACKAGE_NAME "netpgp"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "netpgp 20091210"
+#define PACKAGE_STRING "netpgp 20091221"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "netpgp"
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "20091210"
+#define PACKAGE_VERSION "20091221"
 
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
 
 /* Version number of package */
-#define VERSION "20091210"
+#define VERSION "20091221"
 
 /* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
    <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the

Reply via email to