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