axtverify

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 31, 2026 License: Apache-2.0 Imports: 20 Imported by: 0

README

axt-verify

axt-verify lets an organization enrolled in Anthropic Access Transparency check, on its own machines and without trusting Anthropic's serving path, that:

  1. the transparency log Anthropic serves for the organization is signed by the key this release carries and has only ever been appended to; and
  2. every Access Transparency event the Compliance API serves — each record of Anthropic personnel accessing or preserving the organization's data — is committed in that log, byte for byte.

If Anthropic (or anyone in between) rewrote or back-dated an event it serves, re-served one it had already shown you with different content or at a different position in the log — for as long as the feed keeps listing that event, plus the overlap window — or served the organization a rolled-back or forked history, a run fails. What the tool cannot do is prove the feed showed you every leaf your log holds: it checks what you are served against what the log committed, so an event simply left out of the feed is not something an inclusion proof can speak for.

The log format is the open C2SP tlog-tiles standard; this tool adds the Access Transparency specifics — the event canonicalization and the Compliance API transport — on top of the standard golang.org/x/mod/sumdb/note and github.com/transparency-dev/{formats,merkle} libraries. See How verification works below and the Transparency Log section of the Compliance API reference.

Maintenance status: actively maintained. We triage issues and review pull requests; see CONTRIBUTING.md.

Install

Requires Go 1.26 or newer.

go install github.com/anthropics/axt-verify/cmd/axt-verify@latest

or build from a checkout with go build ./cmd/axt-verify. The binary has no runtime dependencies.

Setup

Two inputs, both supplied on the command line or in the environment:

Input What it is
ANTHROPIC_COMPLIANCE_ACCESS_KEY A Compliance Access Key with the read:compliance_activities scope — the same key you use for the Compliance API Activity Feed (see "Set up the Compliance API" in the Claude docs). Read from the environment only, never from a file or a flag.
--org Your organization's UUID — the value the Activity Feed serves as organization_uuid (not the org_… tagged id).
export ANTHROPIC_COMPLIANCE_ACCESS_KEY=…
axt-verify --org 25f6429a-3293-49bf-afed-cb312911554b checkpoint

The log's public key ships inside this release, so nothing is fetched and nothing is read from disk to decide what to trust. (The tool does write: run and checkpoint keep their progress in a state file, and --save writes a checkpoint archive — see --state below.)

The table below is the key this release carries, and it doubles as the published record to check a build against. Your log's origin is axt.anthropic.com/<your org uuid>, and every checkpoint must carry exactly that line:

Origin prefix SHA-256 of the public key
axt.anthropic.com 1dff5fe420d49743fe444a04fc17f818eea856699dec2ebbc24df15602c74a58
Overrides
Flag Meaning
--log-key Trust this note-verifier key instead of the one built into this release — for an announced key rotation before you can upgrade. The key's own name is the origin every checkpoint must then carry, and it has to end in /<your org uuid>, so the key and the log it verifies cannot disagree. Also read from $AXT_VERIFY_LOG_KEY; the flag wins.
--state Where to keep the state file. Defaults to axt-verify.state in the current directory — pass an explicit path from cron.

Keys rotate by release. A checkpoint that does not verify under the shipped key is a hard failure, never an occasion to go and fetch a different key: if Anthropic announces a rotation, upgrade axt-verify, or pass the new key with --log-key until you can. Such a failure prints the key hashes the served checkpoint claims, alongside the hash of the key this run trusts. The signatures did not verify, so those are claims rather than proof: a claimed hash that is not in Anthropic's published key table is a security finding, and one that is in the table points at a rotation you have not upgraded to — upgrade, or pass --log-key, and run again. If it still fails, treat it as a security finding, because anyone who can serve you a checkpoint that does not verify can also put a published key's hash on it.

