예제 #1
0
def test_megolm_outbound_session():
    session = MegolmOutboundSession()
    assert session.max_messages == 100
    assert session.max_age == timedelta(days=7)

    session = MegolmOutboundSession(max_messages=1, max_age=100000)
    assert session.max_messages == 1
    assert session.max_age == timedelta(milliseconds=100000)

    assert not session.devices

    session.add_device('test')
    assert 'test' in session.devices

    session.add_devices({'test2', 'test3'})
    assert 'test2' in session.devices and 'test3' in session.devices

    assert not session.should_rotate()

    session.encrypt('message')
    assert session.should_rotate()

    session.max_messages = 2
    assert not session.should_rotate()
    session.creation_time = datetime.now() - timedelta(milliseconds=100000)
    assert session.should_rotate()
예제 #2
0
    def test_megolm_decrypt_event(self, device):
        out_session = MegolmOutboundSession()

        plaintext = {
            'content': {
                "test": "test"
            },
            'type': 'm.text',
        }
        ciphertext = out_session.encrypt(json.dumps(plaintext))

        content = {
            'ciphertext': ciphertext,
            'session_id': out_session.id,
            'sender_key': self.alice_curve_key,
            'algorithm': 'm.megolm.v1.aes-sha2',
            'device_id': self.alice_device_id,
        }

        event = {
            'sender': self.alice,
            'room_id': self.room_id,
            'content': content,
            'type': 'm.room.encrypted',
            'origin_server_ts': 1,
            'event_id': 1
        }

        with pytest.raises(UnableToDecryptError):
            device.megolm_decrypt_event(event)

        session_key = out_session.session_key
        in_session = MegolmInboundSession(session_key, self.alice_ed_key)
        sessions = device.megolm_inbound_sessions[self.room_id]
        sessions[self.alice_curve_key][in_session.id] = in_session

        # Unknown message index
        with pytest.raises(RuntimeError):
            device.megolm_decrypt_event(event)

        ciphertext = out_session.encrypt(json.dumps(plaintext))
        event['content']['ciphertext'] = ciphertext
        device.megolm_decrypt_event(event)
        assert event['content'] == plaintext['content']

        # No replay attack
        event['content'] = content
        device.megolm_decrypt_event(event)
        assert event['content'] == plaintext['content']

        # Replay attack
        event['content'] = content
        event['event_id'] = 2
        with pytest.raises(RuntimeError):
            device.megolm_decrypt_event(event)
        event['event_id'] = 1

        # Device verification
        device.device_keys[self.alice][
            self.alice_device_id] = self.alice_device
        event['content'] = content
        # Unverified
        device.megolm_decrypt_event(event)
        assert event['content'] == plaintext['content']
        assert isinstance(event, dict)

        event['content'] = content
        # Verified
        self.alice_device.verified = True
        decrypted_event = device.megolm_decrypt_event(event)
        assert decrypted_event['content'] == plaintext['content']
        assert isinstance(decrypted_event, VerifiedEvent)

        in_session = MegolmInboundSession(session_key, self.alice_curve_key)
        sessions = device.megolm_inbound_sessions[self.room_id]
        sessions[self.alice_curve_key][in_session.id] = in_session
        # Wrong signing key
        with pytest.raises(RuntimeError):
            device.megolm_decrypt_event(event)
        self.alice_device.verified = False

        event['content']['algorithm'] = 'wrong'
        with pytest.raises(RuntimeError):
            device.megolm_decrypt_event(event)

        event['content'].pop('algorithm')
        event['type'] = 'encrypted'
        device.megolm_decrypt_event(event)
        assert event['type'] == 'encrypted'