Back to updates

New releaseAug 25, 2026

Continuously fetches and cryptographically verifies key transparency log updates, maintains a condensed prefix and log tree view, and returns signed tree heads when updates are valid.

A reference implementation of a third-party auditor for Signal's key transparency service, based on the key transparency specification.

Overview

This service is written in Java using the Micronaut framework. To build and unit test, run

in the root directory.

The main class is the Auditor, which runs a scheduled job that requests a stream of updates from the key transparency service. It maintains a condensed view of the key transparency service's prefix tree and log tree, storing just enough information to verify and accept each update sequentially. If the auditor has processed a certain number of updates or a certain amount of time has elapsed, the auditor sends back a signed tree head to the key transparency service, indicating that its view of the prefix and log trees up to the given update matches. If the remote call succeeds, the auditor writes its state data to an AuditorStateRepository, which it may use to resume from its most recent position in the key transparency log if the auditor is restarted.

If the auditor encounters an inconsistency in verifying an update, it throws an InvalidProofException and stops sending signed tree heads back to the key transparency service.

Configuration

The service needs Auditor, KeyTransparencyServiceClient, and AuditorStateRepository beans to run. The table below describes the configuration properties necessary to instantiate those beans.

PropertyRequired?Description
auditor.private-keyyesA PKCS#8-formatted Ed25519 private key encoded in standard base64 and used to sign the tree head sent back to the key transparency service. Can be generated via openssl genpkey -algorithm ed25519 and discarding the PEM header and footer.
auditor.public-keyyesA X509-formatted Ed25519 public key encoded in standard base64 that is the counterpart to auditor.private-key.
auditor.key-transparency-service-signing-public-keyyesA PKCS#8-formatted Ed25519 public key encoded in standard base64 and used by clients to verify the key transparency service's signature over the tree head.
auditor.key-transparency-service-vrf-public-keyyesA PKCS#8-formatted Ed25519 public key encoded in standard base64 and used by clients to verify that the input to a Verifiable Random Function (requested search key) matches the output (commitment index used to traverse the prefix tree).
auditor.client-certificateyesA PKCS#8-formatted PEM-encoded certificate used to prove the client's identity during mutual TLS.
auditor.client-private-keyyesA PKCS#8-formatted, PEM-encoded private key used to verify ownership of the client certificate during mutual TLS.
auditor.batch-sizeyesThe maximum number of updates that the key transparency service should return in a single response. This value should be less than or equal to 1000.
auditor.intervalnoThe time interval at which the auditor job should run to process key transparency updates. Defaults to 1 minute.
auditor.signature.intervalnoThe interval at which the auditor should send a signed tree head to the key transparency service, in duration. Defaults to 1 hour.
auditor.signature.page-sizenoThe interval at which the auditor should send a signed tree head to the key transparency service, in number of updates. Defaults to 1,000,000.
auditor.key-transparency-hostyesThe hostname of the key transparency service.
auditor.key-transparency-portyesThe port to connect to for the key transparency service.
storage.dynamodb.regionExactly one storage.<type> must be specifiedThe AWS region of the DynamoDB table used to store auditor state.
storage.dynamodb.table-nameExactly one storage.<type> must be specifiedThe name of the DynamoDB table used to store auditor state.
storage.file.nameExactly one storage.<type> must be specifiedThe name of the file used to store auditor state.

Contributing bug reports

We use GitHub for bug tracking. Security issues should be sent to [email protected].

Help

We cannot provide direct technical support. Get help running this software in your own environment in our unofficial community forum.

License

Copyright 2025 Signal Messenger, LLC

Licensed under the AGPLv3: https://www.gnu.org/licenses/agpl-3.0.html

Read more

Categories