From 419c7acb11cdd298bf2dec7c86ebeea3f139e796 Mon Sep 17 00:00:00 2001 From: Jarek Kowalski Date: Mon, 8 Aug 2022 21:45:08 -0700 Subject: [PATCH] fix(repository): fixed V1 key derivation bug from previous refactoring (#2286) See https://github.com/kopia/kopia/commit/23299c34512e640d50e1ddff888758a119a09cb8 --- internal/repotesting/repotesting.go | 5 +- repo/maintenance/maintenance_schedule.go | 7 +-- repo/repository.go | 15 ++--- repo/repository_test.go | 77 ++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 18 deletions(-) diff --git a/internal/repotesting/repotesting.go b/internal/repotesting/repotesting.go index 5c48899d1..2b99daeca 100644 --- a/internal/repotesting/repotesting.go +++ b/internal/repotesting/repotesting.go @@ -20,7 +20,8 @@ "github.com/kopia/kopia/snapshot" ) -const defaultPassword = "foobarbazfoobarbaz" +// DefaultPasswordForTesting is the default password to use for all testing repositories. +const DefaultPasswordForTesting = "foobarbazfoobarbaz" // Environment encapsulates details of a test environment. type Environment struct { @@ -91,7 +92,7 @@ func (e *Environment) setup(tb testing.TB, version format.Version, opts ...Optio e.st = st if e.Password == "" { - e.Password = defaultPassword + e.Password = DefaultPasswordForTesting } if err := repo.Initialize(ctx, st, opt, e.Password); err != nil { diff --git a/repo/maintenance/maintenance_schedule.go b/repo/maintenance/maintenance_schedule.go index 46f0a9ec0..2e472e34a 100644 --- a/repo/maintenance/maintenance_schedule.go +++ b/repo/maintenance/maintenance_schedule.go @@ -62,12 +62,7 @@ func (s *Schedule) ReportRun(taskType TaskType, info RunInfo) { } func getAES256GCM(rep repo.DirectRepository) (cipher.AEAD, error) { - key, err := rep.DeriveKey(maintenanceScheduleKeyPurpose, maintenanceScheduleKeySize) - if err != nil { - return nil, errors.Wrap(err, "derive key") - } - - c, err := aes.NewCipher(key) + c, err := aes.NewCipher(rep.DeriveKey(maintenanceScheduleKeyPurpose, maintenanceScheduleKeySize)) if err != nil { return nil, errors.Wrap(err, "unable to create AES-256 cipher") } diff --git a/repo/repository.go b/repo/repository.go index c5df08248..2513e10f6 100644 --- a/repo/repository.go +++ b/repo/repository.go @@ -63,7 +63,7 @@ type DirectRepository interface { AlsoLogToContentLog(ctx context.Context) context.Context UniqueID() []byte ConfigFilename() string - DeriveKey(purpose []byte, keyLength int) ([]byte, error) + DeriveKey(purpose []byte, keyLength int) []byte Token(password string) (string, error) Throttler() throttling.SettableThrottler RequiredFeatures() ([]feature.Required, error) @@ -111,20 +111,15 @@ type directRepository struct { } // DeriveKey derives encryption key of the provided length from the master key. -func (r *directRepository) DeriveKey(purpose []byte, keyLength int) ([]byte, error) { - mp, mperr := r.cmgr.ContentFormat().GetMutableParameters() - if mperr != nil { - return nil, errors.Wrap(mperr, "mutable parameters") - } - - if mp.Version >= format.FormatVersion2 { - return format.DeriveKeyFromMasterKey(r.cmgr.ContentFormat().GetMasterKey(), r.uniqueID, purpose, keyLength), nil +func (r *directRepository) DeriveKey(purpose []byte, keyLength int) []byte { + if r.cmgr.ContentFormat().SupportsPasswordChange() { + return format.DeriveKeyFromMasterKey(r.cmgr.ContentFormat().GetMasterKey(), r.uniqueID, purpose, keyLength) } // version of kopia