]> sjero.net Git - wget/blob - src/openssl.c
7c92ac0bcb1c80908abb5ea2fce91e49335227dc
[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_pfs:
198     case secure_protocol_tlsv1:
199       meth = TLSv1_client_method ();
200       break;
201     default:
202       abort ();
203     }
204
205   /* The type cast below accommodates older OpenSSL versions (0.9.8)
206      where SSL_CTX_new() is declared without a "const" argument. */
207   ssl_ctx = SSL_CTX_new ((SSL_METHOD *)meth);
208   if (!ssl_ctx)
209     goto error;
210
211   /* OpenSSL ciphers: https://www.openssl.org/docs/apps/ciphers.html
212    * Since we want a good protection, we also use HIGH (that excludes MD4 ciphers and some more)
213    */
214   if (opt.secure_protocol == secure_protocol_pfs)
215     SSL_CTX_set_cipher_list (ssl_ctx, "HIGH:MEDIUM:!RC4:!SRP:!PSK:!RSA:!aNULL@STRENGTH");
216
217   SSL_CTX_set_default_verify_paths (ssl_ctx);
218   SSL_CTX_load_verify_locations (ssl_ctx, opt.ca_cert, opt.ca_directory);
219
220   /* SSL_VERIFY_NONE instructs OpenSSL not to abort SSL_connect if the
221      certificate is invalid.  We verify the certificate separately in
222      ssl_check_certificate, which provides much better diagnostics
223      than examining the error stack after a failed SSL_connect.  */
224   SSL_CTX_set_verify (ssl_ctx, SSL_VERIFY_NONE, NULL);
225
226   /* Use the private key from the cert file unless otherwise specified. */
227   if (opt.cert_file && !opt.private_key)
228     {
229       opt.private_key = opt.cert_file;
230       opt.private_key_type = opt.cert_type;
231     }
232
233   if (opt.cert_file)
234     if (SSL_CTX_use_certificate_file (ssl_ctx, opt.cert_file,
235                                       key_type_to_ssl_type (opt.cert_type))
236         != 1)
237       goto error;
238   if (opt.private_key)
239     if (SSL_CTX_use_PrivateKey_file (ssl_ctx, opt.private_key,
240                                      key_type_to_ssl_type (opt.private_key_type))
241         != 1)
242       goto error;
243
244   /* Since fd_write unconditionally assumes partial writes (and
245      handles them correctly), allow them in OpenSSL.  */
246   SSL_CTX_set_mode (ssl_ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
247
248   /* The OpenSSL library can handle renegotiations automatically, so
249      tell it to do so.  */
250   SSL_CTX_set_mode (ssl_ctx, SSL_MODE_AUTO_RETRY);
251
252   return true;
253
254  error:
255   if (ssl_ctx)
256     SSL_CTX_free (ssl_ctx);
257   print_errors ();
258   return false;
259 }
260
261 struct openssl_transport_context
262 {
263   SSL *conn;                    /* SSL connection handle */
264   char *last_error;             /* last error printed with openssl_errstr */
265 };
266
267 struct openssl_read_args
268 {
269   int fd;
270   struct openssl_transport_context *ctx;
271   char *buf;
272   int bufsize;
273   int retval;
274 };
275
276 static void openssl_read_callback(void *arg)
277 {
278   struct openssl_read_args *args = (struct openssl_read_args *) arg;
279   struct openssl_transport_context *ctx = args->ctx;
280   SSL *conn = ctx->conn;
281   char *buf = args->buf;
282   int bufsize = args->bufsize;
283   int ret;
284
285   do
286     ret = SSL_read (conn, buf, bufsize);
287   while (ret == -1 && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
288          && errno == EINTR);
289   args->retval = ret;
290 }
291
292 static int
293 openssl_read (int fd, char *buf, int bufsize, void *arg)
294 {
295   struct openssl_read_args args;
296   args.fd = fd;
297   args.buf = buf;
298   args.bufsize = bufsize;
299   args.ctx = (struct openssl_transport_context*) arg;
300
301   if (run_with_timeout(opt.read_timeout, openssl_read_callback, &args)) {
302     return -1;
303   }
304   return args.retval;
305 }
306
307 static int
308 openssl_write (int fd, char *buf, int bufsize, void *arg)
309 {
310   int ret = 0;
311   struct openssl_transport_context *ctx = arg;
312   SSL *conn = ctx->conn;
313   do
314     ret = SSL_write (conn, buf, bufsize);
315   while (ret == -1
316          && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
317          && errno == EINTR);
318   return ret;
319 }
320
321 static int
322 openssl_poll (int fd, double timeout, int wait_for, void *arg)
323 {
324   struct openssl_transport_context *ctx = arg;
325   SSL *conn = ctx->conn;
326   if (SSL_pending (conn))
327     return 1;
328   if (timeout == 0)
329     return 1;
330   return select_fd (fd, timeout, wait_for);
331 }
332
333 static int
334 openssl_peek (int fd, char *buf, int bufsize, void *arg)
335 {
336   int ret;
337   struct openssl_transport_context *ctx = arg;
338   SSL *conn = ctx->conn;
339   if (! openssl_poll (fd, 0.0, WAIT_FOR_READ, arg))
340     return 0;
341   do
342     ret = SSL_peek (conn, buf, bufsize);
343   while (ret == -1
344          && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL
345          && errno == EINTR);
346   return ret;
347 }
348
349 static const char *
350 openssl_errstr (int fd, void *arg)
351 {
352   struct openssl_transport_context *ctx = arg;
353   unsigned long errcode;
354   char *errmsg = NULL;
355   int msglen = 0;
356
357   /* If there are no SSL-specific errors, just return NULL. */
358   if ((errcode = ERR_get_error ()) == 0)
359     return NULL;
360
361   /* Get rid of previous contents of ctx->last_error, if any.  */
362   xfree_null (ctx->last_error);
363
364   /* Iterate over OpenSSL's error stack and accumulate errors in the
365      last_error buffer, separated by "; ".  This is better than using
366      a static buffer, which *always* takes up space (and has to be
367      large, to fit more than one error message), whereas these
368      allocations are only performed when there is an actual error.  */
369
370   for (;;)
371     {
372       const char *str = ERR_error_string (errcode, NULL);
373       int len = strlen (str);
374
375       /* Allocate space for the existing message, plus two more chars
376          for the "; " separator and one for the terminating \0.  */
377       errmsg = xrealloc (errmsg, msglen + len + 2 + 1);
378       memcpy (errmsg + msglen, str, len);
379       msglen += len;
380
381       /* Get next error and bail out if there are no more. */
382       errcode = ERR_get_error ();
383       if (errcode == 0)
384         break;
385
386       errmsg[msglen++] = ';';
387       errmsg[msglen++] = ' ';
388     }
389   errmsg[msglen] = '\0';
390
391   /* Store the error in ctx->last_error where openssl_close will
392      eventually find it and free it.  */
393   ctx->last_error = errmsg;
394
395   return errmsg;
396 }
397
398 static void
399 openssl_close (int fd, void *arg)
400 {
401   struct openssl_transport_context *ctx = arg;
402   SSL *conn = ctx->conn;
403
404   SSL_shutdown (conn);
405   SSL_free (conn);
406   xfree_null (ctx->last_error);
407   xfree (ctx);
408
409   close (fd);
410
411   DEBUGP (("Closed %d/SSL 0x%0*lx\n", fd, PTR_FORMAT (conn)));
412 }
413
414 /* openssl_transport is the singleton that describes the SSL transport
415    methods provided by this file.  */
416
417 static struct transport_implementation openssl_transport = {
418   openssl_read, openssl_write, openssl_poll,
419   openssl_peek, openssl_errstr, openssl_close
420 };
421
422 struct scwt_context
423 {
424   SSL *ssl;
425   int result;
426 };
427
428 static void
429 ssl_connect_with_timeout_callback(void *arg)
430 {
431   struct scwt_context *ctx = (struct scwt_context *)arg;
432   ctx->result = SSL_connect(ctx->ssl);
433 }
434
435 /* Perform the SSL handshake on file descriptor FD, which is assumed
436    to be connected to an SSL server.  The SSL handle provided by
437    OpenSSL is registered with the file descriptor FD using
438    fd_register_transport, so that subsequent calls to fd_read,
439    fd_write, etc., will use the corresponding SSL functions.
440
441    Returns true on success, false on failure.  */
442
443 bool
444 ssl_connect_wget (int fd, const char *hostname)
445 {
446   SSL *conn;
447   struct scwt_context scwt_ctx;
448   struct openssl_transport_context *ctx;
449
450   DEBUGP (("Initiating SSL handshake.\n"));
451
452   assert (ssl_ctx != NULL);
453   conn = SSL_new (ssl_ctx);
454   if (!conn)
455     goto error;
456 #if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
457   /* If the SSL library was build with support for ServerNameIndication
458      then use it whenever we have a hostname.  If not, don't, ever. */
459   if (! is_valid_ip_address (hostname))
460     {
461       if (! SSL_set_tlsext_host_name (conn, hostname))
462         {
463         DEBUGP (("Failed to set TLS server-name indication."));
464         goto error;
465         }
466     }
467 #endif
468
469 #ifndef FD_TO_SOCKET
470 # define FD_TO_SOCKET(X) (X)
471 #endif
472   if (!SSL_set_fd (conn, FD_TO_SOCKET (fd)))
473     goto error;
474   SSL_set_connect_state (conn);
475
476   scwt_ctx.ssl = conn;
477   if (run_with_timeout(opt.read_timeout, ssl_connect_with_timeout_callback,
478                        &scwt_ctx)) {
479     DEBUGP (("SSL handshake timed out.\n"));
480     goto timeout;
481   }
482   if (scwt_ctx.result <= 0 || conn->state != SSL_ST_OK)
483     goto error;
484
485   ctx = xnew0 (struct openssl_transport_context);
486   ctx->conn = conn;
487
488   /* Register FD with Wget's transport layer, i.e. arrange that our
489      functions are used for reading, writing, and polling.  */
490   fd_register_transport (fd, &openssl_transport, ctx);
491   DEBUGP (("Handshake successful; connected socket %d to SSL handle 0x%0*lx\n",
492            fd, PTR_FORMAT (conn)));
493   return true;
494
495  error:
496   DEBUGP (("SSL handshake failed.\n"));
497   print_errors ();
498  timeout:
499   if (conn)
500     SSL_free (conn);
501   return false;
502 }
503
504 #define ASTERISK_EXCLUDES_DOT   /* mandated by rfc2818 */
505
506 /* Return true is STRING (case-insensitively) matches PATTERN, false
507    otherwise.  The recognized wildcard character is "*", which matches
508    any character in STRING except ".".  Any number of the "*" wildcard
509    may be present in the pattern.
510
511    This is used to match of hosts as indicated in rfc2818: "Names may
512    contain the wildcard character * which is considered to match any
513    single domain name component or component fragment. E.g., *.a.com
514    matches foo.a.com but not bar.foo.a.com. f*.com matches foo.com but
515    not bar.com [or foo.bar.com]."
516
517    If the pattern contain no wildcards, pattern_match(a, b) is
518    equivalent to !strcasecmp(a, b).  */
519
520 static bool
521 pattern_match (const char *pattern, const char *string)
522 {
523   const char *p = pattern, *n = string;
524   char c;
525   for (; (c = c_tolower (*p++)) != '\0'; n++)
526     if (c == '*')
527       {
528         for (c = c_tolower (*p); c == '*'; c = c_tolower (*++p))
529           ;
530         for (; *n != '\0'; n++)
531           if (c_tolower (*n) == c && pattern_match (p, n))
532             return true;
533 #ifdef ASTERISK_EXCLUDES_DOT
534           else if (*n == '.')
535             return false;
536 #endif
537         return c == '\0';
538       }
539     else
540       {
541         if (c != c_tolower (*n))
542           return false;
543       }
544   return *n == '\0';
545 }
546
547 /* Verify the validity of the certificate presented by the server.
548    Also check that the "common name" of the server, as presented by
549    its certificate, corresponds to HOST.  (HOST typically comes from
550    the URL and is what the user thinks he's connecting to.)
551
552    This assumes that ssl_connect_wget has successfully finished, i.e. that
553    the SSL handshake has been performed and that FD is connected to an
554    SSL handle.
555
556    If opt.check_cert is true (the default), this returns 1 if the
557    certificate is valid, 0 otherwise.  If opt.check_cert is 0, the
558    function always returns 1, but should still be called because it
559    warns the user about any problems with the certificate.  */
560
561 bool
562 ssl_check_certificate (int fd, const char *host)
563 {
564   X509 *cert;
565   GENERAL_NAMES *subjectAltNames;
566   char common_name[256];
567   long vresult;
568   bool success = true;
569   bool alt_name_checked = false;
570
571   /* If the user has specified --no-check-cert, we still want to warn
572      him about problems with the server's certificate.  */
573   const char *severity = opt.check_cert ? _("ERROR") : _("WARNING");
574
575   struct openssl_transport_context *ctx = fd_transport_context (fd);
576   SSL *conn = ctx->conn;
577   assert (conn != NULL);
578
579   cert = SSL_get_peer_certificate (conn);
580   if (!cert)
581     {
582       logprintf (LOG_NOTQUIET, _("%s: No certificate presented by %s.\n"),
583                  severity, quotearg_style (escape_quoting_style, host));
584       success = false;
585       goto no_cert;             /* must bail out since CERT is NULL */
586     }
587
588   IF_DEBUG
589     {
590       char *subject = X509_NAME_oneline (X509_get_subject_name (cert), 0, 0);
591       char *issuer = X509_NAME_oneline (X509_get_issuer_name (cert), 0, 0);
592       DEBUGP (("certificate:\n  subject: %s\n  issuer:  %s\n",
593                quotearg_n_style (0, escape_quoting_style, subject),
594                quotearg_n_style (1, escape_quoting_style, issuer)));
595       OPENSSL_free (subject);
596       OPENSSL_free (issuer);
597     }
598
599   vresult = SSL_get_verify_result (conn);
600   if (vresult != X509_V_OK)
601     {
602       char *issuer = X509_NAME_oneline (X509_get_issuer_name (cert), 0, 0);
603       logprintf (LOG_NOTQUIET,
604                  _("%s: cannot verify %s's certificate, issued by %s:\n"),
605                  severity, quotearg_n_style (0, escape_quoting_style, host),
606                  quote_n (1, issuer));
607       /* Try to print more user-friendly (and translated) messages for
608          the frequent verification errors.  */
609       switch (vresult)
610         {
611         case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
612           logprintf (LOG_NOTQUIET,
613                      _("  Unable to locally verify the issuer's authority.\n"));
614           break;
615         case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
616         case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
617           logprintf (LOG_NOTQUIET,
618                      _("  Self-signed certificate encountered.\n"));
619           break;
620         case X509_V_ERR_CERT_NOT_YET_VALID:
621           logprintf (LOG_NOTQUIET, _("  Issued certificate not yet valid.\n"));
622           break;
623         case X509_V_ERR_CERT_HAS_EXPIRED:
624           logprintf (LOG_NOTQUIET, _("  Issued certificate has expired.\n"));
625           break;
626         default:
627           /* For the less frequent error strings, simply provide the
628              OpenSSL error message.  */
629           logprintf (LOG_NOTQUIET, "  %s\n",
630                      X509_verify_cert_error_string (vresult));
631         }
632       success = false;
633       /* Fall through, so that the user is warned about *all* issues
634          with the cert (important with --no-check-certificate.)  */
635     }
636
637   /* Check that HOST matches the common name in the certificate.
638      #### The following remains to be done:
639
640      - When matching against common names, it should loop over all
641        common names and choose the most specific one, i.e. the last
642        one, not the first one, which the current code picks.
643
644      - Ensure that ASN1 strings from the certificate are encoded as
645        UTF-8 which can be meaningfully compared to HOST.  */
646
647   subjectAltNames = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL);
648
649   if (subjectAltNames)
650     {
651       /* Test subject alternative names */
652
653       /* Do we want to check for dNSNAmes or ipAddresses (see RFC 2818)?
654        * Signal it by host_in_octet_string. */
655       ASN1_OCTET_STRING *host_in_octet_string = a2i_IPADDRESS (host);
656
657       int numaltnames = sk_GENERAL_NAME_num (subjectAltNames);
658       int i;
659       for (i=0; i < numaltnames; i++)
660         {
661           const GENERAL_NAME *name =
662             sk_GENERAL_NAME_value (subjectAltNames, i);
663           if (name)
664             {
665               if (host_in_octet_string)
666                 {
667                   if (name->type == GEN_IPADD)
668                     {
669                       /* Check for ipAddress */
670                       /* TODO: Should we convert between IPv4-mapped IPv6
671                        * addresses and IPv4 addresses? */
672                       alt_name_checked = true;
673                       if (!ASN1_STRING_cmp (host_in_octet_string,
674                             name->d.iPAddress))
675                         break;
676                     }
677                 }
678               else if (name->type == GEN_DNS)
679                 {
680                   /* dNSName should be IA5String (i.e. ASCII), however who
681                    * does trust CA? Convert it into UTF-8 for sure. */
682                   unsigned char *name_in_utf8 = NULL;
683
684                   /* Check for dNSName */
685                   alt_name_checked = true;
686
687                   if (0 <= ASN1_STRING_to_UTF8 (&name_in_utf8, name->d.dNSName))
688                     {
689                       /* Compare and check for NULL attack in ASN1_STRING */
690                       if (pattern_match ((char *)name_in_utf8, host) &&
691                             (strlen ((char *)name_in_utf8) ==
692                                 ASN1_STRING_length (name->d.dNSName)))
693                         {
694                           OPENSSL_free (name_in_utf8);
695                           break;
696                         }
697                       OPENSSL_free (name_in_utf8);
698                     }
699                 }
700             }
701         }
702       sk_GENERAL_NAME_free (subjectAltNames);
703       if (host_in_octet_string)
704         ASN1_OCTET_STRING_free(host_in_octet_string);
705
706       if (alt_name_checked == true && i >= numaltnames)
707         {
708           logprintf (LOG_NOTQUIET,
709               _("%s: no certificate subject alternative name matches\n"
710                 "\trequested host name %s.\n"),
711                      severity, quote_n (1, host));
712           success = false;
713         }
714     }
715   
716   if (alt_name_checked == false)
717     {
718       /* Test commomName */
719       X509_NAME *xname = X509_get_subject_name(cert);
720       common_name[0] = '\0';
721       X509_NAME_get_text_by_NID (xname, NID_commonName, common_name,
722                                  sizeof (common_name));
723
724       if (!pattern_match (common_name, host))
725         {
726           logprintf (LOG_NOTQUIET, _("\
727     %s: certificate common name %s doesn't match requested host name %s.\n"),
728                      severity, quote_n (0, common_name), quote_n (1, host));
729           success = false;
730         }
731       else
732         {
733           /* We now determine the length of the ASN1 string. If it
734            * differs from common_name's length, then there is a \0
735            * before the string terminates.  This can be an instance of a
736            * null-prefix attack.
737            *
738            * https://www.blackhat.com/html/bh-usa-09/bh-usa-09-archives.html#Marlinspike
739            * */
740
741           int i = -1, j;
742           X509_NAME_ENTRY *xentry;
743           ASN1_STRING *sdata;
744
745           if (xname) {
746             for (;;)
747               {
748                 j = X509_NAME_get_index_by_NID (xname, NID_commonName, i);
749                 if (j == -1) break;
750                 i = j;
751               }
752           }
753
754           xentry = X509_NAME_get_entry(xname,i);
755           sdata = X509_NAME_ENTRY_get_data(xentry);
756           if (strlen (common_name) != ASN1_STRING_length (sdata))
757             {
758               logprintf (LOG_NOTQUIET, _("\
759     %s: certificate common name is invalid (contains a NUL character).\n\
760     This may be an indication that the host is not who it claims to be\n\
761     (that is, it is not the real %s).\n"),
762                          severity, quote (host));
763               success = false;
764             }
765         }
766     }
767
768
769   if (success)
770     DEBUGP (("X509 certificate successfully verified and matches host %s\n",
771              quotearg_style (escape_quoting_style, host)));
772   X509_free (cert);
773
774  no_cert:
775   if (opt.check_cert && !success)
776     logprintf (LOG_NOTQUIET, _("\
777 To connect to %s insecurely, use `--no-check-certificate'.\n"),
778                quotearg_style (escape_quoting_style, host));
779
780   /* Allow --no-check-cert to disable certificate checking. */
781   return opt.check_cert ? success : true;
782 }
783
784 /*
785  * vim: tabstop=2 shiftwidth=2 softtabstop=2
786  */