/* * * Embedded Linux library * * Copyright (C) 2015 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #define _GNU_SOURCE #include #include static void test_v3(const void *data) { uint8_t uuid[16]; bool r; const char *dns = "01.org"; uint8_t dns_expected[16] = { 0xc4, 0x29, 0x62, 0xbe, 0xd8, 0xb6, 0x38, 0xf6, 0xa9, 0xdb, 0xea, 0x5b, 0x75, 0xca, 0x39, 0x2d, }; const char *url = "http://01.org"; uint8_t url_expected[16] = { 0x4d, 0x73, 0xd5, 0x05, 0xd0, 0xf1, 0x34, 0x69, 0xb5, 0x0d, 0x27, 0x6d, 0x29, 0xac, 0x7e, 0x07, }; const char *oid = "1.3.6.1"; uint8_t oid_expected[16] = { 0xdd, 0x1a, 0x1c, 0xef, 0x13, 0xd5, 0x36, 0x8a, 0xad, 0x82, 0xec, 0xa7, 0x1a, 0xcd, 0x4c, 0xd1, }; const char *x500 = "c=ca"; uint8_t x500_expected[16] = { 0x65, 0x8d, 0x30, 0x02, 0xdb, 0x6b, 0x30, 0x40, 0xa1, 0xd1, 0x8d, 0xdd, 0x7d, 0x18, 0x9a, 0x4d, }; r = l_uuid_v3(L_UUID_NAMESPACE_DNS, dns, strlen(dns), uuid); assert(r); assert(!memcmp(uuid, dns_expected, 16)); assert(l_uuid_is_valid(uuid)); assert(l_uuid_get_version(uuid) == L_UUID_VERSION_3_MD5); r = l_uuid_v3(L_UUID_NAMESPACE_URL, url, strlen(url), uuid); assert(r); assert(!memcmp(uuid, url_expected, 16)); assert(l_uuid_is_valid(uuid)); r = l_uuid_v3(L_UUID_NAMESPACE_OID, oid, strlen(oid), uuid); assert(r); assert(!memcmp(uuid, oid_expected, 16)); assert(l_uuid_is_valid(uuid)); r = l_uuid_v3(L_UUID_NAMESPACE_X500, x500, strlen(x500), uuid); assert(r); assert(!memcmp(uuid, x500_expected, 16)); assert(l_uuid_is_valid(uuid)); } static void test_v4(const void *data) { uint8_t uuid1[16]; uint8_t uuid2[16]; bool r; r = l_uuid_v4(uuid1); assert(r); assert(l_uuid_is_valid(uuid1)); assert(l_uuid_get_version(uuid1) == L_UUID_VERSION_4_RANDOM); r = l_uuid_v4(uuid2); assert(r); assert(l_uuid_is_valid(uuid2)); assert(memcmp(uuid1, uuid2, 16)); } static void test_v5(const void *data) { uint8_t uuid[16]; bool r; const char *dns = "01.org"; uint8_t dns_expected[16] = { 0x65, 0xfc, 0xc6, 0x97, 0x07, 0x76, 0x5b, 0xf9, 0x85, 0x73, 0x72, 0xa5, 0x10, 0x80, 0xc7, 0xde, }; const char *url = "http://01.org"; uint8_t url_expected[16] = { 0x4c, 0x98, 0xbc, 0x3c, 0x20, 0xa1, 0x55, 0xb0, 0x9b, 0x7c, 0x42, 0xa4, 0xd0, 0x6e, 0xa6, 0xb6, }; const char *oid = "1.3.6.1"; uint8_t oid_expected[16] = { 0x14, 0x47, 0xfa, 0x61, 0x52, 0x77, 0x5f, 0xef, 0xa9, 0xb3, 0xfb, 0xc6, 0xe4, 0x4f, 0x4a, 0xf3, }; const char *x500 = "c=ca"; uint8_t x500_expected[16] = { 0xcc, 0x95, 0x7d, 0xd1, 0xa9, 0x72, 0x53, 0x49, 0x98, 0xcd, 0x87, 0x41, 0x90, 0x00, 0x27, 0x98, }; r = l_uuid_v5(L_UUID_NAMESPACE_DNS, dns, strlen(dns), uuid); assert(r); assert(!memcmp(uuid, dns_expected, 16)); assert(l_uuid_is_valid(uuid)); assert(l_uuid_get_version(uuid) == L_UUID_VERSION_5_SHA1); r = l_uuid_v5(L_UUID_NAMESPACE_URL, url, strlen(url), uuid); assert(r); assert(!memcmp(uuid, url_expected, 16)); assert(l_uuid_is_valid(uuid)); r = l_uuid_v5(L_UUID_NAMESPACE_OID, oid, strlen(oid), uuid); assert(r); assert(!memcmp(uuid, oid_expected, 16)); assert(l_uuid_is_valid(uuid)); r = l_uuid_v5(L_UUID_NAMESPACE_X500, x500, strlen(x500), uuid); assert(r); assert(!memcmp(uuid, x500_expected, 16)); assert(l_uuid_is_valid(uuid)); } static void test_to_string(const void *data) { uint8_t uuid[16]; bool r; const char *dns = "01.org"; const char *expected_uuid = "65fcc697-0776-5bf9-8573-72a51080c7de"; char buf[64]; r = l_uuid_v5(L_UUID_NAMESPACE_DNS, dns, strlen(dns), uuid); assert(r); r = l_uuid_to_string(uuid, buf, sizeof(buf)); assert(r); assert(!strcmp(buf, expected_uuid)); } static void test_from_string_too_short(const void *data) { static const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7d"; uint8_t uuid[16]; bool r; r = l_uuid_from_string(string_uuid, uuid); assert(!r); } static void test_from_string_too_long(const void *data) { static const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7detoolong"; static uint8_t expected_uuid[] = { 0x65, 0xfc, 0xc6, 0x97, 0x07, 0x76, 0x5b, 0xf9, 0x85, 0x73, 0x72, 0xa5, 0x10, 0x80, 0xc7, 0xde }; uint8_t uuid[16]; bool r; r = l_uuid_from_string(string_uuid, uuid); assert(r); assert(!memcmp(uuid, expected_uuid, sizeof(uuid))); } static void test_from_string_invalid_variant(const void *data) { static const char *string_uuid = "65fcc697-0776-5bf9-c573-72a51080c7de"; uint8_t uuid[16]; bool r; r = l_uuid_from_string(string_uuid, uuid); assert(!r); } static void test_from_string_invalid_hex(const void *data) { static const char *string_uuid = "65fcc697-this-isno-tava-lidhexstring"; uint8_t uuid[16]; bool r; r = l_uuid_from_string(string_uuid, uuid); assert(!r); } static void test_from_string(const void *data) { static const char *string_uuid = "65fcc697-0776-5bf9-8573-72a51080c7de"; static uint8_t expected_uuid[] = { 0x65, 0xfc, 0xc6, 0x97, 0x07, 0x76, 0x5b, 0xf9, 0x85, 0x73, 0x72, 0xa5, 0x10, 0x80, 0xc7, 0xde }; uint8_t uuid[16]; bool r; r = l_uuid_from_string(string_uuid, uuid); assert(r); assert(!memcmp(uuid, expected_uuid, sizeof(uuid))); } int main(int argc, char *argv[]) { l_test_init(&argc, &argv); l_test_add("/uuid/v3", test_v3, NULL); if (l_getrandom_is_supported()) l_test_add("/uuid/v4", test_v4, NULL); l_test_add("/uuid/v5", test_v5, NULL); l_test_add("/uuid/to string", test_to_string, NULL); l_test_add("/uuid/from string", test_from_string, NULL); l_test_add("/uuid/from string/too short", test_from_string_too_short, NULL); l_test_add("/uuid/from string/too long", test_from_string_too_long, NULL); l_test_add("/uuid/from string/invalid variant", test_from_string_invalid_variant, NULL); l_test_add("/uuid/from string/invalid hex", test_from_string_invalid_hex, NULL); return l_test_run(); }