random128.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #if HAVE_UNISTD_H
  9. #include <unistd.h>
  10. #endif
  11. #if HAVE_FCNTL_H
  12. #include <fcntl.h>
  13. #endif
  14. #include <time.h>
  15. #include <sys/types.h>
  16. #include <sys/wait.h>
  17. #define MD5_INTERNAL
  18. #include "md5/md5.h"
  19. #include "random128.h"
  20. static const char rcsid[]="$Id: random128.c,v 1.4 2000/01/10 04:21:02 mrsam Exp $";
  21. const char *random128()
  22. {
  23. static char randombuf[sizeof(MD5_DIGEST)*2+1];
  24. #ifdef RANDOM
  25. {
  26. int fd=open(RANDOM, O_RDONLY);
  27. char buf2[sizeof(MD5_DIGEST)];
  28. int i;
  29. if (fd >= 0)
  30. {
  31. if (read(fd, buf2, sizeof(buf2)) == sizeof(buf2))
  32. {
  33. for (i=0; i<sizeof(buf2); i++)
  34. sprintf(randombuf+i*2,
  35. "%02X",
  36. (int)(unsigned char)buf2[i]);
  37. close(fd);
  38. return (randombuf);
  39. }
  40. close(fd);
  41. }
  42. }
  43. #endif
  44. /* /dev/urandom not available or broken?  Create some noise */
  45. {
  46. int pipefd[2];
  47. int s;
  48. char buf[512];
  49. struct MD5_CONTEXT context;
  50. MD5_DIGEST digest;
  51. int n;
  52. time_t t;
  53. pid_t p, p2;
  54. unsigned long l;
  55. time(&t);
  56. p=getpid();
  57. if (pipe(pipefd)) return (0);
  58. while ((p=fork()) == -1)
  59. {
  60. sleep (5);
  61. }
  62. if (p == 0)
  63. {
  64. close(1);
  65. dup(pipefd[1]);
  66. close(2);
  67. dup(pipefd[1]);
  68. close(pipefd[0]);
  69. close(pipefd[1]);
  70. #ifdef W
  71. while ((p=fork()) == -1)
  72. {
  73. sleep (5);
  74. }
  75. if (p == 0)
  76. {
  77. execl(W, W, (char *)0);
  78. perror(W);
  79. _exit(0);
  80. }
  81. while (wait(&s) >= 0)
  82. ;
  83. #endif
  84. execl(PS, PS, PS_OPTIONS, (char *)0);
  85. perror(PS);
  86. _exit(0);
  87. }
  88. close(pipefd[1]);
  89. md5_context_init(&context);
  90. md5_context_hashstream(&context, &t, sizeof(t));
  91. md5_context_hashstream(&context, &p, sizeof(p));
  92. l=sizeof(t)+sizeof(p);
  93. while ((n=read(pipefd[0], buf, sizeof(buf))) > 0)
  94. {
  95. md5_context_hashstream(&context, buf, n);
  96. l += n;
  97. }
  98. md5_context_endstream(&context, l);
  99. md5_context_digest(&context, digest);
  100. close(pipefd[0]);
  101. while ((p2=wait(&s)) >= 0 && p != p2)
  102. ;
  103. for (n=0; n<sizeof(digest); n++)
  104. sprintf(randombuf+n*2,
  105. "%02X", (int)(unsigned char)digest[n]);
  106. }
  107. return (randombuf);
  108. }