add NIP-04.
closes https://github.com/fiatjaf/nostr/pull/10. I couldn't merge that branch because it had unrelated stuff, so I used this opportunity to rewrite some things in the NIP.
This commit is contained in:
parent
ed0c7fd681
commit
62dfb5f565
|
@ -2,7 +2,7 @@ NIP-02
|
|||
======
|
||||
|
||||
Petname sharing through a special event `3`: "contact list"
|
||||
-------------------------------------------------------
|
||||
-----------------------------------------------------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
NIP-04
|
||||
======
|
||||
|
||||
Encrypted Direct Message
|
||||
------------------------
|
||||
|
||||
`draft` `optional`
|
||||
|
||||
A special event with kind `4`, meaning "encrypted direct message". It is supposed to have the following attributes:
|
||||
|
||||
**`content`** MUST be equal to the base64-encoded, aes-256-cbc encrypted string of anything a user wants to write, encrypted using a shared cipher generated by combining the recipient's public-key with the sender's private-key; this appended by the base64-encoded initialization vector as if it was a querystring parameter named "iv". The format is the following: `"content": "<encrypted_text>?iv=<initialization_vector>"`.
|
||||
|
||||
**`tags`** MUST contain an entry identifying the receiver of the message (such that relays may naturally forward this event to them), in the form `["p", "<pubkey, as a hex string>"]`.
|
||||
|
||||
**`tags`** MAY contain an entry identifying the previous message in a conversation or a message we are explicitly replying to (such that contextual, more organized conversations may happen), in the form `["e", "<event_id>"]`.
|
||||
|
||||
Code sample for generating such an event in JavaScript:
|
||||
|
||||
```
|
||||
import crypto from 'crypto'
|
||||
import * as secp from 'noble-secp256k1'
|
||||
|
||||
let sharedPoint = secp.getSharedSecret(ourPrivateKey, '02' + theirPublicKey)
|
||||
let sharedX = sharedPoint.substr(2, 64)
|
||||
|
||||
let iv = crypto.randomFillSync(new Uint8Array(16))
|
||||
var cipher = crypto.createCipheriv(
|
||||
'aes-256-cbc',
|
||||
Buffer.from(sharedX, 'hex'),
|
||||
iv
|
||||
)
|
||||
let encryptedMessage = cipher.update(text, 'utf8', 'base64')
|
||||
encryptedMessage += cipher.final('base64')
|
||||
let ivBase64 = Buffer.from(iv.buffer).toString('base64')
|
||||
|
||||
let event = {
|
||||
pubkey: ourPubKey,
|
||||
created_at: Math.floor(Date.now() / 1000),
|
||||
kind: 4,
|
||||
tags: [['p', theirPublicKey]],
|
||||
content: encryptedMessage + '?iv=' + ivBase64
|
||||
}
|
||||
```
|
Loading…
Reference in New Issue