#pragma once #include "Cryptography.h" #include "Utils/ICapturedDataProvider.h" #include #include #include #include class Salsa20StreamContext { public: std::unique_ptr m_salsa20; std::unique_ptr m_sha1; }; class AbstractSalsa20Processor : public ICapturedDataProvider { public: virtual ~AbstractSalsa20Processor() = default; AbstractSalsa20Processor(const AbstractSalsa20Processor& other) = delete; AbstractSalsa20Processor(AbstractSalsa20Processor&& other) noexcept = default; AbstractSalsa20Processor& operator=(const AbstractSalsa20Processor& other) = delete; AbstractSalsa20Processor& operator=(AbstractSalsa20Processor&& other) noexcept = default; void GetCapturedData(const uint8_t** pCapturedData, size_t* pSize) override; protected: static constexpr auto BLOCK_HASHES_COUNT = 200u; static constexpr auto SHA1_HASH_SIZE = 20u; static constexpr auto SALSA20_IV_SIZE = 8u; AbstractSalsa20Processor(unsigned streamCount, const std::string& zoneName, const uint8_t* salsa20Key, size_t keySize); void InitStreams(const std::string& zoneName, const uint8_t* salsa20Key, size_t keySize); [[nodiscard]] uint8_t* GetHashBlock(unsigned streamNumber); unsigned m_stream_count; std::vector m_stream_contexts; // m_block_hashes[BLOCK_HASHES_COUNT][numStreams][SHA1_HASH_SIZE] std::vector m_block_hashes; std::vector m_stream_block_indices; };