亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tokencommon.c

?? cryptoboot is set of tools for disk encryption on Unix. It is especially suited to encrypt root par
?? C
字號:
#include "all.h"#include <stdio.h>#include <readline/readline.h>#include <readline/history.h>#include <stdlib.h>#include "shell.h"#include "util.h"#include "globalvars.h"voidfillUserTab(out_tab, doc)	xmlNodePtr** out_tab;	xmlDocPtr doc;{	xmlNodePtr user, cur, root;	xmlNodePtr* tab;	int i;		/* Count elements */	root = xmlDocGetRootElement(doc);	i = 0;	for (cur = root->xmlChildrenNode; cur != NULL; cur = cur->next)	{		if (0 == xmlStrcmp(cur->name, "users"))		{			for (user = cur->xmlChildrenNode; user != NULL; user = user->next)				if (0 == xmlStrcmp(user->name, "user"))					i++;			break;		}	}	tab = malloc(sizeof(xmlNodePtr) * (i + 1));		i = 0;	for (cur = root->xmlChildrenNode; cur != NULL; cur = cur->next)	{		if (0 == xmlStrcmp(cur->name, "users"))		{			for (user = cur->xmlChildrenNode; user != NULL; user = user->next)				if (0 == xmlStrcmp(user->name, "user"))				{					tab[i]= user;					i++;				}			break;		}	}		tab[i] = (xmlNodePtr) NULL;		*out_tab = tab;		return;}/* If count not null, function puts in it iteration count */intgetUserTokenKey(out_key, out_count, userNode, passphrase)	u_int8_t** out_key;	unsigned long* out_count;	xmlNodePtr userNode;	char* passphrase;{	u_int8_t* pkey; /* passphrase derived key */	u_int8_t* ukey; /* decrypted, userTokenKey */	u_int8_t* ekey; /* encrypted, userTokenKey */	u_int8_t* salt;	u_int8_t* emagicStored;	u_int8_t* emagicComputed;	xmlChar* saltText;	xmlChar* ekeyText;	xmlChar* emagicTextStored;	int saltlen;	int iterationCount;	xmlChar* iterationCountText;	xmlNodePtr cur, bcur;	int ret;	AES_KEY ik;	int result;	result = -1;		/* Get pbkdf2 arguments and key from xml node */	/* Find pbkdf2 tag */	for (bcur = userNode->xmlChildrenNode; bcur != NULL; bcur= bcur->next)	{		if (0 == xmlStrcmp(bcur->name, (const xmlChar*) "pbkdf2"))		{			/* Get iteration count */			iterationCountText = xmlGetProp(bcur, "iterations");			iterationCount = atoi(iterationCountText);			xmlFree(iterationCountText);			/* Get salt and salt length in bytes */			for (cur = bcur->xmlChildrenNode; cur != NULL; cur = cur->next)			{				if (0 == xmlStrcmp(cur->name, (const xmlChar*) "salt"))				{					saltText=xmlNodeListGetString(ctoken,cur->xmlChildrenNode,1);					cleanWhiteSpace((char**)(&saltText));					/* Salt is in hex-string format, so its length					 * in bytes is two times smaller. XML Schema's job					 * is to warn if salt is in bad format					 */									saltlen = strlen(saltText) / 2;					/* Convert salt to byte tab */					hex2byte(&salt, saltText, saltlen);					xmlFree(saltText);					break;				}			}		}		else if (0 == xmlStrcmp(bcur->name, (const xmlChar*) "userkey"))		{			for (cur = bcur->xmlChildrenNode; cur != NULL; cur = cur->next)			{				if (0 == xmlStrcmp(cur->name, (const xmlChar*) "key128"))				{					ekeyText = xmlNodeListGetString(ctoken,				 																  cur->xmlChildrenNode, 1);					cleanWhiteSpace((char**)(&ekeyText));					/* Convert key to byte tab */					hex2byte(&ekey, ekeyText, 128/8);					xmlFree(ekeyText);				}				else if (0 == xmlStrcmp(cur->name, (const xmlChar*) "encmagic"))				{					emagicTextStored = xmlNodeListGetString(ctoken,				 																  cur->xmlChildrenNode, 1);					cleanWhiteSpace((char**)(&emagicTextStored));					/* Convert key to byte tab */					hex2byte(&emagicStored, emagicTextStored, 128/8);					xmlFree(emagicTextStored);				}			}		}	}	/* Transform passphrase, salt and interation count into pkey	 * using pbkdf2 as key derivation function */	ret = pkcs5_pbkdf2(&pkey, 128/8, passphrase, strlen(passphrase),										 salt, saltlen, iterationCount);	free(salt);	if (ret != 0)	{		printf("pbkdf2 error.\n");		exit(1);	}	else	{		ukey = (u_int8_t*) malloc(128/8);		/* Dekrypt userTokenKey using pkey as a key */		AES_set_decrypt_key(pkey, 128, &ik);		/* FIXME: current implementation decrypts data only		 * 				one-block long - if user wants longer data		 * 				it will not work.		 */		AES_ecb_encrypt(ekey, ukey, &ik, AES_DECRYPT);		free(ekey);		free(pkey);		/* Encrypt magic string with ukey to see if passphrase is correct */		emagicComputed = (u_int8_t*) malloc(128/8);		AES_set_encrypt_key(ukey, 128, &ik);		AES_ecb_encrypt(MAGIC_STRING, emagicComputed, &ik, AES_ENCRYPT);		if (0 == memcmp(emagicComputed, emagicStored, 128/8))		{			*out_key = ukey;			if (NULL != out_count)				*out_count = iterationCount;			result = 1;		}		free(emagicStored);		free(emagicComputed);	}		return result;}/* Returns 1 if correct token detected, 0 if not, -1 if fatal error */intgetTokenConfig(dev, type, mnt, filename, out_result)	char* dev;	char* type;	char* mnt;	char* filename;	char** out_result;{	char* name;	char* tmpname;	xmlDocPtr tmpDoc;	int ret, fd, result;	/* Construct full name of token config file */	xstrcat(&tmpname, mnt, "/");	xstrcat(&name, tmpname, filename);	free(tmpname);	/* Try to open device to see if it is inserted */	fd = open(dev, O_RDONLY);	if (fd == -1)	{		result = 0;		if (errno == EACCES)			*out_result = "permission denied";		else			*out_result = "not detected";	}	else	{		ret = close(fd);		if (-1 == ret)		{			*out_result = "closing device failed";			result = -1;		}		else		{			/* Try to mount device readonly using given fstype */			ret = mount(dev, mnt, type, 0xC0ED0000 | MS_RDONLY, NULL);			if (ret == -1)			{				*out_result = "mounting error";				result = 0;			}			else			{				/* Check existence of token config file */				fd = open(name, O_RDONLY);				if (fd == -1) 				{					ret = umount(mnt);					if (ret == -1)					{						*out_result = "umounting error";						result = -1;					}					else					{						*out_result = "config file not found";						result = 0;					}				}				else				{					ret = close(fd);					if (-1 == ret)					{						*out_result = "closing file failed";						result = -1;					}					else					{						/* Parse token config file */						tmpDoc = xmlParseFile(name);						if (NULL == tmpDoc)						{							ret = umount(mnt);							if (ret == -1)							{								*out_result = "umounting error";								result = -1;							}							else							{								*out_result = "config file parsing error";								return 0;							}						}						else						{							/* Umount fs */							ret = umount(mnt);							if (-1 == ret)							{								*out_result = "umounting error";								result = -1;							}							else							{								/* Return xmlDocPtr */								ctoken = tmpDoc;								*out_result = "detected";								result = 1;							}						}					}				}			}		}	}	free(name);	return result;}/* Joins tokenTab with diskTab on encmagic */intjoinUNodeTabs(out_tTab, out_dTab, tokenTab, diskTab)	xmlNodePtr** out_tTab;	xmlNodePtr** out_dTab;	xmlNodePtr* tokenTab;	xmlNodePtr* diskTab;{	xmlChar* temagic;	xmlChar* demagic;	int i;	int j;	int tokenCount, diskCount, tabIndex;	xmlNodePtr* ttab;	xmlNodePtr* dtab;	xmlNodePtr cur;	size_t tabMaxSize;			for (i = 0; NULL != tokenTab[i]; i++);	tokenCount = i;	for (i = 0; NULL != diskTab[i]; i++);	diskCount = i;	tabMaxSize = sizeof(xmlNodePtr) * (tokenCount + diskCount + 1);		ttab = (xmlNodePtr*) malloc(tabMaxSize);	dtab = (xmlNodePtr*) malloc(tabMaxSize);	tabIndex = 0;	for (i = 0; NULL != tokenTab[i]; i++)		for (j = 0; NULL != diskTab[j]; j++)		{			for (cur = tokenTab[i]->xmlChildrenNode;					 NULL != cur; cur = cur->next)			{				if (0 == xmlStrcmp(cur->name, "userkey"))				{					for (cur = cur->xmlChildrenNode;							 NULL != cur; cur = cur->next)					{						if (0 == xmlStrcmp(cur->name, "encmagic"))						{							temagic = xmlNodeListGetString(ctoken,												cur->xmlChildrenNode, 1);							break;						}					}					break;				}			}						for (cur = diskTab[j]->xmlChildrenNode;					 NULL != cur; cur = cur->next)			{				if (0 == xmlStrcmp(cur->name, "encmagic"))				{					demagic = xmlNodeListGetString(ctab,										cur->xmlChildrenNode, 1);					break;				}			}			cleanWhiteSpace((char**) (&temagic));			cleanWhiteSpace((char**) (&demagic));			if (0 == xmlStrcmp(temagic, demagic))			{				ttab[tabIndex] = tokenTab[i];				dtab[tabIndex] = diskTab[j];				tabIndex++;			}			xmlFree(temagic);			xmlFree(demagic);		}		ttab = (xmlNodePtr*) realloc(ttab, sizeof(xmlNodePtr) * tabIndex);	dtab = (xmlNodePtr*) realloc(dtab, sizeof(xmlNodePtr) * tabIndex);		*out_tTab = ttab;	*out_dTab = dtab;		return tabIndex;}/* We do not verify encmagic in <user> node, because it is * the same as in token. It is verified in getUserTokenKey. * Last but not least - users with encmagic mismatch are not * listed in user select window. */intdecryptMasterKey(out_masterKey, userTokenKey, userNode)	u_int8_t** out_masterKey;	u_int8_t* userTokenKey;	xmlNodePtr userNode;{	u_int8_t* mkey;	u_int8_t* ekey;	u_int8_t* emagicStored;	u_int8_t* emagicCurrent;	xmlChar* ekeyText;	xmlChar* emagicStoredText;	AES_KEY ik;	xmlNodePtr cur, root;	int ret;	int fresult = -1;		/* Get encrypted master key */	for (cur = userNode->xmlChildrenNode; cur != NULL; cur=cur->next)	{		if (0 == xmlStrcmp(cur->name, "key128"))		{			ekeyText = xmlNodeListGetString(ctab, cur->xmlChildrenNode, 1);			cleanWhiteSpace((char**)(&ekeyText));			ret = hex2byte(&ekey, ekeyText, 128/8);			if (ret == -1)			{				printf("Internal error.\n");				exit(1);			}			else			{				/* Decrypt master key using userTokenKey */				AES_set_decrypt_key(userTokenKey, 128, &ik);					mkey = malloc(128/8);								/* FIXME: current implementation decrypts data only				 * 				one-block long - if user wants longer data				 * 				it will not work.				 */				AES_ecb_encrypt(ekey, mkey, &ik, AES_DECRYPT);				free(ekey);							/* Check encmagic for master key */				root = xmlDocGetRootElement(ctab);				for (cur = root->xmlChildrenNode; NULL != cur; cur = cur->next)				{					if (0 == xmlStrcmp(cur->name, "encmagic"))					{						emagicStoredText = xmlNodeListGetString(ctab,															 cur->xmlChildrenNode, 1);						cleanWhiteSpace((char**) (&emagicStoredText));						emagicStored = (u_int8_t*) malloc(128/8);						hex2byte(&emagicStored, emagicStoredText, 128/8);						xmlFree(emagicStoredText);												emagicCurrent = (u_int8_t*) malloc(128/8);						AES_set_encrypt_key(mkey, 128, &ik);						AES_ecb_encrypt(MAGIC_STRING,emagicCurrent,&ik,AES_ENCRYPT);												if (0 == memcmp(emagicCurrent, emagicStored, 128/8))						{							(*out_masterKey) = mkey;							fresult = 1;						}						free(emagicCurrent);						free(emagicStored);						break;					}				}			}			xmlFree(ekeyText);			break;		}	}		return fresult;}/* When out_dUserNode is NULL then user will choose from token * users - even if these users are not it ctab; * of course no ctab node will be returned in out_dUserNode then */intpromptForUser(out_tUserNode, out_dUserNode)	xmlNodePtr* out_tUserNode;	xmlNodePtr* out_dUserNode;{	xmlNodePtr* tokenTab;	xmlNodePtr* diskTab;	xmlNodePtr* dUNodeTab;	xmlNodePtr* tUNodeTab;	int ret, i, userCount;	int result = -1;	xmlChar* name;	unsigned long sel;	char* selText;			fillUserTab(&tokenTab, ctoken);	fillUserTab(&diskTab, ctab);	if (NULL != out_dUserNode)	{		userCount = joinUNodeTabs(&tUNodeTab,&dUNodeTab,tokenTab,diskTab);	}	else	{		for (i = 0; NULL != tokenTab[i]; i++);		userCount = i;		fillUserTab(&dUNodeTab, ctoken);		fillUserTab(&tUNodeTab, ctoken);	}			if (0 == userCount)	{		for (i = 0; NULL != tokenTab[i]; i++);		if (0 == i)		{			printf("No users on token found.\n");		}		else		{			printf("No user on token is allowed to access this machine.\n");		}		result = -1;	}	else if (1 == userCount)	{		name = xmlGetProp(tUNodeTab[0], "name");		printf("User '%s' found.\n", name);		xmlFree(name);		*out_tUserNode = tUNodeTab[0];		if (NULL != out_dUserNode)			*out_dUserNode = dUNodeTab[0];		result = 1;	}	else	{		printf("  #\tUser\n");		for (i = 0; i < userCount; i++)		{			name = xmlGetProp(tUNodeTab[i], "name");			printf(" %2d\t%s\n", i, name);			xmlFree(name);		}		selText = readline("Select user: ");		if (NULL != selText)		{			ret = str2num(&sel, selText);			if (-1 != ret)			{				if ((sel < userCount) && (sel >= 0))				{					*out_tUserNode = tUNodeTab[sel];					if (NULL != out_dUserNode)						*out_dUserNode = dUNodeTab[sel];					name = xmlGetProp(tUNodeTab[sel], "name");					printf("You have selected '%s'.\n", name);					xmlFree(name);					result = 1;				}				else					printf("No such user.\n");			}			else				printf("Bad index '%s'.\n", selText);			free(selText);		}		else			printf("\n");	}		free(diskTab);	free(tokenTab);	free(dUNodeTab);	free(tUNodeTab);	return result;}/* Prints index and user name from node tab entry given by this index *//* If user name is empty prints "-" (usefull, when someone don't want * to save user names in cryptotab) */voidprintUserLine(index, node)	int index;	xmlNodePtr node;{	xmlChar* name;	name = xmlGetProp(node, "name");	if (NULL != name)	{		printf(" %2d\t%s\n", index, name);		xmlFree(name);	}	else		printf(" %2d\t%s\n", index, "-");			return;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩午夜av一区| 亚洲成人一区二区在线观看| 日韩欧美一区二区久久婷婷| 欧美二区三区91| 欧美色图在线观看| 欧美视频一区在线观看| 欧美日韩一区精品| 在线不卡中文字幕播放| 欧美精品tushy高清| 91精品国产综合久久精品app| 欧美在线播放高清精品| 欧美色图12p| 欧美精品一二三四| 欧美一区二区三区电影| 欧美大黄免费观看| 久久久青草青青国产亚洲免观| 久久久久高清精品| 国产精品色婷婷| 中文字幕欧美一区| 亚洲最新视频在线观看| 五月天婷婷综合| 青椒成人免费视频| 国产一区二区三区四区在线观看| 国产福利一区二区| 99麻豆久久久国产精品免费优播| 色婷婷综合久久久久中文| 在线一区二区三区| 91精品国产综合久久久久久| 精品国产成人在线影院| 国产精品美女久久久久久久久| 成人免费在线播放视频| 亚洲 欧美综合在线网络| 蜜桃av一区二区在线观看| 国产福利精品导航| 欧美亚洲综合一区| 日韩欧美一区二区不卡| 国产精品国产三级国产aⅴ无密码| 亚洲欧洲另类国产综合| 亚洲成av人片在www色猫咪| 欧美aaaaaa午夜精品| 国产九色sp调教91| 在线看国产日韩| 日韩免费福利电影在线观看| 国产精品乱码久久久久久| 亚洲一区在线播放| 国产精品资源站在线| 色婷婷综合久久久久中文一区二区| 欧美高清你懂得| 国产精品嫩草99a| 婷婷久久综合九色综合绿巨人 | 国产精品久久国产精麻豆99网站| 一区二区三区波多野结衣在线观看| 秋霞成人午夜伦在线观看| 国产91综合一区在线观看| 欧美性受xxxx黑人xyx性爽| 26uuu亚洲综合色欧美| 亚洲欧美另类久久久精品2019| 久久99国产精品免费网站| 91免费国产视频网站| 精品国内片67194| 一区二区三区在线高清| 国产一区二区三区国产| 欧美精品在线观看播放| 亚洲人精品午夜| 久久99精品久久久久婷婷| 日本大香伊一区二区三区| 久久一二三国产| 无码av中文一区二区三区桃花岛| 成人免费毛片a| 日韩午夜中文字幕| 亚洲高清视频中文字幕| 成人午夜伦理影院| 欧美精品一区二区三区在线| 亚洲二区视频在线| 91在线视频播放地址| 国产校园另类小说区| 蜜桃在线一区二区三区| 欧美视频在线观看一区| 成人免费视频在线观看| 国产成人免费视频精品含羞草妖精| 91麻豆精品国产91久久久久久| 中文字幕在线不卡一区二区三区| 国产一区二区三区久久久 | 欧美精品777| 亚洲欧美精品午睡沙发| www.性欧美| 亚洲国产精品激情在线观看| 激情国产一区二区| 91精品一区二区三区在线观看| 一区二区三区四区亚洲| 99久久99久久精品免费观看| 国产欧美日韩视频在线观看| 国内外精品视频| 日韩欧美一区在线观看| 日韩综合一区二区| 欧美日韩视频专区在线播放| 亚洲午夜免费电影| 色先锋资源久久综合| 亚洲素人一区二区| 99久久精品99国产精品| 中文字幕在线不卡| 成人禁用看黄a在线| 国产精品美女www爽爽爽| 国产成人午夜精品5599| 国产午夜精品一区二区三区视频| 韩国精品一区二区| 欧美精品一区二区三区在线播放| 精品一区二区三区不卡| 精品国产精品一区二区夜夜嗨| 蜜臀av性久久久久蜜臀aⅴ | 欧美mv和日韩mv国产网站| 青椒成人免费视频| 精品第一国产综合精品aⅴ| 国产曰批免费观看久久久| 国产香蕉久久精品综合网| 成人久久久精品乱码一区二区三区| 国产日韩综合av| 成人av影视在线观看| 国产精品久久精品日日| 91传媒视频在线播放| 天天色图综合网| 日韩精品在线一区二区| 国产精品正在播放| 国产精品女主播在线观看| 一本久道久久综合中文字幕| 亚洲第一狼人社区| 欧美一区二区三区不卡| 国产在线观看一区二区| 一区精品在线播放| 精品视频在线视频| 蓝色福利精品导航| 国产色综合久久| 99久久夜色精品国产网站| 亚洲一区二区在线免费看| 欧美二区在线观看| 国产麻豆91精品| 亚洲欧美激情视频在线观看一区二区三区| 日本高清不卡视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产喂奶挤奶一区二区三区| 91免费视频网址| 男女激情视频一区| 中文字幕免费不卡| 欧美色欧美亚洲另类二区| 美国十次了思思久久精品导航| 国产精品私人影院| 欧美午夜一区二区三区| 久国产精品韩国三级视频| 国产精品久久久久国产精品日日| 欧美日韩国产精品自在自线| 国产主播一区二区三区| 亚洲人成网站影音先锋播放| 91精品国产免费| av色综合久久天堂av综合| 午夜精品福利一区二区三区av| 国产亚洲精品aa午夜观看| 欧美三级电影网| 丁香六月久久综合狠狠色| 三级不卡在线观看| 国产精品私人自拍| 日韩欧美国产一区二区在线播放 | 国产精品一区二区91| 一区二区在线观看视频| 精品第一国产综合精品aⅴ| 在线免费视频一区二区| 国产一区二区三区免费看| 午夜精品福利一区二区三区蜜桃| 国产精品美日韩| 欧美一区二区久久| 一本色道a无线码一区v| 国产激情视频一区二区在线观看| 亚洲综合在线第一页| 国产精品女人毛片| 欧美电影免费观看高清完整版在线观看| 99re热视频精品| 国产成人午夜精品5599| 美腿丝袜一区二区三区| 一片黄亚洲嫩模| 中文字幕国产一区| 日韩视频免费观看高清在线视频| 色香色香欲天天天影视综合网| 国产成人99久久亚洲综合精品| 蜜臀a∨国产成人精品| 亚洲丰满少妇videoshd| 亚洲三级在线观看| 国产精品成人在线观看| 久久久久久亚洲综合影院红桃| 91麻豆精品国产91久久久 | 日韩网站在线看片你懂的| 欧美系列在线观看| av男人天堂一区| 粉嫩13p一区二区三区| 久久成人麻豆午夜电影| 丝袜美腿高跟呻吟高潮一区| 一区二区三区精品视频| 日韩毛片高清在线播放| 国产精品美女一区二区三区| 亚洲国产精品ⅴa在线观看| 国产亚洲一区二区在线观看| 日韩免费观看高清完整版在线观看|