From 6b9061515fcc0da9c0e24fd770bf215331a576e2 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 13 Jun 2018 12:25:32 -0400 Subject: [PATCH] AEAD/ChaCha20/Poly1305 test added --- libi2pd/Crypto.cpp | 17 ++++++++-- tests/Makefile | 5 ++- tests/test-aeadchacha20poly1305.cpp | 49 +++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 tests/test-aeadchacha20poly1305.cpp diff --git a/libi2pd/Crypto.cpp b/libi2pd/Crypto.cpp index 5e8ba855..6d52a6c1 100644 --- a/libi2pd/Crypto.cpp +++ b/libi2pd/Crypto.cpp @@ -1073,10 +1073,23 @@ namespace crypto memcpy (buf, msg, msgLen); chacha20 (buf, msgLen, nonce, key, 1); // create Poly1305 message - std::vector polyMsg(adLen + msgLen + 16); + std::vector polyMsg(adLen + msgLen + 3*16); size_t offset = 0; - memcpy (polyMsg.data (), ad, adLen); offset += adLen; + uint8_t padding[16]; memset (padding, 0, 16); + memcpy (polyMsg.data (), ad, adLen); offset += adLen; // additional authenticated data + auto rem = adLen & 0x0F; // %16 + if (rem) + { + // padding1 + memcpy (polyMsg.data () + offset, padding, rem); offset += rem; + } memcpy (polyMsg.data () + offset, buf, msgLen); offset += msgLen; // encrypted data + rem = msgLen & 0x0F; // %16 + if (rem) + { + // padding2 + memcpy (polyMsg.data () + offset, padding, rem); offset += rem; + } htole64buf (polyMsg.data () + offset, adLen); offset += 8; htole64buf (polyMsg.data () + offset, msgLen); offset += 8; // calculate Poly1305 tag and write in after encrypted data diff --git a/tests/Makefile b/tests/Makefile index 38080a32..498cff17 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,6 +1,6 @@ CXXFLAGS += -Wall -Wextra -pedantic -O0 -g -std=c++11 -D_GLIBCXX_USE_NANOSLEEP=1 -I../libi2pd/ -pthread -Wl,--unresolved-symbols=ignore-in-object-files -TESTS = test-gost test-gost-sig test-base-64 test-x25519 +TESTS = test-gost test-gost-sig test-base-64 test-x25519 test-aeadchacha20poly1305 all: $(TESTS) run @@ -19,6 +19,9 @@ test-gost-sig: ../libi2pd/Gost.cpp ../libi2pd/I2PEndian.cpp ../libi2pd/Crypto.cp test-x25519: ../libi2pd/Ed25519.cpp ../libi2pd/I2PEndian.cpp ../libi2pd/Log.cpp ../libi2pd/Crypto.cpp test-x25519.cpp $(CXX) $(CXXFLAGS) $(NEEDED_CXXFLAGS) $(INCFLAGS) -o $@ $^ -lcrypto -lssl -lboost_system +test-aeadchacha20poly1305: ../libi2pd/Crypto.cpp ../libi2pd/ChaCha20.cpp ../libi2pd/Poly1305.cpp test-aeadchacha20poly1305.cpp + $(CXX) $(CXXFLAGS) $(NEEDED_CXXFLAGS) $(INCFLAGS) -o $@ $^ -lcrypto -lssl -lboost_system + run: $(TESTS) @for TEST in $(TESTS); do ./$$TEST ; done diff --git a/tests/test-aeadchacha20poly1305.cpp b/tests/test-aeadchacha20poly1305.cpp new file mode 100644 index 00000000..cb9ed5c3 --- /dev/null +++ b/tests/test-aeadchacha20poly1305.cpp @@ -0,0 +1,49 @@ +#include +#include +#include + +#include "Crypto.h" + +char text[] = "Ladies and Gentlemen of the class of '99: If I could offer you " +"only one tip for the future, sunscreen would be it."; // 114 bytes + +uint8_t key[32] = +{ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f +}; + +uint8_t ad[12] = +{ + 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 +}; + +uint8_t nonce[12] = +{ + 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 +}; + +uint8_t tag[16] = +{ + 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91 +}; + +uint8_t encrypted[114] = +{ + 0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86, 0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2, + 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe, 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, + 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12, 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, + 0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6, 0x7e, 0xcd, 0x3b, 0x36, + 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c, 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, + 0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, + 0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce, 0xc6, 0x4b, + 0x61, 0x16 +}; + +int main () +{ + uint8_t buf[114+16]; + i2p::crypto::AEADChaCha20Poly1305Encrypt ((uint8_t *)text, 114, ad, 12, key, nonce, buf, 114 + 16); + assert (memcmp (buf, encrypted, 114) == 0); + assert(memcmp (buf + 114, tag, 16) == 0); +}