]> sjero.net Git - wget/blob - src/openssl.c
Fix timeout option when used with SSL
[wget] / src / openssl.c
1 /* SSL support via OpenSSL library.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3    2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4    Originally contributed by Christian Fraenkel.
5
6 This file is part of GNU Wget.
7
8 GNU Wget is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 GNU Wget is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Wget.  If not, see <http://www.gnu.org/licenses/>.
20
21 Additional permission under GNU GPL version 3 section 7
22
23 If you modify this program, or any covered work, by linking or
24 combining it with the OpenSSL project's OpenSSL library (or a
25 modified version of that library), containing parts covered by the
26 terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
27 grants you additional permission to convey the resulting work.
28 Corresponding Source for a non-source form of such a combination
29 shall include the source code for the parts of OpenSSL used as well
30 as that of the covered work.  */
31
32 #include "wget.h"
33
34 #include <assert.h>
35 #include <errno.h>
36 #include <unistd.h>
37 #include <string.h>
38
39 #include <openssl/ssl.h>
40 #include <openssl/x509v3.h>
41 #include <openssl/err.h>
42 #include <openssl/rand.h>
43
44 #include "utils.h"
45 #include "connect.h"
46 #include "url.h"
47 #include "ssl.h"
48
49 #ifdef WINDOWS
50 # include <w32sock.h>
51 #endif
52
53 /* Application-wide SSL context.  This is common to all SSL
54    connections.  */
55 static SSL_CTX *ssl_ctx;
56
57 /* Initialize the SSL's PRNG using various methods. */
58
59 static void
60 init_prng (void)
61 {
62   char namebuf[256];
63   const char *random_file;
64
65   if (RAND_status ())
66     /* The PRNG has been seeded; no further action is necessary. */
67     return;
68
69   /* Seed from a file specified by the user.  This will be the file
70      specified with --random-file, $RANDFILE, if set, or ~/.rnd, if it
71      exists.  */
72   if (opt.random_file)
73     random_file = opt.random_file;
74   else
75     {
76       /* Get the random file name using RAND_file_name. */
77       namebuf[0] = '\0';
78       random_file = RAND_file_name (namebuf, sizeof (namebuf));
79     }
80
81   if (random_file && *random_file)
82     /* Seed at most 16k (apparently arbitrary value borrowed from
83        curl) from random file. */
84     RAND_load_file (random_file, 16384);
85
86   if (RAND_status ())
87     return;
88
89   /* Get random data from EGD if opt.egd_file was used.  */
90   if (opt.egd_file && *opt.egd_file)
91     RAND_egd (opt.egd_file);
92
93   if (RAND_status ())
94     return;
95
96 #ifdef WINDOWS
97   /* Under Windows, we can try to seed the PRNG using screen content.
98      This may or may not work, depending on whether we'll calling Wget
99      interactively.  */
100
101   RAND_screen ();
102   if (RAND_status ())
103     return;
104 #endif
105
106 #if 0 /* don't do this by default */
107   {
108     int maxrand = 500;
109
110     /* Still not random enough, presumably because neither /dev/random
111        nor EGD were available.  Try to seed OpenSSL's PRNG with libc
112        PRNG.  This is cryptographically weak and defeats the purpose
113        of using OpenSSL, which is why it is highly discouraged.  */
114
115     logprintf (LOG_NOTQUIET, _("WARNING: using a weak random seed.\n"));
116
117     while (RAND_status () == 0 && maxrand-- > 0)
118       {
119         unsigned char rnd = random_number (256);
120         RAND_seed (&rnd, sizeof (rnd));
121       }
122   }
123 #endif
124 }
125
126 /* Print errors in the OpenSSL error stack. */
127
128 static void
129 print_errors (void)
130 {
131   unsigned long err;
132   while ((err = ERR_get_error ()) != 0)
133     logprintf (LOG_NOTQUIET, "OpenSSL: %s\n", ERR_error_string (err, NULL));
134 }
135
136 /* Convert keyfile type as used by options.h to a type as accepted by
137    SSL_CTX_use_certificate_file and SSL_CTX_use_PrivateKey_file.
138
139    (options.h intentionally doesn't use values from openssl/ssl.h so
140    it doesn't depend specifically on OpenSSL for SSL functionality.)  */
141
142 static int
143 key_type_to_ssl_type (enum keyfile_type type)
144 {
145   switch (type)
146     {
147     case keyfile_pem:
148       return SSL_FILETYPE_PEM;
149     case keyfile_asn1:
150       return SSL_FILETYPE_ASN1;
151     default:
152       abort ();
153     }
154 }
155
156 /* Create an SSL Context and set default paths etc.  Called the first
157    time an HTTP download is attempted.
158
159    Returns true on success, false otherwise.  */
160
161 bool
162 ssl_init (void)
163 {
164   SSL_METHOD const *meth;
165
166   if (ssl_ctx)
167     /* The SSL has already been initialized. */
168     return true;
169
170   /* Init the PRNG.  If that fails, bail out.  */
171   init_prng ();
172   if (RAND_status () != 1)
173     {
174       logprintf (LOG_NOTQUIET,
175                  _("Could not seed PRNG; consider using --random-file.\n"));
176       goto error;
177     }
178
179   SSL_library_init ();
180   SSL_load_error_strings ();
181   SSLeay_add_all_algorithms ();
182   SSLeay_add_ssl_algorithms ();
183
184   switch (opt.secure_protocol)
185     {
186     case secure_protocol_auto:
187       meth = SSLv23_client_method ();
188       break;
189 #ifndef OPENSSL_NO_SSL2
190     case secure_protocol_sslv2:
191       meth = SSLv2_client_method ();
192       break;
193 #endif
194     case secure_protocol_sslv3:
195       meth = SSLv3_client_method ();
196       break;
197     case secure_protocol_tlsv1:
198       meth = TLSv1_client_method ();
199       break;
200     default:
201       abort ();
202     }
203
204   /* The type cast below accommodates older OpenSSL versions (0.9.8)
205      where SSL_CTX_new() is declared without a "const" argument. */
206   ssl_ctx = SSL_CTX_new ((SSL_METHOD *)meth);
207   if (!ssl_ctx)
208     goto error;
209
210   SSL_CTX_set_default_verify_paths (ssl_ctx);
211   SSL_CTX_load_verify_locations (ssl_ctx, opt.ca_cert, opt.ca_directory);
212
213   /* SSL_VERIFY_NONE instructs OpenSSL not to abort SSL_connect if the
214      certificate is invalid.  We verify the certificate separately in
215      ssl_check_certificate, which provides much better diagnostics
216      than examining the error stack after a failed SSL_connect.  */
217   SSL_CTX_set_verify (ssl_ctx, SSL_VERIFY_NONE, NULL);
218
219   /* Use the private key from the cert file unless otherwise specified. */
220   if (opt.cert_file && !opt.private_key)
221     {
222       opt.private_key = opt.cert_file;
223       opt.private_key_type = opt.cert_type;
224     }
225
226   if (opt.cert_file)
227     if (SSL_CTX_use_certificate_file (ssl_ctx, opt.cert_file,
228                                       key_type_to_ssl_type (opt.cert_type))
229         != 1)
230       goto error;
231   if (opt.private_key)
232     if (SSL_CTX_use_PrivateKey_file (ssl_ctx, opt.private_key,
233                                      key_type_to_ssl_type (opt.private_key_type))
234         != 1)
235       goto error;
236
237   /* Since fd_write unconditionally assumes partial writes (and
238      handles them correctly), allow them in OpenSSL.  */
239   SSL_CTX_set_mode (ssl_ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
240
241   /* The OpenSSL library can handle renegotiations automatically, so
242      tell it to do so.  */
243   SSL_CTX_set_mode (ssl_ctx, SSL_MODE_AUTO_RETRY);
244
245   return true;
246
247  error:
248   if (ssl_ctx)
249     SSL_CTX_free (ssl_ctx);
250   print_errors ();
251   return false;
252 }
253
254 struct openssl_transport_context
255 {
256   SSL *conn;                    /* SSL connection handle */
257   char *last_error;             /* last error printed with openssl_errstr */
258 };
259
260 struct openssl_read_args
261 {
262   int fd;
263   struct openssl_transport_context *ctx;
264   char *buf;
265   int bufsize;
266   int retval;
267 };
268
269 static void openssl_read_callback(void *arg)
270 {
271   struct openssl_read_args *args = (struct openssl_read_args *) arg;
272   struct openssl_transport_context *ctx = args->ctx;
273   SSL *conn = ctx->conn;
274   char *buf = args->buf;
275   int bufsize = args->bufsize;
276   int ret;
277
278   do
279     ret = SSL_read (conn, buf, bufsize);
280   while (ret == -1 && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
281          && errno == EINTR);
282   args->retval = ret;
283 }
284
285 static int
286 openssl_read (int fd, char *buf, int bufsize, void *arg)
287 {
288   struct openssl_read_args args;
289   args.fd = fd;
290   args.buf = buf;
291   args.bufsize = bufsize;
292   args.ctx = (struct openssl_transport_context*) arg;
293
294   if (run_with_timeout(opt.read_timeout, openssl_read_callback, &args)) {
295     return -1;
296   }
297   return args.retval;
298 }
299
300 static int
301 openssl_write (int fd, char *buf, int bufsize, void *arg)
302 {
303   int ret = 0;
304   struct openssl_transport_context *ctx = arg;
305   SSL *conn = ctx->conn;
306   do
307     ret = SSL_write (conn, buf, bufsize);
308   while (ret == -1
309          && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
310          && errno == EINTR);
311   return ret;
312 }
313
314 static int
315 openssl_poll (int fd, double timeout, int wait_for, void *arg)
316 {
317   struct openssl_transport_context *ctx = arg;
318   SSL *conn = ctx->conn;
319   if (SSL_pending (conn))
320     return 1;
321   if (timeout == 0)
322     return 1;
323   return select_fd (fd, timeout, wait_for);
324 }
325
326 static int
327 openssl_peek (int fd, char *buf, int bufsize, void *arg)
328 {
329   int ret;
330   struct openssl_transport_context *ctx = arg;
331   SSL *conn = ctx->conn;
332   if (! openssl_poll (fd, 0.0, WAIT_FOR_READ, arg))
333     return 0;
334   do
335     ret = SSL_peek (conn, buf, bufsize);
336   while (ret == -1
337          && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
338          && errno == EINTR);
339   return ret;
340 }
341
342 static const char *
343 openssl_errstr (int fd, void *arg)
344 {
345   struct openssl_transport_context *ctx = arg;
346   unsigned long errcode;
347   char *errmsg = NULL;
348   int msglen = 0;
349
350   /* If there are no SSL-specific errors, just return NULL. */
351   if ((errcode = ERR_get_error ()) == 0)
352     return NULL;
353
354   /* Get rid of previous contents of ctx->last_error, if any.  */
355   xfree_null (ctx->last_error);
356
357   /* Iterate over OpenSSL's error stack and accumulate errors in the
358      last_error buffer, separated by "; ".  This is better than using
359      a static buffer, which *always* takes up space (and has to be
360      large, to fit more than one error message), whereas these
361      allocations are only performed when there is an actual error.  */
362
363   for (;;)
364     {
365       const char *str = ERR_error_string (errcode, NULL);
366       int len = strlen (str);
367
368       /* Allocate space for the existing message, plus two more chars
369          for the "; " separator and one for the terminating \0.  */
370       errmsg = xrealloc (errmsg, msglen + len + 2 + 1);
371       memcpy (errmsg + msglen, str, len);
372       msglen += len;
373
374       /* Get next error and bail out if there are no more. */
375       errcode = ERR_get_error ();
376       if (errcode == 0)
377         break;
378
379       errmsg[msglen++] = ';';
380       errmsg[msglen++] = ' ';
381     }
382   errmsg[msglen] = '\0';
383
384   /* Store the error in ctx->last_error where openssl_close will
385      eventually find it and free it.  */
386   ctx->last_error = errmsg;
387
388   return errmsg;
389 }
390
391 static void
392 openssl_close (int fd, void *arg)
393 {
394   struct openssl_transport_context *ctx = arg;
395   SSL *conn = ctx->conn;
396
397   SSL_shutdown (conn);
398   SSL_free (conn);
399   xfree_null (ctx->last_error);
400   xfree (ctx);
401
402   close (fd);
403
404   DEBUGP (("Closed %d/SSL 0x%0*lx\n", fd, PTR_FORMAT (conn)));
405 }
406
407 /* openssl_transport is the singleton that describes the SSL transport
408    methods provided by this file.  */
409
410 static struct transport_implementation openssl_transport = {
411   openssl_read, openssl_write, openssl_poll,
412   openssl_peek, openssl_errstr, openssl_close
413 };
414
415 struct scwt_context
416 {
417   SSL *ssl;
418   int result;
419 };
420
421 static void
422 ssl_connect_with_timeout_callback(void *arg)
423 {
424   struct scwt_context *ctx = (struct scwt_context *)arg;
425   ctx->result = SSL_connect(ctx->ssl);
426 }
427
428 /* Perform the SSL handshake on file descriptor FD, which is assumed
429    to be connected to an SSL server.  The SSL handle provided by
430    OpenSSL is registered with the file descriptor FD using
431    fd_register_transport, so that subsequent calls to fd_read,
432    fd_write, etc., will use the corresponding SSL functions.
433
434    Returns true on success, false on failure.  */
435
436 bool
437 ssl_connect_wget (int fd, const char *hostname)
438 {
439   SSL *conn;
440   struct scwt_context scwt_ctx;
441   struct openssl_transport_context *ctx;
442
443   DEBUGP (("Initiating SSL handshake.\n"));
444
445   assert (ssl_ctx != NULL);
446   conn = SSL_new (ssl_ctx);
447   if (!conn)
448     goto error;
449 #if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
450   /* If the SSL library was build with support for ServerNameIndication
451      then use it whenever we have a hostname.  If not, don't, ever. */
452   if (! is_valid_ip_address (hostname))
453     {
454       if (! SSL_set_tlsext_host_name (conn, hostname))
455         {
456         DEBUGP (("Failed to set TLS server-name indication."));
457         goto error;
458         }
459     }
460 #endif
461
462 #ifndef FD_TO_SOCKET
463 # define FD_TO_SOCKET(X) (X)
464 #endif
465   if (!SSL_set_fd (conn, FD_TO_SOCKET (fd)))
466     goto error;
467   SSL_set_connect_state (conn);
468
469   scwt_ctx.ssl = conn;
470   if (run_with_timeout(opt.read_timeout, ssl_connect_with_timeout_callback,
471                        &scwt_ctx)) {
472     DEBUGP (("SSL handshake timed out.\n"));
473     goto timeout;
474   }
475   if (scwt_ctx.result <= 0 || conn->state != SSL_ST_OK)
476     goto error;
477
478   ctx = xnew0 (struct openssl_transport_context);
479   ctx->conn = conn;
480
481   /* Register FD with Wget's transport layer, i.e. arrange that our
482      functions are used for reading, writing, and polling.  */
483   fd_register_transport (fd, &openssl_transport, ctx);
484   DEBUGP (("Handshake successful; connected socket %d to SSL handle 0x%0*lx\n",
485            fd, PTR_FORMAT (conn)));
486   return true;
487
488  error:
489   DEBUGP (("SSL handshake failed.\n"));
490   print_errors ();
491  timeout:
492   if (conn)
493     SSL_free (conn);
494   return false;
495 }
496
497 #define ASTERISK_EXCLUDES_DOT   /* mandated by rfc2818 */
498
499 /* Return true is STRING (case-insensitively) matches PATTERN, false
500    otherwise.  The recognized wildcard character is "*", which matches
501    any character in STRING except ".".  Any number of the "*" wildcard
502    may be present in the pattern.
503
504    This is used to match of hosts as indicated in rfc2818: "Names may
505    contain the wildcard character * which is considered to match any
506    single domain name component or component fragment. E.g., *.a.com
507    matches foo.a.com but not bar.foo.a.com. f*.com matches foo.com but
508    not bar.com [or foo.bar.com]."
509
510    If the pattern contain no wildcards, pattern_match(a, b) is
511    equivalent to !strcasecmp(a, b).  */
512
513 static bool
514 pattern_match (const char *pattern, const char *string)
515 {
516   const char *p = pattern, *n = string;
517   char c;
518   for (; (c = c_tolower (*p++)) != '\0'; n++)
519     if (c == '*')
520       {
521         for (c = c_tolower (*p); c == '*'; c = c_tolower (*++p))
522           ;
523         for (; *n != '\0'; n++)
524           if (c_tolower (*n) == c && pattern_match (p, n))
525             return true;
526 #ifdef ASTERISK_EXCLUDES_DOT
527           else if (*n == '.')
528             return false;
529 #endif
530         return c == '\0';
531       }
532     else
533       {
534         if (c != c_tolower (*n))
535           return false;
536       }
537   return *n == '\0';
538 }
539
540 /* Verify the validity of the certificate presented by the server.
541    Also check that the "common name" of the server, as presented by
542    its certificate, corresponds to HOST.  (HOST typically comes from
543    the URL and is what the user thinks he's connecting to.)
544
545    This assumes that ssl_connect_wget has successfully finished, i.e. that
546    the SSL handshake has been performed and that FD is connected to an
547    SSL handle.
548
549    If opt.check_cert is true (the default), this returns 1 if the
550    certificate is valid, 0 otherwise.  If opt.check_cert is 0, the
551    function always returns 1, but should still be called because it
552    warns the user about any problems with the certificate.  */
553
554 bool
555 ssl_check_certificate (int fd, const char *host)
556 {
557   X509 *cert;
558   GENERAL_NAMES *subjectAltNames;
559   char common_name[256];
560   long vresult;
561   bool success = true;
562   bool alt_name_checked = false;
563
564   /* If the user has specified --no-check-cert, we still want to warn
565      him about problems with the server's certificate.  */
566   const char *severity = opt.check_cert ? _("ERROR") : _("WARNING");
567
568   struct openssl_transport_context *ctx = fd_transport_context (fd);
569   SSL *conn = ctx->conn;
570   assert (conn != NULL);
571
572   cert = SSL_get_peer_certificate (conn);
573   if (!cert)
574     {
575       logprintf (LOG_NOTQUIET, _("%s: No certificate presented by %s.\n"),
576                  severity, quotearg_style (escape_quoting_style, host));
577       success = false;
578       goto no_cert;             /* must bail out since CERT is NULL */
579     }
580
581   IF_DEBUG
582     {
583       char *subject = X509_NAME_oneline (X509_get_subject_name (cert), 0, 0);
584       char *issuer = X509_NAME_oneline (X509_get_issuer_name (cert), 0, 0);
585       DEBUGP (("certificate:\n  subject: %s\n  issuer:  %s\n",
586                quotearg_n_style (0, escape_quoting_style, subject),
587                quotearg_n_style (1, escape_quoting_style, issuer)));
588       OPENSSL_free (subject);
589       OPENSSL_free (issuer);
590     }
591
592   vresult = SSL_get_verify_result (conn);
593   if (vresult != X509_V_OK)
594     {
595       char *issuer = X509_NAME_oneline (X509_get_issuer_name (cert), 0, 0);
596       logprintf (LOG_NOTQUIET,
597                  _("%s: cannot verify %s's certificate, issued by %s:\n"),
598                  severity, quotearg_n_style (0, escape_quoting_style, host),
599                  quote_n (1, issuer));
600       /* Try to print more user-friendly (and translated) messages for
601          the frequent verification errors.  */
602       switch (vresult)
603         {
604         case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
605           logprintf (LOG_NOTQUIET,
606                      _("  Unable to locally verify the issuer's authority.\n"));
607           break;
608         case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
609         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
610           logprintf (LOG_NOTQUIET,
611                      _("  Self-signed certificate encountered.\n"));
612           break;
613         case X509_V_ERR_CERT_NOT_YET_VALID:
614           logprintf (LOG_NOTQUIET, _("  Issued certificate not yet valid.\n"));
615           break;
616         case X509_V_ERR_CERT_HAS_EXPIRED:
617           logprintf (LOG_NOTQUIET, _("  Issued certificate has expired.\n"));
618           break;
619         default:
620           /* For the less frequent error strings, simply provide the
621              OpenSSL error message.  */
622           logprintf (LOG_NOTQUIET, "  %s\n",
623                      X509_verify_cert_error_string (vresult));
624         }
625       success = false;
626       /* Fall through, so that the user is warned about *all* issues
627          with the cert (important with --no-check-certificate.)  */
628     }
629
630   /* Check that HOST matches the common name in the certificate.
631      #### The following remains to be done:
632
633      - When matching against common names, it should loop over all
634        common names and choose the most specific one, i.e. the last
635        one, not the first one, which the current code picks.
636
637      - Ensure that ASN1 strings from the certificate are encoded as
638        UTF-8 which can be meaningfully compared to HOST.  */
639
640   subjectAltNames = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL);
641
642   if (subjectAltNames)
643     {
644       /* Test subject alternative names */
645
646       /* Do we want to check for dNSNAmes or ipAddresses (see RFC 2818)?
647        * Signal it by host_in_octet_string. */
648       ASN1_OCTET_STRING *host_in_octet_string = a2i_IPADDRESS (host);
649
650       int numaltnames = sk_GENERAL_NAME_num (subjectAltNames);
651       int i;
652       for (i=0; i < numaltnames; i++)
653         {
654           const GENERAL_NAME *name =
655             sk_GENERAL_NAME_value (subjectAltNames, i);
656           if (name)
657             {
658               if (host_in_octet_string)
659                 {
660                   if (name->type == GEN_IPADD)
661                     {
662                       /* Check for ipAddress */
663                       /* TODO: Should we convert between IPv4-mapped IPv6
664                        * addresses and IPv4 addresses? */
665                       alt_name_checked = true;
666                       if (!ASN1_STRING_cmp (host_in_octet_string,
667                             name->d.iPAddress))
668                         break;
669                     }
670                 }
671               else if (name->type == GEN_DNS)
672                 {
673                   /* dNSName should be IA5String (i.e. ASCII), however who
674                    * does trust CA? Convert it into UTF-8 for sure. */
675                   unsigned char *name_in_utf8 = NULL;
676
677                   /* Check for dNSName */
678                   alt_name_checked = true;
679
680                   if (0 <= ASN1_STRING_to_UTF8 (&name_in_utf8, name->d.dNSName))
681                     {
682                       /* Compare and check for NULL attack in ASN1_STRING */
683                       if (pattern_match ((char *)name_in_utf8, host) &&
684                             (strlen ((char *)name_in_utf8) ==
685                                 ASN1_STRING_length (name->d.dNSName)))
686                         {
687                           OPENSSL_free (name_in_utf8);
688                           break;
689                         }
690                       OPENSSL_free (name_in_utf8);
691                     }
692                 }
693             }
694         }
695       sk_GENERAL_NAME_free (subjectAltNames);
696       if (host_in_octet_string)
697         ASN1_OCTET_STRING_free(host_in_octet_string);
698
699       if (alt_name_checked == true && i >= numaltnames)
700         {
701           logprintf (LOG_NOTQUIET,
702               _("%s: no certificate subject alternative name matches\n"
703                 "\trequested host name %s.\n"),
704                      severity, quote_n (1, host));
705           success = false;
706         }
707     }
708   
709   if (alt_name_checked == false)
710     {
711       /* Test commomName */
712       X509_NAME *xname = X509_get_subject_name(cert);
713       common_name[0] = '\0';
714       X509_NAME_get_text_by_NID (xname, NID_commonName, common_name,
715                                  sizeof (common_name));
716
717       if (!pattern_match (common_name, host))
718         {
719           logprintf (LOG_NOTQUIET, _("\
720     %s: certificate common name %s doesn't match requested host name %s.\n"),
721                      severity, quote_n (0, common_name), quote_n (1, host));
722           success = false;
723         }
724       else
725         {
726           /* We now determine the length of the ASN1 string. If it
727            * differs from common_name's length, then there is a \0
728            * before the string terminates.  This can be an instance of a
729            * null-prefix attack.
730            *
731            * https://www.blackhat.com/html/bh-usa-09/bh-usa-09-archives.html#Marlinspike
732            * */
733
734           int i = -1, j;
735           X509_NAME_ENTRY *xentry;
736           ASN1_STRING *sdata;
737
738           if (xname) {
739             for (;;)
740               {
741                 j = X509_NAME_get_index_by_NID (xname, NID_commonName, i);
742                 if (j == -1) break;
743                 i = j;
744               }
745           }
746
747           xentry = X509_NAME_get_entry(xname,i);
748           sdata = X509_NAME_ENTRY_get_data(xentry);
749           if (strlen (common_name) != ASN1_STRING_length (sdata))
750             {
751               logprintf (LOG_NOTQUIET, _("\
752     %s: certificate common name is invalid (contains a NUL character).\n\
753     This may be an indication that the host is not who it claims to be\n\
754     (that is, it is not the real %s).\n"),
755                          severity, quote (host));
756               success = false;
757             }
758         }
759     }
760
761
762   if (success)
763     DEBUGP (("X509 certificate successfully verified and matches host %s\n",
764              quotearg_style (escape_quoting_style, host)));
765   X509_free (cert);
766
767  no_cert:
768   if (opt.check_cert && !success)
769     logprintf (LOG_NOTQUIET, _("\
770 To connect to %s insecurely, use `--no-check-certificate'.\n"),
771                quotearg_style (escape_quoting_style, host));
772
773   /* Allow --no-check-cert to disable certificate checking. */
774   return opt.check_cert ? success : true;
775 }
776
777 /*
778  * vim: tabstop=2 shiftwidth=2 softtabstop=2
779  */