PubSubChk is a research prototype for verifiable message delivery in publish-subscribe systems. It extends MQTT with cryptographic checks so that publishers can obtain compact evidence that messages reached the expected subscriber set, while subscribers can detect missing, reordered, modified, or inconsistent streams.
This repository contains the Key Manager, the small key transparency service used by the PubSubChk prototype. It keeps track of client public keys and per-topic subscriber membership, then exposes verifiable commitments that the PubSubChk client and broker use during delivery verification.
PubSubChk-KeyManager is the KTS component of the prototype. It is intentionally
minimal and experiment-oriented. The service stores registered public keys,
tracks topic membership, computes aggregate public keys, and publishes Merkle
roots for per-topic subscriber sets.
At a high level, it provides:
- key registration with BLS Proof-of-Possession checks;
- topic subscription updates for PubSubChk-enabled clients;
- per-topic Merkle roots for verifiable subscriber membership;
- aggregate public keys used to verify compact multi-acknowledgments;
- small helper endpoints used by the companion broker and evaluation scripts.
The full PubSubChk system is split across three repositories:
- Key Manager / Transparency Service:
Nokia-Bell-Labs/PubSubChk-KeyManager, this repository. - Client:
Nokia-Bell-Labs/PubSubChk-Client, a PubSubChk-enabled MQTT client based on Eclipse Paho MQTT Go. - Broker:
Nokia-Bell-Labs/PubSubChk-Server, a PubSubChk-enabled MQTT broker based on Mochi MQTT.
Run all three components together for end-to-end experiments.
You need Go 1.23 or newer.
git clone https://github.com/Nokia-Bell-Labs/PubSubChk-KeyManager.git
cd PubSubChk-KeyManager
go run .By default, the service listens on:
http://localhost:8443
The service exposes a small HTTP API used by the PubSubChk client and broker:
POST /register: add or remove client public keys.POST /subscribe: add or remove topic membership.POST /root: retrieve Merkle roots for topic membership commitments.POST /aggpk: retrieve aggregate public keys for subscribed topics.GET /clocks: retrieve publisher clock state used by the prototype.POST /resetandPOST /cleanall: clear in-memory state for experiments.
Request and response formats are shaped by the companion prototype components and may change as the research code evolves.
This code is a research prototype, not a production key transparency service. It keeps state in memory and is designed to support the PubSubChk evaluation rather than hardened deployment.
For the full protocol design and evaluation, see the paper at (TODO: pending publication). The companion projects at pubsubchk-client and pubsubchk-server are also useful when setting up the complete experiment.