File Coverage

blib/lib/Protocol/TLS/Constants.pm
Criterion Covered Total %
statement 17 17 100.0
branch 3 6 50.0
condition 2 5 40.0
subroutine 7 7 100.0
pod 0 3 0.0
total 29 38 76.3


line stmt bran cond sub pod time code
1             package Protocol::TLS::Constants;
2 3     3   16085 use strict;
  3         5  
  3         119  
3 3     3   14 use warnings;
  3         3  
  3         340  
4             use constant {
5              
6 3         1906 TLS_v10 => 0x0301,
7             TLS_v11 => 0x0302,
8             TLS_v12 => 0x0303,
9             TLS_v13 => 0x0304,
10              
11             # connectionEnd
12             CLIENT => 0,
13             SERVER => 1,
14              
15             # Content Type
16             CTYPE_CHANGE_CIPHER_SPEC => 20,
17             CTYPE_ALERT => 21,
18             CTYPE_HANDSHAKE => 22,
19             CTYPE_APPLICATION_DATA => 23,
20              
21             # Handshake Type
22             HSTYPE_HELLO_REQUEST => 0,
23             HSTYPE_CLIENT_HELLO => 1,
24             HSTYPE_SERVER_HELLO => 2,
25             HSTYPE_CERTIFICATE => 11,
26             HSTYPE_SERVER_KEY_EXCHANGE => 12,
27             HSTYPE_CERTIFICATE_REQUEST => 13,
28             HSTYPE_SERVER_HELLO_DONE => 14,
29             HSTYPE_CERTIFICATE_VERIFY => 15,
30             HSTYPE_CLIENT_KEY_EXCHANGE => 16,
31             HSTYPE_FINISHED => 20,
32              
33             # Ciphers
34             TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 => 0xc02b,
35             TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 => 0xc02f,
36             TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA => 0xc00a,
37             TLS_RSA_WITH_AES_128_CBC_SHA => 0x002f,
38             TLS_RSA_WITH_3DES_EDE_CBC_SHA => 0x000a,
39             TLS_RSA_WITH_RC4_128_SHA => 0x0005,
40             TLS_RSA_WITH_RC4_128_MD5 => 0x0004,
41             TLS_RSA_WITH_NULL_SHA256 => 0x003b,
42             TLS_RSA_WITH_NULL_SHA => 0x0002,
43             TLS_NULL_WITH_NULL_NULL => 0x0000,
44              
45             # State
46             STATE_IDLE => 0,
47             STATE_HS_START => 1,
48             STATE_SESS_NEW => 2,
49             STATE_SESS_RESUME => 3,
50             STATE_HS_RESUME => 4,
51             STATE_HS_HALF => 5,
52             STATE_HS_FULL => 6,
53             STATE_OPEN => 7,
54              
55             # Alert
56             WARNING => 1,
57             FATAL => 2,
58              
59             # Alert description
60             CLOSE_NOTIFY => 0,
61             UNEXPECTED_MESSAGE => 10,
62             BAD_RECORD_MAC => 20,
63             DECRYPTION_FAILED_RESERVED => 21,
64             RECORD_OVERFLOW => 22,
65             DECOMPRESSION_FAILURE => 30,
66             HANDSHAKE_FAILURE => 40,
67             NO_CERTIFICATE_RESERVED => 41,
68             BAD_CERTIFICATE => 42,
69             UNSUPPORTED_CERTIFICATE => 43,
70             CERTIFICATE_REVOKED => 44,
71             CERTIFICATE_EXPIRED => 45,
72             CERTIFICATE_UNKNOWN => 46,
73             ILLEGAL_PARAMETER => 47,
74             UNKNOWN_CA => 48,
75             ACCESS_DENIED => 49,
76             DECODE_ERROR => 50,
77             DECRYPT_ERROR => 51,
78             EXPORT_RESTRICTION_RESERVED => 60,
79             PROTOCOL_VERSION => 70,
80             INSUFFICIENT_SECURITY => 71,
81             INTERNAL_ERROR => 80,
82             USER_CANCELED => 90,
83             NO_RENEGOTIATION => 100,
84             UNSUPPORTED_EXTENSION => 110,
85              
86 3     3   24 };
  3         4  