Only the newest key is needed. A checkpoint commits to the whole history, so once one checkpoint signed by the new key verifies, and a consistency proof from the checkpoint you last saved leads to it, that proof re-establishes every entry before the rotation as well — the old key is not needed to verify what it once signed. The one exception is an archived checkpoint you hold that the old key signed: --from verifies its signature and would refuse it under the new key, so pass such a file with --from-trusted, which takes its tree size and root hash as your own record without checking the signature. The origin is still enforced.

Commands

Command What it does
run The one to put in cron: verify the latest checkpoint, prove the log only appended since your last run, then page through your Access Transparency events and prove each is committed in the log.
checkpoint Verify the latest checkpoint and the append-only property, without reading the event feed. Cheap enough for a tighter schedule than the full run; give it its own --state file.
events FILE Verify events you already hold, read from a file or - for stdin — a JSON object, an array, a {"data":[…]} page, or one JSON object per line. Proves each against the log without touching the feed. Rows that are not Access Transparency records — other activity types in the same page or export — are ignored and counted, not failed. Each object is otherwise verified as given: unlike run, this does not collapse two copies of one event id, so a page captured while the log was first stamping indexes can list the same id twice — once as not logged and once verified.
version Print the version. Needs no credential and makes no request.

--from, --from-trusted, --prev-size/--prev-hash and --save work with run and checkpoint; see Keeping your own checkpoint archive.

Run

axt-verify run

does, in order:

  1. fetches the latest checkpoint and verifies the log signature and the origin line;
  2. proves the log is an append-only extension of the checkpoint saved by the previous run (the consistency proof);
  3. pages through your Access Transparency events on GET /v1/compliance/activities since the previous run (plus a seven-day overlap for late-arriving events), rebuilds each event's leaf from the served JSON, and verifies an inclusion proof for it against the checkpoint;
  4. saves the new checkpoint and its progress to axt-verify.state (in the current directory; override with --state, and do from cron).

Schedule it — hourly is reasonable — and alert on the exit status:

Exit Meaning Action
0 Nothing failed. Events served with no leaf, and — under run — events still awaiting a checkpoint, are reported rather than verified — see Event outcomes. —
1 Verification failed: a bad signature, wrong origin, a log that shrank or forked, an invalid proof, or an event whose served content is not what the log committed. Treat as a security finding. Keep the state file and the output; contact Anthropic.
2 Usage error. Fix the invocation.
3 Could not complete: network failure, API errors, rate limiting after retries, or an events file holding an index the log has published no checkpoint for, or no proof for one it published while the check waited. Rerun; page only if it persists.
17 * * * *  ANTHROPIC_COMPLIANCE_ACCESS_KEY=$(cat /etc/axt-verify/key) axt-verify --org <uuid> --state /var/lib/axt-verify/state --json run >>/var/log/axt-verify.jsonl || alert "axt-verify exit $?"

Sample output:

origin:      axt.anthropic.com/25f6429a-3293-49bf-afed-cb312911554b
checkpoint:  tree size 1207, root hash nB9mUdyOWMp0zXI0k1S…=
append-only: verified from tree size 1188
events:      19 verified

--json prints the same report as one JSON object, one per line. The complete field list:

