/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: 2016-03-17 20:40:55 UTC
  • Revision ID: teddy@recompile.se-20160317204055-bhsh5xsidq7w5cxu
Client: Fix plymouth agent; broken since 1.7.2.

Fix an very old memory bug in the plymouth agent (which has been
present since its apperance in version 1.2), but which was only
recently detected at run time due to the new -fsanitize=address
compile- time flag, which has been used since version 1.7.2.  This
detection of a memory access violation causes the program to abort,
making the Plymouth graphical boot system unable to accept interactive
input of passwords when using the Mandos client.

* plugins.d/plymouth.c (exec_and_wait): Fix memory allocation bug when
  allocating new_argv.  Also tolerate a zero-length argv.

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-2016 Teddy Hogeborn
 
6
# Copyright © 2008-2016 Björn Påhlsson
7
7
8
8
# This program is free software: you can redistribute it and/or modify
9
9
# it under the terms of the GNU General Public License as published by
21
21
# Contact the authors at <mandos@recompile.se>.
22
22
23
23
 
24
 
VERSION="1.6.5"
 
24
VERSION="1.7.6"
25
25
 
26
26
KEYDIR="/etc/keys/mandos"
27
27
KEYTYPE=RSA
33
33
KEYCOMMENT=""
34
34
KEYEXPIRE=0
35
35
FORCE=no
 
36
SSH=yes
36
37
KEYCOMMENT_ORIG="$KEYCOMMENT"
37
38
mode=keygen
38
39
 
41
42
fi
42
43
 
43
44
# 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 \
 
45
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:fS \
 
46
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force,no-ssh \
46
47
    --name "$0" -- "$@"`
47
48
 
48
49
help(){
49
 
basename="`basename $0`"
 
50
basename="`basename "$0"`"
50
51
cat <<EOF
51
52
Usage: $basename [ -v | --version ]
52
53
       $basename [ -h | --help ]
85
86
                        Encrypt a password from FILE using the key in
86
87
                        the key directory.  All options other than
87
88
                        --dir and --name are ignored.
 
89
  -S, --no-ssh          Don't get SSH key or set "checker" option.
88
90
EOF
89
91
}
90
92
 
103
105
        -c|--comment) KEYCOMMENT="$2"; shift 2;;
104
106
        -x|--expire) KEYEXPIRE="$2"; shift 2;;
105
107
        -f|--force) FORCE=yes; shift;;
 
108
        -S|--no-ssh) SSH=no; shift;;
106
109
        -v|--version) echo "$0 $VERSION"; exit;;
107
110
        -h|--help) help; exit;;
108
111
        --) shift; break;;
110
113
    esac
111
114
done
112
115
if [ "$#" -gt 0 ]; then
113
 
    echo "Unknown arguments: '$@'" >&2
 
116
    echo "Unknown arguments: '$*'" >&2
114
117
    exit 1
115
118
fi
116
119
 
188
191
trap "
189
192
set +e; \
190
193
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
191
 
shred --remove \"$RINGDIR\"/sec*;
 
194
shred --remove \"$RINGDIR\"/sec* 2>/dev/null;
192
195
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
193
196
rm --recursive --force \"$RINGDIR\";
194
197
tty --quiet && stty echo; \
274
277
fi
275
278
 
276
279
if [ "$mode" = password ]; then
 
280
    
 
281
    # Make SSH be 0 or 1
 
282
    case "$SSH" in
 
283
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) SSH=1;;
 
284
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) SSH=0;;
 
285
    esac
 
286
    
 
287
    if [ $SSH -eq 1 ]; then
 
288
        for ssh_keytype in ed25519 rsa; do
 
289
            set +e
 
290
            ssh_fingerprint="`ssh-keyscan -t $ssh_keytype localhost 2>/dev/null`"
 
291
            set -e
 
292
            if [ $? -ne 0 ]; then
 
293
                ssh_fingerprint=""
 
294
                continue
 
295
            fi
 
296
            if [ -n "$ssh_fingerprint" ]; then
 
297
                ssh_fingerprint="${ssh_fingerprint#localhost }"
 
298
                break
 
299
            fi
 
300
        done
 
301
    fi
 
302
    
277
303
    # Import key into temporary key rings
278
304
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
279
305
        --homedir "$RINGDIR" --trust-model always --armor \
284
310
    
285
311
    # Get fingerprint of key
286
312
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
287
 
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
 
313
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
288
314
        --fingerprint --with-colons \
289
315
        | sed --quiet \
290
316
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
342
368
                /^[^-]/s/^/    /p
343
369
            }
344
370
        }' < "$SECFILE"
 
371
    if [ -n "$ssh_fingerprint" ]; then
 
372
        echo 'checker = ssh-keyscan -t '"$ssh_keytype"' %%(host)s 2>/dev/null | grep --fixed-strings --line-regexp --quiet --regexp=%%(host)s" %(ssh_fingerprint)s"'
 
373
        echo "ssh_fingerprint = ${ssh_fingerprint}"
 
374
    fi
345
375
fi
346
376
 
347
377
trap - EXIT
352
382
    shred --remove "$SECFILE"
353
383
fi
354
384
# Remove the key rings
355
 
shred --remove "$RINGDIR"/sec*
 
385
shred --remove "$RINGDIR"/sec* 2>/dev/null
356
386
rm --recursive --force "$RINGDIR"