| Crates.io | atlas-transparency-log |
| lib.rs | atlas-transparency-log |
| version | 0.1.1 |
| created_at | 2025-09-10 17:35:28.669082+00 |
| updated_at | 2025-09-10 21:06:50.039041+00 |
| description | A cryptographically secure transparency log service for C2PA manifests with Merkle tree proofs |
| homepage | |
| repository | https://github.com/IntelLabs/atlas-transparency-log |
| max_upload_size | |
| id | 1832762 |
| size | 203,072 |
A cryptographically secure, append-only storage system for manifests with verifiable transparency log capabilities. Originally designed for Content Authenticity Initiative (C2PA) manifests but supports any structured content requiring tamper-evident storage.
⚠️ Disclaimer: This project is currently in active development. The code is not stable and not intended for use in production environments. Interfaces, features, and behaviors are subject to change without notice.
git clone https://github.com/IntelLabs/atlas-transparency-log.git
cd atlas-transparency-log
cargo build --release
export MONGODB_URI="mongodb://localhost:27017"
export DB_NAME="atlas_manifests"
export SERVER_HOST="0.0.0.0"
export SERVER_PORT="8080"
export KEY_PATH="transparency_log_key.pem"
cargo run --release
git clone https://github.com/IntelLabs/atlas-transparency-log.git
cd atlas-transparency-log
docker-compose up -d
curl http://localhost:8080/merkle/root
The service will start at http://localhost:8080.
# JSON manifest
curl -X POST http://localhost:8080/manifests/my-manifest-123 \
-H "Content-Type: application/json" \
-d '{
"manifest_type": "image",
"data": "example content"
}'
# CBOR manifest
curl -X POST http://localhost:8080/manifests/my-manifest-456 \
-H "Content-Type: application/cbor" \
--data-binary @manifest.cbor
# Binary manifest with type parameter
curl -X POST http://localhost:8080/manifests/my-manifest-789?manifest_type=video \
-H "Content-Type: application/octet-stream" \
--data-binary @manifest.bin
# C2PA URN format
curl -X POST http://localhost:8080/manifests/urn:c2pa:123e4567-e89b-12d3-a456-426614174000 \
-H "Content-Type: application/json" \
-d '{"manifest_type": "model", "data": "ML model manifest"}'
curl http://localhost:8080/manifests/my-manifest-123/proof
Response:
{
"manifest_id": "my-manifest-123",
"leaf_index": 42,
"leaf_hash": "base64_hash...",
"merkle_path": ["hash1", "hash2", "hash3"],
"root_hash": "base64_root_hash...",
"tree_size": 100
}
curl -X POST http://localhost:8080/merkle/verify \
-H "Content-Type: application/json" \
-d '{
"manifest_id": "my-manifest-123",
"leaf_index": 42,
"leaf_hash": "base64_hash...",
"merkle_path": ["hash1", "hash2", "hash3"],
"root_hash": "base64_root_hash...",
"tree_size": 100
}'
| Method | Endpoint | Description |
|---|---|---|
| POST | /manifests/{id} |
Store a new manifest |
| GET | /manifests/{id} |
Retrieve a manifest by ID |
| GET | /manifests |
List manifests with pagination |
| GET | /types/{type}/manifests |
List manifests by type |
| Method | Endpoint | Description |
|---|---|---|
| GET | /manifests/{id}/proof |
Get inclusion proof for a manifest |
| GET | /merkle/root |
Get current Merkle root |
| POST | /merkle/verify |
Verify an inclusion proof |
| GET | /merkle/stats |
Get tree statistics |
| GET | /merkle/consistency |
Get consistency proof between sizes |
| POST | /merkle/consistency/verify |
Verify consistency proof |
| GET | /merkle/root/{size} |
Get historical root for specific size |
GET /manifests)limit - Maximum number of results (default: 100)skip - Number of results to skip (default: 0)manifest_type - Filter by manifest typeformat - Filter by content format (json/cbor/binary)GET /merkle/consistency)old_size - Old tree sizenew_size - New tree size# Run all tests
cargo test
# Run with output
cargo test -- --nocapture
# Run specific test
cargo test test_merkle_tree_multiple_leaves
# Test atlas-common integration
cargo test test_atlas_common_integration
atlas-transparency-log/
├── Cargo.toml # Dependencies including atlas-common
├── README.md
├── ARCHITECTURE.md
├── Dockerfile # Docker container configuration
├── compose.yml # Multi-service deployment
└── src/
├── main.rs # HTTP server and API endpoints
├── tests.rs # Integration tests
└── merkle_tree/ # Merkle tree implementation
├── mod.rs
├── hasher.rs # Wrapper for atlas-common
├── proof.rs # Proof structures and traits
└── tree.rs # Core tree implementation
Private Key Protection: The Ed25519 private key is stored in a file. Ensure proper file permissions and consider using a HSM in production.
Input Validation: Manifest IDs are validated using atlas-common's validation functions:
urn:c2pa:UUID[:claim_generator[:version_reason]]123e4567-e89b-12d3-a456-426614174000Cryptographic Security:
Size Limits: Maximum manifest size is 10MB to prevent DoS attacks.
Append-Only: No deletion or modification operations are supported to maintain log integrity.
# Check container logs
docker-compose logs atlas_service
# Rebuild containers
docker-compose build --no-cache
# Check container health
docker-compose ps
# Check MongoDB is running
docker-compose logs mongodb
# Verify connection string
docker exec -it atlas_mongodb mongosh
# Check write permissions
ls -la transparency_log_key.pem
# Generate key manually
openssl genpkey -algorithm Ed25519 -out transparency_log_key.pem
# Test hash validation
curl -X POST http://localhost:8080/manifests/test \
-H "Content-Type: application/json" \
-d '{"test": "data"}'
# Check logs for validation details
docker-compose logs atlas_service
MAX_MANIFEST_SIZE in main.rs if needed| Variable | Description | Default |
|---|---|---|
MONGODB_URI |
MongoDB connection string | mongodb://localhost:27017 |
DB_NAME |
Database name | atlas_manifests |
SERVER_HOST |
Server bind address | 0.0.0.0 |
SERVER_PORT |
Server port | 8080 |
KEY_PATH |
Ed25519 private key file path | transparency_log_key.pem |
RUST_LOG |
Logging level | info |