データ完全性 BBS 暗号スイート v1.0

ペアリングベース暗号によるリンク不可能なデータ完全性の実現

W3C 候補勧告草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/CRD-vc-di-bbs-20260910/
最新の公開バージョン:
https://www.w3.org/TR/vc-di-bbs/
最新の編集者草案:
https://w3c.github.io/vc-di-bbs/
履歴:
https://www.w3.org/standards/history/vc-di-bbs/
コミット履歴
実装報告:
https://w3c.github.io/vc-data-integrity/implementations/
編集者:
Greg Bernstein (招待専門家)
Manu Sporny (Digital Bazaar)
フィードバック:
GitHub w3c/vc-di-bbs (プルリクエスト, 新しい Issue, 未解決の Issue)

概要

この仕様では、BBS 署名方式を使用してデジタル署名を生成する際に使用する データ完全性暗号スイートについて説明します。 この署名スイートは BBS 署名を利用して、選択的開示と リンク不可能な派生証明を提供します。

この文書の位置付け

この節では、公開時点におけるこの 文書の位置付けについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、 W3C 標準および草案 索引で確認できます。

ワーキンググループは、この 仕様に対する実装フィードバックを積極的に求めています。候補勧告段階を終了するため、ワーキング グループは、仕様の必須および任意の 各機能について、少なくとも2つの独立した実装が存在することを要件として定めています。 適合性テストプロセスの詳細については、 実装報告に記載されているテストスイートを参照してください。

この文書は、検証可能な資格情報ワーキング グループによって、 勧告 トラックを使用した候補勧告草案として公開されました。

候補勧告としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。候補勧告草案には、 ワーキング グループが後続の 候補勧告スナップショットに含めることを意図している、以前の候補勧告からの変更が統合されています。

これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧を維持しており、 そのページには特許を開示するための 手順も含まれています。必須 クレームを含むと考える特許について実際の 知識を有する個人は、 必須クレーム に関する情報を、 W3C 特許ポリシーの第6節に従って開示しなければなりません。

この文書は、 2025年8月18日付 W3C プロセス文書に準拠します。

1. はじめに

この仕様は、Data Integrity [VC-DATA-INTEGRITY-1.1] 仕様に準拠して、 BBS 署名スキームを使用して証明を作成、検証、および導出することを目的とした 暗号スイートを定義します。 BBS 署名スキームは、選択的開示とリンク不能な 証明を直接提供します。これは、発行者、 保有者、検証者モデル内で動作する 4 つの高レベル関数を提供します。具体的には、発行者は BBS Sign 関数を使用して 「BBS 署名」と呼ばれる暗号値を作成し、これは元のクレデンシャルへの署名に使用されます。 BBS で署名されたクレデンシャルを受け取った保有者は、 BBS Verify 関数を使用してそのクレデンシャルを検証します。

次に所有者は、受け取った資格情報から選択的に開示する情報を選択し、 BBS ProofGen 関数を使用して、「BBS 証明」と呼ばれる 暗号値を生成します。この値は、この「派生資格情報」の証明を作成するために 使用されます。暗号学的な「BBS 証明」値は、元の「BBS 署名」とリンクできず、 完全に同じ情報を含むものを含め、追加の「派生資格情報」ごとに、 異なるリンク不可能な「BBS 証明」を所有者が 生成できます。 最後に、検証者は BBS ProofVerify 関数を使用して、所有者から受け取った派生 資格情報を検証します。

BBS 署名方式を検証可能な資格情報に適用するには、 この文書で指定されている処理が必要です。 一般に、このスイートは RDF データセット正規化アルゴリズム [RDF-CANON] を使用して、入力文書をその 正規 形式に変換します。次に発行者は、選択的開示プリミティブを使用して、 正規形式を必須ステートメントと非必須ステートメントに分離します。これらは、 他の情報とともに個別に処理され、適切な鍵素材とともに BBS Sign 関数への入力として使用されます。この出力を使用して、 保護された資格情報が生成されます。所有者は、資格情報を受け取ると、一連の選択的開示 関数と BBS Verify 関数を使用して 有効性を確認します。

同様に、BBS で署名された資格情報を受け取ると、所有者は RDF データセット 正規化アルゴリズム [RDF-CANON] を使用して入力 文書をその正規形式に変換し、次に選択的開示 プリミティブを適用して、正規形式を必須ステートメントと選択的に 開示されるステートメントに分離します。これらは適切に処理され、 BBS ProofGen 関数への入力として使用されます。適切に処理されると、この関数の出力は、 検証者に送信される、署名済みの選択的開示資格情報になります。 正規化および選択的開示プリミティブを使用することで、検証者は BBS verifyProof 関数を使用して資格情報を検証できます。

1.1 用語

この文書全体で使用される用語は、 検証可能なクレデンシャルのデータ完全性 1.1 仕様の 用語節で定義されています。

1.2 適合性

非規範的と明記された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONALREQUIRED、および SHOULD は、 ここに示すようにすべて 大文字で記述されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。

適合 証明とは、この仕様の規範的な記述に準拠する データモデルの具体的な表現です。具体的には、 この文書の 2. データモデルおよび3. アルゴリズム の各節にある関連するすべての規範的な記述を必ず適用しなければなりません。

適合プロセッサとは、 適合証明を生成または消費する、 ソフトウェアおよび/またはハードウェアとして実現された任意のアルゴリズムです。適合プロセッサは、 非適合文書が消費された場合にエラーを必ず生成しなければなりません。

