@@ -733,13 +733,9 @@ async fn test_megolm_encryption() {
733
733
}
734
734
735
735
#[ cfg( feature = "experimental-encrypted-state-events" ) ]
736
- #[ async_test]
737
- async fn test_megolm_state_encryption ( ) {
738
- use ruma:: events:: { AnyStateEvent , EmptyStateKey } ;
739
-
736
+ async fn megolm_encryption_setup_helper ( room_id : & RoomId ) -> ( OlmMachine , OlmMachine ) {
740
737
let ( alice, bob) =
741
738
get_machine_pair_with_setup_sessions_test_helper ( alice_id ( ) , user_id ( ) , false ) . await ;
742
- let room_id = room_id ! ( "!test:example.org" ) ;
743
739
744
740
let to_device_requests = alice
745
741
. share_room_key ( room_id, iter:: once ( bob. user_id ( ) ) , EncryptionSettings :: default ( ) )
@@ -774,10 +770,19 @@ async fn test_megolm_state_encryption() {
774
770
let sessions = std:: slice:: from_ref ( & group_session) ;
775
771
bob. store ( ) . save_inbound_group_sessions ( sessions) . await . unwrap ( ) ;
776
772
777
- let plaintext = "It is a secret to everybody" ;
773
+ ( alice, bob)
774
+ }
778
775
779
- let content = RoomTopicEventContent :: new ( plaintext. to_owned ( ) ) ;
776
+ #[ cfg( feature = "experimental-encrypted-state-events" ) ]
777
+ #[ async_test]
778
+ async fn test_megolm_state_encryption ( ) {
779
+ use ruma:: events:: { AnyStateEvent , EmptyStateKey } ;
780
780
781
+ let room_id = room_id ! ( "!test:example.org" ) ;
782
+ let ( alice, bob) = megolm_encryption_setup_helper ( room_id) . await ;
783
+
784
+ let plaintext = "It is a secret to everybody" ;
785
+ let content = RoomTopicEventContent :: new ( plaintext. to_owned ( ) ) ;
781
786
let encrypted_content =
782
787
alice. encrypt_state_event ( room_id, content, EmptyStateKey ) . await . unwrap ( ) ;
783
788
@@ -786,6 +791,7 @@ async fn test_megolm_state_encryption() {
786
791
"origin_server_ts" : MilliSecondsSinceUnixEpoch :: now( ) ,
787
792
"sender" : alice. user_id( ) ,
788
793
"type" : "m.room.encrypted" ,
794
+ "state_key" : "m.room.topic:" ,
789
795
"content" : encrypted_content,
790
796
} ) ;
791
797
@@ -796,7 +802,9 @@ async fn test_megolm_state_encryption() {
796
802
797
803
let decryption_result =
798
804
bob. try_decrypt_room_event ( & event, room_id, & decryption_settings) . await . unwrap ( ) ;
805
+
799
806
assert_let ! ( RoomEventDecryptionResult :: Decrypted ( decrypted_event) = decryption_result) ;
807
+
800
808
let decrypted_event = decrypted_event. event . deserialize ( ) . unwrap ( ) ;
801
809
802
810
if let AnyTimelineEvent :: State ( AnyStateEvent :: RoomTopic ( StateEvent :: Original (
@@ -810,6 +818,88 @@ async fn test_megolm_state_encryption() {
810
818
}
811
819
}
812
820
821
+ #[ cfg( feature = "experimental-encrypted-state-events" ) ]
822
+ #[ async_test]
823
+ async fn test_megolm_state_encryption_bad_type ( ) {
824
+ use ruma:: events:: EmptyStateKey ;
825
+
826
+ let room_id = room_id ! ( "!test:example.org" ) ;
827
+ let ( alice, bob) = megolm_encryption_setup_helper ( room_id) . await ;
828
+
829
+ let plaintext = "It is a secret to everybody" ;
830
+ let content = RoomTopicEventContent :: new ( plaintext. to_owned ( ) ) ;
831
+ let encrypted_content =
832
+ alice. encrypt_state_event ( room_id, content, EmptyStateKey ) . await . unwrap ( ) ;
833
+
834
+ // Malformed events
835
+ let bad_type_event = json ! ( {
836
+ "event_id" : "$xxxxx:example.org" ,
837
+ "origin_server_ts" : MilliSecondsSinceUnixEpoch :: now( ) ,
838
+ "sender" : alice. user_id( ) ,
839
+ "type" : "m.room.encrypted" ,
840
+ "state_key" : "m.room.malformed:" ,
841
+ "content" : encrypted_content,
842
+ } ) ;
843
+
844
+ let bad_type_event = json_convert ( & bad_type_event) . unwrap ( ) ;
845
+
846
+ let decryption_settings =
847
+ DecryptionSettings { sender_device_trust_requirement : TrustRequirement :: Untrusted } ;
848
+
849
+ let bad_type_decryption_result =
850
+ bob. try_decrypt_room_event ( & bad_type_event, room_id, & decryption_settings) . await . unwrap ( ) ;
851
+
852
+ assert_matches ! (
853
+ bad_type_decryption_result,
854
+ RoomEventDecryptionResult :: UnableToDecrypt ( UnableToDecryptInfo {
855
+ reason: UnableToDecryptReason :: StateKeyVerificationFailed ,
856
+ ..
857
+ } )
858
+ ) ;
859
+ }
860
+
861
+ #[ cfg( feature = "experimental-encrypted-state-events" ) ]
862
+ #[ async_test]
863
+ async fn test_megolm_state_encryption_bad_state_key ( ) {
864
+ use ruma:: events:: EmptyStateKey ;
865
+
866
+ let room_id = room_id ! ( "!test:example.org" ) ;
867
+ let ( alice, bob) = megolm_encryption_setup_helper ( room_id) . await ;
868
+
869
+ let plaintext = "It is a secret to everybody" ;
870
+ let content = RoomTopicEventContent :: new ( plaintext. to_owned ( ) ) ;
871
+ let encrypted_content =
872
+ alice. encrypt_state_event ( room_id, content, EmptyStateKey ) . await . unwrap ( ) ;
873
+
874
+ let bad_state_key_event = json ! ( {
875
+ "event_id" : "$xxxxx:example.org" ,
876
+ "origin_server_ts" : MilliSecondsSinceUnixEpoch :: now( ) ,
877
+ "sender" : alice. user_id( ) ,
878
+ "type" : "m.room.encrypted" ,
879
+ "state_key" : "m.room.malformed:" ,
880
+ "content" : encrypted_content,
881
+ } ) ;
882
+
883
+ let bad_state_key_event = json_convert ( & bad_state_key_event) . unwrap ( ) ;
884
+
885
+ let decryption_settings =
886
+ DecryptionSettings { sender_device_trust_requirement : TrustRequirement :: Untrusted } ;
887
+
888
+ let bad_state_key_decryption_result = bob
889
+ . try_decrypt_room_event ( & bad_state_key_event, room_id, & decryption_settings)
890
+ . await
891
+ . unwrap ( ) ;
892
+
893
+ // Require malformed events fail verification
894
+ assert_matches ! (
895
+ bad_state_key_decryption_result,
896
+ RoomEventDecryptionResult :: UnableToDecrypt ( UnableToDecryptInfo {
897
+ reason: UnableToDecryptReason :: StateKeyVerificationFailed ,
898
+ ..
899
+ } )
900
+ ) ;
901
+ }
902
+
813
903
#[ async_test]
814
904
async fn test_withheld_unverified ( ) {
815
905
let ( alice, bob) =
0 commit comments