こんにちは。GMOグローバルサイン・ホールディングスCTO室で分散型IDの研究をしている開発者の神沼@t_kanumaです。
この記事は以下の続編です。
上記前編では、Ed25519Signature2018でのLDP-VCの発行と検証、またJSON-LDの妥当性確認とDIF Presentation Exchange v1に対するACA-Pyの使い方と振る舞いについて述べました。今回は、BBS+ Signatureを用いるLDP-VCの発行と検証におけるACA-Pyの使い方と振る舞いについて述べます。
参考資料
- Indicio社
- DIF: Timo and Karim from Animo Solutions (NL) present their work on Aries & JSON-LD (Code with Us) @IIW32(2021年4月公開)
- 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の発行と検証ができました。
どなたかのお役に立てたならば幸いです。