#include <string.h>
#include <openssl/buffer.h>
+#include <openssl/rand.h>
#include "internal/packet.h"
#include "testutil.h"
static const unsigned char alloc[] = { 0x02, 0xfe, 0xff };
static const unsigned char submem[] = { 0x03, 0x02, 0xfe, 0xff };
static const unsigned char fixed[] = { 0xff, 0xff, 0xff };
+static const unsigned char simpleder[] = {
+ 0xfc, 0x04, 0x00, 0x01, 0x02, 0x03, 0xff, 0xfe, 0xfd
+};
static BUF_MEM *buf;
return 1;
}
+static int test_WPACKET_init_der(void)
+{
+ WPACKET pkt;
+ unsigned char sbuf[1024];
+ unsigned char testdata[] = { 0x00, 0x01, 0x02, 0x03 };
+ unsigned char testdata2[259] = { 0x82, 0x01, 0x00 };
+ size_t written[2];
+ int i;
+
+ /* Test initialising for writing DER */
+ if (!TEST_true(WPACKET_init_der(&pkt, sbuf, sizeof(sbuf)))
+ || !TEST_true(WPACKET_put_bytes_u24(&pkt, 0xfffefd))
+ /* Test writing data in a length prefixed sub-packet */
+ || !TEST_true(WPACKET_start_sub_packet(&pkt))
+ || !TEST_true(WPACKET_memcpy(&pkt, testdata, sizeof(testdata)))
+ || !TEST_true(WPACKET_close(&pkt))
+ || !TEST_true(WPACKET_put_bytes_u8(&pkt, 0xfc))
+ || !TEST_true(WPACKET_finish(&pkt))
+ || !TEST_true(WPACKET_get_total_written(&pkt, &written[0]))
+ || !TEST_mem_eq(WPACKET_get_curr(&pkt), written[0], simpleder,
+ sizeof(simpleder)))
+ return cleanup(&pkt);
+
+ /* Generate random packet data for test */
+ if (!TEST_true(RAND_bytes(&testdata2[3], sizeof(testdata2) - 3)))
+ return 0;
+
+ /*
+ * Test with a sub-packet that has 2 length bytes. We do 2 passes - first
+ * with a NULL buffer, just to calculate lengths, and a second pass with a
+ * real buffer to actually generate a packet
+ */
+ for (i = 0; i < 2; i++) {
+ if (i == 0) {
+ if (!TEST_true(WPACKET_init_null_der(&pkt)))
+ return 0;
+ } else {
+ if (!TEST_true(WPACKET_init_der(&pkt, sbuf, sizeof(sbuf))))
+ return 0;
+ }
+ if (!TEST_true(WPACKET_start_sub_packet(&pkt))
+ || !TEST_true(WPACKET_memcpy(&pkt, &testdata2[3],
+ sizeof(testdata2) - 3))
+ || !TEST_true(WPACKET_close(&pkt))
+ || !TEST_true(WPACKET_finish(&pkt))
+ || !TEST_true(WPACKET_get_total_written(&pkt, &written[i])))
+ return cleanup(&pkt);
+ }
+
+ /*
+ * Check that the size calculated in the first pass equals the size of the
+ * packet actually generated in the second pass. Also check the generated
+ * packet looks as we expect it to.
+ */
+ if (!TEST_size_t_eq(written[0], written[1])
+ || !TEST_mem_eq(WPACKET_get_curr(&pkt), written[1], testdata2,
+ sizeof(testdata2)))
+ return 0;
+
+ return 1;
+}
+
int setup_tests(void)
{
if (!TEST_ptr(buf = BUF_MEM_new()))
ADD_TEST(test_WPACKET_set_flags);
ADD_TEST(test_WPACKET_allocate_bytes);
ADD_TEST(test_WPACKET_memcpy);
+ ADD_TEST(test_WPACKET_init_der);
return 1;
}