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

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

?? user.c

?? cryptlib安全工具包
?? C
?? 第 1 頁 / 共 4 頁
字號:
				break;
			}
		if( i >= MAX_USER_OBJECTS )
			break;
		}
	ENSURES_N( newFileRef < MAX_USER_OBJECTS );
	*fileRef = newFileRef;

	return( userIndexPtr );
	}

CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2, 4 ) ) \
static int createUserEntry( OUT_PTR USER_FILE_INFO **userIndexPtrPtr,
							IN_ARRAY( noUserIndexEntries ) \
								USER_FILE_INFO *userIndex, 
							IN_RANGE( 1, MAX_USER_OBJECTS ) \
								const int noUserIndexEntries,
							INOUT USER_FILE_INFO *userFileInfo )
	{
	USER_FILE_INFO *userIndexPtr;
	int fileRef, iterationCount, status = CRYPT_OK;

	assert( isWritePtr( userIndexPtrPtr, sizeof( USER_FILE_INFO * ) ) );
	assert( isWritePtr( userIndex, \
						sizeof( USER_FILE_INFO ) * noUserIndexEntries ) );
	assert( isWritePtr( userFileInfo, sizeof( USER_FILE_INFO ) ) );

	REQUIRES( noUserIndexEntries > 0 && \
			  noUserIndexEntries <= MAX_USER_OBJECTS );

	/* Clear return value */
	*userIndexPtrPtr = NULL;

	/* Check whether this user is already present in the index */
	if( findUser( userIndex, noUserIndexEntries, USERID_NAME, 
				  userFileInfo->userName, userFileInfo->userNameLength ) != NULL )
		return( CRYPT_ERROR_DUPLICATE );

	/* Make sure that the userID that we're using is unique.  This is a 
	   pretty straightforward operation, we just keep generating new random 
	   IDs until we get one that's not already present */
	for( iterationCount = 0; 
		 !cryptStatusError( status ) && \
			iterationCount < FAILSAFE_ITERATIONS_LARGE;
		 iterationCount++ )
		{
		if( findUser( userIndex, noUserIndexEntries, USERID_USERID, 
					  userFileInfo->userID, KEYID_SIZE ) != NULL )
			{
			MESSAGE_DATA msgData;

			setMessageData( &msgData, ( void * ) userFileInfo->userID, 
							KEYID_SIZE );
			status = krnlSendMessage( SYSTEM_OBJECT_HANDLE,
									  IMESSAGE_GETATTRIBUTE_S, &msgData,
									  CRYPT_IATTRIBUTE_RANDOM_NONCE );
			}
		}
	ENSURES( iterationCount < FAILSAFE_ITERATIONS_LARGE );

	/* Locate a new unused entry that we can use */
	userIndexPtr = findFreeEntry( userIndex, MAX_USER_OBJECTS, &fileRef );
	if( userIndexPtr == NULL )
		return( CRYPT_ERROR_OVERFLOW );
	userFileInfo->fileRef = fileRef;

	return( CRYPT_OK );
	}

/* Read the user index file:

	UserIndexEntry ::= SEQUENCE {
		iD					OCTET STRING SIZE(16),	-- User ID
		creatorID			OCTET STRING SIZE(16),	-- Creating SO's ID
		name				UTF8String,				-- User name
		fileReference		INTEGER					-- Reference to user file
		} */

CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2 ) ) \
static int readIndexEntry( INOUT STREAM *stream, 
						   INOUT USER_FILE_INFO *userIndexPtr )
	{
	USER_FILE_INFO userIndexEntry;
	long value;
	int length, status;

	assert( isWritePtr( stream, sizeof( STREAM ) ) );
	assert( isWritePtr( userIndexPtr, sizeof( USER_FILE_INFO ) ) );

	/* Clear return value */
	memset( userIndexPtr, 0, sizeof( USER_FILE_INFO ) );

	/* Read the user index data */
	memset( &userIndexEntry, 0, sizeof( USER_FILE_INFO ) );
	readSequence( stream, NULL );
	readOctetString( stream, userIndexEntry.userID, &length, KEYID_SIZE, 
					 KEYID_SIZE );
	readOctetString( stream, userIndexEntry.creatorID, &length, KEYID_SIZE, 
					 KEYID_SIZE );
	readCharacterString( stream, userIndexEntry.userName, 
						 CRYPT_MAX_TEXTSIZE, &userIndexEntry.userNameLength, 
						 BER_STRING_UTF8 );
	status = readShortInteger( stream, &value );
	if( cryptStatusError( status ) )
		return( status );
	userIndexEntry.fileRef = value;

	/* Return the result to the caller */
	memcpy( userIndexPtr, &userIndexEntry, sizeof( USER_FILE_INFO ) );
	return( CRYPT_OK );
	}

