【Hyperledger Aries】ACA-PyでW3C準拠のLDP-VCの発行と検証を試す(BBS+ Signature編)

こんにちは。GMOグローバルサイン・ホールディングスCTO室で分散型IDの研究をしている開発者の神沼@t_kanumaです。

この記事は以下の続編です。

上記前編では、Ed25519Signature2018でのLDP-VCの発行と検証、またJSON-LDの妥当性確認とDIF Presentation Exchange v1に対するACA-Pyの使い方と振る舞いについて述べました。今回は、BBS+ Signatureを用いるLDP-VCの発行と検証におけるACA-Pyの使い方と振る舞いについて述べます。

参考資料

  1. Indicio社
    1. Identity Insights – ACA-Py and JSON-LD Credentials(2022年12月公開)
    2. Indicio: How to use ACA-Py to issue and verify JSON-LD credentials(2022年11月公開)
  2. DIF: Timo and Karim from Animo Solutions (NL) present their work on Aries & JSON-LD (Code with Us) @IIW32(2021年4月公開)
  3. ACA-Py開発ドキュメント
    1. JSON-LD Credentials in ACA-Py
    2. How to Issue JSON-LD Credentials using Aca-py

BBS+ Signatureの特徴

参考資料3-1に以下の記述があります。

BbsBlsSignature2020 – Newer, but supports zero knowledge proofs and selective disclosure.

Generally you should always use BbsBlsSignature2020 as it allows the holder to derive a new credential during the proving, meaning it doesn’t have to disclose all fields and doesn’t have to reveal the signature.

この他参考資料1-2と2でも言及されていますが、この通り、ACA-PyはBBS+ Signatureに関して、以下のHolderのプライバシー保護機能を実装しています。

  • Signature Blinding: ZKPを用いてCorrelationのキーになり得るIssuerのVC署名値を開示しない機能。Unlinkable Proofとも呼ばれると認識。
  • Selective Disclosure: All or NothingではなくVC内の一部のClaimのみをVerifierに提示する機能。

(なおBBS+ Signatureの仕様は日々進展している模様で、現在においてPrivate Holder Bindingの仕組みも策定済みであると認識しています。ただ今回のCryptographic SuitesであるBbsBlsSignature2020ではサポートされていないと言うことだと考えます。)

Selective Disclosure機能においては、仕組みがIndy AnonCredsと異なります。参考資料2の動画のこの部分によれば、IssuerによるVC発行時点では、Ed25519Signature2018と違いはなく、IssuerのPubilc DIDでClaim群全体に対し署名がなされます。

違いはVerifierからHolderへのVP要求の際に起きます。Holderは保管したVCから、Verifierの要求に見合うよう一部のClaimのみを抜き出した新たなVCを導出し(Derived Credentialと呼ぶ)、それをVPに埋め込み提示します。その際、元のProof値は前述のUnlinkable Proof機能により開示されません。

BbsBlsSignature2020での動作確認

環境は前編と同様であるため、割愛します。
今回は後述しますがdid:sovを使わないため、Indy Ledgerを必要としません。
(私は既存環境を使い回す形でIndy Ledgerを建てたまま動作確認を行いましたが)ACA-Py起動パラメーターにて”–no-ledger”を追加することで、Indy Ledgerに繋がずに起動させることができると思います。

またAgent間でのConnection生成も前編と同様割愛します。
以下のcurlはそれぞれ目的に応じたACA-PyのAdmin API Endpointの呼び出しです。

VC発行

1. Issuerでdid:keyの生成

参考資料3-1,3-2に記載の通り、BbsBlsSignature2020に対応しているのは現状、did:keyのみです。did:sovでは発行できません。そのため、まずはIssuerでVCに署名するためのdid:keyを生成します。

curl -X 'POST' \
  'http://localhost:8031/wallet/did/create' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "method": "key",
  "options": {
    "key_type": "bls12381g2"
  }
}'
{
  "result": {
    "did": "did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
    "verkey": "z5zUEsdHzYTH5UG156NWxu1SKT9RSEm9BPCTD8DaHjwyAgrEsZpXMz1FsEWzzHUh19JJzLJd67hjYYu5JUEpciBqNep5H3nzippFKYoXmMtyxBh1jP1vbyM9pCpHY4yiR9q",
    "posture": "wallet_only",
    "key_type": "bls12381g2",
    "method": "key"
  }
}

