guard.srv.c 2.8 KB

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