diff options
Diffstat (limited to 'regress/unittests/sshbuf/test_sshbuf_misc.c')
-rw-r--r-- | regress/unittests/sshbuf/test_sshbuf_misc.c | 223 |
1 files changed, 216 insertions, 7 deletions
diff --git a/regress/unittests/sshbuf/test_sshbuf_misc.c b/regress/unittests/sshbuf/test_sshbuf_misc.c index 249ecf235764..6b5b380d8524 100644 --- a/regress/unittests/sshbuf/test_sshbuf_misc.c +++ b/regress/unittests/sshbuf/test_sshbuf_misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_sshbuf_misc.c,v 1.5 2021/12/14 21:25:27 deraadt Exp $ */ +/* $OpenBSD: test_sshbuf_misc.c,v 1.7 2025/09/15 03:00:22 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * @@ -9,9 +9,7 @@ #include <sys/types.h> #include <stdio.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif +#include <stdint.h> #include <stdlib.h> #include <string.h> @@ -22,11 +20,11 @@ void sshbuf_misc_tests(void); -void -sshbuf_misc_tests(void) +static void +test_sshbuf_dump(void) { struct sshbuf *p1; - char tmp[512], msg[] = "imploring ping silence ping over", *p; + char tmp[512]; FILE *out; size_t sz; @@ -48,6 +46,13 @@ sshbuf_misc_tests(void) fclose(out); sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_dtob16(void) +{ + struct sshbuf *p1; + char *p; TEST_START("sshbuf_dtob16"); p1 = sshbuf_new(); @@ -59,6 +64,13 @@ sshbuf_misc_tests(void) free(p); sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_dtob64_string(void) +{ + struct sshbuf *p1; + char *p; TEST_START("sshbuf_dtob64_string len 1"); p1 = sshbuf_new(); @@ -107,6 +119,12 @@ sshbuf_misc_tests(void) free(p); sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_b64tod(void) +{ + struct sshbuf *p1; TEST_START("sshbuf_b64tod len 1"); p1 = sshbuf_new(); @@ -134,6 +152,13 @@ sshbuf_misc_tests(void) ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f); sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_dup_string(void) +{ + struct sshbuf *p1; + char *p; TEST_START("sshbuf_dup_string"); p1 = sshbuf_new(); @@ -163,6 +188,13 @@ sshbuf_misc_tests(void) ASSERT_PTR_EQ(p, NULL); sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_cmp(void) +{ + struct sshbuf *p1; + char msg[] = "imploring ping silence ping over"; TEST_START("sshbuf_cmp"); p1 = sshbuf_from(msg, sizeof(msg) - 1); @@ -182,7 +214,16 @@ sshbuf_misc_tests(void) ASSERT_INT_EQ(sshbuf_cmp(p1, 1000, "silence", 7), SSH_ERR_MESSAGE_INCOMPLETE); ASSERT_INT_EQ(sshbuf_cmp(p1, 0, msg, sizeof(msg) - 1), 0); + sshbuf_free(p1); TEST_DONE(); +} + +static void +test_sshbuf_find(void) +{ + struct sshbuf *p1; + char msg[] = "imploring ping silence ping over"; + size_t sz; TEST_START("sshbuf_find"); p1 = sshbuf_from(msg, sizeof(msg) - 1); @@ -212,6 +253,174 @@ sshbuf_misc_tests(void) SSH_ERR_MESSAGE_INCOMPLETE); ASSERT_INT_EQ(sshbuf_find(p1, 0, msg + 1, sizeof(msg) - 2, &sz), 0); ASSERT_SIZE_T_EQ(sz, 1); + sshbuf_free(p1); + TEST_DONE(); +} + +static void +test_sshbuf_equals(void) +{ + struct sshbuf *b1, *b2; + + TEST_START("sshbuf_equals identical"); + b1 = sshbuf_new(); + b2 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_PTR_NE(b2, NULL); + ASSERT_INT_EQ(sshbuf_put(b1, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_put(b2, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_equals(b1, b2), 0); + sshbuf_free(b1); + sshbuf_free(b2); + TEST_DONE(); + + TEST_START("sshbuf_equals different content"); + b1 = sshbuf_new(); + b2 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_PTR_NE(b2, NULL); + ASSERT_INT_EQ(sshbuf_put(b1, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_put(b2, "world", 5), 0); + ASSERT_INT_EQ(sshbuf_equals(b1, b2), SSH_ERR_INVALID_FORMAT); + sshbuf_free(b1); + sshbuf_free(b2); + TEST_DONE(); + + TEST_START("sshbuf_equals different length"); + b1 = sshbuf_new(); + b2 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_PTR_NE(b2, NULL); + ASSERT_INT_EQ(sshbuf_put(b1, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_put(b2, "hell", 4), 0); + ASSERT_INT_EQ(sshbuf_equals(b1, b2), SSH_ERR_MESSAGE_INCOMPLETE); + sshbuf_free(b1); + sshbuf_free(b2); + TEST_DONE(); + + TEST_START("sshbuf_equals empty buffers"); + b1 = sshbuf_new(); + b2 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_PTR_NE(b2, NULL); + ASSERT_INT_EQ(sshbuf_equals(b1, b2), 0); + sshbuf_free(b1); + sshbuf_free(b2); + TEST_DONE(); + + TEST_START("sshbuf_equals one empty buffer"); + b1 = sshbuf_new(); + b2 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_PTR_NE(b2, NULL); + ASSERT_INT_EQ(sshbuf_put(b1, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_equals(b1, b2), SSH_ERR_MESSAGE_INCOMPLETE); + sshbuf_free(b1); + sshbuf_free(b2); + TEST_DONE(); + + TEST_START("sshbuf_equals buffer to self"); + b1 = sshbuf_new(); + ASSERT_PTR_NE(b1, NULL); + ASSERT_INT_EQ(sshbuf_put(b1, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_equals(b1, b1), 0); + sshbuf_free(b1); TEST_DONE(); } +static void +test_sshbuf_dtourlb64(void) +{ + struct sshbuf *b, *b64; + char *s; + /* From RFC4648 */ + const u_char test_vec1[] = {0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e}; + const u_char test_vec2[] = {0xff, 0xff, 0xff}; + const u_char test_vec3[] = {0xfb}; + + TEST_START("sshbuf_dtourlb64 empty"); + b = sshbuf_new(); + b64 = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_PTR_NE(b64, NULL); + ASSERT_INT_EQ(sshbuf_dtourlb64(b, b64, 0), 0); + ASSERT_SIZE_T_EQ(sshbuf_len(b64), 0); + sshbuf_free(b); + sshbuf_free(b64); + TEST_DONE(); + + TEST_START("sshbuf_dtourlb64 no special chars"); + b = sshbuf_new(); + b64 = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_PTR_NE(b64, NULL); + ASSERT_INT_EQ(sshbuf_put(b, "hello", 5), 0); + ASSERT_INT_EQ(sshbuf_dtourlb64(b, b64, 0), 0); + s = sshbuf_dup_string(b64); + ASSERT_PTR_NE(s, NULL); + ASSERT_STRING_EQ(s, "aGVsbG8"); + free(s); + sshbuf_free(b); + sshbuf_free(b64); + TEST_DONE(); + + TEST_START("sshbuf_dtourlb64 with '+' char"); + b = sshbuf_new(); + b64 = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_PTR_NE(b64, NULL); + ASSERT_INT_EQ(sshbuf_put(b, test_vec1, sizeof(test_vec1)), 0); + ASSERT_INT_EQ(sshbuf_dtourlb64(b, b64, 0), 0); + s = sshbuf_dup_string(b64); + ASSERT_PTR_NE(s, NULL); + ASSERT_STRING_EQ(s, "FPucA9l-"); + free(s); + sshbuf_free(b); + sshbuf_free(b64); + TEST_DONE(); + + TEST_START("sshbuf_dtourlb64 with '/' char"); + b = sshbuf_new(); + b64 = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_PTR_NE(b64, NULL); + ASSERT_INT_EQ(sshbuf_put(b, test_vec2, sizeof(test_vec2)), 0); + ASSERT_INT_EQ(sshbuf_dtourlb64(b, b64, 0), 0); + s = sshbuf_dup_string(b64); + ASSERT_PTR_NE(s, NULL); + ASSERT_STRING_EQ(s, "____"); + free(s); + sshbuf_free(b); + sshbuf_free(b64); + TEST_DONE(); + + TEST_START("sshbuf_dtourlb64 with padding removed"); + b = sshbuf_new(); + b64 = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_PTR_NE(b64, NULL); + ASSERT_INT_EQ(sshbuf_put(b, test_vec3, sizeof(test_vec3)), 0); + ASSERT_INT_EQ(sshbuf_dtourlb64(b, b64, 0), 0); + s = sshbuf_dup_string(b64); + ASSERT_PTR_NE(s, NULL); + ASSERT_STRING_EQ(s, "-w"); + free(s); + sshbuf_free(b); + sshbuf_free(b64); + TEST_DONE(); +} + +void +sshbuf_misc_tests(void) +{ + test_sshbuf_dump(); + test_sshbuf_dtob16(); + test_sshbuf_dtob64_string(); + test_sshbuf_b64tod(); + test_sshbuf_dup_string(); + test_sshbuf_cmp(); + test_sshbuf_find(); + test_sshbuf_equals(); + test_sshbuf_dtourlb64(); +} + |