diff options
Diffstat (limited to 'src/lib/libcrypto/des/read_pwd.c')
-rw-r--r-- | src/lib/libcrypto/des/read_pwd.c | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/src/lib/libcrypto/des/read_pwd.c b/src/lib/libcrypto/des/read_pwd.c new file mode 100644 index 0000000000..99920f2f86 --- /dev/null +++ b/src/lib/libcrypto/des/read_pwd.c | |||
@@ -0,0 +1,459 @@ | |||
1 | /* crypto/des/read_pwd.c */ | ||
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | ||
3 | * All rights reserved. | ||
4 | * | ||
5 | * This package is an SSL implementation written | ||
6 | * by Eric Young (eay@cryptsoft.com). | ||
7 | * The implementation was written so as to conform with Netscapes SSL. | ||
8 | * | ||
9 | * This library is free for commercial and non-commercial use as long as | ||
10 | * the following conditions are aheared to. The following conditions | ||
11 | * apply to all code found in this distribution, be it the RC4, RSA, | ||
12 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | ||
13 | * included with this distribution is covered by the same copyright terms | ||
14 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | ||
15 | * | ||
16 | * Copyright remains Eric Young's, and as such any Copyright notices in | ||
17 | * the code are not to be removed. | ||
18 | * If this package is used in a product, Eric Young should be given attribution | ||
19 | * as the author of the parts of the library used. | ||
20 | * This can be in the form of a textual message at program startup or | ||
21 | * in documentation (online or textual) provided with the package. | ||
22 | * | ||
23 | * Redistribution and use in source and binary forms, with or without | ||
24 | * modification, are permitted provided that the following conditions | ||
25 | * are met: | ||
26 | * 1. Redistributions of source code must retain the copyright | ||
27 | * notice, this list of conditions and the following disclaimer. | ||
28 | * 2. Redistributions in binary form must reproduce the above copyright | ||
29 | * notice, this list of conditions and the following disclaimer in the | ||
30 | * documentation and/or other materials provided with the distribution. | ||
31 | * 3. All advertising materials mentioning features or use of this software | ||
32 | * must display the following acknowledgement: | ||
33 | * "This product includes cryptographic software written by | ||
34 | * Eric Young (eay@cryptsoft.com)" | ||
35 | * The word 'cryptographic' can be left out if the rouines from the library | ||
36 | * being used are not cryptographic related :-). | ||
37 | * 4. If you include any Windows specific code (or a derivative thereof) from | ||
38 | * the apps directory (application code) you must include an acknowledgement: | ||
39 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | ||
40 | * | ||
41 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | ||
42 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
43 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
44 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | ||
45 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
46 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
47 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
48 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
49 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
50 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
51 | * SUCH DAMAGE. | ||
52 | * | ||
53 | * The licence and distribution terms for any publically available version or | ||
54 | * derivative of this code cannot be changed. i.e. this code cannot simply be | ||
55 | * copied and put under another distribution licence | ||
56 | * [including the GNU Public Licence.] | ||
57 | */ | ||
58 | |||
59 | /* #define SIGACTION */ /* Define this if you have sigaction() */ | ||
60 | #ifdef WIN16TTY | ||
61 | #undef WIN16 | ||
62 | #undef _WINDOWS | ||
63 | #include <graph.h> | ||
64 | #endif | ||
65 | |||
66 | /* 06-Apr-92 Luke Brennan Support for VMS */ | ||
67 | #include "des_locl.h" | ||
68 | #include <signal.h> | ||
69 | #include <string.h> | ||
70 | #include <setjmp.h> | ||
71 | #include <errno.h> | ||
72 | |||
73 | /* There are 5 types of terminal interface supported, | ||
74 | * TERMIO, TERMIOS, VMS, MSDOS and SGTTY | ||
75 | */ | ||
76 | |||
77 | #if defined(__sgi) && !defined(TERMIOS) | ||
78 | #define TERMIOS | ||
79 | #undef TERMIO | ||
80 | #undef SGTTY | ||
81 | #endif | ||
82 | |||
83 | #if defined(linux) && !defined(TERMIO) | ||
84 | #undef TERMIOS | ||
85 | #define TERMIO | ||
86 | #undef SGTTY | ||
87 | #endif | ||
88 | |||
89 | #ifdef _LIBC | ||
90 | #undef TERMIOS | ||
91 | #define TERMIO | ||
92 | #undef SGTTY | ||
93 | #endif | ||
94 | |||
95 | #if !defined(TERMIO) && !defined(TERMIOS) && !defined(VMS) && !defined(MSDOS) | ||
96 | #undef TERMIOS | ||
97 | #undef TERMIO | ||
98 | #define SGTTY | ||
99 | #endif | ||
100 | |||
101 | #ifdef TERMIOS | ||
102 | #include <termios.h> | ||
103 | #define TTY_STRUCT struct termios | ||
104 | #define TTY_FLAGS c_lflag | ||
105 | #define TTY_get(tty,data) tcgetattr(tty,data) | ||
106 | #define TTY_set(tty,data) tcsetattr(tty,TCSANOW,data) | ||
107 | #endif | ||
108 | |||
109 | #ifdef TERMIO | ||
110 | #include <termio.h> | ||
111 | #define TTY_STRUCT struct termio | ||
112 | #define TTY_FLAGS c_lflag | ||
113 | #define TTY_get(tty,data) ioctl(tty,TCGETA,data) | ||
114 | #define TTY_set(tty,data) ioctl(tty,TCSETA,data) | ||
115 | #endif | ||
116 | |||
117 | #ifdef SGTTY | ||
118 | #include <sgtty.h> | ||
119 | #define TTY_STRUCT struct sgttyb | ||
120 | #define TTY_FLAGS sg_flags | ||
121 | #define TTY_get(tty,data) ioctl(tty,TIOCGETP,data) | ||
122 | #define TTY_set(tty,data) ioctl(tty,TIOCSETP,data) | ||
123 | #endif | ||
124 | |||
125 | #if !defined(_LIBC) && !defined(MSDOS) && !defined(VMS) | ||
126 | #include <sys/ioctl.h> | ||
127 | #endif | ||
128 | |||
129 | #ifdef MSDOS | ||
130 | #include <conio.h> | ||
131 | #define fgets(a,b,c) noecho_fgets(a,b,c) | ||
132 | #endif | ||
133 | |||
134 | #ifdef VMS | ||
135 | #include <ssdef.h> | ||
136 | #include <iodef.h> | ||
137 | #include <ttdef.h> | ||
138 | #include <descrip.h> | ||
139 | struct IOSB { | ||
140 | short iosb$w_value; | ||
141 | short iosb$w_count; | ||
142 | long iosb$l_info; | ||
143 | }; | ||
144 | #endif | ||
145 | |||
146 | #ifndef NX509_SIG | ||
147 | #define NX509_SIG 32 | ||
148 | #endif | ||
149 | |||
150 | #ifndef NOPROTO | ||
151 | static void read_till_nl(FILE *); | ||
152 | static void recsig(int); | ||
153 | static void pushsig(void); | ||
154 | static void popsig(void); | ||
155 | #if defined(MSDOS) && !defined(WIN16) | ||
156 | static int noecho_fgets(char *buf, int size, FILE *tty); | ||
157 | #endif | ||
158 | #else | ||
159 | static void read_till_nl(); | ||
160 | static void recsig(); | ||
161 | static void pushsig(); | ||
162 | static void popsig(); | ||
163 | #if defined(MSDOS) && !defined(WIN16) | ||
164 | static int noecho_fgets(); | ||
165 | #endif | ||
166 | #endif | ||
167 | |||
168 | #ifdef SIGACTION | ||
169 | static struct sigaction savsig[NX509_SIG]; | ||
170 | #else | ||
171 | # ifndef NOPROTO | ||
172 | static void (*savsig[NX509_SIG])(int ); | ||
173 | # else | ||
174 | static void (*savsig[NX509_SIG])(); | ||
175 | # endif | ||
176 | #endif | ||
177 | static jmp_buf save; | ||
178 | |||
179 | int des_read_pw_string(buf, length, prompt, verify) | ||
180 | char *buf; | ||
181 | int length; | ||
182 | char *prompt; | ||
183 | int verify; | ||
184 | { | ||
185 | char buff[BUFSIZ]; | ||
186 | int ret; | ||
187 | |||
188 | ret=des_read_pw(buf,buff,(length>BUFSIZ)?BUFSIZ:length,prompt,verify); | ||
189 | memset(buff,0,BUFSIZ); | ||
190 | return(ret); | ||
191 | } | ||
192 | |||
193 | #ifndef WIN16 | ||
194 | |||
195 | static void read_till_nl(in) | ||
196 | FILE *in; | ||
197 | { | ||
198 | #define SIZE 4 | ||
199 | char buf[SIZE+1]; | ||
200 | |||
201 | do { | ||
202 | fgets(buf,SIZE,in); | ||
203 | } while (strchr(buf,'\n') == NULL); | ||
204 | } | ||
205 | |||
206 | |||
207 | /* return 0 if ok, 1 (or -1) otherwise */ | ||
208 | int des_read_pw(buf, buff, size, prompt, verify) | ||
209 | char *buf; | ||
210 | char *buff; | ||
211 | int size; | ||
212 | char *prompt; | ||
213 | int verify; | ||
214 | { | ||
215 | #ifdef VMS | ||
216 | struct IOSB iosb; | ||
217 | $DESCRIPTOR(terminal,"TT"); | ||
218 | long tty_orig[3], tty_new[3]; | ||
219 | long status; | ||
220 | unsigned short channel = 0; | ||
221 | #else | ||
222 | #ifndef MSDOS | ||
223 | TTY_STRUCT tty_orig,tty_new; | ||
224 | #endif | ||
225 | #endif | ||
226 | int number=5; | ||
227 | int ok=0; | ||
228 | int ps=0; | ||
229 | int is_a_tty=1; | ||
230 | |||
231 | FILE *tty=NULL; | ||
232 | char *p; | ||
233 | |||
234 | #ifndef MSDOS | ||
235 | if ((tty=fopen("/dev/tty","r")) == NULL) | ||
236 | tty=stdin; | ||
237 | #else /* MSDOS */ | ||
238 | if ((tty=fopen("con","r")) == NULL) | ||
239 | tty=stdin; | ||
240 | #endif /* MSDOS */ | ||
241 | |||
242 | #if defined(TTY_get) && !defined(VMS) | ||
243 | if (TTY_get(fileno(tty),&tty_orig) == -1) | ||
244 | { | ||
245 | #ifdef ENOTTY | ||
246 | if (errno == ENOTTY) | ||
247 | is_a_tty=0; | ||
248 | else | ||
249 | #endif | ||
250 | #ifdef EINVAL | ||
251 | /* Ariel Glenn ariel@columbia.edu reports that solaris | ||
252 | * can return EINVAL instead. This should be ok */ | ||
253 | if (errno == EINVAL) | ||
254 | is_a_tty=0; | ||
255 | else | ||
256 | #endif | ||
257 | return(-1); | ||
258 | } | ||
259 | memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig)); | ||
260 | #endif | ||
261 | #ifdef VMS | ||
262 | status = SYS$ASSIGN(&terminal,&channel,0,0); | ||
263 | if (status != SS$_NORMAL) | ||
264 | return(-1); | ||
265 | status=SYS$QIOW(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0); | ||
266 | if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) | ||
267 | return(-1); | ||
268 | #endif | ||
269 | |||
270 | if (setjmp(save)) | ||
271 | { | ||
272 | ok=0; | ||
273 | goto error; | ||
274 | } | ||
275 | pushsig(); | ||
276 | ps=1; | ||
277 | |||
278 | #ifdef TTY_FLAGS | ||
279 | tty_new.TTY_FLAGS &= ~ECHO; | ||
280 | #endif | ||
281 | |||
282 | #if defined(TTY_set) && !defined(VMS) | ||
283 | if (is_a_tty && (TTY_set(fileno(tty),&tty_new) == -1)) | ||
284 | return(-1); | ||
285 | #endif | ||
286 | #ifdef VMS | ||
287 | tty_new[0] = tty_orig[0]; | ||
288 | tty_new[1] = tty_orig[1] | TT$M_NOECHO; | ||
289 | tty_new[2] = tty_orig[2]; | ||
290 | status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0); | ||
291 | if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL)) | ||
292 | return(-1); | ||
293 | #endif | ||
294 | ps=2; | ||
295 | |||
296 | while ((!ok) && (number--)) | ||
297 | { | ||
298 | fputs(prompt,stderr); | ||
299 | fflush(stderr); | ||
300 | |||
301 | buf[0]='\0'; | ||
302 | fgets(buf,size,tty); | ||
303 | if (feof(tty)) goto error; | ||
304 | if (ferror(tty)) goto error; | ||
305 | if ((p=(char *)strchr(buf,'\n')) != NULL) | ||
306 | *p='\0'; | ||
307 | else read_till_nl(tty); | ||
308 | if (verify) | ||
309 | { | ||
310 | fprintf(stderr,"\nVerifying password - %s",prompt); | ||
311 | fflush(stderr); | ||
312 | buff[0]='\0'; | ||
313 | fgets(buff,size,tty); | ||
314 | if (feof(tty)) goto error; | ||
315 | if ((p=(char *)strchr(buff,'\n')) != NULL) | ||
316 | *p='\0'; | ||
317 | else read_till_nl(tty); | ||
318 | |||
319 | if (strcmp(buf,buff) != 0) | ||
320 | { | ||
321 | fprintf(stderr,"\nVerify failure"); | ||
322 | fflush(stderr); | ||
323 | break; | ||
324 | /* continue; */ | ||
325 | } | ||
326 | } | ||
327 | ok=1; | ||
328 | } | ||
329 | |||
330 | error: | ||
331 | fprintf(stderr,"\n"); | ||
332 | #ifdef DEBUG | ||
333 | perror("fgets(tty)"); | ||
334 | #endif | ||
335 | /* What can we do if there is an error? */ | ||
336 | #if defined(TTY_set) && !defined(VMS) | ||
337 | if (ps >= 2) TTY_set(fileno(tty),&tty_orig); | ||
338 | #endif | ||
339 | #ifdef VMS | ||
340 | if (ps >= 2) | ||
341 | status = SYS$QIOW(0,channel,IO$_SETMODE,&iosb,0,0 | ||
342 | ,tty_orig,12,0,0,0,0); | ||
343 | #endif | ||
344 | |||
345 | if (ps >= 1) popsig(); | ||
346 | if (stdin != tty) fclose(tty); | ||
347 | #ifdef VMS | ||
348 | status = SYS$DASSGN(channel); | ||
349 | #endif | ||
350 | return(!ok); | ||
351 | } | ||
352 | |||
353 | #else /* WIN16 */ | ||
354 | |||
355 | int des_read_pw(buf, buff, size, prompt, verify) | ||
356 | char *buf; | ||
357 | char *buff; | ||
358 | int size; | ||
359 | char *prompt; | ||
360 | int verify; | ||
361 | { | ||
362 | memset(buf,0,size); | ||
363 | memset(buff,0,size); | ||
364 | return(0); | ||
365 | } | ||
366 | |||
367 | #endif | ||
368 | |||
369 | static void pushsig() | ||
370 | { | ||
371 | int i; | ||
372 | |||
373 | for (i=1; i<NX509_SIG; i++) | ||
374 | { | ||
375 | #ifdef SIGUSR1 | ||
376 | if (i == SIGUSR1) | ||
377 | continue; | ||
378 | #endif | ||
379 | #ifdef SIGUSR2 | ||
380 | if (i == SIGUSR2) | ||
381 | continue; | ||
382 | #endif | ||
383 | #ifdef SIGACTION | ||
384 | sigaction(i,NULL,&savsig[i]); | ||
385 | #else | ||
386 | savsig[i]=signal(i,recsig); | ||
387 | #endif | ||
388 | } | ||
389 | |||
390 | #ifdef SIGWINCH | ||
391 | signal(SIGWINCH,SIG_DFL); | ||
392 | #endif | ||
393 | } | ||
394 | |||
395 | static void popsig() | ||
396 | { | ||
397 | int i; | ||
398 | |||
399 | for (i=1; i<NX509_SIG; i++) | ||
400 | { | ||
401 | #ifdef SIGUSR1 | ||
402 | if (i == SIGUSR1) | ||
403 | continue; | ||
404 | #endif | ||
405 | #ifdef SIGUSR2 | ||
406 | if (i == SIGUSR2) | ||
407 | continue; | ||
408 | #endif | ||
409 | #ifdef SIGACTION | ||
410 | sigaction(i,&savsig[i],NULL); | ||
411 | #else | ||
412 | signal(i,savsig[i]); | ||
413 | #endif | ||
414 | } | ||
415 | } | ||
416 | |||
417 | static void recsig(i) | ||
418 | int i; | ||
419 | { | ||
420 | longjmp(save,1); | ||
421 | #ifdef LINT | ||
422 | i=i; | ||
423 | #endif | ||
424 | } | ||
425 | |||
426 | #if defined(MSDOS) && !defined(WIN16) | ||
427 | static int noecho_fgets(buf,size,tty) | ||
428 | char *buf; | ||
429 | int size; | ||
430 | FILE *tty; | ||
431 | { | ||
432 | int i; | ||
433 | char *p; | ||
434 | |||
435 | p=buf; | ||
436 | for (;;) | ||
437 | { | ||
438 | if (size == 0) | ||
439 | { | ||
440 | *p='\0'; | ||
441 | break; | ||
442 | } | ||
443 | size--; | ||
444 | #ifdef WIN16TTY | ||
445 | i=_inchar(); | ||
446 | #else | ||
447 | i=getch(); | ||
448 | #endif | ||
449 | if (i == '\r') i='\n'; | ||
450 | *(p++)=i; | ||
451 | if (i == '\n') | ||
452 | { | ||
453 | *p='\0'; | ||
454 | break; | ||
455 | } | ||
456 | } | ||
457 | return(strlen(buf)); | ||
458 | } | ||
459 | #endif | ||