Module Name: src
Committed By: agc
Date: Wed Sep 1 17:25:58 UTC 2010
Modified Files:
src/crypto/external/bsd/netpgp/dist: tst
src/crypto/external/bsd/netpgp/dist/src/hkpd: Makefile hkpd.c main.c
src/crypto/external/bsd/netpgp/dist/src/lib: create.c keyring.c
netpgp.c
src/crypto/external/bsd/netpgp/dist/src/netpgp: netpgp.c
src/crypto/external/bsd/netpgp/dist/src/netpgpverify: verify.c
Log Message:
Various minor changes to netpgp:
+ be smarter when checking for a null id
+ add test for rubbish being returned when listing specific keys in
netpgpkeys(1)
+ take the public key from the pubring, not the secring when exporting
keys
+ allow hkpd to serve ssh keys in pgp format
+ test on whether a seckey is needed, not on a userid needed, for ssh keys
To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/crypto/external/bsd/netpgp/dist/tst
cvs rdiff -u -r1.2 -r1.3 \
src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile \
src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c
cvs rdiff -u -r1.4 -r1.5 src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c
cvs rdiff -u -r1.33 -r1.34 \
src/crypto/external/bsd/netpgp/dist/src/lib/create.c
cvs rdiff -u -r1.45 -r1.46 \
src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
cvs rdiff -u -r1.70 -r1.71 \
src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
cvs rdiff -u -r1.13 -r1.14 \
src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
cvs rdiff -u -r1.14 -r1.15 \
src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.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/tst
diff -u src/crypto/external/bsd/netpgp/dist/tst:1.28 src/crypto/external/bsd/netpgp/dist/tst:1.29
--- src/crypto/external/bsd/netpgp/dist/tst:1.28 Sat Aug 7 04:27:00 2010
+++ src/crypto/external/bsd/netpgp/dist/tst Wed Sep 1 17:25:57 2010
@@ -36,7 +36,7 @@
su root -c "make install"'
passed=0
-total=34
+total=35
rm -f passed
date > passed
echo "======> sign/verify 180938 file"
@@ -181,5 +181,8 @@
echo "user sshkey \"$sshkey\" = netpgpkey \"$netpgpkey\""
[ $sshkey = $netpgpkey ] && passed=$(expr $passed + 1)
echo "34 " $passed >> passed
+echo "======> single key listing"
+/usr/bin/netpgpkeys -l agc && passed=$(expr $passed + 1)
+echo "35 " $passed >> passed
rm -f a a.gpg b b.gpg c c.gpg d d.gpg e f f.sig g g.asc g2 a2 a3 a4 a5 h h.sig i i.asc
echo "Passed ${passed}/${total} tests"
Index: src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile
diff -u src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile:1.2 src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile:1.3
--- src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile:1.2 Tue Mar 16 00:22:52 2010
+++ src/crypto/external/bsd/netpgp/dist/src/hkpd/Makefile Wed Sep 1 17:25:57 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2010/03/16 00:22:52 agc Exp $
+# $NetBSD: Makefile,v 1.3 2010/09/01 17:25:57 agc Exp $
PROG=hkpd
SRCS=hkpd.c main.c
@@ -9,3 +9,11 @@
WARNS=0 # anything over 0 will fail at the link stage with IDEA errors
.include <bsd.prog.mk>
+
+t: ${PROG}
+ ./${PROG} -D &
+ sleep 1
+ ftp -o- 'http://localhost:11371/pks/lookup?op=index&search=agc&options=json'
+ ftp -o- 'http://localhost:11371/pks/lookup?op=get&search=agc&options=json'
+ ftp -o- 'http://localhost:11371/pks/lookup?op=get&search=agc&options=mr'
+ pkill hkpd
Index: src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c
diff -u src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c:1.2 src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c:1.3
--- src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c:1.2 Tue Mar 16 00:22:52 2010
+++ src/crypto/external/bsd/netpgp/dist/src/hkpd/main.c Wed Sep 1 17:25:57 2010
@@ -92,7 +92,7 @@
host = strdup("localhost");
daemonise = 1;
family = strdup("46");
- while ((i = getopt(argc, argv, "DH:Vf:h:p:v:")) != -1) {
+ while ((i = getopt(argc, argv, "DH:S:Vf:h:p:v:")) != -1) {
switch(i) {
case 'D':
daemonise = 0;
@@ -100,6 +100,10 @@
case 'H':
set_homedir(&netpgp, optarg, NULL, 0);
break;
+ case 'S':
+ netpgp_setvar(&netpgp, "ssh keys", "1");
+ netpgp_setvar(&netpgp, "sshkeyfile", optarg);
+ break;
case 'V':
printf("%s: Version %d\n", *argv, HKPD_VERSION);
exit(EXIT_SUCCESS);
Index: src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c
diff -u src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c:1.4 src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c:1.5
--- src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c:1.4 Tue Mar 16 04:14:29 2010
+++ src/crypto/external/bsd/netpgp/dist/src/hkpd/hkpd.c Wed Sep 1 17:25:57 2010
@@ -31,7 +31,6 @@
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/stat.h>
-#include <sys/param.h>
#include <sys/select.h>
#include <netinet/in.h>
@@ -78,7 +77,7 @@
/* make into html */
static int
-htmlify(char *buf, size_t size, const int code, const int get, const char *title, const int mr, const char *body)
+htmlify(char *buf, size_t size, const int code, const int get, const char *title, const char *out, const char *body)
{
return snprintf(buf, size,
"%s %d %s\r\n"
@@ -90,13 +89,13 @@
HKP_HTTP_LEVEL, code, (code == HKP_SUCCESS) ? "OK" : "not found",
HKP_NAME, HKPD_VERSION,
(get) ? HKP_MIME_GET : HKP_MIME_INDEX,
- (get || !mr) ? "" : HKP_MACHREAD,
+ (get || strcmp(out, "mr") != 0) ? "" : HKP_MACHREAD,
body);
}
/* send the response now */
static int
-response(int sock, const int code, const char *search, const int get, char *buf, int cc, int mr)
+response(int sock, const int code, const char *search, const int get, char *buf, int cc, const char *out)
{
char outbuf[1024 * 512];
char item[BUFSIZ];
@@ -109,13 +108,13 @@
"Error handling request: No keys found for '%s'\r\n", search);
n = htmlify(outbuf, sizeof(outbuf), code, get,
"Error handling request\r\n",
- mr,
+ out,
item);
} else {
(void) snprintf(item, sizeof(item), "Search results for '%s'", search);
n = htmlify(outbuf, sizeof(outbuf), code, get,
item,
- mr,
+ out,
buf);
}
for (tot = 0 ; (wc = write(sock, &outbuf[tot], n - tot)) > 0 && tot < n ; tot += wc) {
@@ -203,20 +202,20 @@
struct sockaddr_in from;
regmatch_t searchmatches[10];
regmatch_t opmatches[10];
- regmatch_t mrmatch[3];
+ regmatch_t fmtmatch[3];
socklen_t fromlen;
- regex_t machreadterm;
regex_t searchterm;
+ regex_t fmtterm;
regex_t opterm;
regex_t get;
fd_set sockets;
char search[BUFSIZ];
char buf[BUFSIZ];
char *cp;
+ char fmt[10];
int newsock;
int sock;
int code;
- int mr;
int ok;
int cc;
int n;
@@ -225,12 +224,12 @@
#define HTTPGET "GET /pks/lookup\\?"
#define OPTERM "op=([a-zA-Z]+)"
#define SEARCHTERM "search=([^ \t&]+)"
-#define MACHREAD "options=mr"
+#define FMT "options=(mr|json)"
(void) regcomp(&get, HTTPGET, REG_EXTENDED);
(void) regcomp(&opterm, OPTERM, REG_EXTENDED);
(void) regcomp(&searchterm, SEARCHTERM, REG_EXTENDED);
- (void) regcomp(&machreadterm, MACHREAD, REG_EXTENDED);
+ (void) regcomp(&fmtterm, FMT, REG_EXTENDED);
if (sock4 >= 0) {
listen(sock4, 32);
}
@@ -265,8 +264,12 @@
(void) fprintf(stderr, "no operation in request\n");
ok = 0;
}
- if (ok) {
- mr = (regexec(&machreadterm, buf, 3, mrmatch, 0) == 0);
+ if (ok && regexec(&fmtterm, buf, 3, fmtmatch, 0) == 0) {
+ (void) snprintf(fmt, sizeof(fmt), "%.*s",
+ (int)(fmtmatch[1].rm_eo - fmtmatch[1].rm_so),
+ &buf[(int)fmtmatch[1].rm_so]);
+ } else {
+ fmt[0] = 0x0;
}
if (ok && regexec(&searchterm, buf, 10, searchmatches, 0) != 0) {
(void) fprintf(stderr, "no search term in request\n");
@@ -286,26 +289,36 @@
if (strncmp(&buf[opmatches[1].rm_so], "vindex", 6) == 0) {
cc = 0;
netpgp_setvar(netpgp, "subkey sigs", "yes");
- if ((cp = netpgp_get_key(netpgp, search, (mr) ? "mr" : "")) != NULL) {
+ if (strcmp(fmt, "json") == 0) {
+ if (netpgp_match_keys_json(netpgp, &cp, search, "human", 1)) {
+ cc = strlen(cp);
+ code = HKP_SUCCESS;
+ }
+ } else if ((cp = netpgp_get_key(netpgp, search, fmt)) != NULL) {
cc = strlen(cp);
code = HKP_SUCCESS;
}
- response(newsock, code, search, 0, cp, cc, mr);
+ response(newsock, code, search, 0, cp, cc, fmt);
netpgp_unsetvar(netpgp, "subkey sigs");
} else if (strncmp(&buf[opmatches[1].rm_so], "index", 5) == 0) {
cc = 0;
netpgp_unsetvar(netpgp, "subkey sigs");
- if ((cp = netpgp_get_key(netpgp, search, (mr) ? "mr" : "")) != NULL) {
+ if (strcmp(fmt, "json") == 0) {
+ if (netpgp_match_keys_json(netpgp, &cp, search, "human", 0)) {
+ cc = strlen(cp);
+ code = HKP_SUCCESS;
+ }
+ } else if ((cp = netpgp_get_key(netpgp, search, fmt)) != NULL) {
cc = strlen(cp);
code = HKP_SUCCESS;
}
- response(newsock, code, search, 0, cp, cc, mr);
+ response(newsock, code, search, 0, cp, cc, fmt);
} else if (strncmp(&buf[opmatches[1].rm_so], "get", 3) == 0) {
if ((cp = netpgp_export_key(netpgp, search)) != NULL) {
cc = strlen(cp);
code = HKP_SUCCESS;
}
- response(newsock, code, search, 1, cp, cc, mr);
+ response(newsock, code, search, 1, cp, cc, fmt);
}
free(cp);
(void) close(newsock);
Index: src/crypto/external/bsd/netpgp/dist/src/lib/create.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.33 src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.34
--- src/crypto/external/bsd/netpgp/dist/src/lib/create.c:1.33 Sun Aug 15 07:52:26 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/create.c Wed Sep 1 17:25:57 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.33 2010/08/15 07:52:26 agc Exp $");
+__RCSID("$NetBSD: create.c,v 1.34 2010/09/01 17:25:57 agc Exp $");
#endif
#include <sys/types.h>
@@ -271,7 +271,7 @@
/*
* Note that we support v3 keys here because they're needed for
- * verification - the writer doesn't allow them, though
+ * verification.
*/
static unsigned
write_seckey_body(const __ops_seckey_t *key,
@@ -480,11 +480,6 @@
static unsigned
write_struct_pubkey(__ops_output_t *output, const __ops_pubkey_t *key)
{
- if (key->version != 4) {
- (void) fprintf(stderr,
- "write_struct_pubkey: wrong key version\n");
- return 0;
- }
return __ops_write_ptag(output, OPS_PTAG_CT_PUBLIC_KEY) &&
__ops_write_length(output, 1 + 4 + 1 + pubkey_length(key)) &&
write_pubkey_body(key, output);
@@ -513,7 +508,7 @@
__ops_writer_push_armoured(output, OPS_PGP_PUBLIC_KEY_BLOCK);
}
/* public key */
- if (!write_struct_pubkey(output, &key->key.seckey.pubkey)) {
+ if (!write_struct_pubkey(output, &key->key.pubkey)) {
return 0;
}
Index: src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.45 src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.46
--- src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c:1.45 Wed Sep 1 06:20:23 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/keyring.c Wed Sep 1 17:25:57 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.45 2010/09/01 06:20:23 agc Exp $");
+__RCSID("$NetBSD: keyring.c,v 1.46 2010/09/01 17:25:57 agc Exp $");
#endif
#ifdef HAVE_FCNTL_H
@@ -821,6 +821,9 @@
__ops_getkeybyid(__ops_io_t *io, const __ops_keyring_t *keyring,
const uint8_t *keyid, unsigned *from, __ops_pubkey_t **pubkey)
{
+ uint8_t nullid[OPS_KEY_ID_SIZE];
+
+ (void) memset(nullid, 0x0, sizeof(nullid));
for ( ; keyring && *from < keyring->keyc; *from += 1) {
if (__ops_get_debug_level(__FILE__)) {
hexdump(io->errs, "keyring keyid", keyring->keys[*from].sigid, OPS_KEY_ID_SIZE);
@@ -834,7 +837,7 @@
}
return &keyring->keys[*from];
}
- if (memcmp(&keyring->keys[*from].encid, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", OPS_KEY_ID_SIZE) == 0) {
+ if (memcmp(&keyring->keys[*from].encid, nullid, sizeof(nullid)) == 0) {
continue;
}
if (memcmp(&keyring->keys[*from].encid, keyid, OPS_KEY_ID_SIZE) == 0 ||
Index: src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.70 src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.71
--- src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c:1.70 Wed Sep 1 06:20:23 2010
+++ src/crypto/external/bsd/netpgp/dist/src/lib/netpgp.c Wed Sep 1 17:25:57 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.70 2010/09/01 06:20:23 agc Exp $");
+__RCSID("$NetBSD: netpgp.c,v 1.71 2010/09/01 17:25:57 agc Exp $");
#endif
#include <sys/types.h>
@@ -575,7 +575,7 @@
}
} else {
last = (netpgp->pubring != NULL);
- if (!readsshkeys(netpgp, homedir, netpgp_getvar(netpgp, "need userid"))) {
+ if (!readsshkeys(netpgp, homedir, netpgp_getvar(netpgp, "need seckey"))) {
(void) fprintf(io->errs, "Can't read ssh keys\n");
return 0;
}
Index: src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.13 src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.14
--- src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c:1.13 Fri Aug 13 18:29:41 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgp/netpgp.c Wed Sep 1 17:25:57 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: netpgp.c,v 1.13 2010/08/13 18:29:41 agc Exp $ */
+/* $NetBSD: netpgp.c,v 1.14 2010/09/01 17:25:57 agc Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -343,13 +343,22 @@
netpgp_setvar(netpgp, "coredumps", "allowed");
break;
case ENCRYPT:
+ /* for encryption, we need a userid */
+ netpgp_setvar(netpgp, "need userid", "1");
+ p->cmd = val;
+ break;
case SIGN:
case CLEARSIGN:
- /* for encryption and signing, we need a userid */
+ /* for signing, we need a userid and a seckey */
+ netpgp_setvar(netpgp, "need seckey", "1");
netpgp_setvar(netpgp, "need userid", "1");
p->cmd = val;
break;
case DECRYPT:
+ /* for decryption, we need a seckey */
+ netpgp_setvar(netpgp, "need seckey", "1");
+ p->cmd = val;
+ break;
case VERIFY:
case VERIFY_CAT:
case LIST_PACKETS:
@@ -437,6 +446,7 @@
netpgp_setvar(netpgp, "results", arg);
break;
case SSHKEYFILE:
+ netpgp_setvar(netpgp, "ssh keys", "1");
netpgp_setvar(netpgp, "sshkeyfile", arg);
break;
case MAX_MEM_ALLOC:
@@ -532,10 +542,12 @@
netpgp_get_info("maintainer"));
exit(EXIT_SUCCESS);
case 'd':
+ /* for decryption, we need the seckey */
+ netpgp_setvar(&netpgp, "need seckey", "1");
p.cmd = DECRYPT;
break;
case 'e':
- /* for encryption and signing, we need a userid */
+ /* for encryption, we need a userid */
netpgp_setvar(&netpgp, "need userid", "1");
p.cmd = ENCRYPT;
break;
@@ -545,7 +557,8 @@
}
break;
case 's':
- /* for encryption and signing, we need a userid */
+ /* for signing, we need a userid and a seckey */
+ netpgp_setvar(&netpgp, "need seckey", "1");
netpgp_setvar(&netpgp, "need userid", "1");
p.cmd = SIGN;
break;
Index: src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.c:1.14 src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.c:1.15
--- src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.c:1.14 Thu Jul 1 04:27:21 2010
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpverify/verify.c Wed Sep 1 17:25:57 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: verify.c,v 1.14 2010/07/01 04:27:21 agc Exp $ */
+/* $NetBSD: verify.c,v 1.15 2010/09/01 17:25:57 agc Exp $ */
/*-
* Copyright (c) 2009,2010 The NetBSD Foundation, Inc.
@@ -323,6 +323,7 @@
netpgp_setvar(&netpgp, "results", optarg);
break;
case SSHKEYFILE:
+ netpgp_setvar(&netpgp, "ssh keys", "1");
netpgp_setvar(&netpgp, "sshkeyfile", optarg);
break;
case MAX_MEM_ALLOC: