1276707Sdes/* $OpenBSD: test_sshbuf_getput_basic.c,v 1.1 2014/04/30 05:32:00 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#include "ssherr.h" 21276707Sdes#include "sshbuf.h" 22276707Sdes 23276707Sdesvoid sshbuf_getput_basic_tests(void); 24276707Sdes 25276707Sdesvoid 26276707Sdessshbuf_getput_basic_tests(void) 27276707Sdes{ 28276707Sdes struct sshbuf *p1, *p2; 29276707Sdes const u_char *cd; 30276707Sdes u_char *d, d2[32], x[] = { 31276707Sdes 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x00, 0x99 32276707Sdes }; 33276707Sdes u_int64_t v64; 34276707Sdes u_int32_t v32; 35276707Sdes u_int16_t v16; 36276707Sdes u_char v8; 37276707Sdes size_t s; 38276707Sdes char *s2; 39276707Sdes int r; 40276707Sdes u_char bn1[] = { 0x00, 0x00, 0x00 }; 41276707Sdes u_char bn2[] = { 0x00, 0x00, 0x01, 0x02 }; 42276707Sdes u_char bn3[] = { 0x00, 0x80, 0x09 }; 43276707Sdes u_char bn_exp1[] = { 0x00, 0x00, 0x00, 0x00 }; 44276707Sdes u_char bn_exp2[] = { 0x00, 0x00, 0x00, 0x02, 0x01, 0x02 }; 45276707Sdes u_char bn_exp3[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x80, 0x09 }; 46276707Sdes 47276707Sdes TEST_START("PEEK_U64"); 48276707Sdes ASSERT_U64_EQ(PEEK_U64(x), 0x1122334455667788ULL); 49276707Sdes TEST_DONE(); 50276707Sdes 51276707Sdes TEST_START("PEEK_U32"); 52276707Sdes ASSERT_U32_EQ(PEEK_U32(x), 0x11223344); 53276707Sdes TEST_DONE(); 54276707Sdes 55276707Sdes TEST_START("PEEK_U16"); 56276707Sdes ASSERT_U16_EQ(PEEK_U16(x), 0x1122); 57276707Sdes TEST_DONE(); 58276707Sdes 59276707Sdes TEST_START("POKE_U64"); 60276707Sdes bzero(d2, sizeof(d2)); 61276707Sdes POKE_U64(d2, 0x1122334455667788ULL); 62276707Sdes ASSERT_MEM_EQ(d2, x, 8); 63276707Sdes TEST_DONE(); 64276707Sdes 65276707Sdes TEST_START("POKE_U32"); 66276707Sdes bzero(d2, sizeof(d2)); 67276707Sdes POKE_U32(d2, 0x11223344); 68276707Sdes ASSERT_MEM_EQ(d2, x, 4); 69276707Sdes TEST_DONE(); 70276707Sdes 71276707Sdes TEST_START("POKE_U16"); 72276707Sdes bzero(d2, sizeof(d2)); 73276707Sdes POKE_U16(d2, 0x1122); 74276707Sdes ASSERT_MEM_EQ(d2, x, 2); 75276707Sdes TEST_DONE(); 76276707Sdes 77276707Sdes TEST_START("sshbuf_put"); 78276707Sdes p1 = sshbuf_new(); 79276707Sdes ASSERT_PTR_NE(p1, NULL); 80276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, 5), 0); 81276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); 82276707Sdes cd = sshbuf_ptr(p1); 83276707Sdes ASSERT_PTR_NE(cd, NULL); 84276707Sdes ASSERT_U8_EQ(cd[0], 0x11); 85276707Sdes ASSERT_U8_EQ(cd[1], 0x22); 86276707Sdes ASSERT_U8_EQ(cd[2], 0x33); 87276707Sdes ASSERT_U8_EQ(cd[3], 0x44); 88276707Sdes ASSERT_U8_EQ(cd[4], 0x55); 89276707Sdes TEST_DONE(); 90276707Sdes 91276707Sdes TEST_START("sshbuf_get"); 92276707Sdes ASSERT_INT_EQ(sshbuf_get(p1, d2, 4), 0); 93276707Sdes ASSERT_MEM_EQ(d2, x, 4); 94276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 95276707Sdes ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55); 96276707Sdes TEST_DONE(); 97276707Sdes 98276707Sdes TEST_START("sshbuf_get truncated"); 99276707Sdes r = sshbuf_get(p1, d2, 4); 100276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 101276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 102276707Sdes ASSERT_U8_EQ(*(sshbuf_ptr(p1)), 0x55); 103276707Sdes TEST_DONE(); 104276707Sdes 105276707Sdes TEST_START("sshbuf_put truncated"); 106276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0); 107276707Sdes r = sshbuf_put(p1, x, 5); 108276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 109276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 110276707Sdes sshbuf_free(p1); 111276707Sdes TEST_DONE(); 112276707Sdes 113276707Sdes TEST_START("sshbuf_get_u64"); 114276707Sdes p1 = sshbuf_new(); 115276707Sdes ASSERT_PTR_NE(p1, NULL); 116276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0); 117276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10); 118276707Sdes ASSERT_INT_EQ(sshbuf_get_u64(p1, &v64), 0); 119276707Sdes ASSERT_U64_EQ(v64, 0x1122334455667788ULL); 120276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 121276707Sdes TEST_DONE(); 122276707Sdes 123276707Sdes TEST_START("sshbuf_get_u64 truncated"); 124276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 125276707Sdes r = sshbuf_get_u64(p1, &v64); 126276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 127276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 128276707Sdes sshbuf_free(p1); 129276707Sdes TEST_DONE(); 130276707Sdes 131276707Sdes TEST_START("sshbuf_get_u32"); 132276707Sdes p1 = sshbuf_new(); 133276707Sdes ASSERT_PTR_NE(p1, NULL); 134276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, 10), 0); 135276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 10); 136276707Sdes ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0); 137276707Sdes ASSERT_U32_EQ(v32, 0x11223344); 138276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 6); 139276707Sdes ASSERT_INT_EQ(sshbuf_get_u32(p1, &v32), 0); 140276707Sdes ASSERT_U32_EQ(v32, 0x55667788); 141276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 142276707Sdes TEST_DONE(); 143276707Sdes 144276707Sdes TEST_START("sshbuf_get_u32 truncated"); 145276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 146276707Sdes r = sshbuf_get_u32(p1, &v32); 147276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 148276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 149276707Sdes sshbuf_free(p1); 150276707Sdes TEST_DONE(); 151276707Sdes 152276707Sdes TEST_START("sshbuf_get_u16"); 153276707Sdes p1 = sshbuf_new(); 154276707Sdes ASSERT_PTR_NE(p1, NULL); 155276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, 9), 0); 156276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 9); 157276707Sdes ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0); 158276707Sdes ASSERT_U16_EQ(v16, 0x1122); 159276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 7); 160276707Sdes ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0); 161276707Sdes ASSERT_U16_EQ(v16, 0x3344); 162276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 5); 163276707Sdes ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0); 164276707Sdes ASSERT_U16_EQ(v16, 0x5566); 165276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 3); 166276707Sdes ASSERT_INT_EQ(sshbuf_get_u16(p1, &v16), 0); 167276707Sdes ASSERT_U16_EQ(v16, 0x7788); 168276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 169276707Sdes TEST_DONE(); 170276707Sdes 171276707Sdes TEST_START("sshbuf_get_u16 truncated"); 172276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 173276707Sdes r = sshbuf_get_u16(p1, &v16); 174276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 175276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 176276707Sdes sshbuf_free(p1); 177276707Sdes TEST_DONE(); 178276707Sdes 179276707Sdes TEST_START("sshbuf_get_u8"); 180276707Sdes p1 = sshbuf_new(); 181276707Sdes ASSERT_PTR_NE(p1, NULL); 182276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, 2), 0); 183276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 184276707Sdes ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0); 185276707Sdes ASSERT_U8_EQ(v8, 0x11); 186276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1); 187276707Sdes ASSERT_INT_EQ(sshbuf_get_u8(p1, &v8), 0); 188276707Sdes ASSERT_U8_EQ(v8, 0x22); 189276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 190276707Sdes TEST_DONE(); 191276707Sdes 192276707Sdes TEST_START("sshbuf_get_u8 truncated"); 193276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 194276707Sdes r = sshbuf_get_u8(p1, &v8); 195276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 196276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 197276707Sdes sshbuf_free(p1); 198276707Sdes TEST_DONE(); 199276707Sdes 200276707Sdes TEST_START("sshbuf_put_u64"); 201276707Sdes p1 = sshbuf_new(); 202276707Sdes ASSERT_PTR_NE(p1, NULL); 203276707Sdes ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0); 204276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8); 205276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8); 206276707Sdes sshbuf_free(p1); 207276707Sdes TEST_DONE(); 208276707Sdes 209276707Sdes TEST_START("sshbuf_put_u64 exact"); 210276707Sdes p1 = sshbuf_new(); 211276707Sdes ASSERT_PTR_NE(p1, NULL); 212276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 8), 0); 213276707Sdes ASSERT_INT_EQ(sshbuf_put_u64(p1, 0x1122334455667788ULL), 0); 214276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 8); 215276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 8); 216276707Sdes sshbuf_free(p1); 217276707Sdes TEST_DONE(); 218276707Sdes 219276707Sdes TEST_START("sshbuf_put_u64 limited"); 220276707Sdes p1 = sshbuf_new(); 221276707Sdes ASSERT_PTR_NE(p1, NULL); 222276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 7), 0); 223276707Sdes r = sshbuf_put_u64(p1, 0x1122334455667788ULL); 224276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 225276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 226276707Sdes sshbuf_free(p1); 227276707Sdes TEST_DONE(); 228276707Sdes 229276707Sdes TEST_START("sshbuf_put_u32"); 230276707Sdes p1 = sshbuf_new(); 231276707Sdes ASSERT_PTR_NE(p1, NULL); 232276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0); 233276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 234276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4); 235276707Sdes sshbuf_free(p1); 236276707Sdes TEST_DONE(); 237276707Sdes 238276707Sdes TEST_START("sshbuf_put_u32 exact"); 239276707Sdes p1 = sshbuf_new(); 240276707Sdes ASSERT_PTR_NE(p1, NULL); 241276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 4), 0); 242276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x11223344), 0); 243276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 244276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 4); 245276707Sdes sshbuf_free(p1); 246276707Sdes TEST_DONE(); 247276707Sdes 248276707Sdes TEST_START("sshbuf_put_u32 limited"); 249276707Sdes p1 = sshbuf_new(); 250276707Sdes ASSERT_PTR_NE(p1, NULL); 251276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 3), 0); 252276707Sdes r = sshbuf_put_u32(p1, 0x11223344); 253276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 254276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 255276707Sdes sshbuf_free(p1); 256276707Sdes TEST_DONE(); 257276707Sdes 258276707Sdes TEST_START("sshbuf_put_u16"); 259276707Sdes p1 = sshbuf_new(); 260276707Sdes ASSERT_PTR_NE(p1, NULL); 261276707Sdes ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0); 262276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 263276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2); 264276707Sdes sshbuf_free(p1); 265276707Sdes TEST_DONE(); 266276707Sdes 267276707Sdes TEST_START("sshbuf_put_u16"); 268276707Sdes p1 = sshbuf_new(); 269276707Sdes ASSERT_PTR_NE(p1, NULL); 270276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 2), 0); 271276707Sdes ASSERT_INT_EQ(sshbuf_put_u16(p1, 0x1122), 0); 272276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2); 273276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), x, 2); 274276707Sdes sshbuf_free(p1); 275276707Sdes TEST_DONE(); 276276707Sdes 277276707Sdes TEST_START("sshbuf_put_u16 limited"); 278276707Sdes p1 = sshbuf_new(); 279276707Sdes ASSERT_PTR_NE(p1, NULL); 280276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, 1), 0); 281276707Sdes r = sshbuf_put_u16(p1, 0x1122); 282276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 283276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 284276707Sdes sshbuf_free(p1); 285276707Sdes TEST_DONE(); 286276707Sdes 287276707Sdes TEST_START("sshbuf_get_string"); 288276707Sdes p1 = sshbuf_new(); 289276707Sdes ASSERT_PTR_NE(p1, NULL); 290276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0); 291276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 292276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0); 293276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 + 4); 294276707Sdes ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0); 295276707Sdes ASSERT_SIZE_T_EQ(s, sizeof(x)); 296276707Sdes ASSERT_MEM_EQ(d, x, sizeof(x)); 297276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4); 298276707Sdes free(d); 299276707Sdes sshbuf_free(p1); 300276707Sdes TEST_DONE(); 301276707Sdes 302276707Sdes TEST_START("sshbuf_get_string exact"); 303276707Sdes p1 = sshbuf_new(); 304276707Sdes ASSERT_PTR_NE(p1, NULL); 305276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4), 0); 306276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0); 307276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 308276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 309276707Sdes ASSERT_INT_EQ(sshbuf_get_string(p1, &d, &s), 0); 310276707Sdes ASSERT_SIZE_T_EQ(s, sizeof(x)); 311276707Sdes ASSERT_MEM_EQ(d, x, sizeof(x)); 312276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 313276707Sdes free(d); 314276707Sdes sshbuf_free(p1); 315276707Sdes TEST_DONE(); 316276707Sdes 317276707Sdes TEST_START("sshbuf_get_string truncated"); 318276707Sdes p1 = sshbuf_new(); 319276707Sdes ASSERT_PTR_NE(p1, NULL); 320276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0); 321276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 322276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 323276707Sdes ASSERT_INT_EQ(sshbuf_consume_end(p1, 1), 0); 324276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3); 325276707Sdes r = sshbuf_get_string(p1, &d, &s); 326276707Sdes ASSERT_INT_EQ(r, SSH_ERR_MESSAGE_INCOMPLETE); 327276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 3); 328276707Sdes sshbuf_free(p1); 329276707Sdes TEST_DONE(); 330276707Sdes 331276707Sdes TEST_START("sshbuf_get_string giant"); 332276707Sdes p1 = sshbuf_new(); 333276707Sdes ASSERT_PTR_NE(p1, NULL); 334276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0); 335276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 336276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 337276707Sdes r = sshbuf_get_string(p1, &d, &s); 338276707Sdes ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE); 339276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 340276707Sdes sshbuf_free(p1); 341276707Sdes TEST_DONE(); 342276707Sdes 343276707Sdes TEST_START("sshbuf_get_cstring giant"); 344276707Sdes p1 = sshbuf_new(); 345276707Sdes ASSERT_PTR_NE(p1, NULL); 346276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, 0xffffffff), 0); 347276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 348276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 349276707Sdes r = sshbuf_get_cstring(p1, &s2, &s); 350276707Sdes ASSERT_INT_EQ(r, SSH_ERR_STRING_TOO_LARGE); 351276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 352276707Sdes sshbuf_free(p1); 353276707Sdes TEST_DONE(); 354276707Sdes 355276707Sdes TEST_START("sshbuf_get_cstring embedded \\0"); 356276707Sdes p1 = sshbuf_new(); 357276707Sdes ASSERT_PTR_NE(p1, NULL); 358276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x)), 0); 359276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x)), 0); 360276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 361276707Sdes r = sshbuf_get_cstring(p1, &s2, NULL); 362276707Sdes ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); 363276707Sdes sshbuf_free(p1); 364276707Sdes TEST_DONE(); 365276707Sdes 366276707Sdes TEST_START("sshbuf_get_cstring trailing \\0"); 367276707Sdes p1 = sshbuf_new(); 368276707Sdes ASSERT_PTR_NE(p1, NULL); 369276707Sdes ASSERT_INT_EQ(sshbuf_put_u32(p1, sizeof(x) - 1), 0); 370276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, x, sizeof(x) - 1), 0); 371276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4 - 1); 372276707Sdes ASSERT_INT_EQ(sshbuf_get_cstring(p1, &s2, &s), 0); 373276707Sdes ASSERT_SIZE_T_EQ(s, sizeof(x) - 1); 374276707Sdes ASSERT_MEM_EQ(s2, x, s); 375276707Sdes free(s2); 376276707Sdes sshbuf_free(p1); 377276707Sdes TEST_DONE(); 378276707Sdes 379276707Sdes TEST_START("sshbuf_put_string"); 380276707Sdes p1 = sshbuf_new(); 381276707Sdes ASSERT_PTR_NE(p1, NULL); 382276707Sdes ASSERT_INT_EQ(sshbuf_put_string(p1, x, sizeof(x)), 0); 383276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(x) + 4); 384276707Sdes ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), sizeof(x)); 385276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1) + 4, x, sizeof(x)); 386276707Sdes sshbuf_free(p1); 387276707Sdes TEST_DONE(); 388276707Sdes 389276707Sdes TEST_START("sshbuf_put_string limited"); 390276707Sdes p1 = sshbuf_new(); 391276707Sdes ASSERT_PTR_NE(p1, NULL); 392276707Sdes ASSERT_INT_EQ(sshbuf_set_max_size(p1, sizeof(x) + 4 - 1), 0); 393276707Sdes r = sshbuf_put_string(p1, x, sizeof(x)); 394276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 395276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 396276707Sdes sshbuf_free(p1); 397276707Sdes TEST_DONE(); 398276707Sdes 399276707Sdes TEST_START("sshbuf_put_string giant"); 400276707Sdes p1 = sshbuf_new(); 401276707Sdes ASSERT_PTR_NE(p1, NULL); 402276707Sdes r = sshbuf_put_string(p1, (void *)0x01, 0xfffffffc); 403276707Sdes ASSERT_INT_EQ(r, SSH_ERR_NO_BUFFER_SPACE); 404276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0); 405276707Sdes sshbuf_free(p1); 406276707Sdes TEST_DONE(); 407276707Sdes 408276707Sdes TEST_START("sshbuf_putf"); 409276707Sdes p1 = sshbuf_new(); 410276707Sdes ASSERT_PTR_NE(p1, NULL); 411276707Sdes r = sshbuf_putf(p1, "%s %d %x", "hello", 23, 0x5f); 412276707Sdes ASSERT_INT_EQ(r, 0); 413276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), 11); 414276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), "hello 23 5f", 11); 415276707Sdes sshbuf_free(p1); 416276707Sdes TEST_DONE(); 417276707Sdes 418276707Sdes TEST_START("sshbuf_putb"); 419276707Sdes p1 = sshbuf_new(); 420276707Sdes ASSERT_PTR_NE(p1, NULL); 421276707Sdes p2 = sshbuf_new(); 422276707Sdes ASSERT_PTR_NE(p2, NULL); 423276707Sdes ASSERT_INT_EQ(sshbuf_put(p1, "blahblahblah", 12), 0); 424276707Sdes ASSERT_INT_EQ(sshbuf_putb(p2, p1), 0); 425276707Sdes sshbuf_free(p1); 426276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p2), 12); 427276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p2), "blahblahblah", 12); 428276707Sdes sshbuf_free(p2); 429276707Sdes TEST_DONE(); 430276707Sdes 431276707Sdes TEST_START("sshbuf_put_bignum2_bytes empty buf"); 432276707Sdes p1 = sshbuf_new(); 433276707Sdes ASSERT_PTR_NE(p1, NULL); 434276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, NULL, 0), 0); 435276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1)); 436276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1)); 437276707Sdes sshbuf_free(p1); 438276707Sdes TEST_DONE(); 439276707Sdes 440276707Sdes TEST_START("sshbuf_put_bignum2_bytes all zeroes"); 441276707Sdes p1 = sshbuf_new(); 442276707Sdes ASSERT_PTR_NE(p1, NULL); 443276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn1, sizeof(bn1)), 0); 444276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp1)); 445276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp1, sizeof(bn_exp1)); 446276707Sdes sshbuf_free(p1); 447276707Sdes TEST_DONE(); 448276707Sdes 449276707Sdes TEST_START("sshbuf_put_bignum2_bytes simple"); 450276707Sdes p1 = sshbuf_new(); 451276707Sdes ASSERT_PTR_NE(p1, NULL); 452276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2+2, sizeof(bn2)-2), 0); 453276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2)); 454276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2)); 455276707Sdes sshbuf_free(p1); 456276707Sdes TEST_DONE(); 457276707Sdes 458276707Sdes TEST_START("sshbuf_put_bignum2_bytes leading zero"); 459276707Sdes p1 = sshbuf_new(); 460276707Sdes ASSERT_PTR_NE(p1, NULL); 461276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn2, sizeof(bn2)), 0); 462276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp2)); 463276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp2, sizeof(bn_exp2)); 464276707Sdes sshbuf_free(p1); 465276707Sdes TEST_DONE(); 466276707Sdes 467276707Sdes TEST_START("sshbuf_put_bignum2_bytes neg"); 468276707Sdes p1 = sshbuf_new(); 469276707Sdes ASSERT_PTR_NE(p1, NULL); 470276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3+1, sizeof(bn3)-1), 0); 471276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3)); 472276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3)); 473276707Sdes sshbuf_free(p1); 474276707Sdes TEST_DONE(); 475276707Sdes 476276707Sdes TEST_START("sshbuf_put_bignum2_bytes neg and leading zero"); 477276707Sdes p1 = sshbuf_new(); 478276707Sdes ASSERT_PTR_NE(p1, NULL); 479276707Sdes ASSERT_INT_EQ(sshbuf_put_bignum2_bytes(p1, bn3, sizeof(bn3)), 0); 480276707Sdes ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(bn_exp3)); 481276707Sdes ASSERT_MEM_EQ(sshbuf_ptr(p1), bn_exp3, sizeof(bn_exp3)); 482276707Sdes sshbuf_free(p1); 483276707Sdes TEST_DONE(); 484276707Sdes} 485