1 /* ====================================================================
2 * Copyright (c) 2002 Johnny Shelley. All rights reserved.
3 *
4 * Bcrypt is licensed under the BSD software license. See the file
5 * called 'LICENSE' that you should have received with this software
6 * for details
7 * ====================================================================
8 */
9
10 #include "includes.h"
11 #include "defines.h"
12 #include "functions.h"
13
getkey(int type)14 char * getkey(int type){
15 char *key, *key2, overflow[2], *ch;
16
17 #ifndef WIN32 /* Win32 doesn't have termios.h */
18 struct termios term, termsave;
19
20 tcgetattr(fileno(stdin), &termsave);
21 term = termsave;
22 term.c_lflag &= ~ (ECHO | ECHOE | ECHOK | ECHONL);
23 tcsetattr(fileno(stdin), TCSANOW, &term);
24 #endif
25
26 if ((key = malloc(MAXKEYBYTES + 2)) == NULL)
27 memerror();
28
29 memset(key, 0, MAXKEYBYTES + 2);
30
31 fprintf(stderr, "Encryption key:");
32 fgets(key, MAXKEYBYTES + 1, stdin);
33
34 /* blowfish requires 32 bits, I want 64. deal w/ it */
35 while (strlen(key) < 9 && type == ENCRYPT) { /* \n is still tacked on */
36 fprintf(stderr, "Key must be at least 8 characters\n");
37 memset(key, 0, MAXKEYBYTES + 2);
38 fprintf(stderr, "Encryption key:");
39 fgets(key, MAXKEYBYTES + 1, stdin);
40 }
41
42 if (memchr(key, (char) 10, MAXKEYBYTES + 1) == NULL) {
43 while (fread(overflow, 1, 1, stdin) > 0) {
44 if (memcmp(overflow, "\n", 1) == 0)
45 break;
46 }
47 }
48
49 if (type == ENCRYPT) {
50 if ((key2 = malloc(MAXKEYBYTES + 2)) == NULL)
51 memerror();
52
53 memset(key2, 0, MAXKEYBYTES + 2);
54 fprintf(stderr, "\nAgain:");
55 fgets(key2, MAXKEYBYTES + 1, stdin);
56
57 if (strcmp(key, key2)) {
58 fprintf(stderr, "\nKeys don't match!\n");
59 #ifndef WIN32 /* Win32 doesn't have termios.h */
60 tcsetattr(fileno(stdin), TCSANOW, &termsave);
61 #endif
62 exit(1);
63 }
64 memset(key2, 0, strlen(key2));
65 free(key2);
66 }
67
68 if ((ch = memchr(key, (char) 10, strlen(key))) != NULL)
69 memset(ch, 0, 1);
70
71 #ifndef WIN32 /* Win32 doesn't have termios.h */
72 tcsetattr(fileno(stdin), TCSANOW, &termsave);
73 #endif
74
75 fprintf(stderr, "\n");
76
77 return(key);
78 }
79
mutateKey(char ** key,char ** key2)80 void mutateKey(char **key, char **key2) {
81 uInt32 L, R, l, r;
82 BLOWFISH_CTX ctx;
83 char *newkey, *newkey2;
84 int i, j;
85
86 j = sizeof(uInt32);
87
88 Blowfish_Init(&ctx, *key, strlen(*key));
89
90 memcpy(&L, *key, j);
91 memcpy(&R, *key+j, j);
92 memset(*key, 0, MAXKEYBYTES + 1);
93
94 l = L;
95 r = R;
96
97 if ((*key2 = malloc(MAXKEYBYTES + 1)) == NULL)
98 memerror();
99 if ((newkey = malloc(MAXKEYBYTES + 1)) == NULL)
100 memerror();
101 if ((newkey2 = malloc(MAXKEYBYTES + 1)) == NULL)
102 memerror();
103
104 memset(*key2, 0, MAXKEYBYTES + 1);
105 memset(newkey, 0, MAXKEYBYTES + 1);
106 memset(newkey2, 0, MAXKEYBYTES + 1);
107
108 for (i=0; i < MAXKEYBYTES; i+=(j*2)) {
109 Blowfish_Encrypt(&ctx, &L, &R);
110 memcpy(newkey+i, &L, j);
111 memcpy(newkey+i+j, &R, j);
112 }
113
114 for (i=0; i < MAXKEYBYTES; i+=(j*2)) {
115 l = swapEndian(l);
116 r = swapEndian(r);
117
118 Blowfish_Encrypt(&ctx, &l, &r);
119
120 l = swapEndian(l);
121 r = swapEndian(r);
122
123 memcpy(newkey2+i, &l, j);
124 memcpy(newkey2+i+j, &r, j);
125 }
126
127 memcpy(*key, newkey, MAXKEYBYTES);
128 memcpy(*key2, newkey2, MAXKEYBYTES);
129 free(newkey);
130 }
131