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

📄 pgpoptionlist.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 3 页
字号:
					break;
				case 'p':
					ptrPtr = va_arg( args, void ** );
					*ptrPtr = *( ( void ** ) ptr );
					ptr += sizeof( void * );
					break;
				case 't':
					ptrTimeInterval = va_arg( args, PGPTimeInterval * );
					*ptrTimeInterval = *( ( PGPTimeInterval * ) ptr );
					ptr += sizeof( PGPTimeInterval );
					break;
				case 'T':
					ptrTime = va_arg( args, PGPTime * );
					*ptrTime = *( ( PGPTime * ) ptr );
					ptr += sizeof( PGPTime );
					break;
				case 'f':
					ptrFileSpec = va_arg( args, PFLFileSpecRef * );
					*ptrFileSpec = *( ( PFLFileSpecRef * ) ptr );
					ptr += sizeof( PFLFileSpecRef );
					break;
				default:
					err = kPGPError_BadParams;
					goto error;
				}
			}
			va_end( args );
		}
	} else {
		/* Missing op, fill in parameters */
		ptr = ( PGPByte * ) op.value.asPtr;
		while( *str++ == '%' ) {
			switch( *str++ ) {
			case 'd':
				ptrInt32 = va_arg( args, PGPInt32 * );
				*ptrInt32 = (PGPInt32) 0;
				break;
			case 'l':
				ptrSize = va_arg( args, PGPSize * );
				*ptrSize = (PGPSize) 0;
				break;
			case 'p':
				ptrPtr = va_arg( args, void ** );
				*ptrPtr = NULL;
				break;
			case 't':
				ptrTimeInterval = va_arg( args, PGPTimeInterval * );
				*ptrTimeInterval = (PGPTimeInterval) 0;
				break;
			case 'T':
				ptrTime = va_arg( args, PGPTime * );
				*ptrTime = (PGPTime) 0;
				break;
			case 'f':
				ptrFileSpec = va_arg( args, PFLFileSpecRef * );
				*ptrFileSpec = kInvalidPFLFileSpecRef;
				break;
			default:
				err = kPGPError_BadParams;
				goto error;
			}
		}
		if( fMandatory ) {
		
			pgpDebugFmtMsg(( pgpaFmtPrefix,
				"Error: Missing required PGPO option #%ld",
				(long)optionType ));

			err = kPGPError_OptionNotFound;
			goto error;
		}
	}
	return kPGPError_NoErr;
error:
	return err;
}


/* Delete option list and null out the pointer to it */

	void
pgpCleanupOptionList(PGPOptionListRef *optionList)
{
	/* XXX check to make sure we have no critical unused options */
	if( IsntNull( *optionList ) ) {
		pgpFreeOptionList( *optionList );
		*optionList = NULL;
	}
}

/********************* Access functions for option data *********************/


	PGPError
pgpOptionInt(
	PGPOption			*op,
	PGPInt32			*pInt
	)			 
{
	*pInt = op->value.asInt;
	return kPGPError_NoErr;
}

	PGPError
pgpOptionUInt(
	PGPOption			*op,
	PGPUInt32			*pUInt
	)			 
{
	*pUInt = op->value.asInt;
	return kPGPError_NoErr;
}

	PGPError
pgpOptionPtr(
	PGPOption			 *op,
	void				**pPtr
	)			 
{
	*pPtr = op->value.asPtr;
	return kPGPError_NoErr;
}

	PGPError
pgpOptionInterval(
	PGPOption			*op,
	PGPTimeInterval		*pInterval
	)			 
{
	*pInterval = op->value.asInterval;
	return kPGPError_NoErr;
}

/* Access option data consisting of a pointer and a length */
/* This is a special case; the length is in the option itself */
	PGPError
pgpOptionPtrLength(
	PGPOption			 *op,
	void				**pPtr,
	PGPSize				 *pLength
	)			 
{
	*pPtr = op->value.asPtr;
	*pLength = op->valueSize;
	return kPGPError_NoErr;
}

/* Access option data consisting of a pointer then a pointer */
	PGPError
pgpOptionPtrPtr(
	PGPOption			 *op,
	void				**pPtr,
	void				**pPtr2
	)			 
{
	PGPByte *ptr = ( PGPByte * ) op->value.asPtr;
	*pPtr = *( ( void ** ) ptr );
	ptr += sizeof( void * );
	*pPtr2 = *( ( void ** ) ptr );
	return kPGPError_NoErr;
}

/* Access option data consisting of a pointer, length, then pointer */
	PGPError
