Metadata-Version: 2.1
Name: dkd
Version: 0.10.13
Summary: A common message module
Home-page: https://github.com/dimchat/dkd-py
Author: Albert Moky
Author-email: albert.moky@gmail.com
License: MIT
Description: # Dao Ke Dao (道可道) -- Message Module (Python)
        
        [![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/dimchat/dkd-py/blob/master/LICENSE)
        [![Version](https://img.shields.io/badge/alpha-0.10.12-red.svg)](https://github.com/dimchat/dkd-py/wiki)
        [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/dimchat/dkd-py/pulls)
        [![Platform](https://img.shields.io/badge/Platform-Python%203-brightgreen.svg)](https://github.com/dimchat/dkd-py/wiki)
        
        This [document](https://github.com/dimchat/DIMP/blob/master/DaoKeDao-Message.md) introduces a common **Message Module** for decentralized instant messaging.
        
        Copyright &copy; 2018-2019 Albert Moky
        
        - [Envelope](#envelope)
            - Sender
            - Receiver
            - Time
        - [Content](#content)
            - [Type](#content-type)
            - Serial Number
        - [Message](#message)
            - [Instant Message](#instant-message)
            - [Secure Message](#secure-message)
            - [Reliable Message](#reliable-message)
        
        ## <span id="envelope">0. Envelope </span>
        
        ### Message Envelope
        
        ```javascript
        /* example */
        {
            "sender"   : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
            "receiver" : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
            "time"     : 1545405083
        }
        ```
        
        ## <span id="content">1. Content</span>
        
        ```javascript
        /* example */
        {
            "type"     : 0x01,      // message type
            "sn"       : 412968873, // serial number (message ID in conversation)
            
            "text"     : "Hey guy!"
        }
        ```
        
        ### <span id="content-type">Message Content Type</span>
        
        ```python
        class ContentType(IntEnum):
        
            TEXT = 0x01        # 0000 0001
        
            FILE = 0x10        # 0001 0000
            IMAGE = 0x12       # 0001 0010
            AUDIO = 0x14       # 0001 0100
            VIDEO = 0x16       # 0001 0110
        
            PAGE = 0x20        # 0010 0000
        
            # quote a message before and reply it with text
            QUOTE = 0x37       # 0011 0111
        
            MONEY = 0x40          # 0100 0000
            # TRANSFER = 0x41     # 0100 0001
            # LUCKY_MONEY = 0x42  # 0100 0010
        
            COMMAND = 0x88     # 1000 1000
            HISTORY = 0x89     # 1000 1001 (Entity history command)
        
            # top-secret message forward by proxy (Service Provider)
            FORWARD = 0xFF  # 1111 1111
        ```
        
        ## <span id="message">2. Message</span>
        
        When the user want to send out a message, the client needs TWO steps before sending it:
        
        1. Encrypt the **Instant Message** to **Secure Message**;
        2. Sign the **Secure Message** to **Reliable Message**.
        
        Accordingly, when the client received a message, it needs TWO steps to extract the content:
        
        1. Verify the **Reliable Message** to **Secure Message**;
        2. Decrypt the **Secure Message** to **Instant Message**.
        
        ```javascript
            Message Transforming
            ~~~~~~~~~~~~~~~~~~~~
        
            Instant Message  <-->  Secure Message  <-->  Reliable Message
            +-------------+        +------------+        +--------------+
            |  sender     |        |  sender    |        |  sender      |
            |  receiver   |        |  receiver  |        |  receiver    |
            |  time       |        |  time      |        |  time        |
            |             |        |            |        |              |
            |  content    |        |  data      |        |  data        |
            +-------------+        |  key/keys  |        |  key/keys    |
                                   +------------+        |  signature   |
                                                         +--------------+
            Algorithm:
                data      = password.encrypt(content)
                key       = receiver.public_key.encrypt(password)
                signature = sender.private_key.sign(data)
        
        ```
        
        ### <span id="instant-message">Instant Message</span>
        
        ```javascript
        /* example */
        {
            //-------- head (envelope) --------
            "sender"   : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
            "receiver" : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
            "time"     : 1545405083,
            
            //-------- body (content) ---------
            "content"  : {
                "type" : 0x01,      // message type
                "sn"   : 412968873, // serial number (ID)
                "text" : "Hey guy!"
            }
        }
        ```
        
        content -> JsON string: ```{"sn":412968873,"text":"Hey guy!","type":1}```
        
        ### <span id="secure-message">Secure Message</span>
        
        ```javascript
        /**
         *  Algorithm:
         *      string = json(content);
         *      PW     = random();
         *      data   = encrpyt(string, PW);      // Symmetric
         *      key    = encrypt(PW, receiver.PK); // Asymmetric
         */
        {
            //-------- head (envelope) --------
            "sender"   : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
            "receiver" : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
            "time"     : 1545405083,
            
            //-------- body (content) ---------
            "data"     : "9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF",
            "key"      : "WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8="
        }
        ```
        
        ### <span id="reliable-message">Reliable Message</span>
        
        ```javascript
        /**
         *  Algorithm:
         *      signature = sign(data, sender.SK);
         */
        {
            //-------- head (envelope) --------
            "sender"   : "moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk",
            "receiver" : "hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj",
            "time"     : 1545405083,
            
            //-------- body (content) ---------
            "data"      : "9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF",
            "key"       : "WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8=",
            "signature" : "Yo+hchWsQlWHtc8iMGS7jpn/i9pOLNq0E3dTNsx80QdBboTLeKoJYAg/lI+kZL+g7oWJYpD4qKemOwzI+9pxdMuZmPycG+0/VM3HVSMcguEOqOH9SElp/fYVnm4aSjAJk2vBpARzMT0aRNp/jTFLawmMDuIlgWhBfXvH7bT7rDI="
        }
        ```
        
        (All data encode with **BASE64** algorithm as default)
        
Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Description-Content-Type: text/markdown
