署名付きクレーム
すべてのクレームは必ずissuerの署名を持ちます。 署名のないクレームはプロトコルレベルで無視されます。
設計思想:
- content: クレームの内容
- delegationChain: 委任チェーン(N階層の場合)
- issuerSignature: issuerによる署名(必須)
- content : String
クレームの内容
- delegationChain : Option DelegationChain
委任チェーン(None=直接発行、Some=委譲発行)
- issuerSignature : Signature
Issuerによる署名(必須)
Instances For
Equations
- instReprSignedClaim = { reprPrec := reprSignedClaim✝ }
クレームの検証
issuerの署名を検証します。
検証内容:
- issuerSignatureが有効であること
- 委任チェーンがある場合、その検証
Instances For
Equations
- instReprDevicePairing = { reprPrec := reprDevicePairing✝ }
ペアリングが特定の2つのデバイス間のものか確認
Equations
Instances For
信頼済みデバイスリスト
各ウォレットが管理する、信頼できるデバイスのリスト。
設計思想:
- ownerDevice: このリストを所有するデバイス
- trustedPairings: 信頼済みペアリングのリスト
- ownerDevice : Device
リスト所有者のデバイス
- trustedPairings : List DevicePairing
信頼済みペアリングのリスト
Instances For
Equations
- instReprTrustedDeviceList = { reprPrec := reprTrustedDeviceList✝ }
デバイスが信頼リストに含まれるか確認
Equations
- list.isTrusted device = list.trustedPairings.any fun (pairing : DevicePairing) => pairing.containsDevice list.ownerDevice && pairing.containsDevice device
Instances For
信頼リストにペアリングを追加
Equations
- list.addPairing pairing = { ownerDevice := list.ownerDevice, trustedPairings := pairing :: list.trustedPairings }
Instances For
正規の転送されたクレーム(Valid Transferred Claim)
二重署名検証(issuer署名 + 転送署名)が成功したクレーム。 暗号学的に正しく転送されたクレームは、検証に成功する。
重要な不変条件:
- originalClaim.issuerSignature: 変更されない(issuerの署名)
- originalSubjectDID: 元のcredentialSubject.id
- transferProof: original subjectによる転送署名(必須)
- currentHolderDID: 現在の保持者
二重署名の役割:
- issuerSignature: クレームの真正性を保証(市役所が発行)
- transferProof: クレーム所有権と転送の同意を証明(DID_Aが所有・転送)
設計思想(VC.leanと同様):
- クレーム転送は送信側の責任(転送署名は暗号ライブラリで生成)
- プロトコルレベルでは「正規に転送されたクレーム」として抽象化
- 受信側は検証のみに依存し、送信側実装を信頼しない
抽象化の利点:
- Ed25519署名検証などの暗号的詳細を隠蔽
- プロトコルの安全性証明が簡潔になる
- 送信側実装の違いを抽象化
- originalClaim : SignedClaim
元のクレーム(issuerの署名付き)
- originalSubjectDID : ValidDID
元の所有者(original subject DID)
- currentHolderDID : ValidDID
現在の保持者
- transferProof : Signature
Original subjectによる転送署名
- transferredAt : ℕ
転送日時
Instances For
Equations
- instReprValidTransferredClaim = { reprPrec := reprValidTransferredClaim✝ }
不正な転送されたクレーム(Invalid Transferred Claim)
二重署名検証が失敗したクレーム。 以下のいずれかの理由で不正:
- issuerの署名が無効(改ざん)
- 転送署名が無効(改ざん、または送信側のバグ)
- issuerが信頼されていない
送信側ウォレットバグの影響:
- バグのある送信側ウォレットが生成したクレームは
InvalidTransferredClaimとして表現される - プロトコルの安全性には影響しない(当該クレームのみが無効になる)
- originalClaim : SignedClaim
元のクレーム
- originalSubjectDID : ValidDID
元の所有者DID
- currentHolderDID : ValidDID
現在の保持者DID
- transferProof : Signature
転送署名
- transferredAt : ℕ
転送日時
- reason : String
不正な理由(デバッグ用)
Instances For
Equations
- instReprInvalidTransferredClaim = { reprPrec := reprInvalidTransferredClaim✝ }
未検証の転送されたクレーム(Unknown Transferred Claim)
構造的に正しくパースされた転送クレームで、検証結果を表す和型。 AMATELUSプロトコルで扱われる転送クレームは、暗号学的に以下のいずれか:
- valid: 正規に転送されたクレーム(二重署名検証が成功)
- invalid: 不正なクレーム(二重署名検証が失敗)
設計の利点(VC.leanと同様):
- クレーム転送の暗号的詳細(Ed25519署名検証など)を抽象化
- プロトコルレベルでは「正規/不正」の区別のみが重要
- 送信側ウォレットのバグは
invalidとして表現され、プロトコルの安全性には影響しない
受信フロー:
- 転送されたクレームをUnknownTransferredClaimとして受け取る
- validateClaimで検証を実行
- 検証成功 → ValidTransferredClaimとしてウォレットに保存
- 検証失敗 → InvalidTransferredClaimとして扱う(保存しない)
- valid : ValidTransferredClaim → UnknownTransferredClaim
- invalid : InvalidTransferredClaim → UnknownTransferredClaim
Instances For
Equations
- One or more equations did not get rendered due to their size.
転送署名の検証(定義として実装)
設計の核心:
- ValidTransferredClaim: 常に検証成功(転送署名が有効)
- InvalidTransferredClaim: 常に検証失敗(転送署名が無効)
この単純な定義により、暗号的詳細を抽象化しつつ、 プロトコルの安全性を形式的に証明できる。
Equations
Instances For
クレームの完全な検証(定義として実装)
設計の核心:
- ValidTransferredClaim: 常に検証成功(二重署名が有効)
- InvalidTransferredClaim: 常に検証失敗(二重署名が無効)
検証内容:
- issuerの署名が有効
- original subjectの転送署名が有効
- issuerが信頼されている
ウォレットバグの影響:
- バグのあるウォレットが生成したクレームは
invalidとして表現される validateClaim (invalid _) _ _ = falseにより、検証は失敗する- したがって、ウォレットバグは当該クレームのみに影響
Equations
- (UnknownTransferredClaim.valid a).validateClaim x✝¹ x✝ = true
- (UnknownTransferredClaim.invalid a).validateClaim x✝¹ x✝ = false
Instances For
元のsubjectを取得
Equations
Instances For
現在のholderを取得
Equations
Instances For
元のクレームを取得
Equations
Instances For
転送署名を取得
Equations
Instances For
Equations
- instReprClaimTransferRequest = { reprPrec := reprClaimTransferRequest✝ }
クレーム転送レスポンス
クレーム転送リクエストに対する応答。 転送するクレームと転送署名を含みます。
設計思想:
- requestID: 対応するリクエストのID
- claims: 転送するクレーム(original subjectの署名付き)
- success: 転送が成功したか
- クレームはUnknownTransferredClaimとして送信される(受信側で検証)
- requestID : String
対応するリクエストID
- fromDevice : Device
転送元デバイス
- toDevice : Device
転送先デバイス
- timestamp : ℕ
レスポンス日時
- transferredClaims : List UnknownTransferredClaim
転送するクレームのリスト(未検証)
- success : Bool
転送成功フラグ
Instances For
Equations
- instReprClaimTransferResponse = { reprPrec := reprClaimTransferResponse✝ }
デバイスペアリングの検証
2つのデバイスをペアリングする際の検証。
検証内容:
- 両デバイスが異なること
- ペアリングトークンが有効であること
- タイムスタンプが妥当であること
戻り値:
- true: ペアリング成功
- false: ペアリング失敗
Equations
Instances For
デバイス信頼検証
送信元デバイスが信頼リストに含まれるか検証。
検証内容:
- デバイスが信頼リストに含まれること
- ペアリングが有効であること
戻り値:
- true: 信頼できるデバイス
- false: 信頼できないデバイス
Equations
- verifyDeviceTrust trustedList device = trustedList.isTrusted device
Instances For
クレームの転送準備
デバイス間でクレームを転送するための準備。 original subjectの秘密鍵で転送署名を生成します。
前提条件:
- 送信元と送信先がペアリング済み
- クレームが検証済み
- original subjectの秘密鍵にアクセス可能
処理:
- 転送メッセージを構築
- original subjectの秘密鍵で署名
- UnknownTransferredClaimを生成
パラメータ:
- claim: 転送するクレーム
- originalSubjectDID: 元の所有者DID
- currentHolderDID: 転送先DID
- timestamp: 転送日時
戻り値:
- UnknownTransferredClaim: 転送署名付きクレーム(未検証)
- 正常な送信側ウォレットはValidTransferredClaimを生成
- バグのある送信側ウォレットはInvalidTransferredClaimを生成する可能性
Equations
- One or more equations did not get rendered due to their size.
Instances For
クレーム転送の実行
デバイス間でクレームを転送します。
前提条件:
- 送信元と送信先がペアリング済み
- リクエストが有効
- クレームが検証済み
処理:
- デバイス信頼検証
- クレームリストの準備
- 各クレームに転送署名を付与
- 転送実行
パラメータ:
- request: 転送リクエスト
- availableClaims: 転送可能なクレームのリスト
- originalSubjectDID: 元の所有者DID
- trustedList: 信頼済みデバイスリスト
- currentTimestamp: 現在時刻
戻り値:
- Some response: 転送成功
- None: 転送失敗
Equations
- One or more equations did not get rendered due to their size.
Instances For
転送されたクレームの受信(VC.leanパターン)
他のデバイスから転送されたクレームを受信し、検証します。
処理:
- UnknownTransferredClaimとして受け取る
- クレームの検証(issuer署名 + 転送署名)を実行
- 検証成功 → Some ValidTransferredClaim(ウォレットに保存)
- 検証失敗 → None(保存しない)
パラメータ:
- tc: 受信した転送クレーム(未検証)
- issuerDID: クレームのissuer
- trustedAnchors: 信頼されたIssuerのリスト
戻り値:
- Some ValidTransferredClaim: 検証成功、ウォレットに保存可能
- None: 検証失敗、保存しない
設計思想:
- 受信側ウォレットのバグから保護される
- 検証に成功したクレームのみがValidTransferredClaimとして保存される
- プロトコルの安全性が形式的に保証される
Equations
- receiveTransferredClaim (UnknownTransferredClaim.valid vtc) issuerDID trustedAnchors = if (UnknownTransferredClaim.valid vtc).validateClaim issuerDID trustedAnchors = true then some vtc else none
- receiveTransferredClaim (UnknownTransferredClaim.invalid itc) issuerDID trustedAnchors = if (UnknownTransferredClaim.invalid itc).validateClaim issuerDID trustedAnchors = true then none else none
Instances For
ZKP秘密入力(クレーム個別転送版)
転送されたクレームからZKPを生成する際の秘密入力。 必要なクレームのみを入力することで、ZKP回路を最小化します。
設計思想:
- claimContent: クレームの内容(秘密)
- issuerSignature: issuerの署名(ZKP内で検証)
- transferSignature: original subjectの転送署名(ZKP内で検証)
- originalSubjectDID: 元のcredentialSubject.id(秘密)
ZKP回路内の検証:
- issuerSignatureが有効(市役所が発行)
- transferSignatureが有効(DID_Aが所有・転送)
- originalSubjectDID == claim内のsubject(整合性)
- claimContent : String
クレームの内容
- issuerSignature : Signature
Issuerの署名
- transferSignature : Signature
Original subjectの転送署名
- originalSubjectDID : ValidDID
Original subject DID
Instances For
ZKP生成関数(定義として実装)
転送されたクレームからZKPを生成します。
処理:
- 秘密入力と公開入力を準備
- ZKP回路内でissuer署名とtransfer署名を検証
- ZKPを生成
利点:
- 必要なクレームのみを入力(他のクレームは不要)
- 回路サイズ最小化
- 計算コスト削減
- プライバシー保護
設計思想(ZKP.leanと同様):
- 入力の妥当性を検証
- 有効な入力 → ValidZKPを返す
- 無効な入力 → InvalidZKPを返す
- 暗号的詳細(Groth16ペアリング検証など)を抽象化
Equations
- One or more equations did not get rendered due to their size.
Instances For
Theorem: クレーム転送時にissuerの署名は保持される
クレームを転送しても、元のissuerの署名は変更されない。
Theorem: クレーム転送時にクレーム内容は保持される
クレームを転送しても、クレームの内容は変更されない。
Theorem: 転送されたクレームは転送署名を持つ
prepareClaimTransferで生成されたクレームは、 必ず転送署名(transferProof)を持つ。
Theorem: デバイス信頼検証の対称性
デバイスAがデバイスBを信頼している場合、 ペアリング情報により、デバイスBもデバイスAを信頼できる。
Theorem: 正規の転送クレームは検証に成功
ValidTransferredClaimとして構築されたクレームは、 常に検証に成功する。
設計思想(VC.leanと同様):
- ValidTransferredClaimは暗号学的に正しい転送を表現
- 型レベルでの保証により、プロトコルの安全性を形式化
Theorem: 不正な転送クレームは検証に失敗
InvalidTransferredClaimとして構築されたクレームは、 常に検証に失敗する。
設計思想(VC.leanと同様):
- InvalidTransferredClaimは暗号学的に不正な転送を表現
- 型レベルでの保証により、不正なクレームの拒否を形式化
Theorem: 整合性のある入力から生成されたZKPは有効
転送されたクレームと整合性のある秘密入力・公開入力から生成されたZKPは、 必ず有効(ValidZKP)である。
設計思想(ZKP.leanと同様):
- 入力の整合性が保証されていれば、生成されるZKPは暗号学的に正しい
- 暗号的詳細(Groth16ペアリング検証など)は抽象化される
- プロトコルレベルでは「整合性のある入力 → 有効なZKP」という保証が重要
Theorem: 不整合な入力から生成されたZKPは無効
転送されたクレームと整合性のない入力から生成されたZKPは、 必ず無効(InvalidZKP)である。
セキュリティ保証:
- 攻撃者が不正な入力を与えても、生成されるZKPは無効
- プロトコルの安全性が保証される
Theorem: 有効なZKPは検証に成功
generateZKPFromTransferredClaimで生成された有効なZKPは、 任意のRelationに対して検証が成功する。
ZKP.leanとの整合性:
- ZKP.leanのvalid_zkp_passesと同様の保証
- 暗号的詳細を抽象化しつつ、プロトコルの安全性を証明
Theorem: 受信検証に成功したクレームは有効
receiveTransferredClaimがValidTransferredClaimを返した場合、 そのクレームは暗号学的に正しく転送されている。
設計思想:
- 受信側ウォレットのバグから保護
- 型安全性により、不正なクレームはValidTransferredClaimとして扱われない
- プロトコルの安全性が形式的に保証される
クレーム個別転送のセキュリティ保証
形式検証の効果:
- クレーム転送時にissuerの署名は保持される
- クレーム内容は変更されない
- Original subjectの転送署名により所有権を証明
- デバイス認証により不正な転送を防止
- エンドツーエンド暗号化(DIDComm)によりプライバシー保護
- 秘密鍵は転送されない(各デバイスで独立)
プロトコルレベルの保証:
- 転送されたクレームは元のクレームと同じ暗号学的信頼性を持つ
- 二重署名(issuer + original subject)で完全なセキュリティ
- ZKP生成時に必要なクレームのみを入力(効率化)
- 転送の事実は第三者に知られない
ZKP効率化:
- 必要なクレームのみをZKP回路に入力
- 回路サイズ最小化、計算コスト削減
- プライバシー保護(不要なクレームを扱わない)
型安全性によるウォレットバグ保護(VC.leanパターン):
- 受信したクレームはUnknownTransferredClaimとして扱われる
- 検証に成功したクレームのみがValidTransferredClaimとして保存される
- 受信側ウォレットのバグは型システムにより保護される
- プロトコルの安全性が形式的に保証される
Equations
- One or more equations did not get rendered due to their size.