Field Meaning
ok True when nothing this pass examined failed.
origin The origin every checkpoint had to carry.
checkpoint.size, checkpoint.root_hash The tree this pass verified.
checkpoint.note The signed checkpoint verbatim — valid input to --from, so a line of this log is an archive of what the log said.
previous_size Tree size the append-only check started from; null on a first run.
events.verified Count of events proven present in the log.
events.not_logged, events.pending Event ids in those outcomes (see Event outcomes).
events.failed[].id, .leaf_index, .reason Each finding: which event, where it claimed to sit, and what was wrong.
events.skipped_other_types Rows that are not Access Transparency records, passed over rather than checked.
truncated True when --max-pages stopped the feed read early.
inconsistency.older, .newer, .proof Present only on an append-only failure: both checkpoint notes and the proof hashes the log served between them, so the evidence stands on its own.
error The failure message, when there was one.
Other commands
  • axt-verify checkpoint — steps 1, 2 and 4 only. Cheap; suitable for a tighter schedule than the full run. Give it its own --state file: two invocations that overlap on one file would each verify a different honest extension of the same anchor, so a save refuses a file that changed while the pass ran (exit 3) rather than discard the other's checkpoint.
  • axt-verify events FILE — verify events you already hold (a SIEM export, an auditor's sample) instead of reading the feed. It checks each event against a freshly fetched checkpoint and keeps no anchor, so it cannot tell you the log is the same one it was yesterday; the scheduled run is what does that. FILE (or - for stdin) may be one served event object, a JSON array of them, a raw /v1/compliance/activities page, or one object per line. Does not touch the state file.
Event outcomes
  • verified — the leaf rebuilt from the served event is provably at the event's transparency_log_leaf_index in the signed tree.
  • pending — the event's index is beyond the latest published checkpoint. Normal for a few minutes after an event appears; run remembers it and verifies it once covered, and fails it if that takes longer than --pending-grace (24h). events remembers nothing, so it waits up to a minute for the log to publish a checkpoint that covers the file and verifies against that. Anything still uncovered, and anything the log published while it waited but serves no proof for yet, is reported pending and exits 3: run the file again once the log has caught up, and treat an event that never settles as a finding. An index the log had already published before the check began is held to the stricter rule: the check re-reads the proof endpoint for the rest of its minute, and only a proof still missing when that runs out is a failure — see exit status 1.
  • not logged — the event was served with a null index: it was recorded while your organization had no active log (before enrollment, or between disenrollment and re-enrollment), and is expected for those periods. The tool reports these and does not judge them: an event's created_at and the absence of an index are served, not committed, so there is nothing to check them against.
  • FAILED — see exit status 1.
Flags worth knowing

--max-pages N bounds one run's feed read for a very large backlog; the run reports truncated and the next run resumes. Set too low to get past where the previous run stopped, the run fails (exit 3) rather than quietly re-read the same events forever. --overlap widens the re-read window if your events are subject to unusually long delivery delays.

Keeping your own checkpoint archive

The strongest thing you can hold is your own record of what the log said yesterday. Hand it back tomorrow and the log has to prove it still extends it:

axt-verify --org <uuid> --state /var/lib/axt-verify/archive.state checkpoint --from yesterday.ckpt --save today.ckpt
mv today.ckpt yesterday.ckpt

--save writes the verified checkpoint note verbatim, and only after a pass that verified. --from accepts that file, a --json report line, or a state file. For an archive signed by a key that has since rotated out, --from-trusted takes the file's tree size and root hash as your own record without checking its signatures; --prev-size and --prev-hash do the same for a pair you kept somewhere else. If the log cannot prove it extends what you kept, the failure prints both checkpoints and the proof in full, so the evidence does not depend on that log staying reachable.

How verification works

  • Checkpoint. A signed note: origin line, tree size, root hash, then signatures. Accepted only if the log key signed it and the origin line equals your origin exactly. All organizations' logs are signed by the same key, so the origin comparison — not the signature — is what makes a checkpoint yours.
  • Append-only. The previous run's checkpoint is kept in the state file. A tree smaller than the saved one is a rollback unless the log can still show a head covering the saved size and prove the saved checkpoint is a prefix of it — a read served from behind recovers, a log that has lost the tree does not; an equal tree must have the same root; a larger tree must come with an RFC 6962 consistency proof (GET …/transparency_log/consistency?from=N). Checkpoints that arrive embedded in proof responses mid-run are linked into the same history the same way before anything is verified against them.
  • Inclusion. Each served event is projected onto leaf field set v1 — eleven keys, RFC 8785 canonical JSON, prefixed with the version byte 0x01 — exactly as the Compliance API reference's Leaf canonicalization section specifies; leaf/ is that specification in code and is tested against the log's own golden vectors. The leaf hash and the audit path from GET …/transparency_log/inclusion?leaf_index=N must reproduce the signed root. An event type outside v1's list (anthropic_access, cmek_preserve) is refused: new types ship under a new version byte and need a newer axt-verify.
  • Nothing from the API is trusted until it verifies against the key this release carries: not the checkpoint, not the proofs, not the leaf index.

Limits

  • The tool proves that what you are served matches what the log committed, and that the log's history only grows. It cannot prove the feed showed you every leaf your log holds; see the introduction above.
  • Without an independent timestamping party, a targeted replay of a stale checkpoint together with a frozen feed is not detectable from the client side: every proof still verifies against the old tree. Archive verified checkpoints with --save, compare them across runs and machines, and raise a checkpoint that stops growing for an unexpectedly long time with Anthropic.

Security considerations

  • The trust anchor can be overridden from the environment: --log-key and $AXT_VERIFY_LOG_KEY replace the built-in key. The tool names the key it trusts on stderr, and a supplied key is announced even with --quiet. Protect the environment your cron line runs in, and watch that line.
  • --from-trusted and --prev-size/--prev-hash are baselines taken on your word, with no signature check. Protect the files and values you pass them.
  • Deleting the state file re-baselines the next run: it starts from whatever checkpoint the log serves (exit 0) and can detect no rollback that run. Keep an archived note (--save, handed back with --from) as the durable anchor.
  • The Compliance Access Key is read from $ANTHROPIC_COMPLIANCE_ACCESS_KEY and grants read access to all of your organization's compliance activities. A process running as the same user can read the cron's environment; scope that user and the key file accordingly.
  • Build releases without build tags. A build made with -tags axtverify_internal honours an API-host override from the environment; a release build has no such override.
  • Library users: compliance.Client.AllowInsecure permits a plain-http base URL and is for tests only.

Library use

The packages under this module (leaf, checkpoint, compliance, and the top-level axtverify) are importable for pipelines that would rather embed verification than shell out. The command is a thin wrapper over them.

License

This project is licensed under the Apache License 2.0. See the LICENSE file at the repository root for the full text.

Copyright 2026 Anthropic PBC

Documentation

Overview

Package axtverify verifies that an organization's Access Transparency events are included in its transparency log, using only trust decided locally: the log key this release ships, or one the operator supplies. The cmd/axt-verify tool is a thin command line over it.

Index

Constants

View Source
const OriginPrefix = "axt.anthropic.com"

OriginPrefix is the production log's origin name, the part before the organization UUID. It is a constant rather than a setting: a customer verifies their own log, and there is only one production deployment of it.

Variables

View Source
var ErrLogAdvancing = errors.New("the log advanced repeatedly during verification; rerun")

ErrLogAdvancing means the log published new checkpoints faster than one run could relate them; rerunning resolves it.

View Source
var ErrVerification = errors.New("verification failed")

ErrVerification marks a failed cryptographic check: a checkpoint, consistency or inclusion proof that does not stand up. Every one of these is a finding about the log, not about this tool, and callers separate them from transport trouble on that basis.

Functions

func BuiltinFingerprint

func BuiltinFingerprint() (string, bool)

BuiltinFingerprint is the published fingerprint of the key this release ships, so the tool can name what it is trusting.

func BuiltinVerifierKey

func BuiltinVerifierKey(orgUUID string) (string, bool)

BuiltinVerifierKey is the note-verifier string this release verifies an organization's log with.

func Fingerprint

func Fingerprint(der []byte) string

Fingerprint is the value published for a key and printed in the README, so an operator can see that a release ships the key they expect.

func FingerprintOfVerifierKey

func FingerprintOfVerifierKey(vkey string) (string, bool)

FingerprintOfVerifierKey is the published fingerprint — SHA-256 of the key's DER SubjectPublicKeyInfo — of the key a verifier string carries.

It is derivable only from the ECDSA form this log signs with, whose payload is 0x02 || SPKI. A standard Ed25519 note key carries 0x01 || the raw 32-byte key, and the SPKI cannot be recovered from that, so hashing the payload would print a number that matches nothing anyone published. Callers that must show something for any key use KeyHash.

func KeyHash

func KeyHash(vkey string) (string, bool)

KeyHash is the 8-hex key hash a verifier string carries: the value a note signature is matched by, and the one field that is meaningful for every key encoding.

func Origin

func Origin(orgUUID string) string

Origin is the log origin for an organization: the fixed prefix and the organization's UUID, which is exactly the line every checkpoint must carry.

func ReadBaselineNote

func ReadBaselineNote(raw []byte, v *checkpoint.Verifier, trusted bool) (checkpoint.Checkpoint, error)

ReadBaselineNote finds a signed checkpoint note in what the caller handed over. It is liberal about the container — the raw note, a --json report, or a state file all carry one — and strict about the note itself: verify decides whether the signatures must check out, and the origin is enforced either way.

func VerifierKeyFor

func VerifierKeyFor(origin string, der []byte) string

VerifierKeyFor builds the note-verifier string for an ECDSA P-256 key, the one encoding the log signs under: "<origin>+<8 hex>+base64(0x02 || SPKI)". This is the exact encoding the log's published keys use, so any tooling that renders a key for this log must produce these bytes.

Types

type Baseline

type Baseline struct {
	Checkpoint checkpoint.Checkpoint
	// Label says where it came from, for the pass's own output.
	Label string
}

Baseline is a checkpoint the caller keeps for itself — yesterday's archived note, or a size and root hash recorded elsewhere — that this pass must prove the log still extends.

func BaselineFromPair

func BaselineFromPair(size uint64, hash string) (Baseline, error)

BaselineFromPair builds a baseline from a size and root hash the caller supplies directly. Nothing authenticates the pair — it is the caller's own record — so the label says so wherever the pass reports it.

type CheckpointReport

type CheckpointReport struct {
	Size     uint64 `json:"size"`
	RootHash []byte `json:"root_hash"`
	// Note is the signed checkpoint exactly as served, so a caller can keep
	// it as its own record of what this pass verified.
	Note string `json:"note,omitempty"`
}

CheckpointReport describes the newest checkpoint verified in the pass.

type DoneEvent

type DoneEvent struct {
	CreatedAt time.Time `json:"created_at"`
	// Index is the verified leaf index; nil for an event served with no leaf.
	Index *uint64 `json:"leaf_index"`
	// LeafHash is the leaf hash that verified, so a re-listing of the same
	// id inside the overlap window is checked against it rather than
	// trusted.
	LeafHash []byte `json:"leaf_hash,omitempty"`
	// RecordedAt is when this pass verified the event, by the verifier's own
	// clock. Retention keys on it rather than on the served created_at,
	// which a serving path could backdate to have the record — the only
	// detector of a later index withdrawal — pruned early.
	RecordedAt time.Time `json:"recorded_at,omitzero"`
}

DoneEvent is a processed event.

type EventFailure

type EventFailure struct {
	ID     string  `json:"id"`
	Index  *uint64 `json:"leaf_index,omitempty"`
	Reason string  `json:"reason"`
}

EventFailure is one event that failed verification.

type EventReport

type EventReport struct {
	// Verified events have a valid inclusion proof for their rebuilt leaf.
	Verified int `json:"verified"`
	// NotLogged events were served with a null leaf index: recorded while
	// the organization had no active log. Expected before enrollment and
	// in a sealed gap. They are reported, never failed: the absence of an
	// index is served, not committed, so there is nothing to verify it
	// against.
	NotLogged []string `json:"not_logged"`
	// Pending events carry a leaf index no published checkpoint covers yet.
	Pending []string `json:"pending"`
	// Failed events could not be verified; each is a finding to escalate.
	Failed []EventFailure `json:"failed"`
	// SkippedOtherTypes counts rows that are not Access Transparency records
	// at all — other activity types in the same feed or export. They are not
	// this tool's to check, and passing over them is not a finding.
	SkippedOtherTypes int `json:"skipped_other_types"`
}

EventReport tallies the events examined.

type FeedState

type FeedState struct {
	// HighWater is the newest created_at processed. The next run re-reads
	// an overlap window behind it because events become listable after an
	// ingestion delay, out of created_at order.
	HighWater time.Time `json:"high_water,omitzero"`
	// Done records events inside the overlap window that need no further
	// work (verified, or permanently without a leaf), keyed by activity id.
	Done map[string]DoneEvent `json:"done,omitempty"`
	// Pending records events whose leaf index no published checkpoint
	// covered yet, keyed by activity id.
	Pending map[string]PendingEvent `json:"pending,omitempty"`
}

FeedState tracks progress through the activity feed.

type Inconsistency

type Inconsistency struct {
	// Older and Newer are the two signed notes, verbatim.
	Older string `json:"older"`
	Newer string `json:"newer"`
	// Proof is the consistency proof the log served between them, base64.
	Proof []string `json:"proof"`
}

Inconsistency is everything needed to show that a log broke its append-only promise, without asking that log anything further. A verifier that reported only "consistency proof failed" would leave the customer holding a claim they cannot substantiate once the misbehaving server stops answering — or starts answering differently.

type InconsistencyError

type InconsistencyError struct {
	Evidence Inconsistency
	Err      error
}

InconsistencyError is a verification failure carrying that evidence.

func AsInconsistency

func AsInconsistency(err error) (*InconsistencyError, bool)

AsInconsistency extracts the evidence from an error chain, if it carries any.

func (*InconsistencyError) Details

func (e *InconsistencyError) Details() string

Details renders the evidence for a human, and for whoever they forward it to: both notes in full and the proof the log offered between them.

func (*InconsistencyError) Error

func (e *InconsistencyError) Error() string

func (*InconsistencyError) Unwrap

func (e *InconsistencyError) Unwrap() []error

type PendingEvent

type PendingEvent struct {
	Index     uint64    `json:"leaf_index"`
	LeafHash  []byte    `json:"leaf_hash"`
	CreatedAt time.Time `json:"created_at,omitzero"`
	FirstSeen time.Time `json:"first_seen"`
}

PendingEvent is an event awaiting a covering checkpoint. LeafHash lets a later run verify it without re-reading the event.

type Report

type Report struct {
	Origin string `json:"origin"`
	// Inconsistency carries the evidence of a broken append-only property,
	// when that is why the pass failed.
	Inconsistency *Inconsistency   `json:"inconsistency,omitempty"`
	Checkpoint    CheckpointReport `json:"checkpoint"`
	// PreviousSize is the tree size of the checkpoint the append-only check
	// started from; nil on a first run.
	PreviousSize *uint64     `json:"previous_size"`
	Events       EventReport `json:"events"`
	// Truncated is set when MaxPages stopped the feed read early.
	Truncated bool `json:"truncated,omitempty"`
}

Report summarizes one pass. Failed events and a non-nil error from the pass are the two ways verification can fail; everything else is informational.

func (Report) OK

func (r Report) OK() bool

OK reports whether the pass verified everything it examined.

type State

type State struct {
	Version int `json:"version"`
	// Origin guards against pointing one organization's state at another's
	// configuration.
	Origin string `json:"origin"`
	// Checkpoint is the signed note of the newest checkpoint verified so far.
	Checkpoint string `json:"checkpoint,omitempty"`
	// VerifiedAt is when Checkpoint was verified.
	VerifiedAt time.Time `json:"verified_at,omitzero"`
	Feed       FeedState `json:"feed"`
	// contains filtered or unexported fields
}

State is what one run leaves for the next: the last checkpoint it verified (the anchor for the append-only check) and how far through the activity feed it got. It holds no secrets and no event content.

func LoadState

func LoadState(path, origin string) (*State, error)

LoadState reads path; a missing file yields an empty state for origin. A state written for a different origin is an error.

func (*State) Save

func (s *State) Save(path string) error

Save writes the state to path atomically with owner-only permissions. It refuses to overwrite a file that changed since LoadState read it — two overlapping invocations sharing one state file must fail loudly rather than have one silently discard the other's verified checkpoint. This detects that collision; it is not a lock, and the README tells a concurrent schedule to use a state file of its own.

type Verifier

type Verifier struct {
	Checkpoints *checkpoint.Verifier
	Client      *compliance.Client

	// Baselines are checkpoints the caller keeps for itself — an archived
	// note, or a bare (size, hash) pair. Each must be a prefix of what this
	// pass verifies, on top of whatever the state file already ratchets.
	Baselines []Baseline
	// Overlap is how far behind the feed high-water mark each run
	// re-reads (default 168h). It must exceed the feed's ingestion and
	// delivery delays so late-listed events are not skipped.
	Overlap time.Duration
	// PendingGrace is how long an event may wait for a covering checkpoint
	// before that becomes a failure (default 24h).
	PendingGrace time.Duration
	// CoverageWait bounds how long `events` waits for a checkpoint covering
	// an index it was handed (default 60s). `run` never waits: it remembers
	// the event and settles it on a later pass.
	CoverageWait time.Duration
	// CoveragePoll is how often that wait re-reads the log (default 15s,
	// the log's publish cadence).
	CoveragePoll time.Duration
	// PageSize is the feed page size (default 1000).
	PageSize int
	// MaxPages bounds feed pages per run; zero is unbounded. A bounded run
	// reports Truncated and resumes where it stopped.
	MaxPages int
	// Now is time.Now unless replaced.
	Now func() time.Time
	// Logf receives progress lines; nil discards them.
	Logf func(format string, args ...any)
}

Verifier runs verification passes for one organization's log.

func (*Verifier) Run

func (v *Verifier) Run(ctx context.Context, st *State) (Report, error)

Run is the scheduled pass: verify the latest checkpoint and the append-only property, then read the organization's Access Transparency events from the activity feed — everything since the last run, plus an overlap window — and verify each one's inclusion. Progress is recorded in st, which the caller saves.

func (*Verifier) VerifyCheckpoint

func (v *Verifier) VerifyCheckpoint(ctx context.Context, st *State) (Report, error)

VerifyCheckpoint fetches and verifies the latest checkpoint and, given a state with an earlier one, the append-only property since. On success the state's checkpoint advances.

func (*Verifier) VerifyEvents

func (v *Verifier) VerifyEvents(ctx context.Context, st *State, events []json.RawMessage) (Report, error)

VerifyEvents verifies served events supplied by the caller (a feed page, a SIEM export). st may be nil; when given, the append-only check runs and the state's checkpoint advances.

Directories

Path Synopsis
Package checkpoint verifies transparency-log checkpoints against a pinned trust policy — the log's origin and the log's note-verifier key — and verifies Merkle proofs against verified checkpoints.
Package checkpoint verifies transparency-log checkpoints against a pinned trust policy — the log's origin and the log's note-verifier key — and verifies Merkle proofs against verified checkpoints.
cmd
axt-verify command
Command axt-verify checks that Anthropic's Access Transparency log for your organization is what it claims to be: correctly signed, append-only, and committing to the events the Compliance API serves you.
Command axt-verify checks that Anthropic's Access Transparency log for your organization is what it claims to be: correctly signed, append-only, and committing to the events the Compliance API serves you.
Package compliance is a client for the slice of the Anthropic Compliance API that axt-verify reads: an organization's transparency log (/v1/compliance/transparency_log/…) and its Access Transparency events on the activity feed (/v1/compliance/activities).
Package compliance is a client for the slice of the Anthropic Compliance API that axt-verify reads: an organization's transparency log (/v1/compliance/transparency_log/…) and its Access Transparency events on the activity feed (/v1/compliance/activities).
internal
testlog
Package testlog is an in-memory transparency log and a fake of the Compliance API surface axt-verify reads, for hermetic tests.
Package testlog is an in-memory transparency log and a fake of the Compliance API surface axt-verify reads, for hermetic tests.
Package leaf rebuilds Access Transparency transparency-log leaf entries from events exactly as the Compliance API activity feed serves them.
Package leaf rebuilds Access Transparency transparency-log leaf entries from events exactly as the Compliance API activity feed serves them.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL