Home | History | Annotate | Download | only in sshbuf
      1 /* 	$OpenBSD: test_sshbuf_misc.c,v 1.2 2016/05/03 13:48:33 djm Exp $ */
      2 /*
      3  * Regress test for sshbuf.h buffer API
      4  *
      5  * Placed in the public domain
      6  */
      7 
      8 #include "includes.h"
      9 
     10 #include <sys/types.h>
     11 #include <sys/param.h>
     12 #include <stdio.h>
     13 #ifdef HAVE_STDINT_H
     14 # include <stdint.h>
     15 #endif
     16 #include <stdlib.h>
     17 #include <string.h>
     18 
     19 #include "../test_helper/test_helper.h"
     20 
     21 #include "sshbuf.h"
     22 
     23 void sshbuf_misc_tests(void);
     24 
     25 void
     26 sshbuf_misc_tests(void)
     27 {
     28 	struct sshbuf *p1;
     29 	char tmp[512], *p;
     30 	FILE *out;
     31 	size_t sz;
     32 
     33 	TEST_START("sshbuf_dump");
     34 	out = tmpfile();
     35 	ASSERT_PTR_NE(out, NULL);
     36 	p1 = sshbuf_new();
     37 	ASSERT_PTR_NE(p1, NULL);
     38 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
     39 	sshbuf_dump(p1, out);
     40 	fflush(out);
     41 	rewind(out);
     42 	sz = fread(tmp, 1, sizeof(tmp), out);
     43 	ASSERT_INT_EQ(ferror(out), 0);
     44 	ASSERT_INT_NE(feof(out), 0);
     45 	ASSERT_SIZE_T_GT(sz, 0);
     46 	tmp[sz] = '\0';
     47 	ASSERT_PTR_NE(strstr(tmp, "12 34 56 78"), NULL);
     48 	fclose(out);
     49 	sshbuf_free(p1);
     50 	TEST_DONE();
     51 
     52 	TEST_START("sshbuf_dtob16");
     53 	p1 = sshbuf_new();
     54 	ASSERT_PTR_NE(p1, NULL);
     55 	ASSERT_INT_EQ(sshbuf_put_u32(p1, 0x12345678), 0);
     56 	p = sshbuf_dtob16(p1);
     57 	ASSERT_PTR_NE(p, NULL);
     58 	ASSERT_STRING_EQ(p, "12345678");
     59 	free(p);
     60 	sshbuf_free(p1);
     61 	TEST_DONE();
     62 
     63 	TEST_START("sshbuf_dtob64 len 1");
     64 	p1 = sshbuf_new();
     65 	ASSERT_PTR_NE(p1, NULL);
     66 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
     67 	p = sshbuf_dtob64(p1);
     68 	ASSERT_PTR_NE(p, NULL);
     69 	ASSERT_STRING_EQ(p, "EQ==");
     70 	free(p);
     71 	sshbuf_free(p1);
     72 	TEST_DONE();
     73 
     74 	TEST_START("sshbuf_dtob64 len 2");
     75 	p1 = sshbuf_new();
     76 	ASSERT_PTR_NE(p1, NULL);
     77 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
     78 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
     79 	p = sshbuf_dtob64(p1);
     80 	ASSERT_PTR_NE(p, NULL);
     81 	ASSERT_STRING_EQ(p, "ESI=");
     82 	free(p);
     83 	sshbuf_free(p1);
     84 	TEST_DONE();
     85 
     86 	TEST_START("sshbuf_dtob64 len 3");
     87 	p1 = sshbuf_new();
     88 	ASSERT_PTR_NE(p1, NULL);
     89 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x11), 0);
     90 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x22), 0);
     91 	ASSERT_INT_EQ(sshbuf_put_u8(p1, 0x33), 0);
     92 	p = sshbuf_dtob64(p1);
     93 	ASSERT_PTR_NE(p, NULL);
     94 	ASSERT_STRING_EQ(p, "ESIz");
     95 	free(p);
     96 	sshbuf_free(p1);
     97 	TEST_DONE();
     98 
     99 	TEST_START("sshbuf_dtob64 len 8191");
    100 	p1 = sshbuf_new();
    101 	ASSERT_PTR_NE(p1, NULL);
    102 	ASSERT_INT_EQ(sshbuf_reserve(p1, 8192, NULL), 0);
    103 	bzero(sshbuf_mutable_ptr(p1), 8192);
    104 	p = sshbuf_dtob64(p1);
    105 	ASSERT_PTR_NE(p, NULL);
    106 	ASSERT_SIZE_T_EQ(strlen(p), ((8191 + 2) / 3) * 4);
    107 	free(p);
    108 	sshbuf_free(p1);
    109 	TEST_DONE();
    110 
    111 	TEST_START("sshbuf_b64tod len 1");
    112 	p1 = sshbuf_new();
    113 	ASSERT_PTR_NE(p1, NULL);
    114 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A=="), 0);
    115 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 1);
    116 	ASSERT_U8_EQ(*sshbuf_ptr(p1), 0xd0);
    117 	sshbuf_free(p1);
    118 	TEST_DONE();
    119 
    120 	TEST_START("sshbuf_b64tod len 2");
    121 	p1 = sshbuf_new();
    122 	ASSERT_PTR_NE(p1, NULL);
    123 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A8="), 0);
    124 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 2);
    125 	ASSERT_U16_EQ(PEEK_U16(sshbuf_ptr(p1)), 0xd00f);
    126 	sshbuf_free(p1);
    127 	TEST_DONE();
    128 
    129 	TEST_START("sshbuf_b64tod len 4");
    130 	p1 = sshbuf_new();
    131 	ASSERT_PTR_NE(p1, NULL);
    132 	ASSERT_INT_EQ(sshbuf_b64tod(p1, "0A/QDw=="), 0);
    133 	ASSERT_SIZE_T_EQ(sshbuf_len(p1), 4);
    134 	ASSERT_U32_EQ(PEEK_U32(sshbuf_ptr(p1)), 0xd00fd00f);
    135 	sshbuf_free(p1);
    136 	TEST_DONE();
    137 
    138 	TEST_START("sshbuf_dup_string");
    139 	p1 = sshbuf_new();
    140 	ASSERT_PTR_NE(p1, NULL);
    141 	/* Check empty buffer */
    142 	p = sshbuf_dup_string(p1);
    143 	ASSERT_PTR_NE(p, NULL);
    144 	ASSERT_SIZE_T_EQ(strlen(p), 0);
    145 	free(p);
    146 	/* Check buffer with string */
    147 	ASSERT_INT_EQ(sshbuf_put(p1, "quad1", strlen("quad1")), 0);
    148 	p = sshbuf_dup_string(p1);
    149 	ASSERT_PTR_NE(p, NULL);
    150 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
    151 	ASSERT_STRING_EQ(p, "quad1");
    152 	free(p);
    153 	/* Check buffer with terminating nul */
    154 	ASSERT_INT_EQ(sshbuf_put(p1, "\0", 1), 0);
    155 	p = sshbuf_dup_string(p1);
    156 	ASSERT_PTR_NE(p, NULL);
    157 	ASSERT_SIZE_T_EQ(strlen(p), strlen("quad1"));
    158 	ASSERT_STRING_EQ(p, "quad1");
    159 	free(p);
    160 	/* Check buffer with data after nul (expect failure) */
    161 	ASSERT_INT_EQ(sshbuf_put(p1, "quad2", strlen("quad2")), 0);
    162 	p = sshbuf_dup_string(p1);
    163 	ASSERT_PTR_EQ(p, NULL);
    164 	sshbuf_free(p1);
    165 	TEST_DONE();
    166 }
    167 
    168