Skip to content

Credential Verification Network

**Cross-industry · Education · Licensing · Certifications**

Overview

Credential Verification Network

Cross-industry · Education · Licensing · Certifications

The problem

Credentials, university degrees, professional licenses, industry certifications, form the fabric of who can do what in society. Yet their verification infrastructure is embarrassing:

  • Employer calls registrar: days of phone tag.
  • PDF verification: a PDF diploma is trivially forged.
  • Third-party verifiers (Parchment, NSC): each has coverage gaps and proprietary APIs.
  • Revocation barely works. A doctor’s license revoked in State A may not be visible to employers / patients in State B for months.
  • Cross-jurisdiction reciprocity is manual. “Yes, a PharmD from India is equivalent to…” → bureaucratic process taking months.
  • Sub-attributes are lost. “Bachelor’s in CS with specialization in security from University X, GPA 3.8, in 2023” becomes a binary did-they-or-didn’t-they.

Why Quidnug fits

Credentials are signed claims from identified issuers about subjects. That’s identity transactions + trust edges. Revocation is an anchor invalidation. Cross-jurisdiction trust is relational trust between credential issuers.

ProblemQuidnug primitive
”Did University X issue this degree?”Signed IDENTITY/TITLE by University X
”Is University X a real university?”Accreditor’s trust edge in University X
”Did State A revoke Dr. Y’s license?”Invalidation anchor from State A
”Is State A’s license valid in State B?”Reciprocity trust edges
”Employer trusts foreign degrees”Relational trust across jurisdictions
”Recovery if registrar’s key is lost”Guardian set for the registrar

High-level architecture

credentials.education (domain)
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
Accreditor-US Accreditor-EU Accreditor-APAC
(SACSCOC, etc.) (ENQA, etc.) (regional orgs)
│ │ │
│ trust edges to │ trust edges to │ trust edges to
│ accredited │ accredited │ accredited
│ universities │ universities │ universities
▼ ▼ ▼
Universities Universities Universities
│ │ │
│ issue credentials │ │
▼ ▼ ▼
Students Students Students
(credential holders' quids)

Data model

Quids

  • Accreditor, SACSCOC, ABET, NASAA, etc. Top of trust hierarchy.
  • University / issuer, accredited by one or more accreditors.
  • Student / professional, credential holder.
  • State board (for professional licenses), medical boards, bar associations, CPA boards, etc.

Domain

credentials.education
├── credentials.education.undergraduate
├── credentials.education.graduate
├── credentials.education.certifications
credentials.licensing.medicine.texas
credentials.licensing.medicine.california
credentials.licensing.bar.ny
credentials.certifications.aws
credentials.certifications.cncf
credentials.certifications.iso

Credential as identity + title

{
"type":"TITLE",
"assetId":"degree-uoftexas-austin-alice-2023-cs-bs",
"domain":"credentials.education.undergraduate",
"titleType":"academic-degree",
"owners":[{"ownerId":"student-alice-chen","percentage":100.0}],
"attributes":{
"issuer":"university-of-texas-austin",
"degreeType":"Bachelor of Science",
"field":"Computer Science",
"specialization":"Cybersecurity",
"gpa":"3.84",
"graduationDate":"2023-05-15",
"classRank":"summa-cum-laude",
"transcriptHash":"<sha256 of full transcript>",
"registrarSignature":"<separate sig by registrar quid>"
},
"signatures":{
"university-of-texas-austin":"<sig>",
"registrar-ut-austin":"<sig>"
}
}

Professional license

{
"type":"TITLE",
"assetId":"license-medical-texas-dr-jones-12345",
"domain":"credentials.licensing.medicine.texas",
"titleType":"medical-license",
"owners":[{"ownerId":"dr-jones-cardiology","percentage":100.0}],
"attributes":{
"issuer":"texas-medical-board",
"licenseNumber":"12345",
"issuedDate":"2015-08-20",
"renewalDate":"2024-08-20",
"specialty":"Cardiology",
"boardCertifications":["ABIM"],
"status":"active"
},
"signatures":{"texas-medical-board":"<sig>"}
}

Verification events

eventType: "credential.verified"
subjectId: "degree-uoftexas-austin-alice-2023-cs-bs"
payload:
verifier: "employer-acme-corp"
verifiedAt: 1713400000
verificationPurpose: "pre-employment background check"
signer: employer-acme-corp
eventType: "credential.revoked"
subjectId: "license-medical-texas-dr-smith-99999"
payload:
revoker: "texas-medical-board"
reason: "malpractice-ruling"
effectiveAt: 1713400000
caseReference: "TMB-2026-0123"
signer: texas-medical-board

Reciprocity / cross-jurisdiction

Trust edges model reciprocity:

Terminal window
# Texas recognizes California medical licenses
curl -X POST $NODE/api/trust -d '{
"truster":"texas-medical-board",
"trustee":"california-medical-board",
"trustLevel":0.9,
"domain":"credentials.licensing.medicine",
"description":"Reciprocity agreement per TX Rule 163.3(b)"
}'
# Indirectly: employer in Texas trusts CA doctor's license
# at trust(tx-board → ca-board) × trust(ca-board → ca-doctor) = 0.81

