make it so monkeysphere-server will respond to --help
[monkeysphere.git] / src / seckey2sshagent
1 #!/bin/bash
2
3 # seckey2sshagent: this is a hack of a script to cope with the fact
4 # that openpgp2ssh currently cannot support encrypted secret keys.
5
6 # the basic operating principal is: 
7
8 # export the secret key in encrypted format to a new keyring
9
10 # remove the passphrase in that keyring
11
12 # use that keyring with openpgp2ssh
13
14 # Authors: Daniel Kahn Gillmor <dkg@fifthhorseman.net>,
15 #          Jameson Rollins <jrollins@fifthhorseman.net>
16
17
18 cleanup() {
19     echo -n "removing temp gpg home... " 1>&2
20     rm -rf "$TMPPRIVATE"
21     echo "done." 1>&2
22 }
23
24 explanation() {
25
26     echo -n "The basic strategy of seckey2sshagent is to dump your
27 OpenPGP authentication key(s) into your agent.
28
29 This script is a gross hack at the moment.  It is done by creating a
30 new, temporary private keyring, letting the user remove the
31 passphrases from the keys, and then exporting them.  The temporary
32 private keyring is purged from the system.
33
34 When you use this command, you'll find yourself dropped into a GPG
35 'edit-key' dialog relevant *only* to the temporary private keyring.
36
37 At that point, you should clear the password from your key, with:
38
39  passwd
40  <enter your current password>
41
42 followed by the empty string for the new password.  GPG will ask you
43 if you're really sure.  Answer yes, because this is only relevant to
44 the temporary keyring.  Then, do:
45
46  save
47
48 At this point, your key will be added to your running ssh-agent with
49 the alias 'monkeysphere-key' and seckey2sshagent should terminate.
50 You can check on it with:
51
52  ssh-add -l
53
54
55     
56 }
57
58 # if no hex string is supplied, just print an explanation.
59 # this covers seckey2sshagent --help, --usage, -h, etc...
60 if [  "$(echo "$1" | tr -d '0-9a-fA-F')" ]; then
61     explanation
62     exit
63 fi
64
65 trap cleanup EXIT
66
67 GPGIDS="$1"
68
69 if [ -z "$GPGIDS" ]; then
70     # hack: we need to get the list of secret keys, because if you
71     # --list-secret-keys with no arguments, GPG fails to print the
72     # capability flags (i've just filed this as
73     # https://bugs.g10code.com/gnupg/issue945)
74     KEYIDS=$(gpg2 --with-colons --list-secret-keys | grep ^sec | cut -f5 -d:)
75     # default to using all fingerprints of authentication-enabled keys 
76     GPGIDS=$(gpg  --with-colons --fingerprint --fingerprint --list-secret-keys $KEYIDS | egrep -A1 '^(ssb|sec):.*:[^:]*a[^:]*:$' | grep ^fpr: | cut -d: -f10)
77 fi
78
79 for GPGID in $GPGIDS; do
80
81     TMPPRIVATE=$(mktemp -d)
82     
83     gpg --export-secret-key "$GPGID" | GNUPGHOME="$TMPPRIVATE" gpg --import
84     
85 # idea to script the password stuff.  not working.
86 # read -s -p "enter gpg password: " PASSWD; echo
87 # cmd=$(cat <<EOF
88 # passwd
89 # $PASSWD
90 # \n
91 # \n
92 # \n
93 # yes
94 # save
95 # EOF
96 # )
97 # echo -e "$cmd" | GNUPGHOME="$TMPPRIVATE" gpg --command-fd 0 --edit-key $GPGID
98     
99     GNUPGHOME="$TMPPRIVATE" gpg --edit-key "$GPGID"
100
101     KEYNAME='MonkeySphere Key '$(echo "$GPGID" | tr -c -d '0-9a-fA-F')''
102 # creating this alias so the key is named "monkeysphere-key" in the
103 # comment stored by the agent, while never being written to disk in
104 # SSH form:
105     ln -s /dev/stdin "$TMPPRIVATE/$KEYNAME"
106     
107     GNUPGHOME="$TMPPRIVATE" gpg --export-secret-keys "$GPGID" | \
108         openpgp2ssh $GPGID | (cd "$TMPPRIVATE" && ssh-add -c "$KEYNAME")
109
110     cleanup
111 done
112
113