pgpOptionPtrLengthPtr(
	PGPOption			 *op,
	void				**pPtr,
	PGPSize				 *pLength,
	void				**pPtr2
	)			 
{
	PGPByte *ptr = ( PGPByte * ) op->value.asPtr;
	*pPtr = *( ( void ** ) ptr );
	ptr += sizeof( void * );
	*pLength = *( ( PGPSize * ) ptr );
	ptr += sizeof( PGPSize );
	*pPtr2 = *( ( void ** ) ptr );
	return kPGPError_NoErr;
}


/* Allocate and make a copy of a C String */

	char *
pgpAllocCString(
	PGPContextRef	 	 context,
	char const			*string
	)
{
	char				*ptr;
	PGPSize				 length;

	length = strlen( string );
	ptr = (char *)pgpContextMemAlloc( context, length+1, 0 );
	if( IsntNull( ptr ) ) {
		strcpy( ptr, string );
	}
	return ptr;
}


/*
**	This is the handler proc for sensitive options like passphrase
*/

	PGPError
pgpSensitiveOptionHandlerProc(
	PGPContextRef				context,
	PGPOptionHandlerOperation 	operation,
	PGPOptionType				type,
	PGPOptionValue				inputValue,
	PGPSize 					inputValueSize,
	PGPOptionValue 				*outputValue,
	PGPSize						*outputValueSize)
{
	PGPError	err = kPGPError_NoErr;
	
	(void) context;
	(void) type;
	
	switch( operation )
	{
		case kPGPOptionHandler_FreeDataOperation:
		{
			/* This wipes as it frees since it is a secure buffer */
			PGPFreeData( inputValue.asPtr );
			break;
		}
			
		case kPGPOptionHandler_CopyDataOperation:
		{
			pgpAssertAddrValid( outputValue, PGPOptionValue );
			pgpAssertAddrValid( outputValueSize, PGPSize );

			outputValue->asPtr = PGPNewSecureData(
					PGPGetContextMemoryMgr( context ), inputValueSize, 0);
			if( IsNull( outputValue->asPtr ) ) {
				err = kPGPError_OutOfMemory;
				break;
			}

			pgpCopyMemory( inputValue.asPtr, outputValue->asPtr,
						   inputValueSize );
			*outputValueSize = inputValueSize;
			
			break;
		}
		
		default:
		{
			err = kPGPError_UnknownRequest;
			break;
		}
	}

	return( err );
}

/*
**	This is the handler proc for options which take buffers but aren't
**	sensitive.
*/

	PGPError
pgpBufferOptionHandlerProc(
	PGPContextRef				context,
	PGPOptionHandlerOperation 	operation,
	PGPOptionType				type,
	PGPOptionValue				inputValue,
	PGPSize 					inputValueSize,
	PGPOptionValue 				*outputValue,
	PGPSize						*outputValueSize)
{
	PGPError	err = kPGPError_NoErr;
	
	(void) context;
	(void) type;
	
	switch( operation )
	{
		case kPGPOptionHandler_FreeDataOperation:
		{
			pgpContextMemFree( context, inputValue.asPtr );
			break;
		}
			
		case kPGPOptionHandler_CopyDataOperation:
		{
			pgpAssertAddrValid( outputValue, PGPOptionValue );
			pgpAssertAddrValid( outputValueSize, PGPSize );

			outputValue->asPtr = pgpContextMemAlloc( context,
													 inputValueSize, 0 );
			if( IsNull( outputValue->asPtr ) ) {
				err = kPGPError_OutOfMemory;
				break;
			}

			pgpCopyMemory( inputValue.asPtr, outputValue->asPtr,
						   inputValueSize );
			*outputValueSize = inputValueSize;
			
			break;
		}
		
		default:
		{
			err = kPGPError_UnknownRequest;
			break;
		}
	}

	return( err );
}

/*
**	This is the handler proc for options containing PGPFileRefs.
*/

	PGPError
pgpFileRefOptionHandlerProc(
	PGPContextRef				context,
	PGPOptionHandlerOperation 	operation,
	PGPOptionType				type,
	PGPOptionValue				inputValue,
	PGPSize 					inputValueSize,
	PGPOptionValue 				*outputValue,
	PGPSize						*outputValueSize)
{
	PGPError	err = kPGPError_NoErr;
	
	(void) context;
	(void) type;
	
	switch( operation )
	{
		case kPGPOptionHandler_FreeDataOperation:
		{
			err = PFLFreeFileSpec( (PFLFileSpecRef) inputValue.asFileRef );
			break;
		}
			
		case kPGPOptionHandler_CopyDataOperation:
		{
			pgpAssertAddrValid( outputValue, PGPOptionValue );
			pgpAssertAddrValid( outputValueSize, PGPSize );

			err = PFLCopyFileSpec( (PFLFileSpecRef) inputValue.asFileRef,
						(PFLFileSpecRef *) &outputValue->asFileRef );
			if( IsntPGPError( err ) )
			{
				*outputValueSize = inputValueSize;
			}
			
			break;
		}
		
		default:
		{
			err = kPGPError_UnknownRequest;
			break;
		}
	}

	return( err );
}

	PGPOptionListRef
