Skip to content

Commit 45a31b0

Browse files
committed
Add LICENSE, CONTRIBUTING, CODE_OF_CONDUCT, issue templates, examples/, FAQ section, and pin workflow actions to commit SHAs — open-source hygiene pass to make the repo Show HN-ready: MIT LICENSE file (was just a README badge with no actual file), example workflows pinned to verified SHAs (practising the supply-chain hygiene we preach), and a FAQ pre-empting the 'how is this different from sigstore' / 'why ECDSA-P521 over Ed25519' / 'why hash chain over Merkle log' comments that always come up.
1 parent ccdad7e commit 45a31b0

15 files changed

Lines changed: 362 additions & 8 deletions
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
name: Bug report
3+
about: Something the action does that it shouldn't, or doesn't do that it should
4+
title: '[Bug] '
5+
labels: bug
6+
assignees: ''
7+
---
8+
9+
## What happened
10+
11+
<!-- One or two sentences. Include the verification-id if the run produced one. -->
12+
13+
## What I expected
14+
15+
<!-- One sentence. -->
16+
17+
## How to reproduce
18+
19+
<!-- Minimal workflow YAML that triggers the bug. Strip any secrets. -->
20+
21+
```yaml
22+
- uses: ledgerprove/sign-sbom@v1
23+
with:
24+
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}
25+
sbom-file: ./sbom.json
26+
```
27+
28+
## Action log output
29+
30+
<!-- Paste the relevant section of the Actions run log. Hide your API key. -->
31+
32+
```
33+
(paste here)
34+
```
35+
36+
## Environment
37+
38+
- Action version (e.g. `v1.0.0` or commit SHA):
39+
- Runner OS (ubuntu-latest / macos-latest / windows-latest):
40+
- SBOM format (CycloneDX 1.x / SPDX 2.x):
41+
- SBOM generator (Syft, cyclonedx-cli, other):
42+
43+
## Anything else
44+
45+
<!-- Optional. Links to the failing run, related issues, etc. -->

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Security vulnerability
4+
url: https://github.com/ledgerprove/sign-sbom/security/policy
5+
about: Please report security issues privately, not via public issues. See SECURITY.md.
6+
- name: Question or discussion
7+
url: https://github.com/ledgerprove/sign-sbom/discussions
8+
about: Use Discussions for general questions, not Issues.
9+
- name: Email
10+
url: mailto:hello@ledgerprove.com
11+
about: For anything that doesn't fit the above.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
name: Feature request
3+
about: Suggest a new input, output, or behaviour for the action
4+
title: '[Feature] '
5+
labels: enhancement
6+
assignees: ''
7+
---
8+
9+
## What problem are you solving
10+
11+
<!-- Describe the use case in 2-3 sentences. What can't you do today? -->
12+
13+
## Proposed change
14+
15+
<!-- What should the action do differently? A new input? A new output? Different default behaviour? -->
16+
17+
## Example workflow
18+
19+
<!-- Show how a user would use the feature. -->
20+
21+
```yaml
22+
- uses: ledgerprove/sign-sbom@v1
23+
with:
24+
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}
25+
# your proposed new input goes here
26+
```
27+
28+
## Alternatives you considered
29+
30+
<!-- Any workarounds you tried, or other ways this could be solved. -->
31+
32+
## Anything else
33+
34+
<!-- Links to similar features in other tools, etc. -->

.github/workflows/sbom.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
sign:
1212
runs-on: ubuntu-latest
1313
steps:
14-
- uses: actions/checkout@v4
14+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1515
- uses: ledgerprove/sign-sbom@v1
1616
with:
1717
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}

.github/workflows/self-test-auto.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
auto:
1414
runs-on: ubuntu-latest
1515
steps:
16-
- uses: actions/checkout@v4
16+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1717
- name: Sign with auto-generated SBOM
1818
id: lp
1919
uses: ./

.github/workflows/self-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
smoke:
1414
runs-on: ubuntu-latest
1515
steps:
16-
- uses: actions/checkout@v4
16+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
1717

1818
- name: Sign the sample SBOM with this Action
1919
id: ledgerprove

