1323129Sdes/* $OpenBSD: test_sshbuf_misc.c,v 1.2 2016/05/03 13:48:33 djm Exp $ */ 2276707Sdes/* 3276707Sdes * Regress test for sshbuf.h buffer API 4276707Sdes * 5276707Sdes * Placed in the public domain 6276707Sdes */ 7276707Sdes 8276707Sdes#include "includes.h" 9276707Sdes 10276707Sdes#include <sys/types.h> 11276707Sdes#include <sys/param.h> 12276707Sdes#include <stdio.h> 13276707Sdes#ifdef HAVE_STDINT_H 14276707Sdes# include <stdint.h> 15276707Sdes#endif 16276707Sdes#include <stdlib.h> 17276707Sdes#include <string.h> 18276707Sdes 19276707Sdes#include "../test_helper/test_helper.h" 20276707Sdes 21276707Sdes#include "sshbuf.h" 22276707Sdes 23276707Sdesvoid sshbuf_misc_tests(void); 24276707Sdes 25276707Sdesvoid 26276707Sdessshbuf_misc_tests(void) 27276707Sdes{ 28276707Sdes struct sshbuf *p1; 29276707Sdes char tmp[512], *p; 30276707Sdes FILE *out; 31276707Sdes size_t sz; 32276707Sdes 33276707Sdes TEST_START("sshbuf_dump"); 34276707Sdes out = tmpfile(); 35276707Sdes ASSERT_PTR_NE(out, NULL); 36276707Sdes p1 = sshbuf_new(); 37276707Sdes ASSERT_PTR_NE(p1, NULL); 38276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0); 39276707Sdes sshbuf_dump(p1, out); 40276707Sdes fflush(out); 41276707Sdes rewind(out); 42276707Sdes sz = fread(tmp, 1, sizeof(tmp), out); 43276707Sdes ASSERT_INT_EQ(ferror(out), 0); 44276707Sdes ASSERT_INT_NE(feof(out), 0); 45276707Sdes ASSERT_SIZE_T_GT(sz, 0); 46276707Sdes tmp[sz] = '\0'; 47276707Sdes ASSERT_PTR_NE(strstr(tmp, "12 34 56 78"), NULL); 48276707Sdes fclose(out); 49276707Sdes sshbuf_free(p1); 50276707Sdes TEST_DONE(); 51276707Sdes 52276707Sdes TEST_START("sshbuf_dtob16"); 53276707Sdes p1 = sshbuf_new(); 54276707Sdes ASSERT_PTR_NE(p1, NULL); 55276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0); 56276707Sdes p = sshbuf_dtob16(p1); 57276707Sdes ASSERT_PTR_NE(p, NULL); 58276707Sdes ASSERT_STRING_EQ(p, "12345678"); 59276707Sdes free(p); 60276707Sdes sshbuf_free(p1); 61276707Sdes TEST_DONE(); 62276707Sdes 63276707Sdes TEST_START("sshbuf_dtob64 len 1"); 64276707Sdes p1 = sshbuf_new(); 65276707Sdes ASSERT_PTR_NE(p1, NULL); 66276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 67276707Sdes p = sshbuf_dtob64(p1); 68276707Sdes ASSERT_PTR_NE(p, NULL); 69276707Sdes ASSERT_STRING_EQ(p, "EQ=="); 70276707Sdes free(p); 71276707Sdes sshbuf_free(p1); 72276707Sdes TEST_DONE(); 73276707Sdes 74276707Sdes TEST_START("sshbuf_dtob64 len 2"); 75276707Sdes p1 = sshbuf_new(); 76276707Sdes ASSERT_PTR_NE(p1, NULL); 77276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 78276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0); 79276707Sdes p = sshbuf_dtob64(p1); 80276707Sdes ASSERT_PTR_NE(p, NULL); 81276707Sdes ASSERT_STRING_EQ(p, "ESI="); 82276707Sdes free(p); 83276707Sdes sshbuf_free(p1); 84276707Sdes TEST_DONE(); 85276707Sdes 86276707Sdes TEST_START("sshbuf_dtob64 len 3"); 87276707Sdes p1 = sshbuf_new(); 88276707Sdes ASSERT_PTR_NE(p1, NULL); 89276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 90276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0); 91276707Sdes ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x33), 0); 92276707Sdes p = sshbuf_dtob64(p1); 93276707Sdes ASSERT_PTR_NE(p, NULL); 94276707Sdes ASSERT_STRING_EQ(p, "ESIz"); 95276707Sdes free(p); 96276707Sdes sshbuf_free(p1); 97276707Sdes TEST_DONE(); 98276707Sdes 99276707Sdes TEST_START("sshbuf_dtob64 len 8191"); 100276707Sdes p1 = sshbuf_new(); 101276707Sdes ASSERT_PTR_NE(p1, NULL); 102276707Sdes ASSERT_INT_EQ(sshbuf_reserve(p1, 8192, NULL), 0); 103276707Sdes bzero(sshbuf_mutable_ptr(p1), 8192); 104276707Sdes p = sshbuf_dtob64(p1); 105276707Sdes ASSERT_PTR_NE(p, NULL); 106276707Sdes ASSERT_SIZE_T_EQ(strlen(p), ((8191 + 2) / 3) * 4); 107276707Sdes free(p); 108276707Sdes sshbuf_free(p1); 109276707Sdes TEST_DONE(); 110276707Sdes 111276707Sdes TEST_START("sshbuf_b64tod len 1"); 112276707Sdes p1 = sshbuf_new(); 113276707Sdes ASSERT_PTR_NE(p1, NULL); 114276707Sdes ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A=="), 0); 115276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 116276707Sdes ASSERT_U8_EQ(*sshbuf_ptr(p1), 0xd0); 117276707Sdes sshbuf_free(p1); 118276707Sdes TEST_DONE(); 119276707Sdes 120276707Sdes TEST_START("sshbuf_b64tod len 2"); 121276707Sdes p1 = sshbuf_new(); 122276707Sdes ASSERT_PTR_NE(p1, NULL); 123276707Sdes ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A8="), 0); 124276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 125276707Sdes ASSERT_U16_EQ(PEEK_U16(sshbuf_ptr(p1)), 0xd00f); 126276707Sdes sshbuf_free(p1); 127276707Sdes TEST_DONE(); 128276707Sdes 129276707Sdes TEST_START("sshbuf_b64tod len 4"); 130276707Sdes p1 = sshbuf_new(); 131276707Sdes ASSERT_PTR_NE(p1, NULL); 132276707Sdes ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A/QDw=="), 0); 133276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 134276707Sdes ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f); 135276707Sdes sshbuf_free(p1); 136276707Sdes TEST_DONE(); 137323129Sdes 138323129Sdes TEST_START("sshbuf_dup_string"); 139323129Sdes p1 = sshbuf_new(); 140323129Sdes ASSERT_PTR_NE(p1, NULL); 141323129Sdes /* Check empty buffer */ 142323129Sdes p = sshbuf_dup_string(p1); 143323129Sdes ASSERT_PTR_NE(p, NULL); 144323129Sdes ASSERT_SIZE_T_EQ(strlen(p), 0); 145323129Sdes free(p); 146323129Sdes /* Check buffer with string */ 147323129Sdes ASSERT_INT_EQ(sshbuf_put(p1, "quad1", strlen("quad1")), 0); 148323129Sdes p = sshbuf_dup_string(p1); 149323129Sdes ASSERT_PTR_NE(p, NULL); 150323129Sdes ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1")); 151323129Sdes ASSERT_STRING_EQ(p, "quad1"); 152323129Sdes free(p); 153323129Sdes /* Check buffer with terminating nul */ 154323129Sdes ASSERT_INT_EQ(sshbuf_put(p1, "\0", 1), 0); 155323129Sdes p = sshbuf_dup_string(p1); 156323129Sdes ASSERT_PTR_NE(p, NULL); 157323129Sdes ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1")); 158323129Sdes ASSERT_STRING_EQ(p, "quad1"); 159323129Sdes free(p); 160323129Sdes /* Check buffer with data after nul (expect failure) */ 161323129Sdes ASSERT_INT_EQ(sshbuf_put(p1, "quad2", strlen("quad2")), 0); 162323129Sdes p = sshbuf_dup_string(p1); 163323129Sdes ASSERT_PTR_EQ(p, NULL); 164323129Sdes sshbuf_free(p1); 165323129Sdes TEST_DONE(); 166276707Sdes} 167276707Sdes 168