Home | History | Annotate | Download | only in test
      1 /*
      2  * libjingle
      3  * Copyright 2013, 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 
     29 #ifndef TALK_APP_WEBRTC_TEST_FAKEDTLSIDENTITYSERVICE_H_
     30 #define TALK_APP_WEBRTC_TEST_FAKEDTLSIDENTITYSERVICE_H_
     31 
     32 #include "talk/app/webrtc/peerconnectioninterface.h"
     33 
     34 static const char kRSA_PRIVATE_KEY_PEM[] =
     35     "-----BEGIN RSA PRIVATE KEY-----\n"
     36     "MIICXQIBAAKBgQDCueE4a9hDMZ3sbVZdlXOz9ZA+cvzie3zJ9gXnT/BCt9P4b9HE\n"
     37     "vD/tr73YBqD3Wr5ZWScmyGYF9EMn0r3rzBxv6oooLU5TdUvOm4rzUjkCLQaQML8o\n"
     38     "NxXq+qW/j3zUKGikLhaaAl/amaX2zSWUsRQ1CpngQ3+tmDNH4/25TncNmQIDAQAB\n"
     39     "AoGAUcuU0Id0k10fMjYHZk4mCPzot2LD2Tr4Aznl5vFMQipHzv7hhZtx2xzMSRcX\n"
     40     "vG+Qr6VkbcUWHgApyWubvZXCh3+N7Vo2aYdMAQ8XqmFpBdIrL5CVdVfqFfEMlgEy\n"
     41     "LSZNG5klnrIfl3c7zQVovLr4eMqyl2oGfAqPQz75+fecv1UCQQD6wNHch9NbAG1q\n"
     42     "yuFEhMARB6gDXb+5SdzFjjtTWW5uJfm4DcZLoYyaIZm0uxOwsUKd0Rsma+oGitS1\n"
     43     "CXmuqfpPAkEAxszyN3vIdpD44SREEtyKZBMNOk5pEIIGdbeMJC5/XHvpxww9xkoC\n"
     44     "+39NbvUZYd54uT+rafbx4QZKc0h9xA/HlwJBAL37lYVWy4XpPv1olWCKi9LbUCqs\n"
     45     "vvQtyD1N1BkEayy9TQRsO09WKOcmigRqsTJwOx7DLaTgokEuspYvhagWVPUCQE/y\n"
     46     "0+YkTbYBD1Xbs9SyBKXCU6uDJRWSdO6aZi2W1XloC9gUwDMiSJjD1Wwt/YsyYPJ+\n"
     47     "/Hyc5yFL2l0KZimW/vkCQQCjuZ/lPcH46EuzhdbRfumDOG5N3ld7UhGI1TIRy17W\n"
     48     "dGF90cG33/L6BfS8Ll+fkkW/2AMRk8FDvF4CZi2nfW4L\n"
     49     "-----END RSA PRIVATE KEY-----\n";
     50 
     51 static const char kCERT_PEM[] =
     52     "-----BEGIN CERTIFICATE-----\n"
     53     "MIIBmTCCAQICCQCPNJORW/M13DANBgkqhkiG9w0BAQUFADARMQ8wDQYDVQQDDAZ3\n"
     54     "ZWJydGMwHhcNMTMwNjE0MjIzMDAxWhcNMTQwNjE0MjIzMDAxWjARMQ8wDQYDVQQD\n"
     55     "DAZ3ZWJydGMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMK54Thr2EMxnext\n"
     56     "Vl2Vc7P1kD5y/OJ7fMn2BedP8EK30/hv0cS8P+2vvdgGoPdavllZJybIZgX0QyfS\n"
     57     "vevMHG/qiigtTlN1S86bivNSOQItBpAwvyg3Fer6pb+PfNQoaKQuFpoCX9qZpfbN\n"
     58     "JZSxFDUKmeBDf62YM0fj/blOdw2ZAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAECMt\n"
     59     "UZb35H8TnjGx4XPzco/kbnurMLFFWcuve/DwTsuf10Ia9N4md8LY0UtgIgtyNqWc\n"
     60     "ZwyRMwxONF6ty3wcaIiPbGqiAa55T3YRuPibkRmck9CjrmM9JAtyvqHnpHd2TsBD\n"
     61     "qCV42aXS3onOXDQ1ibuWq0fr0//aj0wo4KV474c=\n"
     62     "-----END CERTIFICATE-----\n";
     63 
     64 using webrtc::DTLSIdentityRequestObserver;
     65 
     66 class FakeIdentityService : public webrtc::DTLSIdentityServiceInterface,
     67                             public talk_base::MessageHandler {
     68  public:
     69   struct Request {
     70     Request(const std::string& common_name,
     71             DTLSIdentityRequestObserver* observer)
     72         : common_name(common_name), observer(observer) {}
     73 
     74     std::string common_name;
     75     talk_base::scoped_refptr<DTLSIdentityRequestObserver> observer;
     76   };
     77   typedef talk_base::TypedMessageData<Request> MessageData;
     78 
     79   FakeIdentityService() : should_fail_(false) {}
     80 
     81   void set_should_fail(bool should_fail) {
     82     should_fail_ = should_fail;
     83   }
     84 
     85   // DTLSIdentityServiceInterface implemenation.
     86   virtual bool RequestIdentity(const std::string& identity_name,
     87                                const std::string& common_name,
     88                                DTLSIdentityRequestObserver* observer) {
     89     MessageData* msg = new MessageData(Request(common_name, observer));
     90     if (should_fail_) {
     91       talk_base::Thread::Current()->Post(this, MSG_FAILURE, msg);
     92     } else {
     93       talk_base::Thread::Current()->Post(this, MSG_SUCCESS, msg);
     94     }
     95     return true;
     96   }
     97 
     98  private:
     99   enum {
    100     MSG_SUCCESS,
    101     MSG_FAILURE,
    102   };
    103 
    104   // talk_base::MessageHandler implementation.
    105   void OnMessage(talk_base::Message* msg) {
    106     FakeIdentityService::MessageData* message_data =
    107         static_cast<FakeIdentityService::MessageData*>(msg->pdata);
    108     DTLSIdentityRequestObserver* observer = message_data->data().observer.get();
    109     switch (msg->message_id) {
    110       case MSG_SUCCESS: {
    111         std::string cert, key;
    112         GenerateIdentity(message_data->data().common_name, &cert, &key);
    113         observer->OnSuccess(cert, key);
    114         break;
    115       }
    116       case MSG_FAILURE:
    117         observer->OnFailure(0);
    118         break;
    119     }
    120   }
    121 
    122   void GenerateIdentity(
    123       const std::string& common_name,
    124       std::string* der_cert,
    125       std::string* der_key) {
    126     talk_base::SSLIdentity::PemToDer("CERTIFICATE", kCERT_PEM, der_cert);
    127     talk_base::SSLIdentity::PemToDer("RSA PRIVATE KEY",
    128                                      kRSA_PRIVATE_KEY_PEM,
    129                                      der_key);
    130   }
    131 
    132   bool should_fail_;
    133 };
    134 
    135 #endif  // TALK_APP_WEBRTC_TEST_FAKEDTLSIDENTITYSERVICE_H_
    136