dkd


Namedkd JSON
Version 2.1.0 PyPI version JSON
download
home_pagehttps://github.com/dimchat/dkd-py
SummaryA common message module
upload_time2024-08-29 17:19:46
maintainerNone
docs_urlNone
authorAlbert Moky
requires_pythonNone
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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 © 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)



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/dimchat/dkd-py",
    "name": "dkd",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": "Albert Moky",
    "author_email": "albert.moky@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/8f/b6/88cd1a8a8d83416bb66b017d88e0856949b5b66b3454f58061b7ef9d328e/dkd-2.1.0.tar.gz",
    "platform": null,
    "description": "# Dao Ke Dao (\u9053\u53ef\u9053) -- Message Module (Python)\n\n[![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/dimchat/dkd-py/blob/master/LICENSE)\n[![Version](https://img.shields.io/badge/alpha-0.10.12-red.svg)](https://github.com/dimchat/dkd-py/wiki)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/dimchat/dkd-py/pulls)\n[![Platform](https://img.shields.io/badge/Platform-Python%203-brightgreen.svg)](https://github.com/dimchat/dkd-py/wiki)\n\nThis [document](https://github.com/dimchat/DIMP/blob/master/DaoKeDao-Message.md) introduces a common **Message Module** for decentralized instant messaging.\n\nCopyright &copy; 2018-2019 Albert Moky\n\n- [Envelope](#envelope)\n    - Sender\n    - Receiver\n    - Time\n- [Content](#content)\n    - [Type](#content-type)\n    - Serial Number\n- [Message](#message)\n    - [Instant Message](#instant-message)\n    - [Secure Message](#secure-message)\n    - [Reliable Message](#reliable-message)\n\n## <span id=\"envelope\">0. Envelope </span>\n\n### Message Envelope\n\n```javascript\n/* example */\n{\n    \"sender\"   : \"moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk\",\n    \"receiver\" : \"hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj\",\n    \"time\"     : 1545405083\n}\n```\n\n## <span id=\"content\">1. Content</span>\n\n```javascript\n/* example */\n{\n    \"type\"     : 0x01,      // message type\n    \"sn\"       : 412968873, // serial number (message ID in conversation)\n\n    \"text\"     : \"Hey guy!\"\n}\n```\n\n### <span id=\"content-type\">Message Content Type</span>\n\n```python\nclass ContentType(IntEnum):\n\n    TEXT = 0x01        # 0000 0001\n\n    FILE = 0x10        # 0001 0000\n    IMAGE = 0x12       # 0001 0010\n    AUDIO = 0x14       # 0001 0100\n    VIDEO = 0x16       # 0001 0110\n\n    PAGE = 0x20        # 0010 0000\n\n    # quote a message before and reply it with text\n    QUOTE = 0x37       # 0011 0111\n\n    MONEY = 0x40          # 0100 0000\n    # TRANSFER = 0x41     # 0100 0001\n    # LUCKY_MONEY = 0x42  # 0100 0010\n\n    COMMAND = 0x88     # 1000 1000\n    HISTORY = 0x89     # 1000 1001 (Entity history command)\n\n    # top-secret message forward by proxy (Service Provider)\n    FORWARD = 0xFF  # 1111 1111\n```\n\n## <span id=\"message\">2. Message</span>\n\nWhen the user want to send out a message, the client needs TWO steps before sending it:\n\n1. Encrypt the **Instant Message** to **Secure Message**;\n2. Sign the **Secure Message** to **Reliable Message**.\n\nAccordingly, when the client received a message, it needs TWO steps to extract the content:\n\n1. Verify the **Reliable Message** to **Secure Message**;\n2. Decrypt the **Secure Message** to **Instant Message**.\n\n```javascript\n    Message Transforming\n    ~~~~~~~~~~~~~~~~~~~~\n\n    Instant Message  <-->  Secure Message  <-->  Reliable Message\n    +-------------+        +------------+        +--------------+\n    |  sender     |        |  sender    |        |  sender      |\n    |  receiver   |        |  receiver  |        |  receiver    |\n    |  time       |        |  time      |        |  time        |\n    |             |        |            |        |              |\n    |  content    |        |  data      |        |  data        |\n    +-------------+        |  key/keys  |        |  key/keys    |\n                           +------------+        |  signature   |\n                                                 +--------------+\n    Algorithm:\n        data      = password.encrypt(content)\n        key       = receiver.public_key.encrypt(password)\n        signature = sender.private_key.sign(data)\n\n```\n\n### <span id=\"instant-message\">Instant Message</span>\n\n```javascript\n/* example */\n{\n    //-------- head (envelope) --------\n    \"sender\"   : \"moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk\",\n    \"receiver\" : \"hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj\",\n    \"time\"     : 1545405083,\n\n    //-------- body (content) ---------\n    \"content\"  : {\n        \"type\" : 0x01,      // message type\n        \"sn\"   : 412968873, // serial number (ID)\n        \"text\" : \"Hey guy!\"\n    }\n}\n```\n\ncontent -> JsON string: ```{\"sn\":412968873,\"text\":\"Hey guy!\",\"type\":1}```\n\n### <span id=\"secure-message\">Secure Message</span>\n\n```javascript\n/**\n *  Algorithm:\n *      string = json(content);\n *      PW     = random();\n *      data   = encrpyt(string, PW);      // Symmetric\n *      key    = encrypt(PW, receiver.PK); // Asymmetric\n */\n{\n    //-------- head (envelope) --------\n    \"sender\"   : \"moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk\",\n    \"receiver\" : \"hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj\",\n    \"time\"     : 1545405083,\n\n    //-------- body (content) ---------\n    \"data\"     : \"9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF\",\n    \"key\"      : \"WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8=\"\n}\n```\n\n### <span id=\"reliable-message\">Reliable Message</span>\n\n```javascript\n/**\n *  Algorithm:\n *      signature = sign(data, sender.SK);\n */\n{\n    //-------- head (envelope) --------\n    \"sender\"   : \"moki@4WDfe3zZ4T7opFSi3iDAKiuTnUHjxmXekk\",\n    \"receiver\" : \"hulk@4YeVEN3aUnvC1DNUufCq1bs9zoBSJTzVEj\",\n    \"time\"     : 1545405083,\n\n    //-------- body (content) ---------\n    \"data\"      : \"9cjCKG99ULCCxbL2mkc/MgF1saeRqJaCc+S12+HCqmsuF7TWK61EwTQWZSKskUeF\",\n    \"key\"       : \"WH/wAcu+HfpaLq+vRblNnYufkyjTm4FgYyzW3wBDeRtXs1TeDmRxKVu7nQI/sdIALGLXrY+O5mlRfhU8f8TuIBilZUlX/eIUpL4uSDYKVLaRG9pOcrCHKevjUpId9x/8KBEiMIL5LB0Vo7sKrvrqosCnIgNfHbXMKvMzwcqZEU8=\",\n    \"signature\" : \"Yo+hchWsQlWHtc8iMGS7jpn/i9pOLNq0E3dTNsx80QdBboTLeKoJYAg/lI+kZL+g7oWJYpD4qKemOwzI+9pxdMuZmPycG+0/VM3HVSMcguEOqOH9SElp/fYVnm4aSjAJk2vBpARzMT0aRNp/jTFLawmMDuIlgWhBfXvH7bT7rDI=\"\n}\n```\n\n(All data encode with **BASE64** algorithm as default)\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A common message module",
    "version": "2.1.0",
    "project_urls": {
        "Homepage": "https://github.com/dimchat/dkd-py"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "24a31a91461b98b8f50d319c197a23b747a6eacaf096d55dbe7caef1f8c11355",
                "md5": "5bfad87aaba84796593e4a853e9a859d",
                "sha256": "2bf95624d16edb4cd35235c330e766d57b30cde92c5eeb090441ba54b8125f5e"
            },
            "downloads": -1,
            "filename": "dkd-2.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5bfad87aaba84796593e4a853e9a859d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 26097,
            "upload_time": "2024-08-29T17:19:44",
            "upload_time_iso_8601": "2024-08-29T17:19:44.635750Z",
            "url": "https://files.pythonhosted.org/packages/24/a3/1a91461b98b8f50d319c197a23b747a6eacaf096d55dbe7caef1f8c11355/dkd-2.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8fb688cd1a8a8d83416bb66b017d88e0856949b5b66b3454f58061b7ef9d328e",
                "md5": "0a1596ee39070f5d648aac2acb87d556",
                "sha256": "def877fd12e89df2a3e78cbb76b75fd2a0878e6afcb29c022e858fc107c07a2c"
            },
            "downloads": -1,
            "filename": "dkd-2.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0a1596ee39070f5d648aac2acb87d556",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 13122,
            "upload_time": "2024-08-29T17:19:46",
            "upload_time_iso_8601": "2024-08-29T17:19:46.452300Z",
            "url": "https://files.pythonhosted.org/packages/8f/b6/88cd1a8a8d83416bb66b017d88e0856949b5b66b3454f58061b7ef9d328e/dkd-2.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-29 17:19:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "dimchat",
    "github_project": "dkd-py",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "dkd"
}
        
Elapsed time: 0.44882s