Employer verification flow

func (employer *Employer) VerifyCredential(ctx context.Context, candidateID string, credentialID string) (*VerifyResult, error) {
// Get the credential title
title, err := employer.client.GetTitle(ctx, credentialID)
if err != nil { return nil, err }
// Check if holder matches
if !hasOwner(title, candidateID) {
return &VerifyResult{Valid: false, Reason: "Credential not issued to this candidate"}, nil
}
// Check issuer's trust
issuer := title.Attributes["issuer"].(string)
domain := title.Domain
issuerTrust, _ := employer.client.GetTrust(ctx, employer.quid, issuer, domain, &GetTrustOptions{MaxDepth: 3})
if issuerTrust.TrustLevel < 0.5 {
return &VerifyResult{
Valid: false,
Reason: fmt.Sprintf("Issuer trust too low: %.2f (need 0.5+)", issuerTrust.TrustLevel),
TrustPath: issuerTrust.TrustPath,
}, nil
}
// Check for revocation events
events, _ := employer.client.GetSubjectEvents(ctx, credentialID, "TITLE")
for _, ev := range events {
if ev.EventType == "credential.revoked" {
revoker := ev.Payload["revoker"].(string)
// Only the original issuer (or their current authorized
// successor) can revoke
if revoker == issuer || canRevoke(revoker, issuer) {
return &VerifyResult{
Valid: false,
Reason: fmt.Sprintf("Credential revoked by %s: %s",
revoker, ev.Payload["reason"]),
}, nil
}
}
}
// Check expiration
if renewalDate, ok := title.Attributes["renewalDate"]; ok {
if parseDate(renewalDate.(string)).Before(time.Now()) {
return &VerifyResult{Valid: false, Reason: "Credential expired"}, nil
}
}
// Log verification
employer.LogVerification(ctx, credentialID)
return &VerifyResult{
Valid: true,
IssuerTrust: issuerTrust.TrustLevel,
TrustPath: issuerTrust.TrustPath,
}, nil
}

Revocation propagation

State medical board revokes Dr. Smith’s license:

Terminal window
curl -X POST $NODE/api/v1/events -d '{
"subjectId":"license-medical-texas-dr-smith-99999",
"subjectType":"TITLE",
"eventType":"credential.revoked",
"payload":{
"revoker":"texas-medical-board",
"reason":"malpractice-conviction",
"effectiveAt":1713400000,
"caseReference":"TMB-2026-0123"
},
"creator":"texas-medical-board","signature":"<sig>"
}'

Push gossip propagates to all hospital / insurer / pharmacy nodes within minutes. Every verification query from that point forward returns “revoked.”

Issuer key rotation

University loses their registrar HSM. Guardian recovery:

