index_blob_encryption_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package indexblob
  2. import (
  3. "testing"
  4. "github.com/pkg/errors"
  5. "github.com/stretchr/testify/require"
  6. "github.com/kopia/kopia/internal/blobcrypto"
  7. "github.com/kopia/kopia/internal/blobtesting"
  8. "github.com/kopia/kopia/internal/gather"
  9. "github.com/kopia/kopia/internal/testlogging"
  10. "github.com/kopia/kopia/repo/blob"
  11. "github.com/kopia/kopia/repo/encryption"
  12. "github.com/kopia/kopia/repo/format"
  13. "github.com/kopia/kopia/repo/hashing"
  14. "github.com/kopia/kopia/repo/logging"
  15. )
  16. type failingEncryptor struct {
  17. encryption.Encryptor
  18. err error
  19. }
  20. func (f failingEncryptor) Encrypt(input gather.Bytes, contentID []byte, output *gather.WriteBuffer) error {
  21. return f.err
  22. }
  23. func TestEncryptedBlobManager(t *testing.T) {
  24. data := blobtesting.DataMap{}
  25. st := blobtesting.NewMapStorage(data, nil, nil)
  26. fs := blobtesting.NewFaultyStorage(st)
  27. f := &format.ContentFormat{
  28. Hash: hashing.DefaultAlgorithm,
  29. Encryption: encryption.DefaultAlgorithm,
  30. }
  31. hf, err := hashing.CreateHashFunc(f)
  32. require.NoError(t, err)
  33. enc, err := encryption.CreateEncryptor(f)
  34. require.NoError(t, err)
  35. ebm := EncryptionManager{
  36. st: fs,
  37. crypter: blobcrypto.StaticCrypter{Hash: hf, Encryption: enc},
  38. indexBlobCache: nil,
  39. log: logging.NullLogger,
  40. }
  41. ctx := testlogging.Context(t)
  42. bm, err := ebm.EncryptAndWriteBlob(ctx, gather.FromSlice([]byte{1, 2, 3}), "x", "session1")
  43. require.NoError(t, err)
  44. stbm, err := st.GetMetadata(ctx, bm.BlobID)
  45. require.NoError(t, err)
  46. require.Equal(t, stbm, bm)
  47. var tmp gather.WriteBuffer
  48. defer tmp.Close()
  49. require.NoError(t, ebm.GetEncryptedBlob(ctx, bm.BlobID, &tmp))
  50. // data corruption
  51. data[bm.BlobID][0] ^= 1
  52. require.Error(t, ebm.GetEncryptedBlob(ctx, bm.BlobID, &tmp))
  53. require.ErrorIs(t, ebm.GetEncryptedBlob(ctx, "no-such-blob", &tmp), blob.ErrBlobNotFound)
  54. someError := errors.New("some error")
  55. fs.AddFault(blobtesting.MethodPutBlob).ErrorInstead(someError)
  56. _, err = ebm.EncryptAndWriteBlob(ctx, gather.FromSlice([]byte{1, 2, 3, 4}), "x", "session1")
  57. require.ErrorIs(t, err, someError)
  58. someError2 := errors.New("some error 2")
  59. ebm.crypter = blobcrypto.StaticCrypter{Hash: hf, Encryption: failingEncryptor{nil, someError2}}
  60. _, err = ebm.EncryptAndWriteBlob(ctx, gather.FromSlice([]byte{1, 2, 3, 4}), "x", "session1")
  61. require.ErrorIs(t, err, someError2)
  62. }