diff --git a/Makefile b/Makefile index 73033ff6..a30b268c 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ OBJECTS = obj/CryptoConst.o obj/base64.o obj/NTCPSession.o obj/RouterInfo.o obj/ obj/TunnelGateway.o obj/TransitTunnel.o obj/I2NPProtocol.o obj/Log.o obj/Garlic.o \ obj/HTTPServer.o obj/Streaming.o obj/Identity.o obj/SSU.o obj/util.o obj/Reseed.o \ obj/UPnP.o obj/TunnelPool.o obj/HTTPProxy.o obj/AddressBook.o obj/Daemon.o \ - obj/DaemonLinux.o obj/SSUData.o obj/i2p.o + obj/DaemonLinux.o obj/SSUData.o obj/i2p.o obj/aes.o INCFLAGS = LDFLAGS = -Wl,-rpath,/usr/local/lib -lcryptopp -lboost_system -lboost_filesystem -lboost_regex -lboost_program_options -lpthread LIBS = diff --git a/aes.cpp b/aes.cpp new file mode 100644 index 00000000..5f791271 --- /dev/null +++ b/aes.cpp @@ -0,0 +1,30 @@ +#include "aes.h" + +namespace i2p +{ +namespace crypto +{ + void CBCEncryption::Encrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out) + { + for (int i = 0; i < numBlocks; i++) + { + m_LastBlock.ll[0] ^= in[i].ll[0]; + m_LastBlock.ll[1] ^= in[i].ll[1]; + m_ECBEncryption.ProcessData (m_LastBlock.buf, m_LastBlock.buf, 16); + out[i] = m_LastBlock; + } + } + + void CBCDecryption::Decrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out) + { + for (int i = 0; i < numBlocks; i++) + { + m_ECBDecryption.ProcessData (out[i].buf, in[i].buf, 16); + out[i].ll[0] ^= m_IV.ll[0]; + out[i].ll[1] ^= m_IV.ll[1]; + m_IV = in[i]; + } + } +} +} + diff --git a/aes.h b/aes.h new file mode 100644 index 00000000..3d71ebed --- /dev/null +++ b/aes.h @@ -0,0 +1,55 @@ +#ifndef AES_H__ +#define AES_H__ + +#include +#include +#include + +namespace i2p +{ +namespace crypto +{ + union ChipherBlock + { + uint8_t buf[16]; + uint64_t ll[2]; + }; + + class CBCEncryption + { + public: + + CBCEncryption () { memset (m_LastBlock.buf, 0, 16); }; + + void SetKey (uint8_t * key) { m_ECBEncryption.SetKey (key, 32); }; // 32 bytes + void SetIV (uint8_t * iv) { memcpy (m_LastBlock.buf, iv, 16); }; // 16 bytes + + void Encrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out); + + private: + + ChipherBlock m_LastBlock; + CryptoPP::ECB_Mode::Encryption m_ECBEncryption; + }; + + class CBCDecryption + { + public: + + CBCDecryption () { memset (m_IV.buf, 0, 16); }; + + void SetKey (uint8_t * key) { m_ECBDecryption.SetKey (key, 32); }; // 32 bytes + void SetIV (uint8_t * iv) { memcpy (m_IV.buf, iv, 16); }; // 16 bytes + + void Decrypt (int numBlocks, const ChipherBlock * in, ChipherBlock * out); + + private: + + ChipherBlock m_IV; + CryptoPP::ECB_Mode::Decryption m_ECBDecryption; + }; +} +} + +#endif +