Skip to content

Commit

Permalink
Merge branch 'paullouisageneau:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
evaldemar authored May 31, 2024
2 parents 063baba + 541d646 commit 618dbd2
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 30 deletions.
4 changes: 2 additions & 2 deletions examples/copy-paste-capi/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ else()
endif()

set_target_properties(datachannel-copy-paste-capi-offerer PROPERTIES
OUTPUT_NAME offerer)
OUTPUT_NAME offerer-capi)

set_target_properties(datachannel-copy-paste-capi-offerer PROPERTIES
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER com.github.paullouisageneau.libdatachannel.examples.copypaste.capi.offerer)
Expand All @@ -44,7 +44,7 @@ else()
endif()

set_target_properties(datachannel-copy-paste-capi-answerer PROPERTIES
OUTPUT_NAME answerer)
OUTPUT_NAME answerer-capi)

set_target_properties(datachannel-copy-paste-capi-answerer PROPERTIES
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER com.github.paullouisageneau.libdatachannel.examples.copypaste.capi.answerer)
Expand Down
31 changes: 17 additions & 14 deletions src/description.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,12 +310,6 @@ string Description::generateSdp(string_view eol) const {

// Session-level attributes
sdp << "a=msid-semantic:WMS *" << eol;
sdp << "a=setup:" << mRole << eol;

if (mIceUfrag)
sdp << "a=ice-ufrag:" << *mIceUfrag << eol;
if (mIcePwd)
sdp << "a=ice-pwd:" << *mIcePwd << eol;
if (!mIceOptions.empty())
sdp << "a=ice-options:" << utils::implode(mIceOptions, ',') << eol;
if (mFingerprint)
Expand All @@ -339,6 +333,14 @@ string Description::generateSdp(string_view eol) const {
for (const auto &entry : mEntries) {
sdp << entry->generateSdp(eol, addr, port);

// RFC 8829: Attributes that SDP permits to be at either the session level or the media level
// SHOULD generally be at the media level even if they are identical.
sdp << "a=setup:" << mRole << eol;
if (mIceUfrag)
sdp << "a=ice-ufrag:" << *mIceUfrag << eol;
if (mIcePwd)
sdp << "a=ice-pwd:" << *mIcePwd << eol;

if (!entry->isRemoved() && std::exchange(first, false)) {
// Candidates
for (const auto &candidate : mCandidates)
Expand Down Expand Up @@ -369,28 +371,29 @@ string Description::generateApplicationSdp(string_view eol) const {
const uint16_t port =
cand && cand->isResolved() ? *cand->port() : 9; // Port 9 is the discard protocol

// Session-level attributes
sdp << "a=msid-semantic:WMS *" << eol;
if (!mIceOptions.empty())
sdp << "a=ice-options:" << utils::implode(mIceOptions, ',') << eol;

for (const auto &attr : mAttributes)
sdp << "a=" << attr << eol;

// Application
auto app = mApplication ? mApplication : std::make_shared<Application>();
sdp << app->generateSdp(eol, addr, port);

// Session-level attributes
sdp << "a=msid-semantic:WMS *" << eol;
// Media-level attributes
sdp << "a=setup:" << mRole << eol;

if (mIceUfrag)
sdp << "a=ice-ufrag:" << *mIceUfrag << eol;
if (mIcePwd)
sdp << "a=ice-pwd:" << *mIcePwd << eol;
if (!mIceOptions.empty())
sdp << "a=ice-options:" << utils::implode(mIceOptions, ',') << eol;
if (mFingerprint)
sdp << "a=fingerprint:"
<< CertificateFingerprint::AlgorithmIdentifier(mFingerprint->algorithm) << " "
<< mFingerprint->value << eol;

for (const auto &attr : mAttributes)
sdp << "a=" << attr << eol;

// Candidates
for (const auto &candidate : mCandidates)
sdp << string(candidate) << eol;
Expand Down
40 changes: 32 additions & 8 deletions src/impl/certificate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "certificate.hpp"
#include "threadpool.hpp"

#include <algorithm>
#include <cassert>
#include <chrono>
#include <iomanip>
Expand Down Expand Up @@ -384,9 +385,16 @@ Certificate Certificate::FromString(string crt_pem, string key_pem) {
BIO *bio = BIO_new(BIO_s_mem());
BIO_write(bio, crt_pem.data(), int(crt_pem.size()));
auto x509 = shared_ptr<X509>(PEM_read_bio_X509(bio, nullptr, nullptr, nullptr), X509_free);
BIO_free(bio);
if (!x509)
if (!x509) {
BIO_free(bio);
throw std::invalid_argument("Unable to import PEM certificate");
}
std::vector<shared_ptr<X509>> chain;
while (auto extra =
shared_ptr<X509>(PEM_read_bio_X509(bio, nullptr, nullptr, nullptr), X509_free)) {
chain.push_back(std::move(extra));
}
BIO_free(bio);

bio = BIO_new(BIO_s_mem());
BIO_write(bio, key_pem.data(), int(key_pem.size()));
Expand All @@ -396,7 +404,7 @@ Certificate Certificate::FromString(string crt_pem, string key_pem) {
if (!pkey)
throw std::invalid_argument("Unable to import PEM key");

return Certificate(x509, pkey);
return Certificate(x509, pkey, std::move(chain));
}

Certificate Certificate::FromFile(const string &crt_pem_file, const string &key_pem_file,
Expand All @@ -408,9 +416,16 @@ Certificate Certificate::FromFile(const string &crt_pem_file, const string &key_
throw std::invalid_argument("Unable to open PEM certificate file");

auto x509 = shared_ptr<X509>(PEM_read_bio_X509(bio, nullptr, nullptr, nullptr), X509_free);
BIO_free(bio);
if (!x509)
if (!x509) {
BIO_free(bio);
throw std::invalid_argument("Unable to import PEM certificate from file");
}
std::vector<shared_ptr<X509>> chain;
while (auto extra =
shared_ptr<X509>(PEM_read_bio_X509(bio, nullptr, nullptr, nullptr), X509_free)) {
chain.push_back(std::move(extra));
}
BIO_free(bio);

bio = openssl::BIO_new_from_file(key_pem_file);
if (!bio)
Expand All @@ -423,7 +438,7 @@ Certificate Certificate::FromFile(const string &crt_pem_file, const string &key_
if (!pkey)
throw std::invalid_argument("Unable to import PEM key from file");

return Certificate(x509, pkey);
return Certificate(x509, pkey, std::move(chain));
}

Certificate Certificate::Generate(CertificateType type, const string &commonName) {
Expand Down Expand Up @@ -514,14 +529,23 @@ Certificate Certificate::Generate(CertificateType type, const string &commonName
return Certificate(x509, pkey);
}

Certificate::Certificate(shared_ptr<X509> x509, shared_ptr<EVP_PKEY> pkey)
: mX509(std::move(x509)), mPKey(std::move(pkey)),
Certificate::Certificate(shared_ptr<X509> x509, shared_ptr<EVP_PKEY> pkey,
std::vector<shared_ptr<X509>> chain)
: mX509(std::move(x509)), mPKey(std::move(pkey)), mChain(std::move(chain)),
mFingerprint(make_fingerprint(mX509.get(), CertificateFingerprint::Algorithm::Sha256)) {}

std::tuple<X509 *, EVP_PKEY *> Certificate::credentials() const {
return {mX509.get(), mPKey.get()};
}

std::vector<X509 *> Certificate::chain() const {
std::vector<X509 *> v;
v.reserve(mChain.size());
std::transform(mChain.begin(), mChain.end(), std::back_inserter(v),
[](const auto &c) { return c.get(); });
return v;
}

string make_fingerprint(X509 *x509, CertificateFingerprint::Algorithm fingerprintAlgorithm) {
size_t size = CertificateFingerprint::AlgorithmSize(fingerprintAlgorithm);
std::vector<unsigned char> buffer(size);
Expand Down
4 changes: 3 additions & 1 deletion src/impl/certificate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ class Certificate {
Certificate(shared_ptr<mbedtls_x509_crt> crt, shared_ptr<mbedtls_pk_context> pk);
std::tuple<shared_ptr<mbedtls_x509_crt>, shared_ptr<mbedtls_pk_context>> credentials() const;
#else // OPENSSL
Certificate(shared_ptr<X509> x509, shared_ptr<EVP_PKEY> pkey);
Certificate(shared_ptr<X509> x509, shared_ptr<EVP_PKEY> pkey, std::vector<shared_ptr<X509>> chain = {});
std::tuple<X509 *, EVP_PKEY *> credentials() const;
std::vector<X509 *> chain() const;
#endif

CertificateFingerprint fingerprint() const;
Expand All @@ -52,6 +53,7 @@ class Certificate {
#else
const shared_ptr<X509> mX509;
const shared_ptr<EVP_PKEY> mPKey;
const std::vector<shared_ptr<X509>> mChain;
#endif

const string mFingerprint;
Expand Down
5 changes: 0 additions & 5 deletions src/impl/peerconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -879,11 +879,6 @@ void PeerConnection::validateRemoteDescription(const Description &description) {
if (activeMediaCount == 0)
throw std::invalid_argument("Remote description has no active media");

if (auto local = localDescription(); local && local->iceUfrag() && local->icePwd())
if (*description.iceUfrag() == *local->iceUfrag() &&
*description.icePwd() == *local->icePwd())
throw std::logic_error("Got the local description as remote description");

PLOG_VERBOSE << "Remote description looks valid";
}

Expand Down
3 changes: 3 additions & 0 deletions src/impl/tlstransport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,9 @@ TlsTransport::TlsTransport(variant<shared_ptr<TcpTransport>, shared_ptr<HttpProx
auto [x509, pkey] = certificate->credentials();
SSL_CTX_use_certificate(mCtx, x509);
SSL_CTX_use_PrivateKey(mCtx, pkey);

for (auto c : certificate->chain())
SSL_CTX_add1_chain_cert(mCtx, c); // add1 increments reference count
}

SSL_CTX_set_options(mCtx, SSL_OP_NO_SSLv3 | SSL_OP_NO_RENEGOTIATION);
Expand Down

0 comments on commit 618dbd2

Please sign in to comment.