Home | History | Annotate | Download | only in sshbuf
      1 /* 	$OpenBSD: test_sshbuf_fixed.c,v 1.1 2014/04/30 05:32:00 djm Exp $ */
      2 /*
      3  * Regress test for sshbuf.h buffer API
      4  *
      5  * Placed in the public domain
      6  */
      7 
      8 #define SSHBUF_INTERNAL 1  /* access internals for testing */
      9 #include "includes.h"
     10 
     11 #include <sys/types.h>
     12 #include <sys/param.h>
     13 #include <stdio.h>
     14 #ifdef HAVE_STDINT_H
     15 # include <stdint.h>
     16 #endif
     17 #include <stdlib.h>
     18 #include <string.h>
     19 
     20 #include "../test_helper/test_helper.h"
     21 
     22 #include "sshbuf.h"
     23 #include "ssherr.h"
     24 
     25 void sshbuf_fixed(void);
     26 
     27 const u_char test_buf[] = "\x01\x12\x34\x56\x78\x00\x00\x00\x05hello";
     28 
     29 void
     30 sshbuf_fixed(void)
     31 {
     32 	struct sshbuf *p1, *p2, *p3;
     33 	u_char c;
     34 	char *s;
     35 	u_int i;
     36 	size_t l;
     37 
     38 	TEST_START("sshbuf_from");
     39 	p1 = sshbuf_from(test_buf, sizeof(test_buf));
     40 	ASSERT_PTR_NE(p1, NULL);
     41 	ASSERT_PTR_EQ(sshbuf_mutable_ptr(p1), NULL);
     42 	ASSERT_INT_EQ(sshbuf_check_reserve(p1, 1), SSH_ERR_BUFFER_READ_ONLY);
     43 	ASSERT_INT_EQ(sshbuf_reserve(p1, 1, NULL), SSH_ERR_BUFFER_READ_ONLY);
     44 	ASSERT_INT_EQ(sshbuf_set_max_size(p1, 200), SSH_ERR_BUFFER_READ_ONLY);
     45 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), SSH_ERR_BUFFER_READ_ONLY);
     46 	ASSERT_SIZE_T_EQ(sshbuf_avail(p1), 0);
     47 	ASSERT_PTR_EQ(sshbuf_ptr(p1), test_buf);
     48 	sshbuf_free(p1);
     49 	TEST_DONE();
     50 
     51 	TEST_START("sshbuf_from data");
     52 	p1 = sshbuf_from(test_buf, sizeof(test_buf) - 1);
     53 	ASSERT_PTR_NE(p1, NULL);
     54 	ASSERT_PTR_EQ(sshbuf_ptr(p1), test_buf);
     55 	ASSERT_INT_EQ(sshbuf_get_u8(p1, &c), 0);
     56 	ASSERT_PTR_EQ(sshbuf_ptr(p1), test_buf + 1);
     57 	ASSERT_U8_EQ(c, 1);
     58 	ASSERT_INT_EQ(sshbuf_get_u32(p1, &i), 0);
     59 	ASSERT_PTR_EQ(sshbuf_ptr(p1), test_buf + 5);
     60 	ASSERT_U32_EQ(i, 0x12345678);
     61 	ASSERT_INT_EQ(sshbuf_get_cstring(p1, &s, &l), 0);
     62 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 0);
     63 	ASSERT_STRING_EQ(s, "hello");
     64 	ASSERT_SIZE_T_EQ(l, 5);
     65 	sshbuf_free(p1);
     66 	free(s);
     67 	TEST_DONE();
     68 
     69 	TEST_START("sshbuf_fromb ");
     70 	p1 = sshbuf_new();
     71 	ASSERT_PTR_NE(p1, NULL);
     72 	ASSERT_U_INT_EQ(sshbuf_refcount(p1), 1);
     73 	ASSERT_PTR_EQ(sshbuf_parent(p1), NULL);
     74 	ASSERT_INT_EQ(sshbuf_put(p1, test_buf, sizeof(test_buf) - 1), 0);
     75 	p2 = sshbuf_fromb(p1);
     76 	ASSERT_PTR_NE(p2, NULL);
     77 	ASSERT_U_INT_EQ(sshbuf_refcount(p1), 2);
     78 	ASSERT_PTR_EQ(sshbuf_parent(p1), NULL);
     79 	ASSERT_PTR_EQ(sshbuf_parent(p2), p1);
     80 	ASSERT_PTR_EQ(sshbuf_ptr(p2), sshbuf_ptr(p1));
     81 	ASSERT_PTR_NE(sshbuf_ptr(p1), NULL);
     82 	ASSERT_PTR_NE(sshbuf_ptr(p2), NULL);
     83 	ASSERT_PTR_EQ(sshbuf_mutable_ptr(p1), NULL);
     84 	ASSERT_PTR_EQ(sshbuf_mutable_ptr(p2), NULL);
     85 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sshbuf_len(p2));
     86 	ASSERT_INT_EQ(sshbuf_get_u8(p2, &c), 0);
     87 	ASSERT_PTR_EQ(sshbuf_ptr(p2), sshbuf_ptr(p1) + 1);
     88 	ASSERT_U8_EQ(c, 1);
     89 	ASSERT_INT_EQ(sshbuf_get_u32(p2, &i), 0);
     90 	ASSERT_PTR_EQ(sshbuf_ptr(p2), sshbuf_ptr(p1) + 5);
     91 	ASSERT_U32_EQ(i, 0x12345678);
     92 	ASSERT_INT_EQ(sshbuf_get_cstring(p2, &s, &l), 0);
     93 	ASSERT_SIZE_T_EQ(sshbuf_len(p2), 0);
     94 	ASSERT_STRING_EQ(s, "hello");
     95 	ASSERT_SIZE_T_EQ(l, 5);
     96 	sshbuf_free(p1);
     97 	ASSERT_U_INT_EQ(sshbuf_refcount(p1), 1);
     98 	sshbuf_free(p2);
     99 	free(s);
    100 	TEST_DONE();
    101 
    102 	TEST_START("sshbuf_froms");
    103 	p1 = sshbuf_new();
    104 	ASSERT_PTR_NE(p1, NULL);
    105 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x01), 0);
    106 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
    107 	ASSERT_INT_EQ(sshbuf_put_cstring(p1, "hello"), 0);
    108 	p2 = sshbuf_new();
    109 	ASSERT_PTR_NE(p2, NULL);
    110 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), sizeof(test_buf) - 1);
    111 	ASSERT_INT_EQ(sshbuf_put_stringb(p2, p1), 0);
    112 	ASSERT_SIZE_T_EQ(sshbuf_len(p2), sizeof(test_buf) + 4 - 1);
    113 	ASSERT_INT_EQ(sshbuf_froms(p2, &p3), 0);
    114 	ASSERT_SIZE_T_EQ(sshbuf_len(p2), 0);
    115 	ASSERT_PTR_NE(p3, NULL);
    116 	ASSERT_PTR_NE(sshbuf_ptr(p3), NULL);
    117 	ASSERT_SIZE_T_EQ(sshbuf_len(p3), sizeof(test_buf) - 1);
    118 	ASSERT_MEM_EQ(sshbuf_ptr(p3), test_buf, sizeof(test_buf) - 1);
    119 	sshbuf_free(p3);
    120 	ASSERT_INT_EQ(sshbuf_put_stringb(p2, p1), 0);
    121 	ASSERT_INT_EQ(sshbuf_consume_end(p2, 1), 0);
    122 	ASSERT_INT_EQ(sshbuf_froms(p2, &p3), SSH_ERR_MESSAGE_INCOMPLETE);
    123 	ASSERT_PTR_EQ(p3, NULL);
    124 	sshbuf_free(p2);
    125 	sshbuf_free(p1);
    126 }
    127