1*a0ee8cc6SDag-Erling Smørgrav /* $OpenBSD: test_sshbuf.c,v 1.1 2014/04/30 05:32:00 djm Exp $ */ 2*a0ee8cc6SDag-Erling Smørgrav /* 3*a0ee8cc6SDag-Erling Smørgrav * Regress test for sshbuf.h buffer API 4*a0ee8cc6SDag-Erling Smørgrav * 5*a0ee8cc6SDag-Erling Smørgrav * Placed in the public domain 6*a0ee8cc6SDag-Erling Smørgrav */ 7*a0ee8cc6SDag-Erling Smørgrav 8*a0ee8cc6SDag-Erling Smørgrav #define SSHBUF_INTERNAL 1 /* access internals for testing */ 9*a0ee8cc6SDag-Erling Smørgrav #include "includes.h" 10*a0ee8cc6SDag-Erling Smørgrav 11*a0ee8cc6SDag-Erling Smørgrav #include <sys/types.h> 12*a0ee8cc6SDag-Erling Smørgrav #include <sys/param.h> 13*a0ee8cc6SDag-Erling Smørgrav #include <stdio.h> 14*a0ee8cc6SDag-Erling Smørgrav #ifdef HAVE_STDINT_H 15*a0ee8cc6SDag-Erling Smørgrav # include <stdint.h> 16*a0ee8cc6SDag-Erling Smørgrav #endif 17*a0ee8cc6SDag-Erling Smørgrav #include <stdlib.h> 18*a0ee8cc6SDag-Erling Smørgrav #include <string.h> 19*a0ee8cc6SDag-Erling Smørgrav 20*a0ee8cc6SDag-Erling Smørgrav #include "../test_helper/test_helper.h" 21*a0ee8cc6SDag-Erling Smørgrav 22*a0ee8cc6SDag-Erling Smørgrav #include "ssherr.h" 23*a0ee8cc6SDag-Erling Smørgrav #include "sshbuf.h" 24*a0ee8cc6SDag-Erling Smørgrav 25*a0ee8cc6SDag-Erling Smørgrav void sshbuf_tests(void); 26*a0ee8cc6SDag-Erling Smørgrav 27*a0ee8cc6SDag-Erling Smørgrav void 28*a0ee8cc6SDag-Erling Smørgrav sshbuf_tests(void) 29*a0ee8cc6SDag-Erling Smørgrav { 30*a0ee8cc6SDag-Erling Smørgrav struct sshbuf *p1; 31*a0ee8cc6SDag-Erling Smørgrav const u_char *cdp; 32*a0ee8cc6SDag-Erling Smørgrav u_char *dp; 33*a0ee8cc6SDag-Erling Smørgrav size_t sz; 34*a0ee8cc6SDag-Erling Smørgrav int r; 35*a0ee8cc6SDag-Erling Smørgrav 36*a0ee8cc6SDag-Erling Smørgrav TEST_START("allocate sshbuf"); 37*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 38*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 39*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 40*a0ee8cc6SDag-Erling Smørgrav 41*a0ee8cc6SDag-Erling Smørgrav TEST_START("max size on fresh buffer"); 42*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_GT(sshbuf_max_size(p1), 0); 43*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 44*a0ee8cc6SDag-Erling Smørgrav 45*a0ee8cc6SDag-Erling Smørgrav TEST_START("available on fresh buffer"); 46*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_GT(sshbuf_avail(p1), 0); 47*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 48*a0ee8cc6SDag-Erling Smørgrav 49*a0ee8cc6SDag-Erling Smørgrav TEST_START("len = 0 on empty buffer"); 50*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 51*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 52*a0ee8cc6SDag-Erling Smørgrav 53*a0ee8cc6SDag-Erling Smørgrav TEST_START("set valid max size"); 54*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_set_max_size(p1, 65536), 0); 55*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 65536); 56*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 57*a0ee8cc6SDag-Erling Smørgrav 58*a0ee8cc6SDag-Erling Smørgrav TEST_START("available on limited buffer"); 59*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 65536); 60*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 61*a0ee8cc6SDag-Erling Smørgrav 62*a0ee8cc6SDag-Erling Smørgrav TEST_START("free"); 63*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 64*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 65*a0ee8cc6SDag-Erling Smørgrav 66*a0ee8cc6SDag-Erling Smørgrav TEST_START("consume on empty buffer"); 67*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 68*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 69*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 0), 0); 70*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 1), SSH_ERR_MESSAGE_INCOMPLETE); 71*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 72*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 73*a0ee8cc6SDag-Erling Smørgrav 74*a0ee8cc6SDag-Erling Smørgrav TEST_START("consume_end on empty buffer"); 75*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 76*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 77*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume_end(p1, 0), 0); 78*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), SSH_ERR_MESSAGE_INCOMPLETE); 79*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 80*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 81*a0ee8cc6SDag-Erling Smørgrav 82*a0ee8cc6SDag-Erling Smørgrav TEST_START("reserve space"); 83*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 84*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 85*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 1, &dp); 86*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 87*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 88*a0ee8cc6SDag-Erling Smørgrav *dp = 0x11; 89*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 3, &dp); 90*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 91*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 92*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x22; 93*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x33; 94*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x44; 95*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 96*a0ee8cc6SDag-Erling Smørgrav 97*a0ee8cc6SDag-Erling Smørgrav TEST_START("sshbuf_len on filled buffer"); 98*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 99*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 100*a0ee8cc6SDag-Erling Smørgrav 101*a0ee8cc6SDag-Erling Smørgrav TEST_START("sshbuf_ptr on filled buffer"); 102*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 103*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(cdp, NULL); 104*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[0], 0x11); 105*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[1], 0x22); 106*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[2], 0x33); 107*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[3], 0x44); 108*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 109*a0ee8cc6SDag-Erling Smørgrav 110*a0ee8cc6SDag-Erling Smørgrav TEST_START("consume on filled buffer"); 111*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 112*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 0), 0); 113*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 114*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_consume(p1, 64); 115*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 116*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 117*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 1), 0); 118*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 3); 119*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 120*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 121*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[0], 0x22); 122*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 2), 0); 123*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 124*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 125*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 126*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(cdp[0], 0x44); 127*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_consume(p1, 2); 128*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 129*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 130*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 1), 0); 131*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 132*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_consume(p1, 1); 133*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 134*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 135*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 136*a0ee8cc6SDag-Erling Smørgrav 137*a0ee8cc6SDag-Erling Smørgrav TEST_START("consume_end on filled buffer"); 138*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 139*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 140*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 4, &dp); 141*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 142*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 143*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x11; 144*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x22; 145*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x33; 146*a0ee8cc6SDag-Erling Smørgrav *dp++ = 0x44; 147*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 148*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_consume_end(p1, 5); 149*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 150*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 151*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume_end(p1, 3), 0); 152*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 153*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 154*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(cdp, NULL); 155*a0ee8cc6SDag-Erling Smørgrav ASSERT_U8_EQ(*cdp, 0x11); 156*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_consume_end(p1, 2); 157*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 158*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), 0); 159*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 160*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 161*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 162*a0ee8cc6SDag-Erling Smørgrav 163*a0ee8cc6SDag-Erling Smørgrav TEST_START("fill limited buffer"); 164*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 165*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 166*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1223), 0); 167*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223); 168*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 1223); 169*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 1223, &dp); 170*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 171*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 172*a0ee8cc6SDag-Erling Smørgrav memset(dp, 0xd7, 1223); 173*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1223); 174*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 0); 175*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 1, &dp); 176*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 177*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_EQ(dp, NULL); 178*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 179*a0ee8cc6SDag-Erling Smørgrav 180*a0ee8cc6SDag-Erling Smørgrav TEST_START("consume and force compaction"); 181*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_consume(p1, 223), 0); 182*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1000); 183*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 223); 184*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 224, &dp); 185*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 186*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_EQ(dp, NULL); 187*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1000); 188*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 223); 189*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 223, &dp); 190*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 191*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 192*a0ee8cc6SDag-Erling Smørgrav memset(dp, 0x7d, 223); 193*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 194*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(cdp, NULL); 195*a0ee8cc6SDag-Erling Smørgrav ASSERT_MEM_FILLED_EQ(cdp, 0xd7, 1000); 196*a0ee8cc6SDag-Erling Smørgrav ASSERT_MEM_FILLED_EQ(cdp + 1000, 0x7d, 223); 197*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 198*a0ee8cc6SDag-Erling Smørgrav 199*a0ee8cc6SDag-Erling Smørgrav TEST_START("resize full buffer"); 200*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_set_max_size(p1, 1000); 201*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 202*a0ee8cc6SDag-Erling Smørgrav sz = roundup(1223 + SSHBUF_SIZE_INC * 3, SSHBUF_SIZE_INC); 203*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_set_max_size(p1, sz), 0); 204*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), sz); 205*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), sz - 1223); 206*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_len(p1), 1223); 207*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 208*a0ee8cc6SDag-Erling Smørgrav 209*a0ee8cc6SDag-Erling Smørgrav /* NB. uses sshbuf internals */ 210*a0ee8cc6SDag-Erling Smørgrav TEST_START("alloc chunking"); 211*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 1, &dp); 212*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 213*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 214*a0ee8cc6SDag-Erling Smørgrav *dp = 0xff; 215*a0ee8cc6SDag-Erling Smørgrav cdp = sshbuf_ptr(p1); 216*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(cdp, NULL); 217*a0ee8cc6SDag-Erling Smørgrav ASSERT_MEM_FILLED_EQ(cdp, 0xd7, 1000); 218*a0ee8cc6SDag-Erling Smørgrav ASSERT_MEM_FILLED_EQ(cdp + 1000, 0x7d, 223); 219*a0ee8cc6SDag-Erling Smørgrav ASSERT_MEM_FILLED_EQ(cdp + 1223, 0xff, 1); 220*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_alloc(p1) % SSHBUF_SIZE_INC, 0); 221*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 222*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 223*a0ee8cc6SDag-Erling Smørgrav 224*a0ee8cc6SDag-Erling Smørgrav TEST_START("reset buffer"); 225*a0ee8cc6SDag-Erling Smørgrav p1 = sshbuf_new(); 226*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(p1, NULL); 227*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1223), 0); 228*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223); 229*a0ee8cc6SDag-Erling Smørgrav r = sshbuf_reserve(p1, 1223, &dp); 230*a0ee8cc6SDag-Erling Smørgrav ASSERT_INT_EQ(r, 0); 231*a0ee8cc6SDag-Erling Smørgrav ASSERT_PTR_NE(dp, NULL); 232*a0ee8cc6SDag-Erling Smørgrav memset(dp, 0xd7, 1223); 233*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1223); 234*a0ee8cc6SDag-Erling Smørgrav sshbuf_reset(p1); 235*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_max_size(p1), 1223); 236*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 237*a0ee8cc6SDag-Erling Smørgrav ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 1223); 238*a0ee8cc6SDag-Erling Smørgrav sshbuf_free(p1); 239*a0ee8cc6SDag-Erling Smørgrav TEST_DONE(); 240*a0ee8cc6SDag-Erling Smørgrav } 241