/** This code is licensed under the MCGSI Public License Copyright 2018 Jeff Becker Kovri go write your own code */ #ifndef LIBI2PD_CHACHA20_H #define LIBI2PD_CHACHA20_H #include #include #include #include #include "Crypto.h" #if LEGACY_OPENSSL namespace i2p { namespace crypto { const std::size_t CHACHA20_KEY_BYTES = 32; const std::size_t CHACHA20_NOUNCE_BYTES = 12; namespace chacha { constexpr std::size_t blocksize = 64; constexpr int rounds = 20; struct Chacha20State; struct Chacha20Block { Chacha20Block () {}; Chacha20Block (Chacha20Block &&) = delete; uint8_t data[blocksize]; void operator << (const Chacha20State & st); }; struct Chacha20State { Chacha20State (): offset (0) {}; Chacha20State (Chacha20State &&) = delete; Chacha20State & operator += (const Chacha20State & other) { for(int i = 0; i < 16; i++) data[i] += other.data[i]; return *this; } void Copy(const Chacha20State & other) { memcpy(data, other.data, sizeof(uint32_t) * 16); } uint32_t data[16]; Chacha20Block block; size_t offset; }; void Chacha20Init (Chacha20State& state, const uint8_t * nonce, const uint8_t * key, uint32_t counter); void Chacha20Encrypt (Chacha20State& state, uint8_t * buf, size_t sz); } /** encrypt buf in place with chacha20 */ void chacha20(uint8_t * buf, size_t sz, const uint8_t * nonce, const uint8_t * key, uint32_t counter=1); } } #endif #endif