Skip to content
Unseenet Working Group                                     A. Lorensen
UN-RFC: 0003                                              October 2026
Category: Standards Track
Status: Draft

        Unseenet: Identities, Keys and Cryptographic Primitives

Abstract

This document fixes the encodings, key types, hash functions, signature scheme and encryption primitives used throughout Unseenet. Other UN-RFCs refer to the names defined here.

1. Encodings

b32 : Base32 as in RFC 4648 section 6, lowercase, without = padding.

b64 : Base64url as in RFC 4648 section 5, without = padding.

H(x) : SHA-256 of the octet string x.

DS(label) : A domain separator: the ASCII string label followed by one zero octet (0x00). Every hash, signature and key derivation in Unseenet is prefixed with a distinct domain separator so that a value made for one purpose can never be valid for another.

|| : Concatenation of octet strings.

All integers written as text are base-10 ASCII without leading zeros.

2. Identities

An identity is an Ed25519 key pair (RFC 8032, "pure" Ed25519).

The textual form of a public key is

ed25519:<b32 of the 32-octet public key>

for example ed25519:4bq5... (60 characters in total). The algorithm prefix exists for agility. Implementations MUST reject keys and signatures with unknown prefixes; they MUST NOT fall back to weaker algorithms.

The fingerprint of a public key is

fp(pk) = first 16 characters of b32( H( DS("UNSEENET-FP-1") || pk ) )

(80 bits). Fingerprints are used in group IDs (UN-RFC 0004). Clients SHOULD display at least the first 4 characters next to display names.

A person MAY hold any number of identities. Clients SHOULD make it easy to use a separate identity per closed group, because a single identity used everywhere links all of a person's posts together.

Display names (From header) are unauthenticated labels. Clients MUST NOT present two different keys with the same display name as the same person.

3. Signatures

A signature over message m for purpose P is

sig = Ed25519-Sign( sk, DS(P) || m )

and is written as ed25519:<b64 of the 64-octet signature>.

Purposes defined in this series:

Purpose label Signs Defined in
UNSEENET-ARTICLE-1 canonical article 0002
UNSEENET-MEMBER-1 canonical article (closed-group membership) 0004
UNSEENET-APPROVAL-1 group ID and Message-ID (moderator approval) 0004

4. Encryption

4.1 Key Agreement

Encryption to an identity uses the identity's Ed25519 key converted to X25519 (the birational map used by libsodium's crypto_sign_ed25519_pk_to_curve25519 and crypto_sign_ed25519_sk_to_curve25519).

A sealed box is libsodium's crypto_box_seal: an ephemeral X25519 key, X25519 key agreement, XSalsa20-Poly1305. It hides the sender.

4.2 Symmetric Encryption

Group content is encrypted with XChaCha20-Poly1305 (IETF variant, libsodium crypto_aead_xchacha20poly1305_ietf), 32-octet key, 24-octet random nonce, with associated data as specified by the caller. The serialized form is nonce || ciphertext_with_tag.

Nonces MUST be generated from a cryptographically secure random source. Given the 192-bit nonce, random nonces are safe for any realistic number of messages per key.

4.3 Key Derivation from a Group Secret

A closed group in epoch e has a 32-octet random group secret S. Two keys are derived from it:

enc_key     = H( DS("UNSEENET-GROUP-ENC-1")    || S )
member_seed = H( DS("UNSEENET-GROUP-MEMBER-1") || S )

member_seed is used as an Ed25519 seed; its public key is the member key of that epoch (UN-RFC 0004, section 6).

5. Node Keys

A node's network identity is its Tor v3 onion service key, which is itself Ed25519. It is independent of any author identity and is not used to sign articles. A node operator SHOULD NOT reuse an author key as the onion service key.

6. Random Numbers

All keys, secrets and nonces MUST come from the operating system CSPRNG (e.g. getrandom(2), os.urandom, libsodium randombytes).

7. Security Considerations

  • Ed25519 signatures are deterministic and not malleable when verified strictly (RFC 8032 section 5.1.7). Implementations MUST use a strict verifier, because Message-IDs depend on signature bytes (UN-RFC 0002).
  • The algorithm prefixes allow future migration, e.g. to post-quantum signatures, by a later UN-RFC. Until then, Unseenet offers no protection against an adversary with a large quantum computer; recorded closed-group traffic could be decrypted in such a future.
  • Converting Ed25519 keys to X25519 is safe when, as here, the same key is used for signatures and sealed-box decryption under strictly separated purposes, but implementations MAY instead publish a separate X25519 key in a future revision.

Copyright Notice

Copyright (c) 2026 the persons identified as the document authors. This document is licensed under CC BY 4.0, see rfc/LICENSE.md.