/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: 2024-11-17 18:43:11 UTC
  • Revision ID: teddy@recompile.se-20241117184311-ox25kvngy62h209g
Debian package: Avoid suggesting a C compiler unnecessarily

The list of suggested packages, meant to enable the "mandos" program
to find the correct value of SO_BINDTODEVICE by using a C compiler,
are not necessary when Python 3.3 or later is used, since it has the
SO_BINDTODEVICE constant defined in the "socket" module.  Also, Python
2.6 or older has the same constant in the old "IN" module.  Therefore,
we should suggest these Python versions as alternatives to a C
compiler, so that a C compiler is not installed unnecessarily.

debian/control (Package: mandos/Suggests): Add "python3 (>= 3.3)" and
"python (<= 2.6)" as alternatives to "libc6-dev | libc-dev" and
"c-compiler".

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
# Contact the authors at <mandos@recompile.se>.
24
24
25
25
 
26
 
VERSION="1.8.4"
 
26
VERSION="1.8.17"
27
27
 
28
28
KEYDIR="/etc/keys/mandos"
29
29
KEYTYPE=RSA
147
147
        echo "Empty key type" >&2
148
148
        exit 1
149
149
    fi
150
 
    
 
150
 
151
151
    if [ -z "$KEYNAME" ]; then
152
152
        echo "Empty key name" >&2
153
153
        exit 1
154
154
    fi
155
 
    
 
155
 
156
156
    if [ -z "$KEYLENGTH" ] || [ "$KEYLENGTH" -lt 512 ]; then
157
157
        echo "Invalid key length" >&2
158
158
        exit 1
159
159
    fi
160
 
    
 
160
 
161
161
    if [ -z "$KEYEXPIRE" ]; then
162
162
        echo "Empty key expiration" >&2
163
163
        exit 1
164
164
    fi
165
 
    
 
165
 
166
166
    # Make FORCE be 0 or 1
167
167
    case "$FORCE" in
168
168
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) FORCE=1;;
169
169
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
170
170
    esac
171
 
    
 
171
 
172
172
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ] \
173
173
             || [ -e "$TLS_PRIVKEYFILE" ] \
174
174
             || [ -e "$TLS_PUBKEYFILE" ]; } \
176
176
        echo "Refusing to overwrite old key files; use --force" >&2
177
177
        exit 1
178
178
    fi
179
 
    
 
179
 
180
180
    # Set lines for GnuPG batch file
181
181
    if [ -n "$KEYCOMMENT" ]; then
182
182
        KEYCOMMENTLINE="Name-Comment: $KEYCOMMENT"
184
184
    if [ -n "$KEYEMAIL" ]; then
185
185
        KEYEMAILLINE="Name-Email: $KEYEMAIL"
186
186
    fi
187
 
    
 
187
 
188
188
    # Create temporary gpg batch file
189
189
    BATCHFILE="`mktemp -t mandos-keygen-batch.XXXXXXXXXX`"
190
190
    TLS_PRIVKEYTMP="`mktemp -t mandos-keygen-privkey.XXXXXXXXXX`"
233
233
        %no-protection
234
234
        %commit
235
235
        EOF
236
 
    
 
236
 
237
237
    if tty --quiet; then
238
238
        cat <<-EOF
239
239
        Note: Due to entropy requirements, key generation could take
276
276
            fi
277
277
        fi
278
278
    fi
279
 
    
 
279
 
280
280
    # Make sure trustdb.gpg exists;
281
281
    # this is a workaround for Debian bug #737128
282
282
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
287
287
        --homedir "$RINGDIR" --trust-model always \
288
288
        --gen-key "$BATCHFILE"
289
289
    rm --force "$BATCHFILE"
290
 
    
 
290
 
291
291
    if tty --quiet; then
292
292
        echo -n "Finished: "
293
293
        date
294
294
    fi
295
 
    
 
295
 
296
296
    # Backup any old key files
297
297
    if cp --backup=numbered --force "$SECKEYFILE" "$SECKEYFILE" \
298
298
        2>/dev/null; then
302
302
        2>/dev/null; then
303
303
        rm --force "$PUBKEYFILE"
304
304
    fi
305
 
    
 
305
 
306
306
    FILECOMMENT="Mandos client key for $KEYNAME"
307
307
    if [ "$KEYCOMMENT" != "$KEYCOMMENT_ORIG" ]; then
308
308
        FILECOMMENT="$FILECOMMENT ($KEYCOMMENT)"
309
309
    fi
310
 
    
 
310
 
311
311
    if [ -n "$KEYEMAIL" ]; then
312
312
        FILECOMMENT="$FILECOMMENT <$KEYEMAIL>"
313
313
    fi
314
 
    
 
