1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #include <u.h>
- #include <libc.h>
- #include <libsec.h>
- #include <String.h>
- #include "dat.h"
- void
- usage(void)
- {
- fprint(2, "usage: %s key [token [file]]\n", argv0);
- exits("usage");
- }
- static String*
- mktoken(char *key, long thetime)
- {
- char *now;
- uchar digest[SHA1dlen];
- char token[64];
- String *s;
-
- now = ctime(thetime);
- memset(now+11, ':', 8);
- hmac_sha1((uchar*)now, strlen(now), (uchar*)key, strlen(key), digest, nil);
- enc64(token, sizeof token, digest, sizeof digest);
- s = s_new();
- s_nappend(s, token, 5);
- return s;
- }
- static char*
- check_token(char *key, char *file)
- {
- String *s;
- long now;
- int i;
- char buf[1024];
- int fd;
- fd = open(file, OREAD);
- if(fd < 0)
- return "no match";
- i = read(fd, buf, sizeof(buf)-1);
- close(fd);
- if(i < 0)
- return "no match";
- buf[i] = 0;
-
- now = time(0);
- for(i = 0; i < 14; i++){
- s = mktoken(key, now-24*60*60*i);
- if(strstr(buf, s_to_c(s)) != nil){
- s_free(s);
- return nil;
- }
- s_free(s);
- }
- return "no match";
- }
- static char*
- create_token(char *key)
- {
- String *s;
- s = mktoken(key, time(0));
- print("%s", s_to_c(s));
- return nil;
- }
- void
- main(int argc, char **argv)
- {
- ARGBEGIN {
- } ARGEND;
- switch(argc){
- case 2:
- exits(check_token(argv[0], argv[1]));
- break;
- case 1:
- exits(create_token(argv[0]));
- break;
- default:
- usage();
- }
- exits(0);
- }
|