blob: e9943b316b346eda863b63f0e837180120e13137 [file] [log] [blame]
/*
*
* 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 <config.h>
#endif
#define _GNU_SOURCE
#include <assert.h>
#include <ell/ell.h>
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();
}