2016-02-06 19:20:54 +01:00
|
|
|
package configfile
|
2015-11-03 21:06:52 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
"time"
|
2016-02-06 20:22:45 +01:00
|
|
|
|
2021-08-23 15:05:15 +02:00
|
|
|
"github.com/rfjakob/gocryptfs/v2/internal/tlog"
|
2015-11-03 21:06:52 +01:00
|
|
|
)
|
|
|
|
|
2018-02-18 14:26:54 +01:00
|
|
|
var testPw = []byte("test")
|
|
|
|
|
2015-11-03 21:06:52 +01:00
|
|
|
func TestLoadV1(t *testing.T) {
|
2018-09-08 12:40:29 +02:00
|
|
|
_, _, err := LoadAndDecrypt("config_test/v1.conf", testPw)
|
2015-11-03 21:06:52 +01:00
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Outdated v1 config file must fail to load but it didn't")
|
|
|
|
} else if testing.Verbose() {
|
2017-02-16 19:45:20 +01:00
|
|
|
fmt.Println(err)
|
2015-11-03 21:06:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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()
|
|
|
|
|
2018-09-08 12:40:29 +02:00
|
|
|
_, _, err := LoadAndDecrypt("config_test/v2.conf", testPw)
|
2015-11-03 21:06:52 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Could not load v2 config file: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
elapsed := time.Since(t1)
|
2015-11-14 17:16:17 +01:00
|
|
|
if elapsed < 100*time.Millisecond {
|
|
|
|
t.Errorf("scrypt calculation runs too fast: %d ms", elapsed/time.Millisecond)
|
2015-11-03 21:06:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadV2PwdError(t *testing.T) {
|
2015-11-14 17:16:17 +01:00
|
|
|
if !testing.Verbose() {
|
2016-06-15 23:30:44 +02:00
|
|
|
tlog.Warn.Enabled = false
|
2015-11-03 21:06:52 +01:00
|
|
|
}
|
2018-09-08 12:40:29 +02:00
|
|
|
_, _, err := LoadAndDecrypt("config_test/v2.conf", []byte("wrongpassword"))
|
2015-11-03 21:06:52 +01:00
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Loading with wrong password must fail but it didn't")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadV2Feature(t *testing.T) {
|
2018-09-08 12:40:29 +02:00
|
|
|
_, _, err := LoadAndDecrypt("config_test/PlaintextNames.conf", testPw)
|
2015-11-03 21:06:52 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("Could not load v2 PlaintextNames config file: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadV2StrangeFeature(t *testing.T) {
|
2018-09-08 12:40:29 +02:00
|
|
|
_, _, err := LoadAndDecrypt("config_test/StrangeFeature.conf", testPw)
|
2015-11-03 21:06:52 +01:00
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Loading unknown feature must fail but it didn't")
|
|
|
|
} else if testing.Verbose() {
|
2017-02-16 19:45:20 +01:00
|
|
|
fmt.Println(err)
|
2015-11-03 21:06:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-07 21:03:05 +01:00
|
|
|
func TestCreateConfDefault(t *testing.T) {
|
2021-08-21 14:04:04 +02:00
|
|
|
err := Create(&CreateArgs{
|
2021-08-21 14:01:58 +02:00
|
|
|
Filename: "config_test/tmp.conf",
|
|
|
|
Password: testPw,
|
|
|
|
LogN: 10,
|
|
|
|
Creator: "test"})
|
2015-11-03 21:06:52 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2018-09-08 12:40:29 +02:00
|
|
|
_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
|
2015-11-03 21:06:52 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2017-03-06 22:20:28 +01:00
|
|
|
// 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])
|
2017-03-05 23:15:50 +01:00
|
|
|
}
|
2017-03-06 22:20:28 +01:00
|
|
|
}
|
2015-11-03 21:06:52 +01:00
|
|
|
}
|
2015-11-27 22:18:36 +01:00
|
|
|
|
2017-11-19 13:30:04 +01:00
|
|
|
func TestCreateConfDevRandom(t *testing.T) {
|
2021-08-21 14:04:04 +02:00
|
|
|
err := Create(&CreateArgs{
|
2021-08-21 14:01:58 +02:00
|
|
|
Filename: "config_test/tmp.conf",
|
|
|
|
Password: testPw,
|
|
|
|
LogN: 10,
|
|
|
|
Creator: "test",
|
|
|
|
Devrandom: true})
|
2017-11-19 13:30:04 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-07 21:03:05 +01:00
|
|
|
func TestCreateConfPlaintextnames(t *testing.T) {
|
2021-08-21 14:04:04 +02:00
|
|
|
err := Create(&CreateArgs{
|
2021-08-21 14:01:58 +02:00
|
|
|
Filename: "config_test/tmp.conf",
|
|
|
|
Password: testPw,
|
|
|
|
PlaintextNames: true,
|
|
|
|
LogN: 10,
|
|
|
|
Creator: "test"})
|
2017-03-07 21:03:05 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2018-09-08 12:40:29 +02:00
|
|
|
_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
|
2017-03-07 21:03:05 +01:00
|
|
|
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
|
2016-09-26 23:25:13 +02:00
|
|
|
func TestCreateConfFileAESSIV(t *testing.T) {
|
2021-08-21 14:04:04 +02:00
|
|
|
err := Create(&CreateArgs{
|
2021-08-21 14:01:58 +02:00
|
|
|
Filename: "config_test/tmp.conf",
|
|
|
|
Password: testPw,
|
|
|
|
LogN: 10,
|
|
|
|
Creator: "test",
|
|
|
|
AESSIV: true})
|
2016-09-20 22:59:10 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2018-09-08 12:40:29 +02:00
|
|
|
_, c, err := LoadAndDecrypt("config_test/tmp.conf", testPw)
|
2016-09-20 22:59:10 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2016-09-26 23:25:13 +02:00
|
|
|
if !c.IsFeatureFlagSet(FlagAESSIV) {
|
|
|
|
t.Error("AESSIV flag should be set but is not")
|
2016-09-20 22:59:10 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-27 22:18:36 +01:00
|
|
|
func TestIsFeatureFlagKnown(t *testing.T) {
|
2016-06-05 12:53:10 +02:00
|
|
|
// Test a few hardcoded values
|
2016-09-26 23:25:13 +02:00
|
|
|
testKnownFlags := []string{"DirIV", "PlaintextNames", "EMENames", "GCMIV128", "LongNames", "AESSIV"}
|
2016-06-05 12:53:10 +02:00
|
|
|
// 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)
|
2015-11-27 22:18:36 +01:00
|
|
|
}
|
2016-06-05 12:53:10 +02:00
|
|
|
|
|
|
|
for _, f := range testKnownFlags {
|
2021-08-21 21:43:26 +02:00
|
|
|
if !isFeatureFlagKnown(f) {
|
2016-06-05 12:53:10 +02:00
|
|
|
t.Errorf("flag %q should be known", f)
|
|
|
|
}
|
2015-11-27 22:18:36 +01:00
|
|
|
}
|
2016-06-05 12:53:10 +02:00
|
|
|
|
|
|
|
f := "StrangeFeatureFlag"
|
2021-08-21 21:43:26 +02:00
|
|
|
if isFeatureFlagKnown(f) {
|
2016-06-05 12:53:10 +02:00
|
|
|
t.Errorf("flag %q should be NOT known", f)
|
2015-11-27 22:18:36 +01:00
|
|
|
}
|
|
|
|
}
|