Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <libsec.h>
4 #include <libString.h>
5 #include "dat.h"
7 void
8 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 void
73 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 }