@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:jwkis used instead ofdid:key
Usage
npm i @transmute/vc-di-sd --saveDevelop
npm i
npm t
npm run lint
npm run buildimport 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