⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 token.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <libsec.h>#include <String.h>#include "dat.h"voidusage(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;}voidmain(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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -