// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include "base/bytes.h" namespace Storage { constexpr auto kSaltSize = size_type(64); class CtrState { public: static constexpr auto kBlockSize = size_type(16); static constexpr auto kKeySize = size_type(32); static constexpr auto kIvSize = kBlockSize; CtrState(bytes::const_span key, bytes::const_span iv); void encrypt(bytes::span data, int64 offset); void decrypt(bytes::span data, int64 offset); private: template void process(bytes::span data, int64 offset, Method method); bytes::array incrementedIv(int64 blockIndex); static constexpr auto EcountSize = kBlockSize; bytes::array _key; bytes::array _iv; }; class EncryptionKey { public: static constexpr auto kSize = size_type(256); static constexpr auto kSize_v2 = size_type(64); EncryptionKey() = default; explicit EncryptionKey(bytes::vector &&data); bool empty() const; explicit operator bool() const; const bytes::vector &data() const; CtrState prepareCtrState(bytes::const_span salt) const; private: bytes::vector _data; }; } // namespace Storage