vc di sd

VC/VC++ 2025-07-27

@transmute/vc-di-sd

Questions? Contact Transmute

? Warning Experimental

Experimental implementation inspired by but not compatible with:

  • https://g*i*th*ub.com/digitalbazaar/di-sd-primitives
  • https://**git*hub.com/digitalbazaar/ecdsa-sd-2023-cryptosuite

Currently all the canonicalization stuff is the same.

... but there are plans to investigate replacing urdna2015 with JSON Pointer. ... since JSON Pointer is already a dependency.

  • JWK and JWS are used instead of multiformats & multicodec & custom cbor packing...
  • did:jwk is used instead ofdid:key

Usage

npm i @transmute/vc-di-sd --save

Develop

npm i
npm t
npm run lint
npm run build
import sd from '@transmute/vc-di-sd'
const canonicalization = 'urdna2015'

Examples

const k = await sd.jose.controller.key.generate(alg)
const signer = await sd.jose.controller.signer(k.privateKeyJwk)
const verifier = await sd.jose.controller.verifier(k.publicKeyJwk)
const credential = await sd.jose.sign({
  signer,
  document: exampleVerifiableCredential,
  mandatoryPointers: ['/credentialSubject/driverLicense/issuingAuthority'],
  canonicalization,
  documentLoader,
})
const presentation = await sd.jose.present({
  verifier,
  document: credential,
  selectivePointers: ['/credentialSubject/driverLicense/dateOfBirth'],
  canonicalization,
  documentLoader,
})
const verification = await sd.jose.verify({
  verifier,
  document: presentation,
  canonicalization,
  documentLoader,
})
ES256
Controller
{
  "id": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2IiwiYWxnIjoiRVMyNTYiLCJ4IjoidzFwTnZTSnlaZjlFXzRpS29vT1VaeGFKUXd2QUhiX1Y5c2ZsSG5mU2s2ZyIsInkiOiJsYXg4ZWc3NEZKVlVZaG5BdmFKa2xkT1RwZVFMUmJTYjl3WVNqUU1iNWhRIn0#0",
  "type": "JsonWebKey",
  "controller": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2IiwiYWxnIjoiRVMyNTYiLCJ4IjoidzFwTnZTSnlaZjlFXzRpS29vT1VaeGFKUXd2QUhiX1Y5c2ZsSG5mU2s2ZyIsInkiOiJsYXg4ZWc3NEZKVlVZaG5BdmFKa2xkT1RwZVFMUmJTYjl3WVNqUU1iNWhRIn0",
  "publicKeyJwk": {
    "kty": "EC",
    "crv": "P-256",
    "alg": "ES256",
    "x": "w1pNvSJyZf9E_4iKooOUZxaJQwvAHb_V9sflHnfSk6g",
    "y": "lax8eg74FJVUYhnAvaJkldOTpeQLRbSb9wYSjQMb5hQ"
  },
  "privateKeyJwk": {
    "kty": "EC",
    "crv": "P-256",
    "alg": "ES256",
    "x": "w1pNvSJyZf9E_4iKooOUZxaJQwvAHb_V9sflHnfSk6g",
    "y": "lax8eg74FJVUYhnAvaJkldOTpeQLRbSb9wYSjQMb5hQ",
    "d": "scMGSKpUnBfAmEcNvECrpneNlVOqrZGUUcK60_T6IIw"
  }
}
Credential
{
  "@context": [
    "https://www.***w3.org/2018/credentials/v1",
    "https://www.tx*d*m*v.gov/credentials/v1",
    "https://w3id.org***/security/data-integrity/v1"
  ],
  "type": ["VerifiableCredential", "DriverLicenseCredential"],
  "issuer": "did:web:txdmv.gov",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "driverLicense": {
      "type": "DriverLicense",
      "documentIdentifier": "T21387yc328c7y32h23f23",
      "dateOfBirth": "01-01-1990",
      "expirationDate": "01-01-2030",
      "issuingAuthority": "TX"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "created": "2023-06-04T22:35:08.444Z",
    "cryptosuite": "di-sd-urdna2015-jose-2042",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:web:txdmv.gov#urn:ietf:params:oauth:jwk-thumbprint:sha-256:MggqrOi2MEJR1qOeF8Q9gKRxUNB9vrjbwqogJ1Er8k8",
    "keys": [
      {
        "kid": "#disclosure",
        "kty": "EC",
        "crv": "P-256",
        "alg": "ES256",
        "x": "jYId68wSRiE4juVnaWW0V6BcJ_ZDItX12XUMc70lkmU",
        "y": "Mmnw8koRUqgIx4IAt5xpEgewa0LZ6qnM0k10gya9opE",
        "claimset_formats_supported": ["w3cvc-jsonld"],
        "claimset_claims_supported": [
          "/credentialSubject/driverLicense/issuingAuthority"
        ]
      },
      {
        "kid": "#hmac",
        "kty": "oct",
        "alg": "HS256",
        "use": "sig",
        "key_ops": ["sign"],
        "k": "hel_3wNuO5XYf-qs9-WiwWvC3vF8Ex0DisC_Lf924zI"
      },
      {
        "kid": "#mandatory",
        "kty": "oct",
        "k": "Kkchlbnz5M0gUEmsvqHWY1d0gYR3Gjzh5DTivzD7UVk"
      },
      {
        "kid": "#proof",
        "kty": "oct",
        "k": "N3ZIo4DTV7KVVThNNMceBE9eQKWpoKkCBXdyseM2_ok"
      }
    ],
    "signature": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..AmwQsW61wdJDUvJjtuZ5sEFfnJWXvfjF3vGWE6FEWf-WbuvRZvYIZpee-c6h_7HP2MSnXw9nTPLxn5ucwokbsQ",
    "signatures": [
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..P99od2sunRa0LhuTBsDexzBduPk-YowUFfLyQ5UMqspEjx-5ejXApFWthndCSqyjxHbv0B3VvF7wxghW7lDdhA",
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..8v4rcYfMuKRkAtLZucMpPegDw70TklsRUCHjvXF7Q998hqVZqBXnczwaYxcxvpFd2e_GAhNkNMzwQHw3lN_Wcw",
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..b3nmlkqKvnD39gqid49_HQ5tDyayr8l_AdfEGEixwM9u196Plf67axDNnoMC5ClL9exxqC21EbQgGYPYEp_EhA",
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..IMJcjf0s9YteSsy090M9BPzyYAc43Kkek8Rj0XnvVdIMDgzpHaAceizJymcWV7z9Ev2IBgJF2Ug56Shp2nxBWg",
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..73PiUdCyaYh6B1WJw3wI3Hx6YynElpmFt4YCgOiGejjiyJyXBoDWzaxzteyTuPMpxT4pDxuPAFkgLnJUbv-RXw"
    ]
  }
}
Presentation
{
  "@context": [
    "https://www.***w3.org/2018/credentials/v1",
    "https://www.tx*d*m*v.gov/credentials/v1",
    "https://w3id.org***/security/data-integrity/v1"
  ],
  "type": ["VerifiableCredential", "DriverLicenseCredential"],
  "credentialSubject": {
    "driverLicense": {
      "type": "DriverLicense",
      "dateOfBirth": "01-01-1990",
      "issuingAuthority": "TX"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "created": "2023-06-04T22:35:08.444Z",
    "cryptosuite": "di-sd-urdna2015-jose-2042",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:web:txdmv.gov#urn:ietf:params:oauth:jwk-thumbprint:sha-256:MggqrOi2MEJR1qOeF8Q9gKRxUNB9vrjbwqogJ1Er8k8",
    "keys": [
      {
        "kid": "#disclosure",
        "kty": "EC",
        "crv": "P-256",
        "alg": "ES256",
        "x": "jYId68wSRiE4juVnaWW0V6BcJ_ZDItX12XUMc70lkmU",
        "y": "Mmnw8koRUqgIx4IAt5xpEgewa0LZ6qnM0k10gya9opE",
        "claimset_formats_supported": ["w3cvc-jsonld"],
        "claimset_claims_supported": [
          "/credentialSubject/driverLicense/issuingAuthority"
        ]
      },
      {
        "kid": "#hmac",
        "kty": "oct",
        "alg": "HS256",
        "use": "sig",
        "key_ops": ["sign"],
        "k": "hel_3wNuO5XYf-qs9-WiwWvC3vF8Ex0DisC_Lf924zI"
      },
      {
        "kid": "#mandatory",
        "kty": "oct",
        "k": "Kkchlbnz5M0gUEmsvqHWY1d0gYR3Gjzh5DTivzD7UVk"
      },
      {
        "kid": "#proof",
        "kty": "oct",
        "k": "N3ZIo4DTV7KVVThNNMceBE9eQKWpoKkCBXdyseM2_ok"
      }
    ],
    "signature": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..AmwQsW61wdJDUvJjtuZ5sEFfnJWXvfjF3vGWE6FEWf-WbuvRZvYIZpee-c6h_7HP2MSnXw9nTPLxn5ucwokbsQ",
    "signatures": [
      "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..b3nmlkqKvnD39gqid49_HQ5tDyayr8l_AdfEGEixwM9u196Plf67axDNnoMC5ClL9exxqC21EbQgGYPYEp_EhA"
    ],
    "labels": {
      "c14n0": "uhpi1o2MvbeI9x3_F6bpLSmftQdig1cXdNW_NiNiuP_Q",
      "c14n1": "uNS9T1kHYBBJmLJdaBbA7oRgUqMexnkQfkZHWCdOb9gw",
      "c14n2": "uQtjiCdede86tckejVMZcZ3mOW-7z3n_D8lY5x7Jn_iE"
    },
    "mandatoryIndexes": ["0", "1", "2", "3", "5", "6"]
  }
}
Verification
{
  "verified": true,
  "document": {
    "@context": [
      "https://www.***w3.org/2018/credentials/v1",
      "https://www.tx*d*m*v.gov/credentials/v1",
      "https://w3id.org***/security/data-integrity/v1"
    ],
    "type": ["VerifiableCredential", "DriverLicenseCredential"],
    "credentialSubject": {
      "driverLicense": {
        "type": "DriverLicense",
        "dateOfBirth": "01-01-1990",
        "issuingAuthority": "TX"
      }
    }
  }
}
ES384
Controller
{
  "id": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwiYWxnIjoiRVMzODQiLCJ4IjoiX1BLaWZSc3RqRDZLUnBlYjlzSnRYWVBPUXBocTQwUDlndEFHOG01VG1RMy0xLWY0c3AxVElBU0pHWjdQUmJTTCIsInkiOiJzMzV1YlFJUGp4Y1FiajR5LU42dlF3V3BEcmRQM1JWdHNsOHhHSjk3RG9yUjFXM2FYdkhmOU1lUTVVLWFDVDhoIn0#0",
  "type": "JsonWebKey",
  "controller": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwiYWxnIjoiRVMzODQiLCJ4IjoiX1BLaWZSc3RqRDZLUnBlYjlzSnRYWVBPUXBocTQwUDlndEFHOG01VG1RMy0xLWY0c3AxVElBU0pHWjdQUmJTTCIsInkiOiJzMzV1YlFJUGp4Y1FiajR5LU42dlF3V3BEcmRQM1JWdHNsOHhHSjk3RG9yUjFXM2FYdkhmOU1lUTVVLWFDVDhoIn0",
  "publicKeyJwk": {
    "kty": "EC",
    "crv": "P-384",
    "alg": "ES384",
    "x": "_PKifRstjD6KRpeb9sJtXYPOQphq40P9gtAG8m5TmQ3-1-f4sp1TIASJGZ7PRbSL",
    "y": "s35ubQIPjxcQbj4y-N6vQwWpDrdP3RVtsl8xGJ97DorR1W3aXvHf9MeQ5U-aCT8h"
  },
  "privateKeyJwk": {
    "kty": "EC",
    "crv": "P-384",
    "alg": "ES384",
    "x": "_PKifRstjD6KRpeb9sJtXYPOQphq40P9gtAG8m5TmQ3-1-f4sp1TIASJGZ7PRbSL",
    "y": "s35ubQIPjxcQbj4y-N6vQwWpDrdP3RVtsl8xGJ97DorR1W3aXvHf9MeQ5U-aCT8h",
    "d": "7lY6gqws9sR1Wb01c-mjuiZaOXWcSi7SeVzzZfcLrZPEs2QR75ZBHLp_oQPZ1sAz"
  }
}
Credential
{
  "@context": [
    "https://www.***w3.org/2018/credentials/v1",
    "https://www.tx*d*m*v.gov/credentials/v1",
    "https://w3id.org***/security/data-integrity/v1"
  ],
  "type": ["VerifiableCredential", "DriverLicenseCredential"],
  "issuer": "did:web:txdmv.gov",
  "issuanceDate": "2010-01-01T19:23:24Z",
  "credentialSubject": {
    "driverLicense": {
      "type": "DriverLicense",
      "documentIdentifier": "T21387yc328c7y32h23f23",
      "dateOfBirth": "01-01-1990",
      "expirationDate": "01-01-2030",
      "issuingAuthority": "TX"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "created": "2023-06-04T22:35:08.444Z",
    "cryptosuite": "di-sd-urdna2015-jose-2042",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:web:txdmv.gov#urn:ietf:params:oauth:jwk-thumbprint:sha-256:MggqrOi2MEJR1qOeF8Q9gKRxUNB9vrjbwqogJ1Er8k8",
    "keys": [
      {
        "kid": "#disclosure",
        "kty": "EC",
        "crv": "P-384",
        "alg": "ES384",
        "x": "qdcRfjuILGDccRJH5d2BVCUrGLV2Qxh4_kXawAzgw6sDgYflZffcZ8hpkbd87Kql",
        "y": "o5rnvL5NSg16U9jC4clsDvRIGTbIz41UEb6fX9FBG1B0iWc53VNhDxB81CM7pAic",
        "claimset_formats_supported": ["w3cvc-jsonld"],
        "claimset_claims_supported": [
          "/credentialSubject/driverLicense/issuingAuthority"
        ]
      },
      {
        "kid": "#hmac",
        "kty": "oct",
        "alg": "HS256",
        "use": "sig",
        "key_ops": ["sign"],
        "k": "GKjIVq5TKq9lVcR0_qAtUEM2BokHjNvMK9zkCeL6STM"
      },
      {
        "kid": "#mandatory",
        "kty": "oct",
        "k": "E9gLXnMniQt2qCvUj5RPaFivYWQK6avP-uCcgpj8Q9o"
      },
      {
        "kid": "#proof",
        "kty": "oct",
        "k": "N3ZIo4DTV7KVVThNNMceBE9eQKWpoKkCBXdyseM2_ok"
      }
    ],
    "signature": "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..n1TuMczCJj3Bf74cI64g8XYsUufrHUgpd67XusfRhaplMh6WwEmoWHXELd9ve-u10yhuRS1g8KawS11Ne-FlKmaSc7XebEWJnte3RivG4aLQ_vPIw-wLmasiULjcTKhr",
    "signatures": [
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..ERNy2SubB9NpNRR0CkQXDFP1jHeQ1cmV0sv_KF-GXzak4KC_Oh32DutPllzShq4EuKnydPjZhgbUIPD9BRoOyNtz3jHIh9aQjgY95vc-7KJhAFBMGnBCO1m3quQ-nngu",
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..Nx3-nf8bDAImF7XbipVDBseYEzz2rG7vITQuHw8Zk8zvxfE5nHLTst-tDdt5HHPo1Wxod__u8ZGitxk3fD9Sg0gII7mB2_LbfCzXV1FG17w3ypnP45JqI22llZLl3xOB",
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..hXmNSJPi60KVS6n9dn0KJ8_zm8_Pl5U1JGUb9gw2Mgzo7ZKkB77bE08zpXqc-OKLS_GYYKUvk1iOkJ3CONdwmKST-by1dXMy7aKn-4Ug9IuP0TtSUMOwllcBtE_kO7vb",
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..SpLkve18fVU4X08RvwBFz1s_u1fpFR-qeeOIS9nR8uUsXPpIWhVG0rF2lGuRbPAPYNDpab0sEt1WGBbF5jKWBJMGJjL49aJLrkLm1CVmp6uvBGIIQHTF5PX7ji4Yb8Ku",
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..AzQSLXx3qu2tS4I6RQKSFdiTiy9WMMBsWQjqM6co4HZ-x7k4YxGkg-so9CSHyVVA5Ww1alKG4twToPNfurvZZPupkAxvKa7HQdYUfNkhINfPVc_R-vmyNSJ46ujGW0Ze"
    ]
  }
}
Presentation
{
  "@context": [
    "https://www.***w3.org/2018/credentials/v1",
    "https://www.tx*d*m*v.gov/credentials/v1",
    "https://w3id.org***/security/data-integrity/v1"
  ],
  "type": ["VerifiableCredential", "DriverLicenseCredential"],
  "credentialSubject": {
    "driverLicense": {
      "type": "DriverLicense",
      "dateOfBirth": "01-01-1990",
      "issuingAuthority": "TX"
    }
  },
  "proof": {
    "type": "DataIntegrityProof",
    "created": "2023-06-04T22:35:08.444Z",
    "cryptosuite": "di-sd-urdna2015-jose-2042",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:web:txdmv.gov#urn:ietf:params:oauth:jwk-thumbprint:sha-256:MggqrOi2MEJR1qOeF8Q9gKRxUNB9vrjbwqogJ1Er8k8",
    "keys": [
      {
        "kid": "#disclosure",
        "kty": "EC",
        "crv": "P-384",
        "alg": "ES384",
        "x": "qdcRfjuILGDccRJH5d2BVCUrGLV2Qxh4_kXawAzgw6sDgYflZffcZ8hpkbd87Kql",
        "y": "o5rnvL5NSg16U9jC4clsDvRIGTbIz41UEb6fX9FBG1B0iWc53VNhDxB81CM7pAic",
        "claimset_formats_supported": ["w3cvc-jsonld"],
        "claimset_claims_supported": [
          "/credentialSubject/driverLicense/issuingAuthority"
        ]
      },
      {
        "kid": "#hmac",
        "kty": "oct",
        "alg": "HS256",
        "use": "sig",
        "key_ops": ["sign"],
        "k": "GKjIVq5TKq9lVcR0_qAtUEM2BokHjNvMK9zkCeL6STM"
      },
      {
        "kid": "#mandatory",
        "kty": "oct",
        "k": "E9gLXnMniQt2qCvUj5RPaFivYWQK6avP-uCcgpj8Q9o"
      },
      {
        "kid": "#proof",
        "kty": "oct",
        "k": "N3ZIo4DTV7KVVThNNMceBE9eQKWpoKkCBXdyseM2_ok"
      }
    ],
    "signature": "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..n1TuMczCJj3Bf74cI64g8XYsUufrHUgpd67XusfRhaplMh6WwEmoWHXELd9ve-u10yhuRS1g8KawS11Ne-FlKmaSc7XebEWJnte3RivG4aLQ_vPIw-wLmasiULjcTKhr",
    "signatures": [
      "eyJhbGciOiJFUzM4NCIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..ERNy2SubB9NpNRR0CkQXDFP1jHeQ1cmV0sv_KF-GXzak4KC_Oh32DutPllzShq4EuKnydPjZhgbUIPD9BRoOyNtz3jHIh9aQjgY95vc-7KJhAFBMGnBCO1m3quQ-nngu"
    ],
    "labels": {
      "c14n0": "ucRDH5ynrwXddCiA6XMMehGBi_vfkQRATWdSuB3jVncc",
      "c14n1": "ujUK8o4kwI2TvScWu7C97s_ppTZ3lLWc-M-5Zwq_OS0Q",
      "c14n2": "uVBbOqjaiw4wgaN90s088ra7GwGxNpeDH4p-tq_QgKFE"
    },
    "mandatoryIndexes": ["0", "2", "3", "4", "5", "6"]
  }
}
Verification
{
  "verified": true,
  "document": {
    "@context": [
      "https://www.***w3.org/2018/credentials/v1",
      "https://www.tx*d*m*v.gov/credentials/v1",
      "https://w3id.org***/security/data-integrity/v1"
    ],
    "type": ["VerifiableCredential", "DriverLicenseCredential"],
    "credentialSubject": {
      "driverLicense": {
        "type": "DriverLicense",
        "dateOfBirth": "01-01-1990",
        "issuingAuthority": "TX"
      }
    }
  }
}
RS256
Controller
下载源码

通过命令行克隆项目:

git clone https://github.com/transmute-industries/vc-di-sd.git