CHECK_RETVAL STDC_NONNULL_ARG( ( 2 ) ) \
static int readIndex( IN_HANDLE const CRYPT_KEYSET iIndexKeyset, 
					  IN_ARRAY( maxUserObjects ) USER_FILE_INFO *userIndex, 
					  IN_RANGE( 1, MAX_USER_OBJECTS ) const int maxUserObjects )
	{
	STREAM stream;
	DYNBUF userIndexDB;
	int i, iterationCount, status;

	assert( isWritePtr( userIndex, \
						maxUserObjects * sizeof( USER_FILE_INFO ) ) );

	REQUIRES( isHandleRangeValid( iIndexKeyset ) );
	REQUIRES( maxUserObjects > 0 && maxUserObjects <= MAX_USER_OBJECTS );

	/* Read the user index file into memory */
	status = dynCreate( &userIndexDB, iIndexKeyset, 
						CRYPT_IATTRIBUTE_USERINDEX );
	if( cryptStatusError( status ) )
		return( status );
	sMemConnect( &stream, dynData( userIndexDB ), dynLength( userIndexDB ) );
	for( i = 0, iterationCount = 0; 
		 cryptStatusOK( status ) && \
			stell( &stream ) < dynLength( userIndexDB ) && \
			i < maxUserObjects && iterationCount < FAILSAFE_ITERATIONS_LARGE; 
		 i++, iterationCount++ )
		{
		status = readIndexEntry( &stream, &userIndex[ i ] );
		}
	ENSURES( iterationCount < FAILSAFE_ITERATIONS_LARGE );
	sMemDisconnect( &stream );
	dynDestroy( &userIndexDB );
	if( cryptStatusError( status ) )
		return( status );
	if( i > maxUserObjects )
		return( CRYPT_ERROR_OVERFLOW );

	return( i );
	}

/* Write the user index file */

CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2 ) ) \
static int writeUserIndexEntry( INOUT STREAM *stream, 
								const USER_FILE_INFO *userIndexPtr )
	{
	assert( isWritePtr( stream, sizeof( STREAM ) ) );
	assert( isReadPtr( userIndexPtr, sizeof( USER_FILE_INFO ) ) );

	writeSequence( stream, 2 * sizeofObject( KEYID_SIZE ) + \
				   sizeofObject( userIndexPtr->userNameLength ) + \
				   sizeofShortInteger( userIndexPtr->fileRef) );
	writeOctetString( stream, userIndexPtr->userID, KEYID_SIZE, DEFAULT_TAG );
	writeOctetString( stream, userIndexPtr->creatorID, KEYID_SIZE, DEFAULT_TAG );
	writeCharacterString( stream, userIndexPtr->userName,
						  userIndexPtr->userNameLength, BER_STRING_UTF8 );
	return( writeShortInteger( stream, userIndexPtr->fileRef, DEFAULT_TAG ) );
	}

