From: Matt Caswell Date: Thu, 2 Apr 2020 11:26:47 +0000 (+0100) Subject: Add a WPACKET test for the new DER capability X-Git-Tag: openssl-3.0.0-alpha1~160 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=a056ee28ed0971be2e29b49c3357a4065c98e51d;p=oweals%2Fopenssl.git Add a WPACKET test for the new DER capability Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/11462) --- diff --git a/test/wpackettest.c b/test/wpackettest.c index abb001ea14..b2fa650424 100644 --- a/test/wpackettest.c +++ b/test/wpackettest.c @@ -9,6 +9,7 @@ #include #include +#include #include "internal/packet.h" #include "testutil.h" @@ -21,6 +22,9 @@ static const unsigned char empty[] = { 0x00 }; 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; @@ -349,6 +353,68 @@ static int test_WPACKET_memcpy(void) 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())) @@ -360,6 +426,7 @@ int setup_tests(void) 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; }