encryption_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright (C) 2019 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package protocol
  7. import (
  8. "bytes"
  9. "reflect"
  10. "strings"
  11. "testing"
  12. )
  13. func TestEnDecryptName(t *testing.T) {
  14. var key [32]byte
  15. cases := []string{
  16. "",
  17. "foo",
  18. "a longer name/with/slashes and spaces",
  19. }
  20. for _, tc := range cases {
  21. var prev string
  22. for i := 0; i < 5; i++ {
  23. enc := encryptName(tc, &key)
  24. if prev != "" && prev != enc {
  25. t.Error("name should always encrypt the same")
  26. }
  27. prev = enc
  28. if tc != "" && strings.Contains(enc, tc) {
  29. t.Error("shouldn't contain plaintext")
  30. }
  31. dec, err := decryptName(enc, &key)
  32. if err != nil {
  33. t.Error(err)
  34. }
  35. if dec != tc {
  36. t.Error("mismatch after decryption")
  37. }
  38. t.Log(enc)
  39. }
  40. }
  41. }
  42. func TestEnDecryptBytes(t *testing.T) {
  43. var key [32]byte
  44. cases := [][]byte{
  45. {},
  46. {1, 2, 3, 4, 5},
  47. }
  48. for _, tc := range cases {
  49. var prev []byte
  50. for i := 0; i < 5; i++ {
  51. enc := encryptBytes(tc, &key)
  52. if bytes.Equal(enc, prev) {
  53. t.Error("encryption should not repeat")
  54. }
  55. prev = enc
  56. if len(tc) > 0 && bytes.Contains(enc, tc) {
  57. t.Error("shouldn't contain plaintext")
  58. }
  59. dec, err := DecryptBytes(enc, &key)
  60. if err != nil {
  61. t.Error(err)
  62. }
  63. if !bytes.Equal(dec, tc) {
  64. t.Error("mismatch after decryption")
  65. }
  66. }
  67. }
  68. }
  69. func TestEnDecryptFileInfo(t *testing.T) {
  70. var key [32]byte
  71. fi := FileInfo{
  72. Name: "hello",
  73. Size: 45,
  74. Permissions: 0755,
  75. ModifiedS: 8080,
  76. Blocks: []BlockInfo{
  77. {
  78. Size: 45,
  79. Hash: []byte{1, 2, 3},
  80. },
  81. },
  82. }
  83. enc := encryptFileInfo(fi, &key)
  84. dec, err := DecryptFileInfo(enc, &key)
  85. if err != nil {
  86. t.Error(err)
  87. }
  88. if !reflect.DeepEqual(fi, dec) {
  89. t.Error("mismatch after decryption")
  90. }
  91. }
  92. func TestIsEncryptedParent(t *testing.T) {
  93. cases := []struct {
  94. path string
  95. is bool
  96. }{
  97. {"", false},
  98. {".", false},
  99. {"/", false},
  100. {"12" + encryptedDirExtension, false},
  101. {"1" + encryptedDirExtension, true},
  102. {"1" + encryptedDirExtension + "/b", false},
  103. {"1" + encryptedDirExtension + "/bc", true},
  104. {"1" + encryptedDirExtension + "/bcd", false},
  105. {"1" + encryptedDirExtension + "/bc/foo", false},
  106. {"1.12/22", false},
  107. }
  108. for _, tc := range cases {
  109. if res := IsEncryptedParent(tc.path); res != tc.is {
  110. t.Errorf("%v: got %v, expected %v", tc.path, res, tc.is)
  111. }
  112. }
  113. }