Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様では、BBS 署名方式を使用してデジタル署名を生成する際に使用する データ完全性暗号スイートについて説明します。 この署名スイートは BBS 署名を利用して、選択的開示と リンク不可能な派生証明を提供します。
この節では、公開時点におけるこの 文書の位置付けについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、 W3C 標準および草案 索引で確認できます。
ワーキンググループは、この 仕様に対する実装フィードバックを積極的に求めています。候補勧告段階を終了するため、ワーキング グループは、仕様の必須および任意の 各機能について、少なくとも2つの独立した実装が存在することを要件として定めています。 適合性テストプロセスの詳細については、 実装報告に記載されているテストスイートを参照してください。
この文書は、検証可能な資格情報ワーキング グループによって、 勧告 トラックを使用した候補勧告草案として公開されました。
候補勧告としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。候補勧告草案には、 ワーキング グループが後続の 候補勧告スナップショットに含めることを意図している、以前の候補勧告からの変更が統合されています。
これは草案文書であり、いつでも他の 文書によって更新、置換、または廃止される可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連して行われた 特許開示の公開一覧を維持しており、 そのページには特許を開示するための 手順も含まれています。必須 クレームを含むと考える特許について実際の 知識を有する個人は、 必須クレーム に関する情報を、 W3C 特許ポリシーの第6節に従って開示しなければなりません。
この文書は、 2025年8月18日付 W3C プロセス文書に準拠します。
この仕様は、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 仕様の 用語節で定義されています。
非規範的と明記された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。
この文書におけるキーワード MAY、MUST、MUST NOT、OPTIONAL、REQUIRED、および SHOULD は、 ここに示すようにすべて 大文字で記述されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。
適合 証明とは、この仕様の規範的な記述に準拠する データモデルの具体的な表現です。具体的には、 この文書の 2. データモデルおよび3. アルゴリズム の各節にある関連するすべての規範的な記述を必ず適用しなければなりません。
適合プロセッサとは、 適合証明を生成または消費する、 ソフトウェアおよび/またはハードウェアとして実現された任意のアルゴリズムです。適合プロセッサは、 非適合文書が消費された場合にエラーを必ず生成しなければなりません。
この文書には JSON および JSON-LD データの例が含まれています。これらの例の一部は、
特定の部分を説明するインラインコメント(//)や、
例に関係のない情報が省略されていることを示す省略記号(...)などの機能を含むため、無効な JSON です。
実装者がこれらの例を有効な JSON または JSON-LD として扱う場合は、
そのような部分を削除する必要があります。
以下の節では、この仕様で使用されるデータモデルについて、 検証 メソッドおよびデータ完全性証明 形式に関して概説します。
これらの検証メソッドは、[VC-DATA-INTEGRITY-1.1] に準拠したデータ完全性証明を検証するために使用されます。 これらの証明は、[CFRG-BBS-SIGNATURE] に準拠する BLS12-381 暗号鍵素材を使用して生成されます。これらの 鍵タイプのエンコーディング形式を この節で示します。同等の暗号鍵素材を生成する可逆な暗号鍵変換 プロセスは、デジタル署名の処理中に使用してもよいものとします。
制御識別子 v1.0で定義されている Multikey 形式は、この仕様で定義される暗号 スイートの公開鍵を表現するために使用されます。
publicKeyMultibase プロパティは、G2 グループ内の
BLS12-381 381 ビット公開鍵の Multibase で符号化された Multikey 表現を表します。
検証方法の publicKeyMultibase 値は、
制御識別子
v1.0の
Multibase の節で定義されている
base-58-btc 接頭辞(z)で必ず
始まらなければなりません。その後に、
制御識別子
v1.0の Multikey の節で
定義されている Multibase で符号化された BLS12-381 381 ビット公開鍵値が続きます。
その他の符号化は決して許可してはなりません。
開発者は、秘密鍵の表現を誤って公開しないよう注意してください。
この仕様の実装は、publicKeyMultibase 値で
0xeb01 以外の Multicodec 値が使用された場合にエラーを発生させます。
{
"id": "https://example.com/issuer/123#key-0",
"type": "Multikey",
"controller": "https://example.com/issuer/123",
"publicKeyMultibase": "zUC7EK3ZakmukHhuncwkbySmomv3FmrkmS36E4Ks5rsb6VQSRpoCrx6
Hb8e2Nk6UvJFSdyw9NK1scFXJp21gNNYFjVWNgaqyGnkyhtagagCpQb5B7tagJu3HDbjQ8h
5ypoHjwBb"
}
{
"@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"
}]
}
証明には、 [VC-DATA-INTEGRITY] の 証明の節で指定されている属性が、 以下の制約とともに含まれます。
証明の verificationMethod プロパティは URL でなければなりません。
verificationMethod を参照解決した結果は、
値が Multikey に設定された type プロパティを含むオブジェクトで
なければなりません。
証明の type プロパティは
DataIntegrityProof でなければなりません。
証明の cryptosuite プロパティは
bbs-2023 でなければなりません。
証明の proofValue プロパティの値は、
[CFRG-BBS-SIGNATURE] に従って生成され、
3.
アルゴリズムの節にある手順に従って直列化および
符号化された BBS 署名または
BBS 証明でなければなりません。
以下のアルゴリズムでは、 BBS 署名スキーム [CFRG-BBS-SIGNATURE] を使用して検証可能なクレデンシャルを利用する方法について説明します。BBS 署名 スキームを使用する場合、SHA-256 バリアントを使用すべきです。
実装は、証明を追加または検証する際に、できるだけ早く検証メソッド情報を 取得してキャッシュすべきです。この節の関数に渡されるパラメーターは、検証 メソッドからの情報(公開鍵サイズなど)を使用して、暗号学的ハッシュアルゴリズムなどの 関数パラメーターを決定します。
RDF データセット正規化アルゴリズム [RDF-CANON] が使用される場合、 そのアルゴリズムの実装はデフォルトで データセットポイズニング を検出し、検出時に処理を中止します。
このアルゴリズムは、検証可能なクレデンシャルのデータ完全性 1.1 における 証明の追加および 証明の検証 関数で使用する暗号スイートを構成するために使用されます。このアルゴリズムはオプションオブジェクト (マップ options) を入力として受け取り、暗号スイート インスタンス (構造体 cryptosuite) を返します。
DataIntegrityProof と等しくない場合、
cryptosuite を返します。
bbs-2023 の場合、次を行います:
以下のアルゴリズムは、BBS 署名、HMAC 鍵、および必須ポインターを含む ベース証明値をシリアライズします。 必須入力は、ベース署名 bbsSignature、bbsHeader、 publicKey、HMAC 鍵 hmacKey、 mandatoryPointers の配列、featureOption、および featureOption の値によっては signer_nym_entropy 値です。 単一のベース証明文字列値が出力として生成されます。
"baseline" と等しい場合:
0xd9、0x5d、および 0x02 で始まる
バイト配列 proofValue を初期化します。
"anonymous_holder_binding" と等しい場合:
0xd9、0x5d、および 0x04 で始まる
バイト配列 proofValue を初期化します。
"pseudonym" と等しい場合:
0xd9、0x5d、および 0x06 で始まる
バイト配列 proofValue を初期化します。
"holder_binding_pseudonym" と等しい場合:
0xd9、0x5d、および 0x08 で始まる
バイト配列 proofValue を初期化します。
proofValue の multibase-base64url-no-pad-encoding
を持つ文字列として初期化します。すなわち、「u」で始まり、
proofValue の
base64url-no-pad-encoded 値で終わる文字列を返します。
以下のアルゴリズムは、bbs-2023 選択的
開示ベース証明値の構成要素を解析します。必須入力は証明値
(proofValue) です。「bbsSignature」、「bbsHeader」、
「publicKey」、
「hmacKey」、「mandatoryPointers」、「featureOption」、および任意でオプション機能
パラメーター「signer_nym_entropy」という名前を使用する、6 または 7 要素を含む
単一のオブジェクト解析済みベース証明が出力として生成されます。
proofValue 文字列が
u
(U+0075
LATIN SMALL LETTER U)
で始まらず、multibase-base64url-no-pad-encoded 値であることを示していない場合、
エラーを発生させなければならず、そのエラーは
PROOF_VERIFICATION_ERROR
というエラー型を伝達すべきです。
proofValue 内の先頭の u に続く
部分文字列を base64url-no-pad デコードした結果で初期化します。
0xd9、
0x5d、および 0x02 で始まる場合、
featureOption を "baseline" に設定します。
0xd9、
0x5d、および 0x04 で始まる場合、
featureOption を "anonymous_holder_binding" に設定します。
0xd9、
0x5d、および 0x06 で始まる場合、
featureOption を "pseudonym" に設定します。
0xd9、
0x5d、および 0x08 で始まる場合、
featureOption を "holder_binding_pseudonym" に設定します。
components を、3 バイトの BBS ベース証明ヘッダーに続く
バイトを CBOR デコードした結果である配列として初期化します。
"baseline" と等しい場合、
components に基づくオブジェクトのプロパティ名を
「bbsSignature」、「bbsHeader」、「publicKey」、「hmacKey」、
および「mandatoryPointers」の順に設定し、featureOption をプロパティとして追加します。
"anonymous_holder_binding" と等しい場合、
components に基づくオブジェクトのプロパティ名を
「bbsSignature」、「bbsHeader」、
「publicKey」、「hmacKey」、および「mandatoryPointers」の順に設定し、
featureOption をプロパティとして追加します。
"pseudonym" と等しい場合、
components に基づくオブジェクトのプロパティ名を
「bbsSignature」、「bbsHeader」、
「publicKey」、「hmacKey」、「mandatoryPointers」、および「signer_nym_entropy」の順に設定し、
featureOption をプロパティとして追加します。
"holder_binding_pseudonym" と等しい場合、
components に基づくオブジェクトのプロパティ名を
「bbsSignature」、「bbsHeader」、
「publicKey」、「hmacKey」、「mandatoryPointers」、および「signer_nym_entropy」の順に設定し、
featureOption をプロパティとして追加します。
以下のアルゴリズムは派生証明値をシリアライズします。必須入力は、 BBS 証明 (bbsProof)、ラベルマップ (labelMap)、 必須インデックスの配列 (mandatoryIndexes)、 選択インデックスの配列 (selectiveIndexes)、BBS プレゼンテーションヘッダー (presentationHeader)、featureOption インジケーター、および featureOption の値に応じて、nym_domain、pseudonym、 および/または lengthBBSMessages 値です。 バイト文字列としてシリアライズされた単一の派生証明 値が出力として生成されます。
compressedLabelMap を、
labelMap をパラメーターとして渡して、
節のアルゴリズムを呼び出した結果で初期化します。
"baseline" と等しい場合:
0xd9、0x5d、および
0x03 で始まるように初期化します。
"anonymous_holder_binding" と等しい場合:
0xd9、0x5d、および
0x05 で始まるように初期化します。
"pseudonym" と等しい場合:
0xd9、0x5d、および
0x07 で始まるように初期化します。
"holder_binding_pseudonym" と等しい場合:
0xd9、0x5d、および
0x09 で始まるように初期化します。
u」で始まり、proofValue の base64url-no-pad-encoded 値で終わる文字列を
返します。
以下のアルゴリズムは、派生証明値の構成要素を解析します。 必須入力は派生証明値 (proofValue) です。 「bbsProof」、 「labelMap」、「mandatoryIndexes」、「selectiveIndexes」、「presentationHeader」、 「featureOption」、および featureOption パラメーターの値に応じて 「nym_domain」、「pseudonym」、および/または「lengthBBSMessages」という名前を持つ 6 から 9 個の要素の集合を含む、単一の派生証明値オブジェクトが出力として生成されます。
proofValue 文字列が
u
(U+0075,
LATIN SMALL LETTER U) で始まらず、
multibase-base64url-no-pad-encoded 値であることを示していない場合、
エラーを発生させなければならず、そのエラーは
PROOF_VERIFICATION_ERROR
というエラー型を伝達すべきです。
proofValue 内の先頭の u に続く
部分文字列を base64url-no-pad デコードした結果で初期化します。
0xd9、
0x5d、および
0x03 で始まる場合、featureOption を "baseline" に設定します。
0xd9、
0x5d、および
0x05 で始まる場合、featureOption を
"anonymous_holder_binding" に設定します。
0xd9、
0x5d、および
0x07 で始まる場合、featureOption を "pseudonym" に設定します。
0xd9、
0x5d、および
0x09 で始まる場合、featureOption を
"holder_binding_pseudonym" に設定します。
components を、3 バイトの BBS 開示証明ヘッダーに続く
バイトを CBOR デコードした結果である配列として初期化します。その結果が
5、6、7、または 8 要素の配列でない場合、
エラーを発生させなければならず、そのエラーは
PROOF_VERIFICATION_ERROR
というエラー型を伝達すべきです。
components の第 2 要素を compressedLabelMap として渡して、
節のアルゴリズムを呼び出した結果を使用して、
components の第 2 要素を置き換えます。
bbs-2023 暗号スイートは入力文書を受け取り、
RDF データセット正規化アルゴリズム
[RDF-CANON] を使用して文書を正規化し、その後、
多数の変換および暗号操作を適用して
データ完全性証明を生成します。この節のアルゴリズムには、
そのようなデータ完全性証明の検証も含まれます。
以下のアルゴリズムは、セキュリティ保護されていないデータ 文書が与えられた場合に データ完全性 証明を作成する方法を規定します。必須入力は、 セキュリティ保護されていないデータ 文書 (マップ 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 入力を提供しなければなりません。
以下のアルゴリズムは、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
というエラー型を伝達すべきです。
バイト列として表される単一のデジタル証明値が
出力として生成されます。
proofHash、mandatoryPointers、mandatoryHash、
nonMandatory、
および hmacKey を、hashData 内でそれぞれのプロパティ名に関連付けられた
値で初期化します。
bbsHeader を、proofHash と
mandatoryHash をその順序で連結した値で
初期化します。
bbsMessages を、UTF-8 文字エンコーディングを使用してエンコードされた
nonMandatory 文字列配列の値を含むバイト配列の配列として初期化します。
bbsSignature を計算します。
"baseline" と等しい場合、
適切な鍵素材、header として bbsHeader、および
messages として bbsMessages
を使用して、[CFRG-BBS-Signature] の
Sign 手順を使用して bbsSignature を計算します。
"anonymous_holder_binding" と等しい場合、
適切な鍵素材、commitment_with_proof として commitment_with_proof、
header として bbsHeader、
および messages として bbsMessages
を使用して、[CFRG-Blind-BBS-Signature] の
BlindSign 手順を使用して
bbsSignature を計算します。これにより、
匿名保有者バインディング機能が提供されます。
"pseudonym" または
"holder_binding_pseudonym" と等しい場合、
発行者は signer_nym_entropy の暗号学的にランダムな値を生成し、
適切な鍵素材、
header として bbsHeader、
messages として bbsMessages、
commitment_with_proof として commitment_with_proof、および
signer_nym_entropy 値を使用して、
[CFRG-Pseudonym-BBS-Signature]
の
「ブラインド発行」操作を使用して
bbsSignature を計算します。
発行者が将来、この保有者に同じ nym_secret にバインドされた
クレデンシャルを再発行する必要が生じる可能性がある場合、
signer_nym_entropy 値を保持すべきです。それ以外の場合、この値は破棄できます。
publicKey は、[CFRG-BBS-SIGNATURE]
に従ってエンコードされた
公開鍵のバイト配列です。
proofValue をデジタル証明として返します。
以下のアルゴリズムは、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_nym と proverBlind、および
保有者によって設定されるか検証者から保有者に伝達される nym_dofmain です。
背景情報についてはクレデンシャルバインド仮名を
参照してください。
featureOption が "holder_binding_pseudonym" と等しい場合、必須の
追加入力は、すべて保有者が知っている holder_secret、prover_nym、および proverBlind、
ならびに保有者によって設定されるか
検証者から保有者に伝達される nym_dofmain です。
背景情報については保有者バインディングと仮名を
参照してください。
以下のアルゴリズムは派生証明を生成します。 入力は proofData および disclosureData オブジェクトです。
"baseline" と等しい場合、
[CFRG-BBS-SIGNATURE] の
ProofGen 手順によって計算された値を bbsProof に設定します。すなわち、
ProofGen(PK, signature, header, ph, messages, disclosed_indexes) であり、
PK は元の発行者の公開鍵、signature は
bbsSignature、header は bbsHeader、
ph は presentationHeader、
messages は bbsMessages、disclosed_indexes は
selectiveIndexes です。
"anonymous_holder_binding" と等しい場合、
[CFRG-Blind-BBS-Signature] の
BlindProofGen 手順によって計算された値を bbsProof に設定します。ここで、
PK は元の発行者の公開鍵、
signature は
bbsSignature、header は bbsHeader、ph は
presentationHeader、
messages は bbsMessages、disclosed_indexes は
selectiveIndexes、
および commitment_with_proof です。保有者はさらに、
holder_secret と、commitment_with_proof の計算に使用された
proverBlind を提供します。これは
匿名保有者バインディング機能オプションです。
IETF API が確定した時点で
更新されます。
"pseudonym" と等しい場合、
[CFRG-Pseudonym-BBS-Signature]
の「検証と確定」操作を
空の committed_messages 配列とともに使用して、
bbsSignature の検証と
nym_secret 値の計算の両方を行います。この操作は prover_nym、
signer_nym_entropy、および secret_prover_blind を使用します。
"holder_binding_pseudonym" と等しい場合、
[CFRG-Pseudonym-BBS-Signature]
の「検証と確定」操作を、
holder_secret のみを値として含む
committed_messages 配列とともに使用して、
bbsSignature の検証と
nym_secret 値の計算の両方を行います。この操作は prover_nym、
signer_nym_entropy、および secret_prover_blind を使用します。
"anonymous_holder_binding"、
"pseudonym"、または "holder_binding_pseudonym" と等しい場合、
lengthBBSMessages
パラメーターを bbsMessages 配列の長さに設定します。
以下のアルゴリズムは、セキュリティ保護されたデータ 文書が与えられた場合に、 データ完全性 証明を検証する方法を規定します。必須入力は セキュリティ保護されたデータ 文書 (マップ securedDocument) です。このアルゴリズムは 検証結果を返します。これは構造体であり、その 項目は次のとおりです:
true または falsefalse の場合は Null、それ以外の場合は
セキュリティ保護されていない
データ文書
派生証明を検証するには、次の手順を実行します:
proof
値を削除した document のコピーとします。
"baseline" と等しい場合、
[CFRG-BBS-SIGNATURE] の
検証アルゴリズム ProofVerify(PK, proof, header, ph,
disclosed_messages, disclosed_indexes) を適用した結果で
verified を初期化します。このとき、
PK を元の発行者の公開鍵に、
proof を bbsProof に、
header を bbsHeader に、
disclosed_messages を
disclosedMessages に、ph を
presentationHeader に、disclosed_indexes を
selectiveIndexes に設定します。
"anonymous_holder_binding" と等しい場合、
"L" パラメーターに lengthBBSMessages を使用して、
[CFRG-Blind-BBS-Signature] の
ProofVerify 検証アルゴリズムを
適用した結果で verified を初期化します。
IETF API が確定した時点で更新されます。
"pseudonym" または
"holder_binding_pseudonym" と等しい場合、
"L" パラメーターに lengthBBSMessages を使用し、
空の committed_messages 配列を使用して、
[CFRG-Pseudonym-BBS-Signature]
の「仮名付き証明検証」操作を
適用した結果で verified
を初期化します。
IETF
API が確定した時点で更新されます。
true の場合は unsecuredDocument、それ以外の場合は
Null
この節は非規範的です。
BBS 署名の暗号学的特性により、高度な機能を サポートできるバリアントが可能になります。この仕様では、 これらの拡張のうち最も関連性の高いもののみをサポートし、それらについて 以下の節で説明します。変数 commitment_with_proof、holder_secret、 prover_nym、signer_nym_entropy、および pseudonym は、これらの 機能に関連付けられており、BBS 署名および証明ではそれ以外に必要ありません。
この節で説明され、この仕様の アルゴリズムに含まれている任意の BBS 機能は削除される可能性があり、それぞれの仕様が IETF で同じ期間内に RFC ステータスに到達しない場合、または各任意 機能について少なくとも2つの独立した実装が 存在しない場合、この仕様の最終化前に削除されます。
この機能は発行時に、基本証明を持つ文書を、 所有者だけが知る秘密に結び付け、その所有者だけが、 検証に成功する派生証明付きの開示文書を生成できるようにします。たとえば、 攻撃者が基本証明付きの文書を取得したとしても、検証可能な派生証明付きの 開示文書を作成することはできません。
この機能を提供するため、所有者は 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] の「証明検証」操作を使用します。
この文書で規定する 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 が生成され、所有者によって使用されます。
資格情報に結び付けられた仮名の作成と使用の概要を 以下の手順に示します。
Commitment」操作を使用し、
commitment_with_proof と secret_prover_blind を計算します。所有者は、
資格情報の要求とともに commitment_with_proof を発行者へ送信しますが、
prover_nym と secret_prover_blind は決して開示せず、後で使用するため保持します。
"pseudonym" に等しい)を、
commitment_with_proof とともに受け取ります。
発行者は
signer_nym_entropy のための暗号学的にランダムな値を生成し、
[CFRG-Pseudonym-BBS-Signature] の「ブラインド発行」操作を使用して
基本証明を生成します。その他の
情報とともに、基本証明には signer_nym_entropy 値が含まれます。
発行者が将来、この所有者に同じ nym_secret に結び付けられた
資格情報を再発行する必要が生じる可能性がある場合は、
signer_nym_entropy 値を保持することが推奨されます。
それ以外の場合、この値は破棄できます。
匿名所有者バインディングと資格情報に結び付けられた仮名は、ある意味では
互いに直交する機能であり、所有者および資格情報エコシステムは両方を
同時に使用したい場合があります。たとえば、所有者は検証可能な
資格情報を holder_secret に結び付け、この値を知る所有者だけが
基本証明から派生証明を生成できるようにし、さらに nym_secret を
基本証明に結び付けて、仮名を派生証明に結び付けられるようにする場合があります。これは、
featureOption が "holder_binding_pseudonym" に等しい場合に対応します。
匿名所有者バインディングと 資格情報に結び付けられた仮名の両方の作成と使用の概要を、以下の手順に示します。
"pseudonym" に等しく、要求には
commitment_with_proof が含まれます。
発行者はこの仕様の手順を使用して、
signer_nym_entropy のための暗号学的にランダムな値を生成し、
[CFRG-Pseudonym-BBS-Signature] の
「ブラインド発行」操作を使用して
基本証明を生成します。その他の情報とともに、基本証明には
signer_nym_entropy 値が含まれます。発行者が将来、
この所有者に同じ nym_secret に結び付けられた資格情報を再発行する必要がある場合は、
signer_nym_entropy 値を保持することが推奨されます。それ以外の場合、この値は破棄できます。
この節は非規範的です。
この節では、「baseline」BBS 証明および 任意機能について、入力、出力、証明の直列化、 タスク、手順の概要を示します。baseline BBS とは、追加機能のない BBS 基本証明および派生証明を 意味します。すべての任意機能は、 「baseline」BBS 署名/証明のものに加えて 何らかの追加入力、タスク、または出力が生成されるという意味で「加算的」です。
| 名前 | タスク | 入力 | 署名アルゴリズム |
|---|---|---|---|
| ベースライン 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 |
| 名前 | 証明ヘッダーバイト | 直列化された出力 |
|---|---|---|
| ベースライン 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 |
| 名前 | タスク | 入力 | 証明生成アルゴリズム |
|---|---|---|---|
| ベースライン 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 |
| 名前 | 証明ヘッダーバイト | 直列化された出力 |
|---|---|---|
| ベースライン 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 |
| 名前 | 入力 | 証明検証アルゴリズム |
|---|---|---|
| BBS ベースライン | baseline: (派生証明の直列化から) bbsProof, compressedLabelMap, mandatoryIndexes, selectiveIndexes, presentationHeader | BBS |
| 匿名所有者バインディング | baseline | ブラインド BBS |
| 資格情報に結び付けられた仮名 | baseline + pseudonym(派生証明に含まれる), nym_domain | 仮名 BBS |
| 所有者バインディングと仮名 | baseline + pseudonym(派生証明に含まれる), nym_domain | 仮名 BBS |
この節を読む前に、読者は Data Integrity 仕様のセキュリティに関する考慮事項の節で提供されている 一般的なセキュリティ上の助言を理解しておくことが強く推奨されます。
この節は非規範的です。
基本証明のセキュリティは、関連付けられた BBS 署名のセキュリティ特性に依存します。デジタル署名には、 多数の望ましい暗号学的特性 [Taming_EdDSAs] があり、その中には 次のものがあります:
EUF-CMA(選択メッセージ攻撃下での存在的偽造不可能性)は通常、 署名方式に要求される最小限のセキュリティ特性です。これは、署名者の 公開鍵 を持ち、自身が選択したメッセージに対する任意の数の署名を (適応的に)受け取った効率的な攻撃者: が、新しいメッセージに対して有効な署名 を出力できないことを保証します。 (無視できる確率を除く)。攻撃者が新しいメッセージに対して有効な 署名を出力した場合: , これは存在的偽造と呼ばれます。
SUF-CMA(選択メッセージ攻撃下での強い偽造不可能性)は、 EUF-CMA よりも強い概念です。これは、署名者の公開鍵 を持ち、自身が選択したメッセージに対する任意の数の署名を受け取った 任意の効率的な攻撃者: が、新しい有効な署名ペア を出力できないことを保証します。ここで です(無視できる確率を除く)。強い偽造不可能性は、 攻撃者が新しいメッセージに署名できないだけでなく、古いメッセージに対して 新しい署名を見つけることもできないことを意味します。
[CDL2016] では、 いくつかの妥当な仮定の下で、BBS 署名が EUF-CMA であることが証明されています。さらに、[TZ2023] では、同様の仮定の下で BBS 署名が SUF-CMA であることが証明されています。どちらの場合も、仮定は 離散対数問題の困難性に関連しており、これは大規模な量子 コンピューティングに対して安全とはみなされません。
非量子コンピューティング環境下では、[CFRG-BBS-SIGNATURE] は BBS 署名スイートの実装者に追加のセキュリティガイドラインを 提供しています。ペアリングフレンドリー曲線に関連するさらなる セキュリティ上の考慮事項は、 [CFRG-PAIRING-FRIENDLY] で説明されています。
この節は非規範的です。
派生証明のセキュリティは、関連付けられた
BBS 証明のセキュリティ特性に依存します。[CDL2016]
と [TZ2023] の両方で、
BBS 証明はBBS
署名を知っていることのゼロ知識証明
であることが証明されています。
[CFRG-BBS-SIGNATURE] で説明されているように、これは次を意味します:
証明を受け取った検証側は、その証明の生成にどの署名が 使用されたかを判断できず、一般的な相関の原因が排除されます。一般に、 同じ署名から生成された2つの証明であっても、 生成された各証明はランダムと区別できません。
および
この方式によって生成される証明は、証明を生成した当事者 (所有者/証明者、またはその代理人)が署名を所有していたことを、 その署名を明らかにすることなく検証者に証明します。
より正確には、BBS 証明の検証には、元の 発行者の公開鍵と、適切な順序のまま変更されていない開示済み BBS メッセージが必要です。
この節は非規範的です。
選択的開示により、所有者は特定の目的を達成するために 検証者へ開示する情報を最小化できます。選択的開示を可能にする システム全体を規定する際には、 検証者へ開示することを意図していない追加情報が最小限になるよう注意する必要があります。 このような漏洩はシステムのアーティファクトを通じて発生する可能性があります。 このようなアーティファクトは、データ構造などのシステム上位層や、 下位レベルの暗号プリミティブから生じることがあります。
たとえば、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)についての情報だけを 開示した場合でも、検証者はセイル集合について何かが変わったこと、 すなわち情報漏洩を判断できる可能性があります。
{
"@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 の内容に依存し、
これはステートメントの順序にも影響します。
_: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 の割り当てを通じてステートメントの順序が変化します。
{
"@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 の 割り当てとステートメントの順序の違いに注意してください。
_: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 を適用して生成される事実上一意の識別子を介した
リンク攻撃を防止します。
VC の一部の用途では、複数の異なる検証者との やり取りが追跡またはリンクされることを防止することが、 所有者のプライバシーにとって重要な場合があります。特に、 2つの重要なケース、(i) 検証者と発行者の共謀、および (ii) 検証者同士の共謀を考えます。第1のケースは 図 1に示すように、検証者が 所有者とのやり取りについて、資格情報の元の 発行者へ報告するものです。この状況では、発行者は 発行した VC を使用して、所有者とさまざまな検証者との すべてのやり取りを追跡できる可能性があります。第2の 状況は、図 2に示すように、複数の 検証者が共謀して、やり取りした 所有者に関する情報を共有するものです。
VC システムが所有者のプライバシーに対するこのような「リンク攻撃」を
防止する特性を表すために、リンク不可能性という用語を使用します。
リンク不可能性という用語自体は比較的新しいものですが、
[NISTIR8053] の3.3節では、
リンク攻撃による再識別
について説明し、
ケーススタディを提示しています。データプライバシーに対するリンク攻撃
についての
知識の体系化は、
[Powar2023] にあります。
ユーザープライバシーに対するリンク攻撃の最も広範な利用は、
Web ブラウザフィンガープリンティングという手法を通じて行われており、その調査は
[Pugliese2020]
にあります。
リンクの概念を定量化するため、[Powar2023] では 匿名集合という考え方を導入しています。ここで扱う VC の場合、 匿名集合には、特定の VC の所有者と、 特定の発行者に関連するその他の所有者が含まれます。匿名 集合が小さいほど、所有者が複数の検証者をまたいで追跡される可能性が高くなります。 署名済み VC には発行者の公開鍵への参照が含まれるため、 特定の発行者から VC を所有する所有者についての 匿名集合の初期サイズは、その発行者がその特定の公開鍵/秘密鍵ペアを使用して 発行した VC の数です。 悪意のない発行者は、VC の発行に使用する公開鍵/秘密鍵 ペアの数を最小限にすることが期待されます。匿名集合という考え方は、 [vc-bitstring-status-list] の グループプライバシーの概念と類似していることに注意してください。ここでリンクという用語を使用する場合、 一般に匿名集合のサイズを減少させる任意の仕組みを意味します。
選択的開示をサポートする VC システムにおけるリンクの原因:
以下でそれぞれについて説明します。
暗号学的ハッシュ、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
証明(派生証明)で参照されるため、発行者が
多数の異なる公開鍵を持ち、特にその鍵の一部を
少数のユーザー(所有者)に使用している場合、
これをリンクポイントとして利用できます。
情報漏洩に関する節で見たように、RDF 正規化は
ハッシュ関数を使用してステートメントを順序付け、さらに HMAC に基づいて
ステートメントの順序をシャッフル
します。これにより、
何らかのリンクを可能にするフィンガープリントが残る可能性があります。
リンクの強さは、VC 内の空白ノード、すなわち本質的には JSON オブジェクトの数と、
開示されるインデックスの数に依存します。n 個の空白ノードと
k 個の開示インデックスがある場合、最悪の場合、
匿名集合のサイズは C(n, k)、すなわち n 個の要素の集合から
k 個を選ぶ組合せの数の倍率だけ減少します。
VC 内の空白ノードの数を減らす、たとえば VC を短く
単純に保つことで、この数をかなり小さく抑えることができます。
JSON-LD は、リンクトデータを直列化するための JSON ベースの形式です。そのため、
文書内の各オブジェクト(JSON-LD の用語では「ノード」)に
グローバルに曖昧さのない @id 属性(ノード識別子)を割り当てることをサポートします。
これによりリンクトデータのリンク
が可能になり、
同じ主体に関する情報を相関させることができます。
この相関は、ユースケースに応じて望ましい場合も望ましくない場合もあります。
リンク不可能性機能のために BBS を使用する場合、グローバルに曖昧さのないノード
識別子は、強いリンクを提供することが望ましくないため、
個人やその個人を特定可能な情報には使用できません。
このような識別子は、非個人情報についてのステートメントを表現する場合
(たとえば、大きな国やコンサートイベントを識別するためにグローバルに曖昧さのない識別子を使用する場合)
には使用可能であることに注意してください。また、用語を IRI に
マッピングする JSON-LD の @context の使用は、一般にリンク不可能性へ影響しないことにも注意してください。
[VC-DATA-INTEGRITY-1.1]
仕様では、VC の
proof 属性の多数のプロパティが示されています。オプションフィールドが
検証者間で強いリンク可能性を提供しないよう注意する必要があります。オプションフィールドには、
id、created、expires、domain、
challenge、および nonce が含まれます。たとえば、オプションの
created フィールドは dateTimeStamp オブジェクトであり、証明の
作成日時を任意の秒未満の粒度まで指定できます。このような
情報が存在する場合、匿名集合のサイズを大幅に縮小する可能性があります。
発行者がこのような情報を含めたい場合は、時間の経過とともに発行される VC の数に応じて、
可能な限り粗い粒度にするべきです。
発行者は、ベース証明の作成時に使用される
mandatoryPointers 入力を介して、特定の文を検証者に開示するよう
保有者に強制することもできます。次の節を参照してください:
例 9、および
例 10。ここで
強制する
とは、
これらの文が検証者に開示されない限り、生成された派生証明が検証に成功しないことを
意味します。このような情報の開示が
必須である場合でも、匿名集合が十分に大きい状態を維持するよう注意するべきです。
[Powar2023] で説明されているように、 リンク攻撃から個人が再識別された事例が多数記録されています。 したがって、匿名集合を大きく保つため、 所有者はできるだけ少ない情報を開示することが強く推奨されます。 さらに、一見無害な情報でも非常に一意性が高く、 再識別や追跡につながる可能性があることが何度も示されています。 マサチューセッツ州の元知事に関する特に有名な事例の詳しい説明については [NISTIR8053] を参照し、 このような公開事例94件のさらなる分析と分類については [Powar2023] を 参照してください。
リンク不可能性、すなわち匿名性を維持するには、 VC を保持し通信するシステムにおいて注意が必要であることを指摘しておくべきです。 IP アドレス(レイヤー3)や Ethernet/MAC アドレス(レイヤー2)などの ネットワークアーティファクトは、よく知られたリンクの原因です。たとえば、 携帯電話の MAC アドレスは、ユーザーが特定のアクセスポイントを再訪した場合に そのユーザーを追跡するために利用できます。このことから、 携帯電話メーカーは MAC アドレスのランダム化機能を提供するようになりました。 公開 IP アドレスは一般に、個人を国内の都市または地域まで 地理的位置特定するのに十分な情報を提供し、匿名集合を 大幅に縮小する可能性があります。
この節は非規範的です。
文書のテスト ベクトルは完全に架空の永住者カードに基づいており、2つのグループ、すなわち 発行者によって生成されるもの(「基本証明」)と、所有者によって 生成されるもの(「派生証明」)に分けられています。
文書に選択的開示の基本証明を追加するには、発行者は 次の暗号鍵素材を必要とします:
基本証明の追加をテストするためのテストベクトル生成に使用される鍵素材を 以下に示します。BBS 鍵 ペアおよび HMAC 鍵には16進表現が使用されます。
{
"publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
"hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}
このシナリオでは、永住者資格情報が発行されます。署名されていない 永住者文書を以下に示します。
{
"@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 ポインタの配列を介して 指定されます。
["/issuer"]
上記の JSON ポインタを文書に適用した結果を 以下に示します。
[
{
"pointer": "/issuer",
"value": {
"id": "did:key:zDnaeTHxNEBZoKaEo6PdA83fq98ebiFvo3X273Ydu4YmV96rg",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2P4z/DiPwAG0ALnwgz64QAAAABJRU5ErkJggg=="
}
}
]
署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。
[ "<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 文書が得られます。これは、「必須」および「選択的」 (または「非必須」)開示の対象となるステートメントの順序付きリストを表します。すなわち、 これらのステートメントを開示要件に基づいてグループ化した場合でも、 このリスト内の順序が維持されます。
[ "<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" ]
上記の正規文書のリストは、必須ステートメントと 非必須ステートメントにグループ化されます。選択的開示 変換処理の最終出力を以下に示します。ステートメントは 必須または非必須の開示としてグループ化され、各ステートメントの 前のリスト内のインデックスが保持されていることに注意してください。
{
"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つの例に示されています。
{
"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"
]
}
_: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進形式で示します。
{
"proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
"mandatoryHash": "8e7cc22c318dd2094e02d0bf06c5d73a5dba717611a40f6d1bedc5ea7c300fd6"
}
以下に、計算された bbsSignature の16進表現と
mandatoryPointers を示します。これらは hmacKey とともに
最終的な直列化ステップに入力されます。
{
"bbsSignature": "86168dd2b5d0c7c6a56a30f4212ed116a53def05d0d6708207d483c7ff2053aefa22d24ba7659d60852694f8d85be0fa2adc3974c7dc4cc68b3db17b2423975047104162c24502b41591879ac24f1bb1",
"mandatoryPointers": [
"/issuer"
]
}
最後に、上記の値を第
3.2.1
serializeBaseProofValue節のアルゴリズムで処理し、
以下に示す署名済み基本文書で使用される proofValue を生成します。
{
"@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"
}
}
BBS 証明
の作成には乱数が使用され、任意の
presentationHeader を追加入力として使用できます。
決定論的なテストベクトル一式を提供するため、[CFRG-BBS-SIGNATURE] の
Mocked Random Scalars
手順を使用しました。派生証明テストベクトルの生成に使用した
seed および presentationHeader の値を
以下に16進形式で示します。
{
"presentationHeaderHex": "113377aa",
"pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}
派生証明を作成するため、所有者は基本証明を含む署名済み文書から
開始します。これらのテストベクトルに使用する基本文書は、
上記の第A.1.1
基本証明節の最後の例です。最初の
ステップでは、第3.2.2
parseBaseProofValue節のアルゴリズムを実行して、
以下に示すように bbsSignature、hmacKey、および
mandatoryPointers を復元します。
{
"bbsSignature": "86168dd2b5d0c7c6a56a30f4212ed116a53def05d0d6708207d483c7ff2053aefa22d24ba7659d60852694f8d85be0fa2adc3974c7dc4cc68b3db17b2423975047104162c24502b41591879ac24f1bb1",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer"
]
}
次に、所有者は選択的開示用の JSON ポインタを指定することで、 どの非必須ステートメントを検証者へ開示したいかを示す必要があります。 これを以下に示します。
["/validFrom", "/validUntil", "/credentialSubject/birthCountry"]
revealDocument(すなわち、最終的に署名され、
検証者へ送信される署名前の文書)を生成するため、
選択的ポインタを必須ポインタに追加し、これらの結合ポインタを
証明を除いた文書とともに [DI-ECDSA] の
selectJsonLd アルゴリズムへ入力します。
その結果を以下に示します。
{
"@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 を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。
{"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 に対する相対位置)として提供します。一方、
selectiveIndexes は nonMandatoryIndexes 内の位置に
相対的に調整されます。これらの「調整済み」インデックスを
以下に示します。
{"adjMandatoryIndexes":[0,4,5,7],"adjSelectiveIndexes":[0,1,7,17,18,19]}
開示データの最後の重要な要素は labelMap であり、これは
正規化された空白ノード ID から HMAC ベースでシャッフルされた ID へのマッピングで、
§ 4.4.3 CreateDisclosureData に従って計算されます。これは
以下に、開示文書を除く
残りの開示データとともに示されています。
{"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 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。
{
"@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"
}
}
必須開示、 選択的開示、およびそれらの重複を含む選択的開示機能を実証するには、 以前のテストベクトルよりも多くの内容を持つ入力資格情報文書が必要です。 テストベクトルが過度に長くなることを避けるため、開始文書のテスト ベクトルは完全に架空のウィンドサーフィン(セーリング)競技 シナリオに基づいています。また、テストベクトルを2つのグループ、すなわち 発行者によって生成されるもの(基本証明)と、所有者によって 生成されるもの(派生証明)に分けています。
文書に選択的開示の基本証明を追加するには、発行者は 次の暗号鍵素材を必要とします:
基本証明の追加をテストするためのテストベクトル生成に使用される鍵素材を 以下に示します。BBS 鍵 ペアおよび HMAC 鍵には16進表現が使用されます。
{
"publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
"hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}
このシナリオでは、あるセーラーが、マウイ島で数日にわたって開催される一連の ウィンドサーフィンレースに参加するため、レース主催者に登録しています。主催者は セーラーの用具を検査し、申告内容が 正確であることを認証します。セーラーの署名されていない用具一覧を以下に示します。
{
"@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 ポインタの配列を介して 指定されます。
["/issuer", "/credentialSubject/sailNumber", "/credentialSubject/sails/1", "/credentialSubject/boards/0/year", "/credentialSubject/sails/2"]
上記の 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
}
}
]
署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。
[ "_: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 文書が得られます。これは必須および選択的開示の対象となる ステートメントの順序付きリストを表します。すなわち、ステートメントはこのリストから グループ化されます。
[ "_: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" ]
上記の正規文書は、必須ステートメントと非必須 ステートメントにグループ化されます。選択的開示変換処理の最終出力を 以下に示します。各ステートメントは必須または非必須としてグループ化され、 前のステートメントリスト内のインデックスが保持されます。
{
"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つの例に示されています。
{
"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#"
}
]
}
_: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進形式で
示します。
{
"proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
"mandatoryHash": "555de05f898817e31301bac187d0c3ff2b03e2cbdb4adb4d568c17de961f9a18"
}
以下に、計算された bbsSignature の16進表現と
mandatoryPointers を示します。これらは hmacKey とともに
最終的な直列化ステップに入力されます。
{
"bbsSignature": "8331f55ad458fe5c322420b2cb806f9a20ea6b2b8a29d51710026d71ace5da080064b488818efc75a439525bd031450822a6a332da781926e19360b90166431124efcf3d060fbc750c6122c714c07f71",
"mandatoryPointers": [
"/issuer",
"/credentialSubject/sailNumber",
"/credentialSubject/sails/1",
"/credentialSubject/boards/0/year",
"/credentialSubject/sails/2"
]
}
最後に、上記の値を第
3.2.1
serializeBaseProofValue節のアルゴリズムで処理し、
以下に示す署名済み基本文書で使用される proofValue を生成します。
{
"@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"
}
}
BBS 証明
の作成には乱数が使用され、任意の presentationHeader を
入力として使用できます。決定論的なテスト
ベクトル一式を提供するため、
[CFRG-BBS-SIGNATURE] の
Mocked Random Scalars
手順を使用しました。派生証明テストベクトルの
生成に使用した seed および
presentationHeader の値を以下に16進形式で示します。
{
"presentationHeaderHex": "113377aa",
"pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}
派生証明を作成するため、所有者は基本証明を含む署名済み文書から
開始します。これらのテストベクトルに使用する基本文書は、
上記の第A.1.1
基本証明節の最後の例です。最初の
ステップでは、第3.2.2
parseBaseProofValue節のアルゴリズムを実行して、
以下に示すように bbsSignature、hmacKey、および
mandatoryPointers を復元します。
{
"bbsSignature": "8331f55ad458fe5c322420b2cb806f9a20ea6b2b8a29d51710026d71ace5da080064b488818efc75a439525bd031450822a6a332da781926e19360b90166431124efcf3d060fbc750c6122c714c07f71",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/credentialSubject/sailNumber",
"/credentialSubject/sails/1",
"/credentialSubject/boards/0/year",
"/credentialSubject/sails/2"
]
}
次に、所有者は選択的開示用の JSON ポインタを指定することで、 さらに何を検証者へ開示したいかを示す必要があります。この ウィンドサーフィン競技シナリオでは、セーラー(所有者)がレースの 初日を終えたところで、競技で使用したウィンドサーフィンボードの すべての詳細を一般の人々(検証者)に開示したいと考えています。 これを以下に示します。これは、最新のボードの年式のみを含んでいた 必須開示情報とわずかに重複していることに注意してください。
["/credentialSubject/boards/0", "/credentialSubject/boards/1"]
revealDocument(すなわち、最終的に署名され、
検証者へ送信される署名前の文書)を生成するため、
選択的ポインタを必須ポインタに追加し、これらの結合ポインタを
証明を除いた文書とともに [DI-ECDSA] の
selectJsonLd アルゴリズムへ入力して、
以下に示す結果を取得します。
{
"@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 を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。
{
"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 に対する相対位置)として提供します。一方、
selectiveIndexes は
nonMandatoryIndexes 内の位置に相対的に調整する必要があります。
これらの「調整済み」インデックスを以下に示します。
{
"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 節に従って計算されます。これは
以下に、
開示文書を除く残りの開示データとともに示されています。
{
"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 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。
{
"@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"
}
}
匿名所有者バインディング機能を使用する最初の手順は、 所有者が自身の holderSecret 値を生成し、その後、 [CFRG-Blind-BBS-Signature] のコミットメント計算手順に従って、 この値に対する証明付きコミットメントを計算することです。この手順の値と 出力の例を以下に示します。
{
"holderSecretHex": "8fc6cc3f65db4ba5e3ed63fe9d2bd57a9c7df9c7f6bf2b898b308d5493b07eb6"
}
{
"secretProverBlind": "12901a77b3906af68d9e4214dce887d127b2a51d6311bbe7d087d45737acd2db",
"commitmentWithProof": "ab77a14fddfafc7ae6ea82b0ef6048059225f96c9206903a34c6ec6beba702652e9d64fac1917e372853867d944e4a8059e0c26bc871cac14736e73685cd3006299539b93df64cdf661af2bc6300976528c5092c6dc842abaaa624f2184d3d5b75be0ede9c4822161149ef51a965ddda260e10b9246ecaea020ef952e3b3ed6e724bcb5d1a9c4004f0aea2cba030c27c"
}
holderSecret および secretProverBlind は、所有者が保持し、秘密にしておく必要があります。 commitmentWithProof 値は発行者に伝達する必要があります。
匿名所有者バインディングオプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、その後、 [CFRG-Blind-BBS-Signature] のコミットメント検証手順で その値を検証することから始まります。 基本証明の節で説明および使用した暗号鍵素材もここで使用され、 以下に再掲します。
{
"publicKeyHex": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"privateKeyHex": "66d36e118832af4c5e28b2dfe1b9577857e57b042a33e06bdea37b811ed09ee0",
"hmacKeyString": "00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF"
}
このシナリオでは、運転免許証の電子版を扱います。
{
"@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" のみであり、以下に示す必須ポインタによって実現されます。
["/issuer", "/expirationDate"]
署名されていない文書の変換は、以下に示すように文書を正規化することから 始まります。
[
"<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 文書が得られます。これは必須および選択的開示の対象となる ステートメントの順序付きリストを表します。すなわち、ステートメントはこのリストから グループ化されます。
[
"<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"
]
上記の正規文書は、必須ステートメントと非必須 ステートメントにグループ化されます。選択的開示変換処理の最終出力を 以下に示します。各ステートメントは必須または非必須としてグループ化され、 前のステートメントリスト内のインデックスが保持されます。
{
"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つの例に示されています。
{
"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"
]
}
_: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進形式で
示します。
{
"proofHash": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf",
"mandatoryHash": "8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb"
}
次に、3.3.2 基本 証明の直列化 (bbs-2023) 手順で、[CFRG-Blind-BBS-Signature] の ブラインド署名生成手順を使用します。 計算された bbsSignature、bbsHeader、publicKey、 hmacKey、mandatoryPointers、および featureOption を以下に示します。 バイトデータは16進形式で示されています。
{
"bbsSignature": "90eadd70a16661f3d596f3560fc485f7c23ba969eb7c237d481b3596b2f66279bd5a62fa523777eb73b5cfa361885f1a00864b960baf1b92d2b55c0652ebe39024f88e1377911c40bf14cb5fbc808ee1",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"featureOption": "anonymous_holder_binding"
}
最後に、上記の値を第 3.2.1 serializeBaseProofValue節のアルゴリズムで処理し、 以下に示す署名済み基本文書で使用される proofValue を生成します。
{
"@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"
}
}
節で説明したように、 模擬乱数生成手順を使用し、 presentationHeader の使用方法を示します。同じ seed と presentationHeader をここでも使用し、 以下に再掲します。
{
"presentationHeaderHex": "113377aa",
"pseudoRandSeedHex": "332e313431353932363533353839373933323338343632363433333833323739"
}
派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の第A.3.2 所有者バインディング基本証明節の最後の例です。 最初のステップでは、第 3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignature、bbsHeader、publicKey、hmacKey、 mandatoryPointers、および featureOption を復元します。
{
"bbsSignature": "90eadd70a16661f3d596f3560fc485f7c23ba969eb7c237d481b3596b2f66279bd5a62fa523777eb73b5cfa361885f1a00864b960baf1b92d2b55c0652ebe39024f88e1377911c40bf14cb5fbc808ee1",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"featureOption": "anonymous_holder_binding"
}
次に、所有者は選択的開示用の JSON ポインタを指定することで、 さらに何を検証者に開示したいかを示す必要があります。この 場合、所有者は自身の運転資格のみを開示したいと考えています。
["/credentialSubject/driversLicense/issuing_country", "/credentialSubject/driversLicense/driving_privileges"]
revealDocument(すなわち、最終的に署名され、
検証者へ送信される署名前の文書)を生成するため、
選択的ポインタを必須ポインタに追加し、これらの結合ポインタを
証明を除いた文書とともに [DI-ECDSA] の
selectJsonLd アルゴリズムへ入力して、
以下に示す結果を取得します。
{
"@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 を実行すると、元の文書に対する さまざまな文グループについて豊富な情報が得られます。以下では、それらの グループのインデックスの一部を示します。
{"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 に対する相対位置)として提供します。一方、
selectiveIndexes は
nonMandatoryIndexes 内の位置に対して相対的に調整する必要があります。
これらの「調整済み」インデックスを
以下に示します。
{"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 証明生成関数から得られることに注意してください。
{"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 節のアルゴリズムで使用すると、以下に示す署名済みの派生 (開示)文書が得られます。
{
"@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"
}
}
資格情報に結び付けられた仮名機能を使用する最初の手順は、 所有者が自身の秘密の prover_nym 値を生成し、その後、 [CFRG-Pseudonym-BBS-Signature] の「Commitment」操作に従って、 この値に対する証明付きコミットメントを計算することです。この手順の 値と出力の例を以下に示します。
{
"proverNymHex": "5e2087638f71057ef108f83923189a71cea1f7c4b4ef69afb473c9a7074ddf49"
}
{
"secretProverBlind": "2df3cd3d451b21069b72269f9984df449219c41273b19b1a8487d836fbb8baa1",
"commitmentWithProof": "a80f61f9470cb8ab88644fbef3616eaf5d3b147c4dc1dcad810148a5f2e73186cb3ffa27ea55728a6df470d0c3928be1408b95f5d261cee4d66992ecacf5ca2d6348c33bb7f90c2cef513cdc88be536550e9701d9a466320f49ce097551f8097317c530e2b80710748362b03f5a74280669c00eb29145eb3ec51975d8189fdf2c810d7fadefe36f93b0d2068a494175c"
}
prover_nym および secretProverBlind は、所有者が保持し、秘密にしておく必要があります。 commitmentWithProof 値は発行者に伝達する必要があります。
仮名機能オプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、 signer_nym_entropy のための暗号学的にランダムな値を生成することから始まります。
{
"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 の値は、
所有者に伝達する必要があるため含まれていることに注意してください。
{
"bbsSignature": "b9389149bab1b5a6032c20781732105a5cbc209592e712e182eec5c055f2072877683dee2949af32290d350ed9e9ffa246f65b8c3f6f199c4d29009d2ce6dff374ed4f22f2f9a7e12dc3c342e8c18107",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
"featureOption": "pseudonym"
}
最後に、上記の値を第
3.2.1
serializeBaseProofValue節のアルゴリズムで処理し、
以下に示す署名済み基本文書で使用される proofValue を生成します。
{
"@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.1.2 派生証明節で説明したように、 presentationHeader の使用方法を示すため、 模擬乱数生成手順を使用しました。 例 19に 示したものと同じ seed および presentationHeader を ここでも使用します。
派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の 例 72のものです。 最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignature、bbsHeader、publicKey、hmacKey、 mandatoryPointers、signer_nym_entropy、および featureOption を復元します。
{
"bbsSignature": "b9389149bab1b5a6032c20781732105a5cbc209592e712e182eec5c055f2072877683dee2949af32290d350ed9e9ffa246f65b8c3f6f199c4d29009d2ce6dff374ed4f22f2f9a7e12dc3c342e8c18107",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"signerNymEntropy": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
"featureOption": "pseudonym"
}
次に、所有者は [CFRG-Pseudonym-BBS-Signature] の 「検証と最終化」操作を使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では、 prover_nym、signer_nym_entropy、および secret_prover_blind の値などを使用します。
{
"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 の値が含まれていることに注意してください。
{
"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 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。
{
"@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"
}
}
所有者バインディングと仮名機能を使用する最初の手順は、 所有者が自身の holder_secret および prover_nym 値を生成し、 その後、[CFRG-Pseudonym-BBS-Signature] の「Commitment」操作に従って、 これらの値に対する証明付き コミットメントを計算することです。この手順の値と出力の例を 以下に示します。
{
"holderSecretHex": "8fc6cc3f65db4ba5e3ed63fe9d2bd57a9c7df9c7f6bf2b898b308d5493b07eb6"
}
{
"proverNymHex": "5e2087638f71057ef108f83923189a71cea1f7c4b4ef69afb473c9a7074ddf49"
}
{
"secretProverBlind": "0d215067232c77c94a7572eb80794592090da8aff35cca53d2d528d059e70fce",
"commitmentWithProof": "ab72f3e6d7a4185d100ede6ce7dde1c69db9a2128ad11d1b6991a018c340ca2672d7be636f153398be50f44ee434edf14322dd115f7527e770a0f0c41d8aeb2088d004f2703548db6ce15e2505368a1f686f20702aa9ff46bce301330ea0c4c16ef4d8bbf624064a60df3a563142d7b236cad6cf6bcf1f3694d0bf4c2b5ffce55bb26abc05e31f9aaf8b60674fefe02666f89c150c479694f4a89a9088b28a1e6e2cf0c2caaa01810d2e3a52853f3a2a"
}
holder_secret、prover_nym、および secretProverBlind は、 所有者が保持して 秘密にしておく必要があります。commitmentWithProof 値は 発行者に伝達する必要があります。
仮名機能オプションでの基本証明の追加は、 発行者が所有者から commitmentWithProof 値を受け取り、 signer_nym_entropy のための暗号学的にランダムな値を生成することから始まります。
{
"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 の値は、
所有者に伝達する必要があるため含まれていることに注意してください。
{
"bbsSignature": "9251f497cb002c19f959a760fa24c5e961df9cb8ff5fbaaef14f2b7f1f41649990c30bd8c1d373e878a5d120123d658a326141275eee7833352d611cc1c05175c9c0f0ddeb0fdec09ad1bfad8796e410",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"signerNymEntropyHex": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
"featureOption": "holder_binding_pseudonym"
}
最後に、上記の値を第
3.2.1
serializeBaseProofValue節のアルゴリズムで処理し、
以下に示す署名済み基本文書で使用される proofValue を生成します。
{
"@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.1.2 派生証明節で説明したように、 模擬乱数生成手順を使用し、 presentationHeader の使用方法を示します。 例 19に 示したものと同じ seed および presentationHeader を ここでも使用します。
派生証明を作成するため、所有者は基本証明を含む署名済み文書から 開始します。これらのテストベクトルに使用する基本文書は、 上記の 例 72のものです。 最初の ステップでは、第3.2.2 parseBaseProofValue節のアルゴリズムを実行して、 以下に示すように bbsSignature、bbsHeader、publicKey、hmacKey、 mandatoryPointers、signer_nym_entropy、および featureOption を復元します。
{
"bbsSignature": "9251f497cb002c19f959a760fa24c5e961df9cb8ff5fbaaef14f2b7f1f41649990c30bd8c1d373e878a5d120123d658a326141275eee7833352d611cc1c05175c9c0f0ddeb0fdec09ad1bfad8796e410",
"bbsHeader": "3a5bbf25d34d90b18c35cd2357be6a6f42301e94fc9e52f77e93b773c5614bdf8eea112c04d89e133880f96766ebae73693f75f1bbcbbaa473dc06254bdec4fb",
"publicKey": "a4ef1afa3da575496f122b9b78b8c24761531a8a093206ae7c45b80759c168ba4f7a260f9c3367b6c019b4677841104b10665edbe70ba3ebe7d9cfbffbf71eb016f70abfbb163317f372697dc63efd21fc55764f63926a8f02eaea325a2a888f",
"hmacKey": "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
"mandatoryPointers": [
"/issuer",
"/expirationDate"
],
"signerNymEntropy": "25555cf635188a1c33989056f5129e6ab4be0e7c5cc588c48d308e0254eed140",
"featureOption": "holder_binding_pseudonym"
}
次に、所有者は [CFRG-Pseudonym-BBS-Signature] の 「検証と最終化」操作を使用して、 署名の検証と nym_secret 値の計算の両方を行います。この操作では holder_secret、 prover_nym、 signer_nym_entropy、および secret_prover_blind の値などを使用します。
{"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 の値が含まれていることに注意してください。
{
"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 節のアルゴリズムで使用すると、以下に示す署名済みの派生(開示) 文書が得られます。
{
"@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"
}
}
この節は非規範的です。
この仕様に関する作業は、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。