def deserialize_content(self, data: bytes, key: SymmetricKey, msg: SecureMessage) -> Optional[Content]: dictionary = json_decode(data=data) # TODO: translate short keys # 'T' -> 'type' # 'N' -> 'sn' # 'G' -> 'group' content = Content.parse(content=dictionary) assert content is not None, 'content error: %d' % len(data) if not is_broadcast(msg=msg): # check and cache key for reuse group = self.overt_group(content=content) if group is None: # personal message or (group) command # cache key with direction (sender -> receiver) self.cache_cipher_key(key=key, sender=msg.sender, receiver=msg.receiver) else: # group message (excludes group command) # cache the key with direction (sender -> group) self.cache_cipher_key(key=key, sender=msg.sender, receiver=group) # NOTICE: check attachment for File/Image/Audio/Video message content # after deserialize content, this job should be do in subclass return content
def deserialize_message(self, data: bytes) -> Optional[ReliableMessage]: dictionary = json_decode(data=data) # TODO: translate short keys # 'S' -> 'sender' # 'R' -> 'receiver' # 'W' -> 'time' # 'T' -> 'type' # 'G' -> 'group' # ------------------ # 'D' -> 'data' # 'V' -> 'signature' # 'K' -> 'key' # ------------------ # 'M' -> 'meta' return ReliableMessage.parse(msg=dictionary)
def deserialize_key(self, data: Optional[bytes], sender: ID, receiver: ID, msg: SecureMessage) -> Optional[SymmetricKey]: if data is None: # get key from cache return self.key_cache.cipher_key(sender=sender, receiver=receiver) else: assert not is_broadcast(msg=msg), 'broadcast message has no key: %s' % msg dictionary = json_decode(data=data) # TODO: translate short keys # 'A' -> 'algorithm' # 'D' -> 'data' # 'V' -> 'iv' # 'M' -> 'mode' # 'P' -> 'padding' return SymmetricKey.parse(key=dictionary)