wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 1 | /* |
kjellander | b24317b | 2016-02-10 07:54:43 -0800 | [diff] [blame] | 2 | * Copyright 2013 The WebRTC project authors. All Rights Reserved. |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 3 | * |
kjellander | b24317b | 2016-02-10 07:54:43 -0800 | [diff] [blame] | 4 | * Use of this source code is governed by a BSD-style license |
| 5 | * that can be found in the LICENSE file in the root of the source |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 9 | */ |
| 10 | |
Henrik Kjellander | 15583c1 | 2016-02-10 10:53:12 +0100 | [diff] [blame] | 11 | #ifndef WEBRTC_API_TEST_FAKEDTLSIDENTITYSERVICE_H_ |
| 12 | #define WEBRTC_API_TEST_FAKEDTLSIDENTITYSERVICE_H_ |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 13 | |
jbauch | 555604a | 2016-04-26 03:13:22 -0700 | [diff] [blame] | 14 | #include <memory> |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 15 | #include <string> |
kwiberg | 0eb15ed | 2015-12-17 03:04:15 -0800 | [diff] [blame] | 16 | #include <utility> |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 17 | |
Henrik Kjellander | 15583c1 | 2016-02-10 10:53:12 +0100 | [diff] [blame] | 18 | #include "webrtc/api/dtlsidentitystore.h" |
| 19 | #include "webrtc/api/peerconnectioninterface.h" |
Henrik Boström | 87713d0 | 2015-08-25 09:53:21 +0200 | [diff] [blame] | 20 | #include "webrtc/base/rtccertificate.h" |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 21 | |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 22 | static const struct { |
| 23 | const char* rsa_private_key_pem; |
| 24 | const char* cert_pem; |
| 25 | } kKeysAndCerts[] = { |
| 26 | {"-----BEGIN RSA PRIVATE KEY-----\n" |
| 27 | "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n" |
| 28 | "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n" |
| 29 | "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n" |
| 30 | "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n" |
| 31 | "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n" |
| 32 | "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n" |
| 33 | "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n" |
| 34 | "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n" |
| 35 | "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n" |
| 36 | "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n" |
| 37 | "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n" |
| 38 | "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n" |
| 39 | "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n" |
| 40 | "UCXiYxSsu20QNVw=\n" |
| 41 | "-----END RSA PRIVATE KEY-----\n", |
| 42 | "-----BEGIN CERTIFICATE-----\n" |
| 43 | "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n" |
| 44 | "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n" |
| 45 | "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n" |
| 46 | "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n" |
| 47 | "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n" |
| 48 | "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n" |
| 49 | "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n" |
| 50 | "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n" |
| 51 | "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n" |
| 52 | "-----END CERTIFICATE-----\n"}, |
| 53 | {"-----BEGIN RSA PRIVATE KEY-----\n" |
| 54 | "MIICXQIBAAKBgQDeYqlyJ1wuiMsi905e3X81/WA/G3ym50PIDZBVtSwZi7JVQPgj\n" |
| 55 | "Bl8CPZMvDh9EwB4Ji9ytA8dZZbQ4WbJWPr73zPpJSCvQqz6sOXSlenBRi72acNaQ\n" |
| 56 | "sOR/qPvviJx5I6Hqo4qemfnjZhAW85a5BpgrAwKgMLIQTHCTLWwVSyrDrwIDAQAB\n" |
| 57 | "AoGARni9eY8/hv+SX+I+05EdXt6MQXNUbQ+cSykBNCfVccLzIFEWUQMT2IHqwl6X\n" |
| 58 | "ShIXcq7/n1QzOAEiuzixauM3YHg4xZ1Um2Ha9a7ig5Xg4v6b43bmMkNE6LkoAtYs\n" |
| 59 | "qnQdfMh442b1liDud6IMb1Qk0amt3fSrgRMc547TZQVx4QECQQDxUeDm94r3p4ng\n" |
| 60 | "5rCLLC1K5/6HSTZsh7jatKPlz7GfP/IZlYV7iE5784/n0wRiCjZOS7hQRy/8m2Gp\n" |
| 61 | "pf4aZq+DAkEA6+np4d36FYikydvUrupLT3FkdRHGn/v83qOll/VmeNh+L1xMZlIP\n" |
| 62 | "tM26hAXCcQb7O5+J9y3cx2CAQsBS11ZXZQJAfGgTo76WG9p5UEJdXUInD2jOZPwv\n" |
| 63 | "XIATolxh6kXKcijLLLlSmT7KB0inNYIpzkkpee+7U1d/u6B3FriGaSHq9QJBAM/J\n" |
| 64 | "ICnDdLCgwNvWVraVQC3BpwSB2pswvCFwq7py94V60XFvbw80Ogc6qIv98qvQxVlX\n" |
| 65 | "hJIEgA/PjEi+0ng94Q0CQQDm8XSDby35gmjO+6eRmJtAjtB7nguLvrPXM6CPXRmD\n" |
| 66 | "sRoBocpHw6j9UdzZ6qYG0FkdXZghezXFY58ro2BYYRR3\n" |
| 67 | "-----END RSA PRIVATE KEY-----\n", |
| 68 | "-----BEGIN CERTIFICATE-----\n" |
| 69 | "MIICWDCCAcGgAwIBAgIJALgDjxMbBOhbMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\n" |
| 70 | "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" |
| 71 | "aWRnaXRzIFB0eSBMdGQwHhcNMTUxMTEzMjIzMjEzWhcNMTYxMTEyMjIzMjEzWjBF\n" |
| 72 | "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n" |
| 73 | "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" |
| 74 | "gQDeYqlyJ1wuiMsi905e3X81/WA/G3ym50PIDZBVtSwZi7JVQPgjBl8CPZMvDh9E\n" |
| 75 | "wB4Ji9ytA8dZZbQ4WbJWPr73zPpJSCvQqz6sOXSlenBRi72acNaQsOR/qPvviJx5\n" |
| 76 | "I6Hqo4qemfnjZhAW85a5BpgrAwKgMLIQTHCTLWwVSyrDrwIDAQABo1AwTjAdBgNV\n" |
| 77 | "HQ4EFgQUx2tbJdlcSTCepn09UdYORXKuSTAwHwYDVR0jBBgwFoAUx2tbJdlcSTCe\n" |
| 78 | "pn09UdYORXKuSTAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAmp9Id\n" |
| 79 | "E716gHMqeBG4S2FCgVFCr0a0ugkaneQAN/c2L9CbMemEN9W6jvucUIVOtYd90dDW\n" |
| 80 | "lXuowWmT/JctPe3D2qt4yvYW3puECHk2tVQmrJOZiZiTRtWm6HxkmoUYHYp/DtaS\n" |
| 81 | "1Xe29gSTnZtI5sQCrGMzk3SGRSSs7ejLKiVDBQ==\n" |
| 82 | "-----END CERTIFICATE-----\n"}}; |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 83 | |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 84 | class FakeDtlsIdentityStore : public webrtc::DtlsIdentityStoreInterface, |
| 85 | public rtc::MessageHandler { |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 86 | public: |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 87 | typedef rtc::TypedMessageData<rtc::scoped_refptr< |
| 88 | webrtc::DtlsIdentityRequestObserver> > MessageData; |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 89 | |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 90 | FakeDtlsIdentityStore() : should_fail_(false) {} |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 91 | |
| 92 | void set_should_fail(bool should_fail) { |
| 93 | should_fail_ = should_fail; |
| 94 | } |
| 95 | |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 96 | void use_original_key() { key_index_ = 0; } |
| 97 | void use_alternate_key() { key_index_ = 1; } |
| 98 | |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 99 | void RequestIdentity( |
hbos | 5291393 | 2016-03-07 15:14:40 -0800 | [diff] [blame] | 100 | const rtc::KeyParams& key_params, |
| 101 | const rtc::Optional<uint64_t>& expires_ms, |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 102 | const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& |
| 103 | observer) override { |
| 104 | // TODO(hbos): Should be able to generate KT_ECDSA too. |
hbos | 25359e0 | 2016-03-02 07:55:53 -0800 | [diff] [blame] | 105 | RTC_DCHECK((key_params.type() == rtc::KT_RSA && |
| 106 | key_params.rsa_params().mod_size == 1024 && |
hbos | 5291393 | 2016-03-07 15:14:40 -0800 | [diff] [blame] | 107 | key_params.rsa_params().pub_exp == 0x10001 && |
| 108 | !expires_ms) || |
hbos | 25359e0 | 2016-03-02 07:55:53 -0800 | [diff] [blame] | 109 | should_fail_); |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 110 | MessageData* msg = new MessageData( |
| 111 | rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>(observer)); |
| 112 | rtc::Thread::Current()->Post( |
| 113 | this, should_fail_ ? MSG_FAILURE : MSG_SUCCESS, msg); |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 114 | } |
| 115 | |
Henrik Boström | 87713d0 | 2015-08-25 09:53:21 +0200 | [diff] [blame] | 116 | static rtc::scoped_refptr<rtc::RTCCertificate> GenerateCertificate() { |
| 117 | std::string cert; |
| 118 | std::string key; |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 119 | rtc::SSLIdentity::PemToDer("CERTIFICATE", kKeysAndCerts[0].cert_pem, &cert); |
| 120 | rtc::SSLIdentity::PemToDer("RSA PRIVATE KEY", |
| 121 | kKeysAndCerts[0].rsa_private_key_pem, &key); |
Henrik Boström | 87713d0 | 2015-08-25 09:53:21 +0200 | [diff] [blame] | 122 | |
| 123 | std::string pem_cert = rtc::SSLIdentity::DerToPem( |
| 124 | rtc::kPemTypeCertificate, |
| 125 | reinterpret_cast<const unsigned char*>(cert.data()), |
| 126 | cert.length()); |
| 127 | std::string pem_key = rtc::SSLIdentity::DerToPem( |
| 128 | rtc::kPemTypeRsaPrivateKey, |
| 129 | reinterpret_cast<const unsigned char*>(key.data()), |
| 130 | key.length()); |
jbauch | 555604a | 2016-04-26 03:13:22 -0700 | [diff] [blame] | 131 | std::unique_ptr<rtc::SSLIdentity> identity( |
Henrik Boström | 87713d0 | 2015-08-25 09:53:21 +0200 | [diff] [blame] | 132 | rtc::SSLIdentity::FromPEMStrings(pem_key, pem_cert)); |
| 133 | |
kwiberg | 0eb15ed | 2015-12-17 03:04:15 -0800 | [diff] [blame] | 134 | return rtc::RTCCertificate::Create(std::move(identity)); |
Henrik Boström | 87713d0 | 2015-08-25 09:53:21 +0200 | [diff] [blame] | 135 | } |
| 136 | |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 137 | private: |
| 138 | enum { |
| 139 | MSG_SUCCESS, |
| 140 | MSG_FAILURE, |
| 141 | }; |
| 142 | |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 143 | const char* get_key() { |
| 144 | return kKeysAndCerts[key_index_].rsa_private_key_pem; |
| 145 | } |
| 146 | const char* get_cert() { return kKeysAndCerts[key_index_].cert_pem; } |
| 147 | |
buildbot@webrtc.org | d4e598d | 2014-07-29 17:36:52 +0000 | [diff] [blame] | 148 | // rtc::MessageHandler implementation. |
nisse | ef8b61e | 2016-04-29 06:09:15 -0700 | [diff] [blame] | 149 | void OnMessage(rtc::Message* msg) override { |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 150 | MessageData* message_data = static_cast<MessageData*>(msg->pdata); |
| 151 | rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver> observer = |
| 152 | message_data->data(); |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 153 | switch (msg->message_id) { |
| 154 | case MSG_SUCCESS: { |
Henrik Boström | 5e56c59 | 2015-08-11 10:33:13 +0200 | [diff] [blame] | 155 | std::string cert; |
| 156 | std::string key; |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 157 | rtc::SSLIdentity::PemToDer("CERTIFICATE", get_cert(), &cert); |
| 158 | rtc::SSLIdentity::PemToDer("RSA PRIVATE KEY", get_key(), &key); |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 159 | observer->OnSuccess(cert, key); |
| 160 | break; |
| 161 | } |
| 162 | case MSG_FAILURE: |
| 163 | observer->OnFailure(0); |
| 164 | break; |
| 165 | } |
wu@webrtc.org | 822fbd8 | 2013-08-15 23:38:54 +0000 | [diff] [blame] | 166 | delete message_data; |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 167 | } |
| 168 | |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 169 | bool should_fail_; |
Guo-wei Shieh | 1218d7a | 2015-12-05 09:59:56 -0800 | [diff] [blame] | 170 | int key_index_ = 0; |
wu@webrtc.org | 91053e7 | 2013-08-10 07:18:04 +0000 | [diff] [blame] | 171 | }; |
| 172 | |
Henrik Kjellander | 15583c1 | 2016-02-10 10:53:12 +0100 | [diff] [blame] | 173 | #endif // WEBRTC_API_TEST_FAKEDTLSIDENTITYSERVICE_H_ |