@web5/agent
Version:
286 lines • 14.9 kB
TypeScript
import type { Jwk, SignParams, AesGcmParams, DigestParams, VerifyParams, GenerateKeyParams, GetPublicKeyParams, KmsGetKeyUriParams } from '@web5/crypto';
import { Sha2Algorithm } from '@web5/crypto';
import type { CryptoApi } from './prototyping/crypto/types/crypto-api.js';
import type { HkdfParams } from './prototyping/crypto/primitives/hkdf.js';
import type { Pbkdf2Params } from './prototyping/crypto/primitives/pbkdf2.js';
import type { BytesToPrivateKeyParams, BytesToPublicKeyParams, CipherParams, DeriveKeyBytesParams, DeriveKeyParams, PrivateKeyToBytesParams, PublicKeyToBytesParams, UnwrapKeyParams, WrapKeyParams } from './prototyping/crypto/types/params-direct.js';
import { HkdfAlgorithm } from './prototyping/crypto/algorithms/hkdf.js';
import { EcdsaAlgorithm } from './prototyping/crypto/algorithms/ecdsa.js';
import { EdDsaAlgorithm } from './prototyping/crypto/algorithms/eddsa.js';
import { AesKwAlgorithm } from './prototyping/crypto/algorithms/aes-kw.js';
import { Pbkdf2Algorithm } from './prototyping/crypto/algorithms/pbkdf2.js';
import { AesGcmAlgorithm } from './prototyping/crypto/algorithms/aes-gcm.js';
export interface CryptoApiBytesToPrivateKeyParams extends BytesToPrivateKeyParams {
algorithm: KeyConversionAlgorithm;
}
export interface CryptoApiBytesToPublicKeyParams extends BytesToPublicKeyParams {
algorithm: AsymmetricKeyConversionAlgorithm;
}
/**
* The `CryptoApiCipherParams` interface defines the algorithm-specific parameters that should
* be passed into the {@link AgentCryptoApi.encrypt | `AgentCryptoApi.encrypt()`} or
* {@link AgentCryptoApi.decrypt | `AgentCryptoApi.decrypt()`} method.
*/
export interface CryptoApiCipherParams extends CipherParams, AesGcmParams {
}
/**
* The `CryptoApiDigestParams` interface defines the algorithm-specific parameters that should
* be passed into the {@link AgentCryptoApi.digest | `AgentCryptoApi.digest()`} method.
*/
export interface CryptoApiDigestParams extends DigestParams {
/**
* A string defining the name of hash function to use. The value must be one of the following:
* - `"SHA-256"`: Generates a 256-bit digest.
*/
algorithm: DigestAlgorithm;
}
export interface CryptoApiDeriveKeyOptions {
'HKDF-256': Omit<HkdfParams, 'hash'> & {
derivedKeyAlgorithm: CipherAlgorithm | KeyWrappingAlgorithm;
};
'HKDF-384': Omit<HkdfParams, 'hash'> & {
derivedKeyAlgorithm: CipherAlgorithm | KeyWrappingAlgorithm;
};
'HKDF-512': Omit<HkdfParams, 'hash'> & {
derivedKeyAlgorithm: CipherAlgorithm | KeyWrappingAlgorithm;
};
'PBES2-HS256+A128KW': Omit<Pbkdf2Params, 'hash'> & {
derivedKeyAlgorithm?: never;
};
'PBES2-HS384+A192KW': Omit<Pbkdf2Params, 'hash'> & {
derivedKeyAlgorithm?: never;
};
'PBES2-HS512+A256KW': Omit<Pbkdf2Params, 'hash'> & {
derivedKeyAlgorithm?: never;
};
}
export interface CryptoApiDeriveKeyBytesOptions {
'HKDF-256': Omit<HkdfParams, 'hash'>;
'HKDF-384': Omit<HkdfParams, 'hash'>;
'HKDF-512': Omit<HkdfParams, 'hash'>;
'PBES2-HS256+A128KW': Omit<Pbkdf2Params, 'hash'>;
'PBES2-HS384+A192KW': Omit<Pbkdf2Params, 'hash'>;
'PBES2-HS512+A256KW': Omit<Pbkdf2Params, 'hash'>;
}
/**
* The `CryptoApiDeriveKeyParams` interface defines the algorithm-specific parameters that
* should be passed into the {@link AgentCryptoApi.deriveKey | `AgentCryptoApi.deriveKey()`} method.
*/
export type CryptoApiDeriveKeyParams<T extends DeriveKeyAlgorithm> = DeriveKeyParams & {
/**
* A string defining the name of key derivation function to use. The value must be one of the
* following:
* - `"HKDF-256"`: HKDF with SHA-256.
* - `"HKDF-384"`: HKDF with SHA-384.
* - `"HKDF-512"`: HKDF with SHA-512.
* - `"PBKDF2-HS256+A128KW"`: PBKDF2 with HMAC SHA-256 and A128KW key wrapping.
* - `"PBKDF2-HS384+A192KW"`: PBKDF2 with HMAC SHA-384 and A192KW key wrapping.
* - `"PBKDF2-HS512+A256KW"`: PBKDF2 with HMAC SHA-512 and A256KW key wrapping.
*/
algorithm: T;
} & CryptoApiDeriveKeyOptions[T];
/**
* The `CryptoApiDeriveKeyBytesParams` interface defines the algorithm-specific parameters that
* should be passed into the {@link AgentCryptoApi.deriveKeyBytes | `AgentCryptoApi.deriveKeyBytes()`} method.
*/
export type CryptoApiDeriveKeyBytesParams<T extends DeriveKeyByteAlgorithm> = DeriveKeyBytesParams & {
/**
* A string defining the name of key derivation function to use. The value must be one of the
* following:
* - `"HKDF-256"`: HKDF with SHA-256.
* - `"HKDF-384"`: HKDF with SHA-384.
* - `"HKDF-512"`: HKDF with SHA-512.
* - `"PBKDF2-HS256+A128KW"`: PBKDF2 with HMAC SHA-256 and A128KW key wrapping.
* - `"PBKDF2-HS384+A192KW"`: PBKDF2 with HMAC SHA-384 and A192KW key wrapping.
* - `"PBKDF2-HS512+A256KW"`: PBKDF2 with HMAC SHA-512 and A256KW key wrapping.
*/
algorithm: T;
} & CryptoApiDeriveKeyBytesOptions[T];
export interface CryptoApiGenerateKeyParams extends GenerateKeyParams {
algorithm: KeyGenerationAlgorithm;
}
/**
* `supportedAlgorithms` is an object mapping algorithm names to their respective implementations
* Each entry in this map specifies the algorithm name and its associated properties, including the
* implementation class and any relevant names or identifiers for the algorithm. This structure
* allows for easy retrieval and instantiation of algorithm implementations based on the algorithm
* name or key specification. It facilitates the support of multiple algorithms within the
* `LocalKeyManager` class.
*/
declare const supportedAlgorithms: {
readonly 'AES-GCM': {
readonly implementation: typeof AesGcmAlgorithm;
readonly names: readonly ["A128GCM", "A192GCM", "A256GCM"];
readonly operations: readonly ["bytesToPrivateKey", "decrypt", "encrypt", "generateKey"];
};
readonly 'AES-KW': {
readonly implementation: typeof AesKwAlgorithm;
readonly names: readonly ["A128KW", "A192KW", "A256KW"];
readonly operations: readonly ["bytesToPrivateKey", "generateKey", "privateKeyToBytes", "wrapKey", "unwrapKey"];
};
readonly Ed25519: {
readonly implementation: typeof EdDsaAlgorithm;
readonly names: readonly ["Ed25519"];
readonly operations: readonly ["bytesToPrivateKey", "bytesToPublicKey", "generateKey", "sign", "verify"];
};
readonly HKDF: {
readonly implementation: typeof HkdfAlgorithm;
readonly names: readonly ["HKDF-256", "HKDF-384", "HKDF-512"];
readonly operations: readonly ["deriveKey", "deriveKeyBytes"];
};
readonly PBKDF2: {
readonly implementation: typeof Pbkdf2Algorithm;
readonly names: readonly ["PBES2-HS256+A128KW", "PBES2-HS384+A192KW", "PBES2-HS512+A256KW"];
readonly operations: readonly ["deriveKey", "deriveKeyBytes"];
};
readonly secp256k1: {
readonly implementation: typeof EcdsaAlgorithm;
readonly names: readonly ["ES256K", "secp256k1"];
readonly operations: readonly ["bytesToPrivateKey", "bytesToPublicKey", "generateKey", "sign", "verify"];
};
readonly secp256r1: {
readonly implementation: typeof EcdsaAlgorithm;
readonly names: readonly ["ES256", "secp256r1"];
readonly operations: readonly ["bytesToPrivateKey", "bytesToPublicKey", "generateKey", "sign", "verify"];
};
readonly 'SHA-256': {
readonly implementation: typeof Sha2Algorithm;
readonly names: readonly ["SHA-256"];
readonly operations: readonly ["digest"];
};
};
type SupportedAlgorithms = typeof supportedAlgorithms;
type CipherAlgorithms = {
[K in keyof SupportedAlgorithms]: 'encrypt' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type CipherAlgorithm = typeof supportedAlgorithms[CipherAlgorithms]['names'][number];
type DeriveKeyAlgorithms = {
[K in keyof SupportedAlgorithms]: 'deriveKey' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type DeriveKeyAlgorithm = typeof supportedAlgorithms[DeriveKeyAlgorithms]['names'][number];
type DeriveKeyBytesAlgorithms = {
[K in keyof SupportedAlgorithms]: 'deriveKeyBytes' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type DeriveKeyByteAlgorithm = typeof supportedAlgorithms[DeriveKeyBytesAlgorithms]['names'][number];
type DigestAlgorithms = {
[K in keyof SupportedAlgorithms]: 'digest' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type DigestAlgorithm = typeof supportedAlgorithms[DigestAlgorithms]['names'][number];
type KeyConversionAlgorithms = {
[K in keyof SupportedAlgorithms]: 'bytesToPrivateKey' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type KeyConversionAlgorithm = typeof supportedAlgorithms[KeyConversionAlgorithms]['names'][number];
type AsymmetricKeyConversionAlgorithms = {
[K in keyof SupportedAlgorithms]: 'bytesToPublicKey' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type AsymmetricKeyConversionAlgorithm = typeof supportedAlgorithms[AsymmetricKeyConversionAlgorithms]['names'][number];
type KeyWrappingAlgorithms = {
[K in keyof SupportedAlgorithms]: 'wrapKey' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type KeyWrappingAlgorithm = typeof supportedAlgorithms[KeyWrappingAlgorithms]['names'][number];
type KeyGenerationAlgorithms = {
[K in keyof SupportedAlgorithms]: 'generateKey' extends SupportedAlgorithms[K]['operations'][number] ? K : never;
}[keyof SupportedAlgorithms];
type KeyGenerationAlgorithm = typeof supportedAlgorithms[KeyGenerationAlgorithms]['names'][number];
export declare class AgentCryptoApi implements CryptoApi<CryptoApiGenerateKeyParams, Jwk, GetPublicKeyParams, CryptoApiDigestParams, SignParams, VerifyParams, CryptoApiCipherParams, CryptoApiCipherParams, CryptoApiBytesToPublicKeyParams, PublicKeyToBytesParams, CryptoApiBytesToPrivateKeyParams, PrivateKeyToBytesParams, CryptoApiDeriveKeyParams<DeriveKeyAlgorithm>, Jwk, CryptoApiDeriveKeyBytesParams<DeriveKeyAlgorithm>, Uint8Array, WrapKeyParams, UnwrapKeyParams> {
/**
* A private map that stores instances of cryptographic algorithm implementations. Each key in
* this map is an `AlgorithmConstructor`, and its corresponding value is an instance of a class
* that implements a specific cryptographic algorithm. This map is used to cache and reuse
* instances for performance optimization, ensuring that each algorithm is instantiated only once.
*/
private _algorithmInstances;
bytesToPrivateKey({ algorithm: algorithmIdentifier, privateKeyBytes }: CryptoApiBytesToPrivateKeyParams): Promise<Jwk>;
bytesToPublicKey({ algorithm: algorithmIdentifier, publicKeyBytes }: CryptoApiBytesToPublicKeyParams): Promise<Jwk>;
decrypt(params: CryptoApiCipherParams): Promise<Uint8Array>;
deriveKey<T extends DeriveKeyAlgorithm>(params: CryptoApiDeriveKeyParams<T>): Promise<Jwk>;
deriveKeyBytes<T extends DeriveKeyAlgorithm>(params: CryptoApiDeriveKeyBytesParams<T>): Promise<Uint8Array>;
/**
* Generates a hash digest of the provided data.
*
* @remarks
* A digest is the output of the hash function. It's a fixed-size string of bytes that uniquely
* represents the data input into the hash function. The digest is often used for data integrity
* checks, as any alteration in the input data results in a significantly different digest.
*
* It takes the algorithm identifier of the hash function and data to digest as input and returns
* the digest of the data.
*
* @example
* ```ts
* const cryptoApi = new AgentCryptoApi();
* const data = new Uint8Array([...]);
* const digest = await cryptoApi.digest({ algorithm: 'SHA-256', data });
* ```
*
* @param params - The parameters for the digest operation.
* @param params.algorithm - The name of hash function to use.
* @param params.data - The data to digest.
*
* @returns A Promise which will be fulfilled with the hash digest.
*/
digest({ algorithm, data }: CryptoApiDigestParams): Promise<Uint8Array>;
encrypt(params: CryptoApiCipherParams): Promise<Uint8Array>;
generateKey(params: CryptoApiGenerateKeyParams): Promise<Jwk>;
getKeyUri(_params: KmsGetKeyUriParams): Promise<string>;
getPublicKey({ key }: GetPublicKeyParams): Promise<Jwk>;
privateKeyToBytes({ privateKey }: {
privateKey: Jwk;
}): Promise<Uint8Array>;
publicKeyToBytes({ publicKey }: {
publicKey: Jwk;
}): Promise<Uint8Array>;
sign({ key, data }: SignParams): Promise<Uint8Array>;
unwrapKey(params: UnwrapKeyParams): Promise<Jwk>;
verify({ key, signature, data }: VerifyParams): Promise<boolean>;
wrapKey(params: WrapKeyParams): Promise<Uint8Array>;
/**
* Retrieves an algorithm implementation instance based on the provided algorithm name.
*
* @remarks
* This method checks if the requested algorithm is supported and returns a cached instance
* if available. If an instance does not exist, it creates and caches a new one. This approach
* optimizes performance by reusing algorithm instances across cryptographic operations.
*
* @example
* ```ts
* const signer = this.getAlgorithm({ algorithm: 'Ed25519' });
* ```
*
* @param params - The parameters for retrieving the algorithm implementation.
* @param params.algorithm - The name of the algorithm to retrieve.
*
* @returns An instance of the requested algorithm implementation.
*
* @throws Error if the requested algorithm is not supported.
*/
private getAlgorithm;
/**
* Determines the algorithm name based on the key's properties.
*
* @remarks
* This method facilitates the identification of the correct algorithm for cryptographic
* operations based on the `alg` or `crv` properties of a {@link Jwk | JWK}.
*
* @example
* ```ts
* const key = { ... }; // Public key in JWK format
* const algorithm = this.getAlgorithmName({ key });
* ```
*
* @example
* ```ts
* const algorithm = this.getAlgorithmName({ algorithm: 'ES256' });
* ```
*
* @param params - The parameters for determining the algorithm name.
* @param params.key - A JWK containing the `alg` or `crv` properties.
*
* @returns The algorithm name associated with the key.
*
* @throws Error if the algorithm name cannot be determined from the provided input.
*/
private getAlgorithmName;
}
export {};
//# sourceMappingURL=crypto-api.d.ts.map