{"_id":"@bradthomasbrown/ecdsa","_rev":"8-a8daec96daaeb7f053813b35782bb090","name":"@bradthomasbrown/ecdsa","dist-tags":{"latest":"2.0.3"},"versions":{"1.0.0":{"name":"@bradthomasbrown/ecdsa","version":"1.0.0","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@1.0.0","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"f68e62b66846f5868402996536c15cf5233e1875","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-1.0.0.tgz","fileCount":5,"integrity":"sha512-lSJdAPAVfntOph5uWXD1/hLC5KC3WnIr5N/nvyOxMuM83XleAW/gT3469wUWNC8LDDLDa2P45NJvfXzHpDsIow==","signatures":[{"sig":"MEYCIQDHJRGApZSfptomI7jpSKVb5+UPNYLqEZJYDFG9RtnTrgIhAP49gv8A5vz+2VnsedIsptkQvtNNmqIzuE0tQhsqafcj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10800},"type":"module","exports":{".":"./dist/ecdsa.js"},"gitHead":"a92d0b6f6c4a0c4949a0baf42600a7f4d84337bc","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/finite-curve":"^2.2.0","@bradthomasbrown/finite-domain":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ecdsa_1.0.0_1765605589681_0.8357203731022556","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bradthomasbrown/ecdsa","version":"1.0.1","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@1.0.1","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"64247796afa7acca0e765019df17b1bafee7a965","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-1.0.1.tgz","fileCount":5,"integrity":"sha512-KwBxI43HScnbD5hwYOewer178JKEiGfeeMeMZDF7VAM1WGB52fpslNsOkUX+GFGvxkSAb9DieAgtdC5BjQknYg==","signatures":[{"sig":"MEYCIQCr+vXWReYWVWSiTXVMd1qv4yuwE5ipItHRDkAIarxyEAIhALe5qcDzD84+Tdu2MWMC2ebenNeGd2/T+KRbaLBnwxLB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16445},"type":"module","exports":{".":"./dist/ecdsa.js"},"gitHead":"02308c9108200063310830fbc4895286393a0c9b","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/finite-curve":"^2.2.0","@bradthomasbrown/finite-domain":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ecdsa_1.0.1_1765605710118_0.7881672716878814","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bradthomasbrown/ecdsa","version":"1.0.2","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@1.0.2","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"f94ccf6e776a815e62a8ecde749b07e26293237a","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-1.0.2.tgz","fileCount":5,"integrity":"sha512-QuL/bPkNqXI4Cf1oZSdOFXXv/a6WZUVNK6uw8/0wHVL4GvCu/+bVozQivSyHC6UduLf9KPE91Zyx10qgkhs4Wg==","signatures":[{"sig":"MEQCIFjwxNXUJf9L/sPk5VR8fQCWH5VI5qO4K2c/6AuO7DY0AiBwS/vqc9Y9iE+4t6rnyOdr4cb6xvesB+EZQBG27FDZZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17051},"type":"module","exports":{".":"./dist/ecdsa.js"},"gitHead":"d21fa846c32fb2ce959040161ee9751c74230ad2","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/finite-curve":"^2.2.0","@bradthomasbrown/finite-domain":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ecdsa_1.0.2_1765673355182_0.9238933337412685","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bradthomasbrown/ecdsa","version":"1.0.4","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@1.0.4","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"effc9bedc137a23ca7b7c1376629ea4a6955cd35","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-1.0.4.tgz","fileCount":5,"integrity":"sha512-kqwBGNgUwPnNPs5eKNGE/MufPq+/v4J/zB8wXX/CZz2iQhtMxrIqjYNyWR5AbdD5L0bAyjJtYi7O2Uo6SJX6RA==","signatures":[{"sig":"MEQCIEVUUO/G7nw9UlgrZLSVuJ+RKia9TCaLm0UtxCKbHQsaAiAJLaiQkR/TciRJ1u5eQWSYcPPu/z9i9xXgZrluC3T2aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17570},"type":"module","exports":{".":"./dist/ecdsa.js"},"gitHead":"0058d463dbbda83540134927d4ba11f3f6faa90f","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/finite-curve":"^2.2.0","@bradthomasbrown/finite-domain":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ecdsa_1.0.4_1765674493620_0.9569362809852171","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bradthomasbrown/ecdsa","version":"2.0.0","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@2.0.0","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"bee83ac21706e292d2f0000460fe74f22ab8ecc0","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-2.0.0.tgz","fileCount":8,"integrity":"sha512-0HQGxyyEA5T7Ih310cfZk/1xdkypu9enQpUf5xnLaM5jxnC6a7i3WxgBQkf+Fv5JquuKYbOuBo4JERBBqhbDaw==","signatures":[{"sig":"MEYCIQCIqugxoSlevPphE5N2d9xWOmv+gS8by8fPRhk0CNBbdgIhAIwmgIaL4tCebBETI+TapyRvHylRwvqCPsGQ6L9EluCw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":18994},"type":"module","exports":{".":"./dist/ecdsa.js"},"gitHead":"00556fc81412deb3e6d3738675cb69b302f7c1e8","scripts":{"bump-major":"npm version major && git push && npm publish --access=public","bump-minor":"npm version minor && git push && npm publish --access=public","bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/keccak":"^1.0.0","@bradthomasbrown/finite-curve":"^3.0.0","@bradthomasbrown/finite-domain":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.5","@noble/curves":"^2.0.1","@noble/secp256k1":"^3.0.0","@bradthomasbrown/rlp":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ecdsa_2.0.0_1766231111750_0.6239904746652425","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bradthomasbrown/ecdsa","version":"2.0.1","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@2.0.1","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"5fb5258310e70b2fcc0eea101192b90706d2fbc4","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-2.0.1.tgz","fileCount":8,"integrity":"sha512-nb9m3OiH9uzlV19b1VwEqied/xVyaJcS2ITPBKLh+kvTj+/XGS6FiUQuToqRMH1+TRVsJWT4HHPH4Hdy77pjQQ==","signatures":[{"sig":"MEUCIHHn/HuWd8mujrK3XtFkUOs1+HIjzksTI9eVBCufKG2ZAiEA3bTigibUa6TnO7c4z4gNbQ7q6Rhmb3nTrnIgUAvVhCk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19047},"type":"module","exports":{".":"./dist/ecdsa.js","./concrete":"./dist/concrete/concrete.js"},"gitHead":"510dc3a4897cc86c00eb1537e8e1eb506d9622bb","scripts":{"bump-major":"npm version major && git push && npm publish --access=public","bump-minor":"npm version minor && git push && npm publish --access=public","bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/keccak":"^1.0.0","@bradthomasbrown/finite-curve":"^3.0.0","@bradthomasbrown/finite-domain":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.5","@noble/curves":"^2.0.1","@noble/secp256k1":"^3.0.0","@bradthomasbrown/rlp":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ecdsa_2.0.1_1766231160252_0.6520143862906611","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bradthomasbrown/ecdsa","version":"2.0.2","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/ecdsa@2.0.2","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"964748ce9583850de339a9ea0854db62df669070","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-2.0.2.tgz","fileCount":8,"integrity":"sha512-vX1hHE8zFVAHC+nWoj/oS1RcNsU8wK/QMLGXtKzTSf3QJc4Qwzdux+17uu18qazToRQlZ222pZScEbfwdXWAOg==","signatures":[{"sig":"MEUCICiQczijljXpVUMG29aYtTrMC5556sinpqH9XL6DgEFeAiEAi8pR7F7kXcAU1frqR+WKuN4kxbUW0X2fCIJjIOFAuyE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19047},"type":"module","exports":{".":"./dist/ecdsa.js","./concrete":"./dist/concrete/concrete.js"},"gitHead":"c60fc0dacb522460e476669d75c7ec0e44dc7ffb","scripts":{"bump-major":"npm version major && git push && npm publish --access=public","bump-minor":"npm version minor && git push && npm publish --access=public","bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","dependencies":{"@bradthomasbrown/keccak":"^1.0.2","@bradthomasbrown/finite-curve":"^3.0.0","@bradthomasbrown/finite-domain":"^2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.5","@noble/curves":"^2.0.1","@noble/secp256k1":"^3.0.0","@bradthomasbrown/rlp":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ecdsa_2.0.2_1767442412900_0.9980586524829793","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@bradthomasbrown/ecdsa","description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","version":"2.0.3","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"type":"module","scripts":{"bump-patch":"npm version patch && git push && npm publish --access=public","bump-minor":"npm version minor && git push && npm publish --access=public","bump-major":"npm version major && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"exports":{".":"./dist/ecdsa.js","./concrete":"./dist/concrete/concrete.js"},"dependencies":{"@bradthomasbrown/finite-curve":"^3.0.0","@bradthomasbrown/finite-domain":"^2.0.0","@bradthomasbrown/keccak":"^1.0.2"},"devDependencies":{"@bradthomasbrown/rlp":"^1.0.0","@noble/curves":"^2.0.1","@noble/secp256k1":"^3.0.0","@types/bun":"^1.3.5"},"_id":"@bradthomasbrown/ecdsa@2.0.3","gitHead":"32baef639b59591b6bf97d25381980aaee609296","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-bDm13uGfO+VhZNBgwcA6JFlOUsyE8vVZi+A511WerpD/dAPsOgee7WSNy+Kr/P3jB5Qj+LXgFlfdKP9EqxTcEQ==","shasum":"c4c61bc109de9234075022996d54a496f0b90140","tarball":"https://registry.npmjs.org/@bradthomasbrown/ecdsa/-/ecdsa-2.0.3.tgz","fileCount":8,"unpackedSize":19888,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFeHv42Bkfh+x4wo2mO3JG3ZWBS9lGBj0PaLTrva0CrZAiEA6/Lmt2IDDcZnWqD6qT/jq64N75rIVd2krPPHHJQNZco="}]},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"directories":{},"maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ecdsa_2.0.3_1767443223626_0.6729062597048134"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-13T05:59:49.624Z","modified":"2026-01-03T12:27:03.974Z","1.0.0":"2025-12-13T05:59:49.829Z","1.0.1":"2025-12-13T06:01:50.256Z","1.0.2":"2025-12-14T00:49:15.358Z","1.0.4":"2025-12-14T01:08:13.757Z","2.0.0":"2025-12-20T11:45:11.892Z","2.0.1":"2025-12-20T11:46:00.400Z","2.0.2":"2026-01-03T12:13:33.056Z","2.0.3":"2026-01-03T12:27:03.780Z"},"author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"description":"Minimal, unoptimized, and unaudited keccak and sponge function library in JavaScript/TypeScript.","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"readme":"# keccak\r\nThis is a simple, minimal implementation of the elliptic curve digital signature algorithms in TypeScript/JavaScript. \r\n\r\n## Why?\r\nThere is surprisingly little information on all aspects of the \"cryptographic stack\" in JavaScript and elsewhere that is simple and minimal. This repository is part of a series of repositories that builds up this stack from first principles, including:\r\n- [Finite field arithmetic](https://github.com/bradthomasbrown/finite-field)\r\n- [Elliptic curves over finite fields](https://github.com/bradthomasbrown/finite-curve)\r\n- [Sponge constructions and Keccak](https://github.com/bradthomasbrown/keccak)\r\n- [Elliptic curve domain parameters](https://github.com/bradthomasbrown/finite-domain)\r\n- Elliptic curve digital signature algorithms (this repository)\r\n- Interacting with EVM nodes\r\n- And potentially more\r\n\r\n## Installation\r\nThese should be installed when you install the `ecdsa` package, but this is listed here for completeness.\r\n- [@bradthomasbrown/finite-field]\r\n- [@bradthomasbrown/finite-curve]\r\n```sh\r\nnpm i @bradthomasbrown/ecdsa\r\n```\r\n\r\n## Usage\r\n```js\r\nimport { Ecdsa } from \"@bradthomasbrown/ecdsa\";\r\nimport { secp256k1 } from \"@bradthomasbrown/finite-domain/domains\";\r\nimport { keccak_c, sha_3 } from \"@bradthomasbrown/keccak\";\r\n\r\nconst keccak256 = sha_3(keccak_c, 512, 0b0, 0);\r\nconst encoder = new TextEncoder();\r\nconst ecdsa_keccak256 = new Ecdsa(secp256k1, keccak256, 32);\r\nconst generateSecret = (B:number) => uint8ArrayToBigint_LE(crypto.getRandomValues(new Uint8Array(B)));\r\n\r\n// sign\r\nlet Qu = undefined;\r\nlet S = undefined;\r\n{\r\n    const d = generateSecret(32);\r\n    Qu = secp256k1.public(d);\r\n    const H = keccak256(encoder.encode(\"hello world\"));\r\n    S = ecdsa_keccak256.sign(H, d);\r\n    console.log({ Qu, H, S });\r\n}\r\n\r\n// verify\r\n{\r\n    const H = keccak256(encoder.encode(\"hello world\"));\r\n    const verified = ecdsa_keccak256.verify(Qu, S, H);\r\n    console.log({ verified });\r\n    // { verified: true }\r\n}\r\n\r\n// recover\r\n{\r\n    const H = keccak256(encoder.encode(\"hello world\"));\r\n    for (const Qa of ecdsa_keccak256.recover_p3mod4(S, H)) {\r\n        const equal = Qa.equals(Qu);\r\n        console.log({ equal, Qa });\r\n        // { equal: true: Qa: ... } for some Qa of recover_p3mod4 \r\n    }\r\n}\r\n```","readmeFilename":"README.md"}