@@ -82,6 +82,28 @@ const EVP_CIPHER* GetAesCbcAlgorithmFromKeySize(size_t key_size_bytes) {
82
82
}
83
83
}
84
84
85
+ inline bool FrameIsH264 (webrtc::TransformableFrameInterface* frame,
86
+ webrtc::FrameCryptorTransformer::MediaType type) {
87
+ switch (type) {
88
+ case webrtc::FrameCryptorTransformer::MediaType::kVideoFrame : {
89
+ auto videoFrame =
90
+ static_cast <webrtc::TransformableVideoFrameInterface*>(frame);
91
+ return videoFrame->header ().codec ==
92
+ webrtc::VideoCodecType::kVideoCodecH264 ;
93
+ }
94
+ default :
95
+ return false ;
96
+ }
97
+ }
98
+
99
+ inline bool NeedsRbspUnescaping (const uint8_t * frameData, size_t frameSize) {
100
+ for (size_t i = 0 ; i < frameSize - 3 ; ++i) {
101
+ if (frameData[i] == 0 && frameData[i + 1 ] == 0 && frameData[i + 2 ] == 3 )
102
+ return true ;
103
+ }
104
+ return false ;
105
+ }
106
+
85
107
std::string to_uint8_list (const uint8_t * data, int len) {
86
108
std::stringstream ss;
87
109
ss << " [" ;
@@ -395,26 +417,41 @@ void FrameCryptorTransformer::encryptFrame(
395
417
key_set->encryption_key , iv, frame_header, payload,
396
418
&buffer) == Success) {
397
419
rtc::Buffer encrypted_payload (buffer.data (), buffer.size ());
420
+ rtc::Buffer tag (encrypted_payload.data () + encrypted_payload.size () - 16 ,
421
+ 16 );
422
+ rtc::Buffer data_without_header;
423
+ data_without_header.AppendData (encrypted_payload);
424
+ data_without_header.AppendData (iv);
425
+ data_without_header.AppendData (frame_trailer);
426
+
398
427
rtc::Buffer data_out;
399
428
data_out.AppendData (frame_header);
400
- data_out.AppendData (encrypted_payload);
401
- data_out.AppendData (iv);
402
- data_out.AppendData (frame_trailer);
403
429
404
- RTC_CHECK_EQ (data_out.size (), frame_header.size () +
405
- encrypted_payload.size () + iv.size () +
406
- frame_trailer.size ());
430
+ if (FrameIsH264 (frame.get (), type_)) {
431
+ H264::WriteRbsp (data_without_header.data (),data_without_header.size (), &data_out);
432
+ } else {
433
+ data_out.AppendData (data_without_header);
434
+ RTC_CHECK_EQ (data_out.size (), frame_header.size () +
435
+ encrypted_payload.size () + iv.size () +
436
+ frame_trailer.size ());
437
+ }
407
438
408
439
frame->SetData (data_out);
409
440
410
- RTC_LOG (LS_INFO) << " FrameCryptorTransformer::encryptFrame() ivLength="
411
- << static_cast <int >(iv.size ()) << " unencrypted_bytes="
441
+ RTC_LOG (LS_INFO) << " FrameCryptorTransformer::encryptFrame() "
442
+ << " frame length = " << static_cast <int >(date_in.size ())
443
+ << " encrypted_length = "
444
+ << static_cast <int >(data_out.size ())
445
+ << " ivLength=" << static_cast <int >(iv.size ())
446
+ << " unencrypted_bytes="
412
447
<< static_cast <int >(unencrypted_bytes)
448
+ << " tag=" << to_hex (tag.data (), tag.size ())
413
449
<< " key_index=" << static_cast <int >(key_index_)
414
450
<< " aesKey="
415
451
<< to_hex (key_set->encryption_key .data (),
416
452
key_set->encryption_key .size ())
417
453
<< " iv=" << to_hex (iv.data (), iv.size ());
454
+
418
455
if (last_enc_error_ != FrameCryptionState::kOk ) {
419
456
last_enc_error_ = FrameCryptionState::kOk ;
420
457
if (observer_)
@@ -554,11 +591,34 @@ void FrameCryptorTransformer::decryptFrame(
554
591
iv[i] = date_in[date_in.size () - 2 - ivLength + i];
555
592
}
556
593
557
- rtc::Buffer encrypted_payload (date_in.size () - unencrypted_bytes - ivLength -
558
- 2 );
559
- for (size_t i = unencrypted_bytes; i < date_in.size () - ivLength - 2 ; i++) {
560
- encrypted_payload[i - unencrypted_bytes] = date_in[i];
594
+ rtc::Buffer encrypted_buffer (date_in.size () - unencrypted_bytes);
595
+ for (size_t i = unencrypted_bytes; i < date_in.size (); i++) {
596
+ encrypted_buffer[i - unencrypted_bytes] = date_in[i];
597
+ }
598
+
599
+ if (FrameIsH264 (frame.get (), type_) &&
600
+ NeedsRbspUnescaping (encrypted_buffer.data (), encrypted_buffer.size ())) {
601
+ encrypted_buffer.SetData (H264::ParseRbsp (encrypted_buffer.data (), encrypted_buffer.size ()));
602
+ }
603
+
604
+ rtc::Buffer encrypted_payload (encrypted_buffer.size () - ivLength - 2 );
605
+ for (size_t i = 0 ; i < encrypted_payload.size (); i++) {
606
+ encrypted_payload[i] = encrypted_buffer[i];
561
607
}
608
+
609
+ rtc::Buffer tag (encrypted_payload.data () + encrypted_payload.size () - 16 , 16 );
610
+ RTC_LOG (LS_INFO) << " FrameCryptorTransformer::decryptFrame() "
611
+ << " frame length = " << static_cast <int >(date_in.size ())
612
+ << " ivLength=" << static_cast <int >(iv.size ())
613
+ << " unencrypted_bytes="
614
+ << static_cast <int >(unencrypted_bytes)
615
+ << " tag=" << to_hex (tag.data (), tag.size ())
616
+ << " key_index=" << static_cast <int >(key_index_)
617
+ << " aesKey="
618
+ << to_hex (key_set->encryption_key .data (),
619
+ key_set->encryption_key .size ())
620
+ << " iv=" << to_hex (iv.data (), iv.size ());
621
+
562
622
std::vector<uint8_t > buffer;
563
623
564
624
int ratchet_count = 0 ;
@@ -636,15 +696,6 @@ void FrameCryptorTransformer::decryptFrame(
636
696
data_out.AppendData (payload);
637
697
frame->SetData (data_out);
638
698
639
- RTC_LOG (LS_INFO) << " FrameCryptorTransformer::decryptFrame() ivLength="
640
- << static_cast <int >(ivLength) << " unencrypted_bytes="
641
- << static_cast <int >(unencrypted_bytes)
642
- << " key_index=" << static_cast <int >(key_index_)
643
- << " aesKey="
644
- << to_hex (key_set->encryption_key .data (),
645
- key_set->encryption_key .size ())
646
- << " iv=" << to_hex (iv.data (), iv.size ());
647
-
648
699
if (last_dec_error_ != FrameCryptionState::kOk ) {
649
700
last_dec_error_ = FrameCryptionState::kOk ;
650
701
if (observer_)
0 commit comments