Files
warmbly/internal/app/cipher/cipher.go
Matthew Meszaros b9a5871308 feat: key the cipher service by organization ID
cipher.CipherService.Cipher(ctx, orgID) now resolves, generates, and
caches DEKs per organization (Redis key decrypted_key:<orgID>).
Platform-level secrets keep the zero-UUID identity, renamed to
platformCipherID since it no longer partitions against user keys.
2026-06-10 17:16:26 +02:00

50 lines
886 B
Go

package cipher
import (
"context"
"github.com/getsentry/sentry-go"
"github.com/google/uuid"
)
type Cipher struct {
plainDEK []byte
}
func (s *cipherService) Cipher(ctx context.Context, orgID uuid.UUID) (*Cipher, error) {
key, err := s.getDecryptedKey(ctx, orgID)
if err != nil {
return nil, err
}
encDEKB64, err := s.encryptedKeys.Get(ctx, orgID)
if err != nil {
return nil, err
}
if encDEKB64 == "" {
var encryptedDEK string
key, encryptedDEK, err = s.kms.GenerateDataKey(ctx)
if err != nil {
return nil, err
}
if err := s.encryptedKeys.Put(ctx, orgID, encryptedDEK); err != nil {
return nil, err
}
} else {
key, err = s.kms.GetDecryptedKey(ctx, encDEKB64)
if err != nil {
return nil, err
}
}
if err := s.saveDecryptedKey(ctx, orgID, key); err != nil {
sentry.CaptureException(err)
}
return &Cipher{
plainDEK: key,
}, nil
}