GCrypt/GCryptLib/src/Key.cpp

76 lines
1.6 KiB
C++
Raw Normal View History

2022-05-22 13:43:23 +02:00
#include "GCrypt/Key.h"
#include "GCrypt/GHash.h"
#include "GCrypt/Util.h"
2022-05-22 17:24:56 +02:00
#include <random>
#include <cassert>
2022-05-22 17:54:26 +02:00
#include <sstream>
#include <fstream>
2022-05-22 13:43:23 +02:00
namespace Leonetienne::GCrypt {
Key Key::FromPassword(const std::string& password) {
return GHash::HashString(password);
2022-05-22 13:43:23 +02:00
}
2022-05-22 17:24:56 +02:00
Key Key::Random() {
// Create our truly-random rng
std::random_device rng;
constexpr std::size_t bitsPerCall = sizeof(std::random_device::result_type) * 8;
// Create a new key, and assign 16 random values
Key key;
for (std::size_t i = 0; i < 16; i++) {
key[i] = rng();
2022-05-22 17:24:56 +02:00
}
// Return it
return key;
2022-05-22 17:24:56 +02:00
}
2022-05-22 17:54:26 +02:00
Key Key::LoadFromFile(const std::string& path) {
// Read this many chars
2022-05-26 04:40:23 +02:00
const std::size_t maxChars = Key::BLOCK_SIZE;
2022-05-22 17:54:26 +02:00
// Open ifilestream for keyfile
std::ifstream ifs(path, std::ios::in | std::ios::binary);
// Is the file open now? Or were there any issues...
if (!ifs.good()) {
throw std::runtime_error(std::string("Unable to open ifilestream for keyfile \"") + path + "\"! Aborting...");
}
// Create a new key, and zero it
Key key;
key.Reset();
2022-05-22 17:54:26 +02:00
// Read into it
ifs.read((char*)(void*)key.Data(), Key::BLOCK_SIZE);
2022-05-22 17:54:26 +02:00
// Return it
return key;
}
void Key::WriteToFile(const std::string& path) {
// Create an ofilestream
std::ofstream ofs(path, std::ios::out | std::ios::binary);
// Write the key
ofs.write((char*)(void*)Data(), Key::BLOCK_SIZE);
2022-05-22 17:54:26 +02:00
// Close the file handle
ofs.close();
return;
}
2022-05-22 13:43:23 +02:00
Key::Key() : Block() {
}
Key::Key(const Block& b) : Block(b) {
}
Key::Key(const Key& k) : Block(k) {
}
}