Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion service/integration/kas_registry_key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func (s *KasRegistryKeySuite) Test_CreateKasKey_ProviderConfigInvalid_Fail() {
resp, err := s.db.PolicyClient.CreateKey(s.ctx, &req)
s.Require().Error(err)
s.Nil(resp)
s.Require().ErrorContains(err, db.ErrTextNotFound)
s.Require().ErrorContains(err, db.ErrForeignKeyViolation.Error())
}

func (s *KasRegistryKeySuite) Test_CreateKasKey_NonBase64Ctx_Fail() {
Expand Down
64 changes: 64 additions & 0 deletions service/integration/keymanagement_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/google/uuid"
"github.com/opentdf/platform/protocol/go/common"
"github.com/opentdf/platform/protocol/go/policy"
"github.com/opentdf/platform/protocol/go/policy/kasregistry"
"github.com/opentdf/platform/protocol/go/policy/keymanagement"
"github.com/opentdf/platform/service/internal/fixtures"
"github.com/opentdf/platform/service/pkg/db"
Expand Down Expand Up @@ -384,6 +385,69 @@ func (s *KeyManagementSuite) Test_DeleteProviderConfig_Succeeds() {
s.NotNil(pc)
}

func (s *KeyManagementSuite) Test_DeleteProviderConfig_InUse_Fails() {
// Create a provider config
pcIDs := make([]string, 0)
var kasID string
var keyID string
defer func() {
if keyID != "" {
_, err := s.db.PolicyClient.DeleteKey(s.ctx, keyID)
s.Require().NoError(err)
}
if kasID != "" {
_, err := s.db.PolicyClient.DeleteKeyAccessServer(s.ctx, kasID)
s.Require().NoError(err)
}

s.deleteTestProviderConfigs(pcIDs)
}()
pc := s.createTestProviderConfig(testProvider, validProviderConfig, nil)
s.NotNil(pc)
pcIDs = append(pcIDs, pc.GetId())

// Create a key access server that uses the provider config
uri := "provider-config-test-kas.com"
pubKey := &policy.PublicKey{
PublicKey: &policy.PublicKey_Remote{
Remote: "https://acmecorp.somewhere/key",
},
}
name := "1MiXEDCASEkas-name"
kasRegistry := &kasregistry.CreateKeyAccessServerRequest{
Uri: uri,
Name: name,
PublicKey: pubKey,
}
kasCreateResp, err := s.db.PolicyClient.CreateKeyAccessServer(s.ctx, kasRegistry)
s.Require().NoError(err)
s.NotNil(kasCreateResp)
kasID = kasCreateResp.GetId()

// Create a key that uses the provider config
key, err := s.db.PolicyClient.CreateKey(s.ctx, &kasregistry.CreateKeyRequest{
KasId: kasID,
KeyId: "test-key-provider-config",
KeyAlgorithm: policy.Algorithm_ALGORITHM_EC_P256,
KeyMode: policy.KeyMode_KEY_MODE_PROVIDER_ROOT_KEY,
PublicKeyCtx: &policy.PublicKeyCtx{
Pem: keyCtx,
},
PrivateKeyCtx: &policy.PrivateKeyCtx{
WrappedKey: keyCtx,
KeyId: "test-wrapping-kid",
},
ProviderConfigId: pc.GetId(),
})
s.Require().NoError(err)
s.NotNil(key)
keyID = key.GetKasKey().GetKey().GetId()

_, err = s.db.PolicyClient.DeleteProviderConfig(s.ctx, pc.GetId())
s.Require().Error(err)
s.Require().ErrorContains(err, db.ErrForeignKeyViolation.Error())
}

func (s *KeyManagementSuite) Test_DeleteProviderConfig_InvalidUUID_Fails() {
pc, err := s.db.PolicyClient.DeleteProviderConfig(s.ctx, invalidUUID)
s.Require().Error(err)
Expand Down
14 changes: 1 addition & 13 deletions service/policy/db/key_access_server_registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"github.com/opentdf/platform/protocol/go/policy"
"github.com/opentdf/platform/protocol/go/policy/attributes"
"github.com/opentdf/platform/protocol/go/policy/kasregistry"
"github.com/opentdf/platform/protocol/go/policy/keymanagement"
"github.com/opentdf/platform/protocol/go/policy/namespaces"
"github.com/opentdf/platform/service/pkg/db"
"github.com/opentdf/platform/service/wellknownconfiguration"
Expand Down Expand Up @@ -374,17 +373,6 @@ func (c PolicyDBClient) CreateKey(ctx context.Context, r *kasregistry.CreateKeyR
return nil, errors.Join(errors.New("private key ctx"), db.ErrExpectedBase64EncodedValue)
}

// Especially if we need to verify the connection and get the public key.
// Need provider logic to validate connection to remote provider.
var pc *policy.KeyProviderConfig
var err error
if providerConfigID != "" {
pc, err = c.GetProviderConfig(ctx, &keymanagement.GetProviderConfigRequest_Id{Id: providerConfigID})
if err != nil {
return nil, db.StatusifyError(err, db.ErrTextGetRetrievalFailed, kasID)
}
}

// Marshal private key and public key context
pubCtx, err := json.Marshal(r.GetPublicKeyCtx())
if err != nil {
Expand Down Expand Up @@ -412,7 +400,7 @@ func (c PolicyDBClient) CreateKey(ctx context.Context, r *kasregistry.CreateKeyR
Metadata: metadataJSON,
PrivateKeyCtx: privateCtx,
PublicKeyCtx: pubCtx,
ProviderConfigID: pgtypeUUID(pc.GetId()),
ProviderConfigID: pgtypeUUID(providerConfigID),
})
if err != nil {
return nil, db.WrapIfKnownInvalidQueryErr(err)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
```mermaid
erDiagram
key_access_server_keys {
timestamp_with_time_zone created_at
timestamp_with_time_zone expiration
uuid id PK
uuid key_access_server_id FK,UK
integer key_algorithm
character_varying key_id UK
integer key_mode
integer key_status
jsonb metadata
jsonb private_key_ctx
uuid provider_config_id FK
jsonb public_key_ctx
timestamp_with_time_zone updated_at
}

key_access_server_keys }o--|| provider_config : "provider_config_id"
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-- +goose Up
-- +goose StatementBegin

-- Do not delete provider configurations when they are referenced by asym_key
ALTER TABLE key_access_server_keys
DROP CONSTRAINT IF EXISTS key_access_server_keys_provider_config_fk;

ALTER TABLE key_access_server_keys
ADD CONSTRAINT key_access_server_keys_provider_config_fk
FOREIGN KEY (provider_config_id)
REFERENCES provider_config (id)
ON DELETE RESTRICT;



-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin

-- Revert changes for asym_key
ALTER TABLE key_access_server_keys
DROP CONSTRAINT IF EXISTS key_access_server_keys_provider_config_fk;

ALTER TABLE key_access_server_keys
ADD CONSTRAINT key_access_server_keys_provider_config_fk
FOREIGN KEY (provider_config_id)
REFERENCES provider_config (id);

-- +goose StatementEnd
3 changes: 2 additions & 1 deletion service/policy/db/schema_erd.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ erDiagram
integer key_status
jsonb metadata
jsonb private_key_ctx
uuid provider_config_id
uuid provider_config_id FK
jsonb public_key_ctx
timestamp_with_time_zone updated_at
}
Expand Down Expand Up @@ -249,6 +249,7 @@ erDiagram
subject_mappings }o--|| attribute_values : "attribute_value_id"
base_keys }o--|| key_access_server_keys : "key_access_server_key_id"
key_access_server_keys }o--|| key_access_servers : "key_access_server_id"
key_access_server_keys }o--|| provider_config : "provider_config_id"
sym_key }o--|| provider_config : "provider_config_id"
registered_resource_action_attribute_values }o--|| registered_resource_values : "registered_resource_value_id"
registered_resource_values }o--|| registered_resources : "registered_resource_id"
Expand Down
Loading