summaryrefslogtreecommitdiff
path: root/internal/configfile/config_test.go
blob: 021b6c1a8e944ace66a6170538e9ab00f0e4fa2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package configfile

import (
	"fmt"
	"testing"
	"time"

	"github.com/rfjakob/gocryptfs/v2/internal/tlog"
)

var testPw = []byte("test")

func TestLoadV1(t *testing.T) {
	_, _, err := LoadAndDecrypt("config_test/v1.conf", testPw)
	if err == nil {
		t.Errorf("Outdated v1 config file must fail to load but it didn't")
	} else if testing.Verbose() {
		fmt.Println(err)
	}
}

// Load a known-good config file and verify that it takes at least 100ms
// (brute-force protection)
func TestLoadV2(t *testing.T) {
	t1 := time.Now()

	_, _, err := LoadAndDecrypt("config_test/v2.conf", testPw)
	if err != nil {
		t.Errorf("Could not load v2 config file: %v", err)
	}

	elapsed := time.Since(t1)
	if elapsed < 100*time.Millisecond {
		t.Errorf("scrypt calculation runs too fast: %d ms", elapsed/time.Millisecond)
	}
}

func TestLoadV2PwdError(t *testing.T) {
	if !testing.Verbose() {
		tlog.Warn.Enabled = false
	}
	_, _, err := LoadAndDecrypt("config_test/v2.conf", []byte("wrongpassword"))
	if err == nil {
		t.Errorf("Loading with wrong password must fail but it didn't")
	}
}

func TestLoadV2Feature(t *testing.T) {
	_, _, err := LoadAndDecrypt("config_test/PlaintextNames.conf", testPw)
	if err != nil {
		t.Errorf("Could not load v2 PlaintextNames config file: %v", err)
	}
}

func TestLoadV2StrangeFeature(t *testing.T) {
	_, _, err := LoadAndDecrypt("config_test/StrangeFeature.conf", testPw)
	if err == nil {
		t.Errorf("Loading unknown feature must fail but it didn't")
	} else if testing.Verbose() {
		fmt.Println(err)
	}
}

func TestCreateConfDefault(t *testing.T) {
	err := Create(&CreateArgs{
		Filename: "config_test/tmp.conf",
		Password: testPw,
		LogN:     10,
		Creator:  "test"})
	if err != nil {
		t.Fatal(err)
	}
	_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
	if err != nil {
		t.Fatal(err)
	}
	// Check that all expected feature flags are set
	want := []flagIota{
		FlagGCMIV128, FlagDirIV, FlagEMENames, FlagLongNames,
		FlagRaw64, FlagHKDF,
	}
	for _, f := range want {
		if !c.IsFeatureFlagSet(f) {
			t.Errorf("Feature flag %q should be set but is not", knownFlags[f])
		}
	}
}

func TestCreateConfDevRandom(t *testing.T) {
	err := Create(&CreateArgs{
		Filename:  "config_test/tmp.conf",
		Password:  testPw,
		LogN:      10,
		Creator:   "test",
		Devrandom: true})
	if err != nil {
		t.Fatal(err)
	}
}

func TestCreateConfPlaintextnames(t *testing.T) {
	err := Create(&CreateArgs{
		Filename:       "config_test/tmp.conf",
		Password:       testPw,
		PlaintextNames: true,
		LogN:           10,
		Creator:        "test"})
	if err != nil {
		t.Fatal(err)
	}
	_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
	if err != nil {
		t.Fatal(err)
	}
	// Check that all expected feature flags are set
	want := []flagIota{
		FlagGCMIV128, FlagHKDF,
	}
	for _, f := range want {
		if !c.IsFeatureFlagSet(f) {
			t.Errorf("Feature flag %q should be set but is not", knownFlags[f])
		}
	}
}

// Reverse mode uses AESSIV
func TestCreateConfFileAESSIV(t *testing.T) {
	err := Create(&CreateArgs{
		Filename: "config_test/tmp.conf",
		Password: testPw,
		LogN:     10,
		Creator:  "test",
		AESSIV:   true})
	if err != nil {
		t.Fatal(err)
	}
	_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
	if err != nil {
		t.Fatal(err)
	}
	if !c.IsFeatureFlagSet(FlagAESSIV) {
		t.Error("AESSIV flag should be set but is not")
	}
}

func TestIsFeatureFlagKnown(t *testing.T) {
	// Test a few hardcoded values
	testKnownFlags := []string{"DirIV", "PlaintextNames", "EMENames", "GCMIV128", "LongNames", "AESSIV"}
	// And also everything in knownFlags (yes, it is likely that we end up with
	// some duplicates. Does not matter.)
	for _, f := range knownFlags {
		testKnownFlags = append(testKnownFlags, f)
	}

	for _, f := range testKnownFlags {
		if !isFeatureFlagKnown(f) {
			t.Errorf("flag %q should be known", f)
		}
	}

	f := "StrangeFeatureFlag"
	if isFeatureFlagKnown(f) {
		t.Errorf("flag %q should be NOT known", f)
	}
}