aboutsummaryrefslogtreecommitdiff
path: root/src/test/test_crypto_openssl.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-03-25 12:13:31 +0100
committerNick Mathewson <nickm@torproject.org>2017-03-31 10:04:44 -0400
commita4964466a55a67ca96c751286b3778fc1f12727a (patch)
tree193dfb5b9e593d8125c350f55fd65d6a525036b0 /src/test/test_crypto_openssl.c
parent1a14e5be91cfd32f8eee30896eb432a7ff060c05 (diff)
downloadtor-a4964466a55a67ca96c751286b3778fc1f12727a.tar.gz
tor-a4964466a55a67ca96c751286b3778fc1f12727a.zip
Remove openssl/evp.h dependency from test_crypto.c
Diffstat (limited to 'src/test/test_crypto_openssl.c')
-rw-r--r--src/test/test_crypto_openssl.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/test/test_crypto_openssl.c b/src/test/test_crypto_openssl.c
index 64e33f5fa6..3d7d2b4639 100644
--- a/src/test/test_crypto_openssl.c
+++ b/src/test/test_crypto_openssl.c
@@ -8,6 +8,9 @@
#define CRYPTO_PRIVATE
#include "crypto.h"
+#include "util.h"
+#include "util_format.h"
+#include "compat.h"
#include "test.h"
#include <openssl/evp.h>
@@ -46,7 +49,59 @@ test_crypto_rng_engine(void *arg)
;
}
+#ifndef OPENSSL_1_1_API
+#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX))
+#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx)
+#endif
+
+/** Encode src into dest with OpenSSL's EVP Encode interface, returning the
+ * length of the encoded data in bytes.
+ */
+static int
+base64_encode_evp(char *dest, char *src, size_t srclen)
+{
+ const unsigned char *s = (unsigned char*)src;
+ EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
+ int len, ret;
+
+ EVP_EncodeInit(ctx);
+ EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen);
+ EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret);
+ EVP_ENCODE_CTX_free(ctx);
+ return ret+ len;
+}
+
+static void
+test_crypto_base64_encode_matches(void *arg)
+{
+ (void)arg;
+ int i, j;
+ char data1[1024];
+ char data2[1024];
+ char data3[1024];
+
+ for (i = 0; i < 256; i++) {
+ /* Test the multiline format Base64 encoder with 0 .. 256 bytes of
+ * output against OpenSSL.
+ */
+ const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE);
+ data1[i] = i;
+ j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE);
+ tt_int_op(j, OP_EQ, enclen);
+ j = base64_encode_evp(data3, data1, i);
+ tt_int_op(j, OP_EQ, enclen);
+ tt_mem_op(data2, OP_EQ, data3, enclen);
+ tt_int_op(j, OP_EQ, strlen(data2));
+ }
+
+ done:
+ ;
+}
+
struct testcase_t crypto_openssl_tests[] = {
{ "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL },
+ { "base64_encode_match", test_crypto_base64_encode_matches,
+ TT_FORK, NULL, NULL },
END_OF_TESTCASES
};
+