first commit

This commit is contained in:
2026-05-29 08:20:56 +01:00
commit 949299f58d
6368 changed files with 527176 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
# digest
## Purpose
Single canonical entry point for SHA-256 digest computation inside the SLSA
package. Deliberately routes through `@suaveplan/crypto-hash` instead of
`node:crypto` so the primitive selector layer chooses the correct backend
(Noble / WebCrypto / native) at build time, and so the package stays
runtime-agnostic for non-Node environments.
## Features
- Accepts `Uint8Array` or UTF-8 strings.
- Returns lowercase hex via `@suaveplan/crypto-utils`'s `toHex`.
- Uses the package-wide `sha256` selector — no direct noble/webcrypto import.
## Usage: Basic Example
```ts
import { computeDigest } from "@suaveplan/slsa";
const d = computeDigest("hello");
```
## Usage: Advanced Example
```ts
import { computeDigest } from "@suaveplan/slsa";
import fs from "node:fs/promises";
const artifact = await fs.readFile("./dist/@suaveplan-utils-1.2.3.tgz");
const digest = computeDigest(new Uint8Array(artifact));
// feed into generateProvenance({ artifactDigest: digest, ... })
```
## API Reference
- `computeDigest(content: Uint8Array | string): string` — returns a 64-char
lowercase hex SHA-256. Strings are encoded as UTF-8 before hashing.
## Implementation Notes
The string branch uses `TextEncoder` (available in all modern Node / Bun /
browsers) rather than `Buffer.from(str)` so the helper remains universal.
SHA-512 is intentionally not exposed here — callers that need it should
compose `sha512` from `@suaveplan/crypto-hash` with `toHex` directly, which
keeps the SLSA surface tight and the digest format homogeneous.
### Hash Family
`digestProvenance` computes the SHA-256 of the canonical-JSON encoding of an in-toto statement and returns it as a hex string. SHA-256 is the only algorithm currently surfaced because it is the only one the Sigstore transparency log (Rekor) accepts for hashedrekord v0.0.2 entries. The helper composes `canonicalJson` and `sha256` from `@suaveplan/crypto-hash` so there is no custom hashing logic local to this module.
## Further Usage: Basic Example
```ts
import { digestProvenance } from "@suaveplan/slsa/provenance/digest";
const hex = await digestProvenance({ _type: "https://in-toto.io/Statement/v1" } as any);
```