File Coverage

blib/lib/Crypt/MatrixSSL3.pm
Criterion Covered Total %
statement 537 542 99.0
branch 8 12 66.6
condition n/a
subroutine 177 179 98.8
pod 2 2 100.0
total 724 735 98.5


line stmt bran cond sub pod time code
1             package Crypt::MatrixSSL3;
2 22     22   489245 use 5.006;
  22         86  
3 22     22   125 use strict;
  22         51  
  22         486  
4 22     22   130 use warnings;
  22         65  
  22         678  
5 22     22   122 use Carp;
  22         48  
  22         1667  
6              
7 22     22   146 use Scalar::Util qw( dualvar );
  22         56  
  22         1744  
8 22     22   136 use XSLoader;
  22         60  
  22         673  
9              
10             BEGIN {
11 22     22   9041 use version 0.77 (); our $VERSION = 'v3.9.1';
  22     22   37861  
  22         1024  
  22         82  
12 22         22038 XSLoader::load(__PACKAGE__,$VERSION);
13             }
14              
15 22     22   10582 use File::ShareDir;
  22         120324  
  22         1847  
16             our $CA_CERTIFICATES = File::ShareDir::dist_file('Crypt-MatrixSSL3', 'ca-certificates.crt');
17              
18             # WARNING The CONST_* constants automatically parsed from this file by
19             # Makefile.PL to generate const-*.inc, so if these constants will be
20             # reformatted there may be needs in updating regexp in Makefile.PL.
21 22         1826 use constant CONST_VERSION_INT => qw(
22             SSL2_MAJ_VER
23             SSL3_MAJ_VER
24             SSL3_MIN_VER
25             TLS_1_1_MIN_VER
26             TLS_1_2_MIN_VER
27             TLS_MAJ_VER
28             TLS_MIN_VER
29             TLS_HIGHEST_MINOR
30             MATRIXSSL_VERSION_MAJOR
31             MATRIXSSL_VERSION_MINOR
32             MATRIXSSL_VERSION_PATCH
33 22     22   181 );
  22         207  
34 22         2389 use constant CONST_VERSION => (
35             CONST_VERSION_INT,
36             'MATRIXSSL_VERSION_CODE',
37             'MATRIXSSL_VERSION',
38 22     22   145 );
  22         49  
39 22         1495 use constant CONST_CIPHER => qw(
40             SSL_NULL_WITH_NULL_NULL
41             SSL_RSA_WITH_NULL_MD5
42             SSL_RSA_WITH_NULL_SHA
43             SSL_RSA_WITH_RC4_128_MD5
44             SSL_RSA_WITH_RC4_128_SHA
45             TLS_RSA_WITH_IDEA_CBC_SHA
46             SSL_RSA_WITH_3DES_EDE_CBC_SHA
47             SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
48             SSL_DH_anon_WITH_RC4_128_MD5
49             SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
50             TLS_RSA_WITH_AES_128_CBC_SHA
51             TLS_DHE_RSA_WITH_AES_128_CBC_SHA
52             TLS_DH_anon_WITH_AES_128_CBC_SHA
53             TLS_RSA_WITH_AES_256_CBC_SHA
54             TLS_DHE_RSA_WITH_AES_256_CBC_SHA
55             TLS_DH_anon_WITH_AES_256_CBC_SHA
56             TLS_RSA_WITH_AES_128_CBC_SHA256
57             TLS_RSA_WITH_AES_256_CBC_SHA256
58             TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
59             TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
60             TLS_RSA_WITH_SEED_CBC_SHA
61             TLS_PSK_WITH_AES_128_CBC_SHA
62             TLS_PSK_WITH_AES_128_CBC_SHA256
63             TLS_PSK_WITH_AES_256_CBC_SHA384
64             TLS_PSK_WITH_AES_256_CBC_SHA
65             TLS_DHE_PSK_WITH_AES_128_CBC_SHA
66             TLS_DHE_PSK_WITH_AES_256_CBC_SHA
67             TLS_RSA_WITH_AES_128_GCM_SHA256
68             TLS_RSA_WITH_AES_256_GCM_SHA384
69             TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
70             TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
71             TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
72             TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
73             TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
74             TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
75             TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
76             TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
77             TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
78             TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
79             TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
80             TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
81             TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
82             TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
83             TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
84             TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
85             TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
86             TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
87             TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
88             TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
89             TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
90             TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
91             TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
92             TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
93             TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
94             TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
95             TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
96 22     22   169 );
  22         51  
