assinador 0.1.0

Assinatura digital de PDFs via VIDaaS (ICP-Brasil).
Documentation

assinador (lib)

Biblioteca Rust para assinatura digital de PDFs via VIDaaS (ICP-Brasil).

A VidaasSigner orquestra o fluxo completo: begin_authorization (dispara o push) → poll (aguarda a aprovação no celular) → exchange (obtém o access token) → sign_documents (assina os PDFs). A biblioteca não injeta metadados no PDF nem armazena o token — isso é responsabilidade do chamador.

use assinador::{
    VidaasConfig, VidaasSigner, Approval, DocumentSigningPort, UnsignedDocument,
};

async fn assinar(pdf_bytes: Vec<u8>) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
    let signer = VidaasSigner::new(VidaasConfig::from_env()?);

    // 1. dispara o push no celular do usuário
    let auth = signer.begin_authorization("12345678900").await?;

    // 2. consulta até aprovar; a aprovação carrega o authorization_token
    let authorization_token = loop {
        if let Approval::Approved { authorization_token } = signer.poll(&auth.code).await? {
            break authorization_token;
        }
        // aguarde (ex.: tokio::time::sleep) e tente de novo
    };

    // 3. troca o authorization_token (do poll) + verifier pelo access token
    //    (guarde-o; vale ~7 dias). NÃO use auth.code aqui.
    let token = signer.exchange(&authorization_token, &auth.verifier).await?;

    // 4. assina um ou mais PDFs
    let mut signed = signer
        .sign_documents(
            &token.value,
            vec![UnsignedDocument {
                id: "doc-1".into(),
                alias: "contrato".into(),
                pdf_bytes,
            }],
        )
        .await?;

    Ok(signed.remove(0).signed_pdf_bytes)
}

Configuração

VidaasConfig::from_env()VIDAAS_CLIENT_ID, VIDAAS_CLIENT_SECRET e (opcional) VIDAAS_BASE_URL. Ou construa VidaasConfig { .. } diretamente.

Multi-provedor

A trait DocumentSigningPort abstrai a assinatura; VidaasSigner a implementa. SigningDispatcher roteia por nome de provedor — espaço para um futuro provedor (ex.: SafeWeb) sem mudar o código chamador.