1. IssuerからHolderへのオファー

前編でのEd25519 Signatureと異なる点として、Proof TypeがBBS+ Signatureに変わっています。

curl -X 'POST' \
  'http://localhost:8031/issue-credential-2.0/send-offer' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "connection_id": "2a476d18-f59b-49e7-8cf3-0745ad7f38f5",
  "credential_preview": {
    "@type": "issue-credential/2.0/credential-preview",
    "attributes": []
  },
  "filter": {
      "ld_proof": {
        "credential": {
          "@context": [
            "https://www.w3.org/2018/credentials/v1",
            "https://w3id.org/citizenship/v1"
          ],
          "type": [
            "VerifiableCredential",
            "PermanentResident"
          ],
          "issuer": "did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
          "issuanceDate": "2023-06-20T00:00:00Z",
          "credentialSubject": {
                 "type": [
                        "PermanentResident"
                 ],
               "givenName": "Taro",
               "familyName": "Yamada",
               "gender": "Male",
               "birthCountry": "Japan",
               "birthDate":"2020-01-01"
          }
        },
        "options": {
          "proofType": "BbsBlsSignature2020"
        }
      }
  },
  "trace": true,
  "auto_issue": false,
  "auto_remove": false,
  "comment": "try bbs"
}'

2. HolderからIssuerへの発行要求

まずHolder側でVPに署名するためのdid:keyを生成します。Holder側もIssuerに合わせてBbsBlsSignature2020で署名する必要があるようです。(HolderだけEd25519でのVP署名を試したところ、VP Proofが生成されませんでした。)

curl -X 'POST' \
  'http://localhost:8041/wallet/did/create' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "method": "key",
  "options": {
    "key_type": "bls12381g2"
  }
}'

HolderからのVC発行要求です。

curl -X 'POST' \
  'http://localhost:8041/issue-credential-2.0/records/f9d06d90-638d-4395-b42c-2e6ddbdcf8a8/send-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "holder_did": "did:key:zUC7D4bJUvL3bTNRHeqsqUF6JEvfAXz4wNCF79ihfz7d1kVCNxgX3GBd3gNH1mzRVoaGtDxEbLxZmJ1V1ChnNoQduzeY21UFNgZNXcvXmc89WkBfZ3kJX5FEQCt5uy1JDdiUSdJ"
}'

3. IssuerからHolderへの発行と保管

IssuerからのVC発行です。

curl -X 'POST' \
  'http://localhost:8031/issue-credential-2.0/records/e6591ad6-4afb-4fcd-8172-7e6785559ed7/issue' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "comment": "try issuing bbs sig"
}'

Holderでの保管です。

curl -X 'POST' \
  'http://localhost:8041/issue-credential-2.0/records/f9d06d90-638d-4395-b42c-2e6ddbdcf8a8/store' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "credential_id": "bbs-vc-2"
}'

以下、発行されたVCです。

{
   "@context":[
      "https://www.w3.org/2018/credentials/v1",
      "https://w3id.org/citizenship/v1",
      "https://w3id.org/security/bbs/v1"
   ],
   "type":[
      "VerifiableCredential",
      "PermanentResident"
   ],
   "issuer":"did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
   "issuanceDate":"2023-06-20T00:00:00Z",
   "credentialSubject":{
      "type":[
         "PermanentResident"
      ],
      "givenName":"Taro",
      "familyName":"Yamada",
      "gender":"Male",
      "birthCountry":"Japan",
      "birthDate":"2020-01-01",
      "id":"did:key:zUC7D4bJUvL3bTNRHeqsqUF6JEvfAXz4wNCF79ihfz7d1kVCNxgX3GBd3gNH1mzRVoaGtDxEbLxZmJ1V1ChnNoQduzeY21UFNgZNXcvXmc89WkBfZ3kJX5FEQCt5uy1JDdiUSdJ"
   },
   "proof":{
      "type":"BbsBlsSignature2020",
      "verificationMethod":"did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9#zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
      "created":"2023-10-17T01:56:00.788080+00:00",
      "proofPurpose":"assertionMethod",
      "proofValue":"qMlOTXfwYML86d97yG3LiCknK/XV16mTyYowN1RDYdEsCrM1xtcx7JehyYcwTscENE+UIa3TV+kRvpw6I26qCIiK9tcM+3HqRC5c+7GPUMhkcLRrCcbLzez2ALQSWrlFjrM3KIw0XPYBU5HOn8OjVg=="
   }
}