97              
98 22         1088 use constant CONST_SESSION_OPTION => qw(
99             SSL_OPTION_FULL_HANDSHAKE
100 22     22   132 );
  22         52  
101              
102 22         1595 use constant CONST_ALERT_LEVEL => qw(
103             SSL_ALERT_LEVEL_WARNING
104             SSL_ALERT_LEVEL_FATAL
105 22     22   134 );
  22         60  
106              
107 22         1704 use constant CONST_ALERT_DESCR => qw(
108             SSL_ALERT_NONE
109             SSL_ALERT_CLOSE_NOTIFY
110             SSL_ALERT_UNEXPECTED_MESSAGE
111             SSL_ALERT_BAD_RECORD_MAC
112             SSL_ALERT_DECRYPTION_FAILED
113             SSL_ALERT_RECORD_OVERFLOW
114             SSL_ALERT_DECOMPRESSION_FAILURE
115             SSL_ALERT_HANDSHAKE_FAILURE
116             SSL_ALERT_NO_CERTIFICATE
117             SSL_ALERT_BAD_CERTIFICATE
118             SSL_ALERT_UNSUPPORTED_CERTIFICATE
119             SSL_ALERT_CERTIFICATE_REVOKED
120             SSL_ALERT_CERTIFICATE_EXPIRED
121             SSL_ALERT_CERTIFICATE_UNKNOWN
122             SSL_ALERT_ILLEGAL_PARAMETER
123             SSL_ALERT_UNKNOWN_CA
124             SSL_ALERT_ACCESS_DENIED
125             SSL_ALERT_DECODE_ERROR
126             SSL_ALERT_DECRYPT_ERROR
127             SSL_ALERT_PROTOCOL_VERSION
128             SSL_ALERT_INSUFFICIENT_SECURITY
129             SSL_ALERT_INTERNAL_ERROR
130             SSL_ALERT_INAPPROPRIATE_FALLBACK
131             SSL_ALERT_NO_RENEGOTIATION
132             SSL_ALERT_UNSUPPORTED_EXTENSION
133             SSL_ALERT_UNRECOGNIZED_NAME
134             SSL_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE
135             SSL_ALERT_UNKNOWN_PSK_IDENTITY
136             SSL_ALERT_NO_APP_PROTOCOL
137 22     22   128 );
  22         44  
138              
139             # Order is important in CONST_ERROR and CONST_RC! Some constants have same
140             # value, but their names ordered to get better output in %RETURN_CODE.
141 22         2342 use constant CONST_ERROR => qw(
142             PS_FAILURE
143             MATRIXSSL_ERROR
144             PS_ARG_FAIL
145             PS_PLATFORM_FAIL
146             PS_MEM_FAIL
147             PS_LIMIT_FAIL
148             PS_UNSUPPORTED_FAIL
149             PS_DISABLED_FEATURE_FAIL
150             PS_PROTOCOL_FAIL
151             PS_TIMEOUT_FAIL
152             PS_INTERRUPT_FAIL
153             PS_PENDING
154             PS_EAGAIN
155             PS_PARSE_FAIL
156             PS_CERT_AUTH_FAIL_BC
157             PS_CERT_AUTH_FAIL_DN
158             PS_CERT_AUTH_FAIL_SIG
159             PS_CERT_AUTH_FAIL_REVOKED
160             PS_CERT_AUTH_FAIL
161             PS_CERT_AUTH_FAIL_EXTENSION
162             PS_CERT_AUTH_FAIL_PATH_LEN
163             PS_CERT_AUTH_FAIL_AUTHKEY
164             PS_SIGNATURE_MISMATCH
165             PS_AUTH_FAIL
166 22     22   124 );
  22         49  
167              
168 22         5088 use constant CONST_RC => qw(
169             PS_SUCCESS
170             MATRIXSSL_SUCCESS
171             MATRIXSSL_REQUEST_SEND
172             MATRIXSSL_REQUEST_RECV
173             MATRIXSSL_REQUEST_CLOSE
174             MATRIXSSL_APP_DATA
175             MATRIXSSL_HANDSHAKE_COMPLETE
176             MATRIXSSL_RECEIVED_ALERT
177             MATRIXSSL_APP_DATA_COMPRESSED
178 22     22   821 );
  22         50  
179              
180 22         2162 use constant CONST_LIMIT => qw(
181             SSL_MAX_DISABLED_CIPHERS
182             SSL_MAX_PLAINTEXT_LEN
183             SSL_MAX_RECORD_LEN
184             SSL_MAX_BUF_SIZE
185 22     22   803 );
  22         718  
