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   1461934 use 5.006;
  22         245  
3 22     22   102 use strict;
  22         35  
  22         425  
4 22     22   88 use warnings;
  22         51  
  22         713  
5 22     22   133 use Carp;
  22         65  
  22         1402  
6              
7 22     22   128 use Scalar::Util qw( dualvar );
  22         36  
  22         920  
8 22     22   115 use XSLoader;
  22         43  
  22         771  
9              
10             BEGIN {
11 22     22   8680 use version 0.77 (); our $VERSION = 'v3.9.3';
  22     22   37717  
  22         972  
  22         68  
12 22         23157 XSLoader::load(__PACKAGE__,$VERSION);
13             }
14              
15 22     22   10460 use File::ShareDir;
  22         522356  
  22         1562  
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         1633 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   167 );
  22         49  
34 22         2121 use constant CONST_VERSION => (
35             CONST_VERSION_INT,
36             'MATRIXSSL_VERSION_CODE',
37             'MATRIXSSL_VERSION',
38 22     22   127 );
  22         34  
39 22         1372 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   137 );
  22         44  
97              
98 22         947 use constant CONST_SESSION_OPTION => qw(
99             SSL_OPTION_FULL_HANDSHAKE
100 22     22   124 );
  22         38  
101              
102 22         1748 use constant CONST_ALERT_LEVEL => qw(
103             SSL_ALERT_LEVEL_WARNING
104             SSL_ALERT_LEVEL_FATAL
105 22     22   108 );
  22         45  
106              
107 22         1962 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   140 );
  22         37  
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         1538 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   134 );
  22         34  
167              
168 22         1400 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   133 );
  22         35  
179              
180 22         1170 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   160 );
  22         51  
186              
187 22         1244 use constant CONST_VALIDATE => qw(
188             SSL_ALLOW_ANON_CONNECTION
189 22     22   131 );
  22         51  
190              
191 22         1288 use constant CONST_BOOL => qw(
192             PS_TRUE
193             PS_FALSE
194 22     22   124 );
  22         35  
195              
196 22         2512 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   131 );
  22         34  
