Advertisement

← vibesdk

worker/services/secrets/vault-types.ts

2.7 KB Download file
/**
 * Vault Types - Session-bound vault architecture
 */

export type KdfAlgorithm = 'argon2id' | 'webauthn-prf';

export type SecretType = 'secret';

/** Standardized metadata for secrets (stored as plaintext JSON) */
export interface SecretMetadata {
	provider?: string; // e.g., "openai", "anthropic", "google"
	envVarName?: string; // e.g., "OPENAI_API_KEY"
	[key: string]: unknown; // Allow extensibility
}

export interface VaultConfig {
	kdfAlgorithm: KdfAlgorithm;
	kdfSalt: Uint8Array<ArrayBuffer>;
	kdfParams?: Argon2Params;
	prfCredentialId?: string;
	prfSalt?: Uint8Array<ArrayBuffer>;
	verificationBlob: Uint8Array<ArrayBuffer>;
	verificationNonce: Uint8Array<ArrayBuffer>;
	hasRecoveryCodes: boolean;
}

export interface Argon2Params {
	time: number;
	mem: number;
	parallelism: number;
}

export interface VaultStatusResponse {
	exists: boolean;
	kdfAlgorithm?: KdfAlgorithm;
	hasRecoveryCodes?: boolean;
}

/** API response type - binary fields are base64-encoded strings */
export interface VaultConfigResponse {
	kdfAlgorithm: KdfAlgorithm;
	kdfSalt: string;
	kdfParams?: Argon2Params;
	prfCredentialId?: string;
	prfSalt?: string;
	verificationBlob: string;
	verificationNonce: string;
	hasRecoveryCodes: boolean;
}

export interface SetupVaultRequest {
	kdfAlgorithm: KdfAlgorithm;
	kdfSalt: ArrayBuffer;
	kdfParams?: Argon2Params;
	prfCredentialId?: string;
	prfSalt?: ArrayBuffer;
	encryptedRecoveryCodes?: ArrayBuffer;
	recoveryCodesNonce?: ArrayBuffer;
	verificationBlob: ArrayBuffer;
	verificationNonce: ArrayBuffer;
}

export interface StoreSecretRequest {
	encryptedValue: ArrayBuffer;
	valueNonce: ArrayBuffer;
	encryptedName: ArrayBuffer;
	nameNonce: ArrayBuffer;
	metadata?: SecretMetadata; // Plaintext metadata
	secretType: SecretType;
}

export interface EncryptedSecret {
	id: string;
	encryptedValue: Uint8Array<ArrayBuffer>;
	valueNonce: Uint8Array<ArrayBuffer>;
	encryptedName: Uint8Array<ArrayBuffer>;
	nameNonce: Uint8Array<ArrayBuffer>;
	metadata?: SecretMetadata; // Plaintext metadata
	secretType: SecretType;
	createdAt: number;
	updatedAt: number;
}

export interface SecretListItem {
	id: string;
	encryptedName: Uint8Array<ArrayBuffer>;
	nameNonce: Uint8Array<ArrayBuffer>;
	metadata?: SecretMetadata; // Plaintext metadata
	secretType: SecretType;
	createdAt: number;
	updatedAt: number;
}

// Session timeout (30 minutes)
export const SESSION_TIMEOUT_MS = 30 * 60 * 1000;

// Cleanup interval (1 hour)
export const CLEANUP_INTERVAL_MS = 60 * 60 * 1000;

// Storage limits
export const STORAGE_LIMITS = {
	MAX_SECRET_VALUE_SIZE: 50 * 1024,    // 50 KB
	MAX_SECRET_NAME_LENGTH: 200,
	MAX_METADATA_SIZE: 10 * 1024,        // 10 KB
} as const;