186              
187 22         998 use constant CONST_VALIDATE => qw(
188             SSL_ALLOW_ANON_CONNECTION
189 22     22   148 );
  22         43  
190              
191 22         1126 use constant CONST_BOOL => qw(
192             PS_TRUE
193             PS_FALSE
194 22     22   128 );
  22         47  
195              
196 22         5784 use constant CONST_CAPABILITIES => qw(
197             SHARED_SESSION_CACHE_ENABLED
198             STATELESS_TICKETS_ENABLED
199             DH_PARAMS_ENABLED
200             ALPN_ENABLED
201             SNI_ENABLED
202             OCSP_STAPLES_ENABLED
203             CERTIFICATE_TRANSPARENCY_ENABLED
204 22     22   127 );
  22         48  
205              
206             BEGIN {
207 22     22   128 for (
208             CONST_VERSION_INT,
209             CONST_CIPHER,
210             CONST_SESSION_OPTION,
211             CONST_ALERT_LEVEL,
212             CONST_ALERT_DESCR,
213             CONST_ERROR,
214             CONST_RC,
215             CONST_LIMIT,
216             CONST_VALIDATE,
217             CONST_BOOL,
218             CONST_CAPABILITIES,
219             ) {
220             ## no critic (ProhibitStringyEval, RequireCheckingReturnValueOfEval)
221 3212 50   22   172146 eval 'use constant '.$_.' => '.(0+constant($_)).'; 1' or croak $@;
  22     22   136  
  22     22   49  
  22     22   712  
  22     22   130  
  22     22   49  
  22     22   1517  
  22     22   126  
  22     22   47  
  22     22   643  
  22     22   116  
  22     22   47  
  22     22   1472  
  22     22   119  
  22     22   46  
  22     22   604  
  22     22   116  
  22     22   42  
  22     22   597  
  22     22   116  
  22     22   47  
  22     22   594  
  22     22   149  
  22     22   51  
  22     22   627  
  22     22   123  
  22     22   43  
  22     22   642  
  22     22   132  
  22     22   45  
  22     22   609  
  22     22   124  
  22     22   48  
  22     22   609  
  22     22   128  
  22     22   45  
  22     22   619  
  22     22   128  
  22     22   48  
  22     22   663  
  22     22   130  
  22     22   59  
  22     22   1266  
  22     22   123  
  22     22   54  
  22     22   677  
  22     22   135  
  22     22   55  
  22     22   582  
  22     22   125  
  22     22   42  
  22     22   667  
  22     22   142  
  22     22   52  
  22     22   633  
  22     22   148  
  22     22   47  
  22     22   603  
  22     22   129  
  22     22   49  
  22     22   686  
  22     22   139  
  22     22   44  
  22     22   713  
  22     22   128  
  22     22   43  
  22     22   612  
  22     22   129  
  22     22   48  
  22     22   615  
  22     22   120  
  22     22   46  
  22     22   592  
  22     22   129  
  22     22   46  
  22     22   623  
  22     22   132  
  22     22   50  
  22     22   764  
  22     22   157  
  22     22   44  
  22     22   654  
  22     22   135  
  22     22   46  
  22     22   630  
  22     22   133  
  22     22   49  
  22     22   642  
  22     22   136  
  22     22   48  
  22     22   655  
  22     22   135  
  22     22   61  
  22     22   722  
  22     22   125  
  22     22   47  
  22     22   626  
  22     22   134  
  22     22   72  
  22     22   750  
  22     22   149  
  22     22   48  
  22     22   668  
  22     22   150  
  22     22   48  
  22     22   724  
  22     22   122  
  22     22   50  
  22     22   614  
  22     22   126  
  22     22   50  
  22     22   630  
  22     22   129  
  22     22   53  
  22     22   700  
  22     22   133  
  22     22   63  
  22     22   667  
  22     22   147  
  22     22   47  
  22     22   653  
  22     22   123  
  22     22   46  
  22     22   647  
  22     22   153  
  22     22   46  
  22     22   619  
  22     22   142  
  22     22   47  
  22     22   666  
  22     22   125  
  22     22   48  
  22     22   620  
  22     22   127  
  22     22   48  
  22     22   646  
  22     22   130  
  22     22   44  
  22     22   653  
  22     22   138  
  22     22   49  
  22     22   609  
  22     22   126  
  22     22   51  
  22     22   646  
  22     22   153  
  22         58  
  22         622  
  22         134  
  22         55  
  22         656  
  22         137  
  22         58  
  22         647  
  22         132  
  22         46  
  22         632  
  22         143  
  22         54  
  22         651  
  22         134  
  22         49  
  22         634  
  22         130  
  22         46  
  22         636  
  22         135  
  22         52  
  22         609  
  22         126  
  22         51  
  22         618  
  22         128  
  22         47  
  22         612  
  22         146  
  22         66  
  22         645  
  22         125  
  22         47  
  22         610  
  22         130  
  22         48  
  22         775  
  22         123  
  22         54  
  22         682  
  22         118  
  22         46  
  22         720  
  22         112  
  22         51  
  22         620  
  22         152  
  22         44  
  22         651  
  22         118  
  22         42  
  22         556  
  22         112  
  22         57  
  22         572  
  22         111  
  22         44  
  22         607  
  22         114  
  22         52  
  22         555  
  22         122  
  22         46  
  22         572  
  22         126  
  22         44  
  22         607  
  22         124  
  22         43  
  22         604  
  22         132  
  22         47  
  22         573  
  22         119  
  22         42  
  22         627  
  22         136  
  22         40  
  22         577  
  22         124  
  22         44  
  22         589  
  22         129  
  22         54  
  22         687  
  22         171  
  22         57  
  22         624  
  22         143  
  22         51  
  22         579  
  22         144  
  22         52  
  22         614  
  22         120  
  22         46  
  22         597  
  22         135  
  22         45  
  22         608  
  22         130  
  22         50  
  22         607  
  22         121  
  22         73  
  22         653  
  22         118  
  22         48  
  22         595  
  22         122  
  22         49  
  22         591  
  22         122  
  22         46  
  22         576  
  22         125  
  22         47  
  22         609  
  22         126  
  22         79  
  22         646  
  22         123  
  22         46  
  22         860  
  22         123  
  22         54  
  22         585  
  22         129  
  22         48  
  22         596  
  22         154  
  22         57  
  22         609  
  22         119  
  22         46  
  22         586  
  22         120  
  22         49  
  22         617  
  22         121  
  22         50  
  22         627  
  22         124  
  22         50  
  22         628  
  22         124  
  22         44  
  22         577  
  22         124  
  22         43  
  22         791  
  22         146  
  22         54  
  22         598  
  22         129  
  22         53  
  22         604  
  22         129  
  22         49  
  22         589  
  22         129  
  22         48  
  22         648  
  22         136  
  22         45  
  22         603  
  22         120  
  22         48  
  22         560  
  22         122  
  22         46  
  22         599  
  22         129  
  22         49  
  22         640  
  22         123  
  22         60  
  22         659  
  22         131  
  22         58  
  22         617  
  22         128  
  22         48  
  22         646  
  22         130  
  22         46  
  22         602  
  22         116  
  22         44  
  22         584  
  22         120  
  22         48  
  22         617  
  22         119  
  22         46  
  22         693  
  22         125  
  22         44  
  22         640  
  22         134  
  22         44  
  22         626  
  22         128  
  22         49  
  22         600  
  22         139  
  22         52  
  22         641  
  22         133  
  22         50  
  22         649  
  22         143  
  22         48  
  22         638  
  22         120  
  22         47  
  22         601  
  22         120  
  22         46  
  22         566  
  22         134  
  22         46  
  22         627  
  22         131  
  22         82  
  22         611  
  22         118  
  22         45  
  22         567  
  22         124  
  22         60  
  22         641  
  22         136  
  22         47  
  22         876  
  22         123  
  22         47  
  22         633  
  22         145  
  22         51  
  22         637  
  22         129  
  22         50  
  22         686  
  22         147  
  22         56  
  22         630  
  22         124  
  22         45  
  22         570  
  22         130  
  22         56  
  22         627  
  22         129  
  22         48  
  22         646  
  22         129  
  22         52  
  22         703  
  22         126  
  22         51  
  22         638  
  22         132  
  22         46  
  22         619  
  22         123  
  22         46  
  22         596  
  22         132  
  22         51  
  22         655  
  22         130  
  22         52  
  22         657  
  22         148  
  22         45  
  22         647  
  22         131  
  22         45  
  22         594  
  22         122  
  22         46  
  22         580  
  22         123  
  22         49  
  22         607  
  22         123  
  22         47  
  22         587  
  22         122  
  22         49  
  22         651  
222             }
223             }
224             # TODO ExtUtils::Constant fail to generate correct const-*.inc when both
225             # string and integer constants used. So, hardcode these constants
226             # here until this issue will be fixed.
227 22     22   124 use constant MATRIXSSL_VERSION_CODE => 'OPEN';
  22         50  
  22         1276  
