Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、発行者が 検証可能な クレデンシャルについて、コンパクトな暗号学的 ウィットネスのインデックス付きリストを公開するための仕組みを記述する。 検証者はこれらのリストを使用して、 検証可能なクレデンシャルが 主張された発行者によって真正に発行されたことを 確認できる。これは、発行者の署名鍵を侵害した攻撃者によって 偽造されたクレデンシャルとは区別される。ウィットネスリスト自体が 検証可能なクレデンシャルであるため、保護対象のクレデンシャルとは 異なるアルゴリズムで署名でき、ポスト量子署名方式も含めることができる。この 仕組みは、従来型の署名鍵が量子能力を持つ敵対者によって 侵害されたシナリオにおいて特に有用である。
この作業は、耐量子暗号スイート 1.0の作業を補完するものであり、 暗号学的に関連する量子コンピューターによる 従来型の署名鍵の侵害という同じ脅威を動機としている。 これらの暗号スイートは、発行者が新しい証明をポスト量子 署名で保護できるようにする。この仕様は、ポスト量子方式で 署名されたウィットネスリストを公開することにより、発行者が 従来型の量子脆弱なアルゴリズムで署名された、または今後署名される クレデンシャルについて、ポスト量子に裏付けられた真正性を 確立できるようにする。
この仕様は、3つの利用
モードに関するデータモデルとアルゴリズムを定義する。既存の
検証可能なクレデンシャル・ビット文字列ステータス
リストに相乗りし、
保護対象のクレデンシャルを変更しない暗黙モード、保護対象のクレデンシャルに
credentialStatusエントリを追加する明示モード、および独自のインデックス
割り当てを定義するユースケース向けの
スタンドアロンモードである。
このセクションは、この 文書の公開時点における状態を記述する。現在のW3C 公開物の一覧と、この技術報告書の最新改訂版は、 W3C標準および草案 インデックスにある。
この文書は、Verifiable Credentials Working Groupにより、 勧告 トラックを使用して、第一公開作業草案として 公開された。
第一公開作業草案としての公開は、 W3Cおよびそのメンバーによる支持を 意味しない。
これは草案文書であり、いつでも他の文書によって 更新、置換、または廃止される可能性がある。この文書を 作業中のもの以外として引用することは適切ではない。
この文書は、 W3C 特許 ポリシーの下で運営されるグループによって作成された。 W3Cは、 そのグループの成果物に関連して行われた 特許開示の公開リストを維持している。 そのページには、特許を開示するための 手順も含まれている。個人が、当該個人の考えでは 必須クレームを含む 特許について実際の知識を有する場合、その個人は W3C特許ポリシー第6節に従って その情報を開示しなければならない。
この文書は、 2025年8月18日版W3Cプロセス文書に準拠する。
このセクションは非規範的である。
検証可能な クレデンシャルは、その内容に対するデジタル署名によって保護されることが多い。 発行者の秘密署名鍵が侵害された場合、それがインフラストラクチャ侵害によるものか、 暗号学的に関連する量子コンピューターの開発などの暗号解析の進展によるものかを問わず、 攻撃者は、標準的な署名検証だけでは発行者によって作成されたものと区別できない クレデンシャルを偽造できる。
この仕様は、 検証可能なクレデンシャル・ビット文字列ステータス リスト に類似した仕組みを提供し、発行者が自分の秘密鍵素材を用いて発行された クレデンシャルのうち、実際に発行したサブセットを表明できるようにする。 これは、発行者がクレデンシャルとともに公開するウィットネスリストの形をとる。 発行された各クレデンシャルについて、発行者は、ランダムシードとリスト内の クレデンシャルの位置から導出される短い暗号学的ウィットネスを計算する。 リストを取得した検証者は、検証しているクレデンシャルのウィットネスが、 発行者によって公開されたウィットネスと一致することを確認できる。
ウィットネスリスト自体は検証可能なクレデンシャルであり、 リスト上のクレデンシャルとは異なるデジタル署名アルゴリズムを使用して 署名されてもよい。重要な点として、ウィットネスリストは、 耐量子暗号スイート 1.0仕様に含まれるものなど、 耐量子デジタル署名で署名されてもよい。このようにして、発行者は、 従来型かつ耐量子ではないデジタル署名で発行されたクレデンシャルについて、 耐量子の真正性を確立できる。
この仕様は、 耐量子暗号スイート 1.0を補完するものである。どちらも、同じ脅威、 すなわち従来型の署名鍵の侵害、とりわけ暗号学的に関連する量子コンピューターによる 侵害への対応である。耐量子暗号スイートは、今後に向けてこの脅威に対応し、 ポスト量子環境でも偽造不能な証明を生成する。ウィットネスリストは、既存基盤と移行期間に対応する。 これは、発行者が、すでに発行された、または再発行せずに従来型署名の下で 発行し続けなければならないクレデンシャルについて、ポスト量子署名の下で 保証できるようにする。2つの仕組みは併用されることを意図している。
このセクションは非規範的である。
このセクションは非規範的である。
検証可能なクレデンシャル の発行時に、発行者はクレデンシャルデータを使用して 暗号学的ウィットネスを作成する。これらのウィットネスの集合はランダム シードと組み合わされ、配列にパックされ、ウィットネスリスト・ クレデンシャルとしてまとめて公開される。 このクレデンシャルは署名され、任意でポスト量子アルゴリズムを使用し、 検証者がアクセスできるように公開される。
検証時に、検証者は ウィットネスリスト・クレデンシャルを取得し、公開されたランダム シードとクレデンシャルデータを使用して、検証している クレデンシャルのウィットネスを再導出し、それをクレデンシャルの ウィットネスインデックスに格納された値と比較する。不一致は、 そのクレデンシャルが主張された主体によって発行されていないことを示す。
非規範的であると示されたセクションに加えて、この仕様内のすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様内のそれ以外のすべては規範的である。
この文書におけるキーワードMAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED、およびSHOULDは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈される。
適合文書とは、セクション 4. データモデルの規範的要件に従う データモデルの任意の具体的表現である。適合 プロセッサとは、セクション 4. データモデルおよび5. アルゴリズムの規範的要件に従って、 適合文書を生成または消費する、ソフトウェアおよび/またはハードウェアとして実現された 任意のアルゴリズムである。
適合プロセッサは、不適合文書が消費されたときにエラーを生成しなければならない(MUST)。
次の用語は、この文書全体で使用される。 [VC-DATA-MODEL-2.0]で定義される用語は、 そこで定義された意味で使用される。
SHA-256(seedBytes || credentialHash)を計算し、その出力の最上位
ウィットネス長ビットを取ることによって導出される、
固定長の疑似ランダムビット列。
credentialSubjectがWitnessList型であり、
ウィットネスリストのプロパティを含む、WitnessListCredential型の
検証可能なクレデンシャル。
credentialStatusに現れてもよい(MAY)
WitnessListEntry型のオブジェクトであり、そのクレデンシャルを
ウィットネスリスト・クレデンシャル内の位置に結び付ける。
これは、明示的なwitnessListCredentialプロパティを通じて参照される。
u)であり、JSON-LDコンテキスト内では
https://w3id.org/security#multibaseとして型付けされる。
credentialStatusエントリから推論され、
ステータスリストインデックスがウィットネスインデックスとして再利用される。
credentialStatusに
ウィットネスリスト・エントリが含まれ、
それがウィットネスリスト・クレデンシャルおよび
ウィットネスインデックスを
直接参照する利用モード。
ウィットネスリスト・クレデンシャルは、
credentialSubjectがWitnessList型であり、
ウィットネスリストのプロパティ
(witnessSeed、witnessLength、
witnessCount、およびencodedWitnesses)を直接保持する
検証可能な
クレデンシャルである。発行者は、ウィットネスリスト・クレデンシャルに署名するために
別の鍵ペアを使用するべきであり(SHOULD)、かつ
ポスト量子署名方式を使用してもよい(MAY)。
これは、それが提供する保護は、通常の署名鍵が侵害された後でも検証できる場合にのみ
意味を持つためである。
クレデンシャルのtype配列は、
WitnessListCredentialを含まなければならない(MUST)。
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/vc-forgery-defense/v1rc1"
],
"id": "https://issuer.example/witnesses/1",
"type": ["VerifiableCredential", "WitnessListCredential"],
"issuer": "did:example:issuer",
"validFrom": "2024-01-15T00:00:00Z",
"credentialSubject": {
"type": "WitnessList",
"witnessSeed": "26ea4078-968d-4d98-aba7-695610c0dfb6",
"witnessLength": 128,
"witnessCount": 131072,
"encodedWitnesses": "uQYF16SSSbR_LrMZFbFvbGkn8B7ggEZtov3KVL..."
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "eddsa-rdfc-2022",
"comment": "MAY use a post-quantum cryptosuite here",
"verificationMethod": "did:example:issuer#pq-key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z..."
}
}
WitnessListCredentialsが発行者によって
空間制約のある媒体(大規模なクレデンシャルをWeb経由で配布する場合など)で配布される場合、
それらをCBOR-LD
でエンコードし、バイトとして送信することが推奨される(RECOMMENDED)。
WitnessListのcredentialSubjectは、
次のプロパティを直接含まなければならない(MUST)。
u)であり、
https://w3id.org/security#multibaseとして型付けされ、
すべてのウィットネスのパック済みビット配列を表す。
ウィットネスインデックスiのウィットネスは、
最上位ビット優先の順序で、
(i − 1) × witnessLengthから
i × witnessLength − 1まで(両端を含む)のビットを占める。
明示モードで使用される場合、保護対象の
検証可能な
クレデンシャルは、その
credentialStatus配列内に(または唯一の
credentialStatus値として)
ウィットネスリスト・
エントリを含んでもよい(MAY)。
エントリのtypeはWitnessListEntryでなければならない(MUST)。
検証可能なクレデンシャル・ビット文字列ステータス
リストの
statusListCredentialプロパティのパターンに従い、このエントリは、
明示的なwitnessListCredentialプロパティを通じて
ウィットネスリスト・クレデンシャルを参照し、
その値はそのクレデンシャルのURLである。エントリのidが存在する場合、
それはエントリの任意の(OPTIONAL)一意識別子であり、
リストの場所の特定には使用されない。
statusListCredentialに相当する。
witnessCountを超えてはならない(MUST NOT)。
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3id.org/vc-forgery-defense/v1rc1"
],
"id": "https://issuer.example/credentials/1234",
"type": ["VerifiableCredential", "ExampleDegreeCredential"],
"issuer": "did:example:issuer",
"validFrom": "2024-01-15T00:00:00Z",
"credentialStatus": [
{
"id": "https://issuer.example/status/1#94567",
"type": "BitstringStatusListEntry",
"statusPurpose": "revocation",
"statusListIndex": "94567",
"statusListCredential": "https://issuer.example/status/1"
},
{
"type": "WitnessListEntry",
"witnessListCredential": "https://issuer.example/witnesses/1",
"witnessIndex": 94567
}
],
"credentialSubject": {
"id": "did:example:holder",
"degree": {"type": "BachelorDegree", "name": "Computer Science"}
},
"proof": { ... }
}
次のアルゴリズムは、N個のクレデンシャルハッシュの集合に対する ウィットネスリストを生成する。 入力は、望ましいwitnessIndex値の順序に並べられた N個のハッシュの配列、およびウィットネス長b(デフォルト128)である。 出力は、ウィットネスシードおよびエンコード済みウィットネスである。
(i − 1) × bに、最上位ビット優先で書き込む。
uを前置したものとする
[MULTIBASE]。
次のアルゴリズムは、 ウィットネスリストの生成の出力を、 署名済みの検証可能なクレデンシャルにラップする。
typeはWitnessListCredentialを含むcredentialSubject.typeをWitnessListに設定するcredentialSubject.witnessSeedを
seedに設定する
credentialSubject.witnessLengthを
bに設定する
credentialSubject.witnessCountを
Nに設定する
credentialSubject.encodedWitnessesを
encodedWitnessesに設定する
次のアルゴリズムは、指定されたクレデンシャルのウィットネスが 有効であることを検証する。入力は、解決済みの ウィットネスリスト・クレデンシャル、 クレデンシャルハッシュ、および ウィットネスインデックスiである。
credentialSubjectとする。
.witnessSeedとする。.witnessLengthとする。.witnessCountとする。.encodedWitnessesとする。
uで始まることを検証する。そうでなければ、エラーを返す。
(i − 1) × bから
i × b − 1までのビットを、最上位ビット優先で抽出する。
これをstoredWとする。
validを返す。そうでなければinvalidを返す。
暗黙モードでは、保護対象のクレデンシャルは変更されない。
クレデンシャル自体にはウィットネスリストへの参照は現れない。
検証者は、通常はクレデンシャルの既存の
credentialStatusエントリから導出される帯域外情報を使用して、
ウィットネスリストの場所を特定し、ステータスリストインデックスを
ウィットネスインデックスとして再利用する。
このモードでは次が要求される(REQUIRES):
BitstringStatusListEntry(または同等のもの)を
持っていること。
// Protected credential has:
// credentialStatus.statusListCredential = "https://issuer.example/status/1"
// credentialStatus.statusListIndex = "94567"
// Verifier discovers witness list URL from issuer metadata:
// GET https://issuer.example/.well-known/witness-lists
// -> { "https://issuer.example/status/1":
// "https://issuer.example/witnesses/1" }
// Witness index = 94567 (same as status list index)
// Run: Verify a Credential Witness with i = 94567
明示モードでは、保護対象のクレデンシャルは
そのcredentialStatus内に
ウィットネスリスト・エントリを含む。
そのエントリのwitnessListCredentialプロパティは
ウィットネスリスト・クレデンシャルURLを与え、
witnessIndexはリスト内の1始まりの位置を指定する。
発見機構は必要ない。
明示モードは、(失効用のBitstringStatusListEntryなどの)
他のcredentialStatusエントリと共存してもよい(MAY)。
両方が存在する場合、witnessIndexはステータスリストインデックスと
等しくなくてもよい。
WitnessListEntryである
credentialStatusエントリを見つける。
witnessListCredentialプロパティの値とする。
witnessIndexの値をiとして、
クレデンシャル・ウィットネスの検証を実行する。
スタンドアロンモードでは、ウィットネスリストは いかなるステータスリスト基盤からも独立して使用される。 クレデンシャルへのウィットネスインデックスの割り当ては、 特定のアプリケーションまたはユースケースによって定義される。 ウィットネスリスト・クレデンシャルは、クレデンシャル、アプリケーション層のレコード、 または外部レジストリから参照されてもよい(MAY)が、 参照機構はこの仕様の範囲外である。
量子能力を持つ敵対者は、従来型(たとえばECDSA)の公開鍵に対応する秘密鍵を 復元できる。発行者がウィットネスリスト・クレデンシャルを ポスト量子署名方式で署名している場合、ポスト量子鍵が安全なままである限り、 検証者は、そのリスト上のクレデンシャルの署名鍵が破られた後でも ウィットネスリストを信頼できる。
発行者は、それが対象とするクレデンシャルが高い価値または長い有効期間を持つ場合、 ウィットネスリスト・クレデンシャルにポスト量子署名方式で署名するべきである (SHOULD)。
ウィットネスシードは、ウィットネスリスト・クレデンシャルの
credentialSubject内に現れ、そのウィットネスリスト・クレデンシャルを取得する
任意の主体に見える。これは設計上のものであり、検証者はウィットネスを再計算するために
シードを必要とする。検証を特定の検証者集合に制限したい発行者は、
ウィットネスリスト・クレデンシャルの配布をそれに応じて制限するべきである(SHOULD)。
インデックスiにある偽造クレデンシャルは、 bをウィットネス長とすると、 確率2−bでウィットネス検証に合格する。 デフォルトのb = 128では、この確率はおよそ2.9 × 10−39である。
実装は、bが32未満の値を受け入れてはならない(MUST NOT)。 高価値のクレデンシャルには、最小値64が推奨される(RECOMMENDED)。
ウィットネスは、一般に衝突耐性を持つように計算されるべきである (SHOULD)が、第二原像耐性を持つように計算されなければならない (MUST)。
検証者は、その内容を信頼する前に、ウィットネスリスト・ クレデンシャル上の証明を検証しなければならない(MUST)。 検証者は、ネットワーク露出およびサービス拒否リスクを低減するため、 解決済みウィットネスリスト・クレデンシャルをその有効期間中キャッシュするべきである (SHOULD)。
リストが対象とする発行済み 検証可能なクレデンシャルの数に witnessCountを正確に合わせると、 発行者のプロセスに関する情報が2つの方法で漏えいする:
最初の漏えいを軽減するため、発行者は固定されたwitnessCount 値を使用するべきであり(SHOULD)、すべてのウィットネスリスト全体で ウィットネスの総数が変化しないようにし、任意データのウィットネスプレースホルダーを、 時間の経過とともにVCに対応するウィットネスで置き換えていく。
これは最初の漏えいを軽減するには十分である。しかし、攻撃者は依然として、 時間の経過に伴いどのウィットネス値が変化するかを追跡することで、 いくつのウィットネスが「本物」であり、いくつのVCが発行されているかを 追跡できる。この問題に対処するため、発行者はWitnessListCredentialを更新するたびに、 ランダムウィットネスシードを再生成しなければならない(MUST)。
公開されたウィットネスリスト・クレデンシャルを、攻撃者が改変版に置き換えられる場合、 その攻撃者は偽造防止機構を迂回できる。発行者は、完全性が保護されたチャネル上で ウィットネスリスト・クレデンシャルを公開しなければならず(MUST)、 短い有効期間と頻繁な再発行を組み合わせて使用するべきである(SHOULD)。
発行者はウィットネスリスト・クレデンシャルの 唯一の作成者であり、 リストが更新されるたびにウィットネスシードを 再生成することが要求される(REQUIRED) (7.5 発行者情報の漏えいを参照)。したがって、発行者は、 以前に発行したクレデンシャルについて、そのクレデンシャルの ウィットネスが存在しない、または変更された 新しいウィットネスリスト・クレデンシャルを公開することで、 そのクレデンシャルを否認できる。検証者が最新のリストに対して ウィットネスを再計算すると不一致となり、 他の点では真正なクレデンシャルを拒否する。偽造とは異なり、この動作は 正当な発行者に可能であり、公開された各リストは有効に署名されたクレデンシャルであるため、 この仕組みだけでは防止できない。
後の否認を超えて発行の証拠を残す必要がある依拠当事者は、
依拠したウィットネスリスト・クレデンシャルを、
その証明および有効期間とともに保持(キャッシュまたはアーカイブ)するべきである
(SHOULD)。各
ウィットネスリスト・クレデンシャルは、それ自体が
validFrom値を持つ署名済みの
検証可能なクレデンシャルであるため、
否認前に公開されたリストに対して検証されたクレデンシャルは、
その以前のリスト時点では真正であったことを引き続き示すことができる。
キャッシュされた署名済みリストは、発行者がその時点でクレデンシャルを証明したことを示す
持続的な証拠である。公開リストに対する独立したアーカイブ、公証、または透明性ログによる
ウィットネスは、発行者の公開履歴を否認不能にすることで、この保証を強化する。
witnessCount値は、バッチ内のクレデンシャルの最大数を明らかにする。
発行者は、個々の保持者がリスト内の位置によって識別されないように、
大きな集合サイズ(少なくとも131072エントリ)を使用しなければならない
(MUST)。そのような集合内のすべてのスロットは、
ウィットネスを作成するために使用されるハッシュが検証可能なクレデンシャルに
対応しているかどうかにかかわらず、埋められていなければならない。
ウィットネスリスト・クレデンシャルを取得することは、 検証が行われていることをホストに明らかにする可能性のあるネットワーク要求を生成する。 検証者は、ウィットネスリスト・クレデンシャルをキャッシュするべきであり(SHOULD)、 リストを取得する際にプライバシー保護ネットワークトランスポートを使用してもよい (MAY)。発行者は、相関能力を低減するため、CDNまたは コンテンツアドレス指定システムを通じてウィットネスリストを提供するべきである (SHOULD)。
この文書の例は、vc-forgery-defense JSON-LD
コンテキストのv1rc1バージョンを参照している。
このコンテキストを参考のため以下に再掲する。
{
"@context": {
"@protected": true,
"id": "@id",
"type": "@type",
"WitnessListCredential": "https://w3id.org/vc-forgery-defense#WitnessListCredential",
"WitnessList": "https://w3id.org/vc-forgery-defense#WitnessList",
"WitnessListEntry": "https://w3id.org/vc-forgery-defense#WitnessListEntry",
"witnessSeed": {
"@id": "https://w3id.org/vc-forgery-defense#witnessSeed"
},
"encodedWitnesses": {
"@id": "https://w3id.org/vc-forgery-defense#encodedWitnesses",
"@type": "https://w3id.org/security#multibase"
},
"witnessLength": {
"@id": "https://w3id.org/vc-forgery-defense#witnessLength",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessCount": {
"@id": "https://w3id.org/vc-forgery-defense#witnessCount",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessIndex": {
"@id": "https://w3id.org/vc-forgery-defense#witnessIndex",
"@type": "http://www.w3.org/2001/XMLSchema#integer"
},
"witnessListCredential": {
"@id": "https://w3id.org/vc-forgery-defense#witnessListCredential",
"@type": "@id"
}
}
}
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: