Skip to content

Commit

Permalink
Make add_hashes_and_signatures operate on dicts
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston committed Jan 29, 2019
1 parent 073f6c2 commit 554ca58
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 40 deletions.
16 changes: 6 additions & 10 deletions synapse/crypto/event_signing.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,29 +131,25 @@ def compute_event_signature(event_dict, signature_name, signing_key):
return redact_json["signatures"]


def add_hashes_and_signatures(event, signature_name, signing_key,
def add_hashes_and_signatures(event_dict, signature_name, signing_key,
hash_algorithm=hashlib.sha256):
"""Add content hash and sign the event
Args:
event_dict (EventBuilder): The event to add hashes to and sign
event_dict (dict): The event to add hashes to and sign
signature_name (str): The name of the entity signing the event
(typically the server's hostname).
signing_key (syutil.crypto.SigningKey): The key to sign with
hash_algorithm: A hasher from `hashlib`, e.g. hashlib.sha256, to use
to hash the event
"""

name, digest = compute_content_hash(
event.get_pdu_json(), hash_algorithm=hash_algorithm,
)
name, digest = compute_content_hash(event_dict, hash_algorithm=hash_algorithm)

if not hasattr(event, "hashes"):
event.hashes = {}
event.hashes[name] = encode_base64(digest)
event_dict.setdefault("hashes", {})[name] = encode_base64(digest)

event.signatures = compute_event_signature(
event.get_pdu_json(),
event_dict["signatures"] = compute_event_signature(
event_dict,
signature_name=signature_name,
signing_key=signing_key,
)
56 changes: 26 additions & 30 deletions tests/crypto/test_event_signing.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from unpaddedbase64 import decode_base64

from synapse.crypto.event_signing import add_hashes_and_signatures
from synapse.events.builder import EventBuilder
from synapse.events import FrozenEvent

from tests import unittest

Expand All @@ -40,20 +40,18 @@ def setUp(self):
self.signing_key.version = KEY_VER

def test_sign_minimal(self):
builder = EventBuilder(
{
'event_id': "$0:domain",
'origin': "domain",
'origin_server_ts': 1000000,
'signatures': {},
'type': "X",
'unsigned': {'age_ts': 1000000},
}
)
event_dict = {
'event_id': "$0:domain",
'origin': "domain",
'origin_server_ts': 1000000,
'signatures': {},
'type': "X",
'unsigned': {'age_ts': 1000000},
}

add_hashes_and_signatures(builder, HOSTNAME, self.signing_key)
add_hashes_and_signatures(event_dict, HOSTNAME, self.signing_key)

event = builder.build()
event = FrozenEvent(event_dict)

self.assertTrue(hasattr(event, 'hashes'))
self.assertIn('sha256', event.hashes)
Expand All @@ -71,23 +69,21 @@ def test_sign_minimal(self):
)

def test_sign_message(self):
builder = EventBuilder(
{
'content': {'body': "Here is the message content"},
'event_id': "$0:domain",
'origin': "domain",
'origin_server_ts': 1000000,
'type': "m.room.message",
'room_id': "!r:domain",
'sender': "@u:domain",
'signatures': {},
'unsigned': {'age_ts': 1000000},
}
)

add_hashes_and_signatures(builder, HOSTNAME, self.signing_key)

event = builder.build()
event_dict = {
'content': {'body': "Here is the message content"},
'event_id': "$0:domain",
'origin': "domain",
'origin_server_ts': 1000000,
'type': "m.room.message",
'room_id': "!r:domain",
'sender': "@u:domain",
'signatures': {},
'unsigned': {'age_ts': 1000000},
}

add_hashes_and_signatures(event_dict, HOSTNAME, self.signing_key)

event = FrozenEvent(event_dict)

self.assertTrue(hasattr(event, 'hashes'))
self.assertIn('sha256', event.hashes)
Expand Down

0 comments on commit 554ca58

Please sign in to comment.