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