guard.srv.c 2.3 KB

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