87              
88             require Exporter;
89             our @ISA = qw(Exporter);
90             our %EXPORT_TAGS = (
91             versions => [qw(TLS_v10 TLS_v11 TLS_v12 TLS_v13)],
92             c_types => [
93             qw( CTYPE_CHANGE_CIPHER_SPEC CTYPE_ALERT CTYPE_HANDSHAKE
94             CTYPE_APPLICATION_DATA )
95             ],
96             hs_types => [
97             qw( HSTYPE_HELLO_REQUEST HSTYPE_CLIENT_HELLO HSTYPE_SERVER_HELLO
98             HSTYPE_CERTIFICATE HSTYPE_SERVER_KEY_EXCHANGE
99             HSTYPE_CERTIFICATE_REQUEST HSTYPE_SERVER_HELLO_DONE
100             HSTYPE_CERTIFICATE_VERIFY HSTYPE_CLIENT_KEY_EXCHANGE HSTYPE_FINISHED )
101             ],
102             end_types => [qw( CLIENT SERVER )],
103             ciphers => [
104             qw( TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
105             TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
106             TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA
107             TLS_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_RC4_128_SHA
108             TLS_RSA_WITH_RC4_128_MD5 TLS_RSA_WITH_NULL_SHA256 TLS_RSA_WITH_NULL_SHA
109             TLS_NULL_WITH_NULL_NULL )
110             ],
111             state_types => [
112             qw( STATE_IDLE STATE_HS_START STATE_SESS_NEW STATE_SESS_RESUME
113             STATE_HS_RESUME STATE_HS_HALF STATE_HS_FULL STATE_OPEN )
114             ],
115             alert_types => [qw( WARNING FATAL )],
116             alert_desc => [
117             qw( CLOSE_NOTIFY UNEXPECTED_MESSAGE BAD_RECORD_MAC
118             DECRYPTION_FAILED_RESERVED RECORD_OVERFLOW DECOMPRESSION_FAILURE
119             HANDSHAKE_FAILURE NO_CERTIFICATE_RESERVED BAD_CERTIFICATE
120             UNSUPPORTED_CERTIFICATE CERTIFICATE_REVOKED CERTIFICATE_EXPIRED
121             CERTIFICATE_UNKNOWN ILLEGAL_PARAMETER UNKNOWN_CA ACCESS_DENIED
122             DECODE_ERROR DECRYPT_ERROR EXPORT_RESTRICTION_RESERVED PROTOCOL_VERSION
123             INSUFFICIENT_SECURITY INTERNAL_ERROR USER_CANCELED NO_RENEGOTIATION
124             UNSUPPORTED_EXTENSION)
125             ]
126             );
127              
128             my ( %reverse, %ciphers );
129             {
130 3     3   22 no strict 'refs';
  3         3  
  3         924  
131             for my $k ( keys %EXPORT_TAGS ) {
132             for my $v ( @{ $EXPORT_TAGS{$k} } ) {
133             $reverse{$k}{ &{$v} } = $v;
134             }
135             }
136              
137             for my $c ( keys %{ $reverse{ciphers} } ) {
138             $ciphers{$c} =
139             [ $reverse{ciphers}{$c} =~ /^TLS_(.+)_WITH_(.+)_([^_]+)$/ ];
140             }
141             }
142              
143             sub const_name {
144 73     73 0 130 my ( $tag, $value ) = @_;
145 73 50 50     577 exists $reverse{$tag} ? ( $reverse{$tag}{$value} || '' ) : '';
146             }
147              
148             sub is_tls_version {
149 24 50 33 24 0 178 $_[0] < TLS_v10 || $_[0] > TLS_v12 ? undef : $_[0];
150             }
151              
152             sub cipher_type {
153 6 50   6 0 57 exists $ciphers{ $_[0] } ? @{ $ciphers{ $_[0] } } : ();
  6         54  
154             }
155              
156             our @EXPORT_OK = (
157             qw(const_name is_tls_version cipher_type ),
158             map { @$_ } values %EXPORT_TAGS
159             );
160              
161             1