
Recibos de delegação criptograficamente assinados para agentes de IA. Defina exatamente o que uma IA pode e não pode fazer — assinado, verificável, à prova de adulteração.
AuthProof é um protocolo de delegação criptográfica para IA agentiva. A maioria dos protocolos neste espaço impõe uma política definida pelo operador -- dando ao operador autoridade para expandir ou reinterpretar a intenção original do usuário posteriormente. AuthProof é construído em torno de um modelo de confiança diferente: a própria chave privada do usuário assina o objeto de autorização que controla a execução, e o estado do modelo ativo é verificado tanto no momento da autorização quanto imediatamente antes da execução. A combinação de autoridade assinada pelo usuário e controle de estado do modelo ativo é a afirmação específica -- não uma história abrangente de imposição.
O que o torna diferente:
O usuário é a autoridade de assinatura. Todos os protocolos concorrentes (AIP, AITH, OAP, SAGA, AgentSpec) impõem uma política definida pelo operador. No AuthProof, a chave privada do usuário assina diretamente o objeto de autorização. O operador não pode ampliar o escopo após o usuário ter assinado.
Compromisso de estado do modelo em duas fases. O modelo é medido no momento da autorização e medido novamente imediatamente antes da execução. Se o modelo tiver se desviado entre esses dois pontos, a execução é bloqueada na verificação pré-execução.
Atualização do provedor versus substituição maliciosa, distinguidas. O protocolo classifica as alterações de estado do modelo em duas categorias: atualizações legítimas do provedor (PROVIDER_UPDATE_REQUIRES_REAUTH) e trocas não autorizadas (MALICIOUS_MODEL_SUBSTITUTION). Cada uma produz um código de motivo de negação legível por máquina que identifica quais componentes mudaram.
O portal determinístico que é executado antes de qualquer ação do agente ser executada.
O PreExecutionVerifier fica fora do runtime do agente. O runtime nunca obtém controle até que o verificador passe. Um agente comprometido ou malicioso não pode ignorá-lo — ele é executado antes do runtime iniciar.
As verificações de autorização tradicionais ocorrem dentro do runtime do agente. Se o runtime for comprometido, essas verificações podem ser ignoradas, reordenadas ou contornadas. O PreExecutionVerifier elimina essa superfície de ataque ao mover a autorização para fora do runtime completamente. O agente só executa se — e somente se — todas as seis verificações sequenciais passarem primeiro.
import { PreExecutionVerifier, DelegationLog } from 'authproof-sdk/pre-execution-verifier' import { RevocationRegistry } from 'authproof-sdk'
// 1. Set up the gate const delegationLog = new DelegationLog() const revocationRegistry = new RevocationRegistry() await revocationRegistry.init({ privateKey, publicJwk })
const verifier = new PreExecutionVerifier({ delegationLog, revocationRegistry }) await verifier.init({ privateKey: verifierKey, publicJwk: verifierPub })
// 2. Register your delegation receipt delegationLog.add(receiptHash, receipt)
// 3. Gate every action â before the agent runs const result = await verifier.check({ receiptHash, action: { operation: 'read', resource: 'calendar' }, operatorInstructions: 'Summarize meetings. Stay within scope.', programHash, // optional: prevents code substitution attacks })
if (!result.allowed) {
throw new Error(Blocked: ${result.blockedReason})
}
// Agent runtime only reaches here after all six checks pass
### Seis verificações sequenciais (para na primeira falha)
| # | Verificação | Bloqueia quando |
|---|-------------|-----------------|
| 1 | Assinatura do recibo | Assinatura ECDSA P-256 inválida ou recibo adulterado |
| 2 | Revogação | Recibo foi revogado via `RevocationRegistry` |
| 3 | Janela de tempo | Recibo expirado ou ainda não válido (oráculo de timestamp de log, não relógio do cliente) |
| 4 | Escopo | Ação não está em `ScopeSchema.allowedActions` ou falha na correspondência de escopo baseada em texto |
| 5 | Instruções do operador | As instruções atuais não correspondem ao hash bloqueado no recibo na emissão |
| 6 | Hash do programa | O `programHash` fornecido não corresponde ao hash `executes` comprometido (prevenção de substituição de código) |
Cada resultado de verificação — aprovado ou reprovado — é registrado automaticamente em um `ActionLog` imutável assinado com a própria chave do verificador.
### Integrações de middleware
Wrappers plug-and-play para frameworks comuns. Cada wrapper protege cada chamada através de `PreExecutionVerifier` antes que o código encapsulado seja executado.
- **[LangChain](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/langchain.js)** — encapsula qualquer agente com um método `invoke()`
- **[Express/HTTP](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/express.js)** — middleware de requisição para qualquer framework compatível com Express
- **[Generic function wrapper](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/generic.js)** — encapsula qualquer função assíncrona```js
// LangChain
import { authproofMiddleware } from 'authproof-sdk/middleware/langchain'
const guardedAgent = authproofMiddleware(agent, { receiptHash, verifier })
// Express
import { authproofMiddleware } from 'authproof-sdk/middleware/express'
app.use(authproofMiddleware({ verifier, getReceiptHash: (req) => req.headers['x-receipt-hash'] }))
// Any function
import { guardFunction } from 'authproof-sdk/middleware/generic'
const guardedExecute = guardFunction(executeAction, { receiptHash, verifier, action })
Cada framework IETF existente para identidade de agente — AIP, draft-klrc-aiagent-auth, WIMSE — aborda a confiança serviço-para-agente: como um serviço downstream verifica que um agente está autorizado a chamá-lo. Nenhum deles aborda a confiança usuário-para-operador.
A cadeia de delegação nos sistemas agentivos atuais é:``` User â Operator â Agent â Services
O usuário instrui o operador. O operador instrui o agente. Mas não existe nenhum registro criptográfico da intenção original do usuário no momento da delegação. O operador se torna um terceiro confiável com autoridade irrestrita para expandir, distorcer ou omitir as instruções do usuário antes que elas cheguem ao agente.
As consequências:
- Os usuários não podem provar o que autorizaram.
- Os reguladores não têm trilha de auditoria.
- Os tribunais não têm cadeia de evidências.
- Os agentes não conseguem distinguir instruções legítimas do operador daquelas comprometidas ou maliciosas.
AuthProof preenche essa lacuna.
---
## O Primitivo Principal: Delegation Receipt
Um **Delegation Receipt** é um Objeto de Autorização assinado ancorado em um log descentralizado somente de adição antes do início de qualquer ação do agente. Ele contém quatro campos obrigatórios:
### Escopo
Uma lista de permissões explícita das operações permitidas. Tudo que não está listado é negado por padrão. Expresso em formato estruturado â não em linguagem natural. Classes de operação:
| Classe | Descrição |
|---|---|
| `reads` | Acesso de leitura a recursos especificados |
| `writes` | Acesso de escrita a recursos especificados |
| `deletes` | Exclusão de recursos especificados |
| `executes` | Execução de um programa específico, referenciado pelo seu **hash de assinatura de capacidade estática** |
`executes` é a classe mais perigosa. Ela deve referenciar o hash criptográfico do DAG de capacidade estática de um programa Safescript â não um nome, URI ou descrição. Nenhuma correspondência de hash significa nenhuma execução.
### Limites
Proibições explícitas que não podem ser substituídas por instruções do operador em nenhuma circunstância. Limites rígidos definidos pelo usuário que sobrevivem a qualquer instrução subsequente do operador.
### Janela de Tempo
Período de validade da autorização. O **timestamp do log** é o oráculo de tempo â não o relógio do cliente. Relógios do cliente são explicitamente excluídos da validação de tempo.
### Hash da Instrução do Operador
Um hash criptográfico das instruções declaradas pelo operador no momento da delegação. Se o operador subsequentemente instruir o agente de forma diferente, a discrepância é detectável a partir do log sem suposições adicionais de confiança.
O usuário assina este objeto com sua chave privada via **WebAuthn/FIDO2 usando o enclave seguro do dispositivo**. A assinatura é publicada no log antes de qualquer ação do agente. Cada ação subsequente do agente referencia o hash do recibo. Ações fora do escopo são criptograficamente inválidas.
---
## Arquitetura da Pilha de Confiança
Três camadas de protocolo eliminam três terceiros confiáveis:
### Camada 1 â Manifesto de Capacidade Assinado *(remove a confiança no registro)*
No ecossistema MCP atual, não há atestação criptográfica de que as descrições do servidor de ferramentas correspondem ao que ele realmente faz. Um operador pode apresentar um esquema arbitrário.
A correção: servidores de ferramentas publicam um **manifesto de capacidade assinado criptograficamente** antes de qualquer autorização do usuário ocorrer. O campo `scope` do Delegation Receipt referencia o **hash deste manifesto** â não o esquema auto-relatado pelo operador. A divergência entre o comportamento do servidor e o manifesto é detectável na camada do log.
### Camada 2 â Delegation Receipt *(remove a confiança no operador)*
A intenção original do usuário é registrada imutavelmente antes que as instruções do operador cheguem ao agente. O desvio do operador é comprovável.
### Camada 3 â Execução Safescript *(remove a confiança no código)*
[Safescript](https://github.com/safescript) é uma linguagem de código aberto em sandbox para execução de agentes de IA. Sua estrutura DAG estática significa que a assinatura completa de capacidade de cada programa é computável antes de ser executado â sem despacho dinâmico, sem expansão de capacidade em tempo de execução.
A classe de escopo `executes` referencia um hash de assinatura de capacidade Safescript específico. Se o programa fornecido pelo operador não corresponder ao hash comprometido, a execução é bloqueada. O agente não pode ser substituído por um programa diferente após a delegação.
---
## Início Rápido```js
import { AuthProof, Scope, KeyCustody } from 'authproof-sdk';
// Initialize with hardware-backed key custody (recommended)
const authproof = new AuthProof({
custody: KeyCustody.HARDWARE, // WebAuthn/FIDO2 via device secure enclave
log: 'https://log.authproof.dev',
});
// Define permitted operations â explicit allowlist, deny-by-default
const scope = new Scope()
.allow('reads', ['resource://calendar/events', 'resource://email/inbox'])
.allow('writes', ['resource://calendar/events'])
.deny('deletes', '*')
.execute('sha256:a3f1c9d8...', { program: 'scheduler-v1.sg' }); // Safescript hash
// Hard limits that survive any operator instruction
const boundaries = {
never: ['external-network', 'credential-store', 'payment-methods'],
};
// Issue the Delegation Receipt â anchored to log before any agent action
const receipt = await authproof.delegate({
scope,
boundaries,
window: { duration: '8h' }, // validated against log timestamp
operatorInstructions: instructionText, // hashed and committed
});
// receipt.id â unique receipt identifier
// receipt.hash â reference in every agent action
// receipt.log â append-only log anchor
// Agent-side: validate an action against the receipt
const check = await authproof.validate({
receiptHash: receipt.hash,
action: { class: 'writes', resource: 'resource://calendar/events' },
});
if (!check.authorized) {
// Out-of-scope action: surface a micro-receipt request to the user
const microReceipt = await authproof.requestMicroReceipt({
action: check.requestedAction,
parent: receipt.hash,
});
}
Para chamadas de ferramentas não cobertas pelo Recebimento de Delegação original, o agente não pode prosseguir silenciosamente. O protocolo determina:
Ações desconhecidas exigem nova autorização explícita do usuário. A resolução de dependências segue a mesma regra â as dependências são verificadas contra o hash do manifesto de dependências comprometido no momento da delegação. Dependências inesperadas são uma violação de escopo.
Cada evento de delegação carrega um ID de recibo único. Agentes concorrentes referenciam cada um seu próprio hash de recibo. Eles são distinguíveis pelo recibo, não pela identidade do agente.
A custódia por hardware é o padrão recomendado. A chave privada nunca sai do enclave seguro; a assinatura é protegida por biometria ou PIN do dispositivo.
Um Recebimento de Delegação define o que um agente de IA está autorizado a fazer. O Registro de Ações registra o que ele realmente fez â e torna qualquer desvio instantaneamente verificável.
Cada ação que um agente realiza produz uma entrada assinada e com carimbo de data/hora vinculada ao recibo ativo. As entradas formam uma cadeia à prova de adulteração: cada entrada incorpora o hash SHA-256 da anterior, de modo que qualquer modificação retroativa é detectável sem um terceiro confiável. O método diff() é a primitiva de auditoria â ele alinha o escopo autorizado do recibo contra cada ação registrada e retorna quaisquer desvios.```js
import AuthProof, { ActionLog } from 'authproof-sdk';
// 1. Issue a delegation receipt as normal const { privateKey, publicJwk } = await AuthProof.generateKey();
const { receipt, receiptId } = await AuthProof.create({ scope: 'Search the web for competitor pricing. Read calendar events.', boundaries: 'Do not send emails. Do not make purchases.', instructions: 'Cite sources. Keep under 500 words.', ttlHours: 4, privateKey, publicJwk, });
// 2. Initialize the action log with the agent's signing key const log = new ActionLog(); await log.init({ privateKey, publicJwk });
// Register the receipt so diff() knows what was authorized log.registerReceipt(receiptId, receipt);
// 3. Record each action the agent takes const e1 = await log.record(receiptId, { operation: 'Search competitor pricing', resource: 'web/search', parameters: { query: 'rival.com pricing 2024' }, });
const e2 = await log.record(receiptId, { operation: 'Read calendar events', resource: 'calendar/events', parameters: { range: 'this_week' }, });
// 4. Verify an individual entry (signature + chain integrity) const check = await log.verify(e1.entryId); // { valid: true, reason: 'Signature and chain integrity verified' }
// 5. Diff: authorized scope vs. everything that was done const report = log.diff(receiptId); // { // clean: true, // totalEntries: 2, // compliant: [{ entry: {...}, reason: '"Search competitor pricing" matches authorized scope' }, ...], // violations: [], // }
// A scope violation surfaces immediately await log.record(receiptId, { operation: 'Send email', resource: 'email/outbox' }); const auditReport = log.diff(receiptId); // auditReport.violations[0].reason â // '"Send email" outside authorized scope (0% scope match, 92% boundary overlap)'
### Action Log API
| Método | Descrição |
|---|---|
| `new ActionLog()` | Cria uma nova instância de log. O estado fica na memória. |
| `log.init({ privateKey, publicJwk })` | Inicializa com a chave ECDSA P-256 do agente. Necessário antes de `record()`. |
| `log.registerReceipt(receiptHash, receipt)` | Registra um recibo para comparação de escopo. Necessário antes de `diff()`. |
| `log.record(receiptHash, action)` | Adiciona uma entrada assinada e encadeada. Retorna a entrada selada. |
| `log.verify(entryId)` | Verifica a assinatura de uma entrada e sua posição na cadeia. Retorna `{ valid, reason }`. |
| `log.getEntries(receiptHash)` | Todas as entradas de um recibo em ordem cronológica. |
| `log.diff(receiptHash)` | Compara todas as entradas com o escopo do recibo. Retorna `{ compliant, violations, clean }`. |
### Aviso de Produção
Os timestamps na v1 usam o relógio do cliente. Para contextos de conformidade ou legais onde os timestamps precisam ser verificáveis de forma independente, substitua por uma autoridade de timestamp confiável RFC 3161 antes de implantar em produção.
### Importante
Sempre defina o escopo usando arrays explícitos de `allowedActions`. A correspondência de escopo baseada em texto está disponível apenas para desenvolvimento e não é adequada para produção ou contextos de conformidade.
---
## Implantação Confidencial
Execute os agentes AuthProof dentro de Ambientes de Execução Confiáveis (TEEs) atestados por hardware. A classe `ConfidentialRuntime` vincula os recibos de delegação às medições do enclave, de modo que qualquer substituição de pesos do modelo, código do verificador ou plataforma seja detectável antes da execução.
### Requisitos de hardware
- **Intel TDX** — Intel Ice Lake Xeon ou mais recente (4ª geração Xeon Scalable). Azure DCdsv3-series, GCP C3 Confidential VMs.
- **AMD SEV-SNP** — AMD EPYC 3ª geração (Milan) ou mais recente. Azure DCasv5-series, AWS m6a com Nitro Enclaves.
### Criar um recibo com vinculação de medição TEE```javascript
import { AuthProofClient } from 'authproof-sdk';
const client = new AuthProofClient();
const { receipt } = await client.delegate({
scope: 'Summarize calendar events',
operatorInstructions: 'Stay within scope.',
expiresIn: '2h',
privateKey,
publicJwk,
teeConfig: {
platform: 'intel-tdx',
verifierHash: verifierCodeHash, // SHA-256 of your verifier binary
modelHash: modelWeightsHash, // SHA-256 of model weights
},
});
// receipt.teeMeasurement.expectedMrenclave is now bound to the receipt
import { ConfidentialRuntime } from 'authproof-sdk';
// Generate deployment configuration const config = ConfidentialRuntime.azureTDXConfig({ receiptHash, verifierHash, modelHash, region: 'eastus', }); // config.vmSize === 'Standard_DC4ds_v3' // config.attestationEndpoint === 'https://sharedeus.eus.attest.azure.net' // config.receiptBinding binds the receipt to the VM measurement
// At runtime inside the VM: const runtime = new ConfidentialRuntime({ platform: 'intel-tdx', verifier, actionLog, }); const result = await runtime.launch({ receiptHash, agentFn, operatorInstructions, verifierHash, modelHash, teeMeasurement: receipt.teeMeasurement, // mismatch blocks execution });
Azure SKU requirements: `Standard_DC4ds_v3` or larger from the DCdsv3-series. Enable Confidential OS disk encryption. Use Microsoft Azure Attestation (MAA) shared endpoint for quote verification.
### Implante no AWS Nitro Enclaves```javascript
const config = ConfidentialRuntime.awsNitroConfig({
receiptHash,
verifierHash,
modelHash,
region: 'us-east-1',
});
// config.instanceType === 'c6a.xlarge'
// config.enclaveOptions.enabled === true
// config.pcr0 is the combined receipt+verifier+model measurement
Requisitos da AWS: c6a.xlarge ou maior com --enclave-options Enabled. Use nitro-cli para construir e executar a imagem do enclave. O PCR0 no documento de atestação deve corresponder a config.pcr0 para que a vinculação do recibo seja válida.
const manifest = ConfidentialRuntime.kubernetesConfig({ receiptHash, platform: 'intel-tdx', namespace: 'production', }); // manifest is a full K8s List containing: // - Pod with TDX node selector and attestation sidecar // - ServiceAccount with minimal RBAC // - ConfigMap with receipt binding
Aplique com `kubectl apply -f` após serializar para YAML. O seletor de nós `intel.feature.node.kubernetes.io/tdx: "true"` requer o Intel Device Plugin for Kubernetes.
### Módulo do kernel eBPF — ajuda necessária
A camada de imposição do TEE está completa pelo lado do espaço do usuário (`ConfidentialRuntime`, `TokenPreparer`). O passo final de imposição — validar o token de capacidade assinado em cada chamada de sistema através de um hook eBPF LSM — requer um módulo do kernel que está aberto para contribuição.
Engenheiros com experiência em eBPF LSM (Isovalent, Red Canary ou similar) são especialmente bem-vindos. Abra uma issue ou PR em https://github.com/Commonguy25/authproof-sdk/issues
---
## Exemplos
Dois exemplos executáveis estão no diretório `examples/`.
**[`examples/langchain-example.js`](https://github.com/commonguy25/authproof-sdk/blob/HEAD/examples/langchain-example.js)** — Mostra o caminho completo de integração com LangChain: gerar um par de chaves, emitir um recibo de delegação, inicializar `PreExecutionVerifier` e envolver qualquer agente com `authproofMiddleware` para que cada chamada `invoke()` seja bloqueada antes que o runtime do agente obtenha controle. Inclui um agente simulado que você pode executar imediatamente e o padrão de código exato para um `AgentExecutor` real. Execute com `npm run example:langchain`.
**[`examples/webauthn-example.html`](https://github.com/commonguy25/authproof-sdk/blob/HEAD/examples/webauthn-example.html)** — Uma demonstração auto-suficiente de três cartões no navegador de todo o fluxo de delegação. O Cartão 1 permite definir escopo, limites e instruções do operador, depois assina um recibo com uma chave local (substitua por `navigator.credentials` para WebAuthn real). O Cartão 2 exibe o ID do recibo, expiração, prompt do sistema e JSON bruto. O Cartão 3 permite digitar qualquer ação proposta e verificar contra o recibo em tempo real, mostrando cada resultado da verificação. Abra diretamente em um navegador — nenhuma etapa de build necessária.
---
## Instalação```bash
npm install authproof-sdk
WHITEPAPER.md| Modelo | Descrição | Recomendado |
|---|
| Hardware | WebAuthn/FIDO2 via enclave seguro do dispositivo. Chave privada nunca sai do hardware. | Sim â padrão |
| Delegado | Gerenciador de chaves confiável mantém a chave em nome do usuário. | Ambientes sem suporte FIDO2 |
| Autocustódia | Usuário mantém e gerencia sua própria chave privada. | Usuários avançados, fluxos de trabalho offline |