1172683Smlaier/* $OpenBSD: test_sshbuf_misc.c,v 1.5 2021/12/14 21:25:27 deraadt Exp $ */ 2172683Smlaier/* 3214478Srpaulo * Regress test for sshbuf.h buffer API 4172683Smlaier * 5172683Smlaier * Placed in the public domain 6172683Smlaier */ 7172683Smlaier 8172683Smlaier#include "includes.h" 9172683Smlaier 10172683Smlaier#include <sys/types.h> 11172683Smlaier#include <stdio.h> 12172683Smlaier#ifdef HAVE_STDINT_H 13172683Smlaier# include <stdint.h> 14172683Smlaier#endif 15172683Smlaier#include <stdlib.h> 16172683Smlaier#include <string.h> 17172683Smlaier 18172683Smlaier#include "../test_helper/test_helper.h" 19214478Srpaulo 20172683Smlaier#include "sshbuf.h" 21172683Smlaier#include "ssherr.h" 22172683Smlaier 23172683Smlaiervoid sshbuf_misc_tests(void); 24172683Smlaier 25172683Smlaiervoid 26172683Smlaiersshbuf_misc_tests(void) 27172683Smlaier{ 28172683Smlaier struct sshbuf *p1; 29172683Smlaier char tmp[512], msg[] = "imploring ping silence ping over", *p; 30172683Smlaier FILE *out; 31172683Smlaier size_t sz; 32172683Smlaier 33214478Srpaulo TEST_START("sshbuf_dump"); 34172683Smlaier out = tmpfile(); 35172683Smlaier ASSERT_PTR_NE(out, NULL); 36172683Smlaier p1 = sshbuf_new(); 37172683Smlaier ASSERT_PTR_NE(p1, NULL); 38172683Smlaier ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0); 39172683Smlaier sshbuf_dump(p1, out); 40172683Smlaier fflush(out); 41172683Smlaier rewind(out); 42172683Smlaier sz = fread(tmp, 1, sizeof(tmp), out); 43172683Smlaier ASSERT_INT_EQ(ferror(out), 0); 44172683Smlaier ASSERT_INT_NE(feof(out), 0); 45172683Smlaier ASSERT_SIZE_T_GT(sz, 0); 46172683Smlaier tmp[sz] = '\0'; 47172683Smlaier ASSERT_PTR_NE(strstr(tmp, "12 34 56 78"), NULL); 48172683Smlaier fclose(out); 49172683Smlaier sshbuf_free(p1); 50172683Smlaier TEST_DONE(); 51172683Smlaier 52172683Smlaier TEST_START("sshbuf_dtob16"); 53172683Smlaier p1 = sshbuf_new(); 54172683Smlaier ASSERT_PTR_NE(p1, NULL); 55172683Smlaier ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0); 56172683Smlaier p = sshbuf_dtob16(p1); 57172683Smlaier ASSERT_PTR_NE(p, NULL); 58172683Smlaier ASSERT_STRING_EQ(p, "12345678"); 59172683Smlaier free(p); 60172683Smlaier sshbuf_free(p1); 61172683Smlaier TEST_DONE(); 62172683Smlaier 63172683Smlaier TEST_START("sshbuf_dtob64_string len 1"); 64172683Smlaier p1 = sshbuf_new(); 65172683Smlaier ASSERT_PTR_NE(p1, NULL); 66172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 67172683Smlaier p = sshbuf_dtob64_string(p1, 0); 68172683Smlaier ASSERT_PTR_NE(p, NULL); 69172683Smlaier ASSERT_STRING_EQ(p, "EQ=="); 70172683Smlaier free(p); 71172683Smlaier sshbuf_free(p1); 72172683Smlaier TEST_DONE(); 73172683Smlaier 74172683Smlaier TEST_START("sshbuf_dtob64_string len 2"); 75172683Smlaier p1 = sshbuf_new(); 76172683Smlaier ASSERT_PTR_NE(p1, NULL); 77172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 78172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0); 79172683Smlaier p = sshbuf_dtob64_string(p1, 0); 80172683Smlaier ASSERT_PTR_NE(p, NULL); 81172683Smlaier ASSERT_STRING_EQ(p, "ESI="); 82172683Smlaier free(p); 83172683Smlaier sshbuf_free(p1); 84172683Smlaier TEST_DONE(); 85172683Smlaier 86172683Smlaier TEST_START("sshbuf_dtob64_string len 3"); 87172683Smlaier p1 = sshbuf_new(); 88172683Smlaier ASSERT_PTR_NE(p1, NULL); 89172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0); 90172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0); 91172683Smlaier ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x33), 0); 92172683Smlaier p = sshbuf_dtob64_string(p1, 0); 93214478Srpaulo ASSERT_PTR_NE(p, NULL); 94172683Smlaier ASSERT_STRING_EQ(p, "ESIz"); 95172683Smlaier free(p); 96172683Smlaier sshbuf_free(p1); 97172683Smlaier TEST_DONE(); 98172683Smlaier 99172683Smlaier TEST_START("sshbuf_dtob64_string len 8191"); 100172683Smlaier p1 = sshbuf_new(); 101172683Smlaier ASSERT_PTR_NE(p1, NULL); 102172683Smlaier ASSERT_INT_EQ(sshbuf_reserve(p1, 8192, NULL), 0); 103214478Srpaulo bzero(sshbuf_mutable_ptr(p1), 8192); 104214478Srpaulo p = sshbuf_dtob64_string(p1, 0); 105214478Srpaulo ASSERT_PTR_NE(p, NULL); 106214478Srpaulo ASSERT_SIZE_T_EQ(strlen(p), ((8191 + 2) / 3) * 4); 107214478Srpaulo free(p); 108214478Srpaulo sshbuf_free(p1); 109214478Srpaulo TEST_DONE(); 110214478Srpaulo 111214478Srpaulo TEST_START("sshbuf_b64tod len 1"); 112214478Srpaulo p1 = sshbuf_new(); 113172683Smlaier ASSERT_PTR_NE(p1, NULL); 114172683Smlaier ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A=="), 0); 115172683Smlaier ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 116172683Smlaier ASSERT_U8_EQ(*sshbuf_ptr(p1), 0xd0); 117172683Smlaier sshbuf_free(p1); 118172683Smlaier TEST_DONE(); 119172683Smlaier 120172683Smlaier TEST_START("sshbuf_b64tod len 2"); 121172683Smlaier p1 = sshbuf_new(); 122172683Smlaier ASSERT_PTR_NE(p1, NULL); 123172683Smlaier ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A8="), 0); 124172683Smlaier ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 125172683Smlaier ASSERT_U16_EQ(PEEK_U16(sshbuf_ptr(p1)), 0xd00f); 126172683Smlaier sshbuf_free(p1); 127172683Smlaier TEST_DONE(); 128172683Smlaier 129172683Smlaier TEST_START("sshbuf_b64tod len 4"); 130214478Srpaulo p1 = sshbuf_new(); 131172683Smlaier ASSERT_PTR_NE(p1, NULL); 132172683Smlaier ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A/QDw=="), 0); 133172683Smlaier ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 134172683Smlaier ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f); 135214478Srpaulo sshbuf_free(p1); 136214478Srpaulo TEST_DONE(); 137214478Srpaulo 138214478Srpaulo TEST_START("sshbuf_dup_string"); 139172683Smlaier p1 = sshbuf_new(); 140214478Srpaulo ASSERT_PTR_NE(p1, NULL); 141172683Smlaier /* Check empty buffer */ 142172683Smlaier p = sshbuf_dup_string(p1); 143172683Smlaier ASSERT_PTR_NE(p, NULL); 144172683Smlaier ASSERT_SIZE_T_EQ(strlen(p), 0); 145172683Smlaier free(p); 146172683Smlaier /* Check buffer with string */ 147172683Smlaier ASSERT_INT_EQ(sshbuf_put(p1, "quad1", strlen("quad1")), 0); 148172683Smlaier p = sshbuf_dup_string(p1); 149172683Smlaier ASSERT_PTR_NE(p, NULL); 150172683Smlaier ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1")); 151172683Smlaier ASSERT_STRING_EQ(p, "quad1"); 152172683Smlaier free(p); 153172683Smlaier /* Check buffer with terminating nul */ 154172683Smlaier ASSERT_INT_EQ(sshbuf_put(p1, "\0", 1), 0); 155172683Smlaier p = sshbuf_dup_string(p1); 156172683Smlaier ASSERT_PTR_NE(p, NULL); 157172683Smlaier ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1")); 158172683Smlaier ASSERT_STRING_EQ(p, "quad1"); 159214478Srpaulo free(p); 160172683Smlaier /* Check buffer with data after nul (expect failure) */ 161172683Smlaier ASSERT_INT_EQ(sshbuf_put(p1, "quad2", strlen("quad2")), 0); 162172683Smlaier p = sshbuf_dup_string(p1); 163172683Smlaier ASSERT_PTR_EQ(p, NULL); 164172683Smlaier sshbuf_free(p1); 165172683Smlaier TEST_DONE(); 166214478Srpaulo 167214478Srpaulo TEST_START("sshbuf_cmp"); 168214478Srpaulo p1 = sshbuf_from(msg, sizeof(msg) - 1); 169214478Srpaulo ASSERT_PTR_NE(p1, NULL); 170214478Srpaulo ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "i", 1), 0); 171214478Srpaulo ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "j", 1), SSH_ERR_INVALID_FORMAT); 172214478Srpaulo ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "imploring", 9), 0); 173172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 0, "implored", 9), SSH_ERR_INVALID_FORMAT); 174172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 10, "ping", 4), 0); 175172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 10, "ring", 4), SSH_ERR_INVALID_FORMAT); 176172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "over", 4), 0); 177172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "rove", 4), SSH_ERR_INVALID_FORMAT); 178172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 28, "overt", 5), 179172683Smlaier SSH_ERR_MESSAGE_INCOMPLETE); 180172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 32, "ping", 4), 181172683Smlaier SSH_ERR_MESSAGE_INCOMPLETE); 182172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 1000, "silence", 7), 183172683Smlaier SSH_ERR_MESSAGE_INCOMPLETE); 184172683Smlaier ASSERT_INT_EQ(sshbuf_cmp(p1, 0, msg, sizeof(msg) - 1), 0); 185214478Srpaulo TEST_DONE(); 186172683Smlaier 187214478Srpaulo TEST_START("sshbuf_find"); 188172683Smlaier p1 = sshbuf_from(msg, sizeof(msg) - 1); 189214478Srpaulo ASSERT_PTR_NE(p1, NULL); 190172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 0, "i", 1, &sz), 0); 191214478Srpaulo ASSERT_SIZE_T_EQ(sz, 0); 192172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 0, "j", 1, &sz), SSH_ERR_INVALID_FORMAT); 193172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 0, "imploring", 9, &sz), 0); 194172683Smlaier ASSERT_SIZE_T_EQ(sz, 0); 195172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 0, "implored", 9, &sz), 196172683Smlaier SSH_ERR_INVALID_FORMAT); 197172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 3, "ping", 4, &sz), 0); 198172683Smlaier ASSERT_SIZE_T_EQ(sz, 10); 199214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 11, "ping", 4, &sz), 0); 200214478Srpaulo ASSERT_SIZE_T_EQ(sz, 23); 201172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 20, "over", 4, &sz), 0); 202172683Smlaier ASSERT_SIZE_T_EQ(sz, 28); 203172683Smlaier ASSERT_INT_EQ(sshbuf_find(p1, 28, "over", 4, &sz), 0); 204214478Srpaulo ASSERT_SIZE_T_EQ(sz, 28); 205214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 28, "rove", 4, &sz), 206214478Srpaulo SSH_ERR_INVALID_FORMAT); 207214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 28, "overt", 5, &sz), 208214478Srpaulo SSH_ERR_MESSAGE_INCOMPLETE); 209214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 32, "ping", 4, &sz), 210214478Srpaulo SSH_ERR_MESSAGE_INCOMPLETE); 211214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 1000, "silence", 7, &sz), 212214478Srpaulo SSH_ERR_MESSAGE_INCOMPLETE); 213214478Srpaulo ASSERT_INT_EQ(sshbuf_find(p1, 0, msg + 1, sizeof(msg) - 2, &sz), 0); 214214478Srpaulo ASSERT_SIZE_T_EQ(sz, 1); 215214478Srpaulo TEST_DONE(); 216214478Srpaulo} 217214478Srpaulo 218214478Srpaulo