summaryrefslogtreecommitdiffstats
path: root/src/lib/test-base32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/test-base32.c')
-rw-r--r--src/lib/test-base32.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/lib/test-base32.c b/src/lib/test-base32.c
new file mode 100644
index 0000000..072dae8
--- /dev/null
+++ b/src/lib/test-base32.c
@@ -0,0 +1,189 @@
+/* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "str.h"
+#include "base32.h"
+
+
+static void test_base32_encode(void)
+{
+ static const char *input[] = {
+ "toedeledokie!!",
+ "bye bye world",
+ "hoeveel onzin kun je testen?????",
+ "c'est pas vrai! ",
+ "dit is het einde van deze test"
+ };
+ static const char *output[] = {
+ "ORXWKZDFNRSWI33LNFSSCII=",
+ "MJ4WKIDCPFSSA53POJWGI===",
+ "NBXWK5TFMVWCA33OPJUW4IDLOVXCA2TFEB2GK43UMVXD6PZ7H47Q====",
+ "MMTWK43UEBYGC4ZAOZZGC2JBEA======",
+ "MRUXIIDJOMQGQZLUEBSWS3TEMUQHMYLOEBSGK6TFEB2GK43U"
+ };
+ string_t *str;
+ unsigned int i;
+
+ test_begin("base32_encode() with padding");
+ str = t_str_new(256);
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ str_truncate(str, 0);
+ base32_encode(TRUE, input[i], strlen(input[i]), str);
+ test_assert(strcmp(output[i], str_c(str)) == 0);
+ }
+ test_end();
+
+ test_begin("base32_encode() no padding");
+ str = t_str_new(256);
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ const char *p = strchr(output[i], '=');
+ size_t len;
+
+ if (p == NULL)
+ len = strlen(output[i]);
+ else
+ len = (size_t)(p - output[i]);
+ str_truncate(str, 0);
+ base32_encode(FALSE, input[i], strlen(input[i]), str);
+ test_assert(strncmp(output[i], str_c(str), len) == 0);
+ }
+ test_end();
+}
+
+static void test_base32hex_encode(void)
+{
+ static const char *input[] = {
+ "toedeledokie!!",
+ "bye bye world",
+ "hoeveel onzin kun je testen?????",
+ "c'est pas vrai! ",
+ "dit is het einde van deze test"
+ };
+ static const char *output[] = {
+ "EHNMAP35DHIM8RRBD5II288=",
+ "C9SMA832F5II0TRFE9M68===",
+ "D1NMATJ5CLM20RREF9KMS83BELN20QJ541Q6ASRKCLN3UFPV7SVG====",
+ "CCJMASRK41O62SP0EPP62Q9140======",
+ "CHKN8839ECG6GPBK41IMIRJ4CKG7COBE41I6AUJ541Q6ASRK"
+ };
+ string_t *str;
+ unsigned int i;
+
+ test_begin("base32hex_encode() with padding");
+ str = t_str_new(256);
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ str_truncate(str, 0);
+ base32hex_encode(TRUE, input[i], strlen(input[i]), str);
+ test_assert(strcmp(output[i], str_c(str)) == 0);
+ }
+ test_end();
+
+ test_begin("base32hex_encode() no padding");
+ str = t_str_new(256);
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ const char *p = strchr(output[i], '=');
+ size_t len;
+
+ if (p == NULL)
+ len = strlen(output[i]);
+ else
+ len = (size_t)(p - output[i]);
+ str_truncate(str, 0);
+ base32hex_encode(FALSE, input[i], strlen(input[i]), str);
+ test_assert(strncmp(output[i], str_c(str), len) == 0);
+ }
+ test_end();
+
+}
+
+struct test_base32_decode_output {
+ const char *text;
+ int ret;
+ unsigned int src_pos;
+};
+
+static void test_base32_decode(void)
+{
+ static const char *input[] = {
+ "ORXWKZDFNRSWI33LNFSSCII=",
+ "MJ4WKIDCPFSSA53POJWGI===",
+ "NBXWK5TFMVWCA33OPJUW4IDLOVXCA2TFEB2GK43UMVXD6PZ7H47Q====",
+ "MMTWK43UEBYGC4ZAOZZGC2JBEA======",
+ "MRUXIIDJOMQGQZLUEBSWS3TEMUQHMYLOEBSGK6TFEB2GK43U"
+ };
+ static const struct test_base32_decode_output output[] = {
+ { "toedeledokie!!", 0, 24 },
+ { "bye bye world", 0, 24 },
+ { "hoeveel onzin kun je testen?????", 0, 56 },
+ { "c'est pas vrai! ", 0, 32 },
+ { "dit is het einde van deze test", 1, 48 },
+ };
+ string_t *str;
+ unsigned int i;
+ size_t src_pos;
+ int ret;
+
+ test_begin("base32_decode()");
+ str = t_str_new(256);
+ for (i = 0; i < N_ELEMENTS(input); i++) {
+ str_truncate(str, 0);
+
+ src_pos = 0;
+ ret = base32_decode(input[i], strlen(input[i]), &src_pos, str);
+
+ test_assert(output[i].ret == ret &&
+ strcmp(output[i].text, str_c(str)) == 0 &&
+ (src_pos == output[i].src_pos ||
+ (output[i].src_pos == UINT_MAX &&
+ src_pos == strlen(input[i]))));
+ }
+ test_end();
+}
+
+static void test_base32_random(void)
+{
+ string_t *str, *dest;
+ unsigned char buf[10];
+ unsigned int i, j, max;
+
+ str = t_str_new(256);
+ dest = t_str_new(256);
+
+ test_begin("padded base32 encode/decode with random input");
+ for (i = 0; i < 1000; i++) {
+ max = i_rand_limit(sizeof(buf));
+ for (j = 0; j < max; j++)
+ buf[j] = i_rand_uchar();
+
+ str_truncate(str, 0);
+ str_truncate(dest, 0);
+ base32_encode(TRUE, buf, max, str);
+ test_assert(base32_decode(str_data(str), str_len(str), NULL, dest) >= 0);
+ test_assert(str_len(dest) == max &&
+ memcmp(buf, str_data(dest), max) == 0);
+ }
+ test_end();
+
+ test_begin("padded base32hex encode/decode with random input");
+ for (i = 0; i < 1000; i++) {
+ max = i_rand_limit(sizeof(buf));
+ for (j = 0; j < max; j++)
+ buf[j] = i_rand_uchar();
+
+ str_truncate(str, 0);
+ str_truncate(dest, 0);
+ base32hex_encode(TRUE, buf, max, str);
+ test_assert(base32hex_decode(str_data(str), str_len(str), NULL, dest) >= 0);
+ test_assert(str_len(dest) == max &&
+ memcmp(buf, str_data(dest), max) == 0);
+ }
+ test_end();
+}
+
+void test_base32(void)
+{
+ test_base32_encode();
+ test_base32hex_encode();
+ test_base32_decode();
+ test_base32_random();
+}