
AIエージェント向けの暗号署名付き委任レシート。AIが実行できること、できないことを正確に定義 — 署名済み、検証可能、改ざん防止。
AuthProof はエージェント型AIのための暗号化委任プロトコルです。この分野のほとんどのプロトコルは、オペレーターが定義したポリシーに基づいて強制を行います。つまり、オペレーターはユーザーの本来の意図を後から拡大または再解釈する権限を持ちます。AuthProof は異なる信頼モデルに基づいて構築されています。ユーザー自身の秘密鍵が実行をゲートする認可オブジェクトに署名し、ライブモデルの状態が認可時と実行直前の両方で検証されます。ユーザーが署名した権限とライブモデル状態によるゲーティングの組み合わせが、このプロトコルの具体的な主張であり、広範な強制の話ではありません。
何が違うのか:
ユーザーが署名権限者です。 競合するすべてのプロトコル(AIP、AITH、OAP、SAGA、AgentSpec)は、オペレーターが定義したポリシーに基づいて強制を行います。AuthProof では、ユーザーの秘密鍵が直接認可オブジェクトに署名します。ユーザーが署名した後、オペレーターがスコープを拡大することはできません。
2フェーズのモデル状態コミットメント。 モデルは認可時に測定され、実行直前に再測定されます。認可時と実行時の間でモデルが変化した場合、実行は事前検証でブロックされます。
プロバイダ更新と悪意ある置き換えの区別。 このプロトコルはモデル状態の変更を2つのカテゴリに分類します。正当なプロバイダ更新(PROVIDER_UPDATE_REQUIRES_REAUTH)と不正な置き換え(MALICIOUS_MODEL_SUBSTITUTION)です。それぞれ、どのコンポーネントが変更されたかを識別する機械可読な拒否理由コードを生成します。
エージェントのアクションが実行される前に動作する決定論的ゲート。
PreExecutionVerifier はエージェントランタイムの外部に配置されます。検証が成功するまでランタイムは制御を取得できません。侵害された、または悪意のあるエージェントでもこれをスキップすることはできません。ランタイムが起動する前に実行されます。
従来の認可チェックはエージェントランタイム内部で行われます。ランタイムが侵害されると、これらのチェックはスキップ、並べ替え、またはバイパスされる可能性があります。PreExecutionVerifier は認可をランタイムの完全に外部に移動することで、この攻撃対象領域を排除します。エージェントは、6つすべての逐次チェックが最初に成功した場合にのみ実行されます。
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
### 6つの逐次チェック(最初の失敗で停止)
| # | チェック | ブロックされる条件 |
|---|-------|-------------|
| 1 | レシート署名 | ECDSA P-256 署名が無効、またはレシートが改ざんされた場合 |
| 2 | 失効 | `RevocationRegistry` を介してレシートが失効された場合 |
| 3 | 時間枠 | レシートの有効期限切れ、またはまだ有効でない(クライアントクロックではなくログタイムスタンプオラクル) |
| 4 | スコープ | アクションが `ScopeSchema.allowedActions` にない、またはテキストベースのスコープマッチングに失敗した場合 |
| 5 | オペレーター指示 | 現在の指示が発行時にレシートにロックされたハッシュと一致しない場合 |
| 6 | プログラムハッシュ | 提供された `programHash` がコミットされた `executes` ハッシュと一致しない場合(コード置換防止) |
各チェック結果(合格または不合格)は、検証者の自身のキーで署名された不変の `ActionLog` に自動的に記録されます。
### ミドルウェア統合
一般的なフレームワーク用のドロップインラッパー。各ラッパーは、ラップされたコードが実行される前に、すべての呼び出しを `PreExecutionVerifier` を通過させます。
- **[LangChain](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/langchain.js)** — `invoke()` メソッドを持つ任意のエージェントをラップします
- **[Express/HTTP](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/express.js)** — 任意の Express 互換フレームワーク用のリクエストミドルウェア
- **[汎用関数ラッパー](https://github.com/commonguy25/authproof-sdk/blob/HEAD/src/middleware/generic.js)** — 任意の非同期関数をラップします```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 })
既存のIETFエージェントアイデンティティフレームワーク â AIP、draft-klrc-aiagent-auth、WIMSE â はすべて、サービス対エージェントの信頼を扱っています。つまり、下流のサービスがエージェントが呼び出しを許可されているかを検証する方法です。これらのどれも、ユーザ対オペレータの信頼 には対応していません。
現在のエージェントシステムにおける委任チェーンは次のとおりです:``` User â Operator â Agent â Services
ユーザーはオペレーターに指示を出す。オペレーターはエージェントに指示を出す。しかし、委任の瞬間にはユーザーの本来の意図の暗号学的記録は存在しない。オペレーターは、ユーザーの指示がエージェントに届く前に、それを拡大、歪曲、または省略する無制限の権限を持つ信頼された第三者となる。
その結果:
- ユーザーは自分が何を承認したかを証明できない。
- 規制当局には監査証跡がない。
- 裁判所には証拠連鎖がない。
- エージェントは、正当なオペレーター指示と侵害された、または不正な指示を区別できない。
AuthProofがこのギャップを埋める。
---
## コアプリミティブ:委任領収書
**委任領収書**は、エージェントの行動が開始される前に、分散型追記専用ログに固定された署名済み認可オブジェクトです。これには4つの必須フィールドが含まれます:
### スコープ
許可された操作の明示的な許可リスト。リストにないものはすべてデフォルトで拒否されます。自然言語ではなく構造化形式で表現されます。操作クラス:
| クラス | 説明 |
|---|---|
| `reads` | 指定されたリソースへの読み取りアクセス |
| `writes` | 指定されたリソースへの書き込みアクセス |
| `deletes` | 指定されたリソースの削除 |
| `executes` | 特定のプログラムの実行。その**静的機能シグネチャハッシュ**によって参照される |
`executes`は最も危険なクラスです。名前、URI、説明ではなく、Safescriptプログラムの静的機能DAGの暗号学的ハッシュを参照する必要があります。ハッシュが一致しない場合、実行は行われません。
### 境界
明示的な禁止事項。いかなる状況でもオペレーター指示によって上書きできません。その後のオペレーター指示に関係なく存続するユーザー定義のハードリミット。
### 時間枠
認可の有効期間。**ログタイムスタンプ**が時刻のオラクルであり、クライアントクロックではありません。クライアントクロックは時間検証から明示的に除外されます。
### オペレーター指示ハッシュ
委任時のオペレーターの表明された指示の暗号学的ハッシュ。オペレーターがその後エージェントに異なる指示を出した場合、その不一致は追加の信頼前提なしにログから検出可能です。
ユーザーは、WebAuthn/FIDO2を介してデバイスのセキュアエンクレーブを使用し、自身の秘密鍵でこのオブジェクトに署名します。署名はエージェントの行動前にログに公開されます。その後のすべてのエージェント行動はレシートハッシュを参照します。スコープ外の行動は暗号学的に無効です。
---
## 信頼スタックアーキテクチャ
3つのプロトコル層が3つの信頼された第三者を排除します:
### レイヤ1 — 署名済み機能マニフェスト(レジストリへの信頼を排除)
現在のMCPエコシステムでは、ツールサーバーの説明が実際の動作と一致するという暗号学的証明はありません。オペレーターは任意のスキーマを提示できます。
修正:ツールサーバーは、ユーザー認可が行われる前に、暗号学的に署名された機能マニフェストを公開します。委任領収書の`scope`フィールドは、オペレーターの自己申告スキーマではなく、**このマニフェストのハッシュ**を参照します。サーバーの動作とマニフェストの乖離はログ層で検出可能です。
### レイヤ2 — 委任領収書(オペレーターへの信頼を排除)
ユーザーの本来の意図は、オペレーター指示がエージェントに届く前に不変に記録されます。オペレーターの逸脱は証明可能です。
### レイヤ3 — Safescript実行(コードへの信頼を排除)
[Safescript](https://github.com/safescript)は、AIエージェント実行のためのオープンソースのサンドボックス言語です。その静的DAG構造により、すべてのプログラムの完全な機能シグネチャが実行前に計算可能です。動的ディスパッチや実行時機能拡張はありません。
`executes`スコープクラスは特定のSafescript機能シグネチャハッシュを参照します。オペレーターが提供したプログラムがコミットされたハッシュと一致しない場合、実行はブロックされます。委任後にエージェントが別のプログラムに置き換えられることはありません。
---
## クイックスタート```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,
});
}
元の委任レシートの対象外となるツール呼び出しでは、エージェントは黙って処理を進めることはできません。プロトコルは以下を義務付けています:
未知のアクションには明示的な新たなユーザー認可が必要です。依存関係の解決も同じルールに従います — 依存関係は委任時にコミットされた依存関係マニフェストのハッシュに対してチェックされます。予期しない依存関係はスコープ違反となります。
各委任イベントには一意のレシートIDが付与されます。並行エージェントはそれぞれ自身のレシートハッシュを参照します。それらはエージェントの識別情報ではなく、レシートによって区別されます。
| 方式 | 説明 | 推奨 |
|---|---|---|
| ハードウェア |
ハードウェア管理が推奨されるデフォルトです。秘密鍵はセキュアエンクレーブから出ることはなく、署名はデバイスの生体認証またはPINによって保護されます。
委任レシートはAIエージェントが何をすることを許可されているかを定義します。アクションログは実際に何を行ったかを記録し — 逸脱があれば即座に検証可能にします。
エージェントが行うすべてのアクションは、アクティブなレシートにリンクされた署名付きタイムスタンプ付きエントリを生成します。エントリは改ざん防止のチェーンを形成します: 各エントリは前のエントリのSHA-256ハッシュを埋め込むため、信頼できる第三者なしで事後的な変更を検出できます。diff()メソッドは監査プリミティブであり — レシートの許可スコープと記録されたすべてのアクションを照合し、逸脱を返します。```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)'
### アクションログAPI
| メソッド | 説明 |
|---|---|
| `new ActionLog()` | 新しいログインスタンスを作成します。状態はメモリ内に保持されます。 |
| `log.init({ privateKey, publicJwk })` | エージェントのECDSA P-256鍵で初期化します。`record()`の前に必要です。 |
| `log.registerReceipt(receiptHash, receipt)` | スコープ比較のためにレシートを登録します。`diff()`の前に必要です。 |
| `log.record(receiptHash, action)` | 署名済みのチェーンリンクエントリを追加します。封印されたエントリを返します。 |
| `log.verify(entryId)` | 1つのエントリの署名とチェーン位置を検証します。`{ valid, reason }`を返します。 |
| `log.getEntries(receiptHash)` | レシートのすべてのエントリを時系列順で返します。 |
| `log.diff(receiptHash)` | すべてのエントリをレシートのスコープと比較します。`{ compliant, violations, clean }`を返します。 |
### 本番環境に関する注意
v1のタイムスタンプはクライアントのクロックを使用します。タイムスタンプが独立して検証可能でなければならないコンプライアンスや法的なコンテキストでは、本番環境にデプロイする前にRFC 3161の信頼できるタイムスタンプ機関に置き換えてください。
### 重要
常に明示的な`allowedActions`配列を使用してスコープを定義してください。テキストベースのスコープマッチングは開発専用であり、本番環境やコンプライアンスのコンテキストには適していません。
---
## 機密デプロイメント
AuthProofエージェントをハードウェア認証されたTrusted Execution Environment (TEE)内で実行します。`ConfidentialRuntime`クラスは委任レシートをエンクレーブ測定にバインドするため、モデルの重み、検証コード、またはプラットフォームの置き換えは実行前に検出可能です。
### ハードウェア要件
- **Intel TDX** â Intel Ice Lake Xeon以降(第4世代Xeon Scalable)。Azure DCdsv3シリーズ、GCP C3 Confidential VM。
- **AMD SEV-SNP** â AMD EPYC第3世代(Milan)以降。Azure DCasv5シリーズ、Nitro Enclavesを使用したAWS m6a。
### 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の要件: `Standard_DC4ds_v3` または DCdsv3シリーズのより大きいもの。Confidential OS ディスク暗号化を有効にします。引用検証のために Microsoft Azure Attestation (MAA) 共有エンドポイントを使用します。
### 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
AWS 要件: c6a.xlarge以上で--enclave-options Enabledが必要です。nitro-cliを使用してエンクレーブイメージをビルドおよび実行します。証明書内のPCR0がconfig.pcr0と一致している必要があります。これによりレシートのバインドが有効になります。
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
YAMLにシリアライズした後、`kubectl apply -f`で適用します。ノードセレクター `intel.feature.node.kubernetes.io/tdx: "true"` は、Intel Device Plugin for Kubernetesを必要とします。
### eBPFカーネルモジュール — ヘルプ募集中
TEE強制レイヤーはユーザースペース側(`ConfidentialRuntime`、`TokenPreparer`)で完了しています。最終的な強制ステップである、eBPF LSMフックを介してすべてのシステムコールで署名済みケイパビリティトークンを検証する部分には、カーネルモジュールが必要であり、これはコントリビューションを受け付けています。
eBPF LSMの経験(Isovalent、Red Canaryなど)をお持ちのエンジニアの参加を特に歓迎します。問題やPRは https://github.com/Commonguy25/authproof-sdk/issues で開いてください。
---
## Examples
実行可能な2つのサンプルが `examples/` ディレクトリにあります。
**[`examples/langchain-example.js`](https://github.com/commonguy25/authproof-sdk/blob/HEAD/examples/langchain-example.js)** — LangChain統合の全パスを示します:鍵ペアの生成、委任レシートの発行、`PreExecutionVerifier`の初期化、エージェントを`authproofMiddleware`でラップすることで、すべての`invoke()`呼び出しがエージェントランタイムに制御が渡される前に関連付けられます。すぐに実行可能なモックエージェントと、実際の`AgentExecutor`用の正確なコードパターンが含まれています。`npm run example:langchain`で実行します。
**[`examples/webauthn-example.html`](https://github.com/commonguy25/authproof-sdk/blob/HEAD/examples/webauthn-example.html)** — 完全な委任フローを備えた自己完結型の3カードブラウザデモ。カード1では、スコープ、境界、オペレーター指示を定義し、ローカルキーでレシートに署名します(実際のWebAuthnには`navigator.credentials`を差し替え可能)。カード2では、レシートID、有効期限、システムプロンプト、生のJSONを表示します。カード3では、任意のアクションを入力し、リアルタイムでレシートに対して検証し、各チェック結果を表示します。ブラウザで直接開くことができ、ビルド手順は不要です。
---
## Installation```bash
npm install authproof-sdk
| デバイスのセキュアエンクレーブを介したWebAuthn/FIDO2。秘密鍵はハードウェアから出ません。 |
| はい — デフォルト |
| 委任 | 信頼された鍵管理がユーザーに代わって鍵を保持します。 | FIDO2非対応環境 |
| 自己管理 | ユーザー自身が秘密鍵を保持・管理します。 | 上級ユーザー、エアギャップワークフロー |