/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos-keygen

  • Committer: Teddy Hogeborn
  • Date: 2011-12-31 20:07:11 UTC
  • mfrom: (535.1.9 wireless-network-hook)
  • Revision ID: teddy@recompile.se-20111231200711-6dli3r8drftem57r
Merge new wireless network hook.  Fix bridge network hook to use
hardware addresses instead of interface names.  Implement and document
new "CONNECT" environment variable for network hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
3
3
# Mandos key generator - create a new OpenPGP key for a Mandos client
4
4
5
 
# Copyright © 2008-2018 Teddy Hogeborn
6
 
# Copyright © 2008-2018 Björn Påhlsson
 
5
# Copyright © 2008-2011 Teddy Hogeborn
 
6
# Copyright © 2008-2011 Björn Påhlsson
7
7
8
 
# This file is part of Mandos.
9
 
#
10
 
# Mandos is free software: you can redistribute it and/or modify it
11
 
# under the terms of the GNU General Public License as published by
 
8
# This program is free software: you can redistribute it and/or modify
 
9
# it under the terms of the GNU General Public License as published by
12
10
# the Free Software Foundation, either version 3 of the License, or
13
11
# (at your option) any later version.
14
12
#
15
 
#     Mandos is distributed in the hope that it will be useful, but
16
 
#     WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
#     This program is distributed in the hope that it will be useful,
 
14
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
17
15
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
16
#     GNU General Public License for more details.
19
17
20
18
# You should have received a copy of the GNU General Public License
21
 
# along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
 
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
22
20
23
21
# Contact the authors at <mandos@recompile.se>.
24
22
25
23
 
26
 
VERSION="1.7.16"
 
24
VERSION="1.4.1"
27
25
 
28
26
KEYDIR="/etc/keys/mandos"
29
 
KEYTYPE=RSA
30
 
KEYLENGTH=4096
31
 
SUBKEYTYPE=RSA
32
 
SUBKEYLENGTH=4096
 
27
KEYTYPE=DSA
 
28
KEYLENGTH=2048
 
29
SUBKEYTYPE=ELG-E
 
30
SUBKEYLENGTH=2048
33
31
KEYNAME="`hostname --fqdn 2>/dev/null || hostname`"
34
32
KEYEMAIL=""
35
 
KEYCOMMENT=""
 
33
KEYCOMMENT="Mandos client key"
36
34
KEYEXPIRE=0
37
35
FORCE=no
38
 
SSH=yes
39
36
KEYCOMMENT_ORIG="$KEYCOMMENT"
40
37
mode=keygen
41
38
 
44
41
fi
45
42
 
46
43
# Parse options
47
 
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:fS \
48
 
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force,no-ssh \
 
44
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:f \
 
