Skip to content

Commit 65ba2e0

Browse files
feat(core): Actually use KeyManager ProviderConfig (#2837)
### Proposed Changes - Looking up a key now loads the `manager` field in the key provider - This is required, as the manager should be the factory key, not the name - This allows us to load the same manager multiple times with different configs. HOWEVER the config is only looked at on the first load; we should update this so it evicts and reloads the provider if the config changes. This hopefully will come in a follow-up. Similarly, we don't have much in the way of integration tests for these, since we don't include a key manager that takes a config. I'll look into starting the Vault sample plugin back up and running. While I'm here, since our downstream deps no longer create them, I've removed support for the `KeyManagerFactory` that does *not* take a context object. ### Checklist - [x] I have added or updated unit tests - [ ] I have added or updated integration tests (if appropriate) - [ ] I have added or updated documentation ### Testing Instructions
1 parent 5c1ec9c commit 65ba2e0

22 files changed

+118
-68
lines changed

service/internal/security/in_process_provider.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ func (k *KeyDetailsAdapter) ExportCertificate(_ context.Context) (string, error)
9797
}
9898

9999
func (k *KeyDetailsAdapter) ProviderConfig() *policy.KeyProviderConfig {
100-
// Provider config is not supported for this adapter.
101-
return nil
100+
return &policy.KeyProviderConfig{
101+
Manager: inProcessSystemName,
102+
Name: "static",
103+
}
102104
}
103105

104106
// NewSecurityProviderAdapter creates a new adapter that implements SecurityProvider using a CryptoProvider

service/kas/access/publicKey_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,9 @@ func TestPublicKeyWithSecurityProvider(t *testing.T) {
182182

183183
// Create Provider with the mock security provider
184184
delegator := trust.NewDelegatingKeyService(mockProvider, logger.CreateTestLogger(), nil)
185-
delegator.RegisterKeyManager(mockProvider.Name(), func(_ *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) { return mockProvider, nil })
185+
delegator.RegisterKeyManagerCtx(mockProvider.Name(), func(_ context.Context, _ *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
186+
return mockProvider, nil
187+
})
186188
kas := Provider{
187189
KeyDelegator: delegator,
188190
KASConfig: KASConfig{
@@ -351,7 +353,7 @@ func TestStandardCertificateHandlerEmpty(t *testing.T) {
351353
inProcess := security.NewSecurityProviderAdapter(c, nil, nil)
352354

353355
delegator := trust.NewDelegatingKeyService(inProcess, logger.CreateTestLogger(), nil)
354-
delegator.RegisterKeyManager(inProcess.Name(), func(_ *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
356+
delegator.RegisterKeyManagerCtx(inProcess.Name(), func(_ context.Context, _ *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
355357
return inProcess, nil
356358
})
357359

service/kas/kas.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
6161
}
6262
}
6363

64-
var kmgrNames []string
64+
var kmgrs []string
6565

6666
if kasCfg.Preview.KeyManagement {
6767
srp.Logger.Info("preview feature: key management is enabled")
@@ -75,23 +75,26 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
7575

7676
// Configure new delegation service
7777
p.KeyDelegator = trust.NewDelegatingKeyService(NewPlatformKeyIndexer(srp.SDK, kasURL.String(), srp.Logger), srp.Logger, cacheClient)
78-
for _, manager := range srp.KeyManagerFactories {
79-
p.KeyDelegator.RegisterKeyManager(manager.Name, manager.Factory)
80-
kmgrNames = append(kmgrNames, manager.Name)
78+
if len(srp.KeyManagerFactories) > 0 {
79+
srp.Logger.Error("kas service ignores legacy KeyManagerFactories; using KeyManagerCtxFactories instead")
80+
}
81+
for _, manager := range srp.KeyManagerCtxFactories {
82+
p.KeyDelegator.RegisterKeyManagerCtx(manager.Name, manager.Factory)
83+
kmgrs = append(kmgrs, manager.Name)
8184
}
8285

8386
// Register Basic Key Manager
84-
p.KeyDelegator.RegisterKeyManager(security.BasicManagerName, func(opts *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
87+
p.KeyDelegator.RegisterKeyManagerCtx(security.BasicManagerName, func(_ context.Context, opts *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
8588
bm, err := security.NewBasicManager(opts.Logger, opts.Cache, kasCfg.RootKey)
8689
if err != nil {
8790
return nil, err
8891
}
8992
return bm, nil
9093
})
91-
kmgrNames = append(kmgrNames, security.BasicManagerName)
94+
kmgrs = append(kmgrs, security.BasicManagerName)
9295
// Explicitly set the default manager for session key generation.
9396
// This should be configurable, e.g., defaulting to BasicManager or an HSM if available.
94-
p.KeyDelegator.SetDefaultMode(security.BasicManagerName) // Example: default to BasicManager
97+
p.KeyDelegator.SetDefaultMode(security.BasicManagerName, "", nil) // Example: default to BasicManager
9598
} else {
9699
// Set up both the legacy CryptoProvider and the new SecurityProvider
97100
kasCfg.UpgradeMapToKeyring(srp.OTDF.CryptoProvider)
@@ -100,14 +103,14 @@ func NewRegistration() *serviceregistry.Service[kasconnect.AccessServiceHandler]
100103
inProcessService := initSecurityProviderAdapter(p.CryptoProvider, kasCfg, srp.Logger)
101104

102105
p.KeyDelegator = trust.NewDelegatingKeyService(inProcessService, srp.Logger, nil)
103-
p.KeyDelegator.RegisterKeyManager(inProcessService.Name(), func(*trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
106+
p.KeyDelegator.RegisterKeyManagerCtx(inProcessService.Name(), func(_ context.Context, _ *trust.KeyManagerFactoryOptions) (trust.KeyManager, error) {
104107
return inProcessService, nil
105108
})
106109
// Set default for non-key-management mode
107-
p.KeyDelegator.SetDefaultMode(inProcessService.Name())
108-
kmgrNames = append(kmgrNames, inProcessService.Name())
110+
p.KeyDelegator.SetDefaultMode(inProcessService.Name(), "", nil)
111+
kmgrs = append(kmgrs, inProcessService.Name())
109112
}
110-
srp.Logger.Info("kas registered trust.KeyManagers", slog.Any("key_managers", kmgrNames))
113+
srp.Logger.Info("kas registered trust.KeyManagers", slog.Any("key_managers", kmgrs))
111114

112115
p.SDK = srp.SDK
113116
p.Logger = srp.Logger

service/policy/db/actions.sql.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/attribute_fqn.sql.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/attribute_values.sql.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/attributes.sql.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/copyfrom.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/db.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

service/policy/db/key_access_server_registry.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ func (c PolicyDBClient) GetKey(ctx context.Context, identifier any) (*policy.Kas
480480
if key.ProviderConfigID.Valid {
481481
providerConfig = &policy.KeyProviderConfig{}
482482
providerConfig.Id = UUIDToString(key.ProviderConfigID)
483+
providerConfig.Manager = key.PcManager.String
483484
providerConfig.Name = key.ProviderName.String
484485
providerConfig.ConfigJson = key.PcConfig
485486
providerConfig.Metadata = &common.Metadata{}

0 commit comments

Comments
 (0)