Module Name:    src
Committed By:   agc
Date:           Sat Oct 20 05:55:43 UTC 2012

Modified Files:
        src/crypto/external/bsd/netpgp/dist/src/libverify 
[agc-netpgp-standalone]:
            libverify.c verify.h
        src/crypto/external/bsd/netpgp/dist/src/netpgpverify 
[agc-netpgp-standalone]:
            main.c

Log Message:
implement a new pgpv_get_verified() exported function, which returns the
data and its size to the caller.

implement pgpv_verify_print() in terms of pgpv_get_verified()


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 \
    src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 \
    src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 \
    src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.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/src/libverify/libverify.c
diff -u src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.1 src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.2
--- src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c:1.1.2.1	Sat Oct 20 04:59:53 2012
+++ src/crypto/external/bsd/netpgp/dist/src/libverify/libverify.c	Sat Oct 20 05:55:42 2012
@@ -2023,6 +2023,7 @@ pgpv_verify(pgpv_cursor_t *cursor, pgpv_
 		if (key_expired(pubkey, cursor->why, sizeof(cursor->why))) {
 			return 0;
 		}
+		ARRAY_APPEND(cursor->datacookies, pkt);
 		ARRAY_APPEND(cursor->found, primary);
 		return 1;
 	}
@@ -2040,29 +2041,28 @@ pgpv_read_pubring(pgpv_t *pgp, const cha
 	return read_binary_file(pgp, "pubring", "%s/%s", getenv("HOME"), ".gnupg/pubring.gpg");
 }
 
-/* print verified data to stdout */
-int
-pgpv_verify_print(pgpv_cursor_t *cursor)
+/* get verified data as a string, return its size */
+size_t
+pgpv_get_verified(pgpv_cursor_t *cursor, unsigned ent, char **ret)
 {
 	pgpv_litdata_t		*litdata;
 	uint8_t			*data;
-	ssize_t			 wc;
 	size_t			 size;
 	size_t			 pkt;
-	size_t			 cc;
 
-	/* datastart was setup at the start of pgpv_verify */
-	if ((pkt = find_onepass(cursor, ARRAY_LAST(cursor->pgp->datastarts))) == 0) {
+	*ret = NULL;
+	if (cursor == NULL || ent >= ARRAY_COUNT(cursor->datacookies)) {
+		return 0;
+	}
+	pkt = ARRAY_ELEMENT(cursor->datacookies, ent);
+	if ((pkt = find_onepass(cursor, pkt)) == 0) {
 		return 0;
 	}
-	pkt -= 1;
-	litdata = &ARRAY_ELEMENT(cursor->pgp->pkts, pkt + 1).u.litdata;
+	litdata = &ARRAY_ELEMENT(cursor->pgp->pkts, pkt).u.litdata;
 	data = get_literal_data(cursor, litdata, &size);
-	for (cc = 0 ; cc < size ; cc += (size_t)wc) {
-		if ((wc = write(STDOUT_FILENO, &data[cc], size - cc)) < 0) {
-			printf("short write\n");
-			return 0;
-		}
+	if ((*ret = calloc(1, size)) == NULL) {
+		return 0;
 	}
-	return 1;
+	memcpy(*ret, data, size);
+	return size;
 }

Index: src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h
diff -u src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h:1.1.2.2 src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h:1.1.2.3
--- src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h:1.1.2.2	Sat Oct 20 04:59:53 2012
+++ src/crypto/external/bsd/netpgp/dist/src/libverify/verify.h	Sat Oct 20 05:55:43 2012
@@ -247,6 +247,7 @@ typedef struct pgpv_cursor_t {
 	char			*value;			/* value we're searching for */
 	void			*ptr;			/* for regexps etc */
 	PGPV_ARRAY(uint32_t,	 found);		/* array of matched subscripts */
+	PGPV_ARRAY(uint32_t,	 datacookies);		/* cookies to retrieve matched data */
 	int64_t			 sigtime;		/* time of signature */
 	char			 why[128];		/* reason for bad signature */
 } pgpv_cursor_t;
@@ -266,7 +267,7 @@ __BEGIN_DECLS
 int pgpv_read_pubring(pgpv_t */*pgp*/, const char */*keyring*/);
 
 int pgpv_verify(pgpv_cursor_t */*cursor*/, pgpv_t */*pgp*/, const void */*mem/file*/, ssize_t /*size*/);
-int pgpv_verify_print(pgpv_cursor_t */*cursor*/);
+size_t pgpv_get_verified(pgpv_cursor_t */*cursor*/, unsigned /*ent*/, char **/*ret*/);
 
 size_t pgpv_get_entry(pgpv_t */*pgp*/, unsigned /*ent*/, char **/*ret*/);
 

Index: src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.c
diff -u src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.c:1.1.2.1 src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.c:1.1.2.2
--- src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.c:1.1.2.1	Sat Oct 20 04:59:53 2012
+++ src/crypto/external/bsd/netpgp/dist/src/netpgpverify/main.c	Sat Oct 20 05:55:43 2012
@@ -87,14 +87,18 @@ getstdin(ssize_t *cc, size_t *size)
 
 /* verify memory or file */
 static int
-verify_data(pgpv_t *pgp, const char *cmd, const char *inname, char *in, size_t cc)
+verify_data(pgpv_t *pgp, const char *cmd, const char *inname, char *in, size_t cc, unsigned n)
 {
 	pgpv_cursor_t	 cursor;
+	size_t		 size;
+	char		*data;
 
 	memset(&cursor, 0x0, sizeof(cursor));
 	if (strcasecmp(cmd, "cat") == 0) {
 		if (pgpv_verify(&cursor, pgp, in, cc)) {
-			pgpv_verify_print(&cursor);
+			if ((size = pgpv_get_verified(&cursor, ARRAY_ELEMENT(cursor.datacookies, n), &data)) > 0) {
+				printf("%.*s", (int)size, data);
+			}
 			return 1;
 		}
 	} else if (strcasecmp(cmd, "verify") == 0) {
@@ -147,10 +151,10 @@ main(int argc, char **argv)
 	}
 	if (optind == argc) {
 		in = getstdin(&cc, &size);
-		ok = verify_data(&pgp, cmd, "[stdin]", in, cc);
+		ok = verify_data(&pgp, cmd, "[stdin]", in, cc, 0);
 	} else {
 		for (ok = 1, i = optind ; i < argc ; i++) {
-			if (!verify_data(&pgp, cmd, argv[i], argv[i], -1)) {
+			if (!verify_data(&pgp, cmd, argv[i], argv[i], -1, i)) {
 				ok = 0;
 			}
 		}

Reply via email to