Terminal window
curl -X POST $NODE/api/v2/guardian/recovery/init -d '{
"subjectQuid":"university-of-texas-austin",
"fromEpoch":0,
"toEpoch":1,
"newPublicKey":"<hex>",
"guardianSigs":[
{"guardianQuid":"ut-system-president","keyEpoch":0,"signature":"<sig>"},
{"guardianQuid":"ut-provost","keyEpoch":0,"signature":"<sig>"},
{"guardianQuid":"sacscoc-accreditor","keyEpoch":0,"signature":"<sig>"}
],
...
}'

Post-rotation, historical degrees (signed by old-epoch key) remain valid, old epochs are preserved, not invalidated. New degrees use the new key.

Key Quidnug features

  • Title transactions for credentials with structured attributes.
  • Event streams for verification + revocation history.
  • Trust edges for accreditation hierarchy + reciprocity.
  • Guardian recovery for issuer key management.
  • Push gossip for fast revocation propagation.
  • Domain hierarchy for jurisdiction + credential type.
  • GuardianResignation (QDP-0006), a university losing accreditation can be handled via accreditor’s revoking trust edges + issuer’s self-rotation.

Value delivered

DimensionBeforeWith Quidnug
Employer verificationPhone calls, daysAPI query, seconds
Revocation propagationMonths cross-jurisdictionMinutes
Forgery resistancePaper/PDF trivial to fakeCryptographically signed; forgery = compromise
Cross-jurisdiction creditManual reciprocity paperworkTrust edges; transitive
Sub-attribute preservationLost in PDFStructured on-chain
Audit of who verifiedNoneSigned event per verification
Employer customizationBinaryRelational trust; tune accreditor trust per-employer

What’s in this folder

Runnable POC

Full end-to-end demo at examples/credential-verification-network/:

  • credential_verify.py, standalone verifier logic.
  • credential_verify_test.py, 10 pytest cases covering direct + transitive trust, revocation, threshold tuning, cross-jurisdiction observer-relative verdicts.
  • demo.py, seven-step end-to-end flow against a live Quidnug node: register actors, establish accreditation, issue degree, verify from US + APAC employer perspectives, revoke, re-verify, cross-jurisdiction credential.
Terminal window
cd examples/credential-verification-network
python demo.py

Implementation

Concrete API calls, pseudocode, signing shape.

Implementation: Credential Verification Network

1. Accreditor + issuer setup

Terminal window
# Accreditor (top-level trust root)
curl -X POST $NODE/api/identities -d '{
"quidId":"sacscoc",
"name":"Southern Association of Colleges and Schools",
"homeDomain":"credentials.education.accreditation",
"creator":"sacscoc","updateNonce":1
}'
# Accreditor's guardian set (board of directors quorum)
curl -X POST $NODE/api/v2/guardian/set-update -d '{ /* ... */ }'
# University quid
curl -X POST $NODE/api/identities -d '{
"quidId":"university-of-texas-austin",
"name":"University of Texas at Austin",
"homeDomain":"credentials.education.undergraduate",
"creator":"university-of-texas-austin","updateNonce":1
}'
# Accreditor endorses the university
curl -X POST $NODE/api/trust -d '{
"truster":"sacscoc",
"trustee":"university-of-texas-austin",
"trustLevel":0.95,
"domain":"credentials.education",
"nonce":1,
"validUntil":<now + 10y>, /* accreditation typically 10 years */
"description":"Regional accreditation valid through 2036"
}'

2. Issue a credential

Terminal window
# University issues a degree to a student
curl -X POST $NODE/api/v1/titles -d '{
"type":"TITLE",
"assetId":"degree-uoftexas-alice-2023-cs-bs",
"domain":"credentials.education.undergraduate",
"titleType":"academic-degree",
"owners":[{"ownerId":"student-alice-chen","percentage":100.0}],
"attributes":{
"issuer":"university-of-texas-austin",
"degreeType":"Bachelor of Science",
"field":"Computer Science",
"specialization":"Cybersecurity",
"graduationDate":"2023-05-15",
"gpa":"3.84",
"transcriptHash":"<sha256>",
"honorDesignation":"summa-cum-laude"
},
"creator":"university-of-texas-austin",
"signatures":{
"university-of-texas-austin":"<sig>",
"registrar-ut-austin":"<sig>"
}
}'

