Module Name:    src
Committed By:   agc
Date:           Wed Sep  8 03:21:23 UTC 2010

Modified Files:
        src/crypto/external/bsd/netpgp/dist: TODO
        src/crypto/external/bsd/netpgp/dist/src/lib: crypto.c crypto.h netpgp.c
            openssl_crypto.c packet-parse.c ssh2pgp.c version.h
        src/crypto/external/bsd/netpgp/dist/src/libmj: libmj.3 mj.c mj.h
        src/crypto/external/bsd/netpgp/dist/src/netpgp: netpgp.c
        src/crypto/external/bsd/netpgp/dist/src/netpgpkeys: netpgpkeys.c

Log Message:
Changes to 3.99.12/20100907

+ add a pretty print function mj_pretty(3) to libmj
+ added netpgp_write_sshkey(3) to libnetpgp
+ added pgp2ssh(1)
+ added preliminary support for ElGamal decryption, needed for DSA keys
  as yet untested, unworking, and a WIP
+ add support for using all ssh keys, even those protected by a passphrase,
  for decryption and signing. This rounds off ssh key file support in netpgp.
+ add a single character alias [-S file] for [--sshkeyfile file] to
  netpgpkeys(1) and netpgp(1)

As far as ssh key file support goes, see the following example:

        % cp configure a
        % netpgp -S ~/.ssh/id_rsa.pub -e a
        % netpgp -S ~/.ssh/id_rsa.pub -d a.gpg
        Enter PEM pass phrase:
        % ls -al a a.gpg
        -rwxr-xr-x  1 agc  agc  758398 Sep  7 05:38 a
        -rw-------  1 agc  agc  156886 Sep  7 05:38 a.gpg
        %


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/crypto/external/bsd/netpgp/dist/TODO
cvs rdiff -u -r1.27 -r1.28 \
    src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
cvs rdiff -u -r1.20 -r1.21 \
    src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
cvs rdiff -u -r1.74 -r1.75 \
    src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
cvs rdiff -u -r1.28 -r1.29 \
    src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c
cvs rdiff -u -r1.41 -r1.42 \
    src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c \
    src/crypto/external/bsd/netpgp/dist/src/lib/version.h
cvs rdiff -u -r1.16 -r1.17 \
    src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
cvs rdiff -u -r1.1 -r1.2 \
    src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3 \
    src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h
cvs rdiff -u -r1.3 -r1.4 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c
cvs rdiff -u -r1.14 -r1.15 \
    src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
cvs rdiff -u -r1.18 -r1.19 \
    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.41 src/crypto/external/bsd/netpgp/dist/TODO:1.42
--- src/crypto/external/bsd/netpgp/dist/TODO:1.41	Sun Aug 15 07:52:26 2010
+++ src/crypto/external/bsd/netpgp/dist/TODO	Wed Sep  8 03:21:21 2010
@@ -6,7 +6,6 @@
 convert to and from ascii armored sigs
 gpgme compat lib
 get rid of public key free as part of seckey
-return userids from successful verify, and then print id out if required
 is get_passphrase_cb needed?
 error logging
 separate from libcrypto?
@@ -97,3 +96,6 @@
 make netpgpkeys work - add, import, commit, update, sign, passphrase
 fix ssh fingerprints not matching netpgp
 json/yaml output
