added IKE DH parameter sets as PEM files, plus tools
[ach-master.git] / tools / sniff-client-ciphers / sniff-client-ciphers.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use autodie;
4 use Data::Dumper;
5
6 ##############################################################################
7 #
8 # a tool that takes a PCAP file and spits out
9 # the client ciphers of the first SSL negotiation in there.
10 #
11 # prerequisites: tshark (from the wireshark package) must be in the $PATH
12 #
13 # tested with tshark v1.8.2
14 #
15 ##############################################################################
16
17 my $usage = "usage: $0 'wireshark filter expression' filename [software]\n";
18
19 my $filter = shift || die $usage;
20 my $filename = shift || die $usage;
21 my $software = shift || "";
22
23 my @output = `tshark -r "$filename" -d tcp.port==1-65535,ssl -O ssl -R "$filter"`;
24
25 my $state = 'init';
26 my %d = ();
27 for (@output) {
28   chomp;
29
30   if($state eq 'init') {
31     if(/^\s+SSL Record Layer: Handshake Protocol: Client Hello/) {
32       $state = 'parse';
33       next;
34     }
35   }
36   if($state eq 'parse') {
37     if(/^\w/) {
38       $state = 'init';
39       dump_info();
40       %d = ();
41       last;
42     }
43
44     if(/^\s*Version: (.*)$/) {
45       $d{Version} = $1;
46     } elsif(/^\s*Cipher Suite:\s+(.*)$/) {
47       push(@{$d{Cipher_Suites}}, $1);
48     } elsif(/^\s*Compression Method:\s+(.*)$/) {
49       push(@{$d{Compression_Methods}}, $1);
50     } elsif(/^\s*Extension: server_name/) {
51       push(@{$d{Extensions}}, 'SNI');
52     } elsif(/^\s*Elliptic curve:\s+(.*)$/) {
53       push(@{$d{Elliptic_Curves}}, $1);
54     } elsif(/^\s*Extension: SessionTicket TLS/) {
55       push(@{$d{Extensions}}, 'SessionTicket');
56     } elsif(/^\s*Extension: next_protocol_negotiation/) {
57       push(@{$d{Extensions}}, 'NextProtocolNegotiation');
58     }
59   }
60 }
61
62 sub dump_info {
63   print "Client Software: $software\n\n";
64   print "TLS Version: $d{Version}\n\n";
65   print "Cipher Suites:\n";
66   for my $cs (@{$d{Cipher_Suites}}) {
67     printf "  %s\n", $cs;
68   }
69   print "\n";
70
71   print "Compression Methods:\n";
72   for my $co (@{$d{Compression_Methods}}) {
73     printf "  %s\n", $co;
74   }
75   print "\n";
76
77   if(exists $d{Elliptic_Curves}) {
78     print "Elliptic Curves:\n";
79     for my $ec (@{$d{Elliptic_Curves}}) {
80       printf "  %s\n", $ec;
81     }
82     print "\n";
83   }
84
85   print "Extensions:\n";
86   for my $ex (@{$d{Extensions}}) {
87     printf "  %s\n", $ex;
88   }
89   print "\n";
90 }