Add a command line option for blocksize
This commit is contained in:
parent
41bf0fd836
commit
526b749d1d
@ -193,7 +193,7 @@ namespace cryfs {
|
|||||||
CryConfigFile Cli::_loadOrCreateConfig(const ProgramOptions &options) {
|
CryConfigFile Cli::_loadOrCreateConfig(const ProgramOptions &options) {
|
||||||
try {
|
try {
|
||||||
auto configFile = _determineConfigFile(options);
|
auto configFile = _determineConfigFile(options);
|
||||||
auto config = _loadOrCreateConfigFile(configFile, options.cipher());
|
auto config = _loadOrCreateConfigFile(configFile, options.cipher(), options.blocksizeBytes());
|
||||||
if (config == none) {
|
if (config == none) {
|
||||||
std::cerr << "Could not load config file. Did you enter the correct password?" << std::endl;
|
std::cerr << "Could not load config file. Did you enter the correct password?" << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -205,17 +205,17 @@ namespace cryfs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<CryConfigFile> Cli::_loadOrCreateConfigFile(const bf::path &configFilePath, const optional<string> &cipher) {
|
optional<CryConfigFile> Cli::_loadOrCreateConfigFile(const bf::path &configFilePath, const optional<string> &cipher, const optional<uint32_t> &blocksizeBytes) {
|
||||||
if (_noninteractive) {
|
if (_noninteractive) {
|
||||||
return CryConfigLoader(_console, _keyGenerator, _scryptSettings,
|
return CryConfigLoader(_console, _keyGenerator, _scryptSettings,
|
||||||
&Cli::_askPasswordNoninteractive,
|
&Cli::_askPasswordNoninteractive,
|
||||||
&Cli::_askPasswordNoninteractive,
|
&Cli::_askPasswordNoninteractive,
|
||||||
cipher, _noninteractive).loadOrCreate(configFilePath);
|
cipher, blocksizeBytes, _noninteractive).loadOrCreate(configFilePath);
|
||||||
} else {
|
} else {
|
||||||
return CryConfigLoader(_console, _keyGenerator, _scryptSettings,
|
return CryConfigLoader(_console, _keyGenerator, _scryptSettings,
|
||||||
&Cli::_askPasswordForExistingFilesystem,
|
&Cli::_askPasswordForExistingFilesystem,
|
||||||
&Cli::_askPasswordForNewFilesystem,
|
&Cli::_askPasswordForNewFilesystem,
|
||||||
cipher, _noninteractive).loadOrCreate(configFilePath);
|
cipher, blocksizeBytes, _noninteractive).loadOrCreate(configFilePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ namespace cryfs {
|
|||||||
void _checkForUpdates();
|
void _checkForUpdates();
|
||||||
void _runFilesystem(const program_options::ProgramOptions &options);
|
void _runFilesystem(const program_options::ProgramOptions &options);
|
||||||
CryConfigFile _loadOrCreateConfig(const program_options::ProgramOptions &options);
|
CryConfigFile _loadOrCreateConfig(const program_options::ProgramOptions &options);
|
||||||
boost::optional<CryConfigFile> _loadOrCreateConfigFile(const boost::filesystem::path &configFilePath, const boost::optional<std::string> &cipher);
|
boost::optional<CryConfigFile> _loadOrCreateConfigFile(const boost::filesystem::path &configFilePath, const boost::optional<std::string> &cipher, const boost::optional<uint32_t> &blocksizeBytes);
|
||||||
boost::filesystem::path _determineConfigFile(const program_options::ProgramOptions &options);
|
boost::filesystem::path _determineConfigFile(const program_options::ProgramOptions &options);
|
||||||
static std::string _askPasswordForExistingFilesystem();
|
static std::string _askPasswordForExistingFilesystem();
|
||||||
static std::string _askPasswordForNewFilesystem();
|
static std::string _askPasswordForNewFilesystem();
|
||||||
|
@ -62,8 +62,12 @@ ProgramOptions Parser::parse(const vector<string> &supportedCiphers) const {
|
|||||||
cipher = vm["cipher"].as<string>();
|
cipher = vm["cipher"].as<string>();
|
||||||
_checkValidCipher(*cipher, supportedCiphers);
|
_checkValidCipher(*cipher, supportedCiphers);
|
||||||
}
|
}
|
||||||
|
optional<uint32_t> blocksizeBytes = none;
|
||||||
|
if (vm.count("blocksize-bytes")) {
|
||||||
|
blocksizeBytes = vm["blocksize-bytes"].as<uint32_t>();
|
||||||
|
}
|
||||||
|
|
||||||
return ProgramOptions(baseDir, mountDir, configfile, foreground, unmountAfterIdleMinutes, logfile, cipher, options.second);
|
return ProgramOptions(baseDir, mountDir, configfile, foreground, unmountAfterIdleMinutes, logfile, cipher, blocksizeBytes, options.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Parser::_checkValidCipher(const string &cipher, const vector<string> &supportedCiphers) {
|
void Parser::_checkValidCipher(const string &cipher, const vector<string> &supportedCiphers) {
|
||||||
@ -108,7 +112,8 @@ void Parser::_addAllowedOptions(po::options_description *desc) {
|
|||||||
("help,h", "show help message")
|
("help,h", "show help message")
|
||||||
("config,c", po::value<string>(), "Configuration file")
|
("config,c", po::value<string>(), "Configuration file")
|
||||||
("foreground,f", "Run CryFS in foreground.")
|
("foreground,f", "Run CryFS in foreground.")
|
||||||
("cipher", po::value<string>(), "Cipher to use for encryption. See possible values by calling cryfs with --show-ciphers")
|
("cipher", po::value<string>(), "Cipher to use for encryption. See possible values by calling cryfs with --show-ciphers.")
|
||||||
|
("blocksize-bytes", po::value<uint32_t>(), "The block size used when storing ciphertext blocks (in bytes).")
|
||||||
("show-ciphers", "Show list of supported ciphers.")
|
("show-ciphers", "Show list of supported ciphers.")
|
||||||
("unmount-idle", po::value<double>(), "Automatically unmount after specified number of idle minutes.")
|
("unmount-idle", po::value<double>(), "Automatically unmount after specified number of idle minutes.")
|
||||||
("logfile", po::value<string>(), "Specify the file to write log messages to. If this is not specified, log messages will go to stdout, or syslog if CryFS is running in the background.")
|
("logfile", po::value<string>(), "Specify the file to write log messages to. If this is not specified, log messages will go to stdout, or syslog if CryFS is running in the background.")
|
||||||
|
@ -11,9 +11,11 @@ namespace bf = boost::filesystem;
|
|||||||
ProgramOptions::ProgramOptions(const bf::path &baseDir, const bf::path &mountDir, const optional<bf::path> &configFile,
|
ProgramOptions::ProgramOptions(const bf::path &baseDir, const bf::path &mountDir, const optional<bf::path> &configFile,
|
||||||
bool foreground, const optional<double> &unmountAfterIdleMinutes,
|
bool foreground, const optional<double> &unmountAfterIdleMinutes,
|
||||||
const optional<bf::path> &logFile, const optional<string> &cipher,
|
const optional<bf::path> &logFile, const optional<string> &cipher,
|
||||||
|
const optional<uint32_t> &blocksizeBytes,
|
||||||
const vector<char*> &fuseOptions)
|
const vector<char*> &fuseOptions)
|
||||||
:_baseDir(baseDir), _mountDir(nullptr), _configFile(configFile), _foreground(foreground),
|
:_baseDir(baseDir), _mountDir(nullptr), _configFile(configFile), _foreground(foreground),
|
||||||
_cipher(cipher), _unmountAfterIdleMinutes(unmountAfterIdleMinutes), _logFile(logFile), _fuseOptions(fuseOptions) {
|
_cipher(cipher), _blocksizeBytes(blocksizeBytes), _unmountAfterIdleMinutes(unmountAfterIdleMinutes),
|
||||||
|
_logFile(logFile), _fuseOptions(fuseOptions) {
|
||||||
|
|
||||||
string mountDirStr = mountDir.native();
|
string mountDirStr = mountDir.native();
|
||||||
_mountDir = new char[mountDirStr.size()+1];
|
_mountDir = new char[mountDirStr.size()+1];
|
||||||
@ -65,6 +67,10 @@ const optional<string> &ProgramOptions::cipher() const {
|
|||||||
return _cipher;
|
return _cipher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const optional<uint32_t> &ProgramOptions::blocksizeBytes() const {
|
||||||
|
return _blocksizeBytes;
|
||||||
|
}
|
||||||
|
|
||||||
const vector<char *> &ProgramOptions::fuseOptions() const {
|
const vector<char *> &ProgramOptions::fuseOptions() const {
|
||||||
return _fuseOptions;
|
return _fuseOptions;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ namespace cryfs {
|
|||||||
bool foreground, const boost::optional<double> &unmountAfterIdleMinutes,
|
bool foreground, const boost::optional<double> &unmountAfterIdleMinutes,
|
||||||
const boost::optional<boost::filesystem::path> &logFile,
|
const boost::optional<boost::filesystem::path> &logFile,
|
||||||
const boost::optional<std::string> &cipher,
|
const boost::optional<std::string> &cipher,
|
||||||
|
const boost::optional<uint32_t> &blocksizeBytes,
|
||||||
const std::vector<char *> &fuseOptions);
|
const std::vector<char *> &fuseOptions);
|
||||||
ProgramOptions(ProgramOptions &&rhs);
|
ProgramOptions(ProgramOptions &&rhs);
|
||||||
~ProgramOptions();
|
~ProgramOptions();
|
||||||
@ -26,6 +27,7 @@ namespace cryfs {
|
|||||||
const boost::optional<boost::filesystem::path> &configFile() const;
|
const boost::optional<boost::filesystem::path> &configFile() const;
|
||||||
bool foreground() const;
|
bool foreground() const;
|
||||||
const boost::optional<std::string> &cipher() const;
|
const boost::optional<std::string> &cipher() const;
|
||||||
|
const boost::optional<uint32_t> &blocksizeBytes() const;
|
||||||
const boost::optional<double> &unmountAfterIdleMinutes() const;
|
const boost::optional<double> &unmountAfterIdleMinutes() const;
|
||||||
const boost::optional<boost::filesystem::path> &logFile() const;
|
const boost::optional<boost::filesystem::path> &logFile() const;
|
||||||
const std::vector<char *> &fuseOptions() const;
|
const std::vector<char *> &fuseOptions() const;
|
||||||
@ -36,6 +38,7 @@ namespace cryfs {
|
|||||||
boost::optional<boost::filesystem::path> _configFile;
|
boost::optional<boost::filesystem::path> _configFile;
|
||||||
bool _foreground;
|
bool _foreground;
|
||||||
boost::optional<std::string> _cipher;
|
boost::optional<std::string> _cipher;
|
||||||
|
boost::optional<uint32_t> _blocksizeBytes;
|
||||||
boost::optional<double> _unmountAfterIdleMinutes;
|
boost::optional<double> _unmountAfterIdleMinutes;
|
||||||
boost::optional<boost::filesystem::path> _logFile;
|
boost::optional<boost::filesystem::path> _logFile;
|
||||||
std::vector<char *> _fuseOptions;
|
std::vector<char *> _fuseOptions;
|
||||||
|
@ -17,18 +17,23 @@ namespace cryfs {
|
|||||||
:_console(console), _configConsole(console, noninteractive), _encryptionKeyGenerator(encryptionKeyGenerator) {
|
:_console(console), _configConsole(console, noninteractive), _encryptionKeyGenerator(encryptionKeyGenerator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CryConfig CryConfigCreator::create(const optional<string> &cipherFromCommandLine) {
|
CryConfig CryConfigCreator::create(const optional<string> &cipherFromCommandLine, const optional<uint32_t> &blocksizeBytesFromCommandLine) {
|
||||||
CryConfig config;
|
CryConfig config;
|
||||||
config.SetCipher(_generateCipher(cipherFromCommandLine));
|
config.SetCipher(_generateCipher(cipherFromCommandLine));
|
||||||
config.SetVersion(gitversion::VersionString());
|
config.SetVersion(gitversion::VersionString());
|
||||||
config.SetBlocksizeBytes(_generateBlocksizeBytes());
|
config.SetBlocksizeBytes(_generateBlocksizeBytes(blocksizeBytesFromCommandLine));
|
||||||
config.SetRootBlob(_generateRootBlobKey());
|
config.SetRootBlob(_generateRootBlobKey());
|
||||||
config.SetEncryptionKey(_generateEncKey(config.Cipher()));
|
config.SetEncryptionKey(_generateEncKey(config.Cipher()));
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t CryConfigCreator::_generateBlocksizeBytes() {
|
uint32_t CryConfigCreator::_generateBlocksizeBytes(const optional<uint32_t> &blocksizeBytesFromCommandLine) {
|
||||||
return _configConsole.askBlocksizeBytes();
|
if (blocksizeBytesFromCommandLine != none) {
|
||||||
|
// TODO Check block size is valid (i.e. large enough)
|
||||||
|
return *blocksizeBytesFromCommandLine;
|
||||||
|
} else {
|
||||||
|
return _configConsole.askBlocksizeBytes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string CryConfigCreator::_generateCipher(const optional<string> &cipherFromCommandLine) {
|
string CryConfigCreator::_generateCipher(const optional<string> &cipherFromCommandLine) {
|
||||||
|
@ -14,12 +14,12 @@ namespace cryfs {
|
|||||||
CryConfigCreator(std::shared_ptr<cpputils::Console> console, cpputils::RandomGenerator &encryptionKeyGenerator, bool noninteractive);
|
CryConfigCreator(std::shared_ptr<cpputils::Console> console, cpputils::RandomGenerator &encryptionKeyGenerator, bool noninteractive);
|
||||||
CryConfigCreator(CryConfigCreator &&rhs) = default;
|
CryConfigCreator(CryConfigCreator &&rhs) = default;
|
||||||
|
|
||||||
CryConfig create(const boost::optional<std::string> &cipherFromCommandLine);
|
CryConfig create(const boost::optional<std::string> &cipherFromCommandLine, const boost::optional<uint32_t> &blocksizeBytesFromCommandLine);
|
||||||
private:
|
private:
|
||||||
std::string _generateCipher(const boost::optional<std::string> &cipherFromCommandLine);
|
std::string _generateCipher(const boost::optional<std::string> &cipherFromCommandLine);
|
||||||
std::string _generateEncKey(const std::string &cipher);
|
std::string _generateEncKey(const std::string &cipher);
|
||||||
std::string _generateRootBlobKey();
|
std::string _generateRootBlobKey();
|
||||||
uint32_t _generateBlocksizeBytes();
|
uint32_t _generateBlocksizeBytes(const boost::optional<uint32_t> &blocksizeBytesFromCommandLine);
|
||||||
|
|
||||||
std::shared_ptr<cpputils::Console> _console;
|
std::shared_ptr<cpputils::Console> _console;
|
||||||
CryConfigConsole _configConsole;
|
CryConfigConsole _configConsole;
|
||||||
|
@ -25,10 +25,10 @@ using namespace cpputils::logging;
|
|||||||
|
|
||||||
namespace cryfs {
|
namespace cryfs {
|
||||||
|
|
||||||
CryConfigLoader::CryConfigLoader(shared_ptr<Console> console, RandomGenerator &keyGenerator, const SCryptSettings &scryptSettings, function<string()> askPasswordForExistingFilesystem, function<string()> askPasswordForNewFilesystem, const optional<string> &cipherFromCommandLine, bool noninteractive)
|
CryConfigLoader::CryConfigLoader(shared_ptr<Console> console, RandomGenerator &keyGenerator, const SCryptSettings &scryptSettings, function<string()> askPasswordForExistingFilesystem, function<string()> askPasswordForNewFilesystem, const optional<string> &cipherFromCommandLine, const boost::optional<uint32_t> &blocksizeBytesFromCommandLine, bool noninteractive)
|
||||||
: _creator(std::move(console), keyGenerator, noninteractive), _scryptSettings(scryptSettings),
|
: _creator(std::move(console), keyGenerator, noninteractive), _scryptSettings(scryptSettings),
|
||||||
_askPasswordForExistingFilesystem(askPasswordForExistingFilesystem), _askPasswordForNewFilesystem(askPasswordForNewFilesystem),
|
_askPasswordForExistingFilesystem(askPasswordForExistingFilesystem), _askPasswordForNewFilesystem(askPasswordForNewFilesystem),
|
||||||
_cipherFromCommandLine(cipherFromCommandLine) {
|
_cipherFromCommandLine(cipherFromCommandLine), _blocksizeBytesFromCommandLine(blocksizeBytesFromCommandLine) {
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<CryConfigFile> CryConfigLoader::_loadConfig(const bf::path &filename) {
|
optional<CryConfigFile> CryConfigLoader::_loadConfig(const bf::path &filename) {
|
||||||
@ -66,7 +66,7 @@ optional<CryConfigFile> CryConfigLoader::loadOrCreate(const bf::path &filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CryConfigFile CryConfigLoader::_createConfig(const bf::path &filename) {
|
CryConfigFile CryConfigLoader::_createConfig(const bf::path &filename) {
|
||||||
auto config = _creator.create(_cipherFromCommandLine);
|
auto config = _creator.create(_cipherFromCommandLine, _blocksizeBytesFromCommandLine);
|
||||||
//TODO Ask confirmation if using insecure password (<8 characters)
|
//TODO Ask confirmation if using insecure password (<8 characters)
|
||||||
string password = _askPasswordForNewFilesystem();
|
string password = _askPasswordForNewFilesystem();
|
||||||
std::cout << "Creating config file (this can take some time)..." << std::flush;
|
std::cout << "Creating config file (this can take some time)..." << std::flush;
|
||||||
|
@ -13,7 +13,7 @@ namespace cryfs {
|
|||||||
|
|
||||||
class CryConfigLoader final {
|
class CryConfigLoader final {
|
||||||
public:
|
public:
|
||||||
CryConfigLoader(std::shared_ptr<cpputils::Console> console, cpputils::RandomGenerator &keyGenerator, const cpputils::SCryptSettings &scryptSettings, std::function<std::string()> askPasswordForExistingFilesystem, std::function<std::string()> askPasswordForNewFilesystem, const boost::optional<std::string> &cipherFromCommandLine, bool noninteractive);
|
CryConfigLoader(std::shared_ptr<cpputils::Console> console, cpputils::RandomGenerator &keyGenerator, const cpputils::SCryptSettings &scryptSettings, std::function<std::string()> askPasswordForExistingFilesystem, std::function<std::string()> askPasswordForNewFilesystem, const boost::optional<std::string> &cipherFromCommandLine, const boost::optional<uint32_t> &blocksizeBytesFromCommandLine, bool noninteractive);
|
||||||
CryConfigLoader(CryConfigLoader &&rhs) = default;
|
CryConfigLoader(CryConfigLoader &&rhs) = default;
|
||||||
|
|
||||||
boost::optional<CryConfigFile> loadOrCreate(const boost::filesystem::path &filename);
|
boost::optional<CryConfigFile> loadOrCreate(const boost::filesystem::path &filename);
|
||||||
@ -29,6 +29,7 @@ private:
|
|||||||
std::function<std::string()> _askPasswordForExistingFilesystem;
|
std::function<std::string()> _askPasswordForExistingFilesystem;
|
||||||
std::function<std::string()> _askPasswordForNewFilesystem;
|
std::function<std::string()> _askPasswordForNewFilesystem;
|
||||||
boost::optional<std::string> _cipherFromCommandLine;
|
boost::optional<std::string> _cipherFromCommandLine;
|
||||||
|
boost::optional<uint32_t> _blocksizeBytesFromCommandLine;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CryConfigLoader);
|
DISALLOW_COPY_AND_ASSIGN(CryConfigLoader);
|
||||||
};
|
};
|
||||||
|
@ -23,73 +23,83 @@ namespace boost {
|
|||||||
class ProgramOptionsTest: public ProgramOptionsTestBase {};
|
class ProgramOptionsTest: public ProgramOptionsTestBase {};
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, BaseDir) {
|
TEST_F(ProgramOptionsTest, BaseDir) {
|
||||||
ProgramOptions testobj("/home/user/mydir", "", none, false, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("/home/user/mydir", "", none, false, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ("/home/user/mydir", testobj.baseDir());
|
EXPECT_EQ("/home/user/mydir", testobj.baseDir());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, MountDir) {
|
TEST_F(ProgramOptionsTest, MountDir) {
|
||||||
ProgramOptions testobj("", "/home/user/mydir", none, false, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "/home/user/mydir", none, false, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ("/home/user/mydir", testobj.mountDir());
|
EXPECT_EQ("/home/user/mydir", testobj.mountDir());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, ConfigfileNone) {
|
TEST_F(ProgramOptionsTest, ConfigfileNone) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ(none, testobj.configFile());
|
EXPECT_EQ(none, testobj.configFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, ConfigfileSome) {
|
TEST_F(ProgramOptionsTest, ConfigfileSome) {
|
||||||
ProgramOptions testobj("", "", bf::path("/home/user/configfile"), true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", bf::path("/home/user/configfile"), true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ("/home/user/configfile", testobj.configFile().get());
|
EXPECT_EQ("/home/user/configfile", testobj.configFile().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, ForegroundFalse) {
|
TEST_F(ProgramOptionsTest, ForegroundFalse) {
|
||||||
ProgramOptions testobj("", "", none, false, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, false, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_FALSE(testobj.foreground());
|
EXPECT_FALSE(testobj.foreground());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, ForegroundTrue) {
|
TEST_F(ProgramOptionsTest, ForegroundTrue) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_TRUE(testobj.foreground());
|
EXPECT_TRUE(testobj.foreground());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, LogfileNone) {
|
TEST_F(ProgramOptionsTest, LogfileNone) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ(none, testobj.logFile());
|
EXPECT_EQ(none, testobj.logFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, LogfileSome) {
|
TEST_F(ProgramOptionsTest, LogfileSome) {
|
||||||
ProgramOptions testobj("", "", none, true, none, bf::path("logfile"), none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, bf::path("logfile"), none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ("logfile", testobj.logFile().get());
|
EXPECT_EQ("logfile", testobj.logFile().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, UnmountAfterIdleMinutesNone) {
|
TEST_F(ProgramOptionsTest, UnmountAfterIdleMinutesNone) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ(none, testobj.unmountAfterIdleMinutes());
|
EXPECT_EQ(none, testobj.unmountAfterIdleMinutes());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, UnmountAfterIdleMinutesSome) {
|
TEST_F(ProgramOptionsTest, UnmountAfterIdleMinutesSome) {
|
||||||
ProgramOptions testobj("", "", none, true, 10, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, 10, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ(10, testobj.unmountAfterIdleMinutes().get());
|
EXPECT_EQ(10, testobj.unmountAfterIdleMinutes().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, CipherNone) {
|
TEST_F(ProgramOptionsTest, CipherNone) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ(none, testobj.cipher());
|
EXPECT_EQ(none, testobj.cipher());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, CipherSome) {
|
TEST_F(ProgramOptionsTest, CipherSome) {
|
||||||
ProgramOptions testobj("", "", none, true, none, none, string("aes-256-gcm"), options({"./myExecutable"}));
|
ProgramOptions testobj("", "", none, true, none, none, string("aes-256-gcm"), none, options({"./myExecutable"}));
|
||||||
EXPECT_EQ("aes-256-gcm", testobj.cipher().get());
|
EXPECT_EQ("aes-256-gcm", testobj.cipher().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ProgramOptionsTest, BlocksizeBytesNone) {
|
||||||
|
ProgramOptions testobj("", "", none, true, none, none, none, none, options({"./myExecutable"}));
|
||||||
|
EXPECT_EQ(none, testobj.blocksizeBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ProgramOptionsTest, BlocksizeSome) {
|
||||||
|
ProgramOptions testobj("", "", none, true, none, none, none, 10*1024, options({"./myExecutable"}));
|
||||||
|
EXPECT_EQ(10*1024u, testobj.blocksizeBytes().get());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, EmptyFuseOptions) {
|
TEST_F(ProgramOptionsTest, EmptyFuseOptions) {
|
||||||
ProgramOptions testobj("/rootDir", "/home/user/mydir", none, false, none, none, none, options({"./myExecutable"}));
|
ProgramOptions testobj("/rootDir", "/home/user/mydir", none, false, none, none, none, none, options({"./myExecutable"}));
|
||||||
//Fuse should have the mount dir as first parameter
|
//Fuse should have the mount dir as first parameter
|
||||||
EXPECT_VECTOR_EQ({"./myExecutable", "/home/user/mydir"}, testobj.fuseOptions());
|
EXPECT_VECTOR_EQ({"./myExecutable", "/home/user/mydir"}, testobj.fuseOptions());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ProgramOptionsTest, SomeFuseOptions) {
|
TEST_F(ProgramOptionsTest, SomeFuseOptions) {
|
||||||
ProgramOptions testobj("/rootDir", "/home/user/mydir", none, false, none, none, none, options({"./myExecutable", "-f", "--longoption"}));
|
ProgramOptions testobj("/rootDir", "/home/user/mydir", none, false, none, none, none, none, options({"./myExecutable", "-f", "--longoption"}));
|
||||||
//Fuse should have the mount dir as first parameter
|
//Fuse should have the mount dir as first parameter
|
||||||
EXPECT_VECTOR_EQ({"./myExecutable", "/home/user/mydir", "-f", "--longoption"}, testobj.fuseOptions());
|
EXPECT_VECTOR_EQ({"./myExecutable", "/home/user/mydir", "-f", "--longoption"}, testobj.fuseOptions());
|
||||||
}
|
}
|
||||||
|
@ -62,72 +62,82 @@ public:
|
|||||||
TEST_F(CryConfigCreatorTest, DoesAskForCipherIfNotSpecified) {
|
TEST_F(CryConfigCreatorTest, DoesAskForCipherIfNotSpecified) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseAnyCipher());
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseAnyCipher());
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfSpecified) {
|
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfSpecified) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
||||||
CryConfig config = creator.create(string("aes-256-gcm"));
|
CryConfig config = creator.create(string("aes-256-gcm"), none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfUsingDefaultSettings) {
|
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfUsingDefaultSettings) {
|
||||||
AnswerYesToDefaultSettings();
|
AnswerYesToDefaultSettings();
|
||||||
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfNoninteractive) {
|
TEST_F(CryConfigCreatorTest, DoesNotAskForCipherIfNoninteractive) {
|
||||||
EXPECT_DOES_NOT_ASK_TO_USE_DEFAULT_SETTINGS();
|
EXPECT_DOES_NOT_ASK_TO_USE_DEFAULT_SETTINGS();
|
||||||
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
||||||
CryConfig config = noninteractiveCreator.create(none);
|
CryConfig config = noninteractiveCreator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesAskForBlocksizeIfNotSpecified) {
|
TEST_F(CryConfigCreatorTest, DoesAskForBlocksizeIfNotSpecified) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_ASK_FOR_BLOCKSIZE().WillOnce(Return(1));
|
EXPECT_ASK_FOR_BLOCKSIZE().WillOnce(Return(1));
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO DoesNotAskForCipherIfSpecified
|
TEST_F(CryConfigCreatorTest, DoesNotAskForBlocksizeIfSpecified) {
|
||||||
|
AnswerNoToDefaultSettings();
|
||||||
|
EXPECT_DOES_NOT_ASK_FOR_BLOCKSIZE();
|
||||||
|
CryConfig config = creator.create(none, 10*1024u);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesNotAskForBlocksizeIfNoninteractive) {
|
TEST_F(CryConfigCreatorTest, DoesNotAskForBlocksizeIfNoninteractive) {
|
||||||
EXPECT_DOES_NOT_ASK_TO_USE_DEFAULT_SETTINGS();
|
EXPECT_DOES_NOT_ASK_TO_USE_DEFAULT_SETTINGS();
|
||||||
EXPECT_DOES_NOT_ASK_FOR_BLOCKSIZE();
|
EXPECT_DOES_NOT_ASK_FOR_BLOCKSIZE();
|
||||||
CryConfig config = noninteractiveCreator.create(none);
|
CryConfig config = noninteractiveCreator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, DoesNotAskForBlocksizeIfUsingDefaultSettings) {
|
TEST_F(CryConfigCreatorTest, DoesNotAskForBlocksizeIfUsingDefaultSettings) {
|
||||||
AnswerYesToDefaultSettings();
|
AnswerYesToDefaultSettings();
|
||||||
EXPECT_DOES_NOT_ASK_FOR_BLOCKSIZE();
|
EXPECT_DOES_NOT_ASK_FOR_BLOCKSIZE();
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, ChoosesEmptyRootBlobId) {
|
TEST_F(CryConfigCreatorTest, ChoosesEmptyRootBlobId) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
EXPECT_EQ("", config.RootBlob()); // This tells CryFS to create a new root blob
|
EXPECT_EQ("", config.RootBlob()); // This tells CryFS to create a new root blob
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_448) {
|
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_448) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("mars-448-gcm"));
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("mars-448-gcm"));
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
cpputils::Mars448_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
cpputils::Mars448_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_256) {
|
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_256) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("aes-256-gcm"));
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("aes-256-gcm"));
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
cpputils::AES256_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
cpputils::AES256_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_128) {
|
TEST_F(CryConfigCreatorTest, ChoosesValidEncryptionKey_128) {
|
||||||
AnswerNoToDefaultSettings();
|
AnswerNoToDefaultSettings();
|
||||||
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("aes-128-gcm"));
|
EXPECT_ASK_FOR_CIPHER().WillOnce(ChooseCipher("aes-128-gcm"));
|
||||||
CryConfig config = creator.create(none);
|
CryConfig config = creator.create(none, none);
|
||||||
cpputils::AES128_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
cpputils::AES128_GCM::EncryptionKey::FromString(config.EncryptionKey()); // This crashes if invalid
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(CryConfigCreatorTest, DoesNotAskForAnythingIfEverythingIsSpecified) {
|
||||||
|
EXPECT_DOES_NOT_ASK_TO_USE_DEFAULT_SETTINGS();
|
||||||
|
EXPECT_DOES_NOT_ASK_FOR_CIPHER();
|
||||||
|
CryConfig config = noninteractiveCreator.create(string("aes-256-gcm"), 10*1024u);
|
||||||
|
}
|
||||||
|
|
||||||
//TODO Add test cases ensuring that the values entered are correctly taken
|
//TODO Add test cases ensuring that the values entered are correctly taken
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
|
|
||||||
CryConfigLoader loader(const string &password, bool noninteractive, const optional<string> &cipher = none) {
|
CryConfigLoader loader(const string &password, bool noninteractive, const optional<string> &cipher = none) {
|
||||||
auto askPassword = [password] { return password;};
|
auto askPassword = [password] { return password;};
|
||||||
return CryConfigLoader(mockConsole(), cpputils::Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, cipher, noninteractive);
|
return CryConfigLoader(mockConsole(), cpputils::Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, cipher, none, noninteractive);
|
||||||
}
|
}
|
||||||
|
|
||||||
CryConfigFile Create(const string &password = "mypassword", const optional<string> &cipher = none, bool noninteractive = false) {
|
CryConfigFile Create(const string &password = "mypassword", const optional<string> &cipher = none, bool noninteractive = false) {
|
||||||
|
@ -37,7 +37,7 @@ public:
|
|||||||
|
|
||||||
CryConfigFile loadOrCreateConfig() {
|
CryConfigFile loadOrCreateConfig() {
|
||||||
auto askPassword = [] {return "mypassword";};
|
auto askPassword = [] {return "mypassword";};
|
||||||
return CryConfigLoader(mockConsole(), Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, none, true).loadOrCreate(config.path()).value();
|
return CryConfigLoader(mockConsole(), Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, none, none, true).loadOrCreate(config.path()).value();
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ref<OnDiskBlockStore> blockStore() {
|
unique_ref<OnDiskBlockStore> blockStore() {
|
||||||
|
@ -28,7 +28,7 @@ public:
|
|||||||
unique_ref<Device> createDevice() override {
|
unique_ref<Device> createDevice() override {
|
||||||
auto blockStore = cpputils::make_unique_ref<FakeBlockStore>();
|
auto blockStore = cpputils::make_unique_ref<FakeBlockStore>();
|
||||||
auto askPassword = [] {return "mypassword";};
|
auto askPassword = [] {return "mypassword";};
|
||||||
auto config = CryConfigLoader(mockConsole(), Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, none, true)
|
auto config = CryConfigLoader(mockConsole(), Random::PseudoRandom(), SCrypt::TestSettings, askPassword, askPassword, none, none, true)
|
||||||
.loadOrCreate(configFile.path()).value();
|
.loadOrCreate(configFile.path()).value();
|
||||||
return make_unique_ref<CryDevice>(std::move(config), std::move(blockStore));
|
return make_unique_ref<CryDevice>(std::move(config), std::move(blockStore));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user