@@ -75,6 +75,7 @@ constexpr uint8_t voice_protocol_version = 8;
75
75
static std::string external_ip;
76
76
77
77
struct dave_state {
78
+ std::unique_ptr<dave::mls::Session> dave_session{};
78
79
std::shared_ptr<::mlspp::SignaturePrivateKey> mls_key;
79
80
std::vector<uint8_t > cached_commit;
80
81
uint64_t transition_id{0 };
@@ -538,14 +539,14 @@ void discord_voice_client::get_user_privacy_code(const dpp::snowflake user, priv
538
539
callback (" " );
539
540
return ;
540
541
}
541
- dave_session->GetPairwiseFingerprint (0x0000 , user.str (), [callback](const std::vector<uint8_t >& data) {
542
+ mls_state-> dave_session ->GetPairwiseFingerprint (0x0000 , user.str (), [callback](const std::vector<uint8_t >& data) {
542
543
std::cout << dpp::utility::debug_dump ((uint8_t *)data.data (), data.size ());
543
544
callback (data.size () == 64 ? generate_displayable_code (data, 45 ) : " " );
544
545
});
545
546
}
546
547
547
548
bool discord_voice_client::is_end_to_end_encrypted () const {
548
- return dave_session && mls_state && !mls_state->privacy_code .empty ();
549
+ return mls_state && !mls_state->privacy_code .empty ();
549
550
}
550
551
551
552
bool discord_voice_client::handle_frame (const std::string &data, ws_opcode opcode) {
@@ -562,7 +563,7 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod
562
563
case voice_client_dave_mls_external_sender: {
563
564
log (ll_debug, " voice_client_dave_mls_external_sender" );
564
565
565
- dave_session->SetExternalSender (dave_header->get_data (data.length ()));
566
+ mls_state-> dave_session ->SetExternalSender (dave_header->get_data (data.length ()));
566
567
567
568
mls_state->encryptor = std::make_unique<dave::Encryptor>();
568
569
mls_state->decryptors .clear ();
@@ -571,7 +572,7 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod
571
572
case voice_client_dave_mls_proposals: {
572
573
log (ll_debug, " voice_client_dave_mls_proposals" );
573
574
574
- std::optional<std::vector<uint8_t >> response = dave_session->ProcessProposals (dave_header->get_data (data.length ()), dave_mls_user_list);
575
+ std::optional<std::vector<uint8_t >> response = mls_state-> dave_session ->ProcessProposals (dave_header->get_data (data.length ()), dave_mls_user_list);
575
576
if (response.has_value ()) {
576
577
auto r = response.value ();
577
578
mls_state->cached_commit = r;
@@ -582,39 +583,39 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod
582
583
break ;
583
584
case voice_client_dave_announce_commit_transaction: {
584
585
log (ll_debug, " voice_client_dave_announce_commit_transaction" );
585
- auto r = dave_session->ProcessCommit (mls_state->cached_commit );
586
+ auto r = mls_state-> dave_session ->ProcessCommit (mls_state->cached_commit );
586
587
for (const auto & user : dave_mls_user_list) {
587
- log (ll_debug, " Setting decryptor key ratchet for user: " + user + " , protocol version: " + std::to_string (dave_session->GetProtocolVersion ()));
588
+ log (ll_debug, " Setting decryptor key ratchet for user: " + user + " , protocol version: " + std::to_string (mls_state-> dave_session ->GetProtocolVersion ()));
588
589
dpp::snowflake u{user};
589
590
mls_state->decryptors .emplace (u, std::make_unique<dpp::dave::Decryptor>());
590
- mls_state->decryptors .find (u)->second ->TransitionToKeyRatchet (dave_session->GetKeyRatchet (user));
591
+ mls_state->decryptors .find (u)->second ->TransitionToKeyRatchet (mls_state-> dave_session ->GetKeyRatchet (user));
591
592
}
592
- mls_state->encryptor ->SetKeyRatchet (dave_session->GetKeyRatchet (creator->me .id .str ()));
593
+ mls_state->encryptor ->SetKeyRatchet (mls_state-> dave_session ->GetKeyRatchet (creator->me .id .str ()));
593
594
594
595
/* *
595
596
* https://www.ietf.org/archive/id/draft-ietf-mls-protocol-14.html#name-epoch-authenticators
596
597
* 9.7. Epoch Authenticators
597
598
* The main MLS key schedule provides a per-epoch epoch_authenticator. If one member of the group is being impersonated by an active attacker,
598
599
* the epoch_authenticator computed by their client will differ from those computed by the other group members.
599
600
*/
600
- mls_state->privacy_code = generate_displayable_code (dave_session->GetLastEpochAuthenticator ());
601
+ mls_state->privacy_code = generate_displayable_code (mls_state-> dave_session ->GetLastEpochAuthenticator ());
601
602
log (ll_debug, " E2EE Privacy Code: " + mls_state->privacy_code );
602
603
}
603
604
break ;
604
605
case voice_client_dave_mls_welcome: {
605
606
this ->mls_state ->transition_id = dave_header->get_welcome_transition_id ();
606
607
log (ll_debug, " voice_client_dave_mls_welcome with transition id " + std::to_string (this ->mls_state ->transition_id ));
607
- auto r = dave_session->ProcessWelcome (dave_header->get_welcome_data (data.length ()), dave_mls_user_list);
608
+ auto r = mls_state-> dave_session ->ProcessWelcome (dave_header->get_welcome_data (data.length ()), dave_mls_user_list);
608
609
if (r.has_value ()) {
609
610
for (const auto & user : dave_mls_user_list) {
610
- log (ll_debug, " Setting decryptor key ratchet for user: " + user + " , protocol version: " + std::to_string (dave_session->GetProtocolVersion ()));
611
+ log (ll_debug, " Setting decryptor key ratchet for user: " + user + " , protocol version: " + std::to_string (mls_state-> dave_session ->GetProtocolVersion ()));
611
612
dpp::snowflake u{user};
612
613
mls_state->decryptors .emplace (u, std::make_unique<dpp::dave::Decryptor>());
613
- mls_state->decryptors .find (u)->second ->TransitionToKeyRatchet (dave_session->GetKeyRatchet (user));
614
+ mls_state->decryptors .find (u)->second ->TransitionToKeyRatchet (mls_state-> dave_session ->GetKeyRatchet (user));
614
615
}
615
- mls_state->encryptor ->SetKeyRatchet (dave_session->GetKeyRatchet (creator->me .id .str ()));
616
+ mls_state->encryptor ->SetKeyRatchet (mls_state-> dave_session ->GetKeyRatchet (creator->me .id .str ()));
616
617
}
617
- mls_state->privacy_code = generate_displayable_code (dave_session->GetLastEpochAuthenticator ());
618
+ mls_state->privacy_code = generate_displayable_code (mls_state-> dave_session ->GetLastEpochAuthenticator ());
618
619
log (ll_debug, " E2EE Privacy Code: " + mls_state->privacy_code );
619
620
}
620
621
break ;
@@ -704,8 +705,8 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod
704
705
uint64_t epoch = j[" d" ][" epoch" ];
705
706
log (ll_debug, " voice_client_dave_prepare_epoch version=" + std::to_string (protocol_version) + " for epoch " + std::to_string (epoch));
706
707
if (epoch == 1 ) {
707
- dave_session->Reset ();
708
- dave_session->Init (dave::MaxSupportedProtocolVersion (), channel_id, creator->me .id .str (), mls_state->mls_key );
708
+ mls_state-> dave_session ->Reset ();
709
+ mls_state-> dave_session ->Init (dave::MaxSupportedProtocolVersion (), channel_id, creator->me .id .str (), mls_state->mls_key );
709
710
}
710
711
}
711
712
break ;
@@ -817,13 +818,13 @@ bool discord_voice_client::handle_frame(const std::string &data, ws_opcode opcod
817
818
send_silence (20 );
818
819
}
819
820
820
- dave_session = std::make_unique<dave::mls::Session>(
821
+ mls_state = std::make_unique<dave_state>();
822
+ mls_state->dave_session = std::make_unique<dave::mls::Session>(
821
823
nullptr , " " /* sessionid */ , [this ](std::string const & s1, std::string const & s2) {
822
824
log (ll_debug, " Dave session constructor callback: " + s1 + " , " + s2);
823
825
});
824
- mls_state = std::make_unique<dave_state>();
825
- dave_session->Init (dave::MaxSupportedProtocolVersion (), channel_id, creator->me .id .str (), mls_state->mls_key );
826
- auto key_response = dave_session->GetMarshalledKeyPackage ();
826
+ mls_state->dave_session ->Init (dave::MaxSupportedProtocolVersion (), channel_id, creator->me .id .str (), mls_state->mls_key );
827
+ auto key_response = mls_state->dave_session ->GetMarshalledKeyPackage ();
827
828
key_response.insert (key_response.begin (), voice_client_dave_mls_key_package);
828
829
this ->write (std::string_view (reinterpret_cast <const char *>(key_response.data ()), key_response.size ()), OP_BINARY);
829
830
0 commit comments