Skip to content

Commit 938bdda

Browse files
committed
Add feature validation to dbCache key methods
Ensure that the dbCache methods for encrypting, decrypting, signing, and verifying keys validate the feature flag before proceeding with operations. This validation step prevents using keys for unintended purposes, maintaining proper alignment with their intended cryptographic feature.
1 parent e065356 commit 938bdda

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

coderd/cryptokeys/dbkeycache.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,34 @@ func newDBCache(logger slog.Logger, db database.Store, feature database.CryptoKe
7777
}
7878

7979
func (d *dbCache) EncryptingKey(ctx context.Context) (id string, key interface{}, err error) {
80+
if !isEncryptionKeyFeature(d.feature) {
81+
return "", nil, ErrInvalidFeature
82+
}
83+
8084
return d.latest(ctx)
8185
}
8286

8387
func (d *dbCache) DecryptingKey(ctx context.Context, id string) (key interface{}, err error) {
88+
if !isEncryptionKeyFeature(d.feature) {
89+
return nil, ErrInvalidFeature
90+
}
91+
8492
return d.sequence(ctx, id)
8593
}
8694

8795
func (d *dbCache) SigningKey(ctx context.Context) (id string, key interface{}, err error) {
96+
if !isSigningKeyFeature(d.feature) {
97+
return "", nil, ErrInvalidFeature
98+
}
99+
88100
return d.latest(ctx)
89101
}
90102

91103
func (d *dbCache) VerifyingKey(ctx context.Context, id string) (key interface{}, err error) {
104+
if !isSigningKeyFeature(d.feature) {
105+
return nil, ErrInvalidFeature
106+
}
107+
92108
return d.sequence(ctx, id)
93109
}
94110

coderd/cryptokeys/dbkeycache_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,24 @@ func TestDBKeyCache(t *testing.T) {
154154
db, _ = dbtestutil.NewDB(t)
155155
clock = quartz.NewMock(t)
156156
logger = slogtest.Make(t, nil)
157+
ctx = testutil.Context(t, testutil.WaitShort)
157158
)
158159

159160
_, err := cryptokeys.NewSigningCache(logger, db, database.CryptoKeyFeatureWorkspaceApps, cryptokeys.WithDBCacheClock(clock))
160161
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
162+
163+
// Instantiate a signing cache and try to use it as an encryption cache.
164+
sc, err := cryptokeys.NewSigningCache(logger, db, database.CryptoKeyFeatureOidcConvert, cryptokeys.WithDBCacheClock(clock))
165+
require.NoError(t, err)
166+
defer sc.Close()
167+
168+
ec, ok := sc.(cryptokeys.EncryptionKeycache)
169+
require.True(t, ok)
170+
_, _, err = ec.EncryptingKey(ctx)
171+
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
172+
173+
_, err = ec.DecryptingKey(ctx, "123")
174+
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
161175
})
162176

163177
t.Run("InvalidEncryptionFeature", func(t *testing.T) {
@@ -167,10 +181,24 @@ func TestDBKeyCache(t *testing.T) {
167181
db, _ = dbtestutil.NewDB(t)
168182
clock = quartz.NewMock(t)
169183
logger = slogtest.Make(t, nil)
184+
ctx = testutil.Context(t, testutil.WaitShort)
170185
)
171186

172187
_, err := cryptokeys.NewEncryptionCache(logger, db, database.CryptoKeyFeatureOidcConvert, cryptokeys.WithDBCacheClock(clock))
173188
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
189+
190+
// Instantiate an encryption cache and try to use it as a signing cache.
191+
ec, err := cryptokeys.NewEncryptionCache(logger, db, database.CryptoKeyFeatureWorkspaceApps, cryptokeys.WithDBCacheClock(clock))
192+
require.NoError(t, err)
193+
defer ec.Close()
194+
195+
sc, ok := ec.(cryptokeys.SigningKeycache)
196+
require.True(t, ok)
197+
_, _, err = sc.SigningKey(ctx)
198+
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
199+
200+
_, err = sc.VerifyingKey(ctx, "123")
201+
require.ErrorIs(t, err, cryptokeys.ErrInvalidFeature)
174202
})
175203
}
176204

0 commit comments

Comments
 (0)