From 193d0bb63400d1a0f9a4c970e08c4807358244eb Mon Sep 17 00:00:00 2001 From: Pieter Hintjens Date: Sun, 15 Sep 2013 17:30:18 +0200 Subject: [PATCH] Fixed Z85 methods to be static and not pollute library --- src/z85_codec.hpp | 4 ++-- tests/test_security_curve.cpp | 41 +++++++++++++++++++++++++++++++++-- tools/curve_keygen.c | 39 +++++++++++++++++++++++++++++++-- tools/z85_codec.h | 4 ++-- 4 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/z85_codec.hpp b/src/z85_codec.hpp index e03a38b5..cb063ebb 100644 --- a/src/z85_codec.hpp +++ b/src/z85_codec.hpp @@ -51,7 +51,7 @@ static uint8_t decoder [96] = { // size * 5 / 4 bytes long plus 1 byte for the null terminator. Returns // dest. Size must be a multiple of 4. -char * +static char * Z85_encode (char *dest, uint8_t *data, size_t size) { assert (size % 4 == 0); @@ -82,7 +82,7 @@ Z85_encode (char *dest, uint8_t *data, size_t size) // strlen (string) * 4 / 5 bytes long. Returns dest. strlen (string) // must be a multiple of 5. -uint8_t * +static uint8_t * Z85_decode (uint8_t *dest, char *string) { assert (strlen (string) % 5 == 0); diff --git a/tests/test_security_curve.cpp b/tests/test_security_curve.cpp index fc7a4668..17d6eec4 100644 --- a/tests/test_security_curve.cpp +++ b/tests/test_security_curve.cpp @@ -21,7 +21,6 @@ #include #include "testutil.hpp" #include "../include/zmq_utils.h" -#include "../src/z85_codec.hpp" #include "platform.hpp" // Test keys from the zmq_curve man page @@ -30,6 +29,44 @@ static char client_secret [] = "D:)Q[IlAW!ahhC2ac:9*A}h:p?([4%wOTJ%JR%cs"; static char server_public [] = "rq:rM>}U?@Lns47E1%kR.o@n%FcmmsL/@{H8]yf7"; static char server_secret [] = "JTKVSB%%)wK0E.X)V>+}o?pNmC{O&4W4b!Ni{Lh6"; +// -------------------------------------------------------------------------- +// Encode a binary frame as a string; destination string MUST be at least +// size * 5 / 4 bytes long plus 1 byte for the null terminator. Returns +// dest. Size must be a multiple of 4. + +// Maps base 256 to base 85 +static char encoder [85 + 1] = { + "0123456789" "abcdefghij" "klmnopqrst" "uvwxyzABCD" + "EFGHIJKLMN" "OPQRSTUVWX" "YZ.-:+=^!/" "*?&<>()[]{" + "}@%$#" +}; + +static char * +Z85_encode (char *dest, uint8_t *data, size_t size) +{ + assert (size % 4 == 0); + unsigned int char_nbr = 0; + unsigned int byte_nbr = 0; + uint32_t value = 0; + while (byte_nbr < size) { + // Accumulate value in base 256 (binary) + value = value * 256 + data [byte_nbr++]; + if (byte_nbr % 4 == 0) { + // Output value in base 85 + unsigned int divisor = 85 * 85 * 85 * 85; + while (divisor) { + dest [char_nbr++] = encoder [value / divisor % 85]; + divisor /= 85; + } + value = 0; + } + } + assert (char_nbr == size * 5 / 4); + dest [char_nbr] = 0; + return dest; +} + + static void zap_handler (void *ctx) { // Create and bind ZAP socket @@ -71,7 +108,7 @@ static void zap_handler (void *ctx) } else { s_sendmore (zap, "400"); - s_sendmore (zap, "Invalid username or password"); + s_sendmore (zap, "Invalid client public key"); s_sendmore (zap, ""); s_send (zap, ""); } diff --git a/tools/curve_keygen.c b/tools/curve_keygen.c index ce59fadf..5b52d69f 100644 --- a/tools/curve_keygen.c +++ b/tools/curve_keygen.c @@ -28,12 +28,47 @@ #include #include #include "../src/platform.hpp" - #ifdef HAVE_LIBSODIUM # include -# include "z85_codec.h" #endif +// Maps base 256 to base 85 +static char encoder [85 + 1] = { + "0123456789" "abcdefghij" "klmnopqrst" "uvwxyzABCD" + "EFGHIJKLMN" "OPQRSTUVWX" "YZ.-:+=^!/" "*?&<>()[]{" + "}@%$#" +}; + +// -------------------------------------------------------------------------- +// Encode a binary frame as a string; destination string MUST be at least +// size * 5 / 4 bytes long plus 1 byte for the null terminator. Returns +// dest. Size must be a multiple of 4. + +static char * +Z85_encode (char *dest, uint8_t *data, size_t size) +{ + assert (size % 4 == 0); + uint char_nbr = 0; + uint byte_nbr = 0; + uint32_t value = 0; + while (byte_nbr < size) { + // Accumulate value in base 256 (binary) + value = value * 256 + data [byte_nbr++]; + if (byte_nbr % 4 == 0) { + // Output value in base 85 + uint divisor = 85 * 85 * 85 * 85; + while (divisor) { + dest [char_nbr++] = encoder [value / divisor % 85]; + divisor /= 85; + } + value = 0; + } + } + assert (char_nbr == size * 5 / 4); + dest [char_nbr] = 0; + return dest; +} + int main (void) { #ifdef HAVE_LIBSODIUM diff --git a/tools/z85_codec.h b/tools/z85_codec.h index aa609f8b..6e198a32 100644 --- a/tools/z85_codec.h +++ b/tools/z85_codec.h @@ -53,7 +53,7 @@ static uint8_t decoder [96] = { // size * 5 / 4 bytes long plus 1 byte for the null terminator. Returns // dest. Size must be a multiple of 4. -char * +static char * Z85_encode (char *dest, uint8_t *data, size_t size) { assert (size % 4 == 0); @@ -84,7 +84,7 @@ Z85_encode (char *dest, uint8_t *data, size_t size) // strlen (string) * 4 / 5 bytes long. Returns dest. strlen (string) // must be a multiple of 5. -uint8_t * +static uint8_t * Z85_decode (uint8_t *dest, char *string) { assert (strlen (string) % 5 == 0);