aboutsummaryrefslogtreecommitdiffstats
path: root/tests/openpgp/export.test
blob: e0fe9264333a0e8b48471f03202f9f552793b066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh

. $srcdir/defs.inc || exit 3

check_exported_public_key()
{
    $GPG --list-packets $1 >$1.packets
    grep '^:public key packet:' $1.packets >/dev/null
    grep "^	keyid: .*$KEY$" $1.packets >/dev/null
    grep '^:user ID packet:' $1.packets >/dev/null
    grep "^:signature packet:.*keyid.*$KEY" $1.packets >/dev/null
    rm $1.packets
}

check_armored_public_key()
{
    grep '^-----BEGIN PGP PUBLIC KEY BLOCK-----$' $1 >/dev/null
    grep '^-----END PGP PUBLIC KEY BLOCK-----$' $1 >/dev/null
    check_exported_public_key $1
}

check_exported_private_key()
{
    $GPG --list-packets $1 >$1.packets
    grep '^:secret key packet:' $1.packets >/dev/null
    grep "^	keyid: .*$KEY$" $1.packets >/dev/null
    grep '^:user ID packet:' $1.packets >/dev/null
    grep "^:signature packet:.*keyid.*$KEY" $1.packets >/dev/null
    rm $1.packets
}

check_armored_private_key()
{
    grep '^-----BEGIN PGP PRIVATE KEY BLOCK-----$' $1 >/dev/null
    grep '^-----END PGP PRIVATE KEY BLOCK-----$' $1 >/dev/null
    check_exported_private_key $1
}

logfile="`pwd`/pinentry.log"
ppfile="`pwd`/passphrases"
rm -f -- $logfile $ppfile
touch $ppfile

prepare_passphrase()
{
    echo $* >>$ppfile
}

prepare_passphrase_confirm()
{
    echo "fake-entry being started to CONFIRM the weak phrase" >>$ppfile
}

assert_passphrases_consumed()
{
    if test -s $ppfile; then
        echo "Expected $ppfile to be empty, but these are enqueued:" >&2
        cat "$ppfile" >&2
        exit 1
    fi
    rm -f -- $logfile
}

# XXX: Currently, gpg does not allow one to export private keys
# without a passphrase (issue2070, issue2324).
export PINENTRY_USER_DATA="--logfile=$logfile --passphrasefile=$ppfile"

info "Checking key export."
for KEY in D74C5F22 C40FDECF ECABF51D
do
    progress $KEY

    $GPG --export $KEY >$KEY.public
    check_exported_public_key $KEY.public
    rm $KEY.public

    $GPG --armor --export $KEY >$KEY.public
    check_armored_public_key $KEY.public
    rm $KEY.public

    if [ $KEY = D74C5F22 ]; then
        # Key D74C5F22 is protected by a passphrase.  Prepare this
        # one.  Currently, GnuPG does not ask for an export passphrase
        # in this case.
        prepare_passphrase "$usrpass1"
    else
        # We use a weak passphrase which we'll have to confirm.
        prepare_passphrase "export passphrase"
        prepare_passphrase_confirm
        prepare_passphrase "export passphrase"

        # Key C40FDECF has a subkey.
        if [ $KEY = C40FDECF ]; then
            prepare_passphrase "export passphrase"
            prepare_passphrase_confirm
            prepare_passphrase "export passphrase"
        fi
    fi

    $GPG --export-secret-keys $KEY >$KEY.private
    check_exported_private_key $KEY.private
    rm $KEY.private

    assert_passphrases_consumed

    if [ $KEY = D74C5F22 ]; then
        # Key D74C5F22 is protected by a passphrase.  Prepare this
        # one.  Currently, GnuPG does not ask for an export passphrase
        # in this case.
        prepare_passphrase "$usrpass1"
    else
        # We use a stronger passphrase here.
        prepare_passphrase "strong export passphrase H0LHWCHPkNa36A"
        prepare_passphrase "strong export passphrase H0LHWCHPkNa36A"

        # Key C40FDECF has a subkey.
        if [ $KEY = C40FDECF ]; then
            prepare_passphrase "strong export passphrase H0LHWCHPkNa36A"
            prepare_passphrase "strong export passphrase H0LHWCHPkNa36A"
        fi
    fi

    $GPG --armor --export-secret-keys $KEY >$KEY.private
    check_armored_private_key $KEY.private
    rm $KEY.private

    assert_passphrases_consumed
done

progress_end