provable-proof 0.1.2

Provable proof envelope format for Rust
Documentation
# provable-proof

Rust helpers for the Provable proof envelope format.

This crate owns the canonical proof JSON shape used by Provable form, email, and web proofs. It depends on `provable-sdk` for Kayros verification.

All proofs use the same JSON shape:

```json
{
  "data": "<base64 payload bytes>",
  "data_format": "web_form",
  "kayros": {
    "hash": "<hex data hash>",
    "hashAlgorithm": "SHA-256",
    "timestamp": {
      "service": "kayrosbot@0.0.2:prove_single_hash",
      "response": {}
    }
  }
}
```

`data` is always base64. `data_format` tells consumers how to decode the payload: `web_form`, `web_page`, `email`, `raw_hash`, or `""`. If `data_format` is empty or missing, consumers can fall back to payload introspection.

## Installation

```toml
[dependencies]
provable-proof = "0.1.2"
provable-sdk = "0.1.2"
```

## Usage

### 1. Default usage

```rust
use provable_proof::{verify_envelope_with_inclusion, EnvelopeVerifyWithInclusionOverrides, KayrosEnvelope};

let proof_json = std::fs::read_to_string("proof.json").expect("proof.json");
let envelope = KayrosEnvelope::from_json_str(&proof_json).expect("valid proof envelope");

let result = verify_envelope_with_inclusion(
    &envelope,
    &EnvelopeVerifyWithInclusionOverrides {
        verify_batch_existence: true,
        ..Default::default()
    },
);

assert!(result.valid);
```

### 2. Creating proofs

```rust
use provable_proof::{KayrosData, KayrosEnvelope};

let payload = serde_json::json!({
    "id": "form-1",
    "form": {
        "data": {
            "email": "person@example.com"
        }
    }
});

let kayros = KayrosData::default();
let envelope = KayrosEnvelope::from_json_value(&payload, kayros, "web_form").expect("encode proof");
let proof_json = serde_json::to_string_pretty(&envelope.to_proof()).expect("serialize proof");
```

### 3. Usage with API key and custom data type

```rust
use provable_proof::{verify_envelope, EnvelopeVerifyOverrides, KayrosEnvelope};

let proof_json = std::fs::read_to_string("proof.json").expect("proof.json");
let envelope = KayrosEnvelope::from_json_str(&proof_json).expect("valid proof envelope");

let result = verify_envelope(
    &envelope,
    &EnvelopeVerifyOverrides {
        api_key: Some(std::env::var("KAYROS_API_KEY").expect("KAYROS_API_KEY")),
        data_type: Some("benchmark_s32".to_string()),
        ..Default::default()
    },
);

assert!(result.valid);
```

## Main API

- `KayrosEnvelope::new(...)`
- `KayrosEnvelope::from_bytes(...)`
- `KayrosEnvelope::from_text(...)`
- `KayrosEnvelope::from_json_value(...)`
- `KayrosEnvelope::from_json_str(...)`
- `build_envelope_verify_request(...)`
- `verify_envelope(...)`
- `verify_envelope_with_inclusion(...)`

## Data formats

- `web_form`: decoded bytes are a JSON form snapshot
- `web_page`: decoded bytes are a JSON web-proof payload
- `email`: decoded bytes are the full raw email content
- `raw_hash`: decoded bytes are already the Kayros `data_item`