pgpCreateCustomValueOptionList(
	PGPContextRef			context,
	PGPOptionType			type,
	PGPOptionFlags			flags,
	const PGPOptionValue	*value,
	PGPSize					valueSize,
	PGPOptionListRef		subOptions,
	PGPOptionHandlerProcPtr	handlerProc)
{
	PGPOptionListRef	optionList;
	PGPOption			option;
	
	pgpValidateOptionContext( context );
	
	option.type			= type;
	option.flags		= flags;
	option.valueSize	= valueSize;
	option.subOptions	= subOptions;
	option.handlerProc	= handlerProc;
	
	if( IsNull( value ) )
	{
		pgpAssert( option.valueSize == 0 );
		
		option.value.asPtr = NULL;
	}
	else
	{
		option.value = *value;
	}
	
	optionList = pgpNewOneOptionList( context, &option );
	
	if( pgpOptionListIsValid( subOptions ) )
	{
		/* Fetch the err from the subOptions list, if any */
		pgpSetOptionListError( optionList,
					pgpGetOptionListError( subOptions ) );
	}
	
	return( optionList );
}

	PGPOptionListRef
pgpCreateStandardValueOptionList( 
	PGPContextRef			context,
	PGPOptionType			type,
	const PGPOptionValue	*value,
	PGPSize					valueSize,
	PGPOptionHandlerProcPtr	handlerProc)
{
	return( pgpCreateCustomValueOptionList( context,
				type, kPGPOptionFlag_Default,
				value, valueSize, NULL, handlerProc ) );
}

	PGPOptionListRef
pgpCreateFileRefOptionList( 
	PGPContextRef	context,
	PGPOptionType	type,
	PGPFileSpecRef	fileRef)
{
	PGPOptionListRef	optionList;
	PGPOptionValue		value;
	
	pgpValidateOptionContext( context );
	pgpValidateOptionParam( pflFileSpecIsValid( (PFLFileSpecRef)fileRef ) );
	
	if( IsntPGPError( PFLCopyFileSpec(
			(PFLConstFileSpecRef) fileRef, (PFLFileSpecRef *) &value.asFileRef ) ) )
	{
		optionList = pgpCreateStandardValueOptionList( context,  
							type,
							&value, sizeof( fileRef ),
							pgpFileRefOptionHandlerProc );
	}
	else
	{
		/* Inability to copy a ref means we're out of memory */
		optionList = kPGPOutOfMemoryOptionListRef;
	}
	
	return( optionList );
}

	PGPOptionListRef
pgpCreateSensitiveOptionList( 
	PGPContextRef		context,
	PGPOptionType		type,
	void const			*sensitiveData,
	PGPSize				sensitiveDataSize)
{
	PGPOptionListRef	optionList;
	PGPOptionValue		value;
	
	pgpValidateOptionContext( context );
	pgpValidateOptionParam( IsntNull( sensitiveData ) );
	
	value.asPtr = PGPNewSecureData( PGPGetContextMemoryMgr( context ),
					sensitiveDataSize, 0 );
	if( IsntNull( value.asPtr ) )
	{
		pgpCopyMemory( sensitiveData, value.asPtr, sensitiveDataSize );
		optionList = pgpCreateStandardValueOptionList( context,  
							type,
							&value, sensitiveDataSize,
							pgpSensitiveOptionHandlerProc );
	}
	else
	{
		/* Inability to copy a ref means we're out of memory */
		optionList = kPGPOutOfMemoryOptionListRef;
	}
	
	return( optionList );
}

/* This is like pgpCreateSensitiveOptionList, but for non-sensitive data */
	PGPOptionListRef
pgpCreateBufferOptionList( 
	PGPContextRef		context,
	PGPOptionType		type,
	void const			*bufferData,
	PGPSize				bufferDataSize)
{
	PGPOptionListRef	optionList;
	PGPOptionValue		value;
	
	pgpValidateOptionContext( context );
	pgpValidateOptionParam( IsntNull( bufferData ) );
		
	value.asPtr = pgpContextMemAlloc( context, bufferDataSize, 0 );
	if( IsntNull( value.asPtr ) )
	{
		pgpCopyMemory( bufferData, value.asPtr, bufferDataSize );
		optionList = pgpCreateStandardValueOptionList( context,  
							type,
							&value, bufferDataSize,
							pgpBufferOptionHandlerProc );
	}
	else
	{
		/* Inability to copy a ref means we're out of memory */
		optionList = kPGPOutOfMemoryOptionListRef;
	}

	return( optionList );
}


/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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