/*
* This file is part of Cockpit.
*
* Copyright (C) 2014 Red Hat, Inc.
*
* Cockpit 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.
*
* Cockpit 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 Cockpit; If not, see .
*/
#include "config.h"
#include "cockpithex.h"
#include
#include
static const char HEX[] = "0123456789abcdef";
char *
cockpit_hex_encode (const void * data,
ssize_t length)
{
const unsigned char *in = data;
char *out;
size_t i;
if (length < 0)
length = strlen (data);
out = malloc (length * 2 + 1);
if (!out)
return NULL;
for (i = 0; i < length; i++)
{
out[i * 2] = HEX[in[i] >> 4];
out[i * 2 + 1] = HEX[in[i] & 0xf];
}
out[i * 2] = '\0';
return out;
}
void *
cockpit_hex_decode (const char *hex,
ssize_t hexlen,
size_t *length)
{
const char *hpos;
const char *lpos;
char *out;
int i;
if (hexlen < 0)
hexlen = strlen (hex);
if (hexlen % 2 != 0)
return NULL;
out = malloc (hexlen * 2 + 1);
if (!out)
return NULL;
for (i = 0; i < hexlen / 2; i++)
{
hpos = strchr (HEX, hex[i * 2]);
lpos = strchr (HEX, hex[i * 2 + 1]);
if (hpos == NULL || lpos == NULL)
{
free (out);
return NULL;
}
out[i] = ((hpos - HEX) << 4) | ((lpos - HEX) & 0xf);
}
/* A convenience null termination */
out[i] = '\0';
if (length)
*length = i;
return out;
}