Lewati ke isi

Layanan Verifikasi

Modul Verifikasi menyediakan alat untuk membuat, menyajikan, dan memverifikasi Kredensial yang Dapat Diverifikasi (VC) dan Presentasi yang Dapat Diverifikasi (VP) di blockchain IDCHAIN. Hal ini memungkinkan pengungkapan selektif, verifikasi berbasis tantangan, dan validasi bukti.

Ringkasan

Layanan Verifikasi memungkinkan pengembang untuk:

  • Buat Presentasi yang Dapat Diverifikasi (VP) untuk berbagi kredensial.
  • Dapatkan bukti dengan pengungkapan selektif (termasuk atau kecualikan klaim).
  • Verifikasi presentasi (dengan tantangan dan pemeriksaan domain).
  • Verifikasi kredensial individu.

Semua verifikasi menggunakan pemeriksaan kriptografi dan resolusi on-chain untuk DID, skema, dan status kredensial.

Referensi API

Atur Presentasi

Verification.setPresentation(credential, holder, validUntil, options?): Promise<VerifiablePresentation>

Membuat Presentasi yang Dapat Diverifikasi dari kredensial, secara opsional hanya mengungkapkan klaim yang dipilih.

Parameter:

  • credential (VerifiableCredential): Kredensial yang diterbitkan untuk ditunjukkan.
  • holder (HolderOptions): Objek yang berisi:
  • uidDocument: Dokumen DID Pemegang.
  • signers: Array UidKeyringPair untuk menandatangani presentasi.
  • validUntil (Date): Tanggal kedaluwarsa presentasi.
  • optional (opsional):
  • challenge (string): Tantangan acak untuk perlindungan pemutaran ulang.
  • includeClaims (string[]): Jalur klaim yang akan diungkapkan (misalnya, ["/NIK"]).
  • excludeClaims (string[]): Jalur klaim yang akan disembunyikan.

Pengembalian:

  • VerifiablePresentation: Presentasi yang ditandatangani dan sesuai dengan W3C.

Contoh:

const vp = await Verification.setPresentation(
  vc,
  {
    uidDocument: userDid.document,
    signers: [userAccount],
  },
  new Date(Date.now() + 10 * 60 * 1000),
  {
    includeClaims: ["/NIK"], // Only reveal NIK
    challenge: "random-challenge",
  }
);
console.log("Verifiable Presentation:", vp);

Verifikasi Presentasi

Verification.verifyPresentation(presentation, options?): Promise<any>

Memverifikasi Presentasi yang Dapat Diverifikasi, memeriksa bukti, tantangan, dan kredensial yang mendasarinya.

Parameter:

  • presentasi (VerifiablePresentation): VP yang akan memverifikasi.
  • opsi (opsional):
  • challenge (string): Harus cocok dengan yang digunakan di setPresentation.
  • domain (string): Batasan domain (opsional).
  • verifier (Uid): DID dari verifikator.
  • proofTypes (string[]): Membatasi jenis bukti tertentu.
  • proofPurpose (string): Validasi tujuan bukti (misalnya, "otentikasi").
  • now (Tanggal): Waktu khusus saat ini untuk validasi.
  • tolerance (angka): Toleransi jam dalam milidetik.
  • udiDocument (IUidDocument[]): Skema yang diperlukan untuk validasi.
  • didResolver (fungsi | UidDocument[]): DID penyelesai atau cache.
  • credentialStatusLoader (fungsi): Loader untuk status kredensial.

Pengembalian:

  • object: Hasil verifikasi (termasuk validitas dan kesalahan).

Contoh:

const verificationResult = await Verification.verifyPresentation(vp, {
  challenge: "random-challenge",
  now: new Date(),
});
console.log("Verification Result:", verificationResult);

Contoh Lengkap

import {
  Verification,
  Credential,
  AccountService,
  DidService,
  fromProperties,
  UidDocumentSchema,
} from "@idchain-sdk";

async function createAndVerifyPresentation() {
  // Siapkan akun, DID, dan kredensial (langkah serupa seperti di Layanan Kredensial)
  const { mnemonic: attesterMnemonic, account: attester } =
    await AccountService.generateAccount();
  const { mnemonic: userMnemonic, account: user } =
    await AccountService.generateAccount();

  const attesterDid = await DidService.createDidAttester(
    attester,
    {
      authentication: { publicKey: attester.publicKey, type: "ed25519" },
      keyAgreement: { publicKey: attester.publicKey, type: "x25519" },
      assertionMethod: { publicKey: attester.publicKey, type: "ed25519" },
      capabilityDelegation: { publicKey: attester.publicKey, type: "ed25519" },
    },
    async ({ data }) => ({
      keyType: "ed25519",
      signature: attester.sign(data),
    })
  );

  const userDid = await DidService.createDidClaimer(
    user,
    {
      authentication: { publicKey: user.publicKey, type: "ed25519" },
    },
    async ({ data }) => ({
      keyType: "ed25519",
      signature: user.sign(data),
    })
  );

  // Membuat skema dan kredensial
  const schema = fromProperties(
    "KTP Schema",
    {
      NIK: { type: "string" },
      Nama: { type: "string" },
      TTL: { type: "string" },
      status: { type: "string" },
    },
    "V1"
  );
  await UidDocumentSchema.storeSchema(attester, attesterDid.uri, schema);

  const unsignedVc = await Credential.requestAttestation(
    userDid.document.uri,
    schema,
    {
      NIK: "1122334455",
      Nama: "Charlie",
      TTL: "1990-12-01",
      status: "Married",
    },
    attesterDid.uri
  );
  const vc = await Credential.issueAttestation(
    unsignedVc,
    attesterDid,
    attester
  );

  // Buat Presentasi yang Dapat Diverifikasi dengan pengungkapan selektif
  const vp = await Verification.setPresentation(
    vc,
    { uidDocument: userDid.document, signers: [user] },
    new Date(Date.now() + 5 * 60 * 1000),
    {
      includeClaims: ["/NIK"], // Only reveal NIK
      challenge: "audit-challenge-123",
    }
  );

  // Verifikasi presentasi
  const verification = await Verification.verifyPresentation(vp, {
    challenge: "audit-challenge-123",
    now: new Date(),
  });

  console.log("Verification Result:", verification);
}

Penanganan Kesalahan

  • Challenge tidak valid: Verifikasi presentasi gagal jika tantangan tidak cocok.
  • VP atau VC yang kedaluwarsa: Mengembalikan kesalahan validasi jika batasan waktu gagal.
  • Bukti tidak valid: Setiap gangguan pada data atau bukti akan membatalkan verifikasi.
  • Skema tidak cocok: Jika cTypes atau udiDocument diperlukan dan tidak cocok, verifikasi gagal.

Modul Terkait