Skip to content

feat: add frame encryptor/decryptor interface. #46

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 49 commits into from
Apr 25, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
29e7fff
feat: add frame encryptor/decryptor interface.
cloudwebrtc Sep 19, 2022
c9fa341
chore: add crypto class.
cloudwebrtc Sep 27, 2022
5e861d2
update.
cloudwebrtc Nov 17, 2022
8a72f8c
chore: add aes-256-gcm.
cloudwebrtc Nov 18, 2022
ff610e2
chore: cleanup.
cloudwebrtc Nov 18, 2022
1f8c943
update.
cloudwebrtc Nov 21, 2022
a007e76
chore: fill iv correctly.
cloudwebrtc Nov 21, 2022
4a86c5b
chore: New aes algorithm, compatible with webcrypto.
cloudwebrtc Nov 25, 2022
7faa1f2
chore: Remove FrameCryptor interface export.
cloudwebrtc Nov 28, 2022
7a090de
update.
cloudwebrtc Nov 28, 2022
ee7add8
update.
cloudwebrtc Dec 5, 2022
ef3ca8d
update.
cloudwebrtc Dec 9, 2022
db97425
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Dec 9, 2022
2a2f3bc
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Dec 9, 2022
bac087d
add KeyManager.
cloudwebrtc Dec 9, 2022
d9a3693
update.
cloudwebrtc Dec 9, 2022
ced81e6
update.
cloudwebrtc Dec 9, 2022
08685eb
fix compile.
cloudwebrtc Dec 11, 2022
e498b4a
update.
cloudwebrtc Dec 13, 2022
c92f25c
fix typo.
cloudwebrtc Dec 13, 2022
1369cb4
update.
cloudwebrtc Dec 13, 2022
fc4bbc6
update.
cloudwebrtc Dec 13, 2022
25b9483
fix crash for copy rtp params.
cloudwebrtc Dec 13, 2022
ce9ed12
fix bug
cloudwebrtc Dec 13, 2022
65eef62
Add participant_id.
cloudwebrtc Dec 13, 2022
94f9853
update.
cloudwebrtc Dec 14, 2022
e1fd06b
update.
cloudwebrtc Dec 19, 2022
bf5f7f9
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Feb 1, 2023
d179f85
fix compile error.
cloudwebrtc Feb 1, 2023
9517a06
framecryptor state callback.
cloudwebrtc Feb 4, 2023
2c445a4
fix crash.
cloudwebrtc Feb 5, 2023
5e7ac5a
update.
cloudwebrtc Feb 6, 2023
e624e8d
update.
cloudwebrtc Feb 8, 2023
2939559
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Feb 17, 2023
4e26a1d
update.
cloudwebrtc Feb 20, 2023
1c7c283
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Feb 23, 2023
285f886
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Feb 24, 2023
4e2ead7
update.
cloudwebrtc Mar 27, 2023
1a0ee8c
Merge branch 'master' into feat/frame-encryptor-interface
Mar 27, 2023
01e69a5
chore: add kKeyRatcheted state.
cloudwebrtc Mar 28, 2023
673fd6c
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Mar 28, 2023
683fe43
chore: revert changes.
cloudwebrtc Mar 29, 2023
164b39e
chore: clang-format.
cloudwebrtc Mar 29, 2023
1ed2029
update.
cloudwebrtc Apr 24, 2023
45eec5d
rename KeyManager to KeyProvider.
cloudwebrtc Apr 24, 2023
4e87e75
update.
cloudwebrtc Apr 24, 2023
61dae4f
export key.
cloudwebrtc Apr 24, 2023
f6b8a32
Merge branch 'master' into feat/frame-encryptor-interface
cloudwebrtc Apr 24, 2023
a601f7a
Merge branch 'feat/frame-encryptor-interface' of https://github.com/w…
cloudwebrtc Apr 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
feat: add frame encryptor/decryptor interface.
  • Loading branch information