VP検証

1. VerifierからHolderへのVP要求(Presentation DefinitionとPresentation Request)

前編のEd25519と異なる箇所は以下の通りです。

  • proof_typeをBBS+ Signatureに変更している。
  • Selective Disclosure対応。input_descriptorsにlimit_disclosure:requiredを追加し、filedsに記載したClaimのみ提示するよう定義している。
curl -X 'POST' \
  'http://localhost:8021/present-proof-2.0/send-request' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "auto_verify": false,
  "comment": "test bbs",
  "connection_id": "bccc1b3c-161b-4b13-b9dd-e599b8e74eba",
  "presentation_request": {
    "dif": {
      "options": {
        "challenge": "3fa85f64-5717-4562-b3fc-2c963f66afa7",
        "domain": "4jt78h47fh48"
      },
      "presentation_definition": {
        "id": "f5fc87a5-053d-4c0d-9aaa-7589256981f0",
        "format": {
          "ldp_vp": {
            "proof_type": ["BbsBlsSignature2020"]
          }
        },
        "input_descriptors": [
          {
            "id": "input_desc_1",
            "name": "Permanent Resident",
            "schema": [
              {
                "uri": "https://www.w3.org/2018/credentials#VerifiableCredential"
              },
              {
                "uri": "https://w3id.org/citizenship#PermanentResident"
              }
            ],
            "constraints": {
              "fields": [
                {
                  "id": "1f44d55f-f161-4938-a659-f8026467f126",
                  "path": ["$.credentialSubject.givenName"],
                  "filter": {
                    "const": "Taro"
                  }
                },
                {
                  "id": "332be361-823a-4863-b18b-c3b930c5623e",
                  "path": ["$.issuer"],
                  "filter": {
                    "const": "did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9"
                  }
                }
              ],
              "is_holder": [
                {
                  "directive": "required",
                  "field_id": ["1f44d55f-f161-4938-a659-f8026467f126", "332be361-823a-4863-b18b-c3b930c5623e"]
                }
              ],
              "limit_disclosure": "required"
            }
          }
        ]
      }
    }
  },
  "trace": true
}'

2. HolderからVerifierへのVP提示(Presentation Submission)

curl -X 'POST' \
  'http://localhost:8041/present-proof-2.0/records/63324fcf-44bf-48d1-899a-d5423eb11a84/send-presentation' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{"dif":{}} '

以下、DIDComm上でHolderからVerifierに送られるVPです。
BBS+ SignatureによりHolder上でDerived Credentialが生成され、要求したClaim(ここではgivenName)だけが存在し、元のVCとはproofValueが変わっていることがわかります。

