Added module PrepareKey

This commit is contained in:
Leonetienne 2022-05-26 21:56:15 +02:00
parent 8b9221e2e0
commit dddc2d16f6
No known key found for this signature in database
GPG Key ID: C33879CD92E9708C
3 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,26 @@
#ifndef GCRYPTCLI_MODULE_PREPAREKEY_H
#define GCRYPTCLI_MODULE_PREPAREKEY_H
#include <GCrypt/Key.h>
using namespace Leonetienne::GCrypt;
// This class has the task to supply the encryption key.
class ModulePrepareKey {
public:
//! Will prepare the key. Be it from cli, a file, or, random, or whatever.
static void PrepareKey();
//! Will return the key, if prepared.
static const Key& GetKey();
private:
//! Will ask for a password on stdin,
//! hiding the input.
static std::string PasswordPrompt();
static Key key;
};
#endif

View File

@ -0,0 +1,104 @@
#include "ModulePrepareKey.h"
#include "CommandlineInterface.h"
#include "Configuration.h"
#include <cstring>
#include <iostream>
// Required for hidden password input
#if defined _WIN32 || defined _WIN64
#include <Windows.h>
#elif defined __GNUG__
#include <termios.h>
#include <unistd.h>
#endif
void ModulePrepareKey::PrepareKey() {
// Special-case: We are hashing:
// no key needed.
if (Configuration::activeModule == Configuration::MODULE::HASH) {
return;
}
// Special-case: We are generating a keyfile:
// just take a random one
else if (Configuration::activeModule == Configuration::MODULE::GENERATE_KEYFILE) {
key = Key::Random();
return;
}
// Else:
// Is a password passed on the command line?
else if (CommandlineInterface::Get().HasParam("--key")) {
// Fetch it, and hash it to a key
std::string password = CommandlineInterface::Get()["--key"].GetString();
key = Key::FromPassword(password);
// Don't forget to zero string memory.
memset(password.data(), 0, password.size());
return;
}
// Should we prompt for a password on stdin?
else if (CommandlineInterface::Get().HasParam("--keyask")) {
// Create a password prompt
std::string password = PasswordPrompt();
key = Key::FromPassword(password);
// Don't forget to zero string memory.
memset(password.data(), 0, password.size());
return;
}
// Else:
// Should we read from a keyfile?
else if (CommandlineInterface::Get().HasParam("--keyfile")) {
// Fetch the filename, and read it
const std::string filepath = CommandlineInterface::Get()["--keyfile"].GetString();
key = Key::LoadFromFile(filepath);
return;
}
}
const Key& ModulePrepareKey::GetKey() {
return key;
}
std::string ModulePrepareKey::PasswordPrompt() {
// Disable stdin-echo
#if defined _WIN32 || defined _WIN64
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));
#elif defined __GNUG__
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
#endif
// Prompt stdin
std::string password;
std::cin >> password;
// Restore previous config
#if defined _WIN32 || defined _WIN64
SetConsoleMode(hStdin, mode);
#elif defined __GNUG__
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
#endif
return password;
}
Key ModulePrepareKey::key;

View File

@ -1,5 +1,7 @@
#include "CommandlineInterface.h"
#include "Configuration.h"
#include "ModulePrepareKey.h"
#include <iostream>
int main(int argc, char* const* argv) {
@ -9,6 +11,9 @@ int main(int argc, char* const* argv) {
// Parse configuration
Configuration::Parse();
// Prepare the key
ModulePrepareKey::PrepareKey();
return 0;
}