এই নির্দেশিকা থেকে জানা যাবে যে কীভাবে ডাইরেক্ট রিলাইং পার্টি (RP)—ব্যক্তিগত মার্চেন্ট, ব্যবসা এবং অ্যাপ ডেভেলপার—Android অ্যাপ এবং ওয়েব জুড়ে ডিজিটাল পরিচয় সংক্রান্ত ক্রেডেনশিয়াল অনুরোধ ও যাচাই করার জন্য Digital Credentials API ইন্টিগ্রেট করে।
আপনার পথ বেছে নিন RP, যাচাইকারী রেজিস্ট্রার বা ব্যক্তিগতভাবে
রিলাইং পার্টি ইন্টিগ্রেশন কীভাবে কাজ করে
প্রতিটি রিলাইং পার্টি ইন্টিগ্রেশন চারটি ধাপ অনুসরণ করে। ধাপ ক এবং গ আপনার সার্ভারে রান করে; ধাপ খ আপনার Android অ্যাপ বা ব্রাউজারে রান করে। যেকোনও ধাপ বেছে নিন যাতে সেটির প্রয়োগ সংক্রান্ত বিবরণ দেখতে পান:

কাজ করবে এমন ফর্ম্যাট, ক্রেডেনশিয়াল ও ক্ষমতা
Google Wallet OpenID4VP (ভার্সন ১.০)-এর মাধ্যমে ISO mdoc-ভিত্তিক ডিজিটাল আইডি Android 9 (API লেভেল ২৮) ও তার পরবর্তী ভার্সন এবং কাজ করে এমন ব্রাউজার জুড়ে সাপোর্ট করে।
কাজ করে এমন ক্রেডেনশিয়াল ও অ্যাট্রিবিউট
doctype_value শনাক্তকারী (mDL, ID পাস, ফটো আইডি) এবং অ্যাট্রিবিউট ক্লেম পাথ দেখুন যা আপনি Google Wallet থেকে অনুরোধ করতে পারেন।
যেসব ইস্যুকারীর কার্ড কাজ করে এবং IACA সার্টিফিকেট
issuerAuth যাচাই করতে মার্কিন যুক্তরাষ্ট্রের রাজ্য, আন্তর্জাতিক ইস্যুকারী এবং Sandbox Utopia ইস্যুকারীর জন্য অফিসিয়াল IACA রুট সার্টিফিকেট ডাউনলোড করুন।
ধাপ ক: অনুরোধ ফর্ম্যাট ও স্বাক্ষর করা (সার্ভার-সাইড)
যেকোনও ওয়ালেট থেকে ক্রেডেনশিয়াল পাওয়ার অনুরোধ করতে, আপনার সার্ভারে OpenID4VP ব্যবহার করে
অনুরোধ ফর্ম্যাট করতে হবে। আপনি একটি নির্দিষ্ট ক্রেডেনশিয়াল বা একাধিক ক্রেডেনশিয়ালের জন্য
একটি dcql_query অবজেক্টে অনুরোধ করতে পারেন।
JSON অনুরোধের উদাহরণ
Android ডিভাইস বা ওয়েব থেকে যেকোনও ওয়ালেটের মাধ্যমে পরিচয় সংক্রান্ত ক্রেডেনশিয়াল পেতে
mdoc requestJson অনুরোধের একটি স্যাম্পেল এখানে দেওয়া হল।
{
"requests" : [
{
"protocol": "openid4vp-v1-signed",
"data": {<signed_credential_request>} // This is an object, shouldn't be a string.
}
]
}
এনক্রিপশনের অনুরোধ করুন
client_metadata-এ প্রতিটি অনুরোধের জন্য এনক্রিপশন সর্বজনীন কী থাকে।
আপনাকে প্রতিটি অনুরোধের জন্য ব্যক্তিগত কী স্টোর করতে হবে এবং Wallet অ্যাপ থেকে পাওয়া টোকেন যাচাই ও অনুমোদন করতে
সেগুলি ব্যবহার করতে হবে।
ইন্টিগ্রেটেড OpenID4VP মেটাডেটা
আপনার ক্রেডেনশিয়াল অনুরোধ ফর্ম্যাট করার সময়, আপনাকে অবশ্যই client_metadata অবজেক্টের মধ্যে gw_rp_metadata_bytes ফিল্ডটি অন্তর্ভুক্ত করতে হবে (নিচে স্যাম্পেল অনুরোধ কোডে দেখানো হয়েছে)। এই ফিল্ডে Base64URL-এনকোড করা রিলাইং পার্টির মেটাডেটা থাকে যা Google Wallet-এর আপনার পরিচয় যাচাই করতে এবং ব্যবহারকারীকে আপনার ব্র্যান্ডিং দেখাতে প্রয়োজন হয়।
ক্রেডেনশিয়াল অনুরোধ পেলোড
requestJson-এ credential_request প্যারামিটারে নিম্নলিখিত
ফিল্ড রয়েছে।
নির্দিষ্ট ক্রেডেনশিয়াল
{
"response_type": "vp_token",
"response_mode": "dc_api.jwt", // change this to dc_api if you want to demo with a non encrypted response.
"nonce": "1234",
"dcql_query": {
"credentials": [
{
"id": "cred1",
"format": "mso_mdoc",
"meta": {
// Use org.iso.18013.5.1.mDL for mDL,
// com.google.wallet.idcard.1 for ID pass, or
// org.iso.23220.photoid.1 for ID pass (using photo ID document type)
"doctype_value": "org.iso.18013.5.1.mDL"
},
"claims": [
{
"path": [
"org.iso.18013.5.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
}
]
},
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
"kty": "EC",
"crv": "P-256",
"x": "pDe667JupOe9pXc8xQyf_H03jsQu24r5qXI25x_n1Zs",
"y": "w-g0OrRBN7WFLX3zsngfCWD3zfor5-NLHxJPmzsSvqQ",
"use": "enc",
"kid" : "1", // This is required
"alg" : "ECDH-ES", // This is required
}
]
},
"vp_formats_supported": {
"mso_mdoc": {
"deviceauth_alg_values": [
-7
],
"issuerauth_alg_values": [
-7
]
}
},
"gw_rp_metadata_bytes": "<base64url encoded metadata string>"
}
}
যেকোনও উপযুক্ত ক্রেডেনশিয়াল
mDL, আইডি পাস এবং আইডি পাসের (ফটো আইডি ডকুমেন্ট টাইপ ব্যবহার করে) জন্য অনুরোধের উদাহরণ এখানে দেওয়া হল। ব্যবহারকারী যেকোনও একটির সাথে এগিয়ে যেতে পারবেন।
{
"response_type": "vp_token",
"response_mode": "dc_api.jwt", // change this to dc_api if you want to demo with a non encrypted response.
"nonce": "1234",
"dcql_query": {
"credentials": [
{
"id": "mdl-request",
"format": "mso_mdoc",
"meta": {
"doctype_value": "org.iso.18013.5.1.mDL"
},
"claims": [
{
"path": [
"org.iso.18013.5.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
},
{ // Credential type 2: ID pass
"id": "id_pass-request",
"format": "mso_mdoc",
"meta": {
"doctype_value": "com.google.wallet.idcard.1"
},
"claims": [
{
"path": [
"org.iso.18013.5.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.18013.5.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.18013.5.1",
"age_over_18"
],
"intent_to_retain": false
}
]
},
{ // Credential type 3: ID pass (using photo ID document type)
"id": "photo_id-request",
"format": "mso_mdoc",
"meta": {
"doctype_value": "org.iso.23220.photoid.1"
},
"claims": [
{
"path": [
"org.iso.23220.1",
"family_name"
],
"intent_to_retain": false // set this to true if you are saving the value of the field
},
{
"path": [
"org.iso.23220.1",
"given_name"
],
"intent_to_retain": false
},
{
"path": [
"org.iso.23220.1",
"age_over_18"
],
"intent_to_retain": false
}
]
}
]
credential_sets : [
{
"options": [
[ "mdl-request" ],
[ "id_pass-request" ],
[ "photo_id-request" ]
]
}
]
},
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
"kty": "EC",
"crv": "P-256",
"x": "pDe667JupOe9pXc8xQyf_H03jsQu24r5qXI25x_n1Zs",
"y": "w-g0OrRBN7WFLX3zsngfCWD3zfor5-NLHxJPmzsSvqQ",
"use": "enc",
"kid" : "1", // This is required
"alg" : "ECDH-ES", // This is required
}
]
},
"vp_formats_supported": {
"mso_mdoc": {
"deviceauth_alg_values": [
-7
],
"issuerauth_alg_values": [
-7
]
}
},
"gw_rp_metadata_bytes": "<base64url encoded metadata string>"
}
}
আপনি Google Wallet-এ স্টোর করা যেকোনও পরিচয় ক্রেডেনশিয়াল থেকে যেকোনও সংখ্যক কাজ করে এমন অ্যাট্রিবিউট-এর জন্য অনুরোধ করতে পারবেন।
স্বাক্ষরিত অনুরোধ
স্বাক্ষরিত অনুরোধ (JWT সুরক্ষিত অনুমোদনের অনুরোধ) আপনার PKI ইনফ্রাস্ট্রাকচার ব্যবহার করে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত JSON ওয়েব টোকেনের (JWT) মধ্যে আপনার যাচাইযোগ্য উপস্থাপনার অনুরোধ এনক্যাপসুলেট করে, অনুরোধের ইন্টিগ্রিটি নিশ্চিত করে এবং Google Wallet-এ আপনার পরিচয় প্রমাণ করে।
পূর্বশর্ত
স্বাক্ষরিত অনুরোধের জন্য কোড পরিবর্তন করার আগে, আপনার কাছে এগুলি আছে কিনা তা নিশ্চিত করুন:
- ব্যক্তিগত কী: আপনার সার্ভারে ম্যানেজ করা অনুরোধে স্বাক্ষর করার জন্য আপনার একটি ব্যক্তিগত কী (যেমন, Elliptic Curve
ES256) প্রয়োজন। রিলাইং পার্টি হিসেবে স্যান্ডবক্স টেস্টিংয়ের জন্য স্যান্ডবক্স টেস্ট ব্যক্তিগত কী ব্যবহার করুন। - সার্টিফিকেট: আপনার কী পেয়ার থেকে প্রাপ্ত স্ট্যান্ডার্ড X.509 সার্টিফিকেট প্রয়োজন।
- রেজিস্ট্রেশন: আপনার পাবলিক সার্টিফিকেট (বা ভেরিফায়ার রেজিস্ট্রারের জন্য রুট CA) Google Wallet-এর মাধ্যমে বিশ্বস্ত কিনা তা নিশ্চিত করুন।
কনস্ট্রাকশন লজিক সংক্রান্ত অনুরোধ
আপনার OpenID4VP অনুরোধ তৈরি ও স্বাক্ষর করার সময়, প্রতিটি ফিল্ডের জন্য প্রত্যাশিত সঠিক এনকোডিং ফর্ম্যাটের দিকে
বিশেষ মনোযোগ দিন—base64 এবং base64url
বা প্যাডিং (=) মিশিয়ে ফেললে স্বাক্ষর বা উৎস যাচাইকরণ ব্যর্থ হবে:
| ফিল্ড | প্রয়োজনীয় এনকোডিং / ফর্ম্যাট | অক্ষর ও প্যাডিং |
|---|---|---|
client_id (x509_hash:<hash>) |
প্যাডিং ছাড়া base64url | URL-এর জন্য নিরাপদ বর্ণমালা (-, _) ব্যবহার করে; শেষে থাকা = বাদ দিন |
expected_origins (android:apk-key-hash:<hash>) |
প্যাডিং ছাড়া স্ট্যান্ডার্ড base64 | স্ট্যান্ডার্ড বর্ণমালা (+, /) ব্যবহার করে; ট্রেলিং = স্ট্রিপ করে |
expected_origins (https://...) |
শেষে স্ল্যাশ ছাড়া ছোট হাতের URL | যেমন: https://example.com (শেষে / নেই) |
x5c JWS হেডার |
প্যাডিং সহ স্ট্যান্ডার্ড base64 | স্ট্যান্ডার্ড বর্ণমালা (+, /) ব্যবহার করে; ট্রেলিং = প্যাডিং রাখে |
অনুরোধ তৈরি করতে, আপনার ব্যক্তিগত কী ব্যবহার করুন এবং JWS-এ পেলোড র্যাপ করুন:
def construct_openid4vp_request(
doctypes: list[str],
requested_fields: list[dict],
nonce_base64: str,
jwe_encryption_public_jwk: jwk.JWK,
is_zkp_request: bool,
is_signed_request: bool,
state: dict,
origin: str
) -> dict:
# ... [Existing logic to build 'presentation_definition' and basic 'request_payload'] ...
# ------------------------------------------------------------------
# SIGNED REQUEST IMPLEMENTATION (JAR)
# ------------------------------------------------------------------
if is_signed_request:
try:
# 1. Load the Verifier's Certificate
# We must load the PEM string into a cryptography x509 object
verifier_cert_obj = x509.load_pem_x509_certificate(
CERTIFICATE.encode('utf-8'),
backend=default_backend()
)
# 2. Calculate Client ID (x509_hash)
# We calculate the SHA-256 hash of the DER-encoded certificate.
cert_der = verifier_cert_obj.public_bytes(serialization.Encoding.DER)
verifier_fingerprint_bytes = hashlib.sha256(cert_der).digest()
# Important: Use URL-safe Base64 (base64url: '-', '_') without padding ('=') for client_id
verifier_fingerprint_b64 = base64.urlsafe_b64encode(verifier_fingerprint_bytes).decode('utf-8').rstrip("=")
# Format the client_id as required by the spec
client_id = f'x509_hash:{verifier_fingerprint_b64}'
# 3. Update Request Payload with JAR specific fields
request_payload["client_id"] = client_id
# Explicitly set expected origins to prevent relay attacks
# Important: Use standard Base64 (not URL-safe) without padding for android:apk-key-hash:
# origin = f"android:apk-key-hash:{base64.b64encode(apk_cert_hash).decode('utf-8').rstrip('=')}"
# Format for web origin (lowercase URL without trailing slash): origin = "https://example.com"
if origin:
request_payload["expected_origins"] = [origin]
# 4. Create Signed JWT (JWS)
# Load the signing private key
signing_key = jwk.JWK.from_pem(PRIVATE_KEY.encode('utf-8'))
# Initialize JWS with the JSON payload
jws_token = jws.JWS(json.dumps(request_payload).encode('utf-8'))
# Construct the JOSE Header
# 'x5c' (X.509 Certificate Chain) is critical: it allows the wallet
# to validate your key against the one registered in the console.
# Important: Use standard Base64 ('+', '/') WITH padding ('=') for x5c
x5c_value = base64.b64encode(cert_der).decode('utf-8')
protected_header = {
"alg": "ES256", # Algorithm (e.g., ES256 or RS256)
"typ": "oauth-authz-req+jwt", # Standard type for JAR
"kid": "1", # Key ID
"x5c": [x5c_value] # Embed the certificate
}
# Sign the token
jws_token.add_signature(
key=signing_key,
alg=None,
protected=json_encode(protected_header)
)
# 5. Return the Request Object
# Instead of returning the raw JSON, we return the signed JWT string
# under the 'request' key.
return {"request": jws_token.serialize(compact=True)}
except Exception as e:
print(f"Error signing OpenID4VP request: {e}")
return None
# ... [Fallback for unsigned requests] ...
return request_payload
ধাপ খ: API ট্রিগার করা (ক্লায়েন্ট-সাইড)
সম্পূর্ণ API অনুরোধ সার্ভার-সাইডে জেনারেট করা উচিত। প্ল্যাটফর্মের উপর নির্ভর করে, জেনারেট করা JSON প্ল্যাটফর্ম API-তে পাস করুন।
অ্যাপ-মধ্যস্থ (Android)
আপনার Android অ্যাপ থেকে পরিচয় সংক্রান্ত ক্রেডেনশিয়ালের অনুরোধ করতে, এই ধাপগুলি অনুসরণ করুন:
ডিপেন্ডেন্সি আপডেট করুন
আপনার প্রোজেক্টের build.gradle-এ, ক্রেডেনশিয়াল ম্যানেজার (বিটা) ব্যবহার করার জন্য আপনার ডিপেন্ডেন্সি আপডেট করুন:
dependencies {
implementation("androidx.credentials:credentials:1.5.0-beta01")
implementation("androidx.credentials:credentials-play-services-auth:1.5.0-beta01")
}
ক্রেডেনশিয়াল ম্যানেজার কনফিগার করা
CredentialManager অবজেক্ট কনফিগার ও ইনিশিয়ালাইজ করতে, নিম্নলিখিত লজিকের মতো
লজিক যোগ করুন:
// Use your app or activity context to instantiate a client instance of CredentialManager.
val credentialManager = CredentialManager.create(context)
পরিচিতি সংক্রান্ত অ্যাট্রিবিউট অনুরোধ করুন
পরিচয় সংক্রান্ত অনুরোধের জন্য আলাদা আলাদা প্যারামিটার উল্লেখ করার পরিবর্তে, অ্যাপটি
সেগুলি সব একসাথে CredentialOption-এর মধ্যে JSON স্ট্রিং হিসেবে প্রদান করে।
ক্রেডেনশিয়াল ম্যানেজার এই JSON স্ট্রিং উপলভ্য ডিজিটাল ওয়ালেটে পাস করে,
এর কন্টেন্ট পরীক্ষা করে না। এরপর প্রতিটি ওয়ালেট এগুলির জন্য দায়ী থাকে:
- পরিচয় সংক্রান্ত অনুরোধ বুঝতে JSON স্ট্রিং পার্স করা হচ্ছে।
- এটির সেভ করা ক্রেডেনশিয়ালের মধ্যে কোনটি, যদি থাকে, অনুরোধ পূরণ করে তা নির্ধারণ করা।
আমরা পার্টনারদের Android অ্যাপ ইন্টিগ্রেশনের জন্যও সার্ভারে তাদের অনুরোধ তৈরি করার সাজেশন দিই।
আপনি GetDigitalCredentialOption() ফাংশন কলে request হিসেবে
অনুরোধ ফর্ম্যাট ও সাইন করুন থেকে requestJson ব্যবহার করবেন।
// The request in the JSON format to conform with
// the JSON-ified Digital Credentials API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
GetDigitalCredentialOption(requestJson = requestJson)
// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
listOf(digitalCredentialOption)
)
coroutineScope.launch {
try {
val result = credentialManager.getCredential(
context = activityContext,
request = getCredRequest
)
verifyResult(result)
} catch (e : GetCredentialException) {
handleFailure(e)
}
}
ক্রেডেনশিয়াল সংক্রান্ত উত্তর ম্যানেজ করুন
আপনি Wallet থেকে উত্তর পাওয়ার পরে, উত্তরটি সফল কিনা এবং তাতে credentialJson উত্তর আছে কিনা তা যাচাই করুন:
// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
val credential = result.credential
when (credential) {
is DigitalCredential -> {
val responseJson = credential.credentialJson
validateResponseOnServer(responseJson) // make a server call to validate the response
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential ${credential.type}")
}
}
}
// Handle failure.
fun handleFailure(e: GetCredentialException) {
when (e) {
is GetCredentialCancellationException -> {
// The user intentionally canceled the operation and chose not
// to share the credential.
}
is GetCredentialInterruptedException -> {
// Retry-able error. Consider retrying the call.
}
is NoCredentialException -> {
// No credential was available.
}
else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
}
}
credentialJson-এর উত্তরে একটি এনক্রিপ্ট করা identityToken (JWT) থাকে,
যা W3C দ্বারা সংজ্ঞায়িত। এই উত্তর তৈরি করার জন্য Wallet অ্যাপ দায়ী।
উদাহরণ:
{
"protocol" : "openid4vp-v1-signed",
"data" : {
<encrypted_response>
}
}
এই উত্তরের সত্যতা যাচাই করার জন্য এটি আপনার সার্ভারে ফেরত পাঠান। উত্তর ডিক্রিপ্ট ও যাচাই করুন দেখুন।
ওয়েব
Chrome বা অন্যান্য কাজ করে এমন ব্রাউজারে ডিজিটাল ক্রেডেনশিয়াল API ব্যবহার করে পরিচয় ক্রেডেনশিয়ালের অনুরোধ করতে, নিম্নলিখিত অনুরোধ করুন:
const credentialResponse = await navigator.credentials.get({
digital : {
requests : [
{
protocol: "openid4vp-v1-signed",
data: {<credential_request>} // This is an object, shouldn't be a string.
}
]
}
})
ক্রেডেনশিয়াল সংক্রান্ত উত্তর যাচাই করতে, এই API থেকে পাওয়া উত্তর আপনার সার্ভারে ফেরত পাঠান।
ধাপ গ: উত্তর ডিক্রিপ্ট ও যাচাই করা (সার্ভার-সাইড)
ওয়ালেট এনক্রিপ্ট করা identityToken (JWT) ফেরত দিলে, ডেটা বিশ্বাস করার আগে আপনাকে অবশ্যই
সার্ভারের দিক থেকে কঠোর যাচাইকরণ করতে হবে।
উত্তর ডিক্রিপ্ট করুন
JWE ডিক্রিপ্ট করতে, অনুরোধের
client_metadata-এ পাঠানো পাবলিক কী-এর সাথে সংশ্লিষ্ট প্রাইভেট কী ব্যবহার করুন। এটি থেকে vp_token পাওয়া যায়।
Python-এর উদাহরণ:
from jwcrypto import jwe, jwk
# Retrieve the Private Key from Datastore
reader_private_jwk = jwk.JWK.from_json(jwe_private_key_json_str)
# Save public key thumbprint for session transcript
encryption_public_jwk_thumbprint = reader_private_jwk.thumbprint()
# Decrypt the JWE encrypted response from Google Wallet
jwe_object = jwe.JWE()
jwe_object.deserialize(encrypted_jwe_response_from_wallet)
jwe_object.decrypt(reader_private_jwk)
decrypted_payload_bytes = jwe_object.payload
decrypted_data = json.loads(decrypted_payload_bytes)
decrypted_data-এর ফলে ক্রেডেনশিয়াল সহ vp_token JSON পাওয়া যাবে:
{
"vp_token":
{
"cred1": ["<base64UrlNoPadding_encoded_credential>"] // This applies to OpenID4VP 1.0 spec.
}
}
SessionTranscript আবার তৈরি করে DeviceResponse যাচাই করুন
- Android বা ওয়েব-নির্দিষ্ট হ্যান্ডওভার স্ট্রাকচার সহ ISO/IEC 18013-5:2021 থেকে SessionTranscript তৈরি করুন:
SessionTranscript = [
null, // DeviceEngagementBytes not available
null, // EReaderKeyBytes not available
[
"OpenID4VPDCAPIHandover",
AndroidHandoverDataBytes // BrowserHandoverDataBytes for Web
]
]
Android ও ওয়েব হ্যান্ডওভার, দুটির ক্ষেত্রেই, credential_request জেনারেট করতে আপনি যে nonce ব্যবহার করেছেন,
সেটিই ব্যবহার করুন।
Android Handover
AndroidHandoverData = [ origin, // "android:apk-key-hash:<base64SHA256_ofAppSigningCert>", nonce, // nonce that was used to generate credential request, encryption_public_jwk_thumbprint, // Encryption public key (JWK) Thumbprint ] AndroidHandoverDataBytes = hashlib.sha256(cbor2.dumps(AndroidHandoverData)).digest()
ব্রাউজার হ্যান্ডওভার
BrowserHandoverData =[ origin, // Origin URL nonce, // nonce that was used to generate credential request encryption_public_jwk_thumbprint, // Encryption public key (JWK) Thumbprint ] BrowserHandoverDataBytes = hashlib.sha256(cbor2.dumps(BrowserHandoverData)).digest()
SessionTranscript ব্যবহার করে, ISO/IEC 18013-5:2021 ক্লজ ৯ অনুযায়ী ডিভাইসের উত্তর যাচাই করতে হবে।
এই যাচাইকরণে চারটি চেক অন্তর্ভুক্ত:
- ইস্যুকারীর সার্টিফিকেট চেক করুন:
issuerAuthথেকে ইস্যুকারীর সাইনিং সার্টিফিকেট চেইন এক্সট্র্যাক্ট করুন এবং বিশ্বস্ত IACA রুট সার্টিফিকেটের সাথে এটি যাচাই করুন। সমর্থিত ইস্যুকারী ও IACA সার্টিফিকেট দেখুন (এবং স্যান্ডবক্স টেস্ট আইডি দিয়ে টেস্ট করার সময় Utopia Sandbox cert যোগ করুন)। - MSO সিগনেচার যাচাই করুন (ISO/IEC 18013-5 বিভাগ 9.1.2)।
- ডেটা এলিমেন্টের (ISO/IEC 18013-5 বিভাগ 9.1.2) জন্য হিসাব ও চেক করুন
ValueDigests। deviceSignatureস্বাক্ষর যাচাই করুন (ISO/IEC 18013-5 অনুচ্ছেদ 9.1.3)।
{
"version": "1.0",
"documents": [
{
"docType": "org.iso.18013.5.1.mDL",
"issuerSigned": {
"nameSpaces": {...}, // contains data elements
"issuerAuth": [...] // COSE_Sign1 w/ issuer PK, mso + sig
},
"deviceSigned": {
"nameSpaces": 24(<< {} >>), // empty
"deviceAuth": {
"deviceSignature": [...] // COSE_Sign1 w/ device signature
}
}
}
],
"status": 0
}
ধাপ ঘ (ঐচ্ছিক): গোপনীয়তা সুরক্ষিত রেখে বয়স যাচাইকরণ (ZKP)
জিরো-নলেজ প্রুফ (যেমন, ব্যবহারকারীর সঠিক জন্মতারিখ না দেখে
তিনি ১৮ বছরের বেশি বয়সী কিনা তা যাচাই করা) সংক্রান্ত সুবিধা দিতে, আপনার অনুরোধের ফর্ম্যাট পরিবর্তন করে
mso_mdoc_zk করুন এবং প্রয়োজনীয় zk_system_type কনফিগারেশন প্রদান করুন।
ZKP কী এবং এর ক্ষমতা সম্পর্কে হাই-লেভেল ওভারভিউ পেতে, FAQ দেখুন।
...
"dcql_query": {
"credentials": [{
"id": "cred1",
"format": "mso_mdoc_zk",
"meta": {
"doctype_value": "org.iso.18013.5.1.mDL"
"zk_system_type": [
{
"system": "longfellow-libzk-v1",
"circuit_hash": "f88a39e561ec0be02bb3dfe38fb609ad154e98decbbe632887d850fc612fea6f", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 5,
"block_enc_hash": 4096,
"block_enc_sig": 2945,
}
{
"system": "longfellow-libzk-v1",
"circuit_hash": "137e5a75ce72735a37c8a72da1a8a0a5df8d13365c2ae3d2c2bd6a0e7197c7c6", // This will differ if you need more than 1 attribute.
"num_attributes": 1, // number of attributes (in claims) this has can support
"version": 6,
"block_enc_hash": 4096,
"block_enc_sig": 2945,
}
],
"verifier_message": "challenge"
},
"claims": [{
...
"client_metadata": {
"jwks": {
"keys": [ // sample request encryption key
{
...
আপনি ওয়ালেট থেকে এনক্রিপ্ট করা জিরো-নলেজ প্রুফ পাবেন। আপনি Google-এর longfellow-zk লাইব্রেরি ব্যবহার করে ইস্যুকারীর IACA সার্টিফিকেটের সাথে এই প্রমাণ যাচাই করতে পারবেন।
verifier-service-এ একটি ডিপ্লয়মেন্ট-রেডি, Docker-ভিত্তিক সার্ভার থাকে যা আপনাকে ইস্যুকারী IACA সার্টিফিকেটের বিরুদ্ধে উত্তর যাচাই করতে দেয়।
আপনি বিশ্বাস করতে চান এমন IACA ইস্যুকারী সার্টিফিকেট ম্যানেজ করতে certs.pem পরিবর্তন করতে পারবেন।
SDK, রেফারেন্স ইমপ্লিমেন্টেশন ও সহায়তা
আপনার ইমপ্লিমেন্টেশন দ্রুত করতে আমাদের ওপেন-সোর্স লাইব্রেরি, রেফারেন্স সার্ভার এবং ওয়েব যাচাইকারী টুল ব্যবহার করুন:
| রিসোর্স / লাইব্রেরি | এটি কী প্রদান করে | লিঙ্ক |
|---|---|---|
| পরিচয় যাচাইকারীর রেফারেন্স ইমপ্লিমেন্টেশন | OpenID4VP অনুরোধ জেনারেশন, JWS সাইনিং, JWE ডিক্রিপশন এবং mdoc উত্তর যাচাইকরণ প্রদর্শনকারী স্যাম্পেল সার্ভার এবং ক্লায়েন্ট। | GitHub রিপোজিটরি |
| Multipaz SDK | ওপেন-সোর্স লাইব্রেরি (OpenWallet Foundation) যার মধ্যে CBOR ডিকোডিংয়ের জন্য DeviceResponseParser, SessionTranscript রিকনস্ট্রাকশন এবং ISO/IEC 18013-5/7 সিগনেচার যাচাইকরণ অন্তর্ভুক্ত। |
openwallet-foundation/multipaz |
| Longfellow ZKP লাইব্রেরি ও যাচাইকারী পরিষেবা | জিরো-নলেজ প্রুফ (mso_mdoc_zk) বয়স ও অ্যাট্রিবিউট অ্যাসার্শন যাচাই করার জন্য ওপেন-সোর্স লাইব্রেরি ও Docker-ভিত্তিক সার্ভার। |
google/longfellow-zk |
| ইন্টার্যাক্টিভ ওয়েব যাচাইকরণ টুল | Google Wallet-এর সাথে W3C ডিজিটাল ক্রেডেনশিয়াল API / OpenID4VP অনুরোধ পরীক্ষা করার জন্য হোস্ট করা ওয়েব যাচাইকারী। | verifier.multipaz.org |
| OpenID4VP 1.0 স্পেসিফিকেশন | যাচাইযোগ্য উপস্থাপনা 1.0 প্রোটোকল স্পেসিফিকেশনের জন্য অফিসিয়াল OpenID। | OpenID4VP স্পেসিফিকেশন |
| FAQ ও ডেভেলপার সহায়তা | সাধারণ টেকনিক্যাল ইন্টিগ্রেশন সংক্রান্ত প্রশ্নের উত্তর অথবা ডিবাগিং সংক্রান্ত সহায়তার জন্য wallet-identity-rp-support@google.com-এ ইমেল করুন। |
প্রযুক্তিগত ইন্টিগ্রেশন সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্ন |