CODE_OF_CONDUCT.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Code of Conduct
2+
3+
This project follows the [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
4+
5+
## Summary
6+
7+
In short:
8+
9+
- Be respectful and constructive in issues, PRs, and discussions
10+
- Focus criticism on code and design choices, not people
11+
- Assume good faith — most disagreements come from missing context
12+
- Harassment, discrimination, and personal attacks are not tolerated
13+
14+
## Enforcement
15+
16+
Reports go to **hello@ledgerprove.com**. Reports are confidential. Project maintainers will respond within 7 days.
17+
18+
For the full text, see https://www.contributor-covenant.org/version/2/1/code_of_conduct/

CONTRIBUTING.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Contributing to LedgerProve sign-sbom
2+
3+
Thanks for taking the time to contribute. This is a small project with a clear scope, so most contributions are welcome — please read this first to keep the loop short.
4+
5+
## What we accept
6+
7+
- Bug fixes (with a failing test or reproducer)
8+
- New inputs/outputs on the action that match a real use case
9+
- README clarifications, FAQ entries, more `examples/` workflows
10+
- Support for additional SBOM formats already documented in the spec (CycloneDX 1.6, SPDX 2.3, etc.)
11+
- Improvements to the verify-without-an-account flow
12+
13+
## What we don't accept (without discussion first)
14+
15+
- New cryptographic primitives. We picked ECDSA-P521 + SHA-512 deliberately and won't swap silently.
16+
- Mandatory new external services. Optional integrations are fine.
17+
- Anything that breaks the public no-auth verify endpoint contract.
18+
- Changes that move signing logic out of the LedgerProve API (the action is intentionally thin).
19+
20+
For any of the above, open an issue first to discuss the trade-off before opening a PR.
21+
22+
## Local setup
23+
24+
You'll need Node.js 22+ and pnpm or npm.
25+
26+
```bash
27+
git clone https://github.com/ledgerprove/sign-sbom.git
28+
cd sign-sbom
29+
npm install
30+
npm run build
31+
```
32+
33+
The built output goes to `dist/` and is checked in — GitHub Actions requires the compiled JS to be present.
34+
35+
## Testing the action locally
36+
37+
The action talks to `https://api.ledgerprove.com` by default. To test against a local API, set the `api-url` input:
38+
39+
```yaml
40+
- uses: ./
41+
with:
42+
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}
43+
api-url: http://localhost:3000
44+
```
45+
46+
The self-test workflows in `.github/workflows/self-test*.yml` show how we run smoke tests on every push.
47+
48+
## Submitting a PR
49+
50+
1. Fork the repo and branch from `main`
51+
2. Make your change
52+
3. Run `npm run build` to update `dist/`
53+
4. Commit both source and `dist/` changes
54+
5. Open the PR with a clear description of the use case
55+
56+
## Reporting security issues
57+
58+
Do NOT open a GitHub issue. See [SECURITY.md](SECURITY.md) for the disclosure process.
59+
60+
## Questions
61+
62+
- General questions: open a GitHub Discussion
63+
- Specific bugs: open an issue using one of the templates
64+
- Anything else: hello@ledgerprove.com

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 LedgerProve Ltd
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Cryptographically sign your SBOM, append it to a tamper-evident hash chain, and
1515
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}
1616
```
1717
18-
That's the whole workflow step. The Action installs Syft, generates a CycloneDX SBOM of your repo, signs it with ECDSA-P521 (private key in AWS KMS), and prints a public verify URL.
18+
That's the whole workflow step. The Action installs Syft, generates a CycloneDX SBOM of your repo, signs it with ECDSA-P521 (hardware-backed, non-exportable signing key), and prints a public verify URL.
1919
2020
## Bring-your-own SBOM (full control)
2121
@@ -34,7 +34,7 @@ If you already generate an SBOM in a previous step (cyclonedx-cli, custom toolin
3434
1. Reads your SBOM file (CycloneDX or SPDX, JSON).
3535
2. Hashes it with SHA-256.
3636
3. POSTs the hash + metadata to LedgerProve's API.
37-
4. The API signs your record with **ECDSA-P521** using a private key in **AWS KMS** (the key never leaves AWS).
37+
4. The API signs your record with **ECDSA-P521** using a private key inside a **hardware-backed KMS** the key is non-exportable and never leaves the secure enclave.
3838
5. Your record is appended to a per-org **SHA-512 hash chain** — tampering with any record breaks all subsequent ones.
3939
6. An **RFC 3161 timestamp** is requested from a public TSA so anyone can prove when the record was signed.
4040
7. The Action sets `verification-url` as an output for use by later steps (PR comments, release notes, etc.).
@@ -50,7 +50,7 @@ Anyone can verify the signed SBOM at the verification URL with a single OpenSSL
5050
| `repo-id` | — | `${{ github.repository }}` | Repository identifier under which to record this build. |
5151
| `commit-hash` | — | `${{ github.sha }}` | The commit SHA to record. |
5252
| `build-status` | — | `PASS` | `PASS`, `FAIL`, or `WARN`. Use `FAIL` to record a failed build (e.g. tests failed, vulns found). |
53-
| `cve-count` | — | `0` | Number of CVEs found in this build, if known. |
53+
| `cve-count` | — | `0` | Optional. CVE count to bake into the signed chain payload. Most users leave this at `0` — LedgerProve runs its own CVE scan against OSV.dev after every signed build and exposes the real findings on your dashboard. This field exists for callers who want to record a count from their own scanner inside the signature. |
5454
| `api-url` | — | `https://api.ledgerprove.com` | Override the LedgerProve API URL. Only set this for self-hosted/staging. |
5555

