| puppeteer |
|
|---|
- μΌμ: 2025-05-30
- λ²μ : v2.0.0
| λ²μ | μΌμ | λ³κ²½ λ΄μ© |
|---|---|---|
| 1.0.0 | 2024-09-03 | μ΅μ΄ μμ± |
| 1.0.1 (dev) | 2024-03-31 | [4.1 Request Offer(QR)] μμ² λ°μ΄ν° μμ (policyId μΆκ°, device, service, mode μμ ) |
| 2.0.0 | 2025-05-30 | [5. P311 - ZKP Proof μ μΆ νλ‘ν μ½] μΆκ° |
- 1. κ°μ
- 2. μ©μ΄ μ€λͺ
- 3. API λͺ©λ‘
- 4. P310 - VP μ μΆ νλ‘ν μ½
- 5. P311 - ZKP Proof μ μΆ νλ‘ν μ½
- 6. λ¨μΌ νΈμΆ API
λ³Έ λ¬Έμλ Verifier Serviceκ° μ 곡νλ APIλ₯Ό μ μνλ€.
- μκΈ° κ·Έλ¦Όμμλ Verifier Serviceκ° μ 곡νκ±°λ νΉμ Verifier Serviceκ° νΈμΆνλ νλ‘ν μ½(Protocol)κ³Ό APIλ₯Ό νκΈ°νμμΌλ©°, APIλ κ°λ μ±μ μνμ¬ νμ€ API (Standard API)λ§μ νκΈ°νμλ€.
- κ° μ©μ΄λ 2μ₯μμ μ€λͺ νλ©°, API λͺ©λ‘κ³Ό νΈμΆ μμ λ±μ 3μ₯ μ΄νλΆν° νμΈν μ μλ€.
- νλ‘ν μ½ (Protocol)
- νΉμ κΈ°λ₯μ μννκΈ° μν΄ μ ν΄μ§ μμμ λ°λΌ νΈμΆν΄μΌ νλ
μμ°¨ APIμ μ§ν©μ΄λ€. API νΈμΆ μμλ₯Ό μ격ν λ°λΌμΌ νλ©°, μμκ° μλͺ»λ κ²½μ° μμνμ§ λͺ»ν κ²°κ³Όκ° λ°μν μ μλ€. - νλ‘ν μ½μ Pλ‘ μμνκ³ , 3μ리 μ«μλ‘ κ΅¬μ±λλ€.
- μμ: P310 - VP μ μΆ νλ‘ν μ½, P311 - ZKP Proof μ μΆ νλ‘ν μ½
- νΉμ κΈ°λ₯μ μννκΈ° μν΄ μ ν΄μ§ μμμ λ°λΌ νΈμΆν΄μΌ νλ
- μμ°¨ API (Sequential API)
- νΉμ κΈ°λ₯(νλ‘ν μ½)μ μννκΈ° μν΄ μ ν΄μ§ μμλλ‘ νΈμΆνλ μΌλ ¨μ APIλ₯Ό λ§νλ€. κ° APIλ μμ°¨μ μΌλ‘ νΈμΆλμ΄μΌ νλ©°, μμκ° μλͺ»λ κ²½μ° μ λλ‘ λμνμ§ μμ μ μλ€.
- κ·Έλ¬λ μΌλΆ νλ‘ν μ½μμλ κ°μ νΈμΆ μμλ₯Ό κ°μ§ APIκ° μ‘΄μ¬ν μ μμΌλ©°, μ΄ κ²½μ° νλμ APIλ₯Ό μ ννμ¬ νΈμΆν μ μλ€.
- λ¨μΌ νΈμΆ API (Single Call API)
- μΌλ°μ μΈ REST APIμ²λΌ μμμ κ΄κ³μμ΄ λ 립μ μΌλ‘ νΈμΆ κ°λ₯ν APIλ₯Ό μλ―Ένλ€.
- νμ€ API (Standard API)
- API λ¬Έμμμ λͺ ννκ² μ μλ APIλ‘, λͺ¨λ ꡬν체μμ μΌκ΄λ λ°©μμΌλ‘ μ 곡λμ΄μΌ νλ€. νμ€ APIλ μμ€ν κ° μνΈ μ΄μ©μ±μ 보μ₯νλ©°, μ¬μ μ μ μλ μ€νμ λ°λΌ λμν΄μΌ νλ€.
- λΉνμ€ API (Non-Standard API)
- ꡬν체λ§λ€ νμμ λ°λΌ λ€λ₯΄κ² μ μλκ±°λ 컀μ€ν°λ§μ΄μ§λ μ μλ APIμ΄λ€. λ³Έ λ¬Έμμμ μ 곡νλ λΉνμ€ APIλ ν κ°μ§ μμμΌ λΏμ΄λ©°, κ° κ΅¬ν체μ λ§μΆ° λ€λ₯΄κ² ꡬνλ μ μλ€. μ΄ κ²½μ°, ꡬνμ²΄λ³ λ³λμ λ¬Έμνκ° νμνλ€.
- μλ₯Ό λ€μ΄, VP μ μΆ κ²°κ³Ό νμΈμ μμ€ν
μ λ°λΌ ꡬν λ°©λ²μ΄ λ¬λΌμ§ μ μμΌλ©°,
confirm-verifyAPIμ κ°μ λΉνμ€ APIλ κ° κ΅¬ν체μμ νμν λ°©μμΌλ‘ μ¬μ μν μ μλ€.
| Seq | API | URL | Description | νμ€API |
|---|---|---|---|---|
| 1 | request-offer-qr |
/api/v1/request-offer-qr | VP μ μΆ Offer μμ² (QR) | N |
| 2 | request-profile |
/api/v1/request-profile | μ μΆ Profile μμ² | Y |
| 3 | request-verify |
/api/v1/request-verify | VP μ μΆ | Y |
| 4 | confirm-verify |
/api/v1/confirm-verify | VP μ μΆ κ²°κ³Ό νμΈ | N |
| Seq | API | URL | Description | νμ€API |
|---|---|---|---|---|
| 1 | request-proof-request-profile |
/api/v1/request-proof-request-profile | ZKP Proof μμ² Profile μμ² | Y |
| 2 | request-verify-proof |
/api/v1/request-verify-proof | ZKP Proof μ μΆ | Y |
| API | URL | Description | νμ€API |
|---|---|---|---|
issue-certificate-vc |
/api/v1/certificate-vc | Entity λ±λ‘ μμ² | N |
get-certificate-vc |
/api/v1/certificate-vc | κ°μ μ¦λͺ μ μ‘°ν | N |
| Seq. | API | Description | νμ€API |
|---|---|---|---|
| 1 | request-offer-qr | VP μ μΆ Offer μμ² (QR) | N |
| 2 | request-profile | μ μΆ Profile μμ² | Y |
| 3 | request-verify | VP μ μΆ | Y |
| 4 | confirm-verify | VP μ μΆ κ²°κ³Ό νμΈ | N |
- VP μ μΆ νλ‘ν μ½μ μν©μ λ°λΌ API νΈμΆμκ° λ€μνκΈ° λλ¬Έμ λ©μμ§μ
txIdλ₯Ό νμ 첨λΆνκΈ°λ μ΄λ ΅λ€. - λ°λΌμ Verifier Serviceλ
txIdλ₯Ό μμ±νμ¬ μλ΅ν μ μμΌλ μμ²λ¬Έμ μ΄λ₯Ό ν¬ν¨νκΈ°λ₯Ό κ°μ νμ§λ μλλ€.
VP μ μΆ μΈμ μ 보λ₯Ό μμ²νλ€.
Verifierλ μ μΆ λ°μ VPμ μ 보λ₯Ό μ΄λ―Έ κ°μ§κ³ μμ΄μ, Verifierκ° μλμ₯μΉμκ² μ μΆ μΈμ μ 보λ₯Ό μ 곡ν μ μλ€. μ΄ μ μΆ μΈμ μ 보λ₯Ό "Verify Offer"λΌκ³ μΉνλ€.
ν΄λΉ APIλ Verify Offerμ Payloadλ₯Ό μ μ‘νλ©°, μλμ₯μΉλ ν΄λΉ Payloadλ₯Ό QRλ‘ λ³νμμΌ νλ©΄μ μΆλ ₯ν μ μλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/request-offer-qr |
|
| Authorization | - |
β Path Parameters
N/A
β Query Parameters
N/A
β HTTP Body
def object RequestOfferQr: "Request Offer QR μμ²λ¬Έ"
{
- messageId "id": "message id"
+ itemName "policyId": "VP μ μ±
(Policy) μλ³μ"
}β Process
- policyIdλ‘ VP Policy μ‘°ν
- offerId μμ±
- offer μ ν¨μκ° μμ± (validUntil)
- Verify Offer Payload μμ±
- offerId λ§€ννμ¬ μ μ₯
- mode, device, service, policyId, validUntil
β Status 200 - Success
def object _RequestOfferQr: "Request Offer QR μλ΅λ¬Έ"
{
+ uuid "txId" : "transaction id"
+ VerifyOfferPayload "payload" : "μ μΆ Offer Payload" // λ°μ΄ν° λͺ
μΈμ μ°Έκ³
}β Status 400 - Client error
| μ½λ | μ€λͺ |
|---|---|
| SSRVVRF00201 | "VP_POLICYλ₯Ό μ°Ύμ μ μμ΅λλ€." |
β Status 500 - Server error
| μ½λ | μ€λͺ |
|---|---|
| SSRVVRF00900 | "'request-offer-qr' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/request-offer-qr" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"{
"id":"202303241738241234561234ABCD",
"policyId": "f1a2b3c4-d5e6-7890-1234-56789abcdef0"
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"txId": "70e22f4e-ca60-48d3-88ee-a43d42ad3313",
"payload": {
"offerId": "3bf6a1a0-beca-4450-a01e-4e2166819504",
"type": "VerifyOffer",
"mode": "Direct",
"device": "WEB",
"service": "login",
"endpoints": [
"http://127.0.0.130:8092/verifier/api/v1/request-verify"
],
"validUntil": "2024-01-01T08:44:58.048519445Z",
"locked": false
}
}offerIdλ₯Ό μ μΆνμ¬ VerifyProfileμ μμ²νλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/request-profile |
|
| Authorization | - |
β Headers
| Header | Value | Remarks |
|---|---|---|
+ Content-Type |
application/json;charset=utf-8 |
β Path Parameters
N/A
β Query Parameters
N/A
β Body
def object M310_RequestProfile: "Request Profile μμ²λ¬Έ"
{
//--- Common Part ---
+ messageId "id" : "message id"
- uuid "txId": "transaction id"
//--- Data Part ---
+ uuid "offerId" : "verify offer id"
}β Process
- (νμμ)κ±°λμ½λ νμΈ
offerIdμ ν¨μ± νμΈprofile= VerifyProfile μμ±νμ¬ μλͺ 첨λΆ
β Status 200 - Success
def object _M310_RequestProfile: "Request Profile μλ΅λ¬Έ"
{
//--- Common Part ---
+ uuid "txId": "transaction id"
//--- Data Part ---
+ VerifyProfile "profile": "verify profile"
}β Status 400 - Client error
| Code | Description |
|---|---|
| SSRVVRF00200 | "VP_OFFERλ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00201 | "VP_POLICYλ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00300 | "νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00301 | "νΈλμμ μνκ° λκΈ° μ€μ΄ μλλλ€." |
| SSRVVRF00302 | "νΈλμμ μ΄ λ§λ£λμμ΅λλ€." |
| SSRVVRF00303 | "νμ νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00401 | "μνΈν μ€λ₯κ° λ°μνμ΅λλ€." |
| SSRVVRF00408 | "ν€ μ μμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00502 | "κ³΅κ° ν€ μμΆμ μ€ν¨νμ΅λλ€." |
| SSRVVRF00600 | "DID λ¬Έμ κ²μμ μ€ν¨νμ΅λλ€." |
| SSRVVRF00902 | "'request-profile' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/request-profile" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"//data.json
{
"txId": "b38aa1e3-48fa-4f5f-be60-05042d9ec660",
"offerId": "3bf6a1a0-beca-4450-a01e-4e2166819504",
"id": "202303241738241234561234ABCD"
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"txId": "b38aa1e3-48fa-4f5f-be60-05042d9ec660",
"profile": {
"id": "b8302842-0d9b-4f95-9da8-5ae3bbf8dd69",
"type": "VerifyProfile",
"title": "OpenDID λ‘κ·ΈμΈ VP νλ‘νμΌ",
"description": "OpenDID λ‘κ·ΈμΈμ μν΄ μ μΆμ΄ νμν VPμ λν νλ‘νμΌ μ
λλ€.",
"encoding": "UTF-8",
"language": "ko",
"profile": {
"verifier": {
"did": "did:omn:verifier",
"certVcRef": "http://127.0.0.130:8092/verifier/api/v1/certificate-vc",
"name": "verifier",
"description": "verifier",
"ref": "http://127.0.0.130:8092/swagger-ui/index.html#/"
},
"filter": {
"credentialSchemas": [
{
"id": "http://127.0.0.130:8091/issuer/api/v1/vc/vcschema?name=mdl",
"type": "OsdSchemaCredential",
"value": "VerifiableProfile",
"presentAll": false,
"displayClaims": [
"testId.aa"
],
"requiredClaims": [
"org.iso.18013.5.birth_date",
"org.iso.18013.5.family_name",
"org.iso.18013.5.given_name"
],
"allowedIssuers": [
"did:omn:issuer"
]
}
]
},
"process": {
"endpoints": [
"http://127.0.0.130:8092/verifier/api/v1/request-verify"
],
"reqE2e": {
"nonce": "mLXd8kMD3pb4WRAnchWudXA",
"curve": "Secp256r1",
"publicKey": "z26VWT8GTUxNdRAXUThK4rRPzAeWsXf7....",
"cipher": "AES-256-CBC",
"padding": "PKCS5"
},
"verifierNonce": "mLXd8kMD3pb4WRAnchWudXA",
"authType": 6
}
},
"proof": {
"type": "Secp256r1Signature2018",
"created": "2024-10-25T17:42:09.060550Z",
"verificationMethod": "did:omn:verifier?versionId=1#assert",
"proofPurpose": "assertionMethod",
"proofValue": "z3m8feWmLrhsYkym2PcfmpHe1sRkL5BQba4d...."
}
}
}μνΈνλ VPλ₯Ό μμ νμ¬ λ³΅νΈννκ³ κ²μ¦ ν μλΉμ€λ₯Ό μ 곡νλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/request-verify |
|
| Authorization | - |
β Headers
| Header | Value | Remarks |
|---|---|---|
+ Content-Type |
application/json;charset=utf-8 |
β Path Parameters
N/A
β Query Parameters
N/A
β Body
def object M310_RequestVerify: "Request Verify μμ²λ¬Έ"
{
//--- Common Part ---
+ messageId "id" : "message id"
- uuid "txId": "transaction id"
//--- Data Part ---
+ AccE2e "accE2e": "E2E μλ½μ 보"
+ multibase "encVp" : "multibase(enc((Vp)vp))"
}~/accE2e:VerifyProfile:~/profile/process/reqE2eμ λμν E2E μλ½μ 보~/encVp: E2E ν€λ‘ μνΈνλ VP
E2E μλ½μ 보λ₯Ό μ΄μ©νμ¬ E2E μνΈνν€λ₯Ό μμ±νκ³ , VPλ₯Ό 볡νΈννλ€. VP λ΄μ verifierNonceκ° κ²μ¦ μ¬μ μκ° μ 곡ν κ²κ³Ό μΌμΉνλμ§ νμΈνμ¬μΌ νλ€.
β Process
- κ±°λμ½λ νμΈ
- (μμΌλ©΄)
accE2e.proofμλͺ κ²μ¦ - E2E ECDH μν
e2eKey= μνΈνν€ μμ±iv= accE2e.iv
encVp볡νΈν- vp = dec(debase(encVp), e2eKey, iv, padding)
vpλ΄μ© νμΈprofile/process/verifierNonceμΌμΉμ¬λΆ νμΈ- μ΄μμ΄ μλͺ κ²μ¦
- λΆμΈλ°©μ§κ° νμν κ²½μ°
vpμνΈννμ¬ μ μ₯ (μνΈν λ°©λ²μ out of scope) - μλΉμ€ μ 곡 (κ²μ¦ μ¬μ μμ μλΉμ€μ λ°λ¦)
β Status 200 - Success
def object _M310_RequestVerify: "Request Verify μλ΅λ¬Έ"
{
//--- Common Part ---
+ uuid "txId": "transaction id"
}β Status 400 - Client error
| Code | Description |
|---|---|
| SSRVVRF00107 | "λ°μ΄ν° λμ½λ© μ€ν¨: μλͺ»λ μΈμ½λ©" |
| SSRVVRF00300 | "νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00301 | "νΈλμμ μνκ° μ ν¨νμ§ μμ΅λλ€." |
| SSRVVRF00302 | "νΈλμμ μ΄ λ§λ£λμμ΅λλ€." |
| SSRVVRF00303 | "νμ νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00304 | "νμ νΈλμμ μνκ° μ ν¨νμ§ μμ΅λλ€." |
| SSRVVRF00402 | "μ ν¨νμ§ μμ nonceμ λλ€." |
| SSRVVRF00403 | "μ ν¨νμ§ μμ ProofPurpose μ λλ€." |
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00101 | "JSON νμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00103 | "λΈλ‘체μΈμμ DID Doc κ²μμ μ€ν¨νμ΅λλ€." |
| SSRVVRF00104 | "μλͺ κ²μ¦μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00105 | "ν΄μ μμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00106 | "λ°μ΄ν° μΈμ½λ©μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00202 | "VP κ²μ¦μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00204 | "VP νλ‘νμΌ νμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00400 | "μ ν¨νμ§ μμ AuthType: μ ν λΆμΌμΉ." |
| SSRVVRF00401 | "μνΈν μ€λ₯κ° λ°μνμ΅λλ€." |
| SSRVVRF00601 | "DID Docμ μ°Ύλλ° μ€ν¨νμ΅λλ€." |
| SSRVVRF00700 | "E2Eλ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00701 | "E2Eκ° μ ν¨νμ§ μμ΅λλ€." |
| SSRVVRF00903 | "'request-verify' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/request-verify" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"{
{
"accE2e": {
"iv": "z2SXXDRzxTyKt8ua7Y96GPK",
"proof": {
"created": "2024-01-01T06:32:33Z",
"proofPurpose": "keyAgreement",
"proofValue": "z3odiy3M5SJMGzXHXyQZKEFMXaqPGcBVyTPYKURKA....",//encodeData
"type": "Secp256r1Signature2018",
"verificationMethod": "did:omn:iuBdTVmXCwntmEtjPR5eYZRLM5W?versionId=1#keyagree"
},
"publicKey": "z21hpr3CASVzgJ2azYZtxzedTmKyKLRoaNGiK9vGfLPCQJ"
},
"encVp": "zRedoZXk23311kmCg4yKEwLBAxz2RG4P6hopt9Dn4CS....",//encodeData
"id": "202410241532334100006CE70B2E",
"txId": "a3333175-a799-4ae3-8f9c-5b9f4c0f579f"
}
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"txId":"a3333175-a799-4ae3-8f9c-5b9f4c0f579f"
}VP μ μΆ κ²°κ³Όλ₯Ό μ‘°ννλ€.
μΈκ°μ±μμ μ μΆν VPμμ ν΄λ μ μ 보λ€λ μΆμΆνμ¬ μ λ¬νλ€. ν΄λ μμ κ°μΈμ λ³΄κ° ν¬ν¨λμ΄ μμ μ μμΌλ, ν μ€νΈμ νΈμμ±μ μνμ¬ λ°λ‘ μνΈνλ₯Ό μ²λ¦¬λ₯Ό νμ§ μλλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/confirm-verify |
|
| Authorization | - |
β Path Parameters
N/A
β Query Parameters
N/A
β HTTP Body
def object ConfirmVerify: "Confirm Verify μμ²λ¬Έ"
{
+ uuid "offerId": "μ μΆ offer id"
}β Process
- offerIdλ‘ VP μ μΆ μ 보 μ‘°ν
- VP μ μΆ μ 보μμ ν΄λ μ μ 보 μΆμΆ
β Status 200 - Success
def object _ConfirmVerify: "Confirm Verify μλ΅λ¬Έ"
{
+ bool "result": "VP μ μΆ κ²°κ³Ό"
- array(Claim) "claims" : "μ μΆν ν΄λ μ μ 보" // λ°μ΄ν° λͺ
μΈμ μ°Έκ³
}β Status 400 - Client error
| μ½λ | μ€λͺ |
|---|---|
| SSRVVRF00300 | "νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00200 | "VP_OFFERλ₯Ό μ°Ύμ μ μμ΅λλ€." |
β Status 500 - Server error
| μ½λ | μ€λͺ |
|---|---|
| SSRVVRF00901 | "'confirm-verify' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/confirm-verify" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"{
"offerId":"5e6af61a-96f3-42db-9359-d4299f6e7a8f"
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"claims": [
{
"code": "org.iso.18013.5.family_name",
"caption": "Family Name",
"value": "Kim",
"type": "text",
"format": "plain",
"hideValue": false
},
{
"code": "org.iso.18013.5.given_name",
"caption": "Given Name",
"value": "Raon",
"type": "text",
"format": "plain",
"hideValue": false
},
{
"code": "org.iso.18013.5.birth_date",
"caption": "Birth date",
"value": "2024-01-01",
"type": "text",
"format": "plain",
"hideValue": false
}
],
"result": true
}| Seq. | API | Description | νμ€API |
|---|---|---|---|
| 1 | request-proof-request-profile | ZKP Proof μμ² Profile μμ² | Y |
| 2 | request-verify-proof | ZKP Proof μ μΆ | Y |
- ZKP Proof μ μΆ νλ‘ν μ½μ μμ§μ μ¦λͺ (Zero-Knowledge Proof)μ νμ©ν VP μ μΆ λ°©μμ΄λ€.
- κΈ°μ‘΄ VP μ μΆκ³Ό λ¬λ¦¬ μ€μ ν΄λ μ κ°μ λ ΈμΆνμ§ μκ³ λ νΉμ 쑰건μ λ§μ‘±ν¨μ μ¦λͺ ν μ μλ€.
ZKP Proof μμ²μ νμν Profile μ 보λ₯Ό μμ²νλ€.
Verifierλ ZKP κ²μ¦μ νμν μ¦λͺ μꡬμ¬νκ³Ό νλΌλ―Έν°λ₯Ό ν¬ν¨ν ProofRequestProfileμ μ 곡νλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/request-proof-request-profile |
|
| Authorization | - |
β Headers
| Header | Value | Remarks |
|---|---|---|
+ Content-Type |
application/json;charset=utf-8 |
β Path Parameters
N/A
β Query Parameters
N/A
β Body
def object M311_RequestProofRequestProfile: "Request Proof Request Profile μμ²λ¬Έ"
{
//--- Common Part ---
+ messageId "id" : "message id"
- uuid "txId": "transaction id"
//--- Data Part ---
+ uuid "offerId" : "verify offer id"
}β Process
- (νμμ)κ±°λμ½λ νμΈ
offerIdμ ν¨μ± νμΈofferIdλ₯Ό ν΅ν΄proofTypeνμΈν ProofRequestProfile μμ±νμ¬ μλͺ 첨λΆ
β Status 200 - Success
def object _M311_RequestProofRequestProfile: "Request Proof Request Profile μλ΅λ¬Έ"
{
//--- Common Part ---
+ uuid "txId": "transaction id"
//--- Data Part ---
+ ProofRequestProfile "proofRequestProfile": "ZKP proof request profile"
//λ°μ΄ν° λͺ
μΈμ νμΈ νμ
}β Status 400 - Client error
| Code | Description |
|---|---|
| SSRVVRF00200 | "VP_OFFERλ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00201 | "VP_POLICYλ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00300 | "νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00301 | "νΈλμμ μνκ° λκΈ° μ€μ΄ μλλλ€." |
| SSRVVRF00302 | "νΈλμμ μ΄ λ§λ£λμμ΅λλ€." |
| SSRVVRF00303 | "νμ νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00310 | "μ§μνμ§ μλ μ¦λͺ μ νμ λλ€." |
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00401 | "μνΈν μ€λ₯κ° λ°μνμ΅λλ€." |
| SSRVVRF00408 | "ν€ μ μμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00502 | "κ³΅κ° ν€ μμΆμ μ€ν¨νμ΅λλ€." |
| SSRVVRF00600 | "DID λ¬Έμ κ²μμ μ€ν¨νμ΅λλ€." |
| SSRVVRF00910 | "'request-proof-request-profile' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/request-proof-request-profile" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"//data.json
{
"txId": "b38aa1e3-48fa-4f5f-be60-05042d9ec660",
"offerId": "3bf6a1a0-beca-4450-a01e-4e2166819504",
"id": "202303241738241234561234ABCD",
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"txId": "b38aa1e3-48fa-4f5f-be60-05042d9ec660",
"proofRequestProfile": {
"id": "c8302842-0d9b-4f95-9da8-5ae3bbf8dd70",
"type": "ProofRequestProfile",
"title": "μ°λ Ή λ²μ μ¦λͺ
μμ² νλ‘νμΌ",
"description": "λ§ 18μΈ μ΄μμμ ZKPλ‘ μ¦λͺ
νκΈ° μν νλ‘νμΌμ
λλ€.",
"encoding": "UTF-8",
"language": "ko",
"profile": {
"verifier": {
"did": "did:omn:verifier",
"certVcRef": "http://127.0.0.130:8092/verifier/api/v1/certificate-vc",
"name": "verifier",
"description": "verifier",
"ref": "http://127.0.0.130:8092/swagger-ui/index.html#/"
},
"proofRequest": {
"name": "mdl",
"nonce": "1068995366822249097155600",
"requestedAttributes": {
"attributeReferent1": {
"name": "zkpsex",
"restrictions": [
{
"credDefId": "did:omn:NcYxiDXkpYi6ov5FcYDi1e:3:CL:did:omn:NcYxiDXkpYi6ov5FcYDi1e:2:schemaname:1.0:Tag1"
}
]
}
},
"requestedPredicates": {
"predicateReferent1": {
"name": "zkpbirth",
"pType": "LE",
"pValue": 20200103,
"restrictions": [
{
"credDefId": "did:omn:NcYxiDXkpYi6ov5FcYDi1e:3:CL:did:omn:NcYxiDXkpYi6ov5FcYDi1e:2:schemaname:1.0:Tag1"
}
]
}
}
},
"reqE2e": {
"nonce": "mLXd8kMD3pb4WRAnchWudXA",
"curve": "Secp256r1",
"publicKey": "z26VWT8GTUxNdRAXUThK4rRPzAeWsXf7....",
"cipher": "AES-256-CBC",
"padding": "PKCS5"
},
},
"proof": {
"type": "Secp256r1Signature2018",
"created": "2024-10-25T17:42:09.060550Z",
"verificationMethod": "did:omn:verifier?versionId=1#assert",
"proofPurpose": "assertionMethod",
"proofValue": "z3m8feWmLrhsYkym2PcfmpHe1sRkL5BQba4e...."
}
}
}ZKP Proofλ₯Ό μμ νμ¬ κ²μ¦νλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/request-verify-proof |
|
| Authorization | - |
β Headers
| Header | Value | Remarks |
|---|---|---|
+ Content-Type |
application/json;charset=utf-8 |
β Path Parameters
N/A
β Query Parameters
N/A
β Body
def object M311_RequestVerifyProof: "Request Verify Proof μμ²λ¬Έ"
{
//--- Common Part ---
+ messageId "id" : "message id"
- uuid "txId": "transaction id"
//--- Data Part ---
+ AccE2e "accE2e": "E2E μλ½μ 보"
+ multibase "encProof" : "multibase(enc((Proof)proof))"
+ BigInterger "nonce": "Proof Nonce"
}~/accE2e: reqE2eμ λμν E2E μλ½μ 보~/encProof: E2E ν€λ‘ μνΈνλ Proof: μ¦λͺ μ μ¬μ©λ κ³΅κ° μ λ ₯κ°λ€~/nonce: ProofRequestProfileμμ μ 곡λ λ Όμ€
ZKP Proofλ₯Ό κ²μ¦νκ³ μ¦λͺ κ²°κ³Όλ₯Ό λ°ννλ€.
β Process
- κ±°λμ½λ νμΈ
nonceμΌμΉμ¬λΆ νμΈ- ZKP μ¦λͺ
κ²μ¦
- νλ‘ νλΌλ―Έν° νμΈ
- κ³΅κ° μ λ ₯κ° κ²μ¦
- μ¦λͺ μ ν¨μ± νμΈ
- μ¦λͺ κ²°κ³Ό μ μ₯ (μ μΆμ¬λΆλ§)
- μλΉμ€ μ 곡 (κ²μ¦ μ¬μ μμ μλΉμ€μ λ°λ¦)
β Status 200 - Success
def object _M311_RequestVerifyProof: "Request Verify Proof μλ΅λ¬Έ"
{
//--- Common Part ---
+ uuid "txId": "transaction id"
//--- Data Part ---
+ bool "verified": "μ¦λͺ
κ²μ¦ κ²°κ³Ό"
- string "proofType": "μ¦λͺ
μ ν"
- object "verificationDetails": "κ²μ¦ μμΈ μ 보"
}β Status 400 - Client error
| Code | Description |
|---|---|
| SSRVVRF00300 | "νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00301 | "νΈλμμ μνκ° μ ν¨νμ§ μμ΅λλ€." |
| SSRVVRF00302 | "νΈλμμ μ΄ λ§λ£λμμ΅λλ€." |
| SSRVVRF00303 | "νμ νΈλμμ μ μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00304 | "νμ νΈλμμ μνκ° μ ν¨νμ§ μμ΅λλ€." |
| SSRVVRF00402 | "μ ν¨νμ§ μμ nonceμ λλ€." |
| SSRVVRF00311 | "μ ν¨νμ§ μμ ZKP μ¦λͺ μ λλ€." |
| SSRVVRF00312 | "κ³΅κ° μ λ ₯κ°μ΄ μ ν¨νμ§ μμ΅λλ€." |
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00101 | "JSON νμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00105 | "ν΄μ μμ±μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00106 | "λ°μ΄ν° μΈμ½λ©μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00210 | "ZKP μ¦λͺ κ²μ¦μ μ€ν¨νμ΅λλ€." |
| SSRVVRF00911 | "'request-verify-proof' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/request-verify-proof" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"{
"accE2e": {
"iv": "zXnp5USMEwh9bkFYosG7jBS",
"proof": {
"created": "2025-05-26T10:39:01Z",
"proofPurpose": "keyAgreement",
"proofValue": "z3n6CBRfE3hJfmiLtLV9jDsPrGzMpbGy2HyufiTYJ4bs7rWmCytt1ZAtXiX24Veo14uNPLZisoi2bYqZ43BASRqVjb",
"type": "Secp256r1Signature2018",
"verificationMethod": "did:omn:AS8rQZnKx7atQH2boY3V8CVvCMo?versionId=1#keyagree"
},
"publicKey": "znRs8Um87H9iGoK1iuyums9pndSdLcxdhM8r8TNaDxv1A"
},
"encProof": "mnV+UxOXHVMK8fTakXpslk74k66rrJjM+PUvx2BS701f/", //encrypt Proof Data
"id": "202505261939035230006BFD300B",
"nonce": "134599285294987166794747",
"txId": "29db231a-4c25-4e6b-afcc-7a709b3c9638"
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"txId": "a3333175-a799-4ae3-8f9c-5b9f4c0f579f"
}λ¨μΌ νΈμΆ APIλ νΉμ κΈ°λ₯μ μννλ νλμ λ 립λ APIμ΄λ€. λ°λΌμ μμλλ‘ νΈμΆν΄μΌ νλ APIμ μ§λ¨μΈ μμ°¨ API(aka, νλ‘ν μ½)μ΄ μλλ―λ‘ νλ‘ν μ½ λ²νΈκ° λΆμ¬λμ§ μλλ€. Verifier Serviceκ° μ 곡νλ λ¨μΌ νΈμΆ API λͺ©λ‘μ μλ νμ κ°λ€.
| API | URL | Description | νμ€API |
|---|---|---|---|
issue-certificate-vc |
/api/v1/certificate-vc | Entity λ±λ‘ μμ² | N |
get-certificate-vc |
/api/v1/certificate-vc | κ°μ μ¦λͺ μ μ‘°ν | N |
β Authorization
νλ‘ν μ½μλ 'νΈμΆμμ νΈμΆ κΆνμ νμΈ'(authorization)νλ APIκ° ν¬ν¨λμ΄ μλ€. μκΈ° λͺ©λ‘μ λ¨μΌ νΈμΆ APIλ authroizationμ λνμ¬ μ μνμ§ μμμΌλ, ν₯ν λ€μμ λ°©μμ κ³ λ €νμ¬ μΆκ°ν μμ μ΄λ€.
- 1μ) μΈκ°μ± μ¬μ
μκ° μλͺ
ν
AttestedAppInfoμ 보λ₯Ό νμΈν ν μΌμ κΈ°κ° μ¬μ©μ΄ κ°λ₯ν ν ν°μ λ°κΈ- λ¨μΌ API νΈμΆ μ ν€λμ TAS λ°ν ν ν°μ 첨λΆ
- λ³λμ ν ν° κ΄λ¦¬ API νμ
- 2μ) μΈκ°μ± μ¬μ
μκ° μΈκ°μ±μ ν ν°μ λ°ννκ³ TASκ° μΈκ°μ± μ¬μ
μμ ν ν° κ²μ¦μ μμ²
- λ¨μΌ API νΈμΆ μ ν€λμ μΈκ°μ± μ¬μ μ λ°ν ν ν°μ 첨λΆ
- μΈκ°μ± μ¬μ μκ° ν ν°μ λ°ννκ³ κ²μ¦ν΄μ£Όλ κΈ°λ₯ ꡬν νμ
κ°μ μ¦λͺ μ λ°κΈμ μμ²νλ€.
Verifierμ DID Documentκ° TAS κ΄λ¦¬μλ₯Ό ν΅νμ¬ μ μ₯μ(μ:λΈλ‘체μΈ)μ μ΄λ―Έ λ±λ‘λμ΄ μμ΄μΌ νλ€. μ΄ APIμμλ TASμ P120 νλ‘ν μ½ APIλ₯Ό μμλλ‘ νΈμΆνμ¬ κ°μ μ¦λͺ μλ₯Ό λ°κΈ λ°λλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | POST |
|
| Path | /api/v1/certificate-vc |
|
| Authorization | - |
β Path Parameters
N/A
β Query Parameters
N/A
β HTTP Body
def object IssueCertificateVc: "Issue Certificate VC μμ²λ¬Έ"
{
}β Process
- TA P120 νλ‘ν μ½μ APIλ₯Ό μμλλ‘ νΈμΆ
- λ°κΈλ°μ κ°μ μ¦λͺ μλ₯Ό DBμ μ μ₯
β Status 200 - Success
def object _IssueCertificateVc: "Issue Certificate VC μλ΅λ¬Έ"
{
}β Status 400 - Client error
N/A
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00401 | "μνΈν μ€λ₯κ° λ°μνμ΅λλ€." |
| SSRVVRF00905 | "'issue-certificate-vc' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X POST "http://${Host}:${Port}/verifier/api/v1/certificate-vc" \
-H "Content-Type: application/json;charset=utf-8" \
-d @"data.json"{
//no data
}β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
//no data
}κ°μ μ¦λͺ μλ₯Ό μ‘°ννλ€.
| Item | Description | Remarks |
|---|---|---|
| Method | GET |
|
| Path | /api/v1/certificate-vc |
|
| Authorization | - |
β HTTP Headers
| Header | Value | Remarks |
|---|---|---|
+ Content-Type |
application/json;charset=utf-8 |
β Path Parameters
N/A
β Query Parameters
N/A
β HTTP Body
N/A
β Process
- κ°μ μ¦λͺ μ μ‘°ν
β Status 200 - Success
def object _GetCertificateVc: "Get Certificate VC μλ΅λ¬Έ"
{
@spread(Vc) // λ°μ΄ν° λͺ
μΈμ μ°Έκ³
}β Status 400 - Client error
N/A
β Status 500 - Server error
| Code | Description |
|---|---|
| SSRVVRF00800 | "μΈμ¦μ VC λ°μ΄ν°λ₯Ό μ°Ύμ μ μμ΅λλ€." |
| SSRVVRF00904 | "'certificate-vc' API μμ² μ²λ¦¬μ μ€ν¨νμ΅λλ€." |
β Request
curl -v -X GET "http://${Host}:${Port}/verifier/api/v1/certificate-vc"β Response
HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
{
"@context": [
"https://www.w3.org/ns/credentials/v2"
],
"credentialSchema": {
"id": "http://127.0.0.1:8090/tas/api/v1/vc-schema?name=certificate",
"type": "OsdSchemaCredential"
},
"credentialSubject": {
"claims": [
{
"caption": "subject",
"code": "org.opendid.v1.subject",
"format": "plain",
"hideValue": false,
"type": "text",
"value": "o=Verifier"
},
{
"caption": "role",
"code": "org.opendid.v1.role",
"format": "plain",
"hideValue": false,
"type": "text",
"value": "Verifier"
}
],
"id": "did:omn:verifier"
},
"encoding": "UTF-8",
"evidence": [
{
"attribute": {
"licenseNumber": "1234567890"
},
"documentPresence": "Physical",
"evidenceDocument": "BusinessLicense",
"subjectPresence": "Physical",
"type": "DocumentVerification",
"verifier": "did:omn:tas"
}
],
"formatVersion": "1.0",
"id": "0815ebc5-7264-45cc-8c6c-4db17640a4b7",
"issuanceDate": "2024-01-01T09:50:19Z",
"issuer": {
"id": "did:omn:tas",
"name": "raonsecure"
},
"language": "ko",
"proof": {
"created": "2024-01-01T09:50:19Z",
"proofPurpose": "assertionMethod",
"proofValue": "mH8dkYyG51tSSLqrQxmdXTh...",
"proofValueList": [
"mIIvBGv2JJk6XSmXQnJIMU...",
"mH58hKzV3+OI98K2P4n6Hq..."
],
"type": "Secp256r1Signature2018",
"verificationMethod": "did:omn:tas?versionId=1#assert"
},
"type": [
"VerifiableCredential",
"CertificateVC"
],
"validFrom": "2024-01-01T09:50:19Z",
"validUntil": "2025-01-01T09:50:19Z"
}