[git] GnuPG - branch, neal/encrypted-mailing-lists, updated. gnupg-2.1.11-13-ge2bde0a

by Neal H. Walfield cvs at cvs.gnupg.org
Mon Feb 8 01:37:05 CET 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".

The branch, neal/encrypted-mailing-lists has been updated
       via  e2bde0a1dcef0d96b767a935ab95aa2ee1eb98ac (commit)
      from  fd7dc535f3104e521eb49d95d2bb180cd0e8a9af (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e2bde0a1dcef0d96b767a935ab95aa2ee1eb98ac
Author: Neal H. Walfield <neal at g10code.com>
Date:   Mon Feb 8 01:36:57 2016 +0100

    Add a small test and a bit of user documentation.

diff --git a/mailing-list-test/README b/mailing-list-test/README
new file mode 100644
index 0000000..1d2c366
--- /dev/null
+++ b/mailing-list-test/README
@@ -0,0 +1,70 @@
+After making sure a gpg2 with mailing list support is in your patch,
+run test.sh as follows (when you run it, it will ask for two
+passwords, use the password 'a'):
+
+  # ./test.sh
+  ***************
+  Generating a user key (use a password of 'a').
+  ***************
+  'Some User <some at user.org>'
+
+  ***************
+  Importing some public keys.
+    Running: gpg2 --batch --import keys.gpg
+  ***************
+
+  ***************
+  Set the password to 'a'
+  ***************
+
+  ***************
+  Creating mailing list.
+    Running: gpg2 --batch --quick-gen-mailing-list-key gnupg-devel <gnupg-devel at gnupg.org>
+  ***************
+  'gnupg-devel <gnupg-devel at gnupg.org>'
+
+  ...
+
+To get more verbose output, run test.sh with the -v flag.  To get even
+more output, change the gpg2 invocations to include --debug=packet.
+
+A summary of the commands:
+
+  --mailing-list-key-gen
+  --quick-gen-mailing-list-key 'Name <mailing-list at example.com>'
+
+    Create a new mailing list key.
+
+  --mailing-list-add-sub ML-KEYID SUB-KEYID...
+  --mailing-list-add-rm ML-KEYID SUB-KEYID...
+
+    Add or remove one or more subscribers from the mailing list.
+
+  --mailing-list-subs ML-KEYID
+
+    List the subscribers (using their decryted keyids!)
+
+    Compare:
+
+      $ gpg2 -k 2A08A54D
+      pub   rsa2048/2A08A54D 2016-02-08 [SC]
+      uid         [ultimate] gnupg-devel <gnupg-devel at gnupg.org> (mailing list)
+      sub   rsa2048/ED2D0863 2016-02-08 [E]
+      sub   rsa2/7C03B9E1 2016-02-08 [E]
+      sub   rsa2/83BCEFE4 2016-02-08 [E]
+      sub   rsa2/04A1E753 2016-02-08 [E]
+      sub   rsa2/535EB487 2016-02-08 [E]
+
+    The above 2-bit RSA keys!  These are the encrypted keys.  Here are
+    the real subscribers:
+
+      $ gpg2 --mailing-list-subs 2A08A54D
+      D1B030E3
+      AA45C71F
+      94244910
+      95A0BEEA
+        4 subscribers.
+
+To encrypt to a mailing list, just do: gpg2 -r ML-KEYID -e and a gnupg
+with encrypted mailing list support will automatically encrypt to the
+list of current subscribers.
diff --git a/mailing-list-test/keys.gpg b/mailing-list-test/keys.gpg
new file mode 100644
index 0000000..12831dd
--- /dev/null
+++ b/mailing-list-test/keys.gpg
@@ -0,0 +1,621 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+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
+=l1Ul
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/mailing-list-test/test.sh b/mailing-list-test/test.sh
new file mode 100755
index 0000000..fbe1cdd
--- /dev/null
+++ b/mailing-list-test/test.sh
@@ -0,0 +1,238 @@
+#! /bin/bash
+
+set -e
+# set -x
+
+if ! test -e mailing-list
+then
+    echo "Are you sure you are in the right directory?"
+    exit 1
+fi
+
+set +e
+TEMP=$(getopt \
+         --longoptions verbose \
+         -o v \
+         -n "${0##*/}" -- "$@")
+EC=$?
+set -e
+if test $EC != 0
+then
+  echo "Try \`$0 --help' for more information."
+  exit 1
+fi
+eval set -- "$TEMP"
+
+VERBOSE=0
+while true
+do
+  case "$1" in
+    --verbose|-v) VERBOSE=1; shift;;
+    --) shift; break;;
+    *) echo 'Internal error!'; exit 1;;
+  esac
+done
+
+banner() {
+    echo
+    echo "***************"
+    echo -e "$@"
+    echo "***************"
+}
+
+GPG() {
+    # valgrind gpg2 "$@"
+    if test x"$VERBOSE" = x1
+    then
+        gpg2 --no-permission-warning "$@"
+    else
+        gpg2 --no-permission-warning "$@" 2>/dev/null
+    fi
+}
+
+GPGU() {
+    GNUPGHOME=`pwd`/user GPG "$@"
+}
+
+SETPASSWD() {
+    keyids=$(gpg2 --no-permission-warning -K --with-keygrip --with-colons 2>/dev/null \
+                    | gawk -F: '/^grp/ { print $10; }')
+    if test x$KEYID != x
+    then
+        for keygrip in $keyids
+        do
+            /usr/lib/gnupg2/gpg-preset-passphrase \
+                     --preset -P a "$keygrip"
+        done
+    fi
+}
+
+TEST()
+{
+    TEXT="$1"
+    shift
+    banner "$TEXT\n  Running: gpg2 $@"
+
+    if GPG "$@"
+    then
+        :
+    else
+        EC=$?
+        echo "FAIL! (exit code: $EC)"
+        exit $EC
+    fi
+}
+
+XTEST()
+{
+    TEXT="$1"
+    shift
+    banner "$TEXT\n  Running: gpg2 $@"
+
+    if GPG "$@"
+    then
+        echo "UNEXPECTEDLY PASSED!"
+        exit 1
+    fi
+}
+
+# Be sure to clean up.
+cleanup() {
+  rm -f "mailing-list/subs-expected.$KEYID" "mailing-list/subs-have.$KEYID"
+}
+trap cleanup EXIT
+
+CHECKLIST() {
+    for x in $@
+    do
+        echo $x
+    done | sort > "mailing-list/subs-expected.$KEYID"
+
+    if ! cmp "mailing-list/subs-have.$KEYID" \
+         "mailing-list/subs-expected.$KEYID"
+    then
+        echo "Current subscriber list does not match expected subscriber list!"
+        diff -u "mailing-list/subs-expected.$KEYID" \
+             "mailing-list/subs-have.$KEYID"
+        exit 1
+    fi
+}
+
+CHECKSUBS() {
+    GPG --mailing-list-subs $KEYID | grep -v subscribers \
+        | sort > "mailing-list/subs-have.$KEYID"
+
+    CHECKLIST "$@"
+}
+
+export GNUPGHOME=`pwd`/mailing-list
+unset KEYID
+
+# Kill any running agent.
+gpgconf --kill gpg-agent
+
+# Rebuild the directory.
+rm -rf mailing-list
+mkdir mailing-list
+
+cat >$GNUPGHOME/gpg-agent.conf <<EOF
+pinentry-program /home/us/neal/work/gpg/build/pinentry/gtk+-2/pinentry-gtk-2
+allow-preset-passphrase
+min-passphrase-len 1
+min-passphrase-nonalpha 0
+EOF
+
+cat >$GNUPGHOME/gpg.conf <<EOF
+EOF
+
+rm -rf user
+cp -r mailing-list user
+
+banner "Generating a user key (use a password of 'a')."
+GPGU --batch --quick-gen-key 'Some User <some at user.org>'
+
+UKEYID=$(GPGU -K --with-colons | gawk -F: '/^sec/ { print $5 }')
+if test "x$UKEYID" = x
+then
+    echo "Failed to figure out the keyid of the user's primary key."
+    exit 1
+fi
+# We need the short keyid.
+UEKEYID=$(GPGU -K --with-colons | gawk -F: '/^ssb/ { print $5 }' \
+                 | sed 's/^.\{8\}//')
+if test "x$UKEYID" = x
+then
+    echo "Failed to figure out the keyid of the user's encryption key."
+    exit 1
+fi
+
+
+# CFEFE77F (encryption subkey: 2B6E7103)
+# A9316686 (95A0BEEA)
+# E29FC3CC (117E1AFB)
+# 5C1A4468 (94244910)
+# F462B6B1 (AA45C71F)
+TEST "Importing some public keys." --batch --import keys.gpg
+GPGU --batch --export $UKEYID | GPG --batch --import
+
+banner "Set the password to 'a'"
+TEST "Creating mailing list." \
+    --batch --quick-gen-mailing-list-key "gnupg-devel <gnupg-devel at gnupg.org>"
+
+KEYID=$(GPG -K --with-colons | gawk -F: '/^sec/ { print $5 }')
+if test "x$KEYID" = x
+then
+    echo "Failed to figure out the keyid of the ML's primary key."
+    exit 1
+fi
+SETPASSWD
+
+TEST "Adding a subscriber." --mailing-list-add-sub $KEYID CFEFE77F
+CHECKSUBS 2B6E7103
+
+XTEST "Adding the same subscriber." --mailing-list-add-sub $KEYID CFEFE77F
+
+TEST "Adding two subscribers." --mailing-list-add-sub $KEYID A9316686 E29FC3CC
+CHECKSUBS 117E1AFB 2B6E7103 95A0BEEA
+
+TEST "Removing a subscriber." --mailing-list-rm-sub $KEYID 117E1AFB
+# We need to wait a second, otherwise the key may not yet be
+# recognized as expired.
+sleep 1
+CHECKSUBS 2B6E7103 95A0BEEA
+
+TEST "Adding a subscriber." --mailing-list-add-sub $KEYID 5C1A4468
+GPG --mailing-list-subs $KEYID | grep -v subscribers | sort > subs
+CHECKSUBS 2B6E7103 94244910 95A0BEEA
+
+TEST "Removing a subscriber." --mailing-list-rm-sub $KEYID 2B6E7103
+sleep 1
+CHECKSUBS 94244910 95A0BEEA
+
+TEST "Adding a subscriber." --mailing-list-add-sub $KEYID F462B6B1
+CHECKSUBS AA45C71F 94244910 95A0BEEA
+
+TEST "Adding a subscriber." --mailing-list-add-sub $KEYID $UKEYID
+CHECKSUBS AA45C71F 94244910 95A0BEEA $UEKEYID
+
+GPG --batch --export $KEYID | GPGU --batch --import
+
+GNUPGHOME=`pwd`/user SETPASSWD
+
+banner "Using subscriber's key to list subscribers"
+GPGU --try-secret-key $UKEYID --mailing-list-subs $KEYID \
+    | grep -v subscribers | sort > mailing-list/subs-have.$KEYID
+CHECKLIST AA45C71F 94244910 95A0BEEA $UEKEYID
+
+banner "Using subscriber's key to send a message"
+# Note: --list-packets uses long keyids.
+echo | GPGU --trust-model=always --try-secret-key $UKEYID -r $KEYID -e \
+    | GPGU --list-packets \
+    | gawk '/pubkey enc packet/ { print $9 }' \
+    | sed 's/^.\{8\}//' \
+    | sort > mailing-list/subs-have.$KEYID
+CHECKLIST AA45C71F 94244910 95A0BEEA $UEKEYID
+
+echo "All tests passed!"
+
+exit 0

-----------------------------------------------------------------------

Summary of changes:
 mailing-list-test/README   |  70 +++++
 mailing-list-test/keys.gpg | 621 +++++++++++++++++++++++++++++++++++++++++++++
 mailing-list-test/test.sh  | 238 +++++++++++++++++
 3 files changed, 929 insertions(+)
 create mode 100644 mailing-list-test/README
 create mode 100644 mailing-list-test/keys.gpg
 create mode 100755 mailing-list-test/test.sh


hooks/post-receive
-- 
The GNU Privacy Guard
http://git.gnupg.org




More information about the Gnupg-commits mailing list