atproto-record
Cryptographic signature operations and utilities for AT Protocol records.
Overview
A comprehensive Rust library for working with AT Protocol records, providing cryptographic signature creation and verification, AT-URI parsing, and datetime utilities. Built on IPLD DAG-CBOR serialization with support for P-256, P-384, and K-256 elliptic curve cryptography.
Features
- Record signing: Create cryptographic signatures on AT Protocol records following community.lexicon.attestation.signature specification
- Signature verification: Verify record signatures against public keys with issuer validation
- AT-URI parsing: Parse and validate AT Protocol URIs (at://authority/collection/record_key) with robust error handling
- IPLD serialization: DAG-CBOR serialization ensuring deterministic and verifiable record encoding
- Multi-curve support: Full support for P-256, P-384, and K-256 elliptic curve signatures
- DateTime utilities: RFC 3339 datetime serialization with millisecond precision for consistent timestamp handling
- Structured errors: Type-safe error handling following project conventions with detailed error messages
CLI Tools
The following command-line tools are available when built with the clap feature:
atproto-record-sign: Sign AT Protocol records with private keys, supporting flexible argument orderingatproto-record-verify: Verify AT Protocol record signatures by validating cryptographic signatures against issuer DIDs and public keys
Library Usage
Creating Signatures
use signature;
use identify_key;
use json;
// Parse the signing key from a did:key
let key_data = identify_key?;
// The record to sign
let record = json!;
// Signature metadata (issuer is required, other fields are optional)
let signature_object = json!;
// Create the signed record with embedded signatures array
let signed_record = create.await?;
Verifying Signatures
use signature;
use identify_key;
// Parse the public key for verification
let issuer_key = identify_key?;
// Verify the signature (throws error if invalid)
verify.await?;
AT-URI Parsing
use ATURI;
use FromStr;
// Parse an AT-URI into its components
let aturi = ATURIfrom_str?;
// Access the parsed components
println!; // "did:plc:abc123"
println!; // "app.bsky.feed.post"
println!; // "3k2k4j5h6g"
// The Display trait formats back to a valid AT-URI
println!; // "at://did:plc:abc123/app.bsky.feed.post/3k2k4j5h6g"
DateTime Utilities
use ;
use ;
// Use the datetime module for consistent RFC 3339 formatting
Command Line Usage
All CLI tools require the clap feature:
# Build with CLI support
# Sign a record
repository=did:plc:repo # Repository context
collection=app.bsky.feed.post # Collection type
# Sign with custom fields (e.g., issuedAt, purpose, expiry)
# Verify a signature
repository=did:plc:repo # Repository context (must match signing)
collection=app.bsky.feed.post # Collection type (must match signing)
# Read from stdin
|
License
MIT License