/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: 2008-08-29 05:53:59 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080829055359-wkdasnyxtylmnxus
* mandos.xml (EXAMPLE): Replaced all occurences of command name with
                        "&COMMANDNAME;".

* plugins.d/password-prompt.c (main): Improved some documentation
                                      strings.  Do perror() of
                                      tcgetattr() fails.  Add debug
                                      output if interrupted by signal.
                                      Loop over write() instead of
                                      using fwrite() when outputting
                                      password.  Add debug output if
                                      getline() returns 0, unless it
                                      was caused by a signal.  Add
                                      exit status code to debug
                                      output.

* plugins.d/password-prompt.xml: Changed all single quotes to double
                                 quotes for consistency.  Removed
                                 <?xml-stylesheet>.
  (ENTITY TIMESTAMP): New.  Automatically updated by Emacs time-stamp
                      by using Emacs local variables.
  (/refentry/refentryinfo/title): Changed to "Mandos Manual".
  (/refentry/refentryinfo/productname): Changed to "Mandos".
  (/refentry/refentryinfo/date): New; set to "&TIMESTAMP;".
  (/refentry/refentryinfo/copyright): Split copyright holders.
  (/refentry/refnamediv/refpurpose): Improved wording.
  (SYNOPSIS): Fix to use correct markup.  Add short options.
  (DESCRIPTION, OPTIONS): Improved wording.
  (OPTIONS): Improved wording.  Use more correct markup.  Document
             short options.
  (EXIT STATUS): Add text.
  (ENVIRONMENT): Document use of "cryptsource" and "crypttarget".
  (FILES): REMOVED.
  (BUGS): Add text.
  (EXAMPLE): Added some examples.
  (SECURITY): Added text.
  (SEE ALSO): Remove reference to mandos(8).  Add reference to
              crypttab(5).

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
VERSION="1.0"
24
24
 
25
 
KEYDIR="/etc/keys/mandos"
 
25
KEYDIR="/etc/mandos"
26
26
KEYTYPE=DSA
27
27
KEYLENGTH=2048
28
28
SUBKEYTYPE=ELG-E
35
35
KEYCOMMENT_ORIG="$KEYCOMMENT"
36
36
mode=keygen
37
37
 
38
 
if [ ! -d "$KEYDIR" ]; then
39
 
    KEYDIR="/etc/mandos/keys"
40
 
