@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 --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\"
}
}
}
}