{
   "@context":[
      "https://www.w3.org/2018/credentials/v1",
      "https://w3id.org/security/bbs/v1"
   ],
   "type":[
      "VerifiablePresentation"
   ],
   "verifiableCredential":[
      {
         "@context":[
            "https://www.w3.org/2018/credentials/v1",
            "https://w3id.org/citizenship/v1",
            "https://w3id.org/security/bbs/v1"
         ],
         "id":"urn:bnid:_:c14n0",
         "type":[
            "PermanentResident",
            "VerifiableCredential"
         ],
         "credentialSubject":{
            "id":"did:key:zUC7D4bJUvL3bTNRHeqsqUF6JEvfAXz4wNCF79ihfz7d1kVCNxgX3GBd3gNH1mzRVoaGtDxEbLxZmJ1V1ChnNoQduzeY21UFNgZNXcvXmc89WkBfZ3kJX5FEQCt5uy1JDdiUSdJ",
            "type":"PermanentResident",
            "givenName":"Taro"
         },
         "issuanceDate":"2023-06-20T00:00:00Z",
         "issuer":"did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
         "proof":{
            "type":"BbsBlsSignatureProof2020",
            "nonce":"MfOPV00Tno6PO8GgbB0npk1fu/kH7wk+bboU0WTnN03Vqe6JLSH0kr9XLxojR/pzkwU=",
            "proofValue":"AA99j408eDevdKMHb0XSULV+Q/n2hX0P1st+jAicCdCyvWiryYQ+Gpz1f7OuzkBd6Xm0d4nR9IGHqfKHWjQuAghlO2lzBqDwcUCeMuBQqNrA8JZViIpW0sceYCMbvcSxjzBIja+iKQZR2R2/HmyeEKdVxOJ1ZI1lF7USELtNHREoVBINyd3PXipqEuLc2dmxc+6kmwAAAHSXiOTddp0+WeZDWQd3akYNDDiECl/RueXj6DN9joPHDTwu4O05qmp+sOZlWD8TwjgAAAACZjPQz744WgdyFZdEyjgB3StNduEYTP3mObX4oEOhjzddjALRRX/U4MkEn0mS+RzlYtAkgBgDAau1Uov8MWUldbeM9brNilkOjJ3ty7QnUE9cCJZIupMzMjubSHYmFXdX4eo/ZLCP0BxRJCgye01wkgAAAAYts60LauQfvLhz5rHQsSbdpM2W2Gm3MMPDBVnPYtXp8UNJnt5kydhIxbjJajc5qSlo5EMacd+bJGIrC/1HIMTLUviXcM4lFotRjNAF7RaU5tdu6ddSt8Xsdt2mbvYuDPktFg61eJ7jVY2/awursXHK/Iia9m1YvD94+lVcHKnfeBJ22DzfyNk4wiR+ZOyA5vsjRa6zs/zUBEEneWCkLLM+Rd/+x0dsCeHEdOdGDmfdLiuNYx3Pq1oJLYAMhOOpTCk=",
            "verificationMethod":"did:key:zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9#zUC7DvYMJZHXMAKVVQvrF34jGCNMZjTdUDK53mnGgygP2dJmaHosaEDgARxw2DsFWb2L9MiC2kASU1FhVRdCTjaYSfiZAziBEgvUzUWeDmSQFK2rK62cpKC2mmm8HPZB7d8aum9",
            "proofPurpose":"assertionMethod",
            "created":"2023-10-17T01:56:00.788080+00:00"
         }
      }
   ],
   "presentation_submission":{
      "id":"9888ca9f-50f6-4955-9eb6-03a43bb9e11b",
      "definition_id":"f5fc87a5-053d-4c0d-9aaa-7589256981f0",
      "descriptor_map":[
         {
            "id":"input_desc_1",
            "format":"ldp_vc",
            "path":"$.verifiableCredential[0]"
         }
      ]
   },
   "proof":{
      "type":"BbsBlsSignature2020",
      "verificationMethod":"did:key:zUC7D4bJUvL3bTNRHeqsqUF6JEvfAXz4wNCF79ihfz7d1kVCNxgX3GBd3gNH1mzRVoaGtDxEbLxZmJ1V1ChnNoQduzeY21UFNgZNXcvXmc89WkBfZ3kJX5FEQCt5uy1JDdiUSdJ#zUC7D4bJUvL3bTNRHeqsqUF6JEvfAXz4wNCF79ihfz7d1kVCNxgX3GBd3gNH1mzRVoaGtDxEbLxZmJ1V1ChnNoQduzeY21UFNgZNXcvXmc89WkBfZ3kJX5FEQCt5uy1JDdiUSdJ",
      "created":"2023-10-17T02:01:27.609263+00:00",
      "proofPurpose":"authentication",
      "challenge":"3fa85f64-5717-4562-b3fc-2c963f66afa7",
      "proofValue":"k/OspCBmZ2hWBuWX3qmJB4spv2GvlpdfDAXtAJEzzrKpuphtKE+ATHd5t1dfryWhLKezVFDWyZMoIWqVzygTMJ3o+oaFaHMBv/tt/fSIsopxSvohmxeZr78Ot1siZk2o1NR9rFNN4HQoQjdVL05aFA=="
   }
}

3. VerfierでのVP検証

curl -X 'POST' \
  'http://localhost:8021/present-proof-2.0/records/9407de29-fade-42d2-b17a-9e0e07d617e8/verify-presentation' \
  -H 'accept: application/json' \
  -d ''

詳細は省きますが、Verifier側で検証結果がTrueで完了していることを確認できました。

終わりに

ACA-Pyを使いBBS+ SignatureでのLDP-VCの発行と検証ができました。
どなたかのお役に立てたならば幸いです。