3. Professional license example

Terminal window
# State medical board issues license
curl -X POST $NODE/api/v1/titles -d '{
"assetId":"license-medical-texas-dr-jones-12345",
"domain":"credentials.licensing.medicine.texas",
"titleType":"medical-license",
"owners":[{"ownerId":"dr-jones-cardiology","percentage":100.0}],
"attributes":{
"issuer":"texas-medical-board",
"licenseNumber":"12345",
"issuedDate":"2015-08-20",
"renewalDate":"2025-08-20",
"specialty":"Cardiology",
"status":"active"
},
"signatures":{"texas-medical-board":"<sig>"}
}'

4. Reciprocity edges

Terminal window
# Texas board recognizes California licenses
curl -X POST $NODE/api/trust -d '{
"truster":"texas-medical-board",
"trustee":"california-medical-board",
"trustLevel":0.9,
"domain":"credentials.licensing.medicine",
"description":"Reciprocity: TX Admin Code 163.3(b)"
}'
# Similarly reverse
curl -X POST $NODE/api/trust -d '{
"truster":"california-medical-board",
"trustee":"texas-medical-board",
"trustLevel":0.9,
"domain":"credentials.licensing.medicine",
"description":"Mutual recognition"
}'

A California hospital verifying a Texas-licensed doctor gets trust: ca-board → tx-board → dr-jones = 0.9 × (direct trust of board in the doctor, typically 0.95 if active) = 0.855. Above threshold → accepted.

5. Employer verification

type CredentialVerifier struct {
quid string
client QuidnugClient
}
func (v *CredentialVerifier) Verify(ctx context.Context, credentialID string, expectedHolder string) (*VerificationResult, error) {
title, err := v.client.GetTitle(ctx, credentialID)
if err != nil {
return nil, err
}
// Check holder matches
hasHolder := false
for _, owner := range title.Owners {
if owner.OwnerID == expectedHolder {
hasHolder = true
break
}
}
if !hasHolder {
return &VerificationResult{Valid: false, Reason: "Credential not issued to this holder"}, nil
}
// Check issuer trust
issuer := title.Attributes["issuer"].(string)
issuerTrust, err := v.client.GetTrust(ctx, v.quid, issuer,
title.Domain, &GetTrustOptions{MaxDepth: 3})
if err != nil || issuerTrust.TrustLevel < 0.5 {
return &VerificationResult{
Valid: false,
Reason: fmt.Sprintf("Issuer trust %.2f below threshold", issuerTrust.TrustLevel),
}, nil
}
// Check for revocation
events, _ := v.client.GetSubjectEvents(ctx, credentialID, "TITLE")
for _, ev := range events {
if ev.EventType == "credential.revoked" {
revoker := ev.Payload["revoker"].(string)
if revoker == issuer {
return &VerificationResult{
Valid: false,
Reason: fmt.Sprintf("Revoked by %s: %s",
revoker, ev.Payload["reason"]),
}, nil
}
}
}
// Check renewal date
if renewal, ok := title.Attributes["renewalDate"]; ok {
if parseDate(renewal.(string)).Before(time.Now()) {
return &VerificationResult{Valid: false, Reason: "Expired"}, nil
}
}
// Log verification
v.emitVerificationEvent(ctx, credentialID)
return &VerificationResult{
Valid: true,
IssuerTrust: issuerTrust.TrustLevel,
TrustPath: issuerTrust.TrustPath,
}, nil
}

6. Revocation

