token.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <libsec.h>
  4. #include <String.h>
  5. #include "dat.h"
  6. void
  7. usage(void)
  8. {
  9. fprint(2, "usage: %s key [token [file]]\n", argv0);
  10. exits("usage");
  11. }
  12. static String*
  13. mktoken(char *key, long thetime)
  14. {
  15. char *now;
  16. uchar digest[SHA1dlen];
  17. char token[64];
  18. String *s;
  19. now = ctime(thetime);
  20. memset(now+11, ':', 8);
  21. hmac_sha1((uchar*)now, strlen(now), (uchar*)key, strlen(key), digest, nil);
  22. enc64(token, sizeof token, digest, sizeof digest);
  23. s = s_new();
  24. s_nappend(s, token, 5);
  25. return s;
  26. }
  27. static char*
  28. check_token(char *key, char *file)
  29. {
  30. String *s;
  31. long now;
  32. int i;
  33. char buf[1024];
  34. int fd;
  35. fd = open(file, OREAD);
  36. if(fd < 0)
  37. return "no match";
  38. i = read(fd, buf, sizeof(buf)-1);
  39. close(fd);
  40. if(i < 0)
  41. return "no match";
  42. buf[i] = 0;
  43. now = time(0);
  44. for(i = 0; i < 14; i++){
  45. s = mktoken(key, now-24*60*60*i);
  46. if(strstr(buf, s_to_c(s)) != nil){
  47. s_free(s);
  48. return nil;
  49. }
  50. s_free(s);
  51. }
  52. return "no match";
  53. }
  54. static char*
  55. create_token(char *key)
  56. {
  57. String *s;
  58. s = mktoken(key, time(0));
  59. print("%s", s_to_c(s));
  60. return nil;
  61. }
  62. void
  63. main(int argc, char **argv)
  64. {
  65. ARGBEGIN {
  66. } ARGEND;
  67. switch(argc){
  68. case 2:
  69. exits(check_token(argv[0], argv[1]));
  70. break;
  71. case 1:
  72. exits(create_token(argv[0]));
  73. break;
  74. default:
  75. usage();
  76. }
  77. exits(0);
  78. }