+return userids from successful verify, and then print id out if required
+convert between pgp and ssh key formats
+PEM ssh keys and passphrases

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.27 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.28
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c:1.27	Sun Aug 15 07:52:26 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.c	Wed Sep  8 03:21:22 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.27 2010/08/15 07:52:26 agc Exp $");
+__RCSID("$NetBSD: crypto.c,v 1.28 2010/09/08 03:21:22 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -143,8 +143,43 @@
 		return n - i;
 	case OPS_PKA_DSA:
 	case OPS_PKA_ELGAMAL:
-		(void) fprintf(stderr, "XXX - no support for DSA/Elgamal yet\n");
-		return 0;
+		(void) fprintf(stderr, "XXX - preliminary support for DSA/Elgamal\n");
+		if (__ops_get_debug_level(__FILE__)) {
+			hexdump(stderr, "encrypted", encmpibuf, 16);
+		}
+		n = __ops_elgamal_private_decrypt(mpibuf, encmpibuf,
+					(unsigned)(BN_num_bits(encmpi) + 7) / 8,
+					&seckey->key.elgamal, &seckey->pubkey.key.elgamal);
+		if (n == -1) {
+			(void) fprintf(stderr, "ops_elgamal_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;
 	default:
 		(void) fprintf(stderr, "pubkey algorithm wrong\n");
 		return -1;
@@ -216,6 +251,10 @@
 		return __ops_pk_sesskey_cb(pkt, cbinfo);
 
 	case OPS_GET_SECKEY:
+		if (cbinfo->sshseckey) {
+			*content->get_seckey.seckey = cbinfo->sshseckey;
+			return OPS_KEEP_MEMORY;
+		}
 		return __ops_get_seckey_cb(pkt, cbinfo);
 
 	case OPS_GET_PASSPHRASE:
@@ -361,6 +400,7 @@
 			__ops_keyring_t *pubring,
 			const unsigned use_armour,
 			const unsigned allow_overwrite,
+			const unsigned sshkeys,
 			void *passfp,
 			__ops_cbfunc_t *getpassfunc)
 {
@@ -424,6 +464,7 @@
 	parse->cbinfo.passfp = passfp;
 	parse->cbinfo.cryptinfo.getpassphrase = getpassfunc;
 	parse->cbinfo.cryptinfo.pubring = pubring;
+	parse->cbinfo.sshseckey = (sshkeys) ? &secring->keys[0].key.seckey : NULL;
 
 	/* Set up armour/passphrase options */
 	if (use_armour) {
@@ -456,6 +497,7 @@
 			__ops_keyring_t *secring,
 			__ops_keyring_t *pubring,
 			const unsigned use_armour,
+			const unsigned sshkeys,
 			void *passfp,
 			__ops_cbfunc_t *getpassfunc)
 {
@@ -487,6 +529,7 @@
 	parse->cbinfo.cryptinfo.pubring = pubring;
 	parse->cbinfo.passfp = passfp;
 	parse->cbinfo.cryptinfo.getpassphrase = getpassfunc;
+	parse->cbinfo.sshseckey = (sshkeys) ? &secring->keys[0].key.seckey : NULL;
 
 	/* Set up armour/passphrase options */
 	if (use_armour) {

Index: src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.20 src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.21
--- src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h:1.20	Tue May 25 01:05:10 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/crypto.h	Wed Sep  8 03:21:22 2010
@@ -145,6 +145,9 @@
 int __ops_rsa_private_decrypt(uint8_t *, const uint8_t *, size_t,
 			const __ops_rsa_seckey_t *, const __ops_rsa_pubkey_t *);
 
+int __ops_elgamal_private_decrypt(uint8_t *, const uint8_t *, size_t,
+			const __ops_elgamal_seckey_t *, const __ops_elgamal_pubkey_t *);
+
 unsigned __ops_block_size(__ops_symm_alg_t);
 unsigned __ops_key_size(__ops_symm_alg_t);
 
@@ -189,6 +192,7 @@
 			__ops_keyring_t *,
 			const unsigned,
 			const unsigned,
+			const unsigned,
 			void *,
 			__ops_cbfunc_t *);
 
@@ -205,6 +209,7 @@
 			__ops_keyring_t *,
 			__ops_keyring_t *,
 			const unsigned,
+			const unsigned,
 			void *,
 			__ops_cbfunc_t *);
 
@@ -256,6 +261,7 @@
 	void			*passfp;	/* fp for passphrase input */
 	__ops_cryptinfo_t	 cryptinfo;	/* used when decrypting */
 	__ops_printstate_t	 printstate;	/* used to keep state when printing */
+	__ops_seckey_t		*sshseckey;	/* secret key for ssh */
 };
 
 /** __ops_hashtype_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.74 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.75
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.74	Mon Sep  6 18:19:38 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c	Wed Sep  8 03:21:22 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.74 2010/09/06 18:19:38 agc Exp $");
+__RCSID("$NetBSD: netpgp.c,v 1.75 2010/09/08 03:21:22 agc Exp $");
 #endif
 
 #include <sys/types.h>
@@ -264,6 +264,12 @@
 	if ((filename = netpgp_getvar(netpgp, "sshkeyfile")) == NULL) {
 		(void) snprintf(f, sizeof(f), "%s/id_rsa.pub", homedir);
 		filename = f;
+	} else {
+		/* got ssh keys, check for pub file name */
+		if (strcmp(&filename[strlen(filename) - 4], ".pub") != 0) {
+			(void) fprintf(stderr, "readsshkeys: bad pubkey filename '%s'\n", filename);
+			return 0;
+		}
 	}
 	if ((pubring = calloc(1, sizeof(*pubring))) == NULL) {
 		(void) fprintf(stderr, "readsshkeys: bad alloc\n");
@@ -1185,6 +1191,7 @@
 	const unsigned	 overwrite = 1;
 	__ops_io_t	*io;
 	unsigned	 realarmor;
+	unsigned	 sshkeys;
 
 	__OPS_USED(armored);
 	io = netpgp->io;
@@ -1194,9 +1201,10 @@
 		return 0;
 	}
 	realarmor = isarmoured(io, f, NULL, ARMOR_HEAD);
+	sshkeys = (unsigned)(netpgp_getvar(netpgp, "ssh keys") != NULL);
 	return __ops_decrypt_file(netpgp->io, f, out, netpgp->secring,
 				netpgp->pubring,
-				realarmor, overwrite,
+				realarmor, overwrite, sshkeys,
 				netpgp->passfp, get_passphrase_cb);
 }
 