Terminal window
curl -X POST $NODE/api/v1/events -d '{
"subjectId":"license-medical-texas-dr-smith-99999",
"subjectType":"TITLE",
"eventType":"credential.revoked",
"payload":{
"revoker":"texas-medical-board",
"reason":"malpractice-conviction",
"effectiveAt":1713400000,
"caseReference":"TMB-2026-0123"
},
"creator":"texas-medical-board","signature":"<sig>"
}'

7. Testing

func TestCredential_BasicVerification(t *testing.T) {
// Accreditor → University → Student chain
// Verify returns valid with trust path
}
func TestCredential_RevocationPropagates(t *testing.T) {
// License issued
// Revocation event
// Subsequent verification returns invalid
}
func TestCredential_CrossJurisdictionReciprocity(t *testing.T) {
// TX board recognizes CA board
// TX hospital verifies CA-licensed doctor
// Trust path: TX employer → TX board → CA board → doctor
// Verification succeeds above threshold
}
func TestCredential_IssuerKeyRotation(t *testing.T) {
// University rotates key via guardian recovery
// Historical degrees still verify (old epoch preserved)
// New degrees signed with new epoch key
}

Where to go next

Threat model

Adversaries, assumed capabilities, mitigations.

Threat Model: Credential Verification Network

Assets

  1. Credential authenticity, degrees / licenses / certs represent something real.
  2. Issuer reputation, accreditor + issuer trust chain.
  3. Revocation integrity, a revoked credential must be unverifiable going forward.

Attackers

AttackerCapabilityGoal
Diploma millRegisters as “issuer”Issue fraudulent credentials
Credential holderHas legit credentialUse credential past revocation
Compromised issuerValid issuer signing keyIssue unauthorized credentials
EmployerRead-only accessData-mine beyond verification purpose
ExternalNo accessExploration / forgery

Threats and mitigations

T1. Diploma mill

Attack. Registers quid as “Prestigious Online University.” Issues fake degrees. Mitigation. Accreditor trust edges. Diploma mill isn’t accredited; its trust from any legitimate accreditor is zero. Employers query through accreditor hierarchy; diploma mill’s credentials fail verification.

T2. Compromised issuer

Attack. University registrar’s HSM stolen. Attacker issues forged degrees. Mitigation.

  • Guardian recovery rotates issuer key.
  • Anchor nonces prevent simple replay.
  • Forged credentials may be retracted via revocation events.

Residual risk. Between compromise and rotation, forged credentials can be issued. Mitigation: monitoring of issuance rate anomalies.

T3. Credential holder claims valid past revocation

Attack. License revoked; holder presents old verification to employer. Mitigation. Employer verifies via Quidnug at time-of-check, not from cached record. Revocation propagates within minutes.

T4. Cross-jurisdiction forgery

Attack. Attacker forges credentials from a distant- jurisdiction issuer that local verifiers don’t check. Mitigation. Trust chain must exist from verifier to issuer. No chain → trust = 0 → verification fails.

T5. Attribute tampering

Attack. Genuine degree, but claimed GPA higher than actual. Mitigation. Title attributes are signed. Tampering breaks the signature. Signature verified at each query.

T6. Revocation spam / abuse

Attack. Malicious “issuer” emits bogus credential.revoked events against legitimate credentials. Mitigation. Events signed by revoker. Only the original issuer (or their authorized successor) has valid authority. Verifier checks revoker = issuer; bogus revokers are ignored.

T7. Privacy (degree history → life history)

Concern. Verification events reveal “employer X did a background check on Alice on date Y.” Mitigation.

  • Verification events can be stored on a privacy-scoped subdomain accessible only to the subject.
  • Pseudonymous quids are an option.
  • Regulatory constraints (GDPR, CCPA) apply at application layer.

Not defended against

  1. Credential lookup via third-parties. Attacker sees what employers verify, pattern inference is possible.
  2. Holder impersonation at application layer. If an attacker convincingly claims to be Alice and uses Alice’s credential ID, verification confirms the credential exists but can’t prevent impersonation downstream.
  3. Issuer collusion with holder. University fraudulently issues a real-looking degree. Protocol verifies the signature; fraud is out-of-band.

References