Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Decrypting DMs #20

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,69 @@ dm_event = dm.to_event()
dm_event.sign(private_key.hex())
```

**Decrypt DMs**
Note: This code assumes you first subscribed to relays and filtered for events of kind 4 where the author is your pubkey.
```python
# Initial DM
from pynostr.encrypted_dm import EncryptedDirectMessage
from pynostr.key import PrivateKey
dm_event0 = {
"id": "abc123...",
"pubkey": "xyz123...",
"created_at": 0000000000,
"kind": 4,
"tags": [
[
"p",
"ijk098..."
]
],
"content": "encoded_content?iv=encoded_iv",
"sig": "efghijk098123..."
}
receiver_sk = PrivateKey("sk_hex")
receiver_pk = receiver_sk.public_key or dm_event0["tags"][0][1]
sender_pk = dm_event0["pubkey"]
encrypted_msg_from_sender_to_receiver = dm_event0["content"]
enc_dm = EncryptedDirectMessage(
receiver_pk.hex(),
sender_pk,
encrypted_message=encrypted_msg_from_sender_to_receiver,
)
enc_dm.decrypt(receiver_sk.hex())
message = enc_dm.cleartext_content
print(message)

# Response DM
dm_event1 = {
"id": "123abc...",
"pubkey": "ijk098...",
"created_at": 0000000000,
"kind": 4,
"tags": [
[
"p",
"xyz123..."
]
],
"content": "encoded_content?iv=encoded_iv",
"sig": "abcdef123456..."
}

receiver_sk = PrivateKey("sk_hex")
receiver_pk = receiver_sk.public_key or dm_event1["tags"][0][1]
sender_pk = dm_event1["pubkey"]
encrypted_msg_from_sender_to_receiver = dm_event1["content"]
enc_dm = EncryptedDirectMessage(
receiver_pk.hex(),
sender_pk,
encrypted_message=encrypted_msg_from_sender_to_receiver,
)
enc_dm.decrypt(receiver_sk.hex())
message = enc_dm.cleartext_content
print(message)
```

**NIP-26 delegation**
```python
from pynostr.delegation import Delegation
Expand Down
1 change: 1 addition & 0 deletions pynostr/encrypted_dm.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class EncryptedDirectMessage:
cleartext_content: Optional[str] = None
encrypted_message: Optional[str] = None
reference_event_id: Optional[str] = None
event: Optional[Event] = None

@classmethod
def from_event(cls, event: Event) -> 'EncryptedDirectMessage':
Expand Down
2 changes: 1 addition & 1 deletion pynostr/message_pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

@dataclass
class EventMessage:
event: str
event: Event
subscription_id: str
url: str

Expand Down