summaryrefslogtreecommitdiffstats
path: root/generic/keydecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/keydecode.c')
-rw-r--r--generic/keydecode.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/generic/keydecode.c b/generic/keydecode.c
new file mode 100644
index 0000000..0ca011e
--- /dev/null
+++ b/generic/keydecode.c
@@ -0,0 +1,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);
+}