| 1 | #! /usr/bin/perl -W |
|---|
| 2 | |
|---|
| 3 | # by Mike Schiraldi <raldi@research.netsol.com> |
|---|
| 4 | |
|---|
| 5 | use strict; |
|---|
| 6 | use Expect; |
|---|
| 7 | |
|---|
| 8 | sub run ($;$ ); |
|---|
| 9 | |
|---|
| 10 | umask 077; # probably not necc. but can't hurt |
|---|
| 11 | |
|---|
| 12 | my $tmpdir = "/tmp/smime_keys_test-$$-" . time; |
|---|
| 13 | |
|---|
| 14 | mkdir $tmpdir or die; |
|---|
| 15 | chdir $tmpdir or die; |
|---|
| 16 | |
|---|
| 17 | open TMP, '>muttrc' or die; |
|---|
| 18 | print TMP <<EOF; |
|---|
| 19 | set smime_ca_location="$tmpdir/ca-bundle.crt" |
|---|
| 20 | set smime_certificates="$tmpdir/certificates" |
|---|
| 21 | set smime_keys="$tmpdir/keys" |
|---|
| 22 | EOF |
|---|
| 23 | close TMP; |
|---|
| 24 | |
|---|
| 25 | $ENV{MUTT_CMDLINE} = "mutt -F $tmpdir/muttrc"; |
|---|
| 26 | |
|---|
| 27 | # make a user key |
|---|
| 28 | run 'smime_keys init'; |
|---|
| 29 | run 'openssl genrsa -out user.key 1024'; |
|---|
| 30 | |
|---|
| 31 | # make a request for this key to be signed |
|---|
| 32 | run 'openssl req -new -key user.key -out newreq.pem', "\n\nx\n\nx\nx\nuser\@smime.mutt\n\nx\n"; |
|---|
| 33 | |
|---|
| 34 | mkdir 'demoCA' or die; |
|---|
| 35 | mkdir 'demoCA/certs' or die; |
|---|
| 36 | mkdir 'demoCA/crl' or die; |
|---|
| 37 | mkdir 'demoCA/newcerts' or die; |
|---|
| 38 | mkdir 'demoCA/private' or die; |
|---|
| 39 | open OUT, '>demoCA/serial' or die; |
|---|
| 40 | print OUT "01\n"; |
|---|
| 41 | close OUT; |
|---|
| 42 | open OUT, '>demoCA/index.txt' or die; |
|---|
| 43 | close OUT; |
|---|
| 44 | |
|---|
| 45 | # make the CA |
|---|
| 46 | run 'openssl req -new -x509 -keyout demoCA/private/cakey.pem -out demoCA/cacert.pem -days 7300 -nodes', |
|---|
| 47 | "\n\nx\n\nx\nx\n\n"; |
|---|
| 48 | |
|---|
| 49 | # trust it |
|---|
| 50 | run 'smime_keys add_root demoCA/cacert.pem', "root_CA\n"; |
|---|
| 51 | |
|---|
| 52 | # have the CA process the request |
|---|
| 53 | run 'openssl ca -batch -startdate 000101000000Z -enddate 200101000000Z -days 7300 ' . |
|---|
| 54 | '-policy policy_anything -out newcert.pem -infiles newreq.pem'; |
|---|
| 55 | |
|---|
| 56 | unlink 'newreq.pem' or die; |
|---|
| 57 | |
|---|
| 58 | # put it all in a .p12 bundle |
|---|
| 59 | run 'openssl pkcs12 -export -inkey user.key -in newcert.pem -out cert.p12 -CAfile demoCA/cacert.pem -chain', "pass1\n" x 2; |
|---|
| 60 | unlink 'newcert.pem' or die; |
|---|
| 61 | unlink 'demoCA/cacert.pem' or die; |
|---|
| 62 | unlink 'demoCA/index.txt' or die; |
|---|
| 63 | unlink 'demoCA/index.txt.old' or die; |
|---|
| 64 | unlink 'demoCA/serial' or die; |
|---|
| 65 | unlink 'demoCA/serial.old' or die; |
|---|
| 66 | unlink 'demoCA/newcerts/01.pem' or die; |
|---|
| 67 | unlink 'demoCA/private/cakey.pem' or die; |
|---|
| 68 | rmdir 'demoCA/certs' or die; |
|---|
| 69 | rmdir 'demoCA/crl' or die; |
|---|
| 70 | rmdir 'demoCA/private' or die; |
|---|
| 71 | rmdir 'demoCA/newcerts' or die; |
|---|
| 72 | rmdir 'demoCA' or die; |
|---|
| 73 | |
|---|
| 74 | # have smime_keys process it |
|---|
| 75 | run 'smime_keys add_p12 cert.p12', "pass1\n" . "pass2\n" x 2 . "old_label\n"; |
|---|
| 76 | unlink 'cert.p12' or die; |
|---|
| 77 | |
|---|
| 78 | # make sure it showed up |
|---|
| 79 | run 'smime_keys list > list'; |
|---|
| 80 | |
|---|
| 81 | open IN, 'list' or die; |
|---|
| 82 | <IN> eq "\n" or die; |
|---|
| 83 | <IN> =~ /^(.*)\: Issued for\: user\@smime\.mutt \"old_label\" \(Unverified\)\n/ or die; |
|---|
| 84 | close IN; |
|---|
| 85 | |
|---|
| 86 | my $keyid = $1; |
|---|
| 87 | |
|---|
| 88 | # see if we can rename it |
|---|
| 89 | run "smime_keys label $keyid", "new_label\n"; |
|---|
| 90 | |
|---|
| 91 | # make sure it worked |
|---|
| 92 | run 'smime_keys list > list'; |
|---|
| 93 | |
|---|
| 94 | open IN, 'list' or die; |
|---|
| 95 | <IN> eq "\n" or die; |
|---|
| 96 | <IN> =~ /^$keyid\: Issued for\: user\@smime\.mutt \"new_label\" \(Unverified\)\n/ or die; |
|---|
| 97 | close IN; |
|---|
| 98 | |
|---|
| 99 | unlink 'list' or die; |
|---|
| 100 | |
|---|
| 101 | # try signing something |
|---|
| 102 | run "openssl smime -sign -signer certificates/$keyid -inkey user.key -in /etc/passwd -certfile certificates/37adefc3.0 > signed"; |
|---|
| 103 | unlink 'user.key' or die; |
|---|
| 104 | |
|---|
| 105 | # verify it |
|---|
| 106 | run 'openssl smime -verify -out /dev/null -in signed -CAfile ca-bundle.crt'; |
|---|
| 107 | unlink 'signed' or die; |
|---|
| 108 | |
|---|
| 109 | # clean up |
|---|
| 110 | unlink 'ca-bundle.crt' or die; |
|---|
| 111 | unlink 'muttrc' or die; |
|---|
| 112 | unlink 'keys/.index' or die; |
|---|
| 113 | unlink 'certificates/.index' or die; |
|---|
| 114 | unlink <keys/*> or die; |
|---|
| 115 | unlink <certificates/*> or die; |
|---|
| 116 | rmdir 'keys' or die; |
|---|
| 117 | rmdir 'certificates' or die; |
|---|
| 118 | chdir '/' or die; |
|---|
| 119 | rmdir $tmpdir or die; |
|---|
| 120 | |
|---|
| 121 | |
|---|
| 122 | sub run ($;$) { |
|---|
| 123 | my $cmd = shift or die; |
|---|
| 124 | my $input = shift; |
|---|
| 125 | |
|---|
| 126 | print "\n\nRunning [$cmd]\n"; |
|---|
| 127 | |
|---|
| 128 | my $exp = Expect->spawn ($cmd); |
|---|
| 129 | if (defined $input) { |
|---|
| 130 | print $exp $input; |
|---|
| 131 | } |
|---|
| 132 | $exp->soft_close; |
|---|
| 133 | $? and die "$cmd returned $?"; |
|---|
| 134 | } |
|---|