CHECK_RETVAL STDC_NONNULL_ARG( ( 2 ) ) \
static int writeUserIndex( IN_HANDLE const CRYPT_KEYSET iIndexKeyset,
						   IN_ARRAY( noUserIndexEntries ) \
							USER_FILE_INFO *userIndex, 
						   IN_RANGE( 1, MAX_USER_OBJECTS ) \
							const int noUserIndexEntries )
	{
	STREAM stream;
	MESSAGE_DATA msgData;
	BYTE userIndexData[ MAX_USERINDEX_SIZE + 8 ];
	int userIndexDataLength, i, iterationCount, status = CRYPT_OK;

	assert( isWritePtr( userIndex, \
						noUserIndexEntries * sizeof( USER_FILE_INFO ) ) );

	REQUIRES( isHandleRangeValid( iIndexKeyset ) );
	REQUIRES( noUserIndexEntries > 0 && \
			  noUserIndexEntries <= MAX_USER_OBJECTS );

	/* Write the user index data to a buffer so that we can send it to the 
	   index keyset */
	sMemOpen( &stream, userIndexData, MAX_USERINDEX_SIZE );
	for( i = 0, iterationCount = 0; 
		 i < noUserIndexEntries && cryptStatusOK( status ) && \
			iterationCount < FAILSAFE_ITERATIONS_LARGE; 
		 i++, iterationCount++ )
		{
		if( userIndex[ i ].state != USER_STATE_NONE )
			status = writeUserIndexEntry( &stream, &userIndex[ i ] );
		}
	ENSURES( iterationCount < FAILSAFE_ITERATIONS_LARGE );
	userIndexDataLength = stell( &stream );
	sMemDisconnect( &stream );
	if( cryptStatusError( status ) )
		return( status );

	/* Write the user index data to the keyset */
	setMessageData( &msgData, userIndexData, userIndexDataLength );
	return( krnlSendMessage( iIndexKeyset, IMESSAGE_SETATTRIBUTE_S,
							 &msgData, CRYPT_IATTRIBUTE_USERINDEX ) );
	}

/****************************************************************************
*																			*
*							Read/Write User Data							*
*																			*
****************************************************************************/

/* Read/write user data:

	UserInfo ::= SEQUENCE {
		role				ENUMERATED,				-- SO/user/CA
		iD					OCTET STRING SIZE(16),	-- User ID
		creatorID			OCTET STRING SIZE(16),	-- Creating SO's ID
		name				UTF8String,				-- User name
		} */

CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 2 ) ) \
static int readUserData( INOUT USER_FILE_INFO *userFileInfoPtr, 
						 IN_BUFFER( userDataLength ) const void *userData, 
						 IN_LENGTH_SHORT const int userDataLength )
	{
	STREAM stream;
	int enumValue, length, status;

	assert( isWritePtr( userFileInfoPtr, sizeof( USER_FILE_INFO ) ) );
	assert( isReadPtr( userData, userDataLength ) );

	REQUIRES( userDataLength > 0 && userDataLength < MAX_INTLENGTH_SHORT );

	/* Clear return value */
	memset( userFileInfoPtr, 0, sizeof( userFileInfoPtr ) );

	/* Read the user info */
	sMemConnect( &stream, userData, userDataLength );
	readSequence( &stream, NULL );
	readEnumerated( &stream, &enumValue );
	userFileInfoPtr->type = enumValue;
	readOctetString( &stream, userFileInfoPtr->userID, &length, 
					 KEYID_SIZE, KEYID_SIZE );
	readOctetString( &stream, userFileInfoPtr->creatorID, &length, 
					 KEYID_SIZE, KEYID_SIZE );
	status = readCharacterString( &stream, userFileInfoPtr->userName,
								  CRYPT_MAX_TEXTSIZE, 
								  &userFileInfoPtr->userNameLength,
								  BER_STRING_UTF8 );
	sMemDisconnect( &stream );

	return( status );
	}

CHECK_RETVAL STDC_NONNULL_ARG( ( 1, 3, 4 ) ) \
static int writeUserData( OUT_BUFFER( userDataMaxLength, \
									  *userDataLength ) void *userData, 
						  IN_LENGTH_SHORT const int userDataMaxLength,
						  OUT_LENGTH_SHORT_Z int *userDataLength, 
						  const USER_INFO *userInfoPtr )
	{
	const USER_FILE_INFO *userFileInfo = &userInfoPtr->userFileInfo;
	STREAM stream;
	int status;

	assert( isWritePtr( userData, userDataMaxLength ) );
	assert( isWritePtr( userDataLength, sizeof( int ) ) );
	assert( isReadPtr( userInfoPtr, sizeof( USER_INFO ) ) );

	REQUIRES( userDataMaxLength > 0 && \
			  userDataMaxLength < MAX_INTLENGTH_SHORT );

	/* Clear return values */
	memset( userData, 0, min( 16, userDataMaxLength ) );
	*userDataLength = 0;

	/* Write the user information to a memory buffer */
	sMemOpen( &stream, userData, userDataMaxLength );
	writeSequence( &stream, sizeofShortInteger( userFileInfo->type ) + \
				   2 * sizeofObject( KEYID_SIZE ) + \
				   sizeofObject( userFileInfo->userNameLength ) );
	writeEnumerated( &stream, userFileInfo->type, DEFAULT_TAG );
	writeOctetString( &stream, userFileInfo->userID, KEYID_SIZE, 
					  DEFAULT_TAG );
	writeOctetString( &stream, userFileInfo->creatorID, KEYID_SIZE, 
					  DEFAULT_TAG );
	status = writeCharacterString( &stream, userFileInfo->userName,
								   userFileInfo->userNameLength, 
								   BER_STRING_UTF8 );
	if( cryptStatusOK( status ) )
		*userDataLength = stell( &stream );
	sMemDisconnect( &stream );

	return( status );
	}

