Skip to content

Commit fcdef0d

Browse files
authored
Merge pull request #88 from webrtc-sdk/duan/improve-e2ee-api
Improve e2ee, add setSharedKey to KeyProvider.
2 parents a59e857 + 2f8bbd8 commit fcdef0d

File tree

6 files changed

+273
-93
lines changed

6 files changed

+273
-93
lines changed

api/crypto/frame_crypto_transformer.cc

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,10 @@ void FrameCryptorTransformer::encryptFrame(
354354
return;
355355
}
356356

357-
auto key_handler = key_provider_->GetKey(participant_id_);
357+
auto key_handler = key_provider_->options().shared_key
358+
? key_provider_->GetSharedKey(participant_id_)
359+
: key_provider_->GetKey(participant_id_);
360+
358361
if (key_handler == nullptr || key_handler->GetKeySet(key_index_) == nullptr) {
359362
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::encryptFrame() no keys, or "
360363
"key_index["
@@ -462,30 +465,31 @@ void FrameCryptorTransformer::decryptFrame(
462465
sink_callback->OnTransformedFrame(std::move(frame));
463466
return;
464467
}
465-
468+
466469
auto uncrypted_magic_bytes = key_provider_->options().uncrypted_magic_bytes;
467470
if (uncrypted_magic_bytes.size() > 0 &&
468471
date_in.size() >= uncrypted_magic_bytes.size() + 1) {
469-
auto tmp = date_in.subview(date_in.size() - (uncrypted_magic_bytes.size() + 1),
470-
uncrypted_magic_bytes.size());
472+
auto tmp =
473+
date_in.subview(date_in.size() - (uncrypted_magic_bytes.size() + 1),
474+
uncrypted_magic_bytes.size());
471475

472476
if (uncrypted_magic_bytes == std::vector<uint8_t>(tmp.begin(), tmp.end())) {
473-
474477
RTC_CHECK_EQ(tmp.size(), uncrypted_magic_bytes.size());
475478
auto frame_type = date_in.subview(date_in.size() - 1, 1);
476479
RTC_CHECK_EQ(frame_type.size(), 1);
477480

478-
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::uncrypted_magic_bytes( type "
479-
<< frame_type[0] << ", tmp "
480-
<< to_hex(tmp.data(), tmp.size()) << ", magic bytes "
481-
<< to_hex(uncrypted_magic_bytes.data(),
482-
uncrypted_magic_bytes.size())
483-
<< ")";
481+
RTC_LOG(LS_INFO)
482+
<< "FrameCryptorTransformer::uncrypted_magic_bytes( type "
483+
<< frame_type[0] << ", tmp " << to_hex(tmp.data(), tmp.size())
484+
<< ", magic bytes "
485+
<< to_hex(uncrypted_magic_bytes.data(), uncrypted_magic_bytes.size())
486+
<< ")";
484487

485-
// magic bytes detected, this is a non-encrypted frame, skip frame decryption.
488+
// magic bytes detected, this is a non-encrypted frame, skip frame
489+
// decryption.
486490
rtc::Buffer data_out;
487-
data_out.AppendData(
488-
date_in.subview(0, date_in.size() - uncrypted_magic_bytes.size() - 1));
491+
data_out.AppendData(date_in.subview(
492+
0, date_in.size() - uncrypted_magic_bytes.size() - 1));
489493
frame->SetData(data_out);
490494
sink_callback->OnTransformedFrame(std::move(frame));
491495
return;
@@ -518,7 +522,10 @@ void FrameCryptorTransformer::decryptFrame(
518522
return;
519523
}
520524

521-
auto key_handler = key_provider_->GetKey(participant_id_);
525+
auto key_handler = key_provider_->options().shared_key
526+
? key_provider_->GetSharedKey(participant_id_)
527+
: key_provider_->GetKey(participant_id_);
528+
522529
if (key_index >= KEYRING_SIZE || key_handler == nullptr ||
523530
key_handler->GetKeySet(key_index) == nullptr) {
524531
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::decryptFrame() no keys, or "
@@ -534,10 +541,10 @@ void FrameCryptorTransformer::decryptFrame(
534541
return;
535542
}
536543

537-
if(last_dec_error_ == kDecryptionFailed && !key_handler->have_valid_key) {
538-
// if decryption failed and we have an invalid key,
539-
// please try to decrypt with the next new key
540-
return;
544+
if (last_dec_error_ == kDecryptionFailed && !key_handler->HasValidKey()) {
545+
// if decryption failed and we have an invalid key,
546+
// please try to decrypt with the next new key
547+
return;
541548
}
542549

543550
auto key_set = key_handler->GetKeySet(key_index);
@@ -565,25 +572,28 @@ void FrameCryptorTransformer::decryptFrame(
565572
RTC_LOG(LS_ERROR) << "FrameCryptorTransformer::decryptFrame() failed";
566573
std::shared_ptr<ParticipantKeyHandler::KeySet> ratcheted_key_set;
567574
auto currentKeyMaterial = key_set->material;
568-
if (key_handler->options().ratchet_window_size > 0) {
569-
while (ratchet_count < key_handler->options().ratchet_window_size) {
575+
if (key_provider_->options().ratchet_window_size > 0) {
576+
while (ratchet_count < key_provider_->options().ratchet_window_size) {
570577
ratchet_count++;
571578

572579
RTC_LOG(LS_INFO) << "ratcheting key attempt " << ratchet_count << " of "
573-
<< key_handler->options().ratchet_window_size;
580+
<< key_provider_->options().ratchet_window_size;
574581

575582
auto new_material = key_handler->RatchetKeyMaterial(currentKeyMaterial);
576-
ratcheted_key_set = key_handler->DeriveKeys(new_material, key_handler->options().ratchet_salt, 128);
583+
ratcheted_key_set = key_handler->DeriveKeys(
584+
new_material, key_provider_->options().ratchet_salt, 128);
577585

578586
if (AesEncryptDecrypt(EncryptOrDecrypt::kDecrypt, algorithm_,
579-
ratcheted_key_set->encryption_key, iv, frame_header,
580-
encrypted_payload, &buffer) == Success) {
587+
ratcheted_key_set->encryption_key, iv,
588+
frame_header, encrypted_payload,
589+
&buffer) == Success) {
581590
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::decryptFrame() "
582591
"ratcheted to key_index="
583592
<< static_cast<int>(key_index);
584593
decryption_success = true;
585594
// success, so we set the new key
586595
key_handler->SetKeyFromMaterial(new_material, key_index);
596+
key_handler->SetHasValidKey(true);
587597
if (last_dec_error_ != FrameCryptionState::kKeyRatcheted) {
588598
last_dec_error_ = FrameCryptionState::kKeyRatcheted;
589599
if (observer_)
@@ -603,7 +613,7 @@ void FrameCryptorTransformer::decryptFrame(
603613
times, we come back to the initial key.
604614
*/
605615
if (!decryption_success ||
606-
ratchet_count >= key_handler->options().ratchet_window_size) {
616+
ratchet_count >= key_provider_->options().ratchet_window_size) {
607617
key_handler->SetKeyFromMaterial(initialKeyMaterial, key_index);
608618
}
609619
}
@@ -612,7 +622,7 @@ void FrameCryptorTransformer::decryptFrame(
612622
if (!decryption_success) {
613623
if (last_dec_error_ != FrameCryptionState::kDecryptionFailed) {
614624
last_dec_error_ = FrameCryptionState::kDecryptionFailed;
615-
key_handler->have_valid_key = false;
625+
key_handler->SetHasValidKey(false);
616626
if (observer_)
617627
observer_->OnFrameCryptionStateChanged(participant_id_,
618628
last_dec_error_);
@@ -629,7 +639,8 @@ void FrameCryptorTransformer::decryptFrame(
629639
RTC_LOG(LS_INFO) << "FrameCryptorTransformer::decryptFrame() ivLength="
630640
<< static_cast<int>(ivLength) << " unencrypted_bytes="
631641
<< static_cast<int>(unencrypted_bytes)
632-
<< " key_index=" << static_cast<int>(key_index_) << " aesKey="
642+
<< " key_index=" << static_cast<int>(key_index_)
643+
<< " aesKey="
633644
<< to_hex(key_set->encryption_key.data(),
634645
key_set->encryption_key.size())
635646
<< " iv=" << to_hex(iv.data(), iv.size());

0 commit comments

Comments
 (0)