Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 90 additions & 2 deletions packages/pq-key-fingerprint/ts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,99 @@ npm install pq-key-fingerprint
## Usage

```typescript
import { } from 'pq-key-fingerprint';
import {
FingerprintError,
fingerprintJWK,
fingerprintPEM,
fingerprintPublicKey,
fingerprintPublicKeyBytes,
fingerprintSPKI,
} from 'pq-key-fingerprint';

// Coming soon
const mlKem512PublicKey = new Uint8Array(800);

// 1) Raw bytes + algorithm
const fromBytes = await fingerprintPublicKeyBytes(mlKem512PublicKey, 'ML-KEM-512');
console.log(fromBytes); // hex string (default)

// 2) KeyData-like input
const fromPublicKeyObject = await fingerprintPublicKey({
alg: 'ML-KEM-512',
type: 'public',
bytes: mlKem512PublicKey,
});

// 3) SPKI DER bytes
const spkiDer = new Uint8Array(/* SPKI DER bytes */);
const fromSpki = await fingerprintSPKI(spkiDer);

// 4) PEM
const pem = `-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----`;
const fromPem = await fingerprintPEM(pem);

// 5) JWK
const jwk = {
kty: 'PQC' as const,
alg: 'ML-KEM-512' as const,
x: 'base64url-encoded-public-key-bytes',
};
const fromJwk = await fingerprintJWK(jwk);

// Digest and encoding options
const sha512Base64Url = await fingerprintPublicKeyBytes(mlKem512PublicKey, 'ML-KEM-512', {
digest: 'SHA-512',
encoding: 'base64url',
});

const rawDigestBytes = await fingerprintPublicKeyBytes(mlKem512PublicKey, 'ML-KEM-512', {
digest: 'SHA-384',
encoding: 'bytes',
});

console.log(sha512Base64Url, rawDigestBytes.length);

// Error handling
try {
await fingerprintPEM('not-a-valid-pem');
} catch (error) {
if (error instanceof FingerprintError) {
console.error('Fingerprint failed:', error.message);
} else {
throw error;
}
}
```

## API

```typescript
type FingerprintDigest = 'SHA-256' | 'SHA-384' | 'SHA-512';
type FingerprintEncoding = 'hex' | 'base64' | 'base64url' | 'bytes';

interface FingerprintOptions {
digest?: FingerprintDigest;
encoding?: FingerprintEncoding;
}
Comment thread
eacet marked this conversation as resolved.

type FingerprintResult = string | Uint8Array;

function fingerprintPublicKey(input: PublicKeyInput, options?: FingerprintOptions): Promise<FingerprintResult>;
function fingerprintPublicKeyBytes(
bytes: Uint8Array,
alg: AlgorithmName,
options?: FingerprintOptions,
): Promise<FingerprintResult>;
function fingerprintSPKI(spki: Uint8Array, options?: FingerprintOptions): Promise<FingerprintResult>;
function fingerprintPEM(pem: string, options?: FingerprintOptions): Promise<FingerprintResult>;
function fingerprintJWK(jwk: PQJwk, options?: FingerprintOptions): Promise<FingerprintResult>;
Comment thread
eacet marked this conversation as resolved.
```

## Compatibility Note

All exported fingerprint entrypoints enforce a strict local error boundary by design. Upstream parser/validation failures from `pq-key-encoder` are translated into `pq-key-fingerprint` error classes (subclasses of `FingerprintError`) before they leave this package. This behavior is intentional and part of the package contract.
Comment thread
eacet marked this conversation as resolved.

## License

MIT