diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/DatabaseStorage.cpp | 2 | ||||
-rw-r--r-- | src/Encryption.cpp | 30 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/DatabaseStorage.cpp b/src/DatabaseStorage.cpp index 2028c63..62a2e77 100644 --- a/src/DatabaseStorage.cpp +++ b/src/DatabaseStorage.cpp @@ -27,7 +27,7 @@ namespace odhtdb { string errMsg = "Database storage with key "; errMsg += key.hashedKey.toString(); - errMsg += " not found"; + errMsg += " not found. Storage for a key needs to be created before data can be appended to it"; throw DatabaseStorageNotFound(errMsg); } it->second->objects.push_back({data, timestamp, creatorPublicKey}); diff --git a/src/Encryption.cpp b/src/Encryption.cpp new file mode 100644 index 0000000..8e87a8d --- /dev/null +++ b/src/Encryption.cpp @@ -0,0 +1,30 @@ +#include "../include/Encryption.hpp" +#include <sodium/crypto_stream_xchacha20.h> +#include <sodium/randombytes.h> +#include <string> + +namespace odhtdb +{ + void generateEncryptionKey(EncryptionKey *output) + { + if(!output) return; + crypto_stream_xchacha20_keygen((unsigned char*)output); + } + + int encrypt(EncryptedData *output, const EncryptionKey *key, const void *data, size_t dataSize) + { + if(!output || !key) return -1; + if(dataSize == 0) return 0; + output->data.resize(dataSize); + randombytes_buf(output->nonce, NONCE_BYTE_SIZE); + return crypto_stream_xchacha20_xor((unsigned char*)&output->data[0], (const unsigned char*)data, dataSize, (const unsigned char*)output->nonce, (const unsigned char*)key); + } + + int decrypt(std::string *output, const EncryptionKey *key, const EncryptedData *encryptedData) + { + if(!encryptedData || !key || !output) return -1; + if(encryptedData->data.empty()) return 0; + output->resize(encryptedData->data.size()); + return crypto_stream_xchacha20_xor((unsigned char*)&(*output)[0], (const unsigned char*)&encryptedData->data[0], encryptedData->data.size(), (const unsigned char*)encryptedData->nonce, (const unsigned char*)key); + } +} |