5656
## Outputs
@@ -138,11 +138,57 @@ curl -sO https://api.ledgerprove.com/.well-known/public-key.pem
138138
openssl ts -reply -in token.tsr -text
139139
```
140140

141+
## FAQ
142+
143+
### How is this different from sigstore / cosign?
144+
145+
Sigstore uses keyless signing through a transparency log and a public Certificate Authority (Fulcio). It's a great fit if you want zero key management and are happy depending on a CA.
146+
147+
LedgerProve doesn't use a CA. Each organisation has a long-lived ECDSA-P521 key held inside a hardware-backed KMS, and records are appended to a per-org hash chain. The trade-off:
148+
149+
- **Sigstore wins** if you want true keyless signing with a public transparency log
150+
- **LedgerProve wins** if you want signing without a CA dependency, with FIPS-aligned crypto, and a single-step CI integration
151+
152+
Both produce verifiable artifacts; the trust models differ.
153+
154+
### Why ECDSA-P521 instead of Ed25519?
155+
156+
P521 is FIPS-186-5 approved (matters for some customers' compliance reviews) and AWS KMS supports it for signing today; Ed25519 in KMS is still not GA. We'd switch when Ed25519 lands.
157+
158+
### Why a hash chain instead of a Merkle tree / transparency log?
159+
160+
A per-org hash chain is simpler operationally and gives the same tamper-evidence properties for a single organisation's history. A global Merkle log (like Rekor) gives cross-org public auditability — useful if you're publishing widely-consumed artifacts, less useful for internal SBOMs. We chose the simpler model for the MVP.
161+
162+
### Does the action send my SBOM contents to your servers?
163+
164+
No. The action computes a SHA-256 of the SBOM locally and sends only the hash + metadata. The SBOM body never leaves your runner. The signed record references the hash, not the file. (Trade-off: you need to keep the SBOM retrievable yourself if you want full reproducibility later — sigstore goes the other way with attestation bundles.)
165+
166+
### What happens if your service goes down?
167+
168+
Already-signed records remain verifiable forever using the public key at `https://api.ledgerprove.com/.well-known/public-key.pem`. If you cache the public key locally, you can verify signatures with OpenSSL even if our API is unreachable. New signings would obviously fail until we're back up.
169+
170+
### Is there a free plan?
171+
172+
Yes — 1 repository, unlimited builds, no credit card. The open-source action and the public verify endpoint are free on every plan. See https://ledgerprove.com/pricing for paid tiers (more repos, longer history retention, SBOM diff, CVE email alerts).
173+
174+
### Why is `dist/` checked in?
175+
176+
GitHub Actions runs the compiled JavaScript directly — there's no install step at action runtime. The compiled output has to be in the repo. We rebuild `dist/` on every change in `src/`.
177+
141178
## License
142179

143-
ISC. Source: https://github.com/ledgerprove/sign-sbom
180+
[MIT](LICENSE). Source: https://github.com/ledgerprove/sign-sbom
181+
182+
## Security
183+
184+
For security disclosures, see [SECURITY.md](SECURITY.md) — do not report security issues via public GitHub Issues.
185+
186+
## Contributing
187+
188+
PRs welcome. Read [CONTRIBUTING.md](CONTRIBUTING.md) first for scope and process.
144189

145190
## Issues / questions
146191

147192
- General: https://github.com/ledgerprove/sign-sbom/issues
193+
- Discussions: https://github.com/ledgerprove/sign-sbom/discussions
148194
- Email: hello@ledgerprove.com

0 commit comments

Comments
 (0)