45
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force \
49
46
    --name "$0" -- "$@"`
50
47
 
51
48
help(){
52
 
basename="`basename "$0"`"
 
49
basename="`basename $0`"
53
50
cat <<EOF
54
51
Usage: $basename [ -v | --version ]
55
52
       $basename [ -h | --help ]
63
60
  -v, --version         Show program's version number and exit
64
61
  -h, --help            Show this help message and exit
65
62
  -d DIR, --dir DIR     Target directory for key files
66
 
  -t TYPE, --type TYPE  Key type.  Default is RSA.
 
63
  -t TYPE, --type TYPE  Key type.  Default is DSA.
67
64
  -l BITS, --length BITS
68
 
                        Key length in bits.  Default is 4096.
 
65
                        Key length in bits.  Default is 2048.
69
66
  -s TYPE, --subtype TYPE
70
 
                        Subkey type.  Default is RSA.
 
67
                        Subkey type.  Default is ELG-E.
71
68
  -L BITS, --sublength BITS
72
 
                        Subkey length in bits.  Default is 4096.
 
69
                        Subkey length in bits.  Default is 2048.
73
70
  -n NAME, --name NAME  Name of key.  Default is the FQDN.
74
71
  -e ADDRESS, --email ADDRESS
75
72
                        Email address of key.  Default is empty.
76
73
  -c TEXT, --comment TEXT
77
 
                        Comment field for key.  The default is empty.
 
74
                        Comment field for key.  The default value is
 
75
                        "Mandos client key".
78
76
  -x TIME, --expire TIME
79
77
                        Key expire time.  Default is no expiration.
80
78
                        See gpg(1) for syntax.
88
86
                        Encrypt a password from FILE using the key in
89
87
                        the key directory.  All options other than
90
88
                        --dir and --name are ignored.
91
 
  -S, --no-ssh          Don't get SSH key or set "checker" option.
92
89
EOF
93
90
}
94
91
 
107
104
        -c|--comment) KEYCOMMENT="$2"; shift 2;;
108
105
        -x|--expire) KEYEXPIRE="$2"; shift 2;;
109
106
        -f|--force) FORCE=yes; shift;;
110
 
        -S|--no-ssh) SSH=no; shift;;
111
107
        -v|--version) echo "$0 $VERSION"; exit;;
112
108
        -h|--help) help; exit;;
113
109
        --) shift; break;;
115
111
    esac
116
112
done
117
113
if [ "$#" -gt 0 ]; then
118
 
    echo "Unknown arguments: '$*'" >&2
 
114
    echo "Unknown arguments: '$@'" >&2
119
115
    exit 1
120
116
fi
121
117
 
163
159
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
164
160
    esac
165
161
    
166
 
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
167
 
        && [ "$FORCE" -eq 0 ]; then
 
162
    if [ \( -e "$SECKEYFILE" -o -e "$PUBKEYFILE" \) \
 
163
        -a "$FORCE" -eq 0 ]; then
168
164
        echo "Refusing to overwrite old key files; use --force" >&2
169
165
        exit 1
170
166
    fi
193
189
trap "
194
190
set +e; \
195
191
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
196
 
shred --remove \"$RINGDIR\"/sec* 2>/dev/null;
 
192
shred --remove \"$RINGDIR\"/sec*;
197
193
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
198
194
rm --recursive --force \"$RINGDIR\";
199
195
tty --quiet && stty echo; \
208
204
    cat >"$BATCHFILE" <<-EOF
209
205
        Key-Type: $KEYTYPE
210
206
        Key-Length: $KEYLENGTH
211
 
        Key-Usage: sign,auth
 
207
        #Key-Usage: encrypt,sign,auth
212
208
        Subkey-Type: $SUBKEYTYPE
213
209
        Subkey-Length: $SUBKEYLENGTH
214
 
        Subkey-Usage: encrypt
 
210
        #Subkey-Usage: encrypt,sign,auth
215
211
        Name-Real: $KEYNAME
216
212
        $KEYCOMMENTLINE
217
213
        $KEYEMAILLINE
220
216
        #Handle: <no-spaces>
221
217
        #%pubring pubring.gpg
222
218
        #%secring secring.gpg
223
 
        %no-protection
224
219
        %commit
225
220
        EOF
226
221
    
234
229
        date
235
230
    fi
236
231
    
237
 
    # Make sure trustdb.gpg exists;
238
 
    # this is a workaround for Debian bug #737128
239
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
240
 
        --homedir "$RINGDIR" \
241
 
        --import-ownertrust < /dev/null
242
232
    # Generate a new key in the key rings
243
233
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
244
234
        --homedir "$RINGDIR" --trust-model always \
280
270
fi
281
271
 
282
272
if [ "$mode" = password ]; then
283
 
    
284
 
    # Make SSH be 0 or 1
285
 
    case "$SSH" in
286
 
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) SSH=1;;
287
 
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) SSH=0;;
288
 
    esac
289
 
    
290
 
    if [ $SSH -eq 1 ]; then
291
 
        for ssh_keytype in ecdsa-sha2-nistp256 ed25519 rsa; do
292
 
            set +e
293
 
            ssh_fingerprint="`ssh-keyscan -t $ssh_keytype localhost 2>/dev/null`"
294
 
            err=$?
295
 
            set -e
296
 
            if [ $err -ne 0 ]; then
297
 
                ssh_fingerprint=""
298
 
                continue
299
 
            fi
300
 
            if [ -n "$ssh_fingerprint" ]; then
301
 
                ssh_fingerprint="${ssh_fingerprint#localhost }"
302
 
                break
303
 
            fi
304
 
        done
305
 
    fi
306
 
    
307
273
    # Import key into temporary key rings
308
274
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
309
275
        --homedir "$RINGDIR" --trust-model always --armor \
314
280
    
315
281
    # Get fingerprint of key
316
282
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
317
 
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
 
283
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
318
284
        --fingerprint --with-colons \
319
285
        | sed --quiet \
320
286
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
328
294
            cat "$PASSFILE"
329
295
        else
330
296
            tty --quiet && stty -echo
331
 
            echo -n "Enter passphrase: " >/dev/tty
332
 
            read -r first
 
297
            read -p "Enter passphrase: " first
333
298
            tty --quiet && echo >&2
334
 
            echo -n "Repeat passphrase: " >/dev/tty
335
 
            read -r second
 
299
            read -p "Repeat passphrase: " second
336
300
            if tty --quiet; then
337
301
                echo >&2
338
302
                stty echo
372
336
                /^[^-]/s/^/    /p
373
337
            }
374
338
        }' < "$SECFILE"
375
 
    if [ -n "$ssh_fingerprint" ]; then
376
 
        echo 'checker = ssh-keyscan -t '"$ssh_keytype"' %%(host)s 2>/dev/null | grep --fixed-strings --line-regexp --quiet --regexp=%%(host)s" %(ssh_fingerprint)s"'
377
 
        echo "ssh_fingerprint = ${ssh_fingerprint}"
378
 
    fi
379
339
fi
380
340
 
381
341
trap - EXIT
386
346
    shred --remove "$SECFILE"
387
347
fi
388
348
# Remove the key rings
389
 
shred --remove "$RINGDIR"/sec* 2>/dev/null
 
349
shred --remove "$RINGDIR"/sec*
390
350
rm --recursive --force "$RINGDIR"