この文書には JSON および JSON-LD データの例が含まれています。これらの例の一部は、 特定の部分を説明するインラインコメント(//)や、 例に関係のない情報が省略されていることを示す省略記号(...)などの機能を含むため、無効な JSON です。 実装者がこれらの例を有効な JSON または JSON-LD として扱う場合は、 そのような部分を削除する必要があります。

2. データモデル

以下の節では、この仕様で使用されるデータモデルについて、 検証 メソッドおよびデータ完全性証明 形式に関して概説します。

2.1 検証方法

これらの検証メソッドは、[VC-DATA-INTEGRITY-1.1] に準拠したデータ完全性証明を検証するために使用されます。 これらの証明は、[CFRG-BBS-SIGNATURE] に準拠する BLS12-381 暗号鍵素材を使用して生成されます。これらの 鍵タイプのエンコーディング形式を この節で示します。同等の暗号鍵素材を生成する可逆な暗号鍵変換 プロセスは、デジタル署名の処理中に使用してもよいものとします。

2.1.1 Multikey

制御識別子 v1.0で定義されている Multikey 形式は、この仕様で定義される暗号 スイートの公開鍵を表現するために使用されます。

publicKeyMultibase プロパティは、G2 グループ内の BLS12-381 381 ビット公開鍵の Multibase で符号化された Multikey 表現を表します。

検証方法の publicKeyMultibase 値は、 制御識別子 v1.0Multibase の節で定義されている base-58-btc 接頭辞(z)で必ず 始まらなければなりません。その後に、 制御識別子 v1.0Multikey の節で 定義されている Multibase で符号化された BLS12-381 381 ビット公開鍵値が続きます。 その他の符号化は決して許可してはなりません。

開発者は、秘密鍵の表現を誤って公開しないよう注意してください。 この仕様の実装は、publicKeyMultibase 値で 0xeb01 以外の Multicodec 値が使用された場合にエラーを発生させます。

1: Multikey として符号化された BLS12-381 G2 グループ 公開鍵
{
  "id": "https://example.com/issuer/123#key-0",
  "type": "Multikey",
  "controller": "https://example.com/issuer/123",
  "publicKeyMultibase": "zUC7EK3ZakmukHhuncwkbySmomv3FmrkmS36E4Ks5rsb6VQSRpoCrx6
  Hb8e2Nk6UvJFSdyw9NK1scFXJp21gNNYFjVWNgaqyGnkyhtagagCpQb5B7tagJu3HDbjQ8h
  5ypoHjwBb"
}
2: コントローラ文書内で Multikey として 符号化された BLS12-381 G2 グループ公開鍵
{
  "@context": [
    "https://www.w3.org/ns/did/v1",
    "https://w3id.org/security/multikey/v1"
  ],
  "id": "https://example.com/issuer/123",
  "verificationMethod": [{
    "id": "https://example.com/issuer/123#key-1",
    "type": "Multikey",
    "controller": "https://example.com/issuer/123",
    "publicKeyMultibase": "zUC7EK3ZakmukHhuncwkbySmomv3FmrkmS36E4Ks5rsb6VQSRpoCr
    x6Hb8e2Nk6UvJFSdyw9NK1scFXJp21gNNYFjVWNgaqyGnkyhtagagCpQb5B7tagJu3HDbjQ8h
    5ypoHjwBb"
  }]
}

2.2 証明表現

2.2.1 DataIntegrityProof

証明には、 [VC-DATA-INTEGRITY] の 証明の節で指定されている属性が、 以下の制約とともに含まれます。

証明の verificationMethod プロパティは URL でなければなりませんverificationMethod を参照解決した結果は、 値が Multikey に設定された type プロパティを含むオブジェクトで なければなりません

証明の type プロパティは DataIntegrityProofなければなりません

証明の cryptosuite プロパティは bbs-2023なければなりません

証明の proofValue プロパティの値は、 [CFRG-BBS-SIGNATURE] に従って生成され、 3. アルゴリズムの節にある手順に従って直列化および 符号化された BBS 署名または BBS 証明でなければなりません

3. アルゴリズム

以下のアルゴリズムでは、 BBS 署名スキーム [CFRG-BBS-SIGNATURE] を使用して検証可能なクレデンシャルを利用する方法について説明します。BBS 署名 スキームを使用する場合、SHA-256 バリアントを使用すべきです。

実装は、証明を追加または検証する際に、できるだけ早く検証メソッド情報を 取得してキャッシュすべきです。この節の関数に渡されるパラメーターは、検証 メソッドからの情報(公開鍵サイズなど)を使用して、暗号学的ハッシュアルゴリズムなどの 関数パラメーターを決定します。

RDF データセット正規化アルゴリズム [RDF-CANON] が使用される場合、 そのアルゴリズムの実装はデフォルトで データセットポイズニング を検出し、検出時に処理を中止します。

3.1 暗号スイートのインスタンス化

このアルゴリズムは、検証可能なクレデンシャルのデータ完全性 1.1 における 証明の追加および 証明の検証 関数で使用する暗号スイートを構成するために使用されます。このアルゴリズムはオプションオブジェクト (マップ options) を入力として受け取り、暗号スイート インスタンス (構造体 cryptosuite) を返します。

  1. cryptosuite を空の構造体として初期化します。
  2. options.typeDataIntegrityProof と等しくない場合、 cryptosuite を返します。
  3. options.cryptosuitebbs-2023 の場合、次を行います:
    1. cryptosuite.createProof を、 3.3.1 ベース証明の作成 (bbs-2023) 節のアルゴリズムに設定します。
    2. cryptosuite.verifyProof を、 3.3.5 派生証明の検証 (bbs-2023) 節のアルゴリズムに設定します。
  4. cryptosuite を返します。

3.2 bbs-2023 関数

3.2.1 serializeBaseProofValue

以下のアルゴリズムは、BBS 署名、HMAC 鍵、および必須ポインターを含む ベース証明値をシリアライズします。 必須入力は、ベース署名 bbsSignaturebbsHeaderpublicKey、HMAC 鍵 hmacKeymandatoryPointers の配列、featureOption、および featureOption の値によっては signer_nym_entropy 値です。 単一のベース証明文字列値が出力として生成されます。

  1. featureOption の値に応じて、proofValue を次のように設定します。
  2. featureOption"baseline" と等しい場合:
    1. BBS ベース証明ヘッダーバイト 0xd90x5d、および 0x02 で始まる バイト配列 proofValue を初期化します。
    2. components を、次の値を含む 5 要素の配列として初期化します: bbsSignaturebbsHeaderpublicKeyhmacKey、 および mandatoryPointers
  3. featureOption"anonymous_holder_binding" と等しい場合:
    1. BBS ベース証明ヘッダーバイト 0xd90x5d、および 0x04 で始まる バイト配列 proofValue を初期化します。
    2. components を、次の値を含む 6 要素の配列として初期化します: bbsSignaturebbsHeaderpublicKeyhmacKey、 および mandatoryPointers
  4. featureOption"pseudonym" と等しい場合:
    1. BBS ベース証明ヘッダーバイト 0xd90x5d、および 0x06 で始まる バイト配列 proofValue を初期化します。
    2. components を、次の値を含む 6 要素の配列として初期化します: bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointers、および signer_nym_entropy
  5. featureOption"holder_binding_pseudonym" と等しい場合:
    1. BBS ベース証明ヘッダーバイト 0xd90x5d、および 0x08 で始まる バイト配列 proofValue を初期化します。
    2. components を、次の値を含む 6 要素の配列として初期化します: bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointers、および signer_nym_entropy
  6. [RFC8949] に従って components を CBOR エンコードします。このとき、 いずれの components にも CBOR タグを使用してはなりません。 生成されたエンコード値を proofValue に追加します。
  7. baseProof を、proofValue の multibase-base64url-no-pad-encoding を持つ文字列として初期化します。すなわち、「u」で始まり、 proofValue の base64url-no-pad-encoded 値で終わる文字列を返します。
  8. baseProofベース証明として返します。

3.2.2 parseBaseProofValue

以下のアルゴリズムは、bbs-2023 選択的 開示ベース証明値の構成要素を解析します。必須入力は証明値 (proofValue) です。「bbsSignature」、「bbsHeader」、 「publicKey」、 「hmacKey」、「mandatoryPointers」、「featureOption」、および任意でオプション機能 パラメーター「signer_nym_entropy」という名前を使用する、6 または 7 要素を含む 単一のオブジェクト解析済みベース証明が出力として生成されます。

  1. proofValue 文字列が u (U+0075 LATIN SMALL LETTER U) で始まらず、multibase-base64url-no-pad-encoded 値であることを示していない場合、 エラーを発生させなければならず、そのエラーは PROOF_VERIFICATION_ERROR というエラー型を伝達すべきです。
  2. decodedProofValue を、proofValue 内の先頭の u に続く 部分文字列を base64url-no-pad デコードした結果で初期化します。
  3. BBS ベース証明が許可されたヘッダー値で始まることを確認し、 featureOption 変数を次のように設定します:
    1. decodedProofValue がバイト 0xd90x5d、および 0x02 で始まる場合、 featureOption"baseline" に設定します。
    2. decodedProofValue がバイト 0xd90x5d、および 0x04 で始まる場合、 featureOption"anonymous_holder_binding" に設定します。
    3. decodedProofValue がバイト 0xd90x5d、および 0x06 で始まる場合、 featureOption"pseudonym" に設定します。
    4. decodedProofValue がバイト 0xd90x5d、および 0x08 で始まる場合、 featureOption"holder_binding_pseudonym" に設定します。
    5. decodedProofValue がその他の 3 バイトシーケンスで始まる場合、 エラーを発生させなければならず、そのエラーは PROOF_VERIFICATION_ERROR というエラー型を伝達すべきです。
  4. components を、3 バイトの BBS ベース証明ヘッダーに続く バイトを CBOR デコードした結果である配列として初期化します。
  5. featureOption の値に基づいて、components を基にしたオブジェクトを 次のように返します:
    1. featureOption"baseline" と等しい場合、 components に基づくオブジェクトのプロパティ名を 「bbsSignature」、「bbsHeader」、「publicKey」、「hmacKey」、 および「mandatoryPointers」の順に設定し、featureOption をプロパティとして追加します。
    2. featureOption"anonymous_holder_binding" と等しい場合、 components に基づくオブジェクトのプロパティ名を 「bbsSignature」、「bbsHeader」、 「publicKey」、「hmacKey」、および「mandatoryPointers」の順に設定し、 featureOption をプロパティとして追加します。
    3. featureOption"pseudonym" と等しい場合、 components に基づくオブジェクトのプロパティ名を 「bbsSignature」、「bbsHeader」、 「publicKey」、「hmacKey」、「mandatoryPointers」、および「signer_nym_entropy」の順に設定し、 featureOption をプロパティとして追加します。
    4. featureOption"holder_binding_pseudonym" と等しい場合、 components に基づくオブジェクトのプロパティ名を 「bbsSignature」、「bbsHeader」、 「publicKey」、「hmacKey」、「mandatoryPointers」、および「signer_nym_entropy」の順に設定し、 featureOption をプロパティとして追加します。

3.2.3 serializeDerivedProofValue

以下のアルゴリズムは派生証明値をシリアライズします。必須入力は、 BBS 証明 (bbsProof)、ラベルマップ (labelMap)、 必須インデックスの配列 (mandatoryIndexes)、 選択インデックスの配列 (selectiveIndexes)、BBS プレゼンテーションヘッダー (presentationHeader)、featureOption インジケーター、および featureOption の値に応じて、nym_domainpseudonym、 および/または lengthBBSMessages 値です。 バイト文字列としてシリアライズされた単一の派生証明 値が出力として生成されます。

  1. compressedLabelMap を、 labelMap をパラメーターとして渡して、 節のアルゴリズムを呼び出した結果で初期化します。
  2. featureOption の値に応じて、次を行います:
    1. featureOption"baseline" と等しい場合:
      1. proofValue を、 開示証明ヘッダーバイト 0xd90x5d、および 0x03 で始まるように初期化します。
      2. components を、次の値を含む要素の配列として初期化します: bbsProofcompressedLabelMapmandatoryIndexesselectiveIndexes、および presentationHeader
    2. featureOption"anonymous_holder_binding" と等しい場合:
      1. proofValue を、 開示証明ヘッダーバイト 0xd90x5d、および 0x05 で始まるように初期化します。
      2. components を、次の値を含む要素の配列として初期化します: bbsProofcompressedLabelMapmandatoryIndexesselectiveIndexespresentationHeader、および lengthBBSMessages
    3. featureOption"pseudonym" と等しい場合:
      1. proofValue を、 開示証明ヘッダーバイト 0xd90x5d、および 0x07 で始まるように初期化します。
      2. components を、次の値を含む要素の配列として初期化します: bbsProofcompressedLabelMapmandatoryIndexesselectiveIndexespresentationHeadernym_domainpseudonym、および lengthBBSMessages
    4. featureOption"holder_binding_pseudonym" と等しい場合:
      1. proofValue を、 開示証明ヘッダーバイト 0xd90x5d、および 0x09 で始まるように初期化します。
      2. components を、次の値を含む要素の配列として初期化します: bbsProofcompressedLabelMapmandatoryIndexesselectiveIndexespresentationHeadernym_domainpseudonym、および lengthBBSMessages
  3. [RFC8949] に従って components を CBOR エンコードします。このとき、 いずれの components にも CBOR タグを使用してはなりません。 生成されたエンコード値を proofValue に追加します。
  4. proofValue の multibase-base64url-no-pad-encoding を持つ文字列として派生証明を返します。すなわち、 「u」で始まり、proofValue の base64url-no-pad-encoded 値で終わる文字列を 返します。

3.2.4 parseDerivedProofValue

以下のアルゴリズムは、派生証明値の構成要素を解析します。 必須入力は派生証明値 (proofValue) です。 「bbsProof」、 「labelMap」、「mandatoryIndexes」、「selectiveIndexes」、「presentationHeader」、 「featureOption」、および featureOption パラメーターの値に応じて 「nym_domain」、「pseudonym」、および/または「lengthBBSMessages」という名前を持つ 6 から 9 個の要素の集合を含む、単一の派生証明値オブジェクトが出力として生成されます。

  1. proofValue 文字列が u (U+0075, LATIN SMALL LETTER U) で始まらず、 multibase-base64url-no-pad-encoded 値であることを示していない場合、 エラーを発生させなければならず、そのエラーは PROOF_VERIFICATION_ERROR というエラー型を伝達すべきです。
  2. decodedProofValue を、proofValue 内の先頭の u に続く 部分文字列を base64url-no-pad デコードした結果で初期化します。
  3. BBS 開示証明が許可されたヘッダー値で始まることを確認し、 featureOption 変数を次のように設定します:
    1. decodedProofValue がヘッダーバイト 0xd90x5d、および 0x03 で始まる場合、featureOption"baseline" に設定します。
    2. decodedProofValue がヘッダーバイト 0xd90x5d、および 0x05 で始まる場合、featureOption"anonymous_holder_binding" に設定します。
    3. decodedProofValue がヘッダーバイト 0xd90x5d、および 0x07 で始まる場合、featureOption"pseudonym" に設定します。
    4. decodedProofValue がヘッダーバイト 0xd90x5d、および 0x09 で始まる場合、featureOption"holder_binding_pseudonym" に設定します。
  4. components を、3 バイトの BBS 開示証明ヘッダーに続く バイトを CBOR デコードした結果である配列として初期化します。その結果が 5、6、7、または 8 要素の配列でない場合、 エラーを発生させなければならず、そのエラーは PROOF_VERIFICATION_ERROR というエラー型を伝達すべきです。
  5. 既存の components の第 2 要素を compressedLabelMap として渡して、 節のアルゴリズムを呼び出した結果を使用して、 components の第 2 要素を置き換えます。
  6. 5、6、7、または 8 個の要素に設定されたプロパティを持つオブジェクトとして 派生証明値を返し、それぞれ「bbsProof」、「labelMap」、 「mandatoryIndexes」、「selectiveIndexes」、「presentationHeader」、および任意の 「nym_domain」、「pseudonym」、および/または「lengthBBSMessages」という名前を使用します。 さらに、featureOption とその値をオブジェクトに追加します。

3.3 bbs-2023

bbs-2023 暗号スイートは入力文書を受け取り、 RDF データセット正規化アルゴリズム [RDF-CANON] を使用して文書を正規化し、その後、 多数の変換および暗号操作を適用して データ完全性証明を生成します。この節のアルゴリズムには、 そのようなデータ完全性証明の検証も含まれます。

3.3.1 ベース証明の作成 (bbs-2023)

以下のアルゴリズムは、セキュリティ保護されていないデータ 文書が与えられた場合に データ完全性 証明を作成する方法を規定します。必須入力は、 セキュリティ保護されていないデータ 文書 (マップ unsecuredDocument)、証明 オプションの集合 (マップ options)、必須 JSON ポインターの配列 (mandatoryPointers)、featureOption インジケーターパラメーター、および featureOption に応じて、commitment_with_proof バイト配列です。 データ完全性 証明 (マップ)、 またはエラーが 出力として生成されます。

featureOption パラメーターは、使用されているオプション機能がある場合に、 その機能を示すために使用されます。このパラメーターは、"baseline""anonymous_holder_binding""pseudonym"、または "holder_binding_pseudonym" のいずれかの値を取ることができます。"baseline" は オプション機能がない場合を表すために使用されることに注意してください。 featureOption"anonymous_holder_binding""pseudonym"、または "holder_binding_pseudonym" に設定されている場合、 commitment_with_proof 入力を提供しなければなりませんfeatureOption"pseudonym" または "holder_binding_pseudonym" に設定されている場合、 signer_nym_entropy 入力を提供しなければなりません

  1. proof を証明オプション options の複製とします。
  2. proofConfig を、 options をパラメーターとして渡して § 4.2.4.2 証明構成 節のアルゴリズムを実行した結果とします。
  3. transformedData を、 unsecuredDocumentproofConfig、および options をパラメーターとして渡して § 4.4.1 TransformSD のアルゴリズムを実行した結果とします。
  4. hashData を、 transformedData および proofConfig をパラメーターとして渡して § 4.4.2 HashSD のアルゴリズムを実行した結果とします。
  5. proofBytes を、 hashDataoptionsfeatureOption、および必要な場合は commitment_with_proof をパラメーターとして渡して 3.3.2 ベース証明のシリアライズ (bbs-2023) 節のアルゴリズムを実行した結果とします。
  6. proof.proofValue を、proofBytes base64url エンコードされた Multibase 値とします。
  7. proofデータ完全性 証明として返します。

3.3.2 ベース証明の シリアライズ (bbs-2023)

以下のアルゴリズムは、BBS で保護された検証可能な クレデンシャルの発行者によって呼び出されるもので、ベース証明を作成する方法を規定します。ベース証明は、 そこから派生証明を生成する責任を負う保有者だけに 提供され、検証者には選択的に開示された詳細のみを証明内で公開します。この アルゴリズムは、Data Integrity [VC-DATA-INTEGRITY-1.1] 仕様の 第 4 節: アルゴリズムで定義されるアルゴリズムと併用するよう設計されています。必須入力は、 暗号学的ハッシュデータ (hashData)、 featureOption、および必要な場合は commitment_with_proof です。 featureOption"anonymous_holder_binding""pseudonym"、または "holder_binding_pseudonym" に設定されている場合、 commitment_with_proof 入力を提供しなければなりません。提供されていない場合、 エラーを発生させなければならず、そのエラーは PROOF_GENERATION_ERROR というエラー型を伝達すべきです。 featureOption"pseudonym" または "holder_binding_pseudonym" に設定されている場合、 signer_nym_entropy 入力を提供しなければなりません。提供されていない場合、 エラーを発生させなければならず、そのエラーは PROOF_GENERATION_ERROR というエラー型を伝達すべきです。 バイト列として表される単一のデジタル証明値が 出力として生成されます。

  1. proofHashmandatoryPointersmandatoryHashnonMandatory、 および hmacKey を、hashData 内でそれぞれのプロパティ名に関連付けられた 値で初期化します。
  2. bbsHeader を、proofHashmandatoryHash をその順序で連結した値で 初期化します。
  3. bbsMessages を、UTF-8 文字エンコーディングを使用してエンコードされた nonMandatory 文字列配列の値を含むバイト配列の配列として初期化します。
  4. featureOption の値に応じて、以下の手順を使用して bbsSignature を計算します。
    1. featureOption"baseline" と等しい場合、 適切な鍵素材、header として bbsHeader、および messages として bbsMessages を使用して、[CFRG-BBS-Signature] の Sign 手順を使用して bbsSignature を計算します。
    2. featureOption"anonymous_holder_binding" と等しい場合、 適切な鍵素材、commitment_with_proof として commitment_with_proofheader として bbsHeader、 および messages として bbsMessages を使用して、[CFRG-Blind-BBS-Signature] の BlindSign 手順を使用して bbsSignature を計算します。これにより、 匿名保有者バインディング機能が提供されます。
    3. featureOption"pseudonym" または "holder_binding_pseudonym" と等しい場合、 発行者は signer_nym_entropy の暗号学的にランダムな値を生成し、 適切な鍵素材、 header として bbsHeadermessages として bbsMessagescommitment_with_proof として commitment_with_proof、および signer_nym_entropy 値を使用して、 [CFRG-Pseudonym-BBS-Signature] の 「ブラインド発行」操作を使用して bbsSignature を計算します。 発行者が将来、この保有者に同じ nym_secret にバインドされた クレデンシャルを再発行する必要が生じる可能性がある場合、 signer_nym_entropy 値を保持すべきです。それ以外の場合、この値は破棄できます。

      これにより、クレデンシャルバインド 仮名または保有者バインディングと 仮名機能が提供されます。
  5. `proofValue を、 bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointersfeatureOption、および featureOption の値に応じて signer_nym_entropy をパラメーターとして渡して、 3.2.1 serializeBaseProofValue 節のアルゴリズムを呼び出した結果で初期化します。

    注: publicKey は、[CFRG-BBS-SIGNATURE] に従ってエンコードされた 公開鍵のバイト配列です。
  6. proofValueデジタル証明として返します。

3.3.3 派生証明の追加 (bbs-2023)

以下のアルゴリズムは、bbs-2023 で保護された 検証可能な クレデンシャルの保有者によって呼び出され、選択的開示の派生証明を作成します。 派生証明は検証者に提供されます。入力には、 JSON-LD 文書 (document)、BBS ベース証明 (proof)、文を選択的に開示するために使用する JSON ポインターの配列 (selectivePointers)、任意の BBS presentationHeader (バイト配列)、featureOption パラメーター、選択された featureOption をサポートする追加パラメーター (以下を参照)、 および文書ローダーなどのカスタム JSON-LD API オプションが含まれます。 オブジェクトとして表される単一の選択的に開示された文書 値が出力として生成されます。

featureOption"anonymous_holder_binding" と等しい場合、 必須の追加入力は holderSecret および proverBlind です。これらは 保有者によって事前に計算されていることになります。背景情報については 匿名保有者バインディングを参照してください。

featureOption"pseudonym" と等しい場合、必須の 追加入力は、いずれも保有者が知っている prover_nymproverBlind、および 保有者によって設定されるか検証者から保有者に伝達される nym_dofmain です。 背景情報についてはクレデンシャルバインド仮名を 参照してください。

featureOption"holder_binding_pseudonym" と等しい場合、必須の 追加入力は、すべて保有者が知っている holder_secretprover_nym、および proverBlind、 ならびに保有者によって設定されるか 検証者から保有者に伝達される nym_dofmain です。 背景情報については保有者バインディングと仮名を 参照してください。

  1. proofData オブジェクトを、 3.2.2 parseBaseProofValue 節のアルゴリズムから返された結果とします。 少なくとも、proofData オブジェクトには bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointers、および featureOption フィールドが含まれます。 featureOption の値に応じて、追加のフィールドが存在する場合があります。
  2. disclosureData を、 documentproofDataselectivePointers、および文書ローダーなどのカスタム JSON-LD API オプションを渡して、 § 4.4.3 CreateDisclosureData のアルゴリズムを 呼び出したときに返されるオブジェクトで初期化します。disclosureData オブジェクトには、次のフィールドが含まれます: revealDocumentmandatoryIndexesselectiveIndexesverifierLabelMap mandatory、および nonMandatory
  3. newProofproof の浅いコピーで初期化します。
  4. newProof 内の proofValue を、 proofData および disclosureData をパラメーターとして渡して 3.3.4 派生証明のシリアライズ 節のアルゴリズムを呼び出した結果で置き換えます。
  5. revealDocument 内の「proof」プロパティの値を newProof に設定します。
  6. revealDocument選択的に開示された文書として返します。

3.3.4 派生証明の シリアライズ

以下のアルゴリズムは派生証明を生成します。 入力は proofData および disclosureData オブジェクトです。

  1. bbsMessages を、UTF-8 文字エンコーディングを使用してエンコードされた nonMandatory 文字列配列の値を含むバイト配列の配列として初期化します。
  2. featureOption パラメーターの値に基づき、 以下に示す適切な手順によって計算された値を bbsProof に設定します。
    1. featureOption"baseline" と等しい場合、 [CFRG-BBS-SIGNATURE] の ProofGen 手順によって計算された値を bbsProof に設定します。すなわち、 ProofGen(PK, signature, header, ph, messages, disclosed_indexes) であり、 PK は元の発行者の公開鍵、signaturebbsSignatureheaderbbsHeaderphpresentationHeadermessagesbbsMessagesdisclosed_indexesselectiveIndexes です。
    2. featureOption"anonymous_holder_binding" と等しい場合、 [CFRG-Blind-BBS-Signature] の BlindProofGen 手順によって計算された値を bbsProof に設定します。ここで、 PK は元の発行者の公開鍵、 signaturebbsSignatureheaderbbsHeaderphpresentationHeadermessagesbbsMessagesdisclosed_indexesselectiveIndexes、 および commitment_with_proof です。保有者はさらに、 holder_secret と、commitment_with_proof の計算に使用された proverBlind を提供します。これは 匿名保有者バインディング機能オプションです。 IETF API が確定した時点で 更新されます。
    3. featureOption"pseudonym" と等しい場合、 [CFRG-Pseudonym-BBS-Signature] の「検証と確定」操作を 空の committed_messages 配列とともに使用して、 bbsSignature の検証と nym_secret 値の計算の両方を行います。この操作は prover_nymsigner_nym_entropy、および secret_prover_blind を使用します。

      nym_domain を決定します。これは利用シナリオに応じて、 検証者によって指定されるか、保有者によって設定される場合があります。 [CFRG-Pseudonym-BBS-Signature] の 「仮名付き証明生成」 操作を使用して派生証明を生成します。 この操作は入力として、 元の発行者の公開鍵を PK として、 bbsSignaturesignature として、 bbsHeaderheader として、 presentationHeaderph として、 bbsMessagesmessages として、 selectiveIndexesdisclosed_indexes として、 nym_secretnym_domaincommitted_messages 用の空の配列、 および secret_prover_blind を受け取ります。 bbsProof に割り当てられる 生の 暗号学的証明値を提供することに加え、 pseudonym も返します。

      これは クレデンシャルバインド仮名 機能オプション用です。IETF API が確定した時点で更新されます。
    4. featureOption"holder_binding_pseudonym" と等しい場合、 [CFRG-Pseudonym-BBS-Signature] の「検証と確定」操作を、 holder_secret のみを値として含む committed_messages 配列とともに使用して、 bbsSignature の検証と nym_secret 値の計算の両方を行います。この操作は prover_nymsigner_nym_entropy、および secret_prover_blind を使用します。

      nym_domain を決定します。これは利用シナリオに応じて 検証者によって指定されるか、保有者によって設定される場合があります。 [CFRG-Pseudonym-BBS-Signature] の 「仮名付き証明生成」 操作を使用して派生証明を生成します。 この操作は入力として、 PK、元の発行者の公開鍵、 signaturebbsSignatureheaderbbsHeaderphpresentationHeadermessagesbbsMessagesdisclosed_indexesselectiveIndexes、 この操作は入力として、 元の発行者の公開鍵を PK として、 bbsSignaturesignature として、 bbsHeaderheader として、 presentationHeaderph として、 bbsMessagesmessages として、 selectiveIndexesdisclosed_indexes として、 nym_secretnym_domaincommitted_messages 配列の唯一の値を holder_secret として、 および secret_prover_blind を受け取ります。 bbsProof に割り当てられる生の暗号学的証明値を 提供することに加え、 pseudonym も返します。 これは 保有者バインディングと仮名 機能オプション用です。IETF API が確定した時点で更新されます。
  3. featureOption"anonymous_holder_binding""pseudonym"、または "holder_binding_pseudonym" と等しい場合、 lengthBBSMessages パラメーターを bbsMessages 配列の長さに設定します。
  4. bbsProof に対応するパラメーター、「verifierLabelMap」を labelMap として、 mandatoryIndexesselectiveIndexesrevealDocumentpseudonym、および計算されている場合は lengthBBSMessages を指定して、 3.2.3 serializeDerivedProofValue のアルゴリズムによって返される値を返します。

3.3.5 派生証明の検証 (bbs-2023)

以下のアルゴリズムは、セキュリティ保護されたデータ 文書が与えられた場合に、 データ完全性 証明を検証する方法を規定します。必須入力は セキュリティ保護されたデータ 文書 (マップ securedDocument) です。このアルゴリズムは 検証結果を返します。これは構造体であり、その 項目は次のとおりです:

verified
true または false
verifiedDocument
verifiedfalse の場合は Null、それ以外の場合は セキュリティ保護されていない データ文書

派生証明を検証するには、次の手順を実行します:

  1. unsecuredDocument を、proof 値を削除した document のコピーとします。
  2. proofData オブジェクトを、 3.2.4 parseDerivedProofValue のアルゴリズムによって返された結果で初期化します。 少なくとも、proofData オブジェクトには bbsProoflabelMapmandatoryIndexesselectiveIndexespresentationHeader、および featureOption フィールドが含まれます。 featureOption の値に応じて、 nym_domain、|pseudonym、および/または lengthBBSMessages フィールドも含まれる場合があります。", それぞれ。
  3. verifyData オブジェクトを、 documentproofData、および文書 ローダーなどのカスタム JSON-LD API オプションを渡して、 § 4.4.4 CreateVerifyData 節のアルゴリズムを 呼び出して返された値で初期化します。 verifyData オブジェクトには、次のフィールドが含まれます: proofHashmandatoryHash、および nonMandatory
  4. publicKeyBytes を、 Data Integrity [VC-DATA-INTEGRITY-1.1] 仕様の 第 4 節: 検証メソッドの取得で説明されているように、 proof.verificationMethod 値に関連付けられた 公開鍵バイトを取得した結果とします。
  5. bbsHeader を、proofHashmandatoryHash をその順序で連結した値で初期化します。disclosedMessages を、 nonMandatory 配列の要素を UTF-8 エンコードして得られた バイト配列の配列として初期化します。
  6. featureOption の値に応じて、 以下の検証アルゴリズムを適用した結果で verified を初期化します。
    1. featureOption"baseline" と等しい場合、 [CFRG-BBS-SIGNATURE] の 検証アルゴリズム ProofVerify(PK, proof, header, ph, disclosed_messages, disclosed_indexes) を適用した結果で verified を初期化します。このとき、 PK を元の発行者の公開鍵に、 proofbbsProof に、 headerbbsHeader に、 disclosed_messagesdisclosedMessages に、phpresentationHeader に、disclosed_indexesselectiveIndexes に設定します。
    2. featureOption"anonymous_holder_binding" と等しい場合、 "L" パラメーターに lengthBBSMessages を使用して、 [CFRG-Blind-BBS-Signature] の ProofVerify 検証アルゴリズムを 適用した結果で verified を初期化します。 IETF API が確定した時点で更新されます。
    3. featureOption"pseudonym" または "holder_binding_pseudonym" と等しい場合、 "L" パラメーターに lengthBBSMessages を使用し、 空の committed_messages 配列を使用して、 [CFRG-Pseudonym-BBS-Signature] の「仮名付き証明検証」操作を 適用した結果で verified を初期化します。 IETF API が確定した時点で更新されます。
  7. 次の項目を持つ 検証結果を返します:
    verified
    verified
    verifiedDocument
    verifiedtrue の場合は unsecuredDocument、それ以外の場合は Null

4. 任意機能

この節は非規範的です。

BBS 署名の暗号学的特性により、高度な機能を サポートできるバリアントが可能になります。この仕様では、 これらの拡張のうち最も関連性の高いもののみをサポートし、それらについて 以下の節で説明します。変数 commitment_with_proofholder_secretprover_nymsigner_nym_entropy、および pseudonym は、これらの 機能に関連付けられており、BBS 署名および証明ではそれ以外に必要ありません。

課題 1: 任意の BBS 機能は削除される可能性があります

この節で説明され、この仕様の アルゴリズムに含まれている任意の BBS 機能は削除される可能性があり、それぞれの仕様が IETF で同じ期間内に RFC ステータスに到達しない場合、または各任意 機能について少なくとも2つの独立した実装が 存在しない場合、この仕様の最終化前に削除されます。

4.1 匿名所有者バインディング

この機能は発行時に、基本証明を持つ文書を、 所有者だけが知る秘密に結び付け、その所有者だけが、 検証に成功する派生証明付きの開示文書を生成できるようにします。たとえば、 攻撃者が基本証明付きの文書を取得したとしても、検証可能な派生証明付きの 開示文書を作成することはできません。

この機能を提供するため、所有者は holder_secret 値を生成します。 これは通常、少なくとも32バイト長で、暗号学的にランダムに 生成されることが推奨されます。この値を所有者が共有することはありません。代わりに所有者は、 [CFRG-Blind-BBS-Signature] の「コミットメント計算」操作を使用して、 この値を知っていることのゼロ知識証明とともにコミットメントを生成します。 この計算には暗号学的にランダムな値が使用され、 commitment_with_proof および secret_prover_blind 値が計算されます。 commitment_with_proof は発行者に伝達され、一方で secret_prover_blind は秘密に保持され、派生証明の生成に使用するため 所有者によって保持されます。 所有者は「コミットメント計算」操作を複数回実行して、 異なる発行者で使用するリンク不可能な commitment_with_proof 値を生成できることに注意してください。

発行者は commitment_with_proof を受け取ると、この仕様の手順に従い、 [CFRG-Blind-BBS-Signature] の「ブラインド署名生成」操作を使用して、 所有者から提供された commitment_with_proof とともに、文書に対する基本証明 (署名)を生成します。

所有者が派生証明付きの選択的開示文書を作成するときは、 この仕様の手順と [CFRG-Blind-BBS-Signature] の「証明生成」 操作を使用します。所有者は commited messages 配列内の唯一の「メッセージ」として holder_secret を使用し、 secret_prover_blind を提供します。

派生証明付き開示文書の検証では、この仕様の手順と [CFRG-Blind-BBS-Signature] の「証明検証」操作を使用します。

4.2 資格情報に結び付けられた仮名

この文書で規定する BBS 署名付き検証可能な資格情報では、 選択的開示とリンク不可能な暗号学的証明アーティファクトが可能です。 「リンク不可能」とは、 派生証明内の暗号学的情報を、他の 証明や元の署名にリンクできないことを意味します。これは、検証者が 所有者が以前に同じ資格情報を提示したかどうか(異なる証明 インスタンス化を用いた場合)を判断できず、何らかの種類のアイデンティティを主張することもできないことを意味します。 資格情報に結び付けられた仮名は、暗号学的仮名の限定的な リンク可能性を可能にする、プライバシーを保護する仕組みを提供します。このような仮名は、 所有者だけで決定することも、所有者と検証者が共同で決定することもできます。

この種類の暗号学的仮名(暗号学的識別子/名前)は、 2つの部分から計算されます。第1の部分である nym_secret は所有者によって指定され、 所有者だけが知るものです。 第2の部分である nym_domain は所有者または検証者のどちらかが指定でき、 所有者と検証者の間で共有されます。 発行者は発行処理中に資格情報を nym_secret に結び付けます。 その後、所有者は nym_secret から仮名を計算し、 これらの仮名が提示している資格情報に結び付けられていることを 検証者に証明できます。同じ nym_secret から計算されても、 nym_domain 値が異なる暗号学的仮名はリンク不可能です。

所有者は、ある種類の公開フォーラムで使用する仮名を自分自身に与えるため、 nym_domain を選択する場合があります。たとえば、nym_domain = "Mark Twain" を選択します。この nym_domain と 自身の nym_secret から所有者が計算する暗号学的仮名は事実上一意であり、 nym_secret を知り、かつその仮名に結び付けられた基本検証可能な資格情報を 所有している主体でなければ、この仮名アイデンティティを主張できません。 この仮名アイデンティティを主張するには、 (nym_domain, pseudonym)のペアを派生資格情報とともに送信する必要があることに注意してください。

別の状況では、所有者が検証者のサービスを利用しており、 検証者が時間の経過に伴う訪問を追跡したり、所有者による何らかのリソースの使用を 監視したりする場合があります。この場合、検証者は、所有者が 派生資格情報を提示するときに使用する必要がある nym_domain を選択します。たとえば、 検証者は、所有者が使用するため、自身の DNS ドメインに結び付けられた公開 nym_domain(例: "www.nym.example")を指定する場合があります。また検証者は、 nym_domain を定期的に変更することによって(たとえば日付に結び付けて "www.nym.example/2025-01-02" とすることで)、ある種のデータ最小化を サポートしていることを示すこともできます。この仕様では nym_domain の値を規定しません。

最後に、別の所有者の nym_secret を取得した悪意のある所有者が その値に結び付けられた資格情報を取得することを防止するため、 [CFRG-Pseudonym-BBS-Signature] の操作では、 発行者がランダム化 係数 signer_nym_entropy を追加し、署名生成中に所有者側の prover_nym と安全に「混合」します。その結果、 発行者が一意性を暗号学的に保証できる nym_secret が生成され、所有者によって使用されます。

資格情報に結び付けられた仮名の作成と使用の概要を 以下の手順に示します。

  1. 所有者は prover_nym と呼ばれる安全な値を作成します。これは 少なくとも32バイト長で、暗号学的にランダムな方法で生成されることが推奨されます。次に、 空の committed_messages 配列を使用して、[CFRG-Pseudonym-BBS-Signature] の「Commitment」操作を使用し、 commitment_with_proofsecret_prover_blind を計算します。所有者は、 資格情報の要求とともに commitment_with_proof を発行者へ送信しますが、 prover_nymsecret_prover_blind は決して開示せず、後で使用するため保持します。
  2. 発行者は、仮名が結び付けられた資格情報についての所有者からの要求 (featureOption"pseudonym" に等しい)を、 commitment_with_proof とともに受け取ります。 発行者は signer_nym_entropy のための暗号学的にランダムな値を生成し、 [CFRG-Pseudonym-BBS-Signature] の「ブラインド発行」操作を使用して 基本証明を生成します。その他の 情報とともに、基本証明には signer_nym_entropy 値が含まれます。 発行者が将来、この所有者に同じ nym_secret に結び付けられた 資格情報を再発行する必要が生じる可能性がある場合は、 signer_nym_entropy 値を保持することが推奨されます。 それ以外の場合、この値は破棄できます。
  3. 仮名が結び付けられた資格情報を受け取ると、所有者は、この仕様の手順と [CFRG-Pseudonym-BBS-Signature] の「検証と最終化」操作を 空の committed_messages 配列とともに使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では、 prover_nymsigner_nym_entropysecret_prover_blind の各値などを使用します。第三者による監視が使用される場合、 nym_secret 値を監視組織と安全に共有する必要があります。
  4. 所有者が仮名に結び付けられた派生証明を生成するときは、 nym_domain を決定する必要があります。前述のとおり、これは利用シナリオに応じて 検証者によって指定される場合も、所有者によって設定される場合もあります。次に、 この仕様の手順と、[CFRG-Pseudonym-BBS-Signature] の「仮名を使用した証明生成」 操作を使用して 派生証明を生成します。 この操作は、nym_secretnym_domain、空の committed_messages 配列、および secret_prover_blind などを入力として受け取ります。生の 暗号学的証明値を提供することに加え、派生証明に 含まれる pseudonym 値も返します。
  5. 検証者が仮名に結び付けられた派生証明を受け取ると、 この仕様の手順と [CFRG-Pseudonym-BBS-Signature] の 「仮名を使用した証明検証」操作を使用して 派生証明を検証します。これらの 手順では、指定された nym_domainpseudonym の計算に使用されたことも検証されることに注意してください。

4.3 所有者バインディングと仮名

匿名所有者バインディングと資格情報に結び付けられた仮名は、ある意味では 互いに直交する機能であり、所有者および資格情報エコシステムは両方を 同時に使用したい場合があります。たとえば、所有者は検証可能な 資格情報を holder_secret に結び付け、この値を知る所有者だけが 基本証明から派生証明を生成できるようにし、さらに nym_secret を 基本証明に結び付けて、仮名を派生証明に結び付けられるようにする場合があります。これは、 featureOption"holder_binding_pseudonym" に等しい場合に対応します。

匿名所有者バインディングと 資格情報に結び付けられた仮名の両方の作成と使用の概要を、以下の手順に示します。

  1. 所有者は holder_secret および prover_nym と呼ばれる2つの安全な値を作成します。これらは 少なくとも32バイト長で、暗号学的にランダムな方法で生成されることが推奨されます。次に、 holder_secret を唯一の 要素として含む committed_messages 配列を入力として、 [CFRG-Pseudonym-BBS-Signature] の「Commitment」操作を 使用し、commitment_with_proof および secret_prover_blind を計算します。 commitment_with_proof は 資格情報の要求とともに発行者へ送信されますが、holder_secretprover_nymsecret_prover_blind は 所有者が後で使用するため保持され、決して開示されません。
  2. 発行者は仮名が結び付けられた資格情報についての所有者の要求を受け取ります。 featureOption"pseudonym" に等しく、要求には commitment_with_proof が含まれます。 発行者はこの仕様の手順を使用して、 signer_nym_entropy のための暗号学的にランダムな値を生成し、 [CFRG-Pseudonym-BBS-Signature] の 「ブラインド発行」操作を使用して 基本証明を生成します。その他の情報とともに、基本証明には signer_nym_entropy 値が含まれます。発行者が将来、 この所有者に同じ nym_secret に結び付けられた資格情報を再発行する必要がある場合は、 signer_nym_entropy 値を保持することが推奨されます。それ以外の場合、この値は破棄できます。
  3. 仮名が結び付けられた資格情報を受け取ると、所有者はこの仕様の手順と [CFRG-Pseudonym-BBS-Signature] の 「検証と最終化」操作を、 holder_secret を唯一の要素として含む committed_messages 配列とともに使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では、 holder_secretprover_nymsigner_nym_entropysecret_prover_blind の各値などを使用します。 第三者による監視が利用される場合、nym_secret 値は 監視組織と安全に共有されます。
  4. 所有者が仮名に結び付けられた派生証明を生成するときは、 nym_domain を決定する必要があります。前述のように、これは利用シナリオに応じて 検証者によって指定される場合も、所有者によって設定される場合もあります。次に、 この仕様の手順と、[CFRG-Pseudonym-BBS-Signature] の 「仮名を使用した証明生成」 操作を使用して派生証明を生成します。 この操作は、nym_secretnym_domainholder_secret を唯一の要素として含む committed_messages 配列、および secret_prover_blind などを入力として受け取ります。 生の暗号学的証明値を提供することに加えて、 派生証明に含まれる pseudonym 値も返します。
  5. 検証者が仮名に結び付けられた派生証明を受け取ると、 この仕様の手順と [CFRG-Pseudonym-BBS-Signature] の 「仮名を使用した証明検証」操作を使用して 派生証明を検証します。これらの 手順では、指定された nym_domainpseudonym の計算に使用されたことも検証されることに注意してください。

4.4 任意機能の概要

この節は非規範的です。

この節では、「baseline」BBS 証明および 任意機能について、入力、出力、証明の直列化、 タスク、手順の概要を示します。baseline BBS とは、追加機能のない BBS 基本証明および派生証明を 意味します。すべての任意機能は、 「baseline」BBS 署名/証明のものに加えて 何らかの追加入力、タスク、または出力が生成されるという意味で「加算的」です。

表 1 発行者による基本証明の作成: 入力など。
名前 タスク 入力 署名アルゴリズム
ベースライン BBS baseline: VC からの BBS 署名生成 baseline: 文書、証明オプション、鍵素材、必須ポインタ BBS
匿名所有者バインディング baseline baseline + 所有者からの証明付きコミットメント ブラインド BBS
資格情報に結び付けられた仮名 baseline + signer_nym_entropy を生成 baseline + signer_nym_entropy、所有者からの証明付きコミットメント 仮名 BBS
所有者バインディングと仮名 baseline + signer_nym_entropy を生成 baseline + signer_nym_entropy、 所有者からの証明付きコミットメント 仮名 BBS
表 2 発行者による基本証明の作成: ヘッダーと直列化。
名前 証明ヘッダーバイト 直列化された出力
ベースライン BBS 0xd9, 0x5d, および 0x02 baseline: bbsSignature, bbsHeader, publicKey, hmacKey, および mandatoryPointers
匿名所有者バインディング 0xd9, 0x5d, および 0x04 baseline
資格情報に結び付けられた仮名 0xd9, 0x5d, および 0x06 baseline + signer_nym_entropy
所有者バインディングと仮名 0xd9, 0x5d, および 0x08 baseline + signer_nym_entropy
表 3 所有者による派生証明の追加: 入力など。
名前 タスク 入力 証明生成アルゴリズム
ベースライン BBS 基本証明付き VC からの BBS 派生証明生成 baseline: (基本証明の直列化から) bbsSignature, bbsHeader, publicKey, hmacKey, および mandatoryPointers; selectivePointers(所有者の選択) BBS
匿名所有者バインディング baseline baseline + holder_secret, prover_blind(どちらも 所有者が把握) ブラインド BBS
資格情報に結び付けられた仮名 baseline + nym_secret を計算、pseudonym を計算 baseline + prover_nym, prover_blind(すべて所有者が把握)、signer_nym_entropy (発行者からの基本証明に含まれる)、nym_domain 仮名 BBS
所有者バインディングと仮名 baseline + nym_secret を計算、pseudonym を計算 baseline + holder_secret, prover_nym, prover_blind(すべて所有者が把握)、signer_nym_entropy (発行者からの基本証明に含まれる)、nym_domain 仮名 BBS
表 4 所有者による派生証明の追加: ヘッダーと直列化。
名前 証明ヘッダーバイト 直列化された出力
ベースライン BBS 0xd9, 0x5d, および 0x03 baseline: bbsProof, compressedLabelMap, mandatoryIndexes, selectiveIndexes, presentationHeader
匿名所有者バインディング 0xd9, 0x5d, および 0x05 baseline
資格情報に結び付けられた仮名 0xd9, 0x5d, および 0x07 baseline + pseudonym, nym_domain
所有者バインディングと仮名 0xd9, 0x5d, および 0x09 baseline + pseudonym, nym_domain
表 5 派生証明の検証: 入力とアルゴリズム。
名前 入力 証明検証アルゴリズム
BBS ベースライン baseline: (派生証明の直列化から) bbsProof, compressedLabelMap, mandatoryIndexes, selectiveIndexes, presentationHeader BBS
匿名所有者バインディング baseline ブラインド BBS
資格情報に結び付けられた仮名 baseline + pseudonym(派生証明に含まれる), nym_domain 仮名 BBS
所有者バインディングと仮名 baseline + pseudonym(派生証明に含まれる), nym_domain 仮名 BBS

5. セキュリティに関する考慮事項

この節を読む前に、読者は Data Integrity 仕様のセキュリティに関する考慮事項の節で提供されている 一般的なセキュリティ上の助言を理解しておくことが強く推奨されます。

5.1 基本証明のセキュリティ特性

この節は非規範的です。

基本証明のセキュリティは、関連付けられた BBS 署名のセキュリティ特性に依存します。デジタル署名には、 多数の望ましい暗号学的特性 [Taming_EdDSAs] があり、その中には 次のものがあります:

EUF-CMA選択メッセージ攻撃下での存在的偽造不可能性)は通常、 署名方式に要求される最小限のセキュリティ特性です。これは、署名者の 公開鍵 p k を持ち、自身が選択したメッセージに対する任意の数の署名を (適応的に)受け取った効率的な攻撃者: { m i , σ i } i = 1 N が、新しいメッセージに対して有効な署名 σ を出力できないことを保証します。 m { m i } i = 1 N (無視できる確率を除く)。攻撃者が新しいメッセージに対して有効な 署名を出力した場合: ( m , σ ) , これは存在的偽造と呼ばれます。

SUF-CMA選択メッセージ攻撃下での強い偽造不可能性)は、 EUF-CMA よりも強い概念です。これは、署名者の公開鍵 p k を持ち、自身が選択したメッセージに対する任意の数の署名を受け取った 任意の効率的な攻撃者: { m i , σ i } i = 1 N が、新しい有効な署名ペア ( m , σ ) を出力できないことを保証します。ここで ( m , σ ) { m i , σ i } i = 1 N です(無視できる確率を除く)。強い偽造不可能性は、 攻撃者が新しいメッセージに署名できないだけでなく、古いメッセージに対して 新しい署名を見つけることもできないことを意味します。

[CDL2016] では、 いくつかの妥当な仮定の下で、BBS 署名が EUF-CMA であることが証明されています。さらに、[TZ2023] では、同様の仮定の下で BBS 署名が SUF-CMA であることが証明されています。どちらの場合も、仮定は 離散対数問題の困難性に関連しており、これは大規模な量子 コンピューティングに対して安全とはみなされません。

非量子コンピューティング環境下では、[CFRG-BBS-SIGNATURE] は BBS 署名スイートの実装者に追加のセキュリティガイドラインを 提供しています。ペアリングフレンドリー曲線に関連するさらなる セキュリティ上の考慮事項は、 [CFRG-PAIRING-FRIENDLY] で説明されています。

5.2 派生証明のセキュリティ 特性

この節は非規範的です。

派生証明のセキュリティは、関連付けられた BBS 証明のセキュリティ特性に依存します。[CDL2016] と [TZ2023] の両方で、 BBS 証明BBS 署名を知っていることのゼロ知識証明であることが証明されています。

[CFRG-BBS-SIGNATURE] で説明されているように、これは次を意味します:

証明を受け取った検証側は、その証明の生成にどの署名が 使用されたかを判断できず、一般的な相関の原因が排除されます。一般に、 同じ署名から生成された2つの証明であっても、 生成された各証明はランダムと区別できません。

および

この方式によって生成される証明は、証明を生成した当事者 (所有者/証明者、またはその代理人)が署名を所有していたことを、 その署名を明らかにすることなく検証者に証明します。

より正確には、BBS 証明の検証には、元の 発行者の公開鍵と、適切な順序のまま変更されていない開示済み BBS メッセージが必要です。

6. プライバシーに関する考慮事項

この節は非規範的です。

6.1 選択的開示 とデータ漏洩

選択的開示により、所有者は特定の目的を達成するために 検証者へ開示する情報を最小化できます。選択的開示を可能にする システム全体を規定する際には、 検証者へ開示することを意図していない追加情報が最小限になるよう注意する必要があります。 このような漏洩はシステムのアーティファクトを通じて発生する可能性があります。 このようなアーティファクトは、データ構造などのシステム上位層や、 下位レベルの暗号プリミティブから生じることがあります。

たとえば、BBS 署名方式は、複数のメッセージに対する署名を生成するうえで 非常に空間効率の高い方式です。つまり、所有者に送信される暗号学的 署名のサイズは、メッセージの数に関係なく一定です。 その後、所有者はこれらのメッセージのいずれかを選択的に 検証者へ開示できますが、暗号方式の一部として、 発行者によって署名されたメッセージの総数を検証者へ開示する必要があります。 このような情報漏洩を回避する必要がある場合は、 [CFRG-BBS-SIGNATURE] のプライバシーに関する考慮事項の節で 提案されているように、メッセージ数を共通の長さまでパディングすることが推奨されます。

より上位の層では、データが選択的開示に適した個々のステートメント、 すなわち BBS メッセージへどのようにマッピングされるかが、 データ漏洩の潜在的な原因になります。この暗号スイートでは、 JSON-LD 処理を使用して入力を RDF に変換することで、 情報を漏洩する可能性のある JSON データ表現の多数の構造的アーティファクト (ネスト、マップ、配列内の位置など)を排除できます。RDF はその後、 単純な主語、プロパティ、値のステートメントからなる正規で平坦な形式 (検証可能な資格情報データモデル [VC-DATA-MODEL-2.0] ではクレームと呼ばれる) として表現できます。以下では、 JSON-LD 形式の検証可能な資格情報を、選択的開示に使用する ステートメント(BBS メッセージ)の集合へマッピングするための一般的な方式である RDF 正規化を検討します。この処理を実行した後でも 情報漏洩の潜在的な原因が残ることを示し、その漏洩が 鍵付き疑似ランダム関数(PRF)を使用することでどのように軽減されるかを示します。

RDF 正規化を使用すると、JSON-LD VC を一連の ステートメント平坦化できます。このアルゴリズムは VC の内容に依存し、 ステートメントの順序付けを支援するために暗号学的ハッシュ関数も 使用します。本質的には、JSON-LD 文書内のクレームの主語を表す 各 JSON オブジェクトに @id フィールドが定義されていない場合、 id が割り当てられます。このような id空白ノード id と呼ばれます。これらの id は、各クレームの主語を 区別できるように、クレームを単純な主語、プロパティ、値のステートメントとして表現するために必要です。 id 値は [RDF-CANON] に従って決定論的に設定され、 文書内のデータおよび SHA-256 などの 暗号学的ハッシュ関数の出力に基づきます。

以下では、ウィンドサーフィン用セイルの集合について、わずかに異なる2つの VC と、 選択的開示に使用できるステートメント集合への 正規化を示します。6.1 サイズのセイルの年を変更すると、 これら2つの VC 間でステートメントの順序が大きく変わることが分かります。 所有者が大きなセイル(7.0 および 7.8)についての情報だけを 開示した場合でも、検証者はセイル集合について何かが変わったこと、 すなわち情報漏洩を判断できる可能性があります。

3: ウィンドサーフィン用セイル集合の VC
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "credentialSubject": {
    "sails": [
      {
        "size": 5.5,
        "sailName": "Kihei",
        "year": 2023
      },
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2023 // 正規化への影響を確認するため、これを変更します
      },
      {
        "size": 7.0,
        "sailName": "Lahaina",
        "year": 2020
      },
      {
        "size": 7.8,
        "sailName": "Lahaina",
        "year": 2023
      }
    ]
  }
}

上記 VC の正規形式。空白ノード id、すなわち _:c14nX ラベルの割り当ては VC の内容に依存し、 これはステートメントの順序にも影響します。

4: ウィンドサーフィン用 セイル集合の VC の正規形式
_:c14n0 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n0 <https://windsurf.grotto-networking.com/selective#size> "7.8E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n0 <https://windsurf.grotto-networking.com/selective#year> "2023"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .
_:c14n1 <https://www.w3.org/2018/credentials#credentialSubject> _:c14n4 .
_:c14n2 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n2 <https://windsurf.grotto-networking.com/selective#size> "7"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n2 <https://windsurf.grotto-networking.com/selective#year> "2020"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n3 <https://windsurf.grotto-networking.com/selective#sailName> "Kihei" .
_:c14n3 <https://windsurf.grotto-networking.com/selective#size> "5.5E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n3 <https://windsurf.grotto-networking.com/selective#year> "2023"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n4 <https://windsurf.grotto-networking.com/selective#sails> _:c14n0 .
_:c14n4 <https://windsurf.grotto-networking.com/selective#sails> _:c14n2 .
_:c14n4 <https://windsurf.grotto-networking.com/selective#sails> _:c14n3 .
_:c14n4 <https://windsurf.grotto-networking.com/selective#sails> _:c14n5 .
_:c14n5 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n5 <https://windsurf.grotto-networking.com/selective#size> "6.1E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n5 <https://windsurf.grotto-networking.com/selective#year> "2023"^^<http://www.w3.org/2001/XMLSchema#integer> .

更新されたウィンドサーフィン用セイル集合、すなわち 6.1 サイズのセイルが 2024年モデルに更新されています。これにより、 空白ノード id の割り当てを通じてステートメントの順序が変化します。

5: わずかに更新されたウィンドサーフィン用 セイル集合の VC
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "credentialSubject": {
    "sails": [
      {
        "size": 5.5,
        "sailName": "Kihei",
        "year": 2023
      },
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2024 // 古いモデルを更新する新しいセイル。正規化が変化します
      },
      {
        "size": 7.0,
        "sailName": "Lahaina",
        "year": 2020
      },
      {
        "size": 7.8,
        "sailName": "Lahaina",
        "year": 2023
      }
    ]
  }
}

前の VC の正規形式。空白ノード id の 割り当てとステートメントの順序の違いに注意してください。

6: 更新されたウィンドサーフィン用 セイル集合の VC の正規形式
_:c14n0 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n0 <https://windsurf.grotto-networking.com/selective#size> "6.1E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n0 <https://windsurf.grotto-networking.com/selective#year> "2024"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n1 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n1 <https://windsurf.grotto-networking.com/selective#size> "7.8E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n1 <https://windsurf.grotto-networking.com/selective#year> "2023"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .
_:c14n2 <https://www.w3.org/2018/credentials#credentialSubject> _:c14n5 .
_:c14n3 <https://windsurf.grotto-networking.com/selective#sailName> "Lahaina" .
_:c14n3 <https://windsurf.grotto-networking.com/selective#size> "7"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n3 <https://windsurf.grotto-networking.com/selective#year> "2020"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n4 <https://windsurf.grotto-networking.com/selective#sailName> "Kihei" .
_:c14n4 <https://windsurf.grotto-networking.com/selective#size> "5.5E0"^^<http://www.w3.org/2001/XMLSchema#double> .
_:c14n4 <https://windsurf.grotto-networking.com/selective#year> "2023"^^<http://www.w3.org/2001/XMLSchema#integer> .
_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n0 .
_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n1 .
_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n3 .
_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n4 .

これらの空白ノード id の割り当てと、 それらがステートメントに課す順序による情報漏洩を防止するため、 HMAC ベースの PRF を空白ノード idに対して 実行します。HMAC 秘密鍵は発行者所有者の間でのみ共有され、 発行者によって生成される各基本証明では 新しい HMAC 鍵が使用されます。その例は、 [DI-ECDSA] の 正規 HMAC テストベクトルで確認できます。 次の節で説明するように、BBS でリンク不可能性を維持するため、 HMAC ベースの空白ノード idは使用せず、 テストベクトル 12に示すように、HMAC に基づいて 順序をシャッフルしたバージョンを生成します。 これは ECDSA-SD のアプローチと比べ、空白ノード idに関する情報隠蔽が弱くなることに注意してください。これは 空白ノード idの数に関する情報が漏洩する可能性があるためですが、 空白ノード id に HMAC を適用して生成される事実上一意の識別子を介した リンク攻撃を防止します。

6.2 選択的開示 とリンク不可能性

VC の一部の用途では、複数の異なる検証者との やり取りが追跡またはリンクされることを防止することが、 所有者のプライバシーにとって重要な場合があります。特に、 2つの重要なケース、(i) 検証者と発行者の共謀、および (ii) 検証者同士の共謀を考えます。第1のケースは 1に示すように、検証者所有者とのやり取りについて、資格情報の元の 発行者へ報告するものです。この状況では、発行者は 発行した VC を使用して、所有者とさまざまな検証者との すべてのやり取りを追跡できる可能性があります。第2の 状況は、2に示すように、複数の 検証者が共謀して、やり取りした 所有者に関する情報を共有するものです。


複数の検証者が発行者へデータを送り返していることを示す図。
図は上から下に配置され、上部に発行者とラベル付けされた円があり、
その下の所有者とラベル付けされた円に接続されています。所有者とラベル付けされた円から、
検証者とラベル付けされた複数の追加の円へ複数の矢印があります。検証者と
ラベル付けされた円から発行者とラベル付けされた円へ破線の矢印が戻っており、
共謀によるデータフローを示しています。
1 検証者と発行者の共謀。

複数の検証者が互いに情報を共有していることを示す図。
図は上から下に配置され、上部に発行者とラベル付けされた円があり、
その下の所有者とラベル付けされた円に接続されています。所有者とラベル付けされた円から、
検証者とラベル付けされた複数の追加の円へ複数の矢印があります。検証者と
ラベル付けされた円から他の発行者とラベル付けされた円へ破線の矢印があり、
検証者同士の共謀によるデータフローを示しています。
2 検証者同士の共謀。

VC システムが所有者のプライバシーに対するこのような「リンク攻撃」を 防止する特性を表すために、リンク不可能性という用語を使用します。 リンク不可能性という用語自体は比較的新しいものですが、 [NISTIR8053] の3.3節では、 リンク攻撃による再識別について説明し、 ケーススタディを提示しています。データプライバシーに対するリンク攻撃についての 知識の体系化は、 [Powar2023] にあります。 ユーザープライバシーに対するリンク攻撃の最も広範な利用は、 Web ブラウザフィンガープリンティングという手法を通じて行われており、その調査は [Pugliese2020] にあります。

リンクの概念を定量化するため、[Powar2023] では 匿名集合という考え方を導入しています。ここで扱う VC の場合、 匿名集合には、特定の VC の所有者と、 特定の発行者に関連するその他の所有者が含まれます。匿名 集合が小さいほど、所有者が複数の検証者をまたいで追跡される可能性が高くなります。 署名済み VC には発行者の公開鍵への参照が含まれるため、 特定の発行者から VC を所有する所有者についての 匿名集合の初期サイズは、その発行者がその特定の公開鍵/秘密鍵ペアを使用して 発行した VC の数です。 悪意のない発行者は、VC の発行に使用する公開鍵/秘密鍵 ペアの数を最小限にすることが期待されます。匿名集合という考え方は、 [vc-bitstring-status-list] の グループプライバシーの概念と類似していることに注意してください。ここでリンクという用語を使用する場合、 一般に匿名集合のサイズを減少させる任意の仕組みを意味します。

選択的開示をサポートする VC システムにおけるリンクの原因:

  1. 暗号プリミティブによるアーティファクト。
  2. VC を選択的開示に適したステートメント集合へマッピングすることで生じるアーティファクト。
  3. VC の証明オプションおよび必須開示情報によるアーティファクト。
  4. VC 内で選択的に開示される情報。
  5. 外部 VC システムに基づくリンク

以下でそれぞれについて説明します。

6.2.1 暗号学的アーティファクトによるリンク

暗号学的ハッシュ、HMAC、およびデジタル署名は、その性質上、 非常に一意性の高い識別子を生成します。SHA-256 などのハッシュ関数の出力は、 衝突耐性の特性により、異なる入力が与えられれば事実上一意であることが 保証され、強いリンク、すなわち匿名集合のサイズを 1まで減少させる結果となります。同様に、Ed25519 や 決定論的 ECDSA などの決定論的署名アルゴリズムは、異なる入力に対して事実上一意の 出力を生成し、強いリンクにつながります。

これは、所有者が VC 内のデジタル署名、HMAC、またはハッシュの アーティファクトを介して検証者間で容易に追跡される可能性があり、 したがって検証者同士の共謀や 検証者と発行者の共謀に対して脆弱であることを意味します。 一部の形式の ECDSA などのランダム化署名アルゴリズムを使用すると、 発行者は同じ入力に対して多数の異なる署名を生成し、 異なる検証者で使用するためにそれらを所有者へ 送信できます。このようなアプローチは、 検証者同士の共謀に基づく追跡を防止するために利用できますが、 検証者と発行者の共謀には役立ちません。

リンク不可能性を実現するには、所有者署名を知っていることのゼロ 知識証明(ZKPKS)と呼ばれるものを生成できるよう特別に設計された暗号学的署名 方式が必要です。これは、所有者がこのような 方式で発行者から署名を受け取り、検証者に送信する ZKPKS を 計算できることを意味します。この ZKPKS は元の署名に リンクできませんが、署名として望ましいすべての特性を備えています。つまり、 検証者はこれを使用して、メッセージが発行者の 公開鍵によって署名され、メッセージが改変されていないことを検証できます。 さらに、所有者は異なる検証者のために必要な数だけ ZKPKS を 生成でき、それらは事実上独立しておりリンク不可能です。BBS は、 この機能をサポートする署名方式の1つです。

この文書でBBS 証明と呼ばれる ZKPKS には、 保証されたリンク不可能性特性がありますが、選択的開示とともに BBS を使用すると、 リンク可能性に寄与し得る2つのアーティファクトがあります。それは、元々署名された メッセージの総数と、開示されたステートメントのインデックス値です。 詳細および軽減技法については、[CFRG-BBS-SIGNATURE] のプライバシーに関する考慮事項を参照してください。

[CFRG-BBS-SIGNATURE] の 発行者の公開鍵に関する節で述べられているように、 発行者が複数の公開鍵を使用し、その一部を 検証者と発行者の共謀を通じて特定のユーザー群を追跡するために使用する 潜在的な脅威があります。発行者の公開鍵は 検証者に見える必要がある、すなわち BBS 証明(派生証明)で参照されるため、発行者が 多数の異なる公開鍵を持ち、特にその鍵の一部を 少数のユーザー(所有者)に使用している場合、 これをリンクポイントとして利用できます。

6.2.2 VC 処理によるリンク

情報漏洩に関する節で見たように、RDF 正規化は ハッシュ関数を使用してステートメントを順序付け、さらに HMAC に基づいて ステートメントの順序をシャッフルします。これにより、 何らかのリンクを可能にするフィンガープリントが残る可能性があります。 リンクの強さは、VC 内の空白ノード、すなわち本質的には JSON オブジェクトの数と、 開示されるインデックスの数に依存します。n 個の空白ノードと k 個の開示インデックスがある場合、最悪の場合、 匿名集合のサイズは C(n, k)、すなわち n 個の要素の集合から k 個を選ぶ組合せの数の倍率だけ減少します。 VC 内の空白ノードの数を減らす、たとえば VC を短く 単純に保つことで、この数をかなり小さく抑えることができます。

6.2.3 JSON-LD ノード識別子によるリンク

JSON-LD は、リンクトデータを直列化するための JSON ベースの形式です。そのため、 文書内の各オブジェクト(JSON-LD の用語では「ノード」)に グローバルに曖昧さのない @id 属性(ノード識別子)を割り当てることをサポートします。 これによりリンクトデータのリンクが可能になり、 同じ主体に関する情報を相関させることができます。 この相関は、ユースケースに応じて望ましい場合も望ましくない場合もあります。

リンク不可能性機能のために BBS を使用する場合、グローバルに曖昧さのないノード 識別子は、強いリンクを提供することが望ましくないため、 個人やその個人を特定可能な情報には使用できません。 このような識別子は、非個人情報についてのステートメントを表現する場合 (たとえば、大きな国やコンサートイベントを識別するためにグローバルに曖昧さのない識別子を使用する場合) には使用可能であることに注意してください。また、用語を IRI に マッピングする JSON-LD の @context の使用は、一般にリンク不可能性へ影響しないことにも注意してください。

6.2.4 証明オプションと必須開示によるリンク

[VC-DATA-INTEGRITY-1.1] 仕様では、VC の proof 属性の多数のプロパティが示されています。オプションフィールドが 検証者間で強いリンク可能性を提供しないよう注意する必要があります。オプションフィールドには、 idcreatedexpiresdomainchallenge、および nonce が含まれます。たとえば、オプションの created フィールドは dateTimeStamp オブジェクトであり、証明の 作成日時を任意の秒未満の粒度まで指定できます。このような 情報が存在する場合、匿名集合のサイズを大幅に縮小する可能性があります。 発行者がこのような情報を含めたい場合は、時間の経過とともに発行される VC の数に応じて、 可能な限り粗い粒度にするべきです。

発行者は、ベース証明の作成時に使用される mandatoryPointers 入力を介して、特定の文を検証者に開示するよう 保有者に強制することもできます。次の節を参照してください: 9、および 10。ここで 強制するとは、 これらの文が検証者に開示されない限り、生成された派生証明が検証に成功しないことを 意味します。このような情報の開示が 必須である場合でも、匿名集合が十分に大きい状態を維持するよう注意するべきです。

6.2.5 所有者による選択的開示を介したリンク

[Powar2023] で説明されているように、 リンク攻撃から個人が再識別された事例が多数記録されています。 したがって、匿名集合を大きく保つため、 所有者はできるだけ少ない情報を開示することが強く推奨されます。 さらに、一見無害な情報でも非常に一意性が高く、 再識別や追跡につながる可能性があることが何度も示されています。 マサチューセッツ州の元知事に関する特に有名な事例の詳しい説明については [NISTIR8053] を参照し、 このような公開事例94件のさらなる分析と分類については [Powar2023] を 参照してください。

6.2.6 外部 VC システム に基づくリンク

リンク不可能性、すなわち匿名性を維持するには、 VC を保持し通信するシステムにおいて注意が必要であることを指摘しておくべきです。 IP アドレス(レイヤー3)や Ethernet/MAC アドレス(レイヤー2)などの ネットワークアーティファクトは、よく知られたリンクの原因です。たとえば、 携帯電話の MAC アドレスは、ユーザーが特定のアクセスポイントを再訪した場合に そのユーザーを追跡するために利用できます。このことから、 携帯電話メーカーは MAC アドレスのランダム化機能を提供するようになりました。 公開 IP アドレスは一般に、個人を国内の都市または地域まで 地理的位置特定するのに十分な情報を提供し、匿名集合を 大幅に縮小する可能性があります。

A. テストベクトル

この節は非規範的です。

A.1 ベースライン基本例

文書のテスト ベクトルは完全に架空の永住者カードに基づいており、2つのグループ、すなわち 発行者によって生成されるもの(「基本証明」)と、所有者によって 生成されるもの(「派生証明」)に分けられています。

A.1.1 基本証明

文書に選択的開示の基本証明を追加するには、発行者は 次の暗号鍵素材を必要とします:

  1. 発行者の秘密鍵/公開鍵ペア、すなわち証明の一部となる 検証方法に対応する鍵ペア。
  2. HMAC 鍵。これは空白ノード ID の順序をランダム化し、 空白ノード ID の順序を介した潜在的な情報漏洩を回避するために使用されます。これは 一度だけ使用され、発行者と所有者の間で共有されます。この場合の HMAC は 疑似ランダム関数(PRF)として機能します。

基本証明の追加をテストするためのテストベクトル生成に使用される鍵素材を 以下に示します。BBS 鍵 ペアおよび HMAC 鍵には16進表現が使用されます。

7: 署名用の秘密鍵と公開鍵
{
  "publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

このシナリオでは、永住者資格情報が発行されます。署名されていない 永住者文書を以下に示します。

8: 証明のない資格情報
{
    "@context": [
      "https://www.w3.org/ns/credentials/v2",
      "https://w3id.org/citizenship/v4rc1"
    ],
    "type": [
      "VerifiableCredential",
      "PermanentResidentCardCredential"
    ],
    "issuer": {
      "id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
      "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
       },
    "name": "Permanent Resident Card",
    "description": "Government of Utopia Permanent Resident Card.",
    "credentialSubject": {
      "type": [
        "PermanentResident",
        "Person"
      ],
      "givenName": "JANE",
      "familyName": "SMITH",
      "gender": "Female",
      "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4v43hPwAHIgK1v4tX6wAAAABJRU5ErkJggg==",
      "residentSince": "2015-01-01",
      "commuterClassification": "C1",
      "birthCountry": "Arcadia",
      "birthDate": "1978-07-17",
      "permanentResidentCard": {
        "type": [
          "PermanentResidentCard"
        ],
        "identifier": "83627465",
        "lprCategory": "C09",
        "lprNumber": "999-999-999"
      }
    },
    "validFrom": "2024-12-16T00:00:00Z",
    "validUntil": "2025-12-16T23:59:59Z"
}

この必須情報は、以下に示すように JSON ポインタの配列を介して 指定されます。

9: 必須ポインタ
["/issuer"]

上記の JSON ポインタを文書に適用した結果を 以下に示します。

10: JSON ポインタと値
[
  {
    "pointer": "/issuer",
    "value": {
      "id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
      "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
    }
  }
]

署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。

11: 正規文書
[
  "<did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg==> .\n",
  "_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCard> .\n",
  "_:c14n0 <https://schema.org/identifier> \"83627465\" .\n",
  "_:c14n0 <https://w3id.org/citizenship#lprCategory> \"C09\" .\n",
  "_:c14n0 <https://w3id.org/citizenship#lprNumber> \"999-999-999\" .\n",
  "_:c14n1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .\n",
  "_:c14n1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResident> .\n",
  "_:c14n1 <https://schema.org/birthDate> \"1978-07-17\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n1 <https://schema.org/familyName> \"SMITH\" .\n",
  "_:c14n1 <https://schema.org/gender> \"Female\" .\n",
  "_:c14n1 <https://schema.org/givenName> \"JANE\" .\n",
  "_:c14n1 <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4v43hPwAHIgK1v4tX6wAAAABJRU5ErkJggg==> .\n",
  "_:c14n1 <https://w3id.org/citizenship#birthCountry> \"Arcadia\" .\n",
  "_:c14n1 <https://w3id.org/citizenship#commuterClassification> \"C1\" .\n",
  "_:c14n1 <https://w3id.org/citizenship#permanentResidentCard> _:c14n0 .\n",
  "_:c14n1 <https://w3id.org/citizenship#residentSince> \"2015-01-01\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCardCredential> .\n",
  "_:c14n2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:c14n2 <https://schema.org/description> \"Permanent Resident Card from Government of Utopia.\" .\n",
  "_:c14n2 <https://schema.org/name> \"Permanent Resident Card\" .\n",
  "_:c14n2 <https://www.w3.org/2018/credentials#credentialSubject> _:c14n1 .\n",
  "_:c14n2 <https://www.w3.org/2018/credentials#issuer> <did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> .\n",
  "_:c14n2 <https://www.w3.org/2018/credentials#validFrom> \"2024-12-16T00:00:00Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n2 <https://www.w3.org/2018/credentials#validUntil> \"2025-12-16T23:59:59Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
]

空白ノード ID の順序を介した潜在的な情報漏洩を防ぐため、 これらの ID は PRF(すなわち HMAC)で処理され、以下に示す正規化済み HMAC 文書が得られます。これは、「必須」および「選択的」 (または「非必須」)開示の対象となるステートメントの順序付きリストを表します。すなわち、 これらのステートメントを開示要件に基づいてグループ化した場合でも、 このリスト内の順序が維持されます。

12: 正規 HMAC 文書
[
  "<did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg==> .\n",
  "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .\n",
  "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResident> .\n",
  "_:b0 <https://schema.org/birthDate> \"1978-07-17\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b0 <https://schema.org/familyName> \"SMITH\" .\n",
  "_:b0 <https://schema.org/gender> \"Female\" .\n",
  "_:b0 <https://schema.org/givenName> \"JANE\" .\n",
  "_:b0 <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4v43hPwAHIgK1v4tX6wAAAABJRU5ErkJggg==> .\n",
  "_:b0 <https://w3id.org/citizenship#birthCountry> \"Arcadia\" .\n",
  "_:b0 <https://w3id.org/citizenship#commuterClassification> \"C1\" .\n",
  "_:b0 <https://w3id.org/citizenship#permanentResidentCard> _:b1 .\n",
  "_:b0 <https://w3id.org/citizenship#residentSince> \"2015-01-01\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCard> .\n",
  "_:b1 <https://schema.org/identifier> \"83627465\" .\n",
  "_:b1 <https://w3id.org/citizenship#lprCategory> \"C09\" .\n",
  "_:b1 <https://w3id.org/citizenship#lprNumber> \"999-999-999\" .\n",
  "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCardCredential> .\n",
  "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:b2 <https://schema.org/description> \"Permanent Resident Card from Government of Utopia.\" .\n",
  "_:b2 <https://schema.org/name> \"Permanent Resident Card\" .\n",
  "_:b2 <https://www.w3.org/2018/credentials#credentialSubject> _:b0 .\n",
  "_:b2 <https://www.w3.org/2018/credentials#issuer> <did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> .\n",
  "_:b2 <https://www.w3.org/2018/credentials#validFrom> \"2024-12-16T00:00:00Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b2 <https://www.w3.org/2018/credentials#validUntil> \"2025-12-16T23:59:59Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
]

上記の正規文書のリストは、必須ステートメントと 非必須ステートメントにグループ化されます。選択的開示 変換処理の最終出力を以下に示します。ステートメントは 必須または非必須の開示としてグループ化され、各ステートメントの 前のリスト内のインデックスが保持されていることに注意してください。

13: 基本変換の追加
{
  "mandatoryPointers": [
    "/issuer"
  ],
  "mandatory": {
    "dataType": "Map",
    "value": [
      [
        0,
        "<did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg==> .\n"
      ],
      [
        16,
        "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCardCredential> .\n"
      ],
      [
        17,
        "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n"
      ],
      [
        21,
        "_:b2 <https://www.w3.org/2018/credentials#issuer> <did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg> .\n"
      ]
    ]
  },
  "nonMandatory": {
    "dataType": "Map",
    "value": [
      [
        1,
        "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .\n"
      ],
      [
        2,
        "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResident> .\n"
      ],
      [
        3,
        "_:b0 <https://schema.org/birthDate> \"1978-07-17\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        4,
        "_:b0 <https://schema.org/familyName> \"SMITH\" .\n"
      ],
      [
        5,
        "_:b0 <https://schema.org/gender> \"Female\" .\n"
      ],
      [
        6,
        "_:b0 <https://schema.org/givenName> \"JANE\" .\n"
      ],
      [
        7,
        "_:b0 <https://schema.org/image> <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4v43hPwAHIgK1v4tX6wAAAABJRU5ErkJggg==> .\n"
      ],
      [
        8,
        "_:b0 <https://w3id.org/citizenship#birthCountry> \"Arcadia\" .\n"
      ],
      [
        9,
        "_:b0 <https://w3id.org/citizenship#commuterClassification> \"C1\" .\n"
      ],
      [
        10,
        "_:b0 <https://w3id.org/citizenship#permanentResidentCard> _:b1 .\n"
      ],
      [
        11,
        "_:b0 <https://w3id.org/citizenship#residentSince> \"2015-01-01\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        12,
        "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/citizenship#PermanentResidentCard> .\n"
      ],
      [
        13,
        "_:b1 <https://schema.org/identifier> \"83627465\" .\n"
      ],
      [
        14,
        "_:b1 <https://w3id.org/citizenship#lprCategory> \"C09\" .\n"
      ],
      [
        15,
        "_:b1 <https://w3id.org/citizenship#lprNumber> \"999-999-999\" .\n"
      ],
      [
        18,
        "_:b2 <https://schema.org/description> \"Permanent Resident Card from Government of Utopia.\" .\n"
      ],
      [
        19,
        "_:b2 <https://schema.org/name> \"Permanent Resident Card\" .\n"
      ],
      [
        20,
        "_:b2 <https://www.w3.org/2018/credentials#credentialSubject> _:b0 .\n"
      ],
      [
        22,
        "_:b2 <https://www.w3.org/2018/credentials#validFrom> \"2024-12-16T00:00:00Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        23,
        "_:b2 <https://www.w3.org/2018/credentials#validUntil> \"2025-12-16T23:59:59Z\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ]
    ]
  },
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

次のステップでは、基本証明構成を作成して正規化します。 これは次の2つの例に示されています。

14: 基本証明構成
{
  "type": "DataIntegrityProof",
  "cryptosuite": "bbs-2023",
  "created": "2023-08-15T23:36:38Z",
  "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
  "proofPurpose": "assertionMethod",
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/citizenship/v4rc1"
  ]
}
15: 正規基本証明構成
_:c14n0 <http://purl.org/dc/terms/created> "2023-08-15T23:36:38Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/security#DataIntegrityProof> .
_:c14n0 <https://w3id.org/security#cryptosuite> "bbs-2023"^^<https://w3id.org/security#cryptosuiteString> .
_:c14n0 <https://w3id.org/security#proofPurpose> <https://w3id.org/security#assertionMethod> .
_:c14n0 <https://w3id.org/security#verificationMethod> <did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ> .

ハッシュ化ステップでは、正規化された証明 オプションの SHA-256 ハッシュを計算して proofHash を生成し、 すべての必須 N-Quads の JOIN の SHA-256 ハッシュを計算して mandatoryHash を生成します。これらを 以下に16進形式で示します。

16: 基本ハッシュの追加
{
  "proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
  "mandatoryHash": "8e7cc22c318dd2094e02d0bf06c5d73a5dba717611a40f6d1bedc5ea7c300fd6"
}

以下に、計算された bbsSignature の16進表現と mandatoryPointers を示します。これらは hmacKey とともに 最終的な直列化ステップに入力されます。

17: 基本署名の追加
{
  "bbsSignature": "86168dd2b5d0c7c6a56a30f4212ed116a53def05d0d6708207d483c7ff2053aefa22d24ba7659d60852694f8d85be0fa2adc3974c7dc4cc68b3db17b2423975047104162c24502b41591879ac24f1bb1",
  "mandatoryPointers": [
    "/issuer"
  ]
}

最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。

18: 署名済み基本文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/citizenship/v4rc1"
  ],
  "type": [
    "VerifiableCredential",
    "PermanentResidentCardCredential"
  ],
  "issuer": {
    "id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
    "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
  },
  "name": "Permanent Resident Card",
  "description": "Permanent Resident Card from Government of Utopia.",
  "credentialSubject": {
    "type": [
      "PermanentResident",
      "Person"
    ],
    "givenName": "JANE",
    "familyName": "SMITH",
    "gender": "Female",
    "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4v43hPwAHIgK1v4tX6wAAAABJRU5ErkJggg==",
    "residentSince": "2015-01-01",
    "commuterClassification": "C1",
    "birthCountry": "Arcadia",
    "birthDate": "1978-07-17",
    "permanentResidentCard": {
      "type": [
        "PermanentResidentCard"
      ],
      "identifier": "83627465",
      "lprCategory": "C09",
      "lprNumber": "999-999-999"
    }
  },
  "validFrom": "2024-12-16T00:00:00Z",
  "validUntil": "2025-12-16T23:59:59Z",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0ChVhQhhaN0rXQx8alajD0IS7RFqU97wXQ1nCCB9SDx_8gU676ItJLp2WdYIUmlPjYW-D6Ktw5dMfcTMaLPbF7JCOXUEcQQWLCRQK0FZGHmsJPG7FYQDpbvyXTTZCxjDXNI1e-am9CMB6U_J5S936Tt3PFYUvfjnzCLDGN0glOAtC_BsXXOl26cXYRpA9tG-3F6nwwD9ZYYKTvGvo9pXVJbxIrm3i4wkdhUxqKCTIGrnxFuAdZwWi6T3omD5wzZ7bAGbRneEEQSxBmXtvnC6Pr59nPv_v3HrAW9wq_uxYzF_NyaX3GPv0h_FV2T2OSao8C6uoyWiqIj1ggABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v-BZy9pc3N1ZXI"
  }
}

A.1.2 派生証明

BBS 証明の作成には乱数が使用され、任意の presentationHeader を追加入力として使用できます。 決定論的なテストベクトル一式を提供するため、[CFRG-BBS-SIGNATURE] の Mocked Random Scalars 手順を使用しました。派生証明テストベクトルの生成に使用した seed および presentationHeader の値を 以下に16進形式で示します。

19: seed と presentation header の値
{
  "presentationHeaderHex": "113377aa",
  "pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}

派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の第A.1.1 基本証明節の最後の例です。最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignaturehmacKey、および mandatoryPointers を復元します。

20: 復元された基本署名データ
{
  "bbsSignature": "86168dd2b5d0c7c6a56a30f4212ed116a53def05d0d6708207d483c7ff2053aefa22d24ba7659d60852694f8d85be0fa2adc3974c7dc4cc68b3db17b2423975047104162c24502b41591879ac24f1bb1",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer"
  ]
}

次に、所有者は選択的開示用の JSON ポインタを指定することで、 どの非必須ステートメントを検証者へ開示したいかを示す必要があります。 これを以下に示します。

21: 選択的開示ポインタ
["/validFrom", "/validUntil", "/credentialSubject/birthCountry"]

revealDocument(すなわち、最終的に署名され、 検証者へ送信される署名前の文書)を生成するため、 選択的ポインタを必須ポインタに追加し、これらの結合ポインタを 証明を除いた文書とともに [DI-ECDSA] の selectJsonLd アルゴリズムへ入力します。 その結果を以下に示します。

22: 署名前の開示文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/citizenship/v4rc1"
  ],
  "type": [
    "VerifiableCredential",
    "PermanentResidentCardCredential"
  ],
  "issuer": {
    "id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
    "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
  },
  "validFrom": "2024-12-16T00:00:00Z",
  "validUntil": "2025-12-16T23:59:59Z",
  "credentialSubject": {
    "type": [
      "PermanentResident",
      "Person"
    ],
    "birthCountry": "Arcadia"
  }
}

開示文書がどのようなものか分かったので、どの文が 必須であり、選択された非必須文のインデックスがどれであるかについて、 適切に更新された情報を検証者に提供する必要があります。 § 4.4.3 CreateDisclosureData を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。

23: 派生グループインデックス
{"combinedIndexes":[0,1,2,8,16,17,20,21,22,23],"mandatoryIndexes":[0,16,17,21],"nonMandatoryIndexes":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19,20,22,23],"selectiveIndexes":[1,2,8,16,17,20,22,23]}

検証者は、必須ステートメントを集約してハッシュできる必要があります。 これを可能にするため、必須ステートメントのインデックスを、 開示文書内の位置に合わせて調整したリスト (すなわち combinedIndexes に対する相対位置)として提供します。一方、 selectiveIndexesnonMandatoryIndexes 内の位置に 相対的に調整されます。これらの「調整済み」インデックスを 以下に示します。

24: 調整済みの必須および選択的 インデックス
{"adjMandatoryIndexes":[0,4,5,7],"adjSelectiveIndexes":[0,1,7,17,18,19]}

開示データの最後の重要な要素は labelMap であり、これは 正規化された空白ノード ID から HMAC ベースでシャッフルされた ID へのマッピングで、 § 4.4.3 CreateDisclosureData に従って計算されます。これは 以下に、開示文書を除く 残りの開示データとともに示されています。

25: 開示データ
{"bbsProof":"96ac5ff7b89bf2d8b0f3cc51c547f1a22b01e24e246579d212362cdf6bf0fabe18be0c9d1f84c904bb4c6c613fd0ecabb7ad92e615341da97a45a918721626cc859c455b473a36e39572561d5fc483c637424717a43dcffb3b130d8fe11f88a8802f3b231efe2444f8b47feded0b621e3d5cd22cb3ec23ebc4f6dca745b5c1ce2f42a710b92510a71225a7d39e00e0c26da2fae242cdf154e93de42017270b99023fe95b42c42a461a2eab19e04aa44839af39aa71f830162cb424a5aa0acc046dc7e7b8bdfc73cf3641c76aeeb7fbb56cd936776050dbd632bf7fc80d33c621dc6b837184ade619630f72bd25d8aea626ba994d15a65def1b0dc8af09c54a0cf5e5b54d1b1b28047aa2dbf63805fec9533bab46d12349ca47dfd83ff30454cedacd23da4eb9a3ebe198c80ac1992e2a203ffcf46afaa3482a63b7b00033df1a2da361d600a1cfd5139be010ca302e082af7ee34a5ff3d24cc7062f57fa36d47846edd5219e59bd438576bff709bfd7920d6bad8367b0fe8c749318ef8726beda9c1d9095bed738e4fd1c38333a27f4f2071a21a863671b43fe521f737444be865e887cbf33caa39226fb8013003721e37c6d949867befba1c8b7bf641bd647851ad92aed3da91af52f17d058a9f74eb30744304c05813840be6a528f54cd5a24b73ae2f42dec1bfc2e1354fb061a96c0df3ab96ddc9ada96cb882571cccb89774fcf0326e1c8b2b87cc4cf4eafbd75632518919cbe58a9f86ade12b0f6989c0886e358d801b99b1dd32c7e6e56a653c0e264a84b51d2d23679c75e282451af3bcaa6f19ec7bc3aa603fec87db5a57d42961e2907d899a8fd5d1ce17dde8a75cd1192494cd93b112da7774c2bb2f679f5b4b404dabe485d78a017b2be81e5ff8bacf90d5f24b2e83ab4169f8f55ca6f703141f91565abbec7445e6cf4663f5e34b9188283d57cedf36c586b18a130b83652436bf6862673ddeebd9aefdc2fbfc97dde80e36483491c4357ccd2fc131fb","labelMap":{"dataType":"Map","value":[["c14n0","b0"],["c14n1","b2"]]},"mandatoryIndexes":[0,4,5,7],"adjSelectiveIndexes":[0,1,7,17,18,19],"presentationHeader":{"0":17,"1":51,"2":119,"3":119,"3":170}}

最後に、上記の開示データを 3.2.3 serializeDerivedProofValue 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。

26: 署名済み派生文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://w3id.org/citizenship/v4rc1"
  ],
  "type": [
    "VerifiableCredential",
    "PermanentResidentCardCredential"
  ],
  "issuer": {
    "id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
    "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
  },
  "validFrom": "2024-12-16T00:00:00Z",
  "validUntil": "2025-12-16T23:59:59Z",
  "credentialSubject": {
    "type": [
      "PermanentResident",
      "Person"
    ],
    "birthCountry": "Arcadia"
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0DhVkC0JasX_e4m_LYsPPMUcVH8aIrAeJOJGV50hI2LN9r8Pq-GL4MnR-EyQS7TGxhP9Dsq7etkuYVNB2pekWpGHIWJsyFnEVbRzo245VyVh1fxIPGN0JHF6Q9z_s7Ew2P4R-IqIAvOyMe_iRE-LR_7e0LYh49XNIss-wj68T23KdFtcHOL0KnELklEKcSJafTngDgwm2i-uJCzfFU6T3kIBcnC5kCP-lbQsQqRhouqxngSqRIOa85qnH4MBYstCSlqgrMBG3H57i9_HPPNkHHau63-7Vs2TZ3YFDb1jK_f8gNM8Yh3GuDcYSt5hljD3K9Jdiupia6mU0Vpl3vGw3IrwnFSgz15bVNGxsoBHqi2_Y4Bf7JUzurRtEjScpH39g_8wRUztrNI9pOuaPr4ZjICsGZLiogP_z0avqjSCpjt7AAM98aLaNh1gChz9UTm-AQyjAuCCr37jSl_z0kzHBi9X-jbUeEbt1SGeWb1DhXa_9wm_15INa62DZ7D-jHSTGO-HJr7anB2Qlb7XOOT9HDgzOif08gcaIahjZxtD_lIfc3REvoZeiHy_M8qjkib7gBMANyHjfG2UmGe--6HIt79kG9ZHhRrZKu09qRr1LxfQWKn3TrMHRDBMBYE4QL5qUo9UzVoktzri9C3sG_wuE1T7BhqWwN86uW3cmtqWy4glcczLiXdPzwMm4ciyuHzEz06vvXVjJRiRnL5Yqfhq3hKw9picCIbjWNgBuZsd0yx-blamU8DiZKhLUdLSNnnHXigkUa87yqbxnse8OqYD_sh9taV9QpYeKQfYmaj9XRzhfd6Kdc0RkklM2TsRLad3TCuy9nn1tLQE2r5IXXigF7K-geX_i6z5DV8ksug6tBafj1XKb3AxQfkVZau-x0RebPRmP140uRiCg9V87fNsWGsYoTC4NlJDa_aGJnPd7r2a79wvv8l93oDjZINJHENXzNL8Ex-6IAAAEChAAEBQeGAAEHERITRBEzd6o"
  }
}

A.2 ベースライン拡張例

必須開示、 選択的開示、およびそれらの重複を含む選択的開示機能を実証するには、 以前のテストベクトルよりも多くの内容を持つ入力資格情報文書が必要です。 テストベクトルが過度に長くなることを避けるため、開始文書のテスト ベクトルは完全に架空のウィンドサーフィン(セーリング)競技 シナリオに基づいています。また、テストベクトルを2つのグループ、すなわち 発行者によって生成されるもの(基本証明)と、所有者によって 生成されるもの(派生証明)に分けています。

A.2.1 基本証明

文書に選択的開示の基本証明を追加するには、発行者は 次の暗号鍵素材を必要とします:

  1. 発行者の秘密鍵/公開鍵ペア、すなわち証明の一部となる 検証方法に対応する鍵ペア。
  2. HMAC 鍵。これは空白ノード ID の順序をランダム化し、 空白ノード ID の順序を介した潜在的な情報漏洩を回避するために使用されます。これは 一度だけ使用され、発行者と所有者の間で共有されます。この場合の HMAC は 疑似ランダム関数(PRF)として機能します。

基本証明の追加をテストするためのテストベクトル生成に使用される鍵素材を 以下に示します。BBS 鍵 ペアおよび HMAC 鍵には16進表現が使用されます。

27: 署名用の秘密鍵と公開鍵
{
  "publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

このシナリオでは、あるセーラーが、マウイ島で数日にわたって開催される一連の ウィンドサーフィンレースに参加するため、レース主催者に登録しています。主催者は セーラーの用具を検査し、申告内容が 正確であることを認証します。セーラーの署名されていない用具一覧を以下に示します。

28: 証明のない資格情報
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "issuer": "https://vc.example/windsurf/racecommittee",
  "credentialSubject": {
    "sailNumber": "Earth101",
    "sails": [
      {
        "size": 5.5,
        "sailName": "Kihei",
        "year": 2023
      },
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2023
      },
      {
        "size": 7.0,
        "sailName": "Lahaina",
        "year": 2020
      },
      {
        "size": 7.8,
        "sailName": "Lahaina",
        "year": 2023
      }
    ],
    "boards": [
      {
        "boardName": "CompFoil170",
        "brand": "Wailea",
        "year": 2022
      },
      {
        "boardName": "Kanaha Custom",
        "brand": "Wailea",
        "year": 2019
      }
    ]
  }
}

他のセーラーに競技相手がどのような用具でセーリングする可能性があるかを知らせることに加え、 各セーラーは、自身の最新の ウィンドサーフィンボードの年式と、2枚のセイルの完全な詳細を開示することが必須です。 すべてのセーラーは、すべての用具に印刷されたセイル番号によって 識別されることに注意してください。この必須情報は、以下に示すように JSON ポインタの配列を介して 指定されます。

29: 必須ポインタ
["/issuer", "/credentialSubject/sailNumber", "/credentialSubject/sails/1", "/credentialSubject/boards/0/year", "/credentialSubject/sails/2"]

上記の JSON ポインタをセーラーの用具文書に適用した結果を 以下に示します。

30: JSON ポインタと値
[
  {
    "pointer": "/sailNumber",
    "value": "Earth101"
  },
  {
    "pointer": "/sails/1",
    "value": {
      "size": 6.1,
      "sailName": "Lahaina",
      "year": 2023
    }
  },
  {
    "pointer": "/boards/0/year",
    "value": 2022
  },
  {
    "pointer": "/sails/2",
    "value": {
      "size": 7,
      "sailName": "Lahaina",
      "year": 2020
    }
  }
]

署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。

31: 正規文書
[
  "_:c14n0 <https://windsurf.grotto-networking.com/selective#boardName> \"CompFoil170\" .\n",
  "_:c14n0 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n",
  "_:c14n0 <https://windsurf.grotto-networking.com/selective#year> \"2022\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n1 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:c14n1 <https://windsurf.grotto-networking.com/selective#size> \"7.8E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:c14n1 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n2 <https://windsurf.grotto-networking.com/selective#boardName> \"Kanaha Custom\" .\n",
  "_:c14n2 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n",
  "_:c14n2 <https://windsurf.grotto-networking.com/selective#year> \"2019\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n3 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:c14n3 <https://windsurf.grotto-networking.com/selective#size> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n3 <https://windsurf.grotto-networking.com/selective#year> \"2020\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n4 <https://windsurf.grotto-networking.com/selective#sailName> \"Kihei\" .\n",
  "_:c14n4 <https://windsurf.grotto-networking.com/selective#size> \"5.5E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:c14n4 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#boards> _:c14n0 .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#boards> _:c14n2 .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#sailNumber> \"Earth101\" .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n1 .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n3 .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n4 .\n",
  "_:c14n5 <https://windsurf.grotto-networking.com/selective#sails> _:c14n6 .\n",
  "_:c14n6 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:c14n6 <https://windsurf.grotto-networking.com/selective#size> \"6.1E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:c14n6 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:c14n7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:c14n7 <https://www.w3.org/2018/credentials#credentialSubject> _:c14n5 .\n",
  "_:c14n7 <https://www.w3.org/2018/credentials#issuer> <https://vc.example/windsurf/racecommittee> .\n"
]

空白ノード ID の順序による潜在的な情報漏洩を防ぐため、 これらは PRF(すなわち HMAC)を通して処理され、以下に示す正規化済み HMAC 文書が得られます。これは必須および選択的開示の対象となる ステートメントの順序付きリストを表します。すなわち、ステートメントはこのリストから グループ化されます。

32: 正規 HMAC 文書
[
  "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:b0 <https://www.w3.org/2018/credentials#credentialSubject> _:b3 .\n",
  "_:b0 <https://www.w3.org/2018/credentials#issuer> <https://vc.example/windsurf/racecommittee> .\n",
  "_:b1 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:b1 <https://windsurf.grotto-networking.com/selective#size> \"7.8E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:b1 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b2 <https://windsurf.grotto-networking.com/selective#boardName> \"CompFoil170\" .\n",
  "_:b2 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n",
  "_:b2 <https://windsurf.grotto-networking.com/selective#year> \"2022\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#boards> _:b2 .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#boards> _:b4 .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#sailNumber> \"Earth101\" .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b1 .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b5 .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b6 .\n",
  "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b7 .\n",
  "_:b4 <https://windsurf.grotto-networking.com/selective#boardName> \"Kanaha Custom\" .\n",
  "_:b4 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n",
  "_:b4 <https://windsurf.grotto-networking.com/selective#year> \"2019\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b5 <https://windsurf.grotto-networking.com/selective#sailName> \"Kihei\" .\n",
  "_:b5 <https://windsurf.grotto-networking.com/selective#size> \"5.5E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:b5 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b6 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:b6 <https://windsurf.grotto-networking.com/selective#size> \"6.1E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n",
  "_:b6 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b7 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n",
  "_:b7 <https://windsurf.grotto-networking.com/selective#size> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n",
  "_:b7 <https://windsurf.grotto-networking.com/selective#year> \"2020\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
]

上記の正規文書は、必須ステートメントと非必須 ステートメントにグループ化されます。選択的開示変換処理の最終出力を 以下に示します。各ステートメントは必須または非必須としてグループ化され、 前のステートメントリスト内のインデックスが保持されます。

33: 基本変換の追加
{
  "mandatoryPointers": [
    "/issuer",
    "/credentialSubject/sailNumber",
    "/credentialSubject/sails/1",
    "/credentialSubject/boards/0/year",
    "/credentialSubject/sails/2"
  ],
  "mandatory": {
    "dataType": "Map",
    "value": [
      [
        0,
        "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n"
      ],
      [
        1,
        "_:b0 <https://www.w3.org/2018/credentials#credentialSubject> _:b3 .\n"
      ],
      [
        2,
        "_:b0 <https://www.w3.org/2018/credentials#issuer> <https://vc.example/windsurf/racecommittee> .\n"
      ],
      [
        8,
        "_:b2 <https://windsurf.grotto-networking.com/selective#year> \"2022\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ],
      [
        9,
        "_:b3 <https://windsurf.grotto-networking.com/selective#boards> _:b2 .\n"
      ],
      [
        11,
        "_:b3 <https://windsurf.grotto-networking.com/selective#sailNumber> \"Earth101\" .\n"
      ],
      [
        14,
        "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b6 .\n"
      ],
      [
        15,
        "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b7 .\n"
      ],
      [
        22,
        "_:b6 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n"
      ],
      [
        23,
        "_:b6 <https://windsurf.grotto-networking.com/selective#size> \"6.1E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n"
      ],
      [
        24,
        "_:b6 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ],
      [
        25,
        "_:b7 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n"
      ],
      [
        26,
        "_:b7 <https://windsurf.grotto-networking.com/selective#size> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ],
      [
        27,
        "_:b7 <https://windsurf.grotto-networking.com/selective#year> \"2020\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ]
    ]
  },
  "nonMandatory": {
    "dataType": "Map",
    "value": [
      [
        3,
        "_:b1 <https://windsurf.grotto-networking.com/selective#sailName> \"Lahaina\" .\n"
      ],
      [
        4,
        "_:b1 <https://windsurf.grotto-networking.com/selective#size> \"7.8E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n"
      ],
      [
        5,
        "_:b1 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ],
      [
        6,
        "_:b2 <https://windsurf.grotto-networking.com/selective#boardName> \"CompFoil170\" .\n"
      ],
      [
        7,
        "_:b2 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n"
      ],
      [
        10,
        "_:b3 <https://windsurf.grotto-networking.com/selective#boards> _:b4 .\n"
      ],
      [
        12,
        "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b1 .\n"
      ],
      [
        13,
        "_:b3 <https://windsurf.grotto-networking.com/selective#sails> _:b5 .\n"
      ],
      [
        16,
        "_:b4 <https://windsurf.grotto-networking.com/selective#boardName> \"Kanaha Custom\" .\n"
      ],
      [
        17,
        "_:b4 <https://windsurf.grotto-networking.com/selective#brand> \"Wailea\" .\n"
      ],
      [
        18,
        "_:b4 <https://windsurf.grotto-networking.com/selective#year> \"2019\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ],
      [
        19,
        "_:b5 <https://windsurf.grotto-networking.com/selective#sailName> \"Kihei\" .\n"
      ],
      [
        20,
        "_:b5 <https://windsurf.grotto-networking.com/selective#size> \"5.5E0\"^^<http://www.w3.org/2001/XMLSchema#double> .\n"
      ],
      [
        21,
        "_:b5 <https://windsurf.grotto-networking.com/selective#year> \"2023\"^^<http://www.w3.org/2001/XMLSchema#integer> .\n"
      ]
    ]
  },
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

次のステップでは、基本証明構成を作成して正規化します。 これは次の2つの例に示されています。

34: 基本証明構成
{
  "type": "DataIntegrityProof",
  "cryptosuite": "bbs-2023",
  "created": "2023-08-15T23:36:38Z",
  "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
  "proofPurpose": "assertionMethod",
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ]
}
35: 正規基本証明構成
_:c14n0 <http://purl.org/dc/terms/created> "2023-08-15T23:36:38Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/security#DataIntegrityProof> .
_:c14n0 <https://w3id.org/security#cryptosuite> "bbs-2023"^^<https://w3id.org/security#cryptosuiteString> .
_:c14n0 <https://w3id.org/security#proofPurpose> <https://w3id.org/security#assertionMethod> .
_:c14n0 <https://w3id.org/security#verificationMethod> <did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ> .

ハッシュ化ステップでは、正規化された証明 オプションの SHA-256 ハッシュを計算して proofHash を生成し、 すべての必須 N-Quads を結合したものの SHA-256 ハッシュを計算して mandatoryHash を生成します。これらを以下に16進形式で 示します。

36: 基本ハッシュの追加
{
  "proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
  "mandatoryHash": "555de05f898817e31301bac187d0c3ff2b03e2cbdb4adb4d568c17de961f9a18"
}

以下に、計算された bbsSignature の16進表現と mandatoryPointers を示します。これらは hmacKey とともに 最終的な直列化ステップに入力されます。

37: 基本署名の追加
{
  "bbsSignature": "8331f55ad458fe5c322420b2cb806f9a20ea6b2b8a29d51710026d71ace5da080064b488818efc75a439525bd031450822a6a332da781926e19360b90166431124efcf3d060fbc750c6122c714c07f71",
  "mandatoryPointers": [
    "/issuer",
    "/credentialSubject/sailNumber",
    "/credentialSubject/sails/1",
    "/credentialSubject/boards/0/year",
    "/credentialSubject/sails/2"
  ]
}

最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。

38: 署名済み基本文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "issuer": "https://vc.example/windsurf/racecommittee",
  "credentialSubject": {
    "sailNumber": "Earth101",
    "sails": [
      {
        "size": 5.5,
        "sailName": "Kihei",
        "year": 2023
      },
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2023
      },
      {
        "size": 7,
        "sailName": "Lahaina",
        "year": 2020
      },
      {
        "size": 7.8,
        "sailName": "Lahaina",
        "year": 2023
      }
    ],
    "boards": [
      {
        "boardName": "CompFoil170",
        "brand": "Wailea",
        "year": 2022
      },
      {
        "boardName": "Kanaha Custom",
        "brand": "Wailea",
        "year": 2019
      }
    ]
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0ChVhQgzH1WtRY_lwyJCCyy4BvmiDqayuKKdUXEAJtcazl2ggAZLSIgY78daQ5UlvQMUUIIqajMtp4GSbhk2C5AWZDESTvzz0GD7x1DGEixxTAf3FYQDpbvyXTTZCxjDXNI1e-am9CMB6U_J5S936Tt3PFYUvfVV3gX4mIF-MTAbrBh9DD_ysD4svbSttNVowX3pYfmhhYYKTvGvo9pXVJbxIrm3i4wkdhUxqKCTIGrnxFuAdZwWi6T3omD5wzZ7bAGbRneEEQSxBmXtvnC6Pr59nPv_v3HrAW9wq_uxYzF_NyaX3GPv0h_FV2T2OSao8C6uoyWiqIj1ggABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v-FZy9pc3N1ZXJ4HS9jcmVkZW50aWFsU3ViamVjdC9zYWlsTnVtYmVyeBovY3JlZGVudGlhbFN1YmplY3Qvc2FpbHMvMXggL2NyZWRlbnRpYWxTdWJqZWN0L2JvYXJkcy8wL3llYXJ4Gi9jcmVkZW50aWFsU3ViamVjdC9zYWlscy8y"
  }
}

A.2.2 派生証明

BBS 証明の作成には乱数が使用され、任意の presentationHeader を 入力として使用できます。決定論的なテスト ベクトル一式を提供するため、 [CFRG-BBS-SIGNATURE] の Mocked Random Scalars 手順を使用しました。派生証明テストベクトルの 生成に使用した seed および presentationHeader の値を以下に16進形式で示します。

39: seed と presentation header の値
{
  "presentationHeaderHex": "113377aa",
  "pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}

派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の第A.1.1 基本証明節の最後の例です。最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignaturehmacKey、および mandatoryPointers を復元します。

40: 復元された基本署名データ
{
  "bbsSignature": "8331f55ad458fe5c322420b2cb806f9a20ea6b2b8a29d51710026d71ace5da080064b488818efc75a439525bd031450822a6a332da781926e19360b90166431124efcf3d060fbc750c6122c714c07f71",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/credentialSubject/sailNumber",
    "/credentialSubject/sails/1",
    "/credentialSubject/boards/0/year",
    "/credentialSubject/sails/2"
  ]
}

次に、所有者は選択的開示用の JSON ポインタを指定することで、 さらに何を検証者へ開示したいかを示す必要があります。この ウィンドサーフィン競技シナリオでは、セーラー(所有者)がレースの 初日を終えたところで、競技で使用したウィンドサーフィンボードの すべての詳細を一般の人々(検証者)に開示したいと考えています。 これを以下に示します。これは、最新のボードの年式のみを含んでいた 必須開示情報とわずかに重複していることに注意してください。

41: 選択的開示ポインタ
["/credentialSubject/boards/0", "/credentialSubject/boards/1"]

revealDocument(すなわち、最終的に署名され、 検証者へ送信される署名前の文書)を生成するため、 選択的ポインタを必須ポインタに追加し、これらの結合ポインタを 証明を除いた文書とともに [DI-ECDSA] の selectJsonLd アルゴリズムへ入力して、 以下に示す結果を取得します。

42: 署名前の開示文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "issuer": "https://vc.example/windsurf/racecommittee",
  "credentialSubject": {
    "sailNumber": "Earth101",
    "sails": [
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2023
      },
      {
        "size": 7,
        "sailName": "Lahaina",
        "year": 2020
      }
    ],
    "boards": [
      {
        "year": 2022,
        "boardName": "CompFoil170",
        "brand": "Wailea"
      },
      {
        "boardName": "Kanaha Custom",
        "brand": "Wailea",
        "year": 2019
      }
    ]
  }
}

開示された文書がどのようなものか分かったので、どの文が 必須であり、選択された非必須文のインデックスがどれであるかについて、 適切に更新された情報を検証者に提供する必要があります。 § 4.4.3 CreateDisclosureData を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。

43: 派生グループインデックス
{
    "combinedIndexes":[0,1,2,6,7,8,9,10,11,14,15,16,17,18,22,23,24,25,26,27],
    "mandatoryIndexes":[0,1,2,8,9,11,14,15,22,23,24,25,26,27],
    "nonMandatoryIndexes":[3,4,5,6,7,10,12,13,16,17,18,19,20,21],
    "selectiveIndexes":[0,1,6,7,8,9,10,16,17,18]
}

検証者は、必須ステートメントを集約してハッシュできる必要があります。 これを可能にするため、必須ステートメントのインデックスを 開示文書内の位置に合わせて調整したリスト (すなわち combinedIndexes に対する相対位置)として提供します。一方、 selectiveIndexesnonMandatoryIndexes 内の位置に相対的に調整する必要があります。 これらの「調整済み」インデックスを以下に示します。

44: 調整済みの必須および選択的 インデックス
{
    "adjMandatoryIndexes":[0,1,2,5,6,8,9,10,14,15,16,17,18,19],
    "adjSelectiveIndexes":[3,4,5,8,9,10]
}

開示データの最後の重要な要素は、正規化された空白ノード ID から HMAC ベースでシャッフルされた ID へのマッピングである labelMap であり、 § 4.4.3 CreateDisclosureData 節に従って計算されます。これは 以下に、 開示文書を除く残りの開示データとともに示されています。

45: 開示データ
{
    "bbsProof":"9831ba06852694fb44eb56cd9f66581330d9493671a3ad5ed28610c2550c5bfda6cada7cbaf37e9af0c873a4ec6813bf857d539543bc45ba1349fe3233b446f6c46190c40aa8456d98312ed7535c3003e3a77af752ed6f7ee162df4e38a268ad87cc5a10ff38dcc6633810e08ac5a80dacfe6e7dec3ca65fb1dab8d1b0da22b8f26040238c700b8310de92c9c2ec118b2de6b0ccdc72fbdd3329ccf7bc729829e8492d0a796f6e09131884f6fdd0df8028d5ef8f05d9aa9817872598c56421526dbe5db40586cd2b83a454652f71637e57917abd22f45bb67d48fcebdf5464671aec2e845f87f87c1d0eb934db3fb9e2310d483d67110b5f64127827888e8cd9259ea78f6683184ca4e71845b803d93a3554f4577716f939bd36f26eb740771bd5c35247ef4abc2b0e701721a6e8edf62a63af3a032df895cde06d0b15ca8c1a7507249118f9d096fcc5a3f9a39ec1a870ef619efa6af61fd93b74b82b24317def59f981fc8ec2b5633d8eb8711b108552b7b6e748648503fecdf52ac0a76eca89306361262cc4767bbb84e904d1a7523bc19d67bc501c78949616bef65470b067f81759d9a29f9c2775c0888a4617b57018ece111e62cd8365b4783fbe53bcec846bf724bdddc196fced05c59c35ebb735aea9a83f0e5233cdb9fbb8fd2e3b007ee7f69cafc37c4993ddfc747d7793b48ea48213154b459260c29da6dd41de9539a3352855afa398b2bafd47d07d765",
    "labelMap":{"dataType":"Map","value":[["c14n0","b2"],["c14n1","b4"],["c14n2","b3"],["c14n3","b7"],["c14n4","b6"],["c14n5","b0"]]},
    "mandatoryIndexes":[0,1,2,5,6,8,9,10,14,15,16,17,18,19],
    "adjSelectiveIndexes":[3,4,5,8,9,10],
    "presentationHeader":{"0":17,"1":51,"2":119,"3":170}
}

最後に、上記の開示データを 3.2.3 serializeDerivedProofValue 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。

46: 署名済み派生文書
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    {
      "@vocab": "https://windsurf.grotto-networking.com/selective#"
    }
  ],
  "type": [
    "VerifiableCredential"
  ],
  "issuer": "https://vc.example/windsurf/racecommittee",
  "credentialSubject": {
    "sailNumber": "Earth101",
    "sails": [
      {
        "size": 6.1,
        "sailName": "Lahaina",
        "year": 2023
      },
      {
        "size": 7,
        "sailName": "Lahaina",
        "year": 2020
      }
    ],
    "boards": [
      {
        "year": 2022,
        "boardName": "CompFoil170",
        "brand": "Wailea"
      },
      {
        "boardName": "Kanaha Custom",
        "brand": "Wailea",
        "year": 2019
      }
    ]
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0DhVkCEJgxugaFJpT7ROtWzZ9mWBMw2Uk2caOtXtKGEMJVDFv9psrafLrzfprwyHOk7GgTv4V9U5VDvEW6E0n-MjO0RvbEYZDECqhFbZgxLtdTXDAD46d691Ltb37hYt9OOKJorYfMWhD_ONzGYzgQ4IrFqA2s_m597DymX7HauNGw2iK48mBAI4xwC4MQ3pLJwuwRiy3msMzccvvdMynM97xymCnoSS0KeW9uCRMYhPb90N-AKNXvjwXZqpgXhyWYxWQhUm2-XbQFhs0rg6RUZS9xY35XkXq9IvRbtn1I_OvfVGRnGuwuhF-H-HwdDrk02z-54jENSD1nEQtfZBJ4J4iOjNklnqePZoMYTKTnGEW4A9k6NVT0V3cW-Tm9NvJut0B3G9XDUkfvSrwrDnAXIabo7fYqY686Ay34lc3gbQsVyowadQckkRj50Jb8xaP5o57BqHDvYZ76avYf2Tt0uCskMX3vWfmB_I7CtWM9jrhxGxCFUre250hkhQP-zfUqwKduyokwY2EmLMR2e7uE6QTRp1I7wZ1nvFAceJSWFr72VHCwZ_gXWdmin5wndcCIikYXtXAY7OER5izYNltHg_vlO87IRr9yS93cGW_O0FxZw167c1rqmoPw5SM825-7j9LjsAfuf2nK_DfEmT3fx0fXeTtI6kghMVS0WSYMKdpt1B3pU5ozUoVa-jmLK6_UfQfXZaYAAgEEAgMDBwQGBQCOAAECBQYICQoODxAREhOGAwQFCAkKRBEzd6o"
  }
}

A.3 匿名所有者バインディング 機能

A.3.1 所有者バインディング コミットメント生成

匿名所有者バインディング機能を使用する最初の手順は、 所有者が自身の holderSecret 値を生成し、その後、 [CFRG-Blind-BBS-Signature] のコミットメント計算手順に従って、 この値に対する証明付きコミットメントを計算することです。この手順の値と 出力の例を以下に示します。

47: 所有者の秘密
{
    "holderSecretHex": "8fc6cc3f65db4ba5e3ed63fe9d2bd57a9c7df9c7f6bf2b898b308d5493b07eb6"
}
48: 所有者の秘密コミットメント情報
{
  "secretProverBlind": "12901a77b3906af68d9e4214dce887d127b2a51d6311bbe7d087d45737acd2db",
  "commitmentWithProof": "ab77a14fddfafc7ae6ea82b0ef6048059225f96c9206903a34c6ec6beba702652e9d64fac1917e372853867d944e4a8059e0c26bc871cac14736e73685cd3006299539b93df64cdf661af2bc6300976528c5092c6dc842abaaa624f2184d3d5b75be0ede9c4822161149ef51a965ddda260e10b9246ecaea020ef952e3b3ed6e724bcb5d1a9c4004f0aea2cba030c27c"
}

holderSecret および secretProverBlind は、所有者が保持し、秘密にしておく必要があります。 commitmentWithProof 値は発行者に伝達する必要があります。

A.3.2 所有者バインディング基本証明

匿名所有者バインディングオプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、その後、 [CFRG-Blind-BBS-Signature] のコミットメント検証手順で その値を検証することから始まります。 基本証明の節で説明および使用した暗号鍵素材もここで使用され、 以下に再掲します。

49: 署名用の秘密鍵と公開鍵
{
  "publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

このシナリオでは、運転免許証の電子版を扱います。

50: 機能用の証明なし資格情報
{
    "@context": [
        "https://www.w3.org/2018/credentials/v1",
        "https://w3id.org/security/data-integrity/v2",
        "https://w3id.org/vdl/v1",
        "https://w3id.org/vdl/aamva/v1"
    ],
    "type": [
        "VerifiableCredential",
        "Iso18013DriversLicenseCredential"
    ],
    "issuer": {
        "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
        "name": "Utopia Department of Motor Vehicles",
        "url": "https://dmv.utopia.example/",
        "image": "https://dmv.utopia.example/logo.png"
    },
    "issuanceDate": "2023-11-15T10:00:00-07:00",
    "expirationDate": "2028-11-15T12:00:00-06:00",
    "name": "Utopia Driver's License",
    "image": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC",
    "description": "A license granting driving privileges in Utopia.",
    "credentialSubject": {
        "type": "LicensedDriver",
        "driversLicense": {
            "type": "Iso18013DriversLicense",
            "document_number": "542426814",
            "family_name": "TURNER",
            "given_name": "SUSAN",
            "portrait": "data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==",
            "birth_date": "1998-08-28",
            "issue_date": "2023-01-15T10:00:00-07:00",
            "expiry_date": "2028-08-27T12:00:00-06:00",
            "issuing_country": "UA",
            "issuing_authority": "UADMV",
            "driving_privileges": [
                {
                    "codes": [
                        {
                            "code": "D"
                        }
                    ],
                    "vehicle_category_code": "D",
                    "issue_date": "2019-01-01",
                    "expiry_date": "2027-01-01"
                },
                {
                    "codes": [
                        {
                            "code": "C"
                        }
                    ],
                    "vehicle_category_code": "C",
                    "issue_date": "2019-01-01",
                    "expiry_date": "2017-01-01"
                }
            ],
            "un_distinguishing_sign": "UTA",
            "aamva_aka_suffix": "1ST",
            "sex": 2,
            "aamva_family_name_truncation": "N",
            "aamva_given_name_truncation": "N"
        }
    }
}

所有者のプライバシーを保護するため、必須フィールドは "issuer" と "expirationDate" のみであり、以下に示す必須ポインタによって実現されます。

51: 機能用の必須ポインタ
["/issuer", "/expirationDate"]

署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。

52: 機能用の正規文書
[
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/image> <https://dmv.utopia.example/logo.png> .\n",
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/name> \"Utopia Department of Motor Vehicles\" .\n",
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/url> <https://dmv.utopia.example/> .\n",
  "_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicenseCredential> .\n",
  "_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:c14n0 <https://schema.org/description> \"A license granting driving privileges in Utopia.\" .\n",
  "_:c14n0 <https://schema.org/image> <data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC> .\n",
  "_:c14n0 <https://schema.org/name> \"Utopia Driver's License\" .\n",
  "_:c14n0 <https://www.w3.org/2018/credentials#credentialSubject> _:c14n1 .\n",
  "_:c14n0 <https://www.w3.org/2018/credentials#expirationDate> \"2028-11-15T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n0 <https://www.w3.org/2018/credentials#issuanceDate> \"2023-11-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n0 <https://www.w3.org/2018/credentials#issuer> <did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> .\n",
  "_:c14n1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#LicensedDriver> .\n",
  "_:c14n1 <https://w3id.org/vdl#license> _:c14n2 .\n",
  "_:c14n2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicense> .\n",
  "_:c14n2 <https://w3id.org/vdl#birthDate> \"1998-08-28\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n2 <https://w3id.org/vdl#documentNumber> \"542426814\" .\n",
  "_:c14n2 <https://w3id.org/vdl#drivingPrivileges> \"[{\\\"codes\\\":[{\\\"code\\\":\\\"D\\\"}],\\\"expiry_date\\\":\\\"2027-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"D\\\"},{\\\"codes\\\":[{\\\"code\\\":\\\"C\\\"}],\\\"expiry_date\\\":\\\"2017-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"C\\\"}]\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON> .\n",
  "_:c14n2 <https://w3id.org/vdl#expiryDate> \"2028-08-27T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n2 <https://w3id.org/vdl#familyName> \"TURNER\" .\n",
  "_:c14n2 <https://w3id.org/vdl#givenName> \"SUSAN\" .\n",
  "_:c14n2 <https://w3id.org/vdl#issueDate> \"2023-01-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:c14n2 <https://w3id.org/vdl#issuingAuthority> \"UADMV\" .\n",
  "_:c14n2 <https://w3id.org/vdl#issuingCountry> \"UA\" .\n",
  "_:c14n2 <https://w3id.org/vdl#portrait> <data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==> .\n",
  "_:c14n2 <https://w3id.org/vdl#sex> \"2\"^^<http://www.w3.org/2001/XMLSchema#unsignedInt> .\n",
  "_:c14n2 <https://w3id.org/vdl#unDistinguishingSign> \"UTA\" .\n",
  "_:c14n2 <https://w3id.org/vdl/aamva#akaSuffix> \"1ST\" .\n",
  "_:c14n2 <https://w3id.org/vdl/aamva#familyNameTruncation> \"N\" .\n",
  "_:c14n2 <https://w3id.org/vdl/aamva#givenNameTruncation> \"N\" .\n"
]

空白ノード ID の順序による潜在的な情報漏洩を防ぐため、 これらは PRF(すなわち HMAC)を通して処理され、以下に示す正規化済み HMAC 文書が得られます。これは必須および選択的開示の対象となる ステートメントの順序付きリストを表します。すなわち、ステートメントはこのリストから グループ化されます。

53: 機能用の正規 HMAC 文書
[
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/image> <https://dmv.utopia.example/logo.png> .\n",
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/name> \"Utopia Department of Motor Vehicles\" .\n",
  "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/url> <https://dmv.utopia.example/> .\n",
  "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#LicensedDriver> .\n",
  "_:b0 <https://w3id.org/vdl#license> _:b2 .\n",
  "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicenseCredential> .\n",
  "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n",
  "_:b1 <https://schema.org/description> \"A license granting driving privileges in Utopia.\" .\n",
  "_:b1 <https://schema.org/image> <data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC> .\n",
  "_:b1 <https://schema.org/name> \"Utopia Driver's License\" .\n",
  "_:b1 <https://www.w3.org/2018/credentials#credentialSubject> _:b0 .\n",
  "_:b1 <https://www.w3.org/2018/credentials#expirationDate> \"2028-11-15T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b1 <https://www.w3.org/2018/credentials#issuanceDate> \"2023-11-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b1 <https://www.w3.org/2018/credentials#issuer> <did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> .\n",
  "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicense> .\n",
  "_:b2 <https://w3id.org/vdl#birthDate> \"1998-08-28\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b2 <https://w3id.org/vdl#documentNumber> \"542426814\" .\n",
  "_:b2 <https://w3id.org/vdl#drivingPrivileges> \"[{\\\"codes\\\":[{\\\"code\\\":\\\"D\\\"}],\\\"expiry_date\\\":\\\"2027-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"D\\\"},{\\\"codes\\\":[{\\\"code\\\":\\\"C\\\"}],\\\"expiry_date\\\":\\\"2017-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"C\\\"}]\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON> .\n",
  "_:b2 <https://w3id.org/vdl#expiryDate> \"2028-08-27T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b2 <https://w3id.org/vdl#familyName> \"TURNER\" .\n",
  "_:b2 <https://w3id.org/vdl#givenName> \"SUSAN\" .\n",
  "_:b2 <https://w3id.org/vdl#issueDate> \"2023-01-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n",
  "_:b2 <https://w3id.org/vdl#issuingAuthority> \"UADMV\" .\n",
  "_:b2 <https://w3id.org/vdl#issuingCountry> \"UA\" .\n",
  "_:b2 <https://w3id.org/vdl#portrait> <data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==> .\n",
  "_:b2 <https://w3id.org/vdl#sex> \"2\"^^<http://www.w3.org/2001/XMLSchema#unsignedInt> .\n",
  "_:b2 <https://w3id.org/vdl#unDistinguishingSign> \"UTA\" .\n",
  "_:b2 <https://w3id.org/vdl/aamva#akaSuffix> \"1ST\" .\n",
  "_:b2 <https://w3id.org/vdl/aamva#familyNameTruncation> \"N\" .\n",
  "_:b2 <https://w3id.org/vdl/aamva#givenNameTruncation> \"N\" .\n"
]

上記の正規文書は、必須ステートメントと非必須 ステートメントにグループ化されます。選択的開示変換処理の最終出力を 以下に示します。各ステートメントは必須または非必須としてグループ化され、 前のステートメントリスト内のインデックスが保持されます。

54: 機能用の基本変換の追加
{
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "mandatory": {
    "dataType": "Map",
    "value": [
      [
        0,
        "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/image> <https://dmv.utopia.example/logo.png> .\n"
      ],
      [
        1,
        "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/name> \"Utopia Department of Motor Vehicles\" .\n"
      ],
      [
        2,
        "<did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> <https://schema.org/url> <https://dmv.utopia.example/> .\n"
      ],
      [
        5,
        "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicenseCredential> .\n"
      ],
      [
        6,
        "_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/2018/credentials#VerifiableCredential> .\n"
      ],
      [
        11,
        "_:b1 <https://www.w3.org/2018/credentials#expirationDate> \"2028-11-15T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        13,
        "_:b1 <https://www.w3.org/2018/credentials#issuer> <did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5> .\n"
      ]
    ]
  },
  "nonMandatory": {
    "dataType": "Map",
    "value": [
      [
        3,
        "_:b0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#LicensedDriver> .\n"
      ],
      [
        4,
        "_:b0 <https://w3id.org/vdl#license> _:b2 .\n"
      ],
      [
        7,
        "_:b1 <https://schema.org/description> \"A license granting driving privileges in Utopia.\" .\n"
      ],
      [
        8,
        "_:b1 <https://schema.org/image> <data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC> .\n"
      ],
      [
        9,
        "_:b1 <https://schema.org/name> \"Utopia Driver's License\" .\n"
      ],
      [
        10,
        "_:b1 <https://www.w3.org/2018/credentials#credentialSubject> _:b0 .\n"
      ],
      [
        12,
        "_:b1 <https://www.w3.org/2018/credentials#issuanceDate> \"2023-11-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        14,
        "_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/vdl#Iso18013DriversLicense> .\n"
      ],
      [
        15,
        "_:b2 <https://w3id.org/vdl#birthDate> \"1998-08-28\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        16,
        "_:b2 <https://w3id.org/vdl#documentNumber> \"542426814\" .\n"
      ],
      [
        17,
        "_:b2 <https://w3id.org/vdl#drivingPrivileges> \"[{\\\"codes\\\":[{\\\"code\\\":\\\"D\\\"}],\\\"expiry_date\\\":\\\"2027-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"D\\\"},{\\\"codes\\\":[{\\\"code\\\":\\\"C\\\"}],\\\"expiry_date\\\":\\\"2017-01-01\\\",\\\"issue_date\\\":\\\"2019-01-01\\\",\\\"vehicle_category_code\\\":\\\"C\\\"}]\"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#JSON> .\n"
      ],
      [
        18,
        "_:b2 <https://w3id.org/vdl#expiryDate> \"2028-08-27T12:00:00-06:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        19,
        "_:b2 <https://w3id.org/vdl#familyName> \"TURNER\" .\n"
      ],
      [
        20,
        "_:b2 <https://w3id.org/vdl#givenName> \"SUSAN\" .\n"
      ],
      [
        21,
        "_:b2 <https://w3id.org/vdl#issueDate> \"2023-01-15T10:00:00-07:00\"^^<http://www.w3.org/2001/XMLSchema#dateTime> .\n"
      ],
      [
        22,
        "_:b2 <https://w3id.org/vdl#issuingAuthority> \"UADMV\" .\n"
      ],
      [
        23,
        "_:b2 <https://w3id.org/vdl#issuingCountry> \"UA\" .\n"
      ],
      [
        24,
        "_:b2 <https://w3id.org/vdl#portrait> <data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==> .\n"
      ],
      [
        25,
        "_:b2 <https://w3id.org/vdl#sex> \"2\"^^<http://www.w3.org/2001/XMLSchema#unsignedInt> .\n"
      ],
      [
        26,
        "_:b2 <https://w3id.org/vdl#unDistinguishingSign> \"UTA\" .\n"
      ],
      [
        27,
        "_:b2 <https://w3id.org/vdl/aamva#akaSuffix> \"1ST\" .\n"
      ],
      [
        28,
        "_:b2 <https://w3id.org/vdl/aamva#familyNameTruncation> \"N\" .\n"
      ],
      [
        29,
        "_:b2 <https://w3id.org/vdl/aamva#givenNameTruncation> \"N\" .\n"
      ]
    ]
  },
  "hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}

次の手順では、基本証明構成を作成して正規化します。 これは次の2つの例に示されています。

55: 機能用の基本証明構成
{
  "type": "DataIntegrityProof",
  "cryptosuite": "bbs-2023",
  "created": "2023-08-15T23:36:38Z",
  "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
  "proofPurpose": "assertionMethod",
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ]
}
56: 機能用の正規基本証明構成
_:c14n0 <http://purl.org/dc/terms/created> "2023-08-15T23:36:38Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
_:c14n0 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://w3id.org/security#DataIntegrityProof> .
_:c14n0 <https://w3id.org/security#cryptosuite> "bbs-2023"^^<https://w3id.org/security#cryptosuiteString> .
_:c14n0 <https://w3id.org/security#proofPurpose> <https://w3id.org/security#assertionMethod> .
_:c14n0 <https://w3id.org/security#verificationMethod> <did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ> .

ハッシュ化ステップでは、正規化された証明 オプションの SHA-256 ハッシュを計算して proofHash を生成し、 すべての必須 N-Quads を結合したものの SHA-256 ハッシュを計算して mandatoryHash を生成します。これらを以下に16進形式で 示します。

57: 機能用の基本ハッシュの追加
{
  "proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
  "mandatoryHash": "8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb"
}

次に、3.3.2 基本 証明の直列化 (bbs-2023) 手順で、[CFRG-Blind-BBS-Signature] の ブラインド署名生成手順を使用します。 計算された bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointers、および featureOption を以下に示します。 バイトデータは16進形式で示されています。

58: 所有者バインディング用の基本署名の追加
{
  "bbsSignature": "90eadd70a16661f3d596f3560fc485f7c23ba969eb7c237d481b3596b2f66279bd5a62fa523777eb73b5cfa361885f1a00864b960baf1b92d2b55c0652ebe39024f88e1377911c40bf14cb5fbc808ee1",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "featureOption": "anonymous_holder_binding"
}

最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。

59: 所有者バインディング用の署名済み基本文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "issuanceDate": "2023-11-15T10:00:00-07:00",
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "name": "Utopia Driver's License",
  "image": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC",
  "description": "A license granting driving privileges in Utopia.",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "document_number": "542426814",
      "family_name": "TURNER",
      "given_name": "SUSAN",
      "portrait": "data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==",
      "birth_date": "1998-08-28",
      "issue_date": "2023-01-15T10:00:00-07:00",
      "expiry_date": "2028-08-27T12:00:00-06:00",
      "issuing_country": "UA",
      "issuing_authority": "UADMV",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ],
      "un_distinguishing_sign": "UTA",
      "aamva_aka_suffix": "1ST",
      "sex": 2,
      "aamva_family_name_truncation": "N",
      "aamva_given_name_truncation": "N"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0EhVhQkOrdcKFmYfPVlvNWD8SF98I7qWnrfCN9SBs1lrL2Ynm9WmL6Ujd363O1z6NhiF8aAIZLlguvG5LStVwGUuvjkCT4jhN3kRxAvxTLX7yAjuFYQDpbvyXTTZCxjDXNI1e-am9CMB6U_J5S936Tt3PFYUvfjuoRLATYnhM4gPlnZuuuc2k_dfG7y7qkc9wGJUvexPtYYKTvGvo9pXVJbxIrm3i4wkdhUxqKCTIGrnxFuAdZwWi6T3omD5wzZ7bAGbRneEEQSxBmXtvnC6Pr59nPv_v3HrAW9wq_uxYzF_NyaX3GPv0h_FV2T2OSao8C6uoyWiqIj1ggABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v-CZy9pc3N1ZXJvL2V4cGlyYXRpb25EYXRl"
  }
}

A.3.3 所有者バインディング派生 証明

節で説明したように、 模擬乱数生成手順を使用し、 presentationHeader の使用方法を示します。同じ seedpresentationHeader をここでも使用し、 以下に再掲します。

60: seed と presentation header の値
{
  "presentationHeaderHex": "113377aa",
  "pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}

派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の第A.3.2 所有者バインディング基本証明節の最後の例です。 最初のステップでは、第 3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointers、および featureOption を復元します。

61: 所有者バインディング用に復元された基本署名データ
{
  "bbsSignature": "90eadd70a16661f3d596f3560fc485f7c23ba969eb7c237d481b3596b2f66279bd5a62fa523777eb73b5cfa361885f1a00864b960baf1b92d2b55c0652ebe39024f88e1377911c40bf14cb5fbc808ee1",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "featureOption": "anonymous_holder_binding"
}

次に、所有者は選択的開示用の JSON ポインタを指定することで、 さらに何を検証者に開示したいかを示す必要があります。この 場合、所有者は自身の運転資格のみを開示したいと考えています。

62: 機能用の選択的開示ポインタ
["/credentialSubject/driversLicense/issuing_country", "/credentialSubject/driversLicense/driving_privileges"]

revealDocument(すなわち、最終的に署名され、 検証者へ送信される署名前の文書)を生成するため、 選択的ポインタを必須ポインタに追加し、これらの結合ポインタを 証明を除いた文書とともに [DI-ECDSA] の selectJsonLd アルゴリズムへ入力して、 以下に示す結果を取得します。

63: 機能用の署名前の開示文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "issuing_country": "UA",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ]
    }
  }
}

開示された文書がどのようなものか分かったので、どの文が 必須であり、選択された非必須文のインデックスがどれであるかについて、 適切に更新された情報を検証者に提供する必要があります。 § 4.4.3 CreateDisclosureData を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。

64: 機能用の派生グループインデックス
{"combinedIndexes":[0,1,2,3,4,5,6,10,11,13,14,17,23],"mandatoryIndexes":[0,1,2,5,6,11,13],"nonMandatoryIndexes":[3,4,7,8,9,10,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"selectiveIndexes":[3,4,5,6,10,14,17,23]}

検証者は、必須ステートメントを集約してハッシュできる必要があります。 これを可能にするため、必須ステートメントのインデックスを 開示文書内の位置に合わせて調整したリスト(すなわち combinedIndexes に対する相対位置)として提供します。一方、 selectiveIndexesnonMandatoryIndexes 内の位置に対して相対的に調整する必要があります。 これらの「調整済み」インデックスを 以下に示します。

65: 機能用の調整済み必須および選択的インデックス
{"adjMandatoryIndexes":[0,1,2,5,6,8,9],"adjSelectiveIndexes":[0,1,5,7,10,16]}

開示データの最後の重要な要素は、正規化された空白ノード ID から HMAC ベースでシャッフルされた ID へのマッピングである labelMap であり、 § 4.4.3 CreateDisclosureData 節に従って計算されます。これは 以下に、 開示文書を除く残りの開示データとともに示されています。ここでは、 featureOption"anonymous_holder_binding" と等しい場合に適した結果を示しており、これは [CFRG-Blind-BBS-Signature] のブラインド証明生成 手順を使用します。 blindAdjDisclosedIdxs は、 証明のシリアライズ処理で使用される BBS 選択インデックスの最終的な集合であり、 adjSelectiveIndexes を入力として受け取る ブラインド BBS 証明生成関数から得られることに注意してください。

66: 保有者バインディング用の開示データ
{"bbsProof":"a19db05cca1237d9965b0bb3197c4962a7fb49c97af131c80ea2d8f949078ff5642acdb33d27d06b97f87ff906a2a23bb0c3dd778572b892785faefdc25811318b0b46e25b8863898b0600701a71c256ee9a7347a1a577fe2e3793b1c0390e4d8f9fff9161074eebba852bcca8089eed76416ac9f178b850e7688c26cfbdee344fa75d9ba2cf22417e3c70be7891f6de040928d4a665005ddbe3b7372ecb87baad726f1535d4600a0198d3a36a17ad673160f8ef5e5fd74f2542b214cc4534ee82b0a90c0501ca9749c8327afcb97e14220f2e516dfc3cb2ed2ffdd3845a25cb64e1a2aa9987bbc122755158d787a2356e28f2affff31b83a2cdff26d5ac1aa72f4d6c40fe96ad230ce09fd4e9b8998357c2964da031e59c3b8c2241da00bc66a6216af7cd02b535577fa3b54bf9a0d230183b03aa145dbabc7fed3710d879c6b8d4273e6e377bed382de985f561ff9b2b3445f29957655600cbd1b29714f52c55ff05bc204203e65bdf6f818e976c690becfed9284b27c2dead96803efad949ffb519b7024530b08b5ed4c8e7472ed20c3866b79658e1b2d2c5b88a60da07614afa4906c73a6e5ad9113282288173e265236fa57d72c97f85c86b43349516f8e2f52f756d43cd2d9cf8c673db404d14007706ebbd4f7b5bbd19cdce9f48b2dac2db7f0f0c3fb18bd8e66e28fe46dafc3961e5945779faf5407190a33ce00efd07222cc142d40cab9b9d591589a30d056dae47d376d3ac5fab3201bbada604dd8e5e292185f38e2bcd58e81b2fec1e7b5754b7b28bd127abc929e950cb75100e94695f1ad13c09c1d394664029b66bdd49304df3ae1e2a90a6309f07c47555ccaea9cd17d80eaad6b7c29e9335a69338446ff666ac5802cfe36057c449d392bda99d2657fb8b6cf02d7ce4d9dccd8e97033accc5c10f092ec7bf0b3c0b2afc64a1a429d81cc485388f6f390dd97f648c3712ee0b93a7e96b268437e6e3537fb7918cee2a4ac3f895c7945988d7d3880238b8cf6062da171aa87545cf62072b20e698eb4ac12450c0b95a77e946fada8d46102abfa9a5a12d2a71380dedb51e2a57c97514813c17ea93e6ca19077c2a2511bf8fd158c4ed7361590b040915a3cb76f323300111303d8dd31c55474d514209bf01ed6639d4d81a1b30be54444e523e2ddef9a0a6bfe792d3037944aec29154c02bb79d09bd53856797dceb6c599f4103ff7f13dfdb8b2d18477832e5fe21","labelMap":{"dataType":"Map","value":[["c14n0","b1"],["c14n1","b2"],["c14n2","b0"]]},"mandatoryIndexes":[0,1,2,5,6,8,9],"adjSelectiveIndexes":[0,1,5,7,10,16],"presentationHeader":{"0":17,"1":51,"2":119,"3":170},"featureOption":"anonymous_holder_binding","lengthBBSMessages":23}

最後に、上記の開示データを 3.2.3 serializeDerivedProofValue 節のアルゴリズムで使用すると、以下に示す署名済みの派生 (開示)文書が得られます。

67: 所有者バインディング用の署名済み派生 文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "issuing_country": "UA",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ]
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0FhlkDcKGdsFzKEjfZllsLsxl8SWKn-0nJevExyA6i2PlJB4_1ZCrNsz0n0GuX-H_5BqKiO7DD3XeFcriSeF-u_cJYETGLC0biW4hjiYsGAHAaccJW7ppzR6Gld_4uN5OxwDkOTY-f_5FhB07ruoUrzKgInu12QWrJ8Xi4UOdojCbPve40T6ddm6LPIkF-PHC-eJH23gQJKNSmZQBd2-O3Ny7Lh7qtcm8VNdRgCgGY06NqF61nMWD4715f108lQrIUzEU07oKwqQwFAcqXScgyevy5fhQiDy5Rbfw8su0v_dOEWiXLZOGiqpmHu8EidVFY14eiNW4o8q__8xuDos3_JtWsGqcvTWxA_patIwzgn9TpuJmDV8KWTaAx5Zw7jCJB2gC8ZqYhavfNArU1V3-jtUv5oNIwGDsDqhRdurx_7TcQ2HnGuNQnPm43e-04LemF9WH_mys0RfKZV2VWAMvRspcU9SxV_wW8IEID5lvfb4GOl2xpC-z-2ShLJ8LerZaAPvrZSf-1GbcCRTCwi17UyOdHLtIMOGa3lljhstLFuIpg2gdhSvpJBsc6blrZETKCKIFz4mUjb6V9csl_hchrQzSVFvji9S91bUPNLZz4xnPbQE0UAHcG671Pe1u9Gc3On0iy2sLbfw8MP7GL2OZuKP5G2vw5YeWUV3n69UBxkKM84A79ByIswULUDKubnVkViaMNBW2uR9N206xfqzIBu62mBN2OXikhhfOOK81Y6Bsv7B57V1S3sovRJ6vJKelQy3UQDpRpXxrRPAnB05RmQCm2a91JME3zrh4qkKYwnwfEdVXMrqnNF9gOqta3wp6TNaaTOERv9masWALP42BXxEnTkr2pnSZX-4ts8C185NnczY6XAzrMxcEPCS7Hvws8Cyr8ZKGkKdgcxIU4j285Ddl_ZIw3Eu4Lk6fpayaEN-bjU3-3kYzuKkrD-JXHlFmI19OIAji4z2Bi2hcaqHVFz2IHKyDmmOtKwSRQwLlad-lG-tqNRhAqv6mloS0qcTgN7bUeKlfJdRSBPBfqk-bKGQd8KiURv4_RWMTtc2FZCwQJFaPLdvMjMAERMD2N0xxVR01RQgm_Ae1mOdTYGhswvlRETlI-Ld75oKa_55LTA3lErsKRVMArt50JvVOFZ5fc62xZn0ED_38T39uLLRhHeDLl_iGjAAEBAgIAhwABAgUGCAmGAAEFBwoQRBEzd6oX"
  }
}

A.4 資格情報に結び付けられた仮名 機能

A.4.1 証明者 Nym コミットメント 生成

資格情報に結び付けられた仮名機能を使用する最初の手順は、 所有者が自身の秘密の prover_nym 値を生成し、その後、 [CFRG-Pseudonym-BBS-Signature] の「Commitment」操作に従って、 この値に対する証明付きコミットメントを計算することです。この手順の 値と出力の例を以下に示します。

68: 証明者 Nym
{
    "proverNymHex": "5e2087638f71057ef108f83923189a71cea1f7c4b4ef69afb473c9a7074ddf49"
}
69: 証明者 Nym コミットメント情報
{
  "secretProverBlind": "2df3cd3d451b21069b72269f9984df449219c41273b19b1a8487d836fbb8baa1",
  "commitmentWithProof": "a80f61f9470cb8ab88644fbef3616eaf5d3b147c4dc1dcad810148a5f2e73186cb3ffa27ea55728a6df470d0c3928be1408b95f5d261cee4d66992ecacf5ca2d6348c33bb7f90c2cef513cdc88be536550e9701d9a466320f49ce097551f8097317c530e2b80710748362b03f5a74280669c00eb29145eb3ec51975d8189fdf2c810d7fadefe36f93b0d2068a494175c"
}

prover_nym および secretProverBlind は、所有者が保持し、秘密にしておく必要があります。 commitmentWithProof 値は発行者に伝達する必要があります。

A.4.2 仮名基本証明

仮名機能オプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、 signer_nym_entropy のための暗号学的にランダムな値を生成することから始まります。

70: 署名者 Nym エントロピー
{
    "signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140"
}

この例では、 27に示したものと同じ鍵素材、 50に 示したものと同じ署名されていない文書、および 51に示したものと同じ 必須ポインタを使用します。これにより、 52に示したものと同じ 正規文書、 53に示したものと同じ 正規 HMAC 文書、および 54に示したものと同じ「基本 変換の追加」が得られます。

この例では、 55と 同じ証明構成を使用します。 これにより、 56と同じ正規基本証明が得られます。 これを上記の前提と組み合わせることで、 57と同じ基本ハッシュが得られます。

featureOption"pseudonym" と等しいため、第 3.3.2 基本証明の直列化 (bbs-2023)節の手順では、 以下に示す出力が生成されます。ここでは、 [CFRG-Pseudonym-BBS-Signature] の 署名生成アルゴリズムを使用します。signer_nym_entropy および featureOption の値は、 所有者に伝達する必要があるため含まれていることに注意してください。

71: 仮名用の基本署名の追加
{
  "bbsSignature": "b9389149bab1b5a6032c20781732105a5cbc209592e712e182eec5c055f2072877683dee2949af32290d350ed9e9ffa246f65b8c3f6f199c4d29009d2ce6dff374ed4f22f2f9a7e12dc3c342e8c18107",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
  "featureOption": "pseudonym"
}

最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。

72: 仮名用の署名済み基本文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "issuanceDate": "2023-11-15T10:00:00-07:00",
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "name": "Utopia Driver's License",
  "image": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC",
  "description": "A license granting driving privileges in Utopia.",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "document_number": "542426814",
      "family_name": "TURNER",
      "given_name": "SUSAN",
      "portrait": "data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==",
      "birth_date": "1998-08-28",
      "issue_date": "2023-01-15T10:00:00-07:00",
      "expiry_date": "2028-08-27T12:00:00-06:00",
      "issuing_country": "UA",
      "issuing_authority": "UADMV",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ],
      "un_distinguishing_sign": "UTA",
      "aamva_aka_suffix": "1ST",
      "sex": 2,
      "aamva_family_name_truncation": "N",
      "aamva_given_name_truncation": "N"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0IhlhQuTiRSbqxtaYDLCB4FzIQWly8IJWS5xLhgu7FwFXyByh3aD3uKUmvMikNNQ7Z6f-iRvZbjD9vGZxNKQCdLObf83TtTyLy-afhLcPDQujBgQdYQDpbvyXTTZCxjDXNI1e-am9CMB6U_J5S936Tt3PFYUvfjuoRLATYnhM4gPlnZuuuc2k_dfG7y7qkc9wGJUvexPtYYKTvGvo9pXVJbxIrm3i4wkdhUxqKCTIGrnxFuAdZwWi6T3omD5wzZ7bAGbRneEEQSxBmXtvnC6Pr59nPv_v3HrAW9wq_uxYzF_NyaX3GPv0h_FV2T2OSao8C6uoyWiqIj1ggABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v-CZy9pc3N1ZXJvL2V4cGlyYXRpb25EYXRlwlggJVVc9jUYihwzmJBW9RKearS-DnxcxYjEjTCOAlTu0UA"
  }
}

A.4.3 仮名派生証明

A.1.2 派生証明節で説明したように、 presentationHeader の使用方法を示すため、 模擬乱数生成手順を使用しました。 19に 示したものと同じ seed および presentationHeader を ここでも使用します。

派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の 72のものです。 最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointerssigner_nym_entropy、および featureOption を復元します。

73: 仮名用に復元された基本署名データ
{
  "bbsSignature": "b9389149bab1b5a6032c20781732105a5cbc209592e712e182eec5c055f2072877683dee2949af32290d350ed9e9ffa246f65b8c3f6f199c4d29009d2ce6dff374ed4f22f2f9a7e12dc3c342e8c18107",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "signerNymEntropy": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
  "featureOption": "pseudonym"
}

次に、所有者は [CFRG-Pseudonym-BBS-Signature] の 「検証と最終化」操作を使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では、 prover_nymsigner_nym_entropy、および secret_prover_blind の値などを使用します。

74: 計算された Nym 秘密
{
    "nymSecretHex": "f883d069aec1252f167b0880e8960d72fa2623e11b6967541a457aa5c3cb088"
}

次に、所有者は選択的開示用の JSON ポインタを指定することで、 どの非必須ステートメントを検証者に開示したいかを示す必要があります。 この場合、所有者は 62に示したものと同じ情報を開示します。 これにより、 63に示したものと同じ revealDocument が得られます。

§ 4.4.3 CreateDisclosureData を実行すると、 64 に示されているものと同じ 派生グループインデックスに関する情報と、 65 に示されているものと同じ 調整済みの必須および選択インデックスが得られます。

3.2.3 serializeDerivedProofValue 内で、 に示されているものと同じ verfifier_id に基づいて pseudonym を計算します。 § 4.4.3 CreateDisclosureData の最終出力を以下に示します。 featureOption と計算された pseudonym の値が含まれていることに注意してください。

75: 仮名用の開示データ
{
    "bbsProof":"b394693d54d67937aae0e4175ecf4331200c23470171188ac5513b30d27d9bd2e06173d44e1aca7c743ba30b3f59af0595965bf8256437bce6bef824fe243183af6aa14a1e8224ed7e4eeb16445594df13a46e75d8dfbae0a3e2e1e0871260e68f71de7be4309eb53523a446b8189446b8d5c60892bdd855b5067e0433b46d5b9ffc4dc54b712ff97ec9d7c44cff648929d826bf9e3a7f873c9bcd07c6a3747fc6befceaf892c4d8d38d385c19c399ab342a76c000a3ff9050fa9223e20acfdf4404f43605a24c44622ebcaaf144b161226a6cbe7c08474f9fb80a736be3a818e4e62aa738e701007871859bea36e062324ff3afd8670a5de8b69911fae58aa40e48e29a046c37b9f9cc3868c30482d2339746955c3deaf6f1d4c8cf8be8e503f3ea4715d11e385eb7ed9de6379b7de8436a4e89cf4427d53358b1882e27c6e1e3ba2e81cf10fbc792cf3461a0fdd63f35a151b8c8350505a9b6d612e9adc1dca11b2698a3d0a9f0df6e9bc0ece7aa462afab02d93a87fd5bebb0eee058770c81c5f2fe6eeefcb0a657d9f116b96e2b04b4cc7f4baad4fe784bd9563aea20272138f2dbe94a5e25d30633b5f83eac4b42af25f144bddb631738bf3d54206e8d8b5172c8d52d3c272f799b782c73d480e1289e262ddbb70ab29491cf85a8428c4672437677407524a6dacb53332565dab5d056dbc5451becb123f91d173f6a7c785b7d9f19c43864a785bd941db248322539a097e9ac06244308a3b8df88b5213724cf09715b09e06425448c400680b943ba4711f14a719920b06ec2c6aff908ecf4f5793afd233d270a5ef92131606035517a89e4118dc65dbeb9051f92797036f54f8400910fa56cdd7b87b122e39e41233ea493239fab55c4c836a0a38732a68e6a9f9e11d32b991599e19edbb386f0d364b91e10dd9bf82898f79e90045a0c4987a0cf365d37d8380539a794284841c50c83f2bc3ee9cf7432f44dbfca897ff99feabf224e51137313630c5000d39429d9ea69a2a8237fe3a1857121c14ebb00d57b90db39e2e11bfa37858187d183027c45e317a72e5334681de26788e3176bd48d5761d54c1f2af0a6c3549a0de05b21d0a066c732a540072ae7676b867027b18323e08fcbfaf38ec22aeccd3375bb7b6965d9f6ab3ac4adc2a0700a4bc82fe58afbdd035af48fb85fcd8bf14f81d5ca3f2626be8962cbea13da31ff3cc6c6ebfeeef42f25708af872a14019f83",
    "labelMap":{"dataType":"Map","value":[["c14n0","b1"],["c14n1","b2"],["c14n2","b0"]]},
    "mandatoryIndexes":[0,1,2,5,6,8,9],
    "adjSelectiveIndexes":[0,1,5,7,10,16],
    "presentationHeader":{"0":17,"1":51,"2":119,"3":170},
    "pseudonym":"838607ff2c8dcb2a0740ef13c2c87418efb57559243232a69daf1e294dd092af833ad4df1e99e0034c737b932916f378",
    "featureOption":"pseudonym",
    "lengthBBSMessages":23
}

最後に、上記の開示データを 3.2.3 serializeDerivedProofValue 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。

76: 仮名用の署名済み派生文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "issuing_country": "UA",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ]
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0Jh1kDcLOUaT1U1nk3quDkF17PQzEgDCNHAXEYisVROzDSfZvS4GFz1E4aynx0O6MLP1mvBZWWW_glZDe85r74JP4kMYOvaqFKHoIk7X5O6xZEVZTfE6RuddjfuuCj4uHghxJg5o9x3nvkMJ61NSOkRrgYlEa41cYIkr3YVbUGfgQztG1bn_xNxUtxL_l-ydfETP9kiSnYJr-eOn-HPJvNB8ajdH_Gvvzq-JLE2NONOFwZw5mrNCp2wACj_5BQ-pIj4grP30QE9DYFokxEYi68qvFEsWEiamy-fAhHT5-4CnNr46gY5OYqpzjnAQB4cYWb6jbgYjJP86_YZwpd6LaZEfrliqQOSOKaBGw3ufnMOGjDBILSM5dGlVw96vbx1MjPi-jlA_PqRxXRHjhet-2d5jebfehDak6Jz0Qn1TNYsYguJ8bh47ougc8Q-8eSzzRhoP3WPzWhUbjINQUFqbbWEumtwdyhGyaYo9Cp8N9um8Ds56pGKvqwLZOof9W-uw7uBYdwyBxfL-bu78sKZX2fEWuW4rBLTMf0uq1P54S9lWOuogJyE48tvpSl4l0wYztfg-rEtCryXxRL3bYxc4vz1UIG6Ni1FyyNUtPCcveZt4LHPUgOEoniYt27cKspSRz4WoQoxGckN2d0B1JKbay1MzJWXatdBW28VFG-yxI_kdFz9qfHhbfZ8ZxDhkp4W9lB2ySDIlOaCX6awGJEMIo7jfiLUhNyTPCXFbCeBkJUSMQAaAuUO6RxHxSnGZILBuwsav-Qjs9PV5Ov0jPScKXvkhMWBgNVF6ieQRjcZdvrkFH5J5cDb1T4QAkQ-lbN17h7Ei455BIz6kkyOfq1XEyDago4cypo5qn54R0yuZFZnhntuzhvDTZLkeEN2b-CiY956QBFoMSYegzzZdN9g4BTmnlChIQcUMg_K8PunPdDL0Tb_KiX_5n-q_Ik5RE3MTYwxQANOUKdnqaaKoI3_joYVxIcFOuwDVe5DbOeLhG_o3hYGH0YMCfEXjF6cuUzRoHeJniOMXa9SNV2HVTB8q8KbDVJoN4Fsh0KBmxzKlQAcq52drhnAnsYMj4I_L-vOOwirszTN1u3tpZdn2qzrErcKgcApLyC_livvdA1r0j7hfzYvxT4HVyj8mJr6JYsvqE9ox_zzGxuv-7vQvJXCK-HKhQBn4OjAAEBAgIAhwABAgUGCAmGAAEFBwoQRBEzd6pYMIOGB_8sjcsqB0DvE8LIdBjvtXVZJDIypp2vHilN0JKvgzrU3x6Z4ANMc3uTKRbzeBc"
  }
}

A.5 所有者バインディングと 仮名機能

A.5.1 所有者秘密と証明者 Nym コミットメントの生成

所有者バインディングと仮名機能を使用する最初の手順は、 所有者が自身の holder_secret および prover_nym 値を生成し、 その後、[CFRG-Pseudonym-BBS-Signature] の「Commitment」操作に従って、 これらの値に対する証明付き コミットメントを計算することです。この手順の値と出力の例を 以下に示します。

77: 所有者の秘密
{
    "holderSecretHex": "8fc6cc3f65db4ba5e3ed63fe9d2bd57a9c7df9c7f6bf2b898b308d5493b07eb6"
}
78: 証明者 Nym
{
    "proverNymHex": "5e2087638f71057ef108f83923189a71cea1f7c4b4ef69afb473c9a7074ddf49"
}
79: 所有者秘密と証明者 Nym のコミットメント 情報
{
  "secretProverBlind": "0d215067232c77c94a7572eb80794592090da8aff35cca53d2d528d059e70fce",
  "commitmentWithProof": "ab72f3e6d7a4185d100ede6ce7dde1c69db9a2128ad11d1b6991a018c340ca2672d7be636f153398be50f44ee434edf14322dd115f7527e770a0f0c41d8aeb2088d004f2703548db6ce15e2505368a1f686f20702aa9ff46bce301330ea0c4c16ef4d8bbf624064a60df3a563142d7b236cad6cf6bcf1f3694d0bf4c2b5ffce55bb26abc05e31f9aaf8b60674fefe02666f89c150c479694f4a89a9088b28a1e6e2cf0c2caaa01810d2e3a52853f3a2a"
}

holder_secretprover_nym、および secretProverBlind は、 所有者が保持して 秘密にしておく必要があります。commitmentWithProof 値は 発行者に伝達する必要があります。

A.5.2 所有者バインディング と仮名の基本証明

仮名機能オプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、 signer_nym_entropy のための暗号学的にランダムな値を生成することから始まります。

80: 署名者 Nym エントロピー
{
    "signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140"
}

この例では、 27に示したものと同じ鍵素材、 50に 示したものと同じ署名されていない文書、および 51に示したものと同じ 必須ポインタを使用します。これにより、 52に示したものと同じ 正規文書、 53に示したものと同じ 正規 HMAC 文書、および 54に示したものと同じ「基本 変換の追加」が得られます。

この例では、 55と 同じ証明構成を使用します。 これにより、 56と同じ正規基本証明が得られます。 これを上記の前提と組み合わせることで、 57と同じ基本ハッシュが得られます。

featureOption"holder_binding_pseudonym" と等しいため、第 3.3.2 基本証明の直列化 (bbs-2023)節の手順では、 以下に示す出力が生成されます。ここでは、 [CFRG-Pseudonym-BBS-Signature] の 署名生成アルゴリズムを使用します。signer_nym_entropy および featureOption の値は、 所有者に伝達する必要があるため含まれていることに注意してください。

81: 所有者バインディングと 仮名用の基本署名の追加
{
  "bbsSignature": "9251f497cb002c19f959a760fa24c5e961df9cb8ff5fbaaef14f2b7f1f41649990c30bd8c1d373e878a5d120123d658a326141275eee7833352d611cc1c05175c9c0f0ddeb0fdec09ad1bfad8796e410",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
  "featureOption": "holder_binding_pseudonym"
}

最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。

82: 所有者バインディングと 仮名用の署名済み基本文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "issuanceDate": "2023-11-15T10:00:00-07:00",
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "name": "Utopia Driver's License",
  "image": "data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUg...kSuQmCC",
  "description": "A license granting driving privileges in Utopia.",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "document_number": "542426814",
      "family_name": "TURNER",
      "given_name": "SUSAN",
      "portrait": "data:image/jpeg;base64,/9j/4AAQSkZJR...RSClooooP/2Q==",
      "birth_date": "1998-08-28",
      "issue_date": "2023-01-15T10:00:00-07:00",
      "expiry_date": "2028-08-27T12:00:00-06:00",
      "issuing_country": "UA",
      "issuing_authority": "UADMV",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ],
      "un_distinguishing_sign": "UTA",
      "aamva_aka_suffix": "1ST",
      "sex": 2,
      "aamva_family_name_truncation": "N",
      "aamva_given_name_truncation": "N"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0IhlhQklH0l8sALBn5Wadg-iTF6WHfnLj_X7qu8U8rfx9BZJmQwwvYwdNz6Hil0SASPWWKMmFBJ17ueDM1LWEcwcBRdcnA8N3rD97AmtG_rYeW5BBYQDpbvyXTTZCxjDXNI1e-am9CMB6U_J5S936Tt3PFYUvfjuoRLATYnhM4gPlnZuuuc2k_dfG7y7qkc9wGJUvexPtYYKTvGvo9pXVJbxIrm3i4wkdhUxqKCTIGrnxFuAdZwWi6T3omD5wzZ7bAGbRneEEQSxBmXtvnC6Pr59nPv_v3HrAW9wq_uxYzF_NyaX3GPv0h_FV2T2OSao8C6uoyWiqIj1ggABEiM0RVZneImaq7zN3u_wARIjNEVWZ3iJmqu8zd7v-CZy9pc3N1ZXJvL2V4cGlyYXRpb25EYXRlwlggJVVc9jUYihwzmJBW9RKearS-DnxcxYjEjTCOAlTu0UA"
  }
}

A.5.3 所有者 バインディングと仮名の派生証明

A.1.2 派生証明節で説明したように、 模擬乱数生成手順を使用し、 presentationHeader の使用方法を示します。 19に 示したものと同じ seed および presentationHeader を ここでも使用します。

派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の 72のものです。 最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignaturebbsHeaderpublicKeyhmacKeymandatoryPointerssigner_nym_entropy、および featureOption を復元します。

83: 所有者バインディングと仮名用に復元された基本 署名データ
{
  "bbsSignature": "9251f497cb002c19f959a760fa24c5e961df9cb8ff5fbaaef14f2b7f1f41649990c30bd8c1d373e878a5d120123d658a326141275eee7833352d611cc1c05175c9c0f0ddeb0fdec09ad1bfad8796e410",
  "bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
  "publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
  "hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
  "mandatoryPointers": [
    "/issuer",
    "/expirationDate"
  ],
  "signerNymEntropy": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
  "featureOption": "holder_binding_pseudonym"
}

次に、所有者は [CFRG-Pseudonym-BBS-Signature] の 「検証と最終化」操作を使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では holder_secretprover_nymsigner_nym_entropy、および secret_prover_blind の値などを使用します。

84: 計算された Nym 秘密
{"nymSecretHex":"f883d069aec1252f167b0880e8960d72fa2623e11b6967541a457aa5c3cb088"}

次に、所有者は選択的開示用の JSON ポインタを指定することで、 どの非必須ステートメントを 検証者に開示したいかを示す必要があります。この 場合、所有者は 62に示したものと同じ情報を開示します。 これにより、 63に示したものと同じ revealDocument が得られます。

§ 4.4.3 CreateDisclosureData を実行すると、 64 に示されているものと同じ 派生グループインデックスに関する情報と、 65 に示されているものと同じ 調整済みの必須および選択インデックスが得られます。

3.2.3 serializeDerivedProofValue 内で、 に示されているものと同じ verfifier_id に基づいて pseudonym を計算します。 3.2.3 serializeDerivedProofValue の最終出力を以下に示します。 featureOption および計算された pseudonym の値が含まれていることに注意してください。

85: 保有者バインディングと 仮名用の開示データ
{
  "bbsProof":"94752c678297191b42617aca412377d4a5b3d7872779ffea31e0b418f50e95056d923a97e8dc156edc2a3a3a54e7b27cafa26a989fc3e8a8bc7a08b84e706a1863bd06c396b973b1af0da4f6c20ea463e124d2ad97060a25ccc3ff695c71977ba2e83a6468205d9e0bfb756089ad40dededab480eeb13cf00265f49824c5f89e23ac48d07fa3164823741df5c066bdc31a231a7d4fecb75c912adb800b1efe8da3cd26805ffa56775b1c32da34e36e9716a4da909fa6803ca0aa2df2d82f697229ccb210503274d4d61c7386a44e9fb459c020fbcd62c7f437da8ffd5ea7e56d2c4e7d9c3f593b2a964346f24f71bec30a2c3ededa0bd3707e2e06cac2dddb66762135a229dc09b67fa61d690d33be78150bc60f3655ac1063f96d6fe95a260004c7bf9e924cc7439c6426f951d0cee963985557097788d2387b72c9aeb390f9a4fa4b519bc11ca81dfca8a4fd3c77805e1a0ef5c165b16c3cdc564e7a5593f0ddd0560f3514393c1b305d3950c29fbb72cc8b58979843cec768e9a77b14f70704771f877c49fc0d0d4ffbe3f0aaf8e472a83b14e32e46207d5012e79b9bcfc6197c858eb18ad97f589dddb5dc45e9ef65f482d3c07fbcbfef92bf293643539fffc94a8bc98b3b4dd3335bb8b248aa606a751330516f148211d5f2d513e02d45ec5a51add1f878948a673a0349d7cb4417b1f9c16945e1f607bdecf6ca3b96a64fb14ee1fc5dbecf751be23041df32842367285f2b3b02c13512c28c0e7671874699b9ff169e35f91debc796fd487d3e41dcc5f12949558f2705be3e8195d4c93a6c149dcb5f63e62d3ce0bf51034021251b74ed2a1186fd77741ce3bf51f57f19a9d4a9e6315a88024062269a9fec426a73199882113168573da451ca38aeacf28f7eef3892181f0bc511562fba00d035f608c4f85579fc9614618763fa4e6c2210184e12f83e1c22078dd4ca488de41dbf2c146a2e0c47137be7f006c6810f44746a819229349b50ca59a51f7c51bb62cacc1a1cc4a6f089680514d41800da57470ef275f390eb4a08db78789e71bd32bd8929961c9f79d1ca071a2608a393f162c2f644584473f11b41cc35c838f11fbd2adf47051829d378ac9dc151e64bc70cd21b2ea6bca3f77b9c2b35abcebb0ecbf1c09365a8e372a2fce74b97088c9e9505c5c0272a4d6959bec54911a99b6c8a1654395f0cd4e7d38d695ab45875ecc535439dde3fb3d4658d9ff9427d8e36d7bd19ea53fb875c4b138f6ffc06bfd496b1a744a63283ebc0fa34ea828d98",
  "labelMap":{"dataType":"Map","value":[["c14n0","b1"],["c14n1","b2"],["c14n2","b0"]]},
  "mandatoryIndexes":[0,1,2,5,6,8,9],"adjSelectiveIndexes":[0,1,5,7,10,16],
  "presentationHeader":{"0":17,"1":51,"2":119,"3":170},
  "pseudonym":"838607ff2c8dcb2a0740ef13c2c87418efb57559243232a69daf1e294dd092af833ad4df1e99e0034c737b932916f378",
  "featureOption":"holder_binding_pseudonym",
  "lengthBBSMessages":23
}

最後に、上記の開示データを 3.2.3 serializeDerivedProofValue 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。

86: 所有者バインディングと 仮名用の署名済み派生文書
{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://w3id.org/security/data-integrity/v2",
    "https://w3id.org/vdl/v1",
    "https://w3id.org/vdl/aamva/v1"
  ],
  "type": [
    "VerifiableCredential",
    "Iso18013DriversLicenseCredential"
  ],
  "issuer": {
    "id": "did:key:z6MkjxvA4FNrQUhr8f7xhdQuP1VPzErkcnfxsRaU5oFgy2E5",
    "name": "Utopia Department of Motor Vehicles",
    "url": "https://dmv.utopia.example/",
    "image": "https://dmv.utopia.example/logo.png"
  },
  "expirationDate": "2028-11-15T12:00:00-06:00",
  "credentialSubject": {
    "type": "LicensedDriver",
    "driversLicense": {
      "type": "Iso18013DriversLicense",
      "issuing_country": "UA",
      "driving_privileges": [
        {
          "codes": [
            {
              "code": "D"
            }
          ],
          "vehicle_category_code": "D",
          "issue_date": "2019-01-01",
          "expiry_date": "2027-01-01"
        },
        {
          "codes": [
            {
              "code": "C"
            }
          ],
          "vehicle_category_code": "C",
          "issue_date": "2019-01-01",
          "expiry_date": "2017-01-01"
        }
      ]
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "bbs-2023",
    "created": "2023-08-15T23:36:38Z",
    "verificationMethod": "did:key:zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ#zUC7DerdEmfZ8f4pFajXgGwJoMkV1ofMTmEG5UoNvnWiPiLuGKNeqgRpLH2TV4Xe5mJ2cXV76gRN7LFQwapF1VFu6x2yrr5ci1mXqC1WNUrnHnLgvfZfMH7h6xP6qsf9EKRQrPQ",
    "proofPurpose": "assertionMethod",
    "proofValue": "u2V0Jh1kDkJR1LGeClxkbQmF6ykEjd9Sls9eHJ3n_6jHgtBj1DpUFbZI6l-jcFW7cKjo6VOeyfK-iapifw-iovHoIuE5wahhjvQbDlrlzsa8NpPbCDqRj4STSrZcGCiXMw_9pXHGXe6LoOmRoIF2eC_t1YImtQN7e2rSA7rE88AJl9JgkxfieI6xI0H-jFkgjdB31wGa9wxojGn1P7LdckSrbgAse_o2jzSaAX_pWd1scMto0426XFqTakJ-mgDygqi3y2C9pcinMshBQMnTU1hxzhqROn7RZwCD7zWLH9Dfaj_1ep-VtLE59nD9ZOyqWQ0byT3G-wwosPt7aC9Nwfi4GysLd22Z2ITWiKdwJtn-mHWkNM754FQvGDzZVrBBj-W1v6VomAATHv56STMdDnGQm-VHQzuljmFVXCXeI0jh7csmus5D5pPpLUZvBHKgd_Kik_Tx3gF4aDvXBZbFsPNxWTnpVk_Dd0FYPNRQ5PBswXTlQwp-7csyLWJeYQ87HaOmnexT3BwR3H4d8SfwNDU_74_Cq-ORyqDsU4y5GIH1QEuebm8_GGXyFjrGK2X9Ynd213EXp72X0gtPAf7y_75K_KTZDU5__yUqLyYs7TdMzW7iySKpganUTMFFvFIIR1fLVE-AtRexaUa3R-HiUimc6A0nXy0QXsfnBaUXh9ge97PbKO5amT7FO4fxdvs91G-IwQd8yhCNnKF8rOwLBNRLCjA52cYdGmbn_Fp41-R3rx5b9SH0-QdzF8SlJVY8nBb4-gZXUyTpsFJ3LX2PmLTzgv1EDQCElG3TtKhGG_Xd0HOO_UfV_GanUqeYxWogCQGImmp_sQmpzGZiCETFoVz2kUco4rqzyj37vOJIYHwvFEVYvugDQNfYIxPhVefyWFGGHY_pObCIQGE4S-D4cIgeN1MpIjeQdvywUai4MRxN75_AGxoEPRHRqgZIpNJtQylmlH3xRu2LKzBocxKbwiWgFFNQYANpXRw7ydfOQ60oI23h4nnG9Mr2JKZYcn3nRygcaJgijk_FiwvZEWERz8RtBzDXIOPEfvSrfRwUYKdN4rJ3BUeZLxwzSGy6mvKP3e5wrNavOuw7L8cCTZajjcqL850uXCIyelQXFwCcqTWlZvsVJEambbIoWVDlfDNTn041pWrRYdezFNUOd3j-z1GWNn_lCfY42170Z6lP7h1xLE49v_Aa_1Jaxp0SmMoPrwPo06oKNmKMAAQECAgCHAAECBQYICYYAAQUHChBEETN3qlgwg4YH_yyNyyoHQO8Twsh0GO-1dVkkMjKmna8eKU3Qkq-DOtTfHpngA0xze5MpFvN4Fw"
  }
}

B. 謝辞

この節は非規範的です。

この仕様に関する作業は、Christopher Allen、Shannon Appelcline、Kiara Robles、 Brian Weller、Betty Dhamers、Kaliya Young、Manu Sporny、Drummond Reed、Joe Andrieu、Heather Vescent、Kim Hamilton Duffy、Samantha Chase、Andrew Hughes、 Erica Connell、Shigeya Suzuki、および Zaïda Rivai が支援する Rebooting the Web of Trust コミュニティによって支援されました。Phil Windley、Kaliya Young、Doc Searls、および Heidi Nobantu Saul が支援する Internet Identity Workshop の参加者も、この 仕様について学び、議論し、改善することを目的とした多数の ワーキングセッションを通じて、この作業の洗練を支援しました。

ワーキンググループはまた、議長の Brent Zundel、前議長の Kristina Yasuda、および W3C スタッフ連絡担当の Ivan Herman に対して、 W3C 標準化 プロセスを通じてグループを専門的に管理し、着実に導いてくださったことに 感謝します。

この仕様に関する作業の一部は、米国 国土安全保障省科学技術局により、 契約 70RSAT20T00000003、70RSAT20T00000029、70RSAT20T00000033、 70RSAT21T00000016、70RSAT23T00000005、70RSAT20T00000010/P00001、 70RSAT20T00000029、70RSAT21T00000016/P00001、70RSAT23T00000005、 70RSAT23C00000030、70RSAT23R00000006、70RSAT24T00000011 の下で、また National Science Foundation により NSF 22-572 を通じて資金提供を受けました。この仕様の内容は必ずしも 米国政府の立場または方針を 反映するものではなく、公式な 承認を意味するものと解釈してはなりません。

ワーキンググループは、仕様をレビューし フィードバックを提供してくださった以下の方々にも感謝します(アルファベット順):

Will Abramson, Mahmoud Alkhraishi, Christopher Allen, Joe Andrieu, Bohdan Andriyiv, Anthony, George Aristy, Hadley Beeman, Greg Bernstein, Bob420, Sarven Capadisli, Melvin Carvalho, David Chadwick, Matt Collier, Gabe Cohen, Sebastian Crane, Kyle Den Hartog, Veikko Eeva, Eric Elliott, Raphael Flechtner, Julien Fraichot, Benjamin Goering, Kim Hamilton Duffy, Joseph Heenan, Helge, Ivan Herman, Michael Herman, Anil John, Andrew Jones, Michael B. Jones, Rieks Joosten, Gregory K, Gregg Kellogg, Filip Kolarik, David I. Lehn, Charles E. Lehner, Christine Lemmer-Webber, Eric Lim, Dave Longley, Tobias Looker, Jer Miller, nightpool, Luis Osta, Nate Otto, George J. Padayatti, Addison Phillips, Mike Prorock, Brian Richter, Anders Rundgren, Eugeniu Rusu, Markus Sabadello, silverpill, Wesley Smith, Manu Sporny, Patrick St-Louis, Orie Steele, Henry Story, Oliver Terbu, Ted Thibodeau Jr, John Toohey, Bert Van Nuffelen, Mike Varley, Snorre Lothar von Gohren Edwin, Jeffrey Yasskin, Kristina Yasuda, Benjamin Young, Dmitri Zagidulin, および Brent Zundel。

C. 参考文献

C.1 規範的参考文献

[CFRG-BBS-SIGNATURE]
BBS 署名方式. Tobias Looker; Vasilis Kalos; Andrew Whitehead; Mike Lodder. 草案. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-signatures-05.html
[CFRG-Blind-BBS-Signature]
ブラインド BBS 署名. V. Kalos; G. Bernstein. 2025. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-proof-generation
[CFRG-Pseudonym-BBS-Signature]
検証者ごとの BBS リンク可能性. V. Kalos. 2024. URL: https://www.ietf.org/archive/id/draft-kalos-bbs-per-verifier-linkability-00.html
[CID]
制御識別子 v1.0. Michael Jones; Manu Sporny. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/cid-1.0/
[INFRA]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[RDF-CANON]
RDF データセット正規化. Gregg Kellogg; Dave Longley; Dan Yamamoto. W3C. 2024年5月21日. W3C 勧告. URL: https://www.w3.org/TR/rdf-canon/
[RFC2119]
要件レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧性. B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC8949]
簡潔なバイナリオブジェクト表現 (CBOR). C. Bormann; P. Hoffman. IETF. 2020年12月. インターネット標準. URL: https://www.rfc-editor.org/info/rfc8949/
[VC-DATA-INTEGRITY]
検証可能な資格情報データ完全性 1.0. Ivan Herman; Manu Sporny; Ted Thibodeau Jr; Dave Longley; Greg Bernstein. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-data-integrity/
[VC-DATA-INTEGRITY-1.1]
検証可能なクレデンシャルのデータ完全性 1.1. Ivan Herman; Manu Sporny; Ted Thibodeau Jr; Dave Longley; Greg Bernstein. W3C. 2026年4月16日. FPWD. URL: https://www.w3.org/TR/vc-data-integrity-1.1/
[VC-DATA-MODEL-2.0]
検証可能な資格情報データモデル v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-data-model-2.0/

C.2 参考情報文献

[CDL2016]
強 Diffie Hellman 仮定を用いた匿名認証の再検討. Jan Camenisch; Manu Drijvers; Anja Lehmann. Cryptology ePrint Archive, 論文 2016/663. 2016. URL: https://eprint.iacr.org/2016/663
[CFRG-PAIRING-FRIENDLY]
ペアリングフレンドリー 曲線. Yumi Sakemi; Tetsutaro Kobayashi; Tsunekazu Saito; Riad S. Wahby. 草案. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-pairing-friendly-curves-11.html
[DI-ECDSA]
楕円曲線デジタル署名アルゴリズム 暗号スイート v1.0. David Longley; Manu Sporny; Marty Reed. W3C 検証可能な クレデンシャル作業部会. W3C 作業草案. URL: https://www.w3.org/TR/vc-di-ecdsa/
[NISTIR8053]
NISTIR 8053: 個人情報の非識別化. Simson L. Garfinkel. 2015年10月. URL: https://nvlpubs.nist.gov/nistpubs/ir/2015/NIST.IR.8053.pdf
[Powar2023]
SoK: データプライバシーに対する リンク攻撃リスクの管理. J. Powar; A. R. Beresford. プライバシー強化技術会議録. 2023. URL: https://petsymposium.org/popets/2023/popets-2023-0043.php
[Pugliese2020]
ブラウザフィンガープリンティングの長期観測: ユーザーの追跡可能性と観点. G. Pugliese; C. Riess; F. Gassmann; Z. Benenson. プライバシー強化技術会議録. 2020. URL: https://petsymposium.org/popets/2020/popets-2020-0041.php
[Taming_EdDSAs]
多数の EdDSA を制御する. Konstantinos Chalkias; François Garillot; Valeria Nikolaenko. Cryptology ePrint Archive, 論文 2020/1244. 2020. URL: https://eprint.iacr.org/2020/1244
[TZ2023]
BBS 署名の再検討. Stefano Tessaro; Chenzhi Zhu. Cryptology ePrint Archive, 論文 2023/275. 2023. URL: https://eprint.iacr.org/2023/275
[vc-bitstring-status-list]
Bitstring ステータスリスト v1.0. Manu Sporny; Dave Longley; Mahmoud Alkhraishi; Michael Prorock. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/vc-bitstring-status-list/