diff options
author | Damir Jelić <poljar@termina.org.uk> | 2019-04-09 10:57:36 +0200 |
---|---|---|
committer | Damir Jelić <poljar@termina.org.uk> | 2019-04-09 10:57:36 +0200 |
commit | 32b99b793572c109fe0f3507705a10aefe2d8cf7 (patch) | |
tree | e6b304a80a97c39ba82508c8766cbb86fa1f4a90 | |
parent | 659eb34fa4a28a94dd18d7dd743f6a6c032f2089 (diff) |
python: Add support for the long KDF MAC calculation.
-rw-r--r-- | python/olm/sas.py | 35 | ||||
-rw-r--r-- | python/tests/sas_test.py | 17 |
2 files changed, 52 insertions, 0 deletions
diff --git a/python/olm/sas.py b/python/olm/sas.py index 8574cfd..c12b7bc 100644 --- a/python/olm/sas.py +++ b/python/olm/sas.py @@ -220,3 +220,38 @@ class Sas(object): ) ) return bytes_to_native_str(ffi.unpack(mac_buffer, mac_length)) + + @other_pubkey_set + def calculate_mac_long_kdf(self, message, extra_info): + # type: (str, str) -> str + """Generate a message authentication code based on the shared secret. + + This function should not be used unless compatibility with an older + non-tagged Olm version is required. + + Args: + message (str): The message to produce the authentication code for. + extra_info (str): Extra information to mix in when generating the + MAC + + Raises OlmSasError on failure. + + """ + byte_message = to_bytes(message) + byte_info = to_bytes(extra_info) + + mac_length = lib.olm_sas_mac_length(self._sas) + mac_buffer = ffi.new("char[]", mac_length) + + self._check_error( + lib.olm_sas_calculate_mac_long_kdf( + self._sas, + ffi.from_buffer(byte_message), + len(byte_message), + ffi.from_buffer(byte_info), + len(byte_info), + mac_buffer, + mac_length + ) + ) + return bytes_to_native_str(ffi.unpack(mac_buffer, mac_length)) diff --git a/python/tests/sas_test.py b/python/tests/sas_test.py index 05013b7..9001e67 100644 --- a/python/tests/sas_test.py +++ b/python/tests/sas_test.py @@ -80,3 +80,20 @@ class TestClass(object): alice_mac = sas_alice.calculate_mac(message, extra_info) assert alice_mac == expected_mac + + def test_long_mac_generating(self): + sas_alice = Sas() + sas_bob = Sas() + + with pytest.raises(OlmSasError): + sas_alice.calculate_mac_long_kdf(MESSAGE, EXTRA_INFO) + + sas_alice.set_their_pubkey(sas_bob.pubkey) + sas_bob.set_their_pubkey(sas_alice.pubkey) + + alice_mac = sas_alice.calculate_mac_long_kdf(MESSAGE, EXTRA_INFO) + bob_mac = sas_bob.calculate_mac_long_kdf(MESSAGE, EXTRA_INFO) + bob_short_mac = sas_bob.calculate_mac(MESSAGE, EXTRA_INFO) + + assert alice_mac == bob_mac + assert alice_mac != bob_short_mac |