Implement cloud KMS providers for envelope encryption. Core IKmsProvider/IShareStore interfaces and LocalFileKmsProvider already shipped (#17).
Splits off the remaining cloud provider work from the original PRD-24.
Acceptance Criteria
Tasks
Context
Depends on core interfaces from #17 (closed, shipped):
IKmsProvider — encrypt(plaintext) → EncryptedEnvelope, decrypt(envelope) → plaintext
IShareStore — storeShare(signerId, share), loadShare(signerId) → share
EncryptedEnvelope — { ciphertext, iv, tag, kmsKeyId, kmsProvider }
LocalFileKmsProvider — reference implementation for dev/testing
Implement cloud KMS providers for envelope encryption. Core
IKmsProvider/IShareStoreinterfaces andLocalFileKmsProvideralready shipped (#17).Splits off the remaining cloud provider work from the original PRD-24.
Acceptance Criteria
AwsKmsProvider— AWS KMS Encrypt/Decrypt with CMK ARNGcpKmsProvider— GCP Cloud KMS Encrypt/Decrypt with key resource nameAzureKmsProvider— Azure Key Vault wrapKey/unwrapKeyVaultTransitProvider— HashiCorp Vault Transit engine encrypt/decryptKmsModulewith provider factory —KMS_PROVIDERenv var selects backenddocker-compose.ymlmakes Vault optional via Docker Compose profilespnpm buildsucceeds across all packagesTasks
AwsKmsProvider(aws-sdk v3@aws-sdk/client-kms)GcpKmsProvider(@google-cloud/kms)AzureKmsProvider(@azure/keyvault-keys)VaultTransitProvider(HTTP API to Vault Transit)KmsModulewith provider factory + env var selectiondocker-compose.yml— Vault as optional profileContext
Depends on core interfaces from #17 (closed, shipped):
IKmsProvider—encrypt(plaintext) → EncryptedEnvelope,decrypt(envelope) → plaintextIShareStore—storeShare(signerId, share),loadShare(signerId) → shareEncryptedEnvelope—{ ciphertext, iv, tag, kmsKeyId, kmsProvider }LocalFileKmsProvider— reference implementation for dev/testing