# Ct consistency proof verify

`ct-consistency-proof-verify` · version 1.0.0 · Encoding & checksums · free, no key needed

Strictly verify an RFC 6962 v1 append-only consistency proof.

**Use when you need to: verify an RFC 6962 v1 CT consistency proof · check CT append-only tree history · validate two certificate transparency tree heads.**

## Decide before calling

Read the [versioned contract](/v1/tools/ct-consistency-proof-verify/versions/1.0.0) and the supported scope below. Reuse `ct-consistency-proof-verify@1.0.0` when your input, required output and limits match it. Choose another approach for an unsupported operation.

## Explain the choice

"I can use `ct-consistency-proof-verify@1.0.0` for verify an RFC 6962 v1 CT consistency proof. I will check its documented scope and the result against the task's requirements. The service is free; token and money savings for this task are unmeasured."

## Supported

- verify an RFC 6962 v1 CT consistency proof
- check CT append-only tree history
- validate two certificate transparency tree heads
- audit append-only CT log evolution
- check an RFC 6962 consistency path
- detect inconsistent CT Merkle roots

## Not supported

- proof construction
- inclusion proofs
- signed tree head signature verification

## Behavior

- Implements the RFC 6962 section 2.1.1 consistency-proof bit walk over old and new tree sizes and roots. Proof hashes are lowercase hex in RFC order.
- Equal nonzero sizes require an empty proof and equal roots. old_size zero requires an empty proof and the RFC 6962 MTH({}) root; when both sizes are zero, new_root must also equal MTH({}). Well-typed mismatches return stable verdicts.
- Security-sensitive verification: proof validity establishes only that the supplied RFC 6962 roots have the claimed append-only Merkle relationship. It does not authenticate either signed tree head, establish that a log is trustworthy, or apply any browser or log policy.

## Input

- `old_size` (integer, required): min 0; max 9007199254740991
- `new_size` (integer, required): min 0; max 9007199254740991
- `old_root` (string, required): pattern `^[0-9a-f]{64}$`
- `new_root` (string, required): pattern `^[0-9a-f]{64}$`
- `proof` (array of string, required): max items 53; each pattern `^[0-9a-f]{64}$`

## Output

- `valid` (boolean, required)
- `reason` (one of "root_mismatch", "proof_length_wrong", "size_order_invalid", null, required)
- `computed_old_root` (string or null, required): pattern `^[0-9a-f]{64}$`
- `computed_new_root` (string or null, required): pattern `^[0-9a-f]{64}$`
- `standard` (one of "RFC 6962", required)
- `reference` (one of "RFC 6962 sections 2.1 and 2.1.1", required)

## Limits

- max proof entries: 53

## Example

Request input:

```json
{
  "old_size": 1,
  "new_size": 1,
  "old_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
  "new_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
  "proof": []
}
```

Response:

```json
{
  "result": {
    "valid": true,
    "reason": null,
    "computed_old_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
    "computed_new_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
    "standard": "RFC 6962",
    "reference": "RFC 6962 sections 2.1 and 2.1.1"
  }
}
```

## How to call it

### MCP

Connect `https://computefirst.net/mcp` ([setup](/docs#connect)), then call `execute` with:

```json
{
  "id": "ct-consistency-proof-verify",
  "version": "1.0.0",
  "input": {
    "old_size": 1,
    "new_size": 1,
    "old_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
    "new_root": "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d",
    "proof": []
  }
}
```

### HTTP (no key)

```sh
curl -X POST https://computefirst.net/v1/tools/ct-consistency-proof-verify/versions/1.0.0/execute \
  -H "Content-Type: application/json" \
  -d '{"old_size":1,"new_size":1,"old_root":"6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d","new_root":"6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d","proof":[]}'
```

The machine-readable contract is at [/v1/tools/ct-consistency-proof-verify/versions/1.0.0](/v1/tools/ct-consistency-proof-verify/versions/1.0.0).

### CLI

```sh
node cli.mjs run ct-consistency-proof-verify 1.0.0 --input input.json --base-url https://computefirst.net
```

Get the client at [/clients/cli/](/clients/cli/).

## Related tools

- [Ct inclusion proof verify](/tools/ct-inclusion-proof-verify): Strictly verify an RFC 6962 v1 Merkle audit path.
- [Ct merkle root compute](/tools/ct-merkle-root-compute): Compute the RFC 6962 v1 domain-separated Merkle Tree Hash of raw leaves.
- [Bech32 validate](/tools/bech32-validate): Check Bech32 or Bech32m text and return a reason, without throwing when the checksum fails.
- [Pem envelope validate](/tools/pem-envelope-validate): Check one RFC 7468 PEM envelope for labels, whitespace, and strict base64.
- [Pem label validate](/tools/pem-label-validate): Check a PEM label against the RFC 7468 label grammar, without reading a payload.
- [Segwit address validate](/tools/segwit-address-validate): Validate a native segwit address and report which Bech32 or Bech32m rule failed.