205              
206             BEGIN {
207 22     22   132 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   179344 eval 'use constant '.$_.' => '.(0+constant($_)).'; 1' or croak $@;
  22     22   132  
  22     22   423  
  22     22   793  
  22     22   167  
  22     22   64  
  22     22   675  
  22     22   124  
  22     22   36  
  22     22   629  
  22     22   116  
  22     22   41  
  22     22   627  
  22     22   122  
  22     22   38  
  22     22   590  
  22     22   130  
  22     22   66  
  22     22   592  
  22     22   127  
  22     22   36  
  22     22   619  
  22     22   116  
  22     22   62  
  22     22   691  
  22     22   123  
  22     22   37  
  22     22   695  
  22     22   113  
  22     22   49  
  22     22   564  
  22     22   121  
  22     22   39  
  22     22   578  
  22     22   114  
  22     22   37  
  22     22   593  
  22     22   118  
  22     22   36  
  22     22   584  
  22     22   118  
  22     22   37  
  22     22   651  
  22     22   119  
  22     22   36  
  22     22   635  
  22     22   119  
  22     22   42  
  22     22   574  
  22     22   134  
  22     22   50  
  22     22   672  
  22     22   128  
  22     22   37  
  22     22   646  
  22     22   145  
  22     22   35  
  22     22   601  
  22     22   135  
  22     22   64  
  22     22   619  
  22     22   116  
  22     22   39  
  22     22   592  
  22     22   117  
  22     22   41  
  22     22   587  
  22     22   118  
  22     22   43  
  22     22   602  
  22     22   117  
  22     22   37  
  22     22   627  
  22     22   133  
  22     22   102  
  22     22   598  
  22     22   120  
  22     22   38  
  22     22   789  
  22     22   120  
  22     22   45  
  22     22   585  
  22     22   128  
  22     22   41  
  22     22   655  
  22     22   124  
  22     22   43  
  22     22   575  
  22     22   114  
  22     22   41  
  22     22   595  
  22     22   132  
  22     22   35  
  22     22   622  
  22     22   127  
  22     22   42  
  22     22   600  
  22     22   147  
  22     22   678  
  22     22   758  
  22     22   121  
  22     22   36  
  22     22   677  
  22     22   120  
  22     22   38  
  22     22   657  
  22     22   110  
  22     22   36  
  22     22   581  
  22     22   126  
  22     22   37  
  22     22   935  
  22     22   115  
  22     22   38  
  22     22   571  
  22     22   121  
  22     22   49  
  22     22   633  
  22     22   133  
  22     22   37  
  22     22   692  
  22     22   133  
  22     22   38  
  22     22   606  
  22     22   117  
  22     22   35  
  22     22   563  
  22     22   115  
  22     22   47  
  22     22   634  
  22     22   120  
  22     22   39  
  22     22   566  
  22     22   136  
  22     22   36  
  22     22   689  
  22     22   117  
  22     22   51  
  22     22   645  
  22     22   124  
  22     22   35  
  22     22   625  
  22     22   120  
  22     22   49  
  22     22   699  
  22     22   144  
  22         47  
  22         569  
  22         115  
  22         36  
  22         590  
  22         171  
  22         51  
  22         588  
  22         126  
  22         47  
  22         612  
  22         149  
  22         55  
  22         649  
  22         121  
  22         44  
  22         611  
  22         119  
  22         33  
  22         710  
  22         129  
  22         40  
  22         629  
  22         118  
  22         51  
  22         575  
  22         118  
  22         49  
  22         697  
  22         119  
  22         42  
  22         674  
  22         119  
  22         37  
  22         832  
  22         111  
  22         35  
  22         656  
  22         112  
  22         42  
  22         581  
  22         120  
  22         37  
  22         621  
  22         139  
  22         59  
  22         654  
  22         123  
  22         46  
  22         623  
  22         117  
  22         47  
  22         633  
  22         116  
  22         35  
  22         589  
  22         121  
  22         40  
  22         611  
  22         117  
  22         42  
  22         568  
  22         115  
  22         39  
  22         583  
  22         120  
  22         38  
  22         617  
  22         131  
  22         46  
  22         615  
  22         119  
  22         42  
  22         548  
  22         115  
  22         35  
  22         564  
  22         117  
  22         38  
  22         610  
  22         120  
  22         36  
  22         575  
  22         129  
  22         43  
  22         611  
  22         132  
  22         75  
  22         609  
  22         126  
  22         53  
  22         657  
  22         119  
  22         43  
  22         601  
  22         122  
  22         41  
  22         580  
  22         133  
  22         40  
  22         586  
  22         112  
  22         47  
  22         695  
  22         112  
  22         49  
  22         656  
  22         126  
  22         37  
  22         571  
  22         118  
  22         38  
  22         584  
  22         126  
  22         36  
  22         622  
  22         120  
  22         41  
  22         603  
  22         110  
  22         39  
  22         633  
  22         118  
  22         44  
  22         1169  
  22         117  
  22         39  
  22         561  
  22         121  
  22         33  
  22         655  
  22         129  
  22         42  
  22         585  
  22         115  
  22         44  
  22         600  
  22         133  
  22         43  
  22         627  
  22         122  
  22         35  
  22         592  
  22         132  
  22         1229  
  22         755  
  22         110  
  22         39  
  22         541  
  22         111  
  22         33  
  22         535  
  22         117  
  22         46  
  22         579  
  22         116  
  22         40  
  22         558  
  22         120  
  22         65  
  22         610  
  22         137  
  22         71  
  22         624  
  22         116  
  22         36  
  22         599  
  22         110  
  22         39  
  22         608  
  22         116  
  22         42  
  22         568  
  22         113  
  22         38  
  22         615  
  22         121  
  22         39  
  22         697  
  22         123  
  22         40  
  22         673  
  22         240  
  22         55  
  22         625  
  22         125  
  22         37  
  22         583  
  22         115  
  22         36  
  22         584  
  22         122  
  22         40  
  22         586  
  22         129  
  22         42  
  22         650  
  22         117  
  22         45  
  22         601  
  22         120  
  22         37  
  22         568  
  22         150  
  22         39  
  22         582  
  22         136  
  22         43  
  22         599  
  22         139  
  22         40  
  22         607  
  22         113  
  22         37  
  22         562  
  22         123  
  22         39  
  22         614  
  22         117  
  22         45  
  22         603  
  22         117  
  22         41  
  22         650  
  22         113  
  22         38  
  22         571  
  22         113  
  22         37  
  22         636  
  22         130  
  22         60  
  22         577  
  22         131  
  22         59  
  22         655  
  22         129  
  22         76  
  22         644  
  22         125  
  22         39  
  22         567  
  22         119  
  22         37  
  22         563  
  22         120  
  22         38  
  22         597  
  22         118  
  22         38  
  22         567  
  22         117  
  22         65  
  22         752  
  22         126  
  22         49  
  22         632  
  22         120  
  22         37  
  22         580  
  22         120  
  22         39  
  22         674  
  22         120  
  22         40  
  22         569  
  22         121  
  22         31  
  22         572  
  22         164  
  22         41  
  22         591  
  22         132  
  22         37  
  22         593  
  22         137  
  22         57  
  22         630  
  22         129  
  22         38  
  22         577  
  22         114  
  22         50  
  22         592  
  22         131  
  22         37  
  22         576  
  22         129  
  22         47  
  22         593  
  22         135  
  22         44  
  22         619  
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   112 use constant MATRIXSSL_VERSION_CODE => 'OPEN';
  22         33  
  22         1346  
228 22         7455 use constant MATRIXSSL_VERSION => sprintf '%d.%d.%d-%s',
229             MATRIXSSL_VERSION_MAJOR,
230             MATRIXSSL_VERSION_MINOR,
231             MATRIXSSL_VERSION_PATCH,
232 22     22   118 MATRIXSSL_VERSION_CODE;
  22         35  
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   199 my (undef, @p) = @_;
265 22 100       127 if (!@p) {
266 6         26 @p = (':DEFAULT');
267             }
268 22 50       56 @p = map { /\A:(\w+)\z/xms ? @{ $TAGS{$1} || [] } : $_ } @p;
  39 100       198  
  35         320  
269              
270 22         98 my $pkg = caller;
271 22     22   157 no strict 'refs';
  22         52  
  22         9832  
272              
273 22         432 for my $func (@p) {
274 1815 50       2841 next if !$KNOWN{$func};
275 1815         1887 *{"${pkg}::$func"} = \&{$func};
  1815         4066  
  1815         2782  
276             }
277              
278 22         34324 return;
279             }
280              
281              
282             sub get_ssl_alert {
283 91     91 1 3596173 my ($pt_buf) = @_;
284 91         600 my ($level_code, $descr_code) = map {ord} split //ms, $pt_buf;
  182         605  
285 91         866 my $level = dualvar $level_code, $ALERT_LEVEL{$level_code};
286 91         372 my $descr = dualvar $descr_code, $ALERT_DESCR{$descr_code};
287 91 50       560 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   1837630 sub new { shift; goto &Crypt::MatrixSSL3::KeysPtr::new }
  100807         183247  
302              
303             package Crypt::MatrixSSL3::SessID;
304 110023     110023   568995 sub new { shift; goto &Crypt::MatrixSSL3::SessIDPtr::new }
  110023         191929  
305              
306             package Crypt::MatrixSSL3::Client;
307 11156     11156   135372 sub new { shift; goto &Crypt::MatrixSSL3::SessPtr::new_client }
  11156         354170  
308              
309             package Crypt::MatrixSSL3::Server;
310 11158     11158   77393864 sub new { shift; goto &Crypt::MatrixSSL3::SessPtr::new_server }
  11158         58758  
311              
312             package Crypt::MatrixSSL3::HelloExt;
313 0     0     sub new { shift; goto &Crypt::MatrixSSL3::HelloExtPtr::new }
  0            
314              
315              
316             1;
317             __END__