1*8521085cSdrahn /* $OpenBSD: mangle.c,v 1.2 2009/12/08 21:10:24 drahn Exp $ */
2516251d4Sdrahn /*
3516251d4Sdrahn * Copyright (c) 2009 Dale Rahn.
4516251d4Sdrahn * All rights reserved.
5516251d4Sdrahn *
6516251d4Sdrahn *
7516251d4Sdrahn * Redistribution and use in source and binary forms, with or without
8516251d4Sdrahn * modification, are permitted provided that the following conditions
9516251d4Sdrahn * are met:
10516251d4Sdrahn * 1. Redistributions of source code must retain the above copyright
11516251d4Sdrahn * notice, this list of conditions and the following disclaimer.
12516251d4Sdrahn * 2. Redistributions in binary form must reproduce the above copyright
13516251d4Sdrahn * notice, this list of conditions and the following disclaimer in the
14516251d4Sdrahn * documentation and/or other materials provided with the distribution.
15516251d4Sdrahn *
16516251d4Sdrahn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17516251d4Sdrahn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18516251d4Sdrahn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19516251d4Sdrahn * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20516251d4Sdrahn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21516251d4Sdrahn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22516251d4Sdrahn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23516251d4Sdrahn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24516251d4Sdrahn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25516251d4Sdrahn * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26516251d4Sdrahn */
27516251d4Sdrahn
28516251d4Sdrahn #include <sys/types.h>
29516251d4Sdrahn #include <sys/stat.h>
30516251d4Sdrahn #include <fcntl.h>
31516251d4Sdrahn #include <unistd.h>
32516251d4Sdrahn #include <stdio.h>
33516251d4Sdrahn #include <string.h>
34516251d4Sdrahn #include "mangle.h"
35516251d4Sdrahn
36516251d4Sdrahn /*
37516251d4Sdrahn * supports randomizing up to 32 characters, if an identifier is longer than
38516251d4Sdrahn * 32 characters, we only modify the first 32 characters of it.
39516251d4Sdrahn *
40516251d4Sdrahn * However not all of the 32 characters will really be randomized as
41516251d4Sdrahn * 2^32 (uint32_t gives a maximum string of cmpPQeaa[a]*
42516251d4Sdrahn * Dont thing this will really matter....
43516251d4Sdrahn *
44516251d4Sdrahn * HOWEVER this does not mean we want to change the MAX_KEY_STR_LEN to 6
45516251d4Sdrahn * because then all strings len >= 6 would use from the same index pool.
46516251d4Sdrahn */
47516251d4Sdrahn #define MAX_KEY_STR_LEN 32
48516251d4Sdrahn uint32_t key[MAX_KEY_STR_LEN];
49516251d4Sdrahn
50516251d4Sdrahn char *filename = "mangledata";
51516251d4Sdrahn
52516251d4Sdrahn int key_fd = -1;
53516251d4Sdrahn void
init_mangle_state()54516251d4Sdrahn init_mangle_state()
55516251d4Sdrahn {
56516251d4Sdrahn int failed = 0;
57516251d4Sdrahn ssize_t len;
58516251d4Sdrahn int i, ret;
59516251d4Sdrahn
60516251d4Sdrahn /* open file if it exists, else init to zeros */
61516251d4Sdrahn struct stat sb;
62516251d4Sdrahn
63516251d4Sdrahn ret = stat(filename, &sb);
64516251d4Sdrahn
65516251d4Sdrahn if (ret != -1 && sb.st_size == sizeof(key)) {
66516251d4Sdrahn key_fd = open(filename, O_RDWR);
67516251d4Sdrahn }
68516251d4Sdrahn
69516251d4Sdrahn if (ret == -1 || key_fd == -1)
70516251d4Sdrahn failed = 1;
71516251d4Sdrahn
72516251d4Sdrahn if (failed == 0) {
73516251d4Sdrahn len = read(key_fd, key, sizeof(key));
74516251d4Sdrahn if (len != sizeof(key)) {
75516251d4Sdrahn failed = 1;
76516251d4Sdrahn }
77516251d4Sdrahn }
78516251d4Sdrahn
79516251d4Sdrahn if (failed == 1) {
80516251d4Sdrahn if (key_fd != -1) {
81516251d4Sdrahn close(key_fd);
82516251d4Sdrahn key_fd = -1;
83516251d4Sdrahn }
84516251d4Sdrahn for (i = 0; i < MAX_KEY_STR_LEN; i++) {
85516251d4Sdrahn key[i] = 0;
86516251d4Sdrahn }
87516251d4Sdrahn }
88516251d4Sdrahn }
89516251d4Sdrahn
90516251d4Sdrahn void
fini_mangle_state()91516251d4Sdrahn fini_mangle_state()
92516251d4Sdrahn {
93516251d4Sdrahn int len;
94516251d4Sdrahn if (key_fd == -1) {
95516251d4Sdrahn /* open file for create/truncate */
96516251d4Sdrahn key_fd = open(filename, O_WRONLY|O_TRUNC|O_CREAT, 0666);
97516251d4Sdrahn } else {
98516251d4Sdrahn /* seek to the beginning */
99516251d4Sdrahn lseek(key_fd, 0, SEEK_SET);
100516251d4Sdrahn }
101516251d4Sdrahn if (key_fd != -1) {
102516251d4Sdrahn /* write file */
103516251d4Sdrahn len = write(key_fd, key, sizeof(key));
104516251d4Sdrahn if (len != sizeof(key)) {
105516251d4Sdrahn printf("writing file failed\n");
106516251d4Sdrahn }
107516251d4Sdrahn close(key_fd);
108516251d4Sdrahn key_fd = -1;
109516251d4Sdrahn }
110516251d4Sdrahn }
111516251d4Sdrahn
112516251d4Sdrahn void
dump_mangle_state()113516251d4Sdrahn dump_mangle_state()
114516251d4Sdrahn {
115516251d4Sdrahn int i;
116516251d4Sdrahn
117516251d4Sdrahn for (i = 0; i < MAX_KEY_STR_LEN; i++) {
118516251d4Sdrahn printf("key %d %d\n", i, key[i]);
119516251d4Sdrahn }
120516251d4Sdrahn }
121516251d4Sdrahn
122516251d4Sdrahn char validchars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
123516251d4Sdrahn #define NUM_KEYS (sizeof(validchars)-1)
124516251d4Sdrahn
125516251d4Sdrahn void
mangle_str(char * str)126516251d4Sdrahn mangle_str(char *str)
127516251d4Sdrahn {
128516251d4Sdrahn int i;
129516251d4Sdrahn int len;
130516251d4Sdrahn int keyval;
131516251d4Sdrahn
132516251d4Sdrahn len = strlen(str);
133*8521085cSdrahn if (len == 0)
134*8521085cSdrahn return; /* nothing to mangle */
135516251d4Sdrahn
136*8521085cSdrahn if (len > MAX_KEY_STR_LEN)
137*8521085cSdrahn len = MAX_KEY_STR_LEN;
138*8521085cSdrahn
139*8521085cSdrahn keyval = key[len-1]++;
140516251d4Sdrahn
141516251d4Sdrahn for (i = 0; i < len; i++) {
142516251d4Sdrahn int idx = keyval % NUM_KEYS;
143516251d4Sdrahn keyval = keyval / NUM_KEYS;
144516251d4Sdrahn str[i] = validchars[idx];
145516251d4Sdrahn
146516251d4Sdrahn }
147516251d4Sdrahn }
148516251d4Sdrahn
149