/* Send user data to a user keyset */

CHECK_RETVAL STDC_NONNULL_ARG( ( 2, 3 ) ) \
static int commitUserData( IN_HANDLE const CRYPT_KEYSET iUserKeyset, 
						   const USER_INFO *userInfoPtr, 
						   IN_BUFFER( userDataLength ) const void *userData, 
						   IN_LENGTH_SHORT const int userDataLength )
	{
	MESSAGE_DATA msgData;
	int status;

	assert( isReadPtr( userInfoPtr, sizeof( USER_INFO ) ) );
	assert( isReadPtr( userData, userDataLength ) );

	REQUIRES( isHandleRangeValid( iUserKeyset ) );
	REQUIRES( userDataLength > 0 && userDataLength < MAX_INTLENGTH_SHORT );

	/* Add the user ID and SO-signed user info to the keyset */
	setMessageData( &msgData, ( void * ) userData, userDataLength );
	status = krnlSendMessage( iUserKeyset, IMESSAGE_SETATTRIBUTE_S,
							  &msgData, CRYPT_IATTRIBUTE_USERINFO );
	if( cryptStatusOK( status ) )
		{
		setMessageData( &msgData, ( void * ) userInfoPtr->userFileInfo.userID,
						KEYID_SIZE );
		status = krnlSendMessage( iUserKeyset, IMESSAGE_SETATTRIBUTE_S,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美日韩一区二区| 欧美tk—视频vk| 欧美精品一区二区三区久久久 | 国产精品资源在线| 日本高清免费不卡视频| 国产人成一区二区三区影院| 亚洲18女电影在线观看| 丁香婷婷综合色啪| 日韩欧美一区在线| 亚洲国产视频网站| voyeur盗摄精品| 国产亚洲欧美激情| 男人的天堂久久精品| 欧美色电影在线| 中文字幕一区二区在线观看| 国产乱人伦精品一区二区在线观看| 91麻豆免费看片| 国产精品久久免费看| 国产乱对白刺激视频不卡| 日韩一区二区三区四区| 一个色综合av| 色婷婷av一区二区三区gif| 日本一区二区不卡视频| 国产一区啦啦啦在线观看| 欧美一区中文字幕| 天天综合网天天综合色| 欧美日韩综合一区| 一区二区三区四区不卡在线| 99久久久免费精品国产一区二区| 欧美国产禁国产网站cc| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 精品免费99久久| 青青草伊人久久| 3d动漫精品啪啪1区2区免费 | 亚洲视频狠狠干| 91免费版pro下载短视频| 欧美韩国日本综合| jiyouzz国产精品久久| 中文字幕一区在线观看| 97精品久久久午夜一区二区三区| 亚洲男人的天堂av| 欧美亚洲一区二区在线| 午夜精品久久久久影视| 欧美一级欧美一级在线播放| 久久精品国产秦先生| 久久精品亚洲精品国产欧美| 成人午夜av电影| 日韩美女久久久| 欧美日韩国产综合视频在线观看 | 一本大道综合伊人精品热热| 亚洲综合图片区| 91精品国产入口在线| 奇米精品一区二区三区四区| 久久先锋影音av鲁色资源| 国产成人av在线影院| 亚洲欧洲99久久| 欧美精品亚洲二区| 国产专区欧美精品| 自拍偷拍国产精品| 欧美福利电影网| 国产精品一区二区三区乱码 | 国产精品久久午夜夜伦鲁鲁| 欧洲另类一二三四区| 麻豆极品一区二区三区| 国产精品国产自产拍高清av王其| 欧美性猛交xxxx黑人交| 极品少妇xxxx精品少妇| 亚洲色图视频免费播放| 日韩一级精品视频在线观看| 成人免费观看av| 蜜桃视频一区二区| 国产精品久线在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 国产日产欧美一区| 色综合天天综合网天天狠天天 | 26uuu色噜噜精品一区二区| 99精品欧美一区二区三区小说| 亚洲国产另类av| 国产亚洲欧美日韩在线一区| 精品视频一区二区不卡| 国产99精品国产| 婷婷国产v国产偷v亚洲高清| 亚洲天堂成人网| 国产欧美日本一区二区三区| 欧美日韩免费观看一区三区| 成人99免费视频| 久久精品国产澳门| 亚洲午夜免费视频| 亚洲欧洲韩国日本视频| 精品日韩欧美一区二区| 精品视频资源站| 色狠狠一区二区| gogo大胆日本视频一区| 国产激情一区二区三区四区| 日本在线播放一区二区三区| 一区二区三区资源| 亚洲日本一区二区| 欧美激情在线一区二区| 欧美tickling挠脚心丨vk| 777亚洲妇女| 欧美酷刑日本凌虐凌虐| 欧美亚洲一区三区| 一本色道久久加勒比精品| 99久久综合色| 成人av网站在线| 成人精品高清在线| 成人午夜视频在线| 成人动漫中文字幕| 成人精品免费网站| 北条麻妃国产九九精品视频| 国产91在线|亚洲| 激情亚洲综合在线| 精品亚洲国内自在自线福利| 男人操女人的视频在线观看欧美| 婷婷综合五月天| 日产国产高清一区二区三区| 日韩精品乱码免费| 蜜桃视频第一区免费观看| 美国十次了思思久久精品导航| 免费欧美日韩国产三级电影| 久久www免费人成看片高清| 久久精品国产亚洲a| 国产在线乱码一区二区三区| 精品一区在线看| 国产精品资源网站| av一区二区久久| 91麻豆精品秘密| 欧美丝袜第三区| 欧美一区二区大片| 久久伊人蜜桃av一区二区| 久久影院电视剧免费观看| 欧美国产综合一区二区| 亚洲三级理论片| 日本最新不卡在线| 国产激情视频一区二区三区欧美 | 91在线免费视频观看| 91成人免费电影| 91精品一区二区三区久久久久久| 日韩视频国产视频| 国产人妖乱国产精品人妖| 亚洲精品一二三四区| 日韩在线卡一卡二| 国产精品一级二级三级| 色婷婷国产精品综合在线观看| 欧美日本在线一区| 国产日韩欧美高清| 一区二区三区四区精品在线视频| 日韩高清不卡在线| 风间由美一区二区av101| 一本久道久久综合中文字幕| 日韩精品资源二区在线| 中文一区在线播放| 午夜精品福利在线| 大胆亚洲人体视频| 欧美男女性生活在线直播观看| 久久综合九色欧美综合狠狠| 亚洲免费资源在线播放| 麻豆免费看一区二区三区| 99久久久精品免费观看国产蜜| 欧美一区二区三区不卡| 国产精品国产三级国产a | 91视频一区二区三区| 欧美一区二区三区精品| 亚洲四区在线观看| 狠狠色丁香婷婷综合| 欧美系列一区二区| 欧美国产精品专区| 美女免费视频一区| 在线亚洲人成电影网站色www| 久久精品男人天堂av| 日韩二区在线观看| 一本色道久久综合亚洲91| 国产午夜精品久久久久久久| 日本三级亚洲精品| 欧美性生活影院| 亚洲免费电影在线| 国产91精品精华液一区二区三区 | 国产精品一区二区久久精品爱涩 | 欧美性大战xxxxx久久久| 中文字幕乱码一区二区免费| 精一区二区三区| 欧美一区二区三区免费视频| 亚洲影院久久精品| 色呦呦网站一区| 中文字幕中文字幕一区二区| 国产精品白丝jk白祙喷水网站| 欧美精品在线一区二区| 亚洲电影视频在线| 欧洲另类一二三四区| 一区二区三区日韩欧美| 97超碰欧美中文字幕| 亚洲国产电影在线观看| 国产精品影视在线| 久久综合九色综合欧美就去吻| 久久aⅴ国产欧美74aaa| 欧美日韩国产影片| 亚洲国产视频一区二区| 欧美三级韩国三级日本一级| 一区二区三区欧美| 91国产免费看|