summaryrefslogtreecommitdiffstats
path: root/generic/keydecode.c
blob: 0ca011e031534b5e6cb0a1bccdff63caa1673d5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char *
keydecode(char *key)
{
	unsigned int len, half, i, j;
	char	*newkey;

	if (key == NULL) {
err:		return (key);
	}
	len = strlen(key);
	half = len / 2;
	if ((len %2) != 0) goto err; /* len must be even */
	
	newkey = malloc(len);
	
	/* unpack the old bytes */
	for (j = 1, i = 0; i < half; i++, j +=2) newkey[j] = key[i];

	/* unpack the even bytes */
	for (j = 0, i = half; i < len; i++, j +=2)  newkey[j] = key[i];

	memcpy(key, newkey, len);
	free(newkey);
	return (key);
}