314
 
315
315
    # Export key from key rings to key files
316
316
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
317
317
        --homedir "$RINGDIR" --armor --export-options export-minimal \
323
323
fi
324
324
 
325
325
if [ "$mode" = password ]; then
326
 
    
 
326
 
327
327
    # Make SSH be 0 or 1
328
328
    case "$SSH" in
329
329
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) SSH=1;;
330
330
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) SSH=0;;
331
331
    esac
332
 
    
 
332
 
333
333
    if [ $SSH -eq 1 ]; then
334
 
        for ssh_keytype in ecdsa-sha2-nistp256 ed25519 rsa; do
335
 
            set +e
336
 
            ssh_fingerprint="`ssh-keyscan -t $ssh_keytype localhost 2>/dev/null`"
337
 
            err=$?
338
 
            set -e
339
 
            if [ $err -ne 0 ]; then
340
 
                ssh_fingerprint=""
341
 
                continue
342
 
            fi
343
 
            if [ -n "$ssh_fingerprint" ]; then
344
 
                ssh_fingerprint="${ssh_fingerprint#localhost }"
345
 
                break
346
 
            fi
 
334
        # The -q option is new in OpenSSH 9.8
 
335
        for ssh_keyscan_quiet in "-q " ""; do
 
336
            for ssh_keytype in ecdsa-sha2-nistp256 ed25519 rsa; do
 
337
                set +e
 
338
                ssh_fingerprint="`ssh-keyscan ${ssh_keyscan_quiet}-t $ssh_keytype localhost 2>/dev/null`"
 
339
                err=$?
 
340
                set -e
 
341
                if [ $err -ne 0 ]; then
 
342
                    ssh_fingerprint=""
 
343
                    continue
 
344
                fi
 
345
                if [ -n "$ssh_fingerprint" ]; then
 
346
                    ssh_fingerprint="${ssh_fingerprint#localhost }"
 
347
                    break 2
 
348
                fi
 
349
            done
347
350
        done
348
351
    fi
349
 
    
 
352
 
350
353
    # Import key into temporary key rings
351
354
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
352
355
        --homedir "$RINGDIR" --trust-model always --armor \
354
357
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
355
358
        --homedir "$RINGDIR" --trust-model always --armor \
356
359
        --import "$PUBKEYFILE"
357
 
    
 
360
 
358
361
    # Get fingerprint of key
359
362
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
360
363
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
361
364
        --fingerprint --with-colons \
362
365
        | sed --quiet \
363
366
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
364
 
    
 
367
 
365
368
    test -n "$FINGERPRINT"
366
 
    
 
369
 
367
370
    if [ -r "$TLS_PUBKEYFILE" ]; then
368
371
       KEY_ID="$(certtool --key-id --hash=sha256 \
369
372
                       --infile="$TLS_PUBKEYFILE" 2>/dev/null || :)"
376
379
       fi
377
380
       test -n "$KEY_ID"
378
381
    fi
379
 
    
 
382
 
380
383
    FILECOMMENT="Encrypted password for a Mandos client"
381
 
    
 
384
 
382
385
    while [ ! -s "$SECFILE" ]; do
383
386
        if [ -n "$PASSFILE" ]; then
384
 
            cat "$PASSFILE"
 
387
            cat -- "$PASSFILE"
385
388
        else
386
389
            tty --quiet && stty -echo
387
390
            echo -n "Enter passphrase: " >/dev/tty
397
400
                echo "Passphrase mismatch" >&2
398
401
                touch "$RINGDIR"/mismatch
399
402
            else
400
 
                echo -n "$first"
 
403
                printf "%s" "$first"
401
404
            fi
402
405
        fi | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
403
406
            --homedir "$RINGDIR" --trust-model always --armor \
412
415
            fi
413
416
        fi
414
417
    done
415
 
    
 
418
 
416
419
    cat <<-EOF
417
420
        [$KEYNAME]
418
421
        host = $KEYNAME
434
437
            }
435
438
        }' < "$SECFILE"
436
439
    if [ -n "$ssh_fingerprint" ]; then
437
 
        echo 'checker = ssh-keyscan -t '"$ssh_keytype"' %%(host)s 2>/dev/null | grep --fixed-strings --line-regexp --quiet --regexp=%%(host)s" %(ssh_fingerprint)s"'
 
440
        echo 'checker = ssh-keyscan '"$ssh_keyscan_quiet"'-t '"$ssh_keytype"' %%(host)s 2>/dev/null | grep --fixed-strings --line-regexp --quiet --regexp=%%(host)s" %(ssh_fingerprint)s"'
438
441
        echo "ssh_fingerprint = ${ssh_fingerprint}"
439
442
    fi
440
443
fi