From 0e752a6e215aee21dc73da097c3225495d54a5b6 Mon Sep 17 00:00:00 2001 From: SoniEx2 Date: Fri, 9 Apr 2021 07:19:03 -0300 Subject: Add libotr/etc sources --- libotr/libotr-4.1.1/tests/unit/test_tlv.c | 163 ++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 libotr/libotr-4.1.1/tests/unit/test_tlv.c (limited to 'libotr/libotr-4.1.1/tests/unit/test_tlv.c') diff --git a/libotr/libotr-4.1.1/tests/unit/test_tlv.c b/libotr/libotr-4.1.1/tests/unit/test_tlv.c new file mode 100644 index 0000000..d05f9b8 --- /dev/null +++ b/libotr/libotr-4.1.1/tests/unit/test_tlv.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2014 - Julien Voisin + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License, version 2 only, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include +#include + +#include + +GCRY_THREAD_OPTION_PTHREAD_IMPL; + +#define NUM_TESTS 11 + +static void test_otrl_tlv_new() +{ + const unsigned short type = OTRL_TLV_SMP1Q; + const char *data = "This is some test data"; + const unsigned short len = strlen(data); + + OtrlTLV* tlv = otrl_tlv_new(type, len, (unsigned char*)data); + ok(tlv->type == type && + tlv->len == len && + memcmp(tlv->data, data, len) == 0 && + tlv->data[len] == '\0' && + tlv->next == NULL, + "TLV created with success"); + otrl_tlv_free(tlv); +} + +static void test_otrl_tlv_parse() +{ + const unsigned char serialized1[] = + {'\x01', '\x02', '\x00', '\x03', '1', '2', '3'}; + const unsigned char serialized2[] = {'\x02', '\x04', '\x00', '\x00'}; + const unsigned char serialized3[] = + {'\x04', '\x02', '\x00', '\x03', '1', '2', '3', + '\x02', '\x02', '\xff', '\xff', '1', '3', '3', '7'}; + const unsigned char serialized4[] = + {'\x04', '\x02', '\x00', '\x03', '1', '2', '3', + '\x02', '\x02', '\x00', '\x04', '1', '3', '3', '7'}; + + OtrlTLV *tlv1 = otrl_tlv_parse(serialized1, sizeof(serialized1)); + OtrlTLV *tlv2 = otrl_tlv_parse(serialized2, sizeof(serialized2)); + OtrlTLV *tlv3 = otrl_tlv_parse(serialized3, sizeof(serialized3)); + OtrlTLV *tlv4 = otrl_tlv_parse(serialized4, sizeof(serialized4)); + + ok(tlv1->type == 258 && + tlv1->len == 3 && + tlv1->next == NULL && + memcmp(tlv1->data, "123", tlv1->len) == 0 && + tlv1->data[tlv1->len] == 0, + "Single-TLV chain constructed with success"); + otrl_tlv_free(tlv1); + + ok(tlv2->type == 516 && + tlv2->len == 0 && + tlv2->next == NULL, + "tlv2 chain with no data constructed with success"); + otrl_tlv_free(tlv2); + + ok(tlv3->type == 1026 && + tlv3->len == 3 && + memcmp(tlv3->data, "123", tlv3->len) == 0 && + tlv3->data[tlv3->len] == 0 && + tlv3->next == NULL, + "tlv3 chain with overflow constructed with success"); + otrl_tlv_free(tlv3); + + ok(tlv4->type == 1026 && + tlv4->len == 3 && + memcmp(tlv4->data, "123", tlv4->len) == 0 && + tlv4->data[tlv4->len] == 0 && + tlv4->next != NULL, + "First part of the 2-part tlv chain build"); + + ok(tlv4->next != NULL && + tlv4->next->type == 514 && + tlv4->next->len == 4 && + memcmp(tlv4->next->data, "1337", tlv4->next->len) == 0 && + tlv4->next->data[tlv4->next->len] == 0 && + tlv4->next->next == NULL, + "Second part of the 2-part tlv chain build"); + otrl_tlv_free(tlv4); +} + +static void test_otrl_tlv_seriallen() +{ + const unsigned char serialized[] = + {'\x04', '\x02', '\x00', '\x03', '1', '2', '3', + '\x02', '\x02', '\x00', '\x04', '1', '3', '3', '7'}; + OtrlTLV* tlv = otrl_tlv_parse(serialized, sizeof(serialized)); + ok(otrl_tlv_seriallen(tlv) == 4 + 3 + 4 + 4, + "Size correctly guessed"); + otrl_tlv_free(tlv); +} + +static void test_otrl_tlv_serialize() +{ + const unsigned char serialized[] = + {'\x04', '\x02', '\x00', '\x03', '1', '2', '3', + '\x02', '\x02', '\x00', '\x04', '1', '3', '3', '7'}; + OtrlTLV *tlv = otrl_tlv_parse(serialized, sizeof(serialized)); + unsigned char *buf = malloc(otrl_tlv_seriallen(tlv)); + otrl_tlv_serialize(buf, tlv); + ok(memcmp(serialized, buf, sizeof(serialized)) == 0, + "tlv correctly serialized"); + free(tlv); + + tlv = otrl_tlv_parse(buf, sizeof(serialized)); + otrl_tlv_serialize(buf, tlv); + ok(memcmp(serialized, buf, sizeof(serialized)) == 0, + "tlv correctly unserialized and serialized again"); + otrl_tlv_free(tlv); +} + +static void test_otrl_tlv_find() +{ + const unsigned char serialized[] = + {'\x04', '\x02', '\x00', '\x03', '1', '2', '3', + '\x02', '\x02', '\x00', '\x04', '1', '3', '3', '7', + '\x01', '\x03', '\x0', '\x01', 'A', + '\x01', '\x02', '\x0', '\x01', 'B'}; + OtrlTLV *tlv = otrl_tlv_parse(serialized, sizeof(serialized)); + OtrlTLV *result = otrl_tlv_find(tlv, (1<<8) + 3); + ok(result == tlv->next->next, "TLV found"); + + result = otrl_tlv_find(tlv, 7); + ok(result == NULL, "Unexistent TLV not found"); + + otrl_tlv_free(tlv); +} + +int main(int argc, char **argv) +{ + plan_tests(NUM_TESTS); + + gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); + OTRL_INIT; + + test_otrl_tlv_new(); + test_otrl_tlv_parse(); + test_otrl_tlv_seriallen(); + test_otrl_tlv_serialize(); + test_otrl_tlv_find(); + + return 0; +} -- cgit 1.4.1