Home | History | Annotate | Download | only in base
      1 /*
      2  * libjingle
      3  * Copyright 2008, Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #if HAVE_OPENSSL_SSL_H
     29 
     30 #include "talk/base/openssladapter.h"
     31 
     32 #if defined(POSIX)
     33 #include <unistd.h>
     34 #endif
     35 
     36 // Must be included first before openssl headers.
     37 #include "talk/base/win32.h"  // NOLINT
     38 
     39 #include <openssl/bio.h>
     40 #include <openssl/crypto.h>
     41 #include <openssl/err.h>
     42 #include <openssl/opensslv.h>
     43 #include <openssl/rand.h>
     44 #include <openssl/ssl.h>
     45 #include <openssl/x509v3.h>
     46 
     47 #if HAVE_CONFIG_H
     48 #include "config.h"
     49 #endif  // HAVE_CONFIG_H
     50 
     51 #include "talk/base/common.h"
     52 #include "talk/base/logging.h"
     53 #include "talk/base/sslroots.h"
     54 #include "talk/base/stringutils.h"
     55 
     56 // TODO: Use a nicer abstraction for mutex.
     57 
     58 #if defined(WIN32)
     59   #define MUTEX_TYPE HANDLE
     60   #define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
     61   #define MUTEX_CLEANUP(x) CloseHandle(x)
     62   #define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
     63   #define MUTEX_UNLOCK(x) ReleaseMutex(x)
     64   #define THREAD_ID GetCurrentThreadId()
     65 #elif defined(_POSIX_THREADS)
     66   // _POSIX_THREADS is normally defined in unistd.h if pthreads are available
     67   // on your platform.
     68   #define MUTEX_TYPE pthread_mutex_t
     69   #define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
     70   #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
     71   #define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
     72   #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
     73   #define THREAD_ID pthread_self()
     74 #else
     75   #error You must define mutex operations appropriate for your platform!
     76 #endif
     77 
     78 struct CRYPTO_dynlock_value {
     79   MUTEX_TYPE mutex;
     80 };
     81 
     82 //////////////////////////////////////////////////////////////////////
     83 // SocketBIO
     84 //////////////////////////////////////////////////////////////////////
     85 
     86 static int socket_write(BIO* h, const char* buf, int num);
     87 static int socket_read(BIO* h, char* buf, int size);
     88 static int socket_puts(BIO* h, const char* str);
     89 static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2);
     90 static int socket_new(BIO* h);
     91 static int socket_free(BIO* data);
     92 
     93 static BIO_METHOD methods_socket = {
     94   BIO_TYPE_BIO,
     95   "socket",
     96   socket_write,
     97   socket_read,
     98   socket_puts,
     99   0,
    100   socket_ctrl,
    101   socket_new,
    102   socket_free,
    103   NULL,
    104 };
    105 
    106 BIO_METHOD* BIO_s_socket2() { return(&methods_socket); }
    107 
    108 BIO* BIO_new_socket(talk_base::AsyncSocket* socket) {
    109   BIO* ret = BIO_new(BIO_s_socket2());
    110   if (ret == NULL) {
    111           return NULL;
    112   }
    113   ret->ptr = socket;
    114   return ret;
    115 }
    116 
    117 static int socket_new(BIO* b) {
    118   b->shutdown = 0;
    119   b->init = 1;
    120   b->num = 0; // 1 means socket closed
    121   b->ptr = 0;
    122   return 1;
    123 }
    124 
    125 static int socket_free(BIO* b) {
    126   if (b == NULL)
    127     return 0;
    128   return 1;
    129 }
    130 
    131 static int socket_read(BIO* b, char* out, int outl) {
    132   if (!out)
    133     return -1;
    134   talk_base::AsyncSocket* socket = static_cast<talk_base::AsyncSocket*>(b->ptr);
    135   BIO_clear_retry_flags(b);
    136   int result = socket->Recv(out, outl);
    137   if (result > 0) {
    138     return result;
    139   } else if (result == 0) {
    140     b->num = 1;
    141   } else if (socket->IsBlocking()) {
    142     BIO_set_retry_read(b);
    143   }
    144   return -1;
    145 }
    146 
    147 static int socket_write(BIO* b, const char* in, int inl) {
    148   if (!in)
    149     return -1;
    150   talk_base::AsyncSocket* socket = static_cast<talk_base::AsyncSocket*>(b->ptr);
    151   BIO_clear_retry_flags(b);
    152   int result = socket->Send(in, inl);
    153   if (result > 0) {
    154     return result;
    155   } else if (socket->IsBlocking()) {
    156     BIO_set_retry_write(b);
    157   }
    158   return -1;
    159 }
    160 
    161 static int socket_puts(BIO* b, const char* str) {
    162   return socket_write(b, str, strlen(str));
    163 }
    164 
    165 static long socket_ctrl(BIO* b, int cmd, long num, void* ptr) {
    166   UNUSED(num);
    167   UNUSED(ptr);
    168 
    169   switch (cmd) {
    170   case BIO_CTRL_RESET:
    171     return 0;
    172   case BIO_CTRL_EOF:
    173     return b->num;
    174   case BIO_CTRL_WPENDING:
    175   case BIO_CTRL_PENDING:
    176     return 0;
    177   case BIO_CTRL_FLUSH:
    178     return 1;
    179   default:
    180     return 0;
    181   }
    182 }
    183 
    184 /////////////////////////////////////////////////////////////////////////////
    185 // OpenSSLAdapter
    186 /////////////////////////////////////////////////////////////////////////////
    187 
    188 namespace talk_base {
    189 
    190 // This array will store all of the mutexes available to OpenSSL.
    191 static MUTEX_TYPE* mutex_buf = NULL;
    192 
    193 static void locking_function(int mode, int n, const char * file, int line) {
    194   if (mode & CRYPTO_LOCK) {
    195     MUTEX_LOCK(mutex_buf[n]);
    196   } else {
    197     MUTEX_UNLOCK(mutex_buf[n]);
    198   }
    199 }
    200 
    201 static unsigned long id_function() {  // NOLINT
    202   // Use old-style C cast because THREAD_ID's type varies with the platform,
    203   // in some cases requiring static_cast, and in others requiring
    204   // reinterpret_cast.
    205   return (unsigned long)THREAD_ID; // NOLINT
    206 }
    207 
    208 static CRYPTO_dynlock_value* dyn_create_function(const char* file, int line) {
    209   CRYPTO_dynlock_value* value = new CRYPTO_dynlock_value;
    210   if (!value)
    211     return NULL;
    212   MUTEX_SETUP(value->mutex);
    213   return value;
    214 }
    215 
    216 static void dyn_lock_function(int mode, CRYPTO_dynlock_value* l,
    217                               const char* file, int line) {
    218   if (mode & CRYPTO_LOCK) {
    219     MUTEX_LOCK(l->mutex);
    220   } else {
    221     MUTEX_UNLOCK(l->mutex);
    222   }
    223 }
    224 
    225 static void dyn_destroy_function(CRYPTO_dynlock_value* l,
    226                                  const char* file, int line) {
    227   MUTEX_CLEANUP(l->mutex);
    228   delete l;
    229 }
    230 
    231 VerificationCallback OpenSSLAdapter::custom_verify_callback_ = NULL;
    232 
    233 bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) {
    234   if (!InitializeSSLThread() || !SSL_library_init())
    235       return false;
    236 #if !defined(ADDRESS_SANITIZER) || !defined(OSX)
    237   // Loading the error strings crashes mac_asan.  Omit this debugging aid there.
    238   SSL_load_error_strings();
    239 #endif
    240   ERR_load_BIO_strings();
    241   OpenSSL_add_all_algorithms();
    242   RAND_poll();
    243   custom_verify_callback_ = callback;
    244   return true;
    245 }
    246 
    247 bool OpenSSLAdapter::InitializeSSLThread() {
    248   mutex_buf = new MUTEX_TYPE[CRYPTO_num_locks()];
    249   if (!mutex_buf)
    250     return false;
    251   for (int i = 0; i < CRYPTO_num_locks(); ++i)
    252     MUTEX_SETUP(mutex_buf[i]);
    253 
    254   // we need to cast our id_function to return an unsigned long -- pthread_t is
    255   // a pointer
    256   CRYPTO_set_id_callback(id_function);
    257   CRYPTO_set_locking_callback(locking_function);
    258   CRYPTO_set_dynlock_create_callback(dyn_create_function);
    259   CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
    260   CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
    261   return true;
    262 }
    263 
    264 bool OpenSSLAdapter::CleanupSSL() {
    265   if (!mutex_buf)
    266     return false;
    267   CRYPTO_set_id_callback(NULL);
    268   CRYPTO_set_locking_callback(NULL);
    269   CRYPTO_set_dynlock_create_callback(NULL);
    270   CRYPTO_set_dynlock_lock_callback(NULL);
    271   CRYPTO_set_dynlock_destroy_callback(NULL);
    272   for (int i = 0; i < CRYPTO_num_locks(); ++i)
    273     MUTEX_CLEANUP(mutex_buf[i]);
    274   delete [] mutex_buf;
    275   mutex_buf = NULL;
    276   return true;
    277 }
    278 
    279 OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket)
    280   : SSLAdapter(socket),
    281     state_(SSL_NONE),
    282     ssl_read_needs_write_(false),
    283     ssl_write_needs_read_(false),
    284     restartable_(false),
    285     ssl_(NULL), ssl_ctx_(NULL),
    286     custom_verification_succeeded_(false) {
    287 }
    288 
    289 OpenSSLAdapter::~OpenSSLAdapter() {
    290   Cleanup();
    291 }
    292 
    293 int
    294 OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) {
    295   if (state_ != SSL_NONE)
    296     return -1;
    297 
    298   ssl_host_name_ = hostname;
    299   restartable_ = restartable;
    300 
    301   if (socket_->GetState() != Socket::CS_CONNECTED) {
    302     state_ = SSL_WAIT;
    303     return 0;
    304   }
    305 
    306   state_ = SSL_CONNECTING;
    307   if (int err = BeginSSL()) {
    308     Error("BeginSSL", err, false);
    309     return err;
    310   }
    311 
    312   return 0;
    313 }
    314 
    315 int
    316 OpenSSLAdapter::BeginSSL() {
    317   LOG(LS_INFO) << "BeginSSL: " << ssl_host_name_;
    318   ASSERT(state_ == SSL_CONNECTING);
    319 
    320   int err = 0;
    321   BIO* bio = NULL;
    322 
    323   // First set up the context
    324   if (!ssl_ctx_)
    325     ssl_ctx_ = SetupSSLContext();
    326 
    327   if (!ssl_ctx_) {
    328     err = -1;
    329     goto ssl_error;
    330   }
    331 
    332   bio = BIO_new_socket(static_cast<AsyncSocketAdapter*>(socket_));
    333   if (!bio) {
    334     err = -1;
    335     goto ssl_error;
    336   }
    337 
    338   ssl_ = SSL_new(ssl_ctx_);
    339   if (!ssl_) {
    340     err = -1;
    341     goto ssl_error;
    342   }
    343 
    344   SSL_set_app_data(ssl_, this);
    345 
    346   SSL_set_bio(ssl_, bio, bio);
    347   SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE |
    348                      SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
    349 
    350   // the SSL object owns the bio now
    351   bio = NULL;
    352 
    353   // Do the connect
    354   err = ContinueSSL();
    355   if (err != 0)
    356     goto ssl_error;
    357 
    358   return err;
    359 
    360 ssl_error:
    361   Cleanup();
    362   if (bio)
    363     BIO_free(bio);
    364 
    365   return err;
    366 }
    367 
    368 int
    369 OpenSSLAdapter::ContinueSSL() {
    370   ASSERT(state_ == SSL_CONNECTING);
    371 
    372   int code = SSL_connect(ssl_);
    373   switch (SSL_get_error(ssl_, code)) {
    374   case SSL_ERROR_NONE:
    375     if (!SSLPostConnectionCheck(ssl_, ssl_host_name_.c_str())) {
    376       LOG(LS_ERROR) << "TLS post connection check failed";
    377       // make sure we close the socket
    378       Cleanup();
    379       // The connect failed so return -1 to shut down the socket
    380       return -1;
    381     }
    382 
    383     state_ = SSL_CONNECTED;
    384     AsyncSocketAdapter::OnConnectEvent(this);
    385 #if 0  // TODO: worry about this
    386     // Don't let ourselves go away during the callbacks
    387     PRefPtr<OpenSSLAdapter> lock(this);
    388     LOG(LS_INFO) << " -- onStreamReadable";
    389     AsyncSocketAdapter::OnReadEvent(this);
    390     LOG(LS_INFO) << " -- onStreamWriteable";
    391     AsyncSocketAdapter::OnWriteEvent(this);
    392 #endif
    393     break;
    394 
    395   case SSL_ERROR_WANT_READ:
    396   case SSL_ERROR_WANT_WRITE:
    397     break;
    398 
    399   case SSL_ERROR_ZERO_RETURN:
    400   default:
    401     LOG(LS_WARNING) << "ContinueSSL -- error " << code;
    402     return (code != 0) ? code : -1;
    403   }
    404 
    405   return 0;
    406 }
    407 
    408 void
    409 OpenSSLAdapter::Error(const char* context, int err, bool signal) {
    410   LOG(LS_WARNING) << "OpenSSLAdapter::Error("
    411                   << context << ", " << err << ")";
    412   state_ = SSL_ERROR;
    413   SetError(err);
    414   if (signal)
    415     AsyncSocketAdapter::OnCloseEvent(this, err);
    416 }
    417 
    418 void
    419 OpenSSLAdapter::Cleanup() {
    420   LOG(LS_INFO) << "Cleanup";
    421 
    422   state_ = SSL_NONE;
    423   ssl_read_needs_write_ = false;
    424   ssl_write_needs_read_ = false;
    425   custom_verification_succeeded_ = false;
    426 
    427   if (ssl_) {
    428     SSL_free(ssl_);
    429     ssl_ = NULL;
    430   }
    431 
    432   if (ssl_ctx_) {
    433     SSL_CTX_free(ssl_ctx_);
    434     ssl_ctx_ = NULL;
    435   }
    436 }
    437 
    438 //
    439 // AsyncSocket Implementation
    440 //
    441 
    442 int
    443 OpenSSLAdapter::Send(const void* pv, size_t cb) {
    444   //LOG(LS_INFO) << "OpenSSLAdapter::Send(" << cb << ")";
    445 
    446   switch (state_) {
    447   case SSL_NONE:
    448     return AsyncSocketAdapter::Send(pv, cb);
    449 
    450   case SSL_WAIT:
    451   case SSL_CONNECTING:
    452     SetError(EWOULDBLOCK);
    453     return SOCKET_ERROR;
    454 
    455   case SSL_CONNECTED:
    456     break;
    457 
    458   case SSL_ERROR:
    459   default:
    460     return SOCKET_ERROR;
    461   }
    462 
    463   // OpenSSL will return an error if we try to write zero bytes
    464   if (cb == 0)
    465     return 0;
    466 
    467   ssl_write_needs_read_ = false;
    468 
    469   int code = SSL_write(ssl_, pv, cb);
    470   switch (SSL_get_error(ssl_, code)) {
    471   case SSL_ERROR_NONE:
    472     //LOG(LS_INFO) << " -- success";
    473     return code;
    474   case SSL_ERROR_WANT_READ:
    475     //LOG(LS_INFO) << " -- error want read";
    476     ssl_write_needs_read_ = true;
    477     SetError(EWOULDBLOCK);
    478     break;
    479   case SSL_ERROR_WANT_WRITE:
    480     //LOG(LS_INFO) << " -- error want write";
    481     SetError(EWOULDBLOCK);
    482     break;
    483   case SSL_ERROR_ZERO_RETURN:
    484     //LOG(LS_INFO) << " -- remote side closed";
    485     SetError(EWOULDBLOCK);
    486     // do we need to signal closure?
    487     break;
    488   default:
    489     //LOG(LS_INFO) << " -- error " << code;
    490     Error("SSL_write", (code ? code : -1), false);
    491     break;
    492   }
    493 
    494   return SOCKET_ERROR;
    495 }
    496 
    497 int
    498 OpenSSLAdapter::Recv(void* pv, size_t cb) {
    499   //LOG(LS_INFO) << "OpenSSLAdapter::Recv(" << cb << ")";
    500   switch (state_) {
    501 
    502   case SSL_NONE:
    503     return AsyncSocketAdapter::Recv(pv, cb);
    504 
    505   case SSL_WAIT:
    506   case SSL_CONNECTING:
    507     SetError(EWOULDBLOCK);
    508     return SOCKET_ERROR;
    509 
    510   case SSL_CONNECTED:
    511     break;
    512 
    513   case SSL_ERROR:
    514   default:
    515     return SOCKET_ERROR;
    516   }
    517 
    518   // Don't trust OpenSSL with zero byte reads
    519   if (cb == 0)
    520     return 0;
    521 
    522   ssl_read_needs_write_ = false;
    523 
    524   int code = SSL_read(ssl_, pv, cb);
    525   switch (SSL_get_error(ssl_, code)) {
    526   case SSL_ERROR_NONE:
    527     //LOG(LS_INFO) << " -- success";
    528     return code;
    529   case SSL_ERROR_WANT_READ:
    530     //LOG(LS_INFO) << " -- error want read";
    531     SetError(EWOULDBLOCK);
    532     break;
    533   case SSL_ERROR_WANT_WRITE:
    534     //LOG(LS_INFO) << " -- error want write";
    535     ssl_read_needs_write_ = true;
    536     SetError(EWOULDBLOCK);
    537     break;
    538   case SSL_ERROR_ZERO_RETURN:
    539     //LOG(LS_INFO) << " -- remote side closed";
    540     SetError(EWOULDBLOCK);
    541     // do we need to signal closure?
    542     break;
    543   default:
    544     //LOG(LS_INFO) << " -- error " << code;
    545     Error("SSL_read", (code ? code : -1), false);
    546     break;
    547   }
    548 
    549   return SOCKET_ERROR;
    550 }
    551 
    552 int
    553 OpenSSLAdapter::Close() {
    554   Cleanup();
    555   state_ = restartable_ ? SSL_WAIT : SSL_NONE;
    556   return AsyncSocketAdapter::Close();
    557 }
    558 
    559 Socket::ConnState
    560 OpenSSLAdapter::GetState() const {
    561   //if (signal_close_)
    562   //  return CS_CONNECTED;
    563   ConnState state = socket_->GetState();
    564   if ((state == CS_CONNECTED)
    565       && ((state_ == SSL_WAIT) || (state_ == SSL_CONNECTING)))
    566     state = CS_CONNECTING;
    567   return state;
    568 }
    569 
    570 void
    571 OpenSSLAdapter::OnConnectEvent(AsyncSocket* socket) {
    572   LOG(LS_INFO) << "OpenSSLAdapter::OnConnectEvent";
    573   if (state_ != SSL_WAIT) {
    574     ASSERT(state_ == SSL_NONE);
    575     AsyncSocketAdapter::OnConnectEvent(socket);
    576     return;
    577   }
    578 
    579   state_ = SSL_CONNECTING;
    580   if (int err = BeginSSL()) {
    581     AsyncSocketAdapter::OnCloseEvent(socket, err);
    582   }
    583 }
    584 
    585 void
    586 OpenSSLAdapter::OnReadEvent(AsyncSocket* socket) {
    587   //LOG(LS_INFO) << "OpenSSLAdapter::OnReadEvent";
    588 
    589   if (state_ == SSL_NONE) {
    590     AsyncSocketAdapter::OnReadEvent(socket);
    591     return;
    592   }
    593 
    594   if (state_ == SSL_CONNECTING) {
    595     if (int err = ContinueSSL()) {
    596       Error("ContinueSSL", err);
    597     }
    598     return;
    599   }
    600 
    601   if (state_ != SSL_CONNECTED)
    602     return;
    603 
    604   // Don't let ourselves go away during the callbacks
    605   //PRefPtr<OpenSSLAdapter> lock(this); // TODO: fix this
    606   if (ssl_write_needs_read_)  {
    607     //LOG(LS_INFO) << " -- onStreamWriteable";
    608     AsyncSocketAdapter::OnWriteEvent(socket);
    609   }
    610 
    611   //LOG(LS_INFO) << " -- onStreamReadable";
    612   AsyncSocketAdapter::OnReadEvent(socket);
    613 }
    614 
    615 void
    616 OpenSSLAdapter::OnWriteEvent(AsyncSocket* socket) {
    617   //LOG(LS_INFO) << "OpenSSLAdapter::OnWriteEvent";
    618 
    619   if (state_ == SSL_NONE) {
    620     AsyncSocketAdapter::OnWriteEvent(socket);
    621     return;
    622   }
    623 
    624   if (state_ == SSL_CONNECTING) {
    625     if (int err = ContinueSSL()) {
    626       Error("ContinueSSL", err);
    627     }
    628     return;
    629   }
    630 
    631   if (state_ != SSL_CONNECTED)
    632     return;
    633 
    634   // Don't let ourselves go away during the callbacks
    635   //PRefPtr<OpenSSLAdapter> lock(this); // TODO: fix this
    636 
    637   if (ssl_read_needs_write_)  {
    638     //LOG(LS_INFO) << " -- onStreamReadable";
    639     AsyncSocketAdapter::OnReadEvent(socket);
    640   }
    641 
    642   //LOG(LS_INFO) << " -- onStreamWriteable";
    643   AsyncSocketAdapter::OnWriteEvent(socket);
    644 }
    645 
    646 void
    647 OpenSSLAdapter::OnCloseEvent(AsyncSocket* socket, int err) {
    648   LOG(LS_INFO) << "OpenSSLAdapter::OnCloseEvent(" << err << ")";
    649   AsyncSocketAdapter::OnCloseEvent(socket, err);
    650 }
    651 
    652 // This code is taken from the "Network Security with OpenSSL"
    653 // sample in chapter 5
    654 
    655 bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
    656                                       bool ignore_bad_cert) {
    657   if (!host)
    658     return false;
    659 
    660   // Checking the return from SSL_get_peer_certificate here is not strictly
    661   // necessary.  With our setup, it is not possible for it to return
    662   // NULL.  However, it is good form to check the return.
    663   X509* certificate = SSL_get_peer_certificate(ssl);
    664   if (!certificate)
    665     return false;
    666 
    667   // Logging certificates is extremely verbose. So it is disabled by default.
    668 #ifdef LOG_CERTIFICATES
    669   {
    670     LOG(LS_INFO) << "Certificate from server:";
    671     BIO* mem = BIO_new(BIO_s_mem());
    672     X509_print_ex(mem, certificate, XN_FLAG_SEP_CPLUS_SPC, X509_FLAG_NO_HEADER);
    673     BIO_write(mem, "\0", 1);
    674     char* buffer;
    675     BIO_get_mem_data(mem, &buffer);
    676     LOG(LS_INFO) << buffer;
    677     BIO_free(mem);
    678 
    679     char* cipher_description =
    680       SSL_CIPHER_description(SSL_get_current_cipher(ssl), NULL, 128);
    681     LOG(LS_INFO) << "Cipher: " << cipher_description;
    682     OPENSSL_free(cipher_description);
    683   }
    684 #endif
    685 
    686   bool ok = false;
    687   int extension_count = X509_get_ext_count(certificate);
    688   for (int i = 0; i < extension_count; ++i) {
    689     X509_EXTENSION* extension = X509_get_ext(certificate, i);
    690     int extension_nid = OBJ_obj2nid(X509_EXTENSION_get_object(extension));
    691 
    692     if (extension_nid == NID_subject_alt_name) {
    693 #if OPENSSL_VERSION_NUMBER >= 0x10000000L
    694       const X509V3_EXT_METHOD* meth = X509V3_EXT_get(extension);
    695 #else
    696       X509V3_EXT_METHOD* meth = X509V3_EXT_get(extension);
    697 #endif
    698       if (!meth)
    699         break;
    700 
    701       void* ext_str = NULL;
    702 
    703       // We assign this to a local variable, instead of passing the address
    704       // directly to ASN1_item_d2i.
    705       // See http://readlist.com/lists/openssl.org/openssl-users/0/4761.html.
    706       unsigned char* ext_value_data = extension->value->data;
    707 
    708 #if OPENSSL_VERSION_NUMBER >= 0x0090800fL
    709       const unsigned char **ext_value_data_ptr =
    710           (const_cast<const unsigned char **>(&ext_value_data));
    711 #else
    712       unsigned char **ext_value_data_ptr = &ext_value_data;
    713 #endif
    714 
    715       if (meth->it) {
    716         ext_str = ASN1_item_d2i(NULL, ext_value_data_ptr,
    717                                 extension->value->length,
    718                                 ASN1_ITEM_ptr(meth->it));
    719       } else {
    720         ext_str = meth->d2i(NULL, ext_value_data_ptr, extension->value->length);
    721       }
    722 
    723       STACK_OF(CONF_VALUE)* value = meth->i2v(meth, ext_str, NULL);
    724       for (int j = 0; j < sk_CONF_VALUE_num(value); ++j) {
    725         CONF_VALUE* nval = sk_CONF_VALUE_value(value, j);
    726         // The value for nval can contain wildcards
    727         if (!strcmp(nval->name, "DNS") && string_match(host, nval->value)) {
    728           ok = true;
    729           break;
    730         }
    731       }
    732       sk_CONF_VALUE_pop_free(value, X509V3_conf_free);
    733       value = NULL;
    734 
    735       if (meth->it) {
    736         ASN1_item_free(reinterpret_cast<ASN1_VALUE*>(ext_str),
    737                        ASN1_ITEM_ptr(meth->it));
    738       } else {
    739         meth->ext_free(ext_str);
    740       }
    741       ext_str = NULL;
    742     }
    743     if (ok)
    744       break;
    745   }
    746 
    747   char data[256];
    748   X509_name_st* subject;
    749   if (!ok
    750       && ((subject = X509_get_subject_name(certificate)) != NULL)
    751       && (X509_NAME_get_text_by_NID(subject, NID_commonName,
    752                                     data, sizeof(data)) > 0)) {
    753     data[sizeof(data)-1] = 0;
    754     if (_stricmp(data, host) == 0)
    755       ok = true;
    756   }
    757 
    758   X509_free(certificate);
    759 
    760   // This should only ever be turned on for debugging and development.
    761   if (!ok && ignore_bad_cert) {
    762     LOG(LS_WARNING) << "TLS certificate check FAILED.  "
    763       << "Allowing connection anyway.";
    764     ok = true;
    765   }
    766 
    767   return ok;
    768 }
    769 
    770 bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) {
    771   bool ok = VerifyServerName(ssl, host, ignore_bad_cert());
    772 
    773   if (ok) {
    774     ok = (SSL_get_verify_result(ssl) == X509_V_OK ||
    775           custom_verification_succeeded_);
    776   }
    777 
    778   if (!ok && ignore_bad_cert()) {
    779     LOG(LS_INFO) << "Other TLS post connection checks failed.";
    780     ok = true;
    781   }
    782 
    783   return ok;
    784 }
    785 
    786 #if _DEBUG
    787 
    788 // We only use this for tracing and so it is only needed in debug mode
    789 
    790 void
    791 OpenSSLAdapter::SSLInfoCallback(const SSL* s, int where, int ret) {
    792   const char* str = "undefined";
    793   int w = where & ~SSL_ST_MASK;
    794   if (w & SSL_ST_CONNECT) {
    795     str = "SSL_connect";
    796   } else if (w & SSL_ST_ACCEPT) {
    797     str = "SSL_accept";
    798   }
    799   if (where & SSL_CB_LOOP) {
    800     LOG(LS_INFO) <<  str << ":" << SSL_state_string_long(s);
    801   } else if (where & SSL_CB_ALERT) {
    802     str = (where & SSL_CB_READ) ? "read" : "write";
    803     LOG(LS_INFO) <<  "SSL3 alert " << str
    804       << ":" << SSL_alert_type_string_long(ret)
    805       << ":" << SSL_alert_desc_string_long(ret);
    806   } else if (where & SSL_CB_EXIT) {
    807     if (ret == 0) {
    808       LOG(LS_INFO) << str << ":failed in " << SSL_state_string_long(s);
    809     } else if (ret < 0) {
    810       LOG(LS_INFO) << str << ":error in " << SSL_state_string_long(s);
    811     }
    812   }
    813 }
    814 
    815 #endif  // _DEBUG
    816 
    817 int
    818 OpenSSLAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) {
    819 #if _DEBUG
    820   if (!ok) {
    821     char data[256];
    822     X509* cert = X509_STORE_CTX_get_current_cert(store);
    823     int depth = X509_STORE_CTX_get_error_depth(store);
    824     int err = X509_STORE_CTX_get_error(store);
    825 
    826     LOG(LS_INFO) << "Error with certificate at depth: " << depth;
    827     X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
    828     LOG(LS_INFO) << "  issuer  = " << data;
    829     X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
    830     LOG(LS_INFO) << "  subject = " << data;
    831     LOG(LS_INFO) << "  err     = " << err
    832       << ":" << X509_verify_cert_error_string(err);
    833   }
    834 #endif
    835 
    836   // Get our stream pointer from the store
    837   SSL* ssl = reinterpret_cast<SSL*>(
    838                 X509_STORE_CTX_get_ex_data(store,
    839                   SSL_get_ex_data_X509_STORE_CTX_idx()));
    840 
    841   OpenSSLAdapter* stream =
    842     reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl));
    843 
    844   if (!ok && custom_verify_callback_) {
    845     void* cert =
    846         reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store));
    847     if (custom_verify_callback_(cert)) {
    848       stream->custom_verification_succeeded_ = true;
    849       LOG(LS_INFO) << "validated certificate using custom callback";
    850       ok = true;
    851     }
    852   }
    853 
    854   // Should only be used for debugging and development.
    855   if (!ok && stream->ignore_bad_cert()) {
    856     LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain";
    857     ok = 1;
    858   }
    859 
    860   return ok;
    861 }
    862 
    863 bool OpenSSLAdapter::ConfigureTrustedRootCertificates(SSL_CTX* ctx) {
    864   // Add the root cert that we care about to the SSL context
    865   int count_of_added_certs = 0;
    866   for (int i = 0; i < ARRAY_SIZE(kSSLCertCertificateList); i++) {
    867     const unsigned char* cert_buffer = kSSLCertCertificateList[i];
    868     size_t cert_buffer_len = kSSLCertCertificateSizeList[i];
    869     X509* cert = d2i_X509(NULL, &cert_buffer, cert_buffer_len);
    870     if (cert) {
    871       int return_value = X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), cert);
    872       if (return_value == 0) {
    873         LOG(LS_WARNING) << "Unable to add certificate.";
    874       } else {
    875         count_of_added_certs++;
    876       }
    877       X509_free(cert);
    878     }
    879   }
    880   return count_of_added_certs > 0;
    881 }
    882 
    883 SSL_CTX*
    884 OpenSSLAdapter::SetupSSLContext() {
    885   SSL_CTX* ctx = SSL_CTX_new(TLSv1_client_method());
    886   if (ctx == NULL) {
    887     unsigned long error = ERR_get_error();  // NOLINT: type used by OpenSSL.
    888     LOG(LS_WARNING) << "SSL_CTX creation failed: "
    889                     << '"' << ERR_reason_error_string(error) << "\" "
    890                     << "(error=" << error << ')';
    891     return NULL;
    892   }
    893   if (!ConfigureTrustedRootCertificates(ctx)) {
    894     SSL_CTX_free(ctx);
    895     return NULL;
    896   }
    897 
    898 #ifdef _DEBUG
    899   SSL_CTX_set_info_callback(ctx, SSLInfoCallback);
    900 #endif
    901 
    902   SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, SSLVerifyCallback);
    903   SSL_CTX_set_verify_depth(ctx, 4);
    904   SSL_CTX_set_cipher_list(ctx, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
    905 
    906   return ctx;
    907 }
    908 
    909 } // namespace talk_base
    910 
    911 #endif  // HAVE_OPENSSL_SSL_H
    912