Crate sigh

source ·
Expand description

HTTP signature generation and verification for ActivityPub

Usage

Generate a keypair

use sigh::Key;
use sigh::alg::{Algorithm, RsaSha256};

let (private_key, public_key) = RsaSha256.generate_keys().unwrap();
publish(public_key.to_pem().unwrap());
save(private_key.to_pem().unwrap());

fn publish(public_key: String) {
  // include public_key in an ActivityPub actor's json
}
fn save(private_key: String) {
  // stash private_key away securely
}

Sign a HTTP request

use http::Request;
use sigh::{Key, PrivateKey, SigningConfig};
use sigh::alg::RsaSha256;

fn sign_request<B>(request: &mut Request<B>, private_key_pem: &[u8]) -> Result<(), sigh::Error> {
    let private_key = PrivateKey::from_pem(private_key_pem)?;
    SigningConfig::new(RsaSha256, &private_key, "my-key-id")
        .sign(request)
}

Verify a HTTP request

use http::Request;
use sigh::{Key, PublicKey, Signature};

fn lookup_public_key_pem(key_id: Option<&str>) -> Option<&[u8]> {
    // retrieve the public_key in PEM format

    None
}

fn verify_request<B>(request: &Request<B>) -> bool {
    let signature = Signature::from(request);
    let key_id = signature.key_id();
    let public_key_pem = match lookup_public_key_pem(key_id) {
        Some(public_key_pem) => public_key_pem,
        None => return false,
    };
    let public_key = match PublicKey::from_pem(public_key_pem) {
        Ok(public_key) => public_key,
        Err(_) => return false,
    };
    signature.verify(&public_key)
        .unwrap_or_else(|_| false)
}

Modules

Signature algorithms

Structs

Key serialization/deserialization A private key for signing
Key serialization/deserialization A public key for verification
Signature state for verifying a request
Configuration for generating a signature

Enums

General error type General error type

Traits

Key serialization/deserialization Key that is serializable from/to PEM