specification.md 2.8 KB

DarkIRC protocol and data reference

This page describes the current DarkIRC-specific data placed in the Event Graph and the IRC surface exposed to local clients. The underlying peer protocol is documented in the Event Graph network protocol.

Event content

Each chat event serializes the following Privmsg structure:

Field Type Current meaning
version u8 Format version; newly emitted messages currently use 0.
msg_type u8 Message subtype; newly emitted messages currently use 0.
channel String Channel name, or an encrypted dummy value for a DM.
nick String Sender nickname, or an encrypted dummy value for a DM.
msg String Message body or encoded ciphertext.

Nicknames and channel names are limited to 24 bytes. Message bodies and topics are limited to 512 bytes. The IRC input buffer is limited to 1024 bytes.

Public channels

Without a configured channel secret, channel, nick, and msg are stored as plaintext. Public channel history should be treated as public and persistent.

Encrypted channels

For a [channel."#name"] with a secret, DarkIRC constructs a crypto_box::ChaChaBox from that 32-byte base58 secret. The channel name, padded nickname, and message are encrypted independently and encoded with base58. Every participant must configure the identical secret.

[channel."#project"]
secret = "BASE58_32_BYTE_SECRET"
topic = "Private project channel"

Generate a secret with darkirc --gen-channel-secret.

Direct messages

For a configured contact, DarkIRC encrypts dummy channel and nickname fields and encrypts the message with the contact ChaCha box. Contact configuration requires the contact's public key and the local secret key:

[contact."Bob"]
dm_chacha_public = "BOBS_BASE58_PUBLIC_KEY"
my_dm_chacha_secret = "ALICES_BASE58_SECRET_KEY"

See encrypted direct messages for the two-party setup and security limitations.

Local IRC interface

DarkIRC currently handles these IRC commands:

ADMIN, CAP, INFO, JOIN, LIST, MODE, MOTD, NAMES, NICK, PART, PASS, PING, PRIVMSG, REHASH, TOPIC, USER, and VERSION.

It provides the custom client capabilities no-history and no-autojoin. NickServ commands are sent with PRIVMSG NickServ ... when RLN is enabled. DarkIRC does not claim complete RFC 2812 compatibility; commands that depend on conventional centralized IRC server state may be absent or have P2P-specific semantics.

Reloadable configuration

REHASH reloads autojoin, [channel.*], and [contact.*] from the active configuration file. P2P, datastore, history, archive, RPC, listener, password, and RLN settings require a daemon restart.