xref: /openbsd-src/usr.sbin/crunchgen/mangle.c (revision 8521085ccbc68c6e46c309ca4685e4e1a68bfc28)
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