chiark / gitweb /
keyfunc.sh.in: Make sure we can match the `0' string.
[distorted-keys] / pubkeyop.in
CommitLineData
b8691d14
MW
1#! /bin/sh
2###
3### Front-end for public-key operations
4###
5### (c) 2012 Mark Wooding
6###
7
8###----- Licensing notice ---------------------------------------------------
9###
10### This file is part of the distorted.org.uk key management suite.
11###
12### distorted-keys is free software; you can redistribute it and/or modify
13### it under the terms of the GNU General Public License as published by
14### the Free Software Foundation; either version 2 of the License, or
15### (at your option) any later version.
16###
17### distorted-keys is distributed in the hope that it will be useful,
18### but WITHOUT ANY WARRANTY; without even the implied warranty of
19### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20### GNU General Public License for more details.
21###
22### You should have received a copy of the GNU General Public License
23### along with distorted-keys; if not, write to the Free Software Foundation,
24### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
26set -e
27: ${ETC=@pkgconfdir@}
28: ${KEYS=@pkgstatedir@}
29: ${KEYSLIB=@pkglibdir@}
30export ETC KEYS KEYSLIB
31
32. "$KEYSLIB"/keyfunc.sh
33
34usage="COMMAND [ARGUMENTS ...]"
35
36###--------------------------------------------------------------------------
37### Common utilities.
38
39unpack () {
40 key=$1
41 ## Unpack the KEY and set up to use it as a public key for future
42 ## operations.
43
44 mktmp
45 exec 3<"$key"
46
47 ## Read the properties.
48 endp=nil
49 while read line; do
50 case "$line" in ENDPROP) endp=t; break ;; esac
51 setprops "property" kprop_ "$line"
52 done <&3
53 case $endp in
54 nil) echo >&2 "$quis: invalid public key (no ENDPROP line)"; exit 1 ;;
55 esac
56 checkprops "property" kprop_ "$g_props"
57
58 ## Fetch the type-handling library.
59 if [ ! -f $KEYSLIB/ktype.$kprop_type ]; then
60 echo >&2 "$quis: unknown key type \`$kprop_type'"
61 exit 1
62 fi
63 . $KEYSLIB/ktype.$kprop_type
64 checkprops "property" kprop_ "$k_props"
65
66 ## Write the rest of the public key somewhere convenient.
67 mkdir $tmp/pubkey
68 cat <&3 >$tmp/pubkey/pub
69 k_import $tmp/pubkey
70 exec 3>&-
71}
72
73###--------------------------------------------------------------------------
74### Commands.
75
76defcmd encrypt [-o CIPHERTEXT] KEY [MESSAGE] <<EOF
77Encrypt the MESSAGE (default stdin) using the public key KEY. Write the
78ciphertext to CIPHERTEXT (default stdout).
79EOF
80cmd_encrypt () {
81 unset out
82 while getopts "o:" opt; do
83 case $opt in
84 o) out=$OPTARG ;;
85 *) usage_err ;;
86 esac
87 done
88 shift $(( $OPTIND - 1 ))
89 case $# in
90 1) ;;
91 2) msg=$2; exec <"$msg" ;;
92 *) usage_err ;;
93 esac
94 key=$1
95 unpack "$key"
96 case ${out+t} in
97 t) c_encrypt $tmp/pubkey - >"$out.new"; mv "$out.new" "$out" ;;
98 *) c_encrypt $tmp/pubkey - ;;
99 esac
100}
101
102defcmd verify KEY SIGNATURE [MESSAGE] <<EOF
103Verify a SIGNATURE (literal, not a filename) against a MESSAGE (default
104stdin) using the public KEY.
105EOF
106cmd_verify () {
107 case $# in
108 2) ;;
109 3) msg=$3; exec <"$msg" ;;
110 *) usage_err ;;
111 esac
112 key=$1 sig=$2
113 unpack "$key"
114 c_verify $tmp/pubkey - "$sig"
115}
116
117###--------------------------------------------------------------------------
118### Main program.
119
120while getopts "hv" opt; do
121 case "$opt" in
122 h) do_help; exit ;;
123 v) version; exit ;;
124 *) usage_err ;;
125 esac
126done
127shift $(( $OPTIND - 1 ))
128
129case $# in 0) usage_err ;; esac
130
131dispatch "$@"
132
133###----- That's all, folks --------------------------------------------------