示例#1
0
    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
示例#2
0
 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)
示例#3
0
 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)