{"_id":"@digitalbazaar/mldsa44-jcs-2024-cryptosuite","name":"@digitalbazaar/mldsa44-jcs-2024-cryptosuite","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@digitalbazaar/mldsa44-jcs-2024-cryptosuite","version":"1.0.0","description":"An ML-DSA 44 JCS Data Integrity cryptosuite for use with jsonld-signatures.","homepage":"https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite","repository":{"type":"git","url":"git+https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite.git"},"license":"BSD-3-Clause","type":"module","exports":"./lib/index.js","dependencies":{"@digitalbazaar/mldsa-multikey":"github:digitalbazaar/mldsa-multikey#main","base64url-universal":"^2.0.0","canonicalize":"^3.0.0"},"devDependencies":{"@digitalbazaar/data-integrity":"^2.5.0","@digitalbazaar/data-integrity-context":"^2.0.1","@digitalbazaar/did-io":"^2.1.1","@digitalbazaar/did-method-key":"^5.3.0","@digitalbazaar/eslint-config":"^8.0.1","@digitalbazaar/multikey-context":"^2.0.1","@digitalbazaar/security-document-loader":"^3.2.0","c8":"^11.0.0","chai":"^4.5.0","cross-env":"^10.1.0","eslint":"^9.39.4","jsonld-signatures":"^11.6.0","karma":"^6.4.4","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.2.0","karma-mocha":"^2.0.1","karma-mocha-reporter":"^2.2.5","karma-sourcemap-loader":"^0.4.0","karma-webpack":"^5.0.1","mocha":"^11.7.6","mocha-lcov-reporter":"^1.3.0","webpack":"^5.107.1"},"engines":{"node":">=22"},"scripts":{"test":"npm run test-node","test-karma":"karma start karma.conf.cjs","test-node":"cross-env NODE_ENV=test mocha --preserve-symlinks -t 30000 -A -R ${REPORTER:-spec} --require test/test-mocha.js test/*.spec.js","coverage":"cross-env NODE_ENV=test c8 npm run test-node","coverage-ci":"cross-env NODE_ENV=test c8 --reporter=lcovonly --reporter=text-summary --reporter=text npm run test-node","coverage-report":"c8 report","lint":"eslint ."},"c8":{"reporter":["lcov","text-summary","text"]},"gitHead":"77d5d7039e760689ddf2c19ad67208e3ef543ed3","_id":"@digitalbazaar/mldsa44-jcs-2024-cryptosuite@1.0.0","bugs":{"url":"https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite/issues"},"_nodeVersion":"22.22.2","_npmVersion":"11.13.0","dist":{"integrity":"sha512-mKX2Z7JwgENBQangnhaVGmiLfjurROiXTpa6U9pKz38rKfKe5SbWPQPGjFSG0omfHlb8EqwyaUG/DYwvHCjWaQ==","shasum":"3e2eb3dbe565b9ad4bad0668b41dd1c23c6ecc66","tarball":"https://registry.npmjs.org/@digitalbazaar/mldsa44-jcs-2024-cryptosuite/-/mldsa44-jcs-2024-cryptosuite-1.0.0.tgz","fileCount":6,"unpackedSize":15352,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDc9p2p+NwRRJ3Ic8fyCRXy1kbCMeWqaxkYFjnF+CfVIgIgGoLW0jUeLGeUULNCh1cHH8R/x+hkBgqrCjcM2bGeb3Y="}]},"_npmUser":{"name":"davidlehn","email":"dil@lehn.org"},"directories":{},"maintainers":[{"name":"dlongley","email":"dlongley@digitalbazaar.com"},{"name":"msporny","email":"msporny@digitalbazaar.com"},{"name":"davidlehn","email":"dil@lehn.org"},{"name":"gannan","email":"gannan@digitalbazaar.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mldsa44-jcs-2024-cryptosuite_1.0.0_1779842715713_0.9142816727925382"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-27T00:45:15.552Z","1.0.0":"2026-05-27T00:45:15.862Z","modified":"2026-05-27T00:45:16.144Z"},"maintainers":[{"name":"dlongley","email":"dlongley@digitalbazaar.com"},{"name":"msporny","email":"msporny@digitalbazaar.com"},{"name":"davidlehn","email":"dil@lehn.org"},{"name":"gannan","email":"gannan@digitalbazaar.com"}],"description":"An ML-DSA 44 JCS Data Integrity cryptosuite for use with jsonld-signatures.","homepage":"https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite","repository":{"type":"git","url":"git+https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite.git"},"bugs":{"url":"https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite/issues"},"license":"BSD-3-Clause","readme":"# ML-DSA JCS 2024 Data Integrity Cryptosuite _(@digitalbazaar/mldsa44-jcs-2024-cryptosuite)_\n\n> ML-DSA JCS 2024 Data Integrity Cryptosuite for use with jsonld-signatures.\n\n## Table of Contents\n\n- [Background](#background)\n- [Security](#security)\n- [Install](#install)\n- [Usage](#usage)\n- [Contribute](#contribute)\n- [Commercial Support](#commercial-support)\n- [License](#license)\n\n## Background\n\nFor use with https://github.com/digitalbazaar/jsonld-signatures v11.0 and above.\n\nThis cryptosuite uses the JSON Canonicalization Scheme (JCS) instead of RDF\nDataset Canonicalization (RDFC). As a result, documents are signed as JSON\nobjects rather than as normalized RDF n-quads, which means undefined terms and\nrelative type URLs are not rejected during signing.\n\nSee also related specs:\n\n* [Verifiable Credential Data Integrity](https://w3c.github.io/vc-data-integrity/)\n\n## Security\n\nAs with any cryptographic implementation, the security of this library depends\non correct key management. Secret keys must be protected and never transmitted\nor stored in plaintext. The ML-DSA-44 algorithm provides NIST security level 2\npost-quantum security.\n\nNote that JCS canonicalization does not validate JSON-LD terms or relative\nURLs before signing. Implementers who require strict JSON-LD validation should\nuse the `mldsa44-rdfc-2024-cryptosuite` instead.\n\n## Install\n\nThis software requires and supports maintained recent versions of Node.js and\nbrowsers. Updates may remove support for older unmaintained platform versions.\nPlease use dependency version lock files and testing to ensure compatibility\nwith this software.\n\nTo install from NPM:\n\nhttps://www.npmjs.com/package/@digitalbazaar/mldsa44-jcs-2024-cryptosuite.git\n\n```sh\nnpm install @digitalbazaar/mldsa44-jcs-2024-cryptosuite\n```\n\nTo install locally (for development):\n\n```sh\ngit clone https://github.com/digitalbazaar/mldsa44-jcs-2024-cryptosuite.git\ncd mldsa44-jcs-2024-cryptosuite\nnpm install\n```\n\n## Usage\n\nThe following code snippet provides a complete example of digitally signing\na verifiable credential using this library:\n\n```javascript\nimport * as MldsaMultikey from '@digitalbazaar/mldsa-multikey';\nimport {DataIntegrityProof} from '@digitalbazaar/data-integrity';\nimport {cryptosuite as mldsa44Jcs2024Cryptosuite} from\n  '@digitalbazaar/mldsa44-jcs-2024-cryptosuite';\nimport jsigs from 'jsonld-signatures';\nconst {purposes: {AssertionProofPurpose}} = jsigs;\n\n\n// create the unsigned credential\nconst unsignedCredential = {\n  '@context': [\n    'https://www.w3.org/ns/credentials/v2',\n    'https://www.w3.org/ns/credentials/examples/v2'\n  ],\n  id: 'http://university.example/credentials/58473',\n  type: ['VerifiableCredential', 'ExampleAlumniCredential'],\n  issuer: 'did:example:2g55q912ec3476eba2l9812ecbfe',\n  validFrom: '2010-01-01T00:00:00Z',\n  credentialSubject: {\n    id: 'did:example:ebfeb1f712ebc6f1c276e12ec21',\n    alumniOf: {\n      id: 'did:example:c276e12ec21ebfeb1f712ebc6f1',\n      name: 'Example University'\n    }\n  }\n};\n\n// create the keypair to use when signing\nconst controller = 'https://example.edu/issuers/565049';\nconst keyPair = await MldsaMultikey.from({\n  '@context': 'https://w3id.org/security/multikey/v1',\n  id: 'https://example.edu/issuers/565049#zQmawLbWnRPXEYtgjsXW3QCuvkLeSTB6egTNe4B58oiFMTN',\n  type: 'Multikey',\n  controller: 'https://example.edu/issuers/565049',\n  publicKeyMultibase: 'ukCTVqTw8MmpCy0cyg_gdrrCc1SihRFInzHHRdpD7OuE2GoteuGqkLvNzZBIrhB39aC' +\n    'GKkgpJFA9TECV-KbdbTsxDVhNzrCep-S9fKmJSh3ZoigoY7FUsuHDTt2qVZBk_RZZDF' +\n    '735dG8F_whpxorHHalgXl5BGI7tKxyQ05vKRwX1T_DSIaRyVKvRNij8AQZZS46J6Ay2W' +\n    'hyptlolNs9bjPG2RpN_fnwwX-AmpM_J2JLbLZsKqF9gJmNXu7iDti7AtC-OEZudLzMpR' +\n    'BMd9cO_nTGvi4_I0F8r2jl8Hv-7d3cUVaqCv9XfkkiJZxuGcztrZbyiTeZ1PJ67TbmraM' +\n    'Et6otg6JM5HWqcLsgAHd47aap9XiGbGeODPU0BEmRWb5zPc-EuMHu1KasuF9LsBgIgx3I' +\n    'TiDZGN8K3JPo3Xnfbwyzi8atmXW6isS4r44pkTS3elkM8a-18Jao-7fba9o9KQAQDacKHp' +\n    'DCa3EPtFv_0Pu8PMYiG36eXUSjpspmEEMcFjGzFZz3Oz1-xETpKiTQpr4g2Z1kbj8XSn7' +\n    'QmVaoxsrxNeLEKyUigFR5kF-92BwGiPDbhHA2m58x4wMZcY1A557y4hkUpTVbToxJ40w_' +\n    'pqYcBP_y2wnTjKdgBEtnRdbgQHQJDwOUYAgG2xIb3zgIEBoizrjl7wyfP4Wqrb0mxI3So' +\n    'Hvb1eSolckMTLKnCk76KHsgMca2pm-Mamleot1AG3tAjnTtWHt9PFy24C-fd6_JzDa-P6U' +\n    'czhoBFoMQLWmflzrDBTq4c3GwcqW-aCSSax4cvg0hUEc_vyNeV8EPg401SFDeJ71MrY17KH' +\n    'jMMnnBgQ_q50CzSSfm9klwhlC_hGX6afN2nOI4JVl56mA689hqstQC6YRLrgdCMoukgHPo' +\n    'cX06rce9WFDWP2aj3mIxUh7krSsCbtb56TZPTb9Rh1GkgDkWmljQKY6tKxKNoiFJLBxii9' +\n    'lNAGT3rwDAp1Bl303MubANGx88zNqpO25hkFMLwwO4YnNOCGYiyN57F4ZzmOknRtJxMMZ0F' +\n    'CsMDhTfoig4UvvPEku48gVY90kcNAlqWL9RwDfOL6baKcERVcgDtzUmEbDjMBDDKYLf6DA6' +\n    'tA6Wb1u9_I1V9KxTw-v-4LohUUU8b1ZyaqQ5n7zv9iYqgY5NTZFNcz0CPHQHlXzlolSCNJ' +\n    'xMHDLqbS9Q6iivTbNonc-_jdYiiMViDW6l5371NCYrnBnWawnnBur5DBEdDFmF6I34wCrNba' +\n    'OIZfRIpoJemm0X2F_edX6ZONBHt2LtWsvKP-ovE72s_-gM7u2XePl9TjgCEuTJqO-Ixok1m' +\n    'CqXLP3fHR72hXcSKmST95AQIYwcfPK0b4kbk6N6o6X3HP6Ut2b3HudP71o5YzTwKnugXqw6' +\n    'WXjx6gC2Ctrpn3O01nS-9u8PJQzKyaVn6A4rgFq08Jj0DR0YjV5lakYvYSaI3Fz-Nzzot9J' +\n    'gCPXrOBzqRxkuEjdap0lnOinPSjozYKLZsX_Q0S2jUGbTcF5B0YOxowwIbdauT0wZ3L3RL5' +\n    'FEzc0rtU63p_6ZxB_MXSnxJsBOv0ONdSNlxmJrSXQRDZHtiB0UKKPHtCucOKf4cYtHnH1SL' +\n    'Txpq854WI1MXtHZbCMCSbyDJBKCaV0fRk7OnIu1KyqfplQ5vbCsf54440GL_Gv-0vtfjiIZq' +\n    'IAtFC6a3BBEyyjshczqP7rTTuy3pJzKtsCenrrPi_lhgzi-8ww1gEQGBIkHoogoPRArPZGGh1mo7',\n  secretKeyMultibase: 'umiYgr1lhXtNROU7_wgoyaVc3nqkO5pF78hBBLrwoZBdLbQ'\n});\n\n// export public key and add to document loader\nconst publicKey = await keyPair.export({publicKey: true, includeContext: true});\naddDocumentToLoader({url: publicKey.id, document: publicKey});\n\n// create key's controller document\nconst controllerDoc = {\n  '@context': [\n    'https://www.w3.org/ns/did/v1',\n    'https://w3id.org/security/multikey/v1'\n  ],\n  id: controller,\n  assertionMethod: [publicKey]\n};\naddDocumentToLoader({url: controllerDoc.id, document: controllerDoc});\n\n// create suite\nconst suite = new DataIntegrityProof({\n  signer: keyPair.signer(), cryptosuite: mldsa44Jcs2024Cryptosuite\n});\n\n// create signed credential\nconst signedCredential = await jsigs.sign(unsignedCredential, {\n  suite,\n  purpose: new AssertionProofPurpose(),\n  documentLoader\n});\n\n// results in the following signed VC\n{\n  \"@context\": [\n    \"https://www.w3.org/ns/credentials/v2\",\n    \"https://www.w3.org/ns/credentials/examples/v2\"\n  ],\n  \"id\": \"http://university.example/credentials/58473\",\n  \"type\": [\"VerifiableCredential\", \"ExampleAlumniCredential\"],\n  \"issuer\": \"did:example:2g55q912ec3476eba2l9812ecbfe\",\n  \"validFrom\": \"2010-01-01T00:00:00Z\",\n  \"credentialSubject\": {\n    \"id\": \"did:example:ebfeb1f712ebc6f1c276e12ec21\",\n    \"alumniOf\": {\n      \"id\": \"did:example:c276e12ec21ebfeb1f712ebc6f1\",\n      \"name\": \"Example University\"\n    }\n  },\n  \"proof\": {\n    \"type\": \"DataIntegrityProof\",\n    \"created\": \"2023-03-01T21:29:24Z\",\n    \"verificationMethod\": \"https://example.edu/issuers/565049#zQmawLbWnRPXEYtgjsXW3QCuvkLeSTB6egTNe4B58oiFMTN\",\n    \"cryptosuite\": \"mldsa44-jcs-2024\",\n    \"proofPurpose\": \"assertionMethod\",\n    \"@context\": [\n      \"https://www.w3.org/ns/credentials/v2\",\n      \"https://www.w3.org/ns/credentials/examples/v2\"\n    ],\n    \"proofValue\": \"u...\"\n  }\n}\n```\n\n## Contribute\n\nSee [the contribute file](https://github.com/digitalbazaar/bedrock/blob/master/CONTRIBUTING.md)!\n\nPRs accepted.\n\nIf editing the Readme, please conform to the\n[standard-readme](https://github.com/RichardLitt/standard-readme) specification.\n\n## Commercial Support\n\nCommercial support for this library is available upon request from\nDigital Bazaar: support@digitalbazaar.com\n\n## License\n\n[New BSD License (3-clause)](LICENSE) © 2026 Digital Bazaar\n","readmeFilename":"README.md","_rev":"1-7867e064911697e52c4072814504fbab"}