fi
41
 
 
42
38
# Parse options
43
39
TEMP=`getopt --options vhd:t:l:n:e:c:x:f \
44
40
    --longoptions version,help,password,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force \
68
64
  -n NAME, --name NAME  Name of key.  Default is the FQDN.
69
65
  -e ADDRESS, --email ADDRESS
70
66
                        Email address of key.  Default is empty.
71
 
  -c TEXT, --comment TEXT
 
67
  -c COMMENT, --comment COMMENT
72
68
                        Comment field for key.  The default value is
73
69
                        "Mandos client key".
74
70
  -x TIME, --expire TIME
79
75
Password creation options:
80
76
  -p, --password        Create an encrypted password using the keys in
81
77
                        the key directory.  All options other than
82
 
                        --dir and --name are ignored.
 
78
                        --keydir and --name are ignored.
83
79
EOF
84
80
}
85
81
 
112
108
PUBKEYFILE="$KEYDIR/pubkey.txt"
113
109
 
114
110
# Check for some invalid values
115
 
if [ ! -d "$KEYDIR" ]; then
 
111
if [ -d "$KEYDIR" ]; then :; else
116
112
    echo "$KEYDIR not a directory" >&2
117
113
    exit 1
118
114
fi
119
 
if [ ! -r "$KEYDIR" ]; then
120
 
    echo "Directory $KEYDIR not readable" >&2
 
115
if [ -w "$KEYDIR" ]; then :; else
 
116
    echo "Directory $KEYDIR not writeable" >&2
 
117
    exit 1
 
118
fi
 
119
 
 
120
if [ "$mode" = password -a -e "$KEYDIR/trustdb.gpg.lock" ]; then
 
121
    echo "Key directory has locked trustdb; aborting." >&2
121
122
    exit 1
122
123
fi
123
124
 
124
125
if [ "$mode" = keygen ]; then
125
 
    if [ ! -w "$KEYDIR" ]; then
126
 
        echo "Directory $KEYDIR not writeable" >&2
127
 
        exit 1
128
 
    fi
129
126
    if [ -z "$KEYTYPE" ]; then
130
127
        echo "Empty key type" >&2
131
128
        exit 1
152
149
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
153
150
    esac
154
151
    
155
 
    if [ \( -e "$SECKEYFILE" -o -e "$PUBKEYFILE" \) \
156
 
        -a "$FORCE" -eq 0 ]; then
 
152
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
 
153
        && [ "$FORCE" -eq 0 ]; then
157
154
        echo "Refusing to overwrite old key files; use --force" >&2
158
155
        exit 1
159
156
    fi
167
164
    fi
168
165
 
169
166
    # Create temporary gpg batch file
170
 
    BATCHFILE="`mktemp -t mandos-keygen-batch.XXXXXXXXXX`"
 
167
    BATCHFILE="`mktemp -t mandos-gpg-batch.XXXXXXXXXX`"
171
168
fi
172
169
 
173
170
if [ "$mode" = password ]; then
174
171
    # Create temporary encrypted password file
175
 
    SECFILE="`mktemp -t mandos-keygen-secfile.XXXXXXXXXX`"
176
 
fi
177
 
 
178
 
# Create temporary key ring directory
179
 
RINGDIR="`mktemp -d -t mandos-keygen-keyrings.XXXXXXXXXX`"
 
172
    SECFILE="`mktemp -t mandos-gpg-secfile.XXXXXXXXXX`"
 
173
fi
 
174
 
 
175
# Create temporary key rings
 
176
SECRING="`mktemp -t mandos-gpg-secring.XXXXXXXXXX`"
 
177
PUBRING="`mktemp -t mandos-gpg-pubring.XXXXXXXXXX`"
 
178
 
 
179
if [ "$mode" = password ]; then
 
180
    # If a trustdb.gpg file does not already exist, schedule it for
 
181
    # deletion when we are done.
 
182
    if ! [ -e "$KEYDIR/trustdb.gpg" ]; then
 
183
        TRUSTDB="$KEYDIR/trustdb.gpg"
 
184
    fi
 
185
fi
180
186
 
181
187
# Remove temporary files on exit
182
188
trap "
183
189
set +e; \
184
 
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
185
 
shred --remove \"$RINGDIR\"/sec*;
186
 
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
187
 
rm --recursive --force \"$RINGDIR\";
 
190
rm --force $PUBRING ${PUBRING}~ $BATCHFILE $TRUSTDB; \
 
191
shred --remove $SECRING $SECFILE; \
188
192
stty echo; \
189
193
" EXIT
190
194
 
191
 
umask 077
 
195
umask 027
192
196
 
193
197
if [ "$mode" = keygen ]; then
194
198
    # Create batch file for GnuPG
205
209
        Expire-Date: $KEYEXPIRE
206
210
        #Preferences: <string>
207
211
        #Handle: <no-spaces>
208
 
        #%pubring pubring.gpg
209
 
        #%secring secring.gpg
 
212
        %pubring $PUBRING
 
213
        %secring $SECRING
210
214
        %commit
211
215
        EOF
212
216
    
213
217
    # Generate a new key in the key rings
214
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
215
 
        --homedir "$RINGDIR" --trust-model always \
 
218
    gpg --no-random-seed-file --quiet --batch --no-tty \
 
219
        --no-default-keyring --no-options --enable-dsa2 \
 
220
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
216
221
        --gen-key "$BATCHFILE"
217
222
    rm --force "$BATCHFILE"
218
 
    
 
223
 
219
224
    # Backup any old key files
220
225
    if cp --backup=numbered --force "$SECKEYFILE" "$SECKEYFILE" \
221
226
        2>/dev/null; then
236
241
    fi
237
242
    
238
243
    # Export keys from key rings to key files
239
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
240
 
        --homedir "$RINGDIR" --armor --export-options export-minimal \
241
 
        --comment "$FILECOMMENT" --output "$SECKEYFILE" \
242
 
        --export-secret-keys
243
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
244
 
        --homedir "$RINGDIR" --armor --export-options export-minimal \
245
 
        --comment "$FILECOMMENT" --output "$PUBKEYFILE" --export
 
244
    gpg --no-random-seed-file --quiet --batch --no-tty --armor \
 
245
        --no-default-keyring --no-options --enable-dsa2 \
 
246
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
 
247
        --export-options export-minimal --comment "$FILECOMMENT" \
 
248
        --output "$SECKEYFILE" --export-secret-keys
 
249
    gpg --no-random-seed-file --quiet --batch --no-tty --armor \
 
250
        --no-default-keyring --no-options --enable-dsa2 \
 
251
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
 
252
        --export-options export-minimal --comment "$FILECOMMENT" \
 
253
        --output "$PUBKEYFILE" --export
246
254
fi
247
255
 
248
256
if [ "$mode" = password ]; then
249
257
    # Import keys into temporary key rings
250
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
251
 
        --homedir "$RINGDIR" --trust-model always --armor \
252
 
        --import "$SECKEYFILE"
253
 
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
254
 
        --homedir "$RINGDIR" --trust-model always --armor \
255
 
        --import "$PUBKEYFILE"
256
 
    
 
258
    gpg --no-random-seed-file --quiet --batch --no-tty --armor \
 
259
        --no-default-keyring --no-options --enable-dsa2 \
 
260
        --homedir "$KEYDIR" --no-permission-warning \
 
261
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
 
262
        --trust-model always --import "$SECKEYFILE"
 
263
    gpg --no-random-seed-file --quiet --batch --no-tty --armor \
 
264
        --no-default-keyring --no-options --enable-dsa2 \
 
265
        --homedir "$KEYDIR" --no-permission-warning \
 
266
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
 
267
        --trust-model always --import "$PUBKEYFILE"
 
268
 
257
269
    # Get fingerprint of key
258
 
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
259
 
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
260
 
        --fingerprint --with-colons \
261
 
        | sed --quiet \
262
 
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
 
270
    FINGERPRINT="`gpg --no-random-seed-file --quiet --batch --no-tty \
 
