pass.c
上传用户:minyiyu
上传日期:2018-12-24
资源大小:864k
文件大小:2k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.     Pirate Bulletin Board System
  3.     Copyright (C) 1990, Edward Luke, lush@Athena.EE.MsState.EDU
  4.     Eagles Bulletin Board System
  5.     Copyright (C) 1992, Raymond Rocker, rocker@rock.b11.ingr.com
  6.                         Guy Vega, gtvega@seabass.st.usm.edu
  7.                         Dominic Tynes, dbtynes@seabass.st.usm.edu
  8.     Firebird Bulletin Board System
  9.     Copyright (C) 1996, Hsien-Tsung Chang, Smallpig.bbs@bbs.cs.ccu.edu.tw
  10.                         Peng Piaw Foong, ppfoong@csie.ncu.edu.tw
  11.     This program is free software; you can redistribute it and/or modify
  12.     it under the terms of the GNU General Public License as published by
  13.     the Free Software Foundation; either version 1, or (at your option)
  14.     any later version.
  15.     This program is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU General Public License for more details.
  19. */
  20. /*
  21. $Id: pass.c,v 1.3 2000/01/29 23:19:09 edwardc Exp $
  22. */
  23. #include "bbs.h"
  24. #include <sys/param.h>
  25. #include <sys/resource.h>
  26. #include <pwd.h>
  27. char   *crypt();
  28. #if !defined(MD5) && !defined(DES)
  29.   /* nor DES, MD5, fatal error!! */
  30. #error "(pass.c) you've not define DES nor MD5, fatal error!!"
  31. #endif
  32. static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
  33. "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  34. void
  35. to64(char *s, long v, int n)
  36. {
  37. while (--n >= 0) {
  38. *s++ = itoa64[v & 0x3f];
  39. v >>= 6;
  40. }
  41. }
  42. char   *
  43. genpasswd(char *pw)
  44. {
  45. char    salt[10];
  46. static char pwbuf[PASSLEN];
  47. struct timeval tv;
  48. if (strlen(pw) == 0)
  49. return "";
  50. srand(time(0) % getpid());
  51. gettimeofday(&tv, 0);
  52. #ifdef MD5 /* use MD5 salt */
  53. strncpy(&salt[0], "$1$", 3);
  54. to64(&salt[3], random(), 3);
  55. to64(&salt[6], tv.tv_usec, 3);
  56. salt[8] = '';
  57. #endif
  58. #ifdef DES /* use DES salt */
  59. to64(&salt[0], random(), 3);
  60. to64(&salt[3], tv.tv_usec, 3);
  61. to64(&salt[6], tv.tv_sec, 2);
  62. salt[8] = '';
  63. #endif
  64. strcpy(pwbuf, pw);
  65. return crypt(pwbuf, salt);
  66. }
  67. int
  68. checkpasswd(char *passwd, char *test)
  69. {
  70. static char pwbuf[PASSLEN];
  71. char   *pw;
  72. strncpy(pwbuf, test, PASSLEN);
  73. pw = crypt(pwbuf, passwd);
  74. return (!strcmp(pw, passwd));
  75. }