228 22         6966 use constant MATRIXSSL_VERSION => sprintf '%d.%d.%d-%s',
229             MATRIXSSL_VERSION_MAJOR,
230             MATRIXSSL_VERSION_MINOR,
231             MATRIXSSL_VERSION_PATCH,
232 22     22   129 MATRIXSSL_VERSION_CODE;
  22         50  
233              
234             my %ALERT_LEVEL = map { 0+constant($_) => $_ } CONST_ALERT_LEVEL;
235             my %ALERT_DESCR = map { 0+constant($_) => $_ } CONST_ALERT_DESCR;
236             my %RETURN_CODE = map { 0+constant($_) => $_ } CONST_ERROR, CONST_RC;
237              
238              
239             #
240             # Usage: use Crypt::MatrixSSL3 qw( :all :DEFAULT :RC :Cipher SSL_MAX_PLAINTEXT_LEN ... )
241             #
242             my %TAGS = (
243             Version => [ CONST_VERSION ],
244             Cipher => [ CONST_CIPHER ],
245             SessOpts => [ CONST_SESSION_OPTION ],
246             Alert => [ CONST_ALERT_LEVEL, CONST_ALERT_DESCR ],
247             Error => [ CONST_ERROR ],
248             RC => [ CONST_RC ],
249             Limit => [ CONST_LIMIT ],
250             Validate => [ CONST_VALIDATE ],
251             Bool => [ CONST_BOOL ],
252             Capabilities => [ CONST_CAPABILITIES ],
253             Func => [qw(
254             set_cipher_suite_enabled_status
255             get_ssl_alert
256             get_ssl_error
257             )],
258             );
259             $TAGS{all} = [ map { @{$_} } values %TAGS ];
260             $TAGS{DEFAULT} = [ 'SSL_MAX_PLAINTEXT_LEN', @{$TAGS{RC}} ];
261             my %KNOWN = map { $_ => 1 } @{ $TAGS{all} };
262              
263             sub import {
264 22     22   224 my (undef, @p) = @_;
265 22 100       102 if (!@p) {
266 6         19 @p = (':DEFAULT');
267             }
268 22 50       57 @p = map { /\A:(\w+)\z/xms ? @{ $TAGS{$1} || [] } : $_ } @p;
  39 100       218  
  35         544  
269              
270 22         172 my $pkg = caller;
271 22     22   164 no strict 'refs';
  22         51  
  22         9040  
272              
273 22         570 for my $func (@p) {
274 1815 50       4294 next if !$KNOWN{$func};
275 1815         2650 *{"${pkg}::$func"} = \&{$func};
  1815         5110  
  1815         3786  
276             }
277              
278 22         31303 return;
279             }
280              
281              
282             sub get_ssl_alert {
283 91     91 1 3745794 my ($pt_buf) = @_;
284 91         451 my ($level_code, $descr_code) = map {ord} split //ms, $pt_buf;
  182         593  
285 91         691 my $level = dualvar $level_code, $ALERT_LEVEL{$level_code};
286 91         357 my $descr = dualvar $descr_code, $ALERT_DESCR{$descr_code};
287 91 50       579 return wantarray ? ($level, $descr) : $descr;
288             }
289              
290             sub get_ssl_error {
291 0     0 1 0 my ($rc) = @_;
292 0         0 my $error = dualvar $rc, $RETURN_CODE{$rc};
293 0         0 return $error;
294             }
295              
296              
297             ## no critic (ProhibitMultiplePackages)
298              
299             # shift/goto trick used to force correct source line in XS's croak()
300             package Crypt::MatrixSSL3::Keys;
301 100807     100807   2006772 sub new { shift; goto &Crypt::MatrixSSL3::KeysPtr::new }
  100807         244807  
302              
303             package Crypt::MatrixSSL3::SessID;
304 110023     110023   729521 sub new { shift; goto &Crypt::MatrixSSL3::SessIDPtr::new }
  110023         262941  
305              
306             package Crypt::MatrixSSL3::Client;
307 11156     11156   143399 sub new { shift; goto &Crypt::MatrixSSL3::SessPtr::new_client }
  11156         313954  
308              
309             package Crypt::MatrixSSL3::Server;
310 11158     11158   81943530 sub new { shift; goto &Crypt::MatrixSSL3::SessPtr::new_server }
  11158         72136  
311              
312             package Crypt::MatrixSSL3::HelloExt;
313 0     0     sub new { shift; goto &Crypt::MatrixSSL3::HelloExtPtr::new }
  0            
314              
315              
316             1;
317             __END__