cloudwebrtc committed Sep 19, 2022
commit 29e7fff12f3a70d0b43c42419f6cd9f245c901b0
10 changes: 8 additions & 2 deletions BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ rtc_shared_library("libwebrtc") {
"include/rtc_data_channel.h",
"include/rtc_dtls_transport.h",
"include/rtc_dtmf_sender.h",
"include/rtc_frame_encryptor.h",
"include/rtc_frame_decryptor.h",
"include/rtc_ice_candidate.h",
"include/rtc_media_stream.h",
"include/rtc_media_track.h",
Expand Down Expand Up @@ -91,6 +93,10 @@ rtc_shared_library("libwebrtc") {
"src/rtc_dtls_transport_impl.h",
"src/rtc_dtmf_sender_impl.cc",
"src/rtc_dtmf_sender_impl.h",
"src/rtc_frame_decryptor_impl.h",
"src/rtc_frame_decryptor_impl.cc",
"src/rtc_frame_encryptor_impl.h",
"src/rtc_frame_encryptor_impl.cc",
"src/rtc_ice_candidate_impl.cc",
"src/rtc_ice_candidate_impl.h",
"src/rtc_media_stream_impl.cc",
Expand All @@ -103,8 +109,8 @@ rtc_shared_library("libwebrtc") {
"src/rtc_peerconnection_impl.h",
"src/rtc_rtp_parameters_impl.cc",
"src/rtc_rtp_parameters_impl.h",
"src/rtc_rtp_receive_imp.cc",
"src/rtc_rtp_receive_imp.h",
"src/rtc_rtp_receiver_imp.cc",
"src/rtc_rtp_receiver_imp.h",
"src/rtc_rtp_sender_impl.cc",
"src/rtc_rtp_sender_impl.h",
"src/rtc_rtp_transceiver_impl.cc",
Expand Down
43 changes: 43 additions & 0 deletions include/rtc_frame_decryptor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

#ifndef LIB_RTC_FRAME_DECRYPTOR_HXX
#define LIB_RTC_FRAME_DECRYPTOR_HXX

#include "base/refcount.h"
#include "rtc_types.h"

namespace libwebrtc {

enum class DecryptResultStatus { kOk, kRecoverable, kFailedToDecrypt, kUnknown };

struct DecryptResult {
DecryptResult(DecryptResultStatus status, size_t bytes_written)
: status(status), bytes_written(bytes_written) {}

bool IsOk() const { return status == DecryptResultStatus::kOk; }

const DecryptResultStatus status;
const size_t bytes_written;
};

typedef fixed_size_function<DecryptResult(
RTCMediaType media_type,
const portable::vector<uint32_t>& csrcs,
portable::vector<const uint8_t> additional_data,
portable::vector<const uint8_t> encrypted_frame,
portable::vector<uint8_t> frame)>
DecryptCallback;

typedef fixed_size_function<size_t(RTCMediaType media_type,
size_t encrypted_frame_size)>
GetMaxPlaintextByteSizeCallback;

class RTCFrameDecryptor : public RefCountInterface {
public:
static scoped_refptr<RTCFrameDecryptor> Create(
DecryptCallback decrypt,
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size);
};

} // namespace libwebrtc

#endif // LIB_RTC_FRAME_DECRYPTOR_HXX
30 changes: 30 additions & 0 deletions include/rtc_frame_encryptor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

#ifndef LIB_RTC_FRAME_ENCRYPTOR_HXX
#define LIB_RTC_FRAME_ENCRYPTOR_HXX

#include "base/refcount.h"
#include "rtc_types.h"

namespace libwebrtc {

typedef fixed_size_function<int(RTCMediaType media_type,
uint32_t ssrc,
portable::vector<const uint8_t> additional_data,
portable::vector<const uint8_t> frame,
portable::vector<uint8_t> encrypted_frame,
size_t* bytes_written)>
EncryptCallback;

typedef fixed_size_function<size_t(RTCMediaType media_type, size_t frame_size)>
GetMaxCiphertextByteSizeCallback;

class RTCFrameEncryptor : public RefCountInterface {
public:
static scoped_refptr<RTCFrameEncryptor> Create(
EncryptCallback encrypt,
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size);
};

} // namespace libwebrtc

#endif // LIB_RTC_FRAME_ENCRYPTOR_HXX
12 changes: 5 additions & 7 deletions include/rtc_rtp_receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
#include "rtc_rtp_parameters.h"
#include "rtc_types.h"

//#include "rtc_frame_decryptor.h"
//#include "rtc_frame_encryptor.h"
#include "rtc_frame_decryptor.h"

namespace libwebrtc {

Expand Down Expand Up @@ -46,13 +45,12 @@ class RTCRtpReceiver : public RefCountInterface {

virtual void SetJitterBufferMinimumDelay(double delay_seconds) = 0;

// virtual Vector<RtpSource> GetSources() const = 0;

// virtual void SetFrameDecryptor(
// scoped_refptr<FrameDecryptor> frame_decryptor);
virtual void SetFrameDecryptor(
scoped_refptr<RTCFrameDecryptor> frame_decryptor) = 0;

// virtual scoped_refptr<FrameDecryptor> GetFrameDecryptor() const = 0;
virtual scoped_refptr<RTCFrameDecryptor> GetFrameDecryptor() const = 0;

// virtual Vector<RtpSource> GetSources() const = 0;
// virtual void SetDepacketizerToDecoderFrameTransformer(
// scoped_refptr<FrameTransformerInterface> frame_transformer) = 0;
};
Expand Down
7 changes: 7 additions & 0 deletions include/rtc_rtp_sender.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include "rtc_rtp_parameters.h"
#include "rtc_types.h"

#include "rtc_frame_encryptor.h"

namespace libwebrtc {

class RTCMediaTrack;
Expand Down Expand Up @@ -40,6 +42,11 @@ class RTCRtpSender : public RefCountInterface {
const scoped_refptr<RTCRtpParameters> parameters) = 0;

virtual scoped_refptr<RTCDtmfSender> dtmf_sender() const = 0;

virtual void SetFrameEncryptor(
scoped_refptr<RTCFrameEncryptor> frame_encryptor) = 0;

virtual scoped_refptr<RTCFrameEncryptor> GetFrameEncryptor() const = 0;
};

} // namespace libwebrtc
Expand Down
22 changes: 22 additions & 0 deletions src/rtc_frame_decryptor_impl.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "rtc_frame_decryptor_impl.h"

#include "rtc_base/ref_counted_object.h"

namespace libwebrtc {

scoped_refptr<RTCFrameDecryptor> RTCFrameDecryptor::Create(
DecryptCallback decrypt,
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size) {
return new RefCountedObject<RTCFrameDecryptorImpl>(
decrypt, get_max_plaintext_byte_size);
}

RTCFrameDecryptorImpl::RTCFrameDecryptorImpl(
DecryptCallback decrypt,
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size) {
frame_decryptor_ = new rtc::RefCountedObject<RTCFrameDecryptorInternal>(
decrypt, get_max_plaintext_byte_size);
}

RTCFrameDecryptorImpl::~RTCFrameDecryptorImpl() {}
} // namespace libwebrtc
86 changes: 86 additions & 0 deletions src/rtc_frame_decryptor_impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#ifndef RTC_FRAME_DECRYPTOR_IMPL_HXX
#define RTC_FRAME_DECRYPTOR_IMPL_HXX

#include "api/crypto/frame_decryptor_interface.h"
#include "rtc_frame_decryptor.h"

namespace libwebrtc {

class RTCFrameDecryptorInternal : public webrtc::FrameDecryptorInterface {
public:
RTCFrameDecryptorInternal(
DecryptCallback decrypt,
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size)
: decrypt_callback_(decrypt),
get_max_plaintext_byte_size_callback_(get_max_plaintext_byte_size) {}

virtual Result Decrypt(cricket::MediaType media_type,
const std::vector<uint32_t>& csrcs,
rtc::ArrayView<const uint8_t> additional_data,
rtc::ArrayView<const uint8_t> encrypted_frame,
rtc::ArrayView<uint8_t> frame) override {
//DecryptResult res =
// decrypt_callback_(ConvertMediaType(media_type), csrcs, additional_data,
// encrypted_frame, frame);

return webrtc::FrameDecryptorInterface::Result(
webrtc::FrameDecryptorInterface::Status::kOk, 0);
}

virtual size_t GetMaxPlaintextByteSize(cricket::MediaType media_type,
size_t encrypted_frame_size) override {
return get_max_plaintext_byte_size_callback_(ConvertMediaType(media_type),
encrypted_frame_size);
}

webrtc::FrameDecryptorInterface::Status ConvertResultStatus(
DecryptResultStatus status) {
switch (status) {
case DecryptResultStatus::kOk:
return webrtc::FrameDecryptorInterface::Status::kOk;
case DecryptResultStatus::kRecoverable:
return webrtc::FrameDecryptorInterface::Status::kRecoverable;
case DecryptResultStatus::kFailedToDecrypt:
return webrtc::FrameDecryptorInterface::Status::kFailedToDecrypt;
case DecryptResultStatus::kUnknown:
return webrtc::FrameDecryptorInterface::Status::kUnknown;
}
return webrtc::FrameDecryptorInterface::Status::kUnknown;
}

RTCMediaType ConvertMediaType(cricket::MediaType media_type) {
switch (media_type) {
case cricket::MEDIA_TYPE_AUDIO:
return RTCMediaType::AUDIO;
case cricket::MEDIA_TYPE_VIDEO:
return RTCMediaType::VIDEO;
case cricket::MEDIA_TYPE_DATA:
return RTCMediaType::DATA;
default:
return RTCMediaType::ANY;
}
}

private:
DecryptCallback decrypt_callback_;
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size_callback_;
};

class RTCFrameDecryptorImpl : public RTCFrameDecryptor {
public:
RTCFrameDecryptorImpl(
DecryptCallback decrypt,
GetMaxPlaintextByteSizeCallback get_max_plaintext_byte_size);
~RTCFrameDecryptorImpl() override;

rtc::scoped_refptr<webrtc::FrameDecryptorInterface> rtc_frame_decryptor() {
return frame_decryptor_;
}

private:
rtc::scoped_refptr<RTCFrameDecryptorInternal> frame_decryptor_;
};

} // namespace libwebrtc

#endif // RTC_FRAME_DECRYPTOR_IMPL_HXX
23 changes: 23 additions & 0 deletions src/rtc_frame_encryptor_impl.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "rtc_frame_encryptor_impl.h"

#include "rtc_base/ref_counted_object.h"

namespace libwebrtc {

scoped_refptr<RTCFrameEncryptor> RTCFrameEncryptor::Create(
EncryptCallback encrypt,
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size) {
return new RefCountedObject<RTCFrameEncryptorImpl>(
encrypt, get_max_ciphertext_byte_size);
}

RTCFrameEncryptorImpl::RTCFrameEncryptorImpl(
EncryptCallback encrypt,
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size) {
frame_encryptor_ = new rtc::RefCountedObject<RTCFrameEncryptorInternal>(
encrypt, get_max_ciphertext_byte_size);
}

RTCFrameEncryptorImpl::~RTCFrameEncryptorImpl() {}

} // namespace libwebrtc
67 changes: 67 additions & 0 deletions src/rtc_frame_encryptor_impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#ifndef RTC_FRAME_ENCRYPTOR_IMPL_HXX
#define RTC_FRAME_ENCRYPTOR_IMPL_HXX

#include "rtc_frame_encryptor.h"

#include "api/crypto/frame_encryptor_interface.h"

namespace libwebrtc {

class RTCFrameEncryptorInternal : public webrtc::FrameEncryptorInterface {
public:
RTCFrameEncryptorInternal(
EncryptCallback encrypt,
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size)
: encrypt_callback_(encrypt),
get_max_ciphertext_byte_size_callback_(get_max_ciphertext_byte_size) {}

virtual int Encrypt(cricket::MediaType media_type,
uint32_t ssrc,
rtc::ArrayView<const uint8_t> additional_data,
rtc::ArrayView<const uint8_t> frame,
rtc::ArrayView<uint8_t> encrypted_frame,
size_t* bytes_written) override {
//return encrypt_callback_(ConvertMediaType(media_type), ssrc, additional_data, frame,
// encrypted_frame, bytes_written);
return 0;
}

virtual size_t GetMaxCiphertextByteSize(cricket::MediaType media_type,
size_t frame_size) override {
return get_max_ciphertext_byte_size_callback_(ConvertMediaType(media_type), frame_size);
}

RTCMediaType ConvertMediaType(cricket::MediaType media_type) {
switch (media_type) {
case cricket::MEDIA_TYPE_AUDIO:
return RTCMediaType::AUDIO;
case cricket::MEDIA_TYPE_VIDEO:
return RTCMediaType::VIDEO;
case cricket::MEDIA_TYPE_DATA:
return RTCMediaType::DATA;
default:
return RTCMediaType::ANY;
}
}

private:
EncryptCallback encrypt_callback_;
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size_callback_;
};

class RTCFrameEncryptorImpl : public RTCFrameEncryptor {
public:
RTCFrameEncryptorImpl(
EncryptCallback encrypt,
GetMaxCiphertextByteSizeCallback get_max_ciphertext_byte_size);
~RTCFrameEncryptorImpl() override;

rtc::scoped_refptr<webrtc::FrameEncryptorInterface> rtc_frame_encryptor() {
return frame_encryptor_;
}

protected:
rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor_;
};
} // namespace libwebrtc
#endif // RTC_FRAME_ENCRYPTOR_IMPL_HXX
2 changes: 1 addition & 1 deletion src/rtc_peerconnection_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "rtc_ice_candidate_impl.h"
#include "rtc_media_stream_impl.h"
#include "rtc_mediaconstraints_impl.h"
#include "rtc_rtp_receive_imp.h"
#include "rtc_rtp_receiver_imp.h"
#include "rtc_rtp_sender_impl.h"
#include "rtc_rtp_transceiver_impl.h"

Expand Down
Loading