From c050d95fcdd141e295d5294888e49be350599611 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Thu, 19 May 2016 03:46:15 -0700 Subject: [PATCH] Problem: no unit tests for base85 or public curve functions. --- Makefile.am | 10 ++++- src/zmq_utils.cpp | 14 ++---- tests/CMakeLists.txt | 2 + tests/test_base85.cpp | 92 ++++++++++++++++++++++++++++++++++++++++ tests/test_sodium.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 tests/test_base85.cpp create mode 100644 tests/test_sodium.cpp diff --git a/Makefile.am b/Makefile.am index 4892f375..7b02748a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -401,7 +401,9 @@ test_apps = \ tests/test_sockopt_hwm \ tests/test_heartbeats \ tests/test_stream_exceeds_buffer \ - tests/test_pub_invert_matching + tests/test_pub_invert_matching \ + tests/test_base85 \ + tests/test_sodium tests_test_ancillaries_SOURCES = tests/test_ancillaries.cpp tests_test_ancillaries_LDADD = src/libzmq.la @@ -606,6 +608,12 @@ tests_test_stream_exceeds_buffer_LDADD = src/libzmq.la tests_test_pub_invert_matching_SOURCES = tests/test_pub_invert_matching.cpp tests_test_pub_invert_matching_LDADD = src/libzmq.la +tests_test_base85_SOURCES = tests/test_base85.cpp +tests_test_base85_LDADD = src/libzmq.la + +tests_test_sodium_SOURCES = tests/test_sodium.cpp +tests_test_sodium_LDADD = src/libzmq.la + if !ON_MINGW if !ON_CYGWIN test_apps += \ diff --git a/src/zmq_utils.cpp b/src/zmq_utils.cpp index adcdd19b..9c3055df 100644 --- a/src/zmq_utils.cpp +++ b/src/zmq_utils.cpp @@ -196,11 +196,8 @@ int zmq_curve_keypair (char *z85_public_key, char *z85_secret_key) uint8_t public_key [32]; uint8_t secret_key [32]; - int rc = crypto_box_keypair (public_key, secret_key); - // Is there a sensible errno to set here (no, it cannot fail)? - if (rc) - return rc; - + // Return codes are suppressed as none of these can actually fail. + crypto_box_keypair (public_key, secret_key); zmq_z85_encode (z85_public_key, public_key, 32); zmq_z85_encode (z85_secret_key, secret_key, 32); @@ -232,11 +229,8 @@ int zmq_curve_public (char *z85_public_key, const char *z85_secret_key) if (zmq_z85_decode (secret_key, z85_secret_key) == NULL) return -1; - int rc = crypto_scalarmult_base (public_key, secret_key); - // Is there a sensible errno to set here (no, it cannot fail)? - if (rc) - return rc; - + // Return codes are suppressed as none of these can actually fail. + crypto_scalarmult_base (public_key, secret_key); zmq_z85_encode (z85_public_key, public_key, 32); return 0; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9c5f657e..a2163cc3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -65,6 +65,8 @@ set(tests test_stream_timeout test_xpub_manual test_xpub_welcome_msg + test_base85 + test_sodium ) if(NOT WIN32) list(APPEND tests diff --git a/tests/test_base85.cpp b/tests/test_base85.cpp new file mode 100644 index 00000000..a4e3960c --- /dev/null +++ b/tests/test_base85.cpp @@ -0,0 +1,92 @@ +/* + Copyright (c) 2016 Contributors as noted in the AUTHORS file + + This file is part of libzmq, the ZeroMQ core engine in C++. + + libzmq is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License (LGPL) as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + As a special exception, the Contributors give you permission to link + this library with independent modules to produce an executable, + regardless of the license terms of these independent modules, and to + copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the + terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. + If you modify this library, you must extend this exception to your + version of the library. + + libzmq is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "testutil.hpp" + +// Test vector: rfc.zeromq.org/spec:32/Z85 +void test__zmq_z85_encode__valid__success () +{ + static const size_t size = 8; + static const size_t length = size * 5 / 4; + static const uint8_t decoded[size] = { + 0x86, 0x4F, 0xD2, 0x6F, 0xB5, 0x59, 0xF7, 0x5B + }; + static const char expected[length + 1] = "HelloWorld"; + char out_encoded[length + 1] = { 0 }; + + errno = 0; + assert (zmq_z85_encode(out_encoded, decoded, size) != NULL); + assert (streq (out_encoded, expected)); + assert (zmq_errno () == 0); +} + +// Buffer length must be evenly divisible by 4 or must fail with EINVAL. +void test__zmq_z85_encode__invalid__failure (size_t size) +{ + errno = 0; + assert (zmq_z85_encode(NULL, NULL, size) == NULL); + assert (zmq_errno () == EINVAL); +} + +// Test vector: rfc.zeromq.org/spec:32/Z85 +void test__zmq_z85_decode__valid__success () +{ + static const size_t size = 10 * 4 / 5; + static const uint8_t expected[size] = { + 0x86, 0x4F, 0xD2, 0x6F, 0xB5, 0x59, 0xF7, 0x5B + }; + static const char* encoded = "HelloWorld"; + uint8_t out_decoded[size] = { 0 }; + + errno = 0; + assert (zmq_z85_decode(out_decoded, encoded) != NULL); + assert (zmq_errno () == 0); + assert (memcmp (out_decoded, expected, size) == 0); +} + +// String length must be evenly divisible by 5 or must fail with EINVAL. +void test__zmq_z85_decode__invalid__failure (const char *encoded) +{ + errno = 0; + assert (zmq_z85_decode(NULL, encoded) == NULL); + assert (zmq_errno () == EINVAL); +} + +int main (void) +{ + test__zmq_z85_encode__valid__success (); + test__zmq_z85_encode__invalid__failure (1); + test__zmq_z85_encode__invalid__failure (42); + + test__zmq_z85_decode__valid__success (); + test__zmq_z85_decode__invalid__failure ("01234567"); + test__zmq_z85_decode__invalid__failure ("0"); + + return 0; +} diff --git a/tests/test_sodium.cpp b/tests/test_sodium.cpp new file mode 100644 index 00000000..4deefe5b --- /dev/null +++ b/tests/test_sodium.cpp @@ -0,0 +1,99 @@ +/* + Copyright (c) 2016 Contributors as noted in the AUTHORS file + + This file is part of libzmq, the ZeroMQ core engine in C++. + + libzmq is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License (LGPL) as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + As a special exception, the Contributors give you permission to link + this library with independent modules to produce an executable, + regardless of the license terms of these independent modules, and to + copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the + terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. + If you modify this library, you must extend this exception to your + version of the library. + + libzmq is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "testutil.hpp" + +// There is no way to test for correctness because of the embedded RNG. +void test__zmq_curve_keypair__always__success (void) +{ + errno = 0; + char public_key[41] = { 0 }; + char secret_key[41] = { 0 }; + + const int rc = zmq_curve_keypair(public_key, secret_key); + +#if defined (ZMQ_HAVE_CURVE) + assert (rc == 0); + assert (zmq_errno () == 0); +#else + assert (rc == -1); + assert (zmq_errno () == ENOTSUP); +#endif +} + +void test__zmq_curve_public__valid__success () +{ + // These are paired according to hintjens.com/blog:45 + static const char public_key[] = "Yne@$w-vo