1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27: #ifdef DEBUG
28: #include <stdio.h>
29: #endif
30: #include <string.h>
31:
32: #ifndef STATIC
33: #define STATIC static
34: #endif
35:
36: #ifndef DOS
37: #include "ufc-crypt.h"
38: #else
39:
40:
41:
42:
43: #include "ufc.h"
44: #endif
45: #include "crypt.h"
46: #include "crypt-private.h"
47:
48:
49: #if __STDC__ - 0
50: #ifndef __GNU_LIBRARY__
51: void _ufc_clearmem (char *start, int cnt);
52: #else
53: #define _ufc_clearmem(start, cnt) memset(start, 0, cnt)
54: #endif
55: extern char *__md5_crypt_r (const char *key, const char *salt, char *buffer,
56: int buflen);
57: extern char *__md5_crypt (const char *key, const char *salt);
58: extern char *__sha256_crypt_r (const char *key, const char *salt,
59: char *buffer, int buflen);
60: extern char *__sha256_crypt (const char *key, const char *salt);
61: extern char *__sha512_crypt_r (const char *key, const char *salt,
62: char *buffer, int buflen);
63: extern char *__sha512_crypt (const char *key, const char *salt);
64: #endif
65:
66:
67:
68:
69: static const char md5_salt_prefix[] = "$1$";
70:
71:
72: static const char sha256_salt_prefix[] = "$5$";
73:
74:
75: static const char sha512_salt_prefix[] = "$6$";
76:
77:
78: extern struct crypt_data _ufc_foobar;
79:
80:
81:
82:
83:
84: char *
85: __crypt_r (key, salt, data)
86: const char *key;
87: const char *salt;
88: struct crypt_data * __restrict data;
89: {
90: ufc_long res[4];
91: char ktab[9];
92: ufc_long xx = 25;
93:
94: #ifdef _LIBC
95:
96: if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
97: return __md5_crypt_r (key, salt, (char *) data,
98: sizeof (struct crypt_data));
99:
100:
101: if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)
102: return __sha256_crypt_r (key, salt, (char *) data,
103: sizeof (struct crypt_data));
104:
105:
106: if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)
107: return __sha512_crypt_r (key, salt, (char *) data,
108: sizeof (struct crypt_data));
109: #endif
110:
111:
112:
113:
114: _ufc_setup_salt_r (salt, data);
115:
116:
117:
118:
119: _ufc_clearmem (ktab, (int) sizeof (ktab));
120: (void) strncpy (ktab, key, 8);
121: _ufc_mk_keytab_r (ktab, data);
122:
123:
124:
125:
126: _ufc_clearmem ((char*) res, (int) sizeof (res));
127: _ufc_doit_r (xx, data, &res[0]);
128:
129:
130:
131:
132: _ufc_dofinalperm_r (res, data);
133:
134:
135:
136:
137: _ufc_output_conversion_r (res[0], res[1], salt, data);
138: return data->crypt_3_buf;
139: }
140: weak_alias (__crypt_r, crypt_r)
141:
142: char *
143: crypt (key, salt)
144: const char *key;
145: const char *salt;
146: {
147: #ifdef _LIBC
148:
149: if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
150: return __md5_crypt (key, salt);
151:
152:
153: if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)
154: return __sha256_crypt (key, salt);
155:
156:
157: if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)
158: return __sha512_crypt (key, salt);
159: #endif
160:
161: return __crypt_r (key, salt, &_ufc_foobar);
162: }
163:
164:
165:
166:
167:
168:
169: #ifdef _LIBC
170: weak_alias (crypt, fcrypt)
171: #else
172: char *
173: __fcrypt (key, salt)
174: const char *key;
175: const char *salt;
176: {
177: return crypt (key, salt);
178: }
179: #endif