@@ -1491,6 +1499,7 @@
 	__ops_memory_t	*mem;
 	__ops_io_t	*io;
 	unsigned	 realarmour;
+	unsigned	 sshkeys;
 	size_t		 m;
 
 	__OPS_USED(armored);
@@ -1501,9 +1510,11 @@
 		return 0;
 	}
 	realarmour = isarmoured(io, NULL, input, ARMOR_HEAD);
+	sshkeys = (unsigned)(netpgp_getvar(netpgp, "ssh keys") != NULL);
 	mem = __ops_decrypt_buf(netpgp->io, input, insize, netpgp->secring,
 				netpgp->pubring,
-				realarmour, netpgp->passfp,
+				realarmour, sshkeys,
+				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/openssl_crypto.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.28 src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.29
--- src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c:1.28	Tue Sep  7 00:25:37 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/openssl_crypto.c	Wed Sep  8 03:21:22 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.28 2010/09/07 00:25:37 agc Exp $");
+__RCSID("$NetBSD: openssl_crypto.c,v 1.29 2010/09/08 03:21:22 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_DSA_H
@@ -77,7 +77,10 @@
 
 #include <stdlib.h>
 #include <string.h>
-/* Hash size for secret key check */
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 #include "crypto.h"
 #include "keyring.h"
@@ -834,10 +837,13 @@
 openssl_read_pem_seckey(const char *f, __ops_key_t *key, const char *type, int verbose)
 {
 	FILE	*fp;
+	char	 prompt[BUFSIZ];
+	char	*pass;
 	DSA	*dsa;
 	RSA	*rsa;
 	int	 ok;
 
+	OpenSSL_add_all_algorithms();
 	if ((fp = fopen(f, "r")) == NULL) {
 		if (verbose) {
 			(void) fprintf(stderr, "can't open '%s'\n", f);
@@ -847,13 +853,16 @@
 	ok = 1;
 	if (strcmp(type, "ssh-rsa") == 0) {
 		if ((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)) == NULL) {
-			ok = 0;
-		} else {
-			key->key.seckey.key.rsa.d = rsa->d;
-			key->key.seckey.key.rsa.p = rsa->p;
-			key->key.seckey.key.rsa.q = rsa->q;
-			key->key.seckey.key.rsa.d = rsa->d;
+			(void) snprintf(prompt, sizeof(prompt), "netpgp PEM %s passphrase: ", f);
+			do {
+				pass = getpass(prompt);
+				rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, pass);
+			} while (rsa == NULL);
 		}
+		key->key.seckey.key.rsa.d = rsa->d;
+		key->key.seckey.key.rsa.p = rsa->p;
+		key->key.seckey.key.rsa.q = rsa->q;
+		key->key.seckey.key.rsa.d = rsa->d;
 	} else if (strcmp(type, "ssh-dss") == 0) {
 		if ((dsa = PEM_read_DSAPrivateKey(fp, NULL, NULL, NULL)) == NULL) {
 			ok = 0;
@@ -866,3 +875,77 @@
 	(void) fclose(fp);
 	return ok;
 }
+
+int
+__ops_elgamal_private_decrypt(uint8_t *out,
+				const uint8_t *in,
+				size_t length,
+				const __ops_elgamal_seckey_t *seckey,
+				const __ops_elgamal_pubkey_t *pubkey)
+{
+	BIGNUM	*bndiv;
+	BIGNUM	*c1x;
+	BN_CTX	*tmp;
+	BIGNUM	*c1;
+	BIGNUM	*c2;
+	BIGNUM	*p;
+	BIGNUM	*x;
+	BIGNUM	*m;
+	int	 ret = 0;
+
+	/* split in byutes into c1 and c2 */
+	c1 = BN_bin2bn(in, (int)(length / 2), NULL);
+	c2 = BN_bin2bn(&in[length / 2], (int)(length / 2), NULL);
+	/* other bits */
+	p = pubkey->p;
+	x = seckey->x;
+	c1x = BN_new();
+	bndiv = BN_new();
+	m = BN_new();
+	tmp = BN_CTX_new();
+	if (!c1 || !c2 || !p || !x || !c1x || !bndiv || !m || !tmp) {
+		goto done;
+	}
+	/*
+	 * m = c2 / (c1^x)
+	 */
+	if (!BN_mod_exp(c1x, c1, x, p, tmp)) {
+		goto done;
+	}
+	if (!BN_mod_inverse(bndiv, c1x, p, tmp)) {
+		goto done;
+	}
+	if (!BN_mod_mul(m, c2, bndiv, p, tmp)) {
+		goto done;
+	}
+	/* result */
+	if (BN_bn2bin(m, out) > 0) {
+		ret = 1;
+	}
+done:
+	if (tmp) {
+		BN_CTX_free(tmp);
+	}
+	if (m) {
+		BN_clear_free(m);
+	}
+	if (bndiv) {
+		BN_clear_free(bndiv);
+	}
+	if (c1x) {
+		BN_clear_free(c1x);
+	}
+	if (x) {
+		BN_clear_free(x);
+	}
+	if (p) {
+		BN_clear_free(p);
+	}
+	if (c1) {
+		BN_clear_free(c1);
+	}
+	if (c2) {
+		BN_clear_free(c2);
+	}
+	return ret;
+}

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.41 src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.42
--- src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c:1.41	Sun Aug 15 16:36:24 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/packet-parse.c	Wed Sep  8 03:21:22 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.41 2010/08/15 16:36:24 agc Exp $");
+__RCSID("$NetBSD: packet-parse.c,v 1.42 2010/09/08 03:21:22 agc Exp $");
 #endif
 
 #ifdef HAVE_OPENSSL_CAST_H
@@ -2550,7 +2550,6 @@
 		break;
 
 	case OPS_PKA_ELGAMAL:
-printf("elgamal reading\n");
 		if (!limread_mpi(&pkt.u.seckey.key.elgamal.x, region, stream)) {
 			ret = 0;
 		}
@@ -2652,7 +2651,6 @@
 	unsigned		 k;
 	BIGNUM			*enc_m;
 	int			 n;
-
 	/* Can't rely on it being CAST5 */
 	/* \todo FIXME RW */
 	/* const size_t sz_unencoded_m_buf=CAST_KEY_LENGTH+1+2; */
Index: src/crypto/external/bsd/netpgp/dist/src/lib/version.h
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.41 src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.42
--- src/crypto/external/bsd/netpgp/dist/src/lib/version.h:1.41	Thu Sep  2 06:00:12 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/version.h	Wed Sep  8 03:21:22 2010
@@ -58,7 +58,7 @@
 #endif
 
 /* development versions have .99 suffix */
-#define NETPGP_BASE_VERSION	"3.99.11"
+#define NETPGP_BASE_VERSION	"3.99.12"
 
 #define NETPGP_VERSION_CAT(a, b)	"NetPGP portable " a "/[" b "]"
 #define NETPGP_VERSION_STRING \

Index: src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.16 src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.17
--- src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c:1.16	Sun Aug 15 07:52:27 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/ssh2pgp.c	Wed Sep  8 03:21:22 2010
@@ -242,6 +242,13 @@
 	bufgap_seek(&bg, 1, BGFromHere, BGByte);
 	off = bufgap_tell(&bg, BGFromBOF, BGByte);
 
+	if (bufgap_size(&bg, BGByte) - off < 10) {
+		(void) fprintf(stderr, "bad key file '%s'\n", f);
+		(void) free(buf);
+		bufgap_close(&bg);
+		return 0;
+	}
+
 	/* convert from base64 to binary */
 	cc = bufgap_getbin(&bg, buf, (size_t)st.st_size);
 	if ((space = strchr(buf, ' ')) != NULL) {

Index: src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3
diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.1 src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.2
--- src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3:1.1	Sat Aug  7 04:13:57 2010
+++ src/crypto/external/bsd/netpgp/dist/src/libmj/libmj.3	Wed Sep  8 03:21:22 2010
@@ -85,6 +85,10 @@
 .Fo mj_string_size
 .Fa "mj_t *atom"
 .Fc
+.Ft int
+.Fo mj_pretty
+.Fa "mj_t *atom" "void *stream" "unsigned depth" "const char *trailer"
+.Fc
 .Sh DESCRIPTION
 .Nm
 is a small library interface to allow JSON text to be created and parsed.
@@ -144,12 +148,28 @@
 and the JSON serialised text is copied into it.
 This memory can later be de-allocated using
 .Xr free 3 .
+For formatted output to a
+.Dv FILE *
+stream, the
+.Fn mj_pretty
+function is used.
+The calling interface gives the ability to indent the
+output to a given
+.Fa depth
+and for the formatted output to be followed by a
+.Fa trailer
+string, which is usually NULL for external calls,
+but can be any valid string.
+Output is sent to the
+.Fa stream
+file stream.
 .Pp
 The
 .Fa type
 argument given to the
 .Fn mj_create ,
-.Fn mj_append and
+.Fn mj_append ,
+and
 .Fn mj_append_field
 functions is taken from a list of
 .Dq false
@@ -171,9 +191,6 @@
 index to access the individual
 JSON objects.
 The index can also be found using the
-.Fn mj_object_index
-function, and the object using
-the
 .Fn mj_object_find
 function.
 .Pp
Index: src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h
diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.1 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.2
--- src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h:1.1	Sat Aug  7 04:13:57 2010
+++ src/crypto/external/bsd/netpgp/dist/src/libmj/mj.h	Wed Sep  8 03:21:22 2010
@@ -64,5 +64,6 @@
 int mj_snprint(char *, size_t, mj_t *);
 int mj_asprint(char **, mj_t *);
 int mj_string_size(mj_t *);
+int mj_pretty(mj_t *, void *, unsigned, const char *);
 
 #endif

Index: src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c
diff -u src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.3 src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.4
--- src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c:1.3	Sat Aug  7 04:53:56 2010
+++ src/crypto/external/bsd/netpgp/dist/src/libmj/mj.c	Wed Sep  8 03:21:22 2010
@@ -152,6 +152,20 @@
 	return *tok;
 }
 
+/* minor function used to indent a JSON field */
+static void
+indent(FILE *fp, unsigned depth, const char *trailer)
+{
+	unsigned	i;
+
+	for (i = 0 ; i < depth ; i++) {
+		(void) fprintf(fp, "    ");
+	}
+	if (trailer) {
+		(void) fprintf(fp, "%s", trailer);
+	}
+}
+
 /***************************************************************************/
 
 /* return the number of entries in the array */
@@ -479,6 +493,7 @@
 	return 1;
 }
 
+/* make sure a JSON object is politically correct */
 int
 mj_lint(mj_t *obj)
 {
@@ -519,3 +534,42 @@
 		return 0;
 	}
 }
+
+/* pretty-print a JSON struct - can be called recursively */
+int
+mj_pretty(mj_t *mj, void *vp, unsigned depth, const char *trailer)
+{
+	unsigned	 i;
+	FILE		*fp;
+
+	fp = (FILE *)vp;
+	switch(mj->type) {
+	case MJ_NUMBER:
+	case MJ_TRUE:
+	case MJ_FALSE:
+	case MJ_NULL:
+		indent(fp, depth, mj->value.s);
+		break;
+	case MJ_STRING:
+		indent(fp, depth, NULL);
+		(void) fprintf(fp, "\"%s\"", mj->value.s);
+		break;
+	case MJ_ARRAY:
+		indent(fp, depth, "[\n");
+		for (i = 0 ; i < mj->c ; i++) {
+			mj_pretty(&mj->value.v[i], fp, depth + 1, (i < mj->c - 1) ? ",\n" : "\n");
+		}
+		indent(fp, depth, "]");
+		break;
+	case MJ_OBJECT:
+		indent(fp, depth, "{\n");
+		for (i = 0 ; i < mj->c ; i += 2) {
+			mj_pretty(&mj->value.v[i], fp, depth + 1, " : ");
+			mj_pretty(&mj->value.v[i + 1], fp, 0, (i < mj->c - 2) ? ",\n" : "\n");
+		}
+		indent(fp, depth, "}");
+		break;
+	}
+	indent(fp, 0, trailer);
+	return 1;
+}

Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.14 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.15
--- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.14	Wed Sep  1 17:25:57 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c	Wed Sep  8 03:21:22 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: netpgp.c,v 1.14 2010/09/01 17:25:57 agc Exp $ */
+/* $NetBSD: netpgp.c,v 1.15 2010/09/08 03:21:22 agc Exp $ */
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -527,7 +527,7 @@
 	netpgp_setvar(&netpgp, "max mem alloc", "4194304");
 	homeset = 0;
 	optindex = 0;
-	while ((ch = getopt_long(argc, argv, "Vdeo:sv", options, &optindex)) != -1) {
+	while ((ch = getopt_long(argc, argv, "S:Vdeo:sv", options, &optindex)) != -1) {
 		if (ch >= ENCRYPT) {
 			/* getopt_long returns 0 for long options */
 			if (!setoption(&netpgp, &p, options[optindex].val, optarg, &homeset)) {
@@ -535,6 +535,10 @@
 			}
 		} else {
 			switch (ch) {
+			case 'S':
+				netpgp_setvar(&netpgp, "ssh keys", "1");
+				netpgp_setvar(&netpgp, "sshkeyfile", optarg);
+				break;
 			case 'V':
 				printf(
 	"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n",

Index: src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.18 src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.19
--- src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c:1.18	Thu Sep  2 06:00:12 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpkeys/netpgpkeys.c	Wed Sep  8 03:21:23 2010
@@ -387,7 +387,7 @@
 	netpgp_setvar(&netpgp, "res", "<stdout>");
 	netpgp_setvar(&netpgp, "hash", DEFAULT_HASH_ALG);
 	optindex = 0;
-	while ((ch = getopt_long(argc, argv, "Vglo:s", options, &optindex)) != -1) {
+	while ((ch = getopt_long(argc, argv, "S:Vglo:s", options, &optindex)) != -1) {
 		if (ch >= LIST_KEYS) {
 			/* getopt_long returns 0 for long options */
 			if (!setoption(&netpgp, &p, options[optindex].val, optarg, &homeset)) {
@@ -395,6 +395,10 @@
 			}
 		} else {
 			switch (ch) {
+			case 'S':
+				netpgp_setvar(&netpgp, "ssh keys", "1");
+				netpgp_setvar(&netpgp, "sshkeyfile", optarg);
+				break;
 			case 'V':
 				printf(
 	"%s\nAll bug reports, praise and chocolate, please, to:\n%s\n",

Reply via email to