Skip to content

Commit 8d4396c

Browse files
committed
Support for setting the cert and key on new PeerConnection.
1 parent 919f06e commit 8d4396c

File tree

5 files changed

+75
-2
lines changed

5 files changed

+75
-2
lines changed

include/rtc/configuration.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ struct RTC_CPP_EXPORT Configuration {
8787

8888
// Local maximum message size for Data Channels
8989
optional<size_t> maxMessageSize;
90+
91+
// Certificates and private keys
92+
optional<string> certPem;
93+
optional<string> keyPem;
9094
};
9195

9296
#ifdef RTC_ENABLE_WEBSOCKET

src/impl/peerconnection.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,17 @@ static LogCounter
4545
"Number of unknown RTCP packet types over past second");
4646

4747
PeerConnection::PeerConnection(Configuration config_)
48-
: config(std::move(config_)), mCertificate(make_certificate(config.certificateType)) {
48+
: config(std::move(config_)) {
4949
PLOG_VERBOSE << "Creating PeerConnection";
5050

51+
if( config.certPem.has_value() && config.keyPem.has_value() ) {
52+
std::promise<certificate_ptr> cert;
53+
cert.set_value(std::make_shared<Certificate>(Certificate::FromString(config.certPem.value(), config.keyPem.value())));
54+
mCertificate = cert.get_future();
55+
} else {
56+
mCertificate = make_certificate(config.certificateType);
57+
}
58+
5159
if (config.portRangeEnd && config.portRangeBegin > config.portRangeEnd)
5260
throw std::invalid_argument("Invalid port range");
5361

src/impl/peerconnection.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ struct PeerConnection : std::enable_shared_from_this<PeerConnection> {
131131
void updateTrackSsrcCache(const Description &description);
132132

133133
const init_token mInitToken = Init::Instance().token();
134-
const future_certificate_ptr mCertificate;
134+
future_certificate_ptr mCertificate;
135135

136136
Processor mProcessor;
137137
optional<Description> mLocalDescription, mRemoteDescription;

test/connectivity.cpp

+52
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,55 @@ void test_connectivity(bool signal_wrong_fingerprint) {
263263

264264
cout << "Success" << endl;
265265
}
266+
267+
const char* key_pem =
268+
"-----BEGIN PRIVATE KEY-----\n"
269+
"MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3bbuT2SjSlMZH/J1\n"
270+
"vHwmF0Blb/DBc/v7f1Za9GPUXHmhRANCAATDpmYxZozjVw6xlERNjJJGgfY3bEmj\n"
271+
"xAKFRq3nbxbDHvMEs34u9HntMZWJ0hp3GUC+Ax7JHTv3cYqSaAg2SpR4\n"
272+
"-----END PRIVATE KEY-----\n";
273+
274+
const char* cert_pem =
275+
"-----BEGIN CERTIFICATE-----\n"
276+
"MIIBgjCCASigAwIBAgIJAPMXEoZXOaDEMAoGCCqGSM49BAMCMEoxDzANBgNVBAMM\n"
277+
"BmNhLmNvbTELMAkGA1UEBhMCVVMxCzAJBgNVBAcMAkNBMRAwDgYDVQQKDAdleGFt\n"
278+
"cGxlMQswCQYDVQQIDAJDQTAeFw0yNDA1MDUxNjAzMjFaFw0yNDA4MTMxNjAzMjFa\n"
279+
"MDExCzAJBgNVBAYTAkNOMRAwDgYDVQQKDAdiYW96LmNuMRAwDgYDVQQDDAdiYW96\n"
280+
"Lm1lMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEw6ZmMWaM41cOsZRETYySRoH2\n"
281+
"N2xJo8QChUat528Wwx7zBLN+LvR57TGVidIadxlAvgMeyR0793GKkmgINkqUeKMQ\n"
282+
"MA4wDAYDVR0TAQH/BAIwADAKBggqhkjOPQQDAgNIADBFAiAPNldqGJHryfjPFyX3\n"
283+
"zfHHWlO7xSDTzdyoxzroFdwy+gIhAKmZizEVvDlBiIe+3ptCArU3dbp+bzLynTcr\n"
284+
"Ma9ayzQy\n"
285+
"-----END CERTIFICATE-----\n";
286+
287+
void test_pem() {
288+
InitLogger(LogLevel::Debug);
289+
290+
Configuration config1;
291+
292+
config1.certPem = cert_pem;
293+
config1.keyPem = key_pem;
294+
295+
PeerConnection pc1(config1);
296+
atomic_bool done;
297+
string f;
298+
299+
pc1.onLocalDescription([&done, &f](Description sdp) {
300+
f = sdp.fingerprint().value().value;
301+
done = true;
302+
});
303+
304+
auto dc1 = pc1.createDataChannel("test");
305+
306+
// Wait a bit
307+
int attempts = 10;
308+
while (!done && attempts--)
309+
this_thread::sleep_for(1s);
310+
311+
cout << "Fingerprint: " << f << endl;
312+
313+
if (f != "07:E5:6F:2A:1A:0C:2C:32:0E:C1:C3:9C:34:5A:78:4E:A5:8B:32:05:D1:57:D6:F4:E7:02:41:12:E6:01:C6:8F")
314+
throw runtime_error("The fingerprint of the specified certificate do not match");
315+
316+
cout << "Success" << endl;
317+
}

test/main.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ using namespace std;
1616
using namespace chrono_literals;
1717

1818
void test_connectivity(bool signal_wrong_fingerprint);
19+
void test_pem();
1920
void test_negotiated();
2021
void test_reliability();
2122
void test_turn_connectivity();
@@ -56,6 +57,14 @@ int main(int argc, char **argv) {
5657
} catch (const exception &) {
5758
}
5859

60+
try {
61+
cout << endl << "*** Running pem test..." << endl;
62+
test_pem();
63+
} catch (const exception &e) {
64+
cerr << "pem test failed: " << e.what() << endl;
65+
return -1;
66+
}
67+
5968
// TODO: Temporarily disabled as the Open Relay TURN server is unreliable
6069
/*
6170
try {

0 commit comments

Comments
 (0)