guard.srv.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. /*
  10. * guard service
  11. */
  12. #include <u.h>
  13. #include <libc.h>
  14. #include <fcall.h>
  15. #include <bio.h>
  16. #include <ndb.h>
  17. #include <authsrv.h>
  18. #include "authcmdlib.h"
  19. enum {
  20. Pinlen = 4,
  21. };
  22. /*
  23. * c -> a client
  24. * a -> c challenge prompt
  25. * c -> a KC'{challenge}
  26. * a -> c OK or NO
  27. */
  28. void catchalarm(void*, char*);
  29. void getraddr(char*);
  30. char user[ANAMELEN];
  31. char raddr[128];
  32. int debug;
  33. Ndb *db;
  34. void
  35. main(int argc, char *argv[])
  36. {
  37. int n;
  38. int32_t chal;
  39. char *err;
  40. char ukey[DESKEYLEN], resp[32], buf[NETCHLEN];
  41. Ndb *db2;
  42. ARGBEGIN{
  43. case 'd':
  44. debug = 1;
  45. break;
  46. }ARGEND;
  47. db = ndbopen("/lib/ndb/auth");
  48. if(db == 0)
  49. syslog(0, AUTHLOG, "no /lib/ndb/auth");
  50. db2 = ndbopen(0);
  51. if(db2 == 0)
  52. syslog(0, AUTHLOG, "no /lib/ndb/local");
  53. db = ndbcat(db, db2);
  54. werrstr("");
  55. strcpy(raddr, "unknown");
  56. if(argc >= 1)
  57. getraddr(argv[argc-1]);
  58. argv0 = "guard";
  59. srand((getpid()*1103515245)^time(0));
  60. notify(catchalarm);
  61. /*
  62. * read the host and client and get their keys
  63. */
  64. if(readarg(0, user, sizeof user) < 0)
  65. fail(0);
  66. /*
  67. * challenge-response
  68. */
  69. chal = lnrand(MAXNETCHAL);
  70. snprint(buf, sizeof buf, "challenge: %lud\nresponse: ", chal);
  71. n = strlen(buf) + 1;
  72. if(write(1, buf, n) != n){
  73. if(debug)
  74. syslog(0, AUTHLOG, "g-fail %s@%s: %r sending chal",
  75. user, raddr);
  76. exits("replying to server");
  77. }
  78. alarm(3*60*1000);
  79. werrstr("");
  80. if(readarg(0, resp, sizeof resp) < 0){
  81. if(debug)
  82. syslog(0, AUTHLOG, "g-fail %s@%s: %r reading resp",
  83. user, raddr);
  84. fail(0);
  85. }
  86. alarm(0);
  87. /* remove password login from guard.research.bell-labs.com, sucre, etc. */
  88. // if(!findkey(KEYDB, user, ukey) || !netcheck(ukey, chal, resp))
  89. if(!findkey(NETKEYDB, user, ukey) || !netcheck(ukey, chal, resp))
  90. if((err = secureidcheck(user, resp)) != nil){
  91. print("NO %s", err);
  92. write(1, "NO", 2);
  93. if(debug) {
  94. char *r;
  95. /*
  96. * don't log the entire response, since the first
  97. * Pinlen digits may be the user's secure-id pin.
  98. */
  99. if (strlen(resp) < Pinlen)
  100. r = strdup("<too short for pin>");
  101. else if (strlen(resp) == Pinlen)
  102. r = strdup("<pin only>");
  103. else
  104. r = smprint("%.*s%s", Pinlen,
  105. "******************", resp + Pinlen);
  106. syslog(0, AUTHLOG,
  107. "g-fail %s@%s: %s: resp %s to chal %lud",
  108. user, raddr, err, r, chal);
  109. free(r);
  110. }
  111. fail(user);
  112. }
  113. write(1, "OK", 2);
  114. if(debug)
  115. syslog(0, AUTHLOG, "g-ok %s@%s", user, raddr);
  116. succeed(user);
  117. exits(0);
  118. }
  119. void
  120. catchalarm(void *x, char *msg)
  121. {
  122. USED(x); USED(msg);
  123. if(debug)
  124. syslog(0, AUTHLOG, "g-timed out %s", raddr);
  125. fail(0);
  126. }
  127. void
  128. getraddr(char *dir)
  129. {
  130. int n, fd;
  131. char *cp;
  132. char file[128];
  133. snprint(file, sizeof(file), "%s/remote", dir);
  134. fd = open(file, OREAD);
  135. if(fd < 0)
  136. return;
  137. n = read(fd, raddr, sizeof(raddr)-1);
  138. close(fd);
  139. if(n <= 0)
  140. return;
  141. raddr[n] = 0;
  142. cp = strchr(raddr, '\n');
  143. if(cp)
  144. *cp = 0;
  145. cp = strchr(raddr, '!');
  146. if(cp)
  147. *cp = 0;
  148. }