# Dao Ke Dao (道可道) -- Message Module (Python)
[](https://github.com/dimchat/dkd-py/blob/master/LICENSE)
[](https://github.com/dimchat/dkd-py/wiki)
[](https://github.com/dimchat/dkd-py/pulls)
[](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[](https://github.com/dimchat/dkd-py/blob/master/LICENSE)\n[](https://github.com/dimchat/dkd-py/wiki)\n[](https://github.com/dimchat/dkd-py/pulls)\n[](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 © 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"
}