/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: 2018-08-15 09:26:02 UTC
  • Revision ID: teddy@recompile.se-20180815092602-xoyb5s6gf8376i7u
mandos-client: Set system clock if necessary

* plugins.d/mandos-client.c (init_gpgme/import_key): If the system
  clock is not set, or set to january 1970, set the system clock to
  the more plausible value that is the mtime of the key file.  This is
  required by GnuPG to be able to import the keys.  (We can't pass the
  --ignore-time-conflict or the --ignore-valid-from options though
  GPGME.)

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-2014 Teddy Hogeborn
6
 
# Copyright © 2008-2014 Björn Påhlsson
 
5
# Copyright © 2008-2018 Teddy Hogeborn
 
6
# Copyright © 2008-2018 Björn Påhlsson
7
7
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
 
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
10
12
# the Free Software Foundation, either version 3 of the License, or
11
13
# (at your option) any later version.
12
14
#
13
 
#     This program is distributed in the hope that it will be useful,
14
 
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
#     Mandos is distributed in the hope that it will be useful, but
 
16
#     WITHOUT ANY WARRANTY; without even the implied warranty of
15
17
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
18
#     GNU General Public License for more details.
17
19
18
20
# You should have received a copy of the GNU General Public License
19
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
21
# along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
20
22
21
23
# Contact the authors at <mandos@recompile.se>.
22
24
23
25
 
24
 
VERSION="1.6.5"
 
26
VERSION="1.7.19"
25
27
 
26
28
KEYDIR="/etc/keys/mandos"
27
29
KEYTYPE=RSA
33
35
KEYCOMMENT=""
34
36
KEYEXPIRE=0
35
37
FORCE=no
 
38
SSH=yes
36
39
KEYCOMMENT_ORIG="$KEYCOMMENT"
37
40
mode=keygen
38
41
 
41
44
fi
42
45
 
43
46
# Parse options
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 \
 
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 \
46
49
    --name "$0" -- "$@"`
47
50
 
48
51
help(){
49
 
basename="`basename $0`"
 
52
basename="`basename "$0"`"
50
53
cat <<EOF
51
54
Usage: $basename [ -v | --version ]
52
55
       $basename [ -h | --help ]
85
88
                        Encrypt a password from FILE using the key in
86
89
                        the key directory.  All options other than
87
90
                        --dir and --name are ignored.
 
91
  -S, --no-ssh          Don't get SSH key or set "checker" option.
88
92
EOF
89
93
}
90
94
 
103
107
        -c|--comment) KEYCOMMENT="$2"; shift 2;;
104
108
        -x|--expire) KEYEXPIRE="$2"; shift 2;;
105
109
        -f|--force) FORCE=yes; shift;;
 
110
        -S|--no-ssh) SSH=no; shift;;
106
111
        -v|--version) echo "$0 $VERSION"; exit;;
107
112
        -h|--help) help; exit;;
108
113
        --) shift; break;;
110
115
    esac
111
116
done
112
117
if [ "$#" -gt 0 ]; then
113
 
    echo "Unknown arguments: '$@'" >&2
 
118
    echo "Unknown arguments: '$*'" >&2
114
119
    exit 1
115
120
fi
116
121
 
158
163
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
159
164
    esac
160
165
    
161
 
    if [ \( -e "$SECKEYFILE" -o -e "$PUBKEYFILE" \) \
162
 
        -a "$FORCE" -eq 0 ]; then
 
166
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
 
167
        && [ "$FORCE" -eq 0 ]; then
163
168
        echo "Refusing to overwrite old key files; use --force" >&2
164
169
        exit 1
165
170
    fi
188
193
trap "
189
194
set +e; \
190
195
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
191
 
shred --remove \"$RINGDIR\"/sec*;
 
196
shred --remove \"$RINGDIR\"/sec* 2>/dev/null;
192
197
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
193
198
rm --recursive --force \"$RINGDIR\";
194
199
tty --quiet && stty echo; \
215
220
        #Handle: <no-spaces>
216
221
        #%pubring pubring.gpg
217
222
        #%secring secring.gpg
 
223
        %no-protection
218
224
        %commit
219
225
        EOF
220
226
    
274
280
fi
275
281
 
276
282
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
    
277
307
    # Import key into temporary key rings
278
308
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
279
309
        --homedir "$RINGDIR" --trust-model always --armor \
284
314
    
285
315
    # Get fingerprint of key
286
316
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
287
 
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
 
317
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
288
318
        --fingerprint --with-colons \
289
319
        | sed --quiet \
290
320
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
298
328
            cat "$PASSFILE"
299
329
        else
300
330
            tty --quiet && stty -echo
301
 
            echo -n "Enter passphrase: " >&2
302
 
            read first
 
331
            echo -n "Enter passphrase: " >/dev/tty
 
332
            read -r first
303
333
            tty --quiet && echo >&2
304
 
            echo -n "Repeat passphrase: " >&2
305
 
            read second
 
334
            echo -n "Repeat passphrase: " >/dev/tty
 
335
            read -r second
306
336
            if tty --quiet; then
307
337
                echo >&2
308
338
                stty echo
342
372
                /^[^-]/s/^/    /p
343
373
            }
344
374
        }' < "$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
345
379
fi
346
380
 
347
381
trap - EXIT
352
386
    shred --remove "$SECFILE"
353
387
fi
354
388
# Remove the key rings
355
 
shred --remove "$RINGDIR"/sec*
 
389
shred --remove "$RINGDIR"/sec* 2>/dev/null
356
390
rm --recursive --force "$RINGDIR"