271
        --armor --no-default-keyring --no-options --enable-dsa2 \
 
272
        --homedir \"$KEYDIR\" --no-permission-warning \
 
273
        --secret-keyring \"$SECRING\" --keyring \"$PUBRING\" \
 
274
        --trust-model always --fingerprint --with-colons \
 
275
        | sed -n -e '/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
263
276
    
264
277
    test -n "$FINGERPRINT"
265
278
    
267
280
    
268
281
    stty -echo
269
282
    echo -n "Enter passphrase: " >&2
270
 
    head --lines=1 | tr --delete '\n' \
271
 
        | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
272
 
        --homedir "$RINGDIR" --trust-model always --armor --encrypt \
273
 
        --recipient "$FINGERPRINT" --comment "$FILECOMMENT" \
 
283
    sed -e '1q' \
 
284
        | gpg --no-random-seed-file --batch --no-tty --armor \
 
285
        --no-default-keyring --no-options --enable-dsa2 \
 
286
        --homedir "$KEYDIR" --no-permission-warning \
 
287
        --secret-keyring "$SECRING" --keyring "$PUBRING" \
 
288
        --trust-model always --encrypt --recipient "$FINGERPRINT" \
 
289
        --comment "$FILECOMMENT" \
274
290
        > "$SECFILE"
275
291
    echo >&2
276
292
    stty echo
281
297
        fingerprint = $FINGERPRINT
282
298
        secret =
283
299
EOF
284
 
    sed --quiet --expression='
 
300
    sed -n -e '
285
301
        /^-----BEGIN PGP MESSAGE-----$/,/^-----END PGP MESSAGE-----$/{
286
302
            /^$/,${
287
303
                # Remove 24-bit Radix-64 checksum
300
316
    shred --remove "$SECFILE"
301
317
fi
302
318
# Remove the key rings
303
 
shred --remove "$RINGDIR"/sec*
304
 
rm --recursive --force "$RINGDIR"
 
319
shred --remove "$SECRING"
 
320
rm --force "$PUBRING" "${PUBRING}~"
 
321
# Remove the trustdb, if one did not exist when we started
 
322
if [ -n "$TRUSTDB" ]; then
 
323
    rm --force "$TRUSTDB"
 
324
fi