📄 pgpkeyfilter.c
字号:
/*____________________________________________________________________________
Copyright (C) 1997 Network Associates Inc. and affiliated companies.
All rights reserved.
Key filtering routines implementing the PGPFilterRef abstract data type
$Id: pgpKeyFilter.c,v 1.100.6.1 1999/06/04 00:28:49 heller Exp $
____________________________________________________________________________*/
#include "pgpConfig.h"
#include <string.h>
#include <ctype.h>
#include "pgpDebug.h"
#include "pgpErrors.h"
#include "pgpContext.h"
#include "pgpKDBInt.h"
#include "pgpKeyFilterPriv.h"
#include "pgpKeyIDPriv.h"
#include "pgpTimeDate.h"
#include "pgpKeyIDPriv.h"
#include "pgpX509Priv.h"
#define PGPValidateMatchCriterion( m ) \
pgpAssert( (m) == kPGPMatchEqual || (m) == kPGPMatchGreaterOrEqual || \
(m) == kPGPMatchLessOrEqual || (m) == kPGPMatchSubString )
#define sCompareBoolean(f,v) (!(f)->value.propbool.val == !(v))
#define sCompareNumber(f,v) sComparisonMatchesCriterion( \
(v) - (f)->value.propnum.val, (f)->match )
PGPBoolean
PGPFilterIsValid( PGPFilterRef filter )
{
return( IsntNull( filter ) && filter->magic == kPGPFilterMagic );
}
/*
* Stolen from pgpRngPub.c:
*
* Return pointer to first instance of (s1,l1) in (s0,l0),
* ignoring case. Uses a fairly simple-minded algorithm.
* Search for the first char of s1 in s0, and when we have it,
* scan for the rest.
*
* Is it worth mucking with Boyer-Moore or the like?
*/
static char const *
xmemimem(char const *s0, size_t l0, char const *s1, size_t l1)
{
char c0, c1, c2;
size_t l;
/*
* The trivial cases - this means that NULL inputs are very legal
* if the correspinding lengths are zero.
*/
if (l0 < l1)
return NULL;
if (!l1)
return s0;
l0 -= l1;
c1 = tolower((unsigned char)*s1);
do {
c0 = tolower((unsigned char)*s0);
if (c0 == c1) {
l = 0;
do {
if (++l == l1)
return s0;
c0 = tolower((unsigned char)s0[l]);
c2 = tolower((unsigned char)s1[l]);
} while (c0 == c2);
}
s0++;
} while (l0--);
return NULL;
}
static PGPError
sAllocateFilter(
PGPContextRef context,
PGPFilterClass filterClass,
PGPFilterType filterType,
PGPMatchCriterion match,
PGPFilterRef * outFilter)
{
PGPFilterRef newFilter = NULL;
PGPError err = kPGPError_NoErr;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateParam( filterType < kPGPFilterTypeEnd );
PGPValidateMatchCriterion( match );
newFilter = (PGPFilterRef)
pgpContextMemAlloc( context, sizeof( PGPFilter),
kPGPMemoryMgrFlags_Clear);
if( IsntNull( newFilter ) )
{
newFilter->magic = kPGPFilterMagic;
newFilter->context = context;
newFilter->refCount = 1;
newFilter->filterClass = filterClass;
newFilter->filterType = filterType;
newFilter->match = match;
}
else
{
err = kPGPError_OutOfMemory;
}
*outFilter = newFilter;
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPIncFilterRefCount( PGPFilterRef filter )
{
PGPValidateFilter( filter );
filter->refCount++;
return kPGPError_NoErr;
}
PGPError
PGPFreeFilter( PGPFilterRef filter )
{
PGPError err = kPGPError_NoErr;
PGPValidateFilter( filter );
pgpAssert( filter->refCount >= 1 );
filter->refCount--;
if( filter->refCount == 0 )
{
PGPContextRef context = filter->context;
void * ptrToFree = NULL;
switch( filter->filterType)
{
default:
break;
case kPGPFilterTypeKeyKeyID:
break;
case kPGPFilterTypeKeySubKeyID:
break;
case kPGPFilterTypeKeyFingerPrint:
ptrToFree = filter->value.keyFingerPrint.keyFingerPrintData;
break;
case kPGPFilterTypeUserIDEmail:
ptrToFree = filter->value.userIDEmail;
break;
case kPGPFilterTypeUserIDName:
ptrToFree = filter->value.userIDName;
break;
case kPGPFilterTypeUserIDString:
ptrToFree = filter->value.userIDString;
break;
case kPGPFilterTypeSigKeyID:
break;
case kPGPFilterTypeKeyBuffer:
ptrToFree = filter->value.propbuffer.val;
break;
case kPGPFilterTypeNot:
PGPFreeFilter( filter->value.notFilter );
break;
case kPGPFilterTypeAnd:
PGPFreeFilter( filter->value.andFilter.andFilter1 );
PGPFreeFilter( filter->value.andFilter.andFilter2 );
break;
case kPGPFilterTypeOr:
PGPFreeFilter( filter->value.orFilter.orFilter1 );
PGPFreeFilter( filter->value.orFilter.orFilter2 );
break;
}
if ( IsntNull( ptrToFree ) )
{
pgpContextMemFree( context, ptrToFree);
}
pgpContextMemFree( context, filter );
}
return err;
}
/*____________________________________________________________________________
The passed in filter will be freed when the newly created filter is
freed. Therefore, if an error occurs, the passed filter must
also be freed. Caller should increment the passed-in filter
ref count if the filter should persist.
____________________________________________________________________________*/
PGPError
PGPNegateFilter(
PGPFilterRef filter,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
if ( IsntNull( outFilter ) )
{
*outFilter = NULL;
if ( ! PGPFilterIsValid( filter ) )
err = kPGPError_BadParams;
}
else
{
err = kPGPError_BadParams;
}
if ( IsntPGPError( err ) )
{
err = sAllocateFilter( filter->context, filter->filterClass,
kPGPFilterTypeNot, kPGPMatchDefault, outFilter);
pgpAssertErrWithPtr( err, *outFilter );
if ( IsntPGPError( err ) )
{
(*outFilter)->value.notFilter = filter;
}
}
/* careful to clean up in event of error */
if ( IsPGPError( err ) )
{
if ( PGPFilterIsValid( filter ) )
{
PGPFreeFilter( filter );
filter = NULL;
}
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
/*____________________________________________________________________________
The passed in filters will be freed when the newly created filter is
freed. Therefore, if an error occurs, the passed filters must
also be freed. Caller should increment the passed-in filter
ref count if the filters should persist.
____________________________________________________________________________*/
PGPError
PGPIntersectFilters(
PGPFilterRef filter1,
PGPFilterRef filter2,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
if ( IsntNull( outFilter ) )
*outFilter = NULL;
if ( IsntNull( outFilter ) &&
PGPFilterIsValid( filter1 ) &&
PGPFilterIsValid( filter2 ) )
{
PGPFilterClass filterClass;
filterClass = filter1->filterClass & filter2->filterClass;
if( filterClass == 0 )
err = kPGPError_InconsistentFilterClasses;
if ( IsntPGPError( err ) )
{
err = sAllocateFilter( filter1->context, filterClass,
kPGPFilterTypeAnd, kPGPMatchDefault,
outFilter);
if( IsntPGPError( err ) )
{
(*outFilter)->value.andFilter.andFilter1 = filter1;
(*outFilter)->value.andFilter.andFilter2 = filter2;
}
}
}
else
{
err = kPGPError_BadParams;
}
/* careful to clean up in event of error */
if ( IsPGPError( err ) )
{
if ( PGPFilterIsValid( filter1 ) )
PGPFreeFilter( filter1 );
if ( PGPFilterIsValid( filter2 ) )
PGPFreeFilter( filter2 );
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
/*____________________________________________________________________________
The passed in filters will be freed when the newly created filter is
freed. Therefore, if an error occurs, the passed filters must
also be freed. Caller should increment the passed-in filter
ref count if the filters should persist.
____________________________________________________________________________*/
PGPError
PGPUnionFilters(
PGPFilterRef filter1,
PGPFilterRef filter2,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
if ( IsntNull( outFilter ) )
*outFilter = NULL;
if ( IsntNull( outFilter ) &&
PGPFilterIsValid( filter1 ) &&
PGPFilterIsValid( filter2 ) )
{
PGPFilterClass filterClass;
filterClass = filter1->filterClass & filter2->filterClass;
if( filterClass == 0 )
err = kPGPError_InconsistentFilterClasses;
if ( IsntPGPError( err ) )
{
err = sAllocateFilter( filter1->context, filterClass,
kPGPFilterTypeOr, kPGPMatchDefault, outFilter);
if( IsntPGPError( err ) )
{
(*outFilter)->value.orFilter.orFilter1 = filter1;
(*outFilter)->value.orFilter.orFilter2 = filter2;
}
}
}
else
{
err = kPGPError_BadParams;
}
/* careful to clean up in event of error */
if ( IsPGPError( err ) )
{
if ( PGPFilterIsValid( filter1 ) )
PGPFreeFilter( filter1 );
if ( PGPFilterIsValid( filter2 ) )
PGPFreeFilter( filter2 );
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPNewKeyIDFilter(
PGPContextRef context,
PGPKeyID const * keyID,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
PGPFilterRef newFilter = NULL;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateKeyID( keyID );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeyKeyID, kPGPMatchDefault, &newFilter);
if( IsntPGPError( err ) )
{
newFilter->value.keyKeyID = *keyID;
}
*outFilter = newFilter;
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPNewSubKeyIDFilter(
PGPContextRef context,
PGPKeyID const * subKeyID,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
PGPFilterRef newFilter = NULL;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateKeyID( subKeyID );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeySubKeyID, kPGPMatchDefault, &newFilter);
if( IsntPGPError( err ) )
{
newFilter->value.keySubKeyID = *subKeyID;
}
*outFilter = newFilter;
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPNewKeyEncryptAlgorithmFilter(
PGPContextRef context,
PGPPublicKeyAlgorithm encryptAlgorithm,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateParam( encryptAlgorithm >= kPGPPublicKeyAlgorithm_First &&
encryptAlgorithm <= kPGPPublicKeyAlgorithm_Last );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeyEncryptAlgorithm, kPGPMatchDefault, outFilter);
if( IsntPGPError( err ) )
{
(*outFilter)->value.keyEncryptAlgorithm = encryptAlgorithm;
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
/*____________________________________________________________________________
____________________________________________________________________________*/
PGPError
PGPNewKeyFingerPrintFilter(
PGPContextRef context,
void const * fingerPrint,
PGPSize fingerPrintLength,
PGPFilterRef * outFilter)
{
PGPFilterRef newFilter = NULL;
PGPError err = kPGPError_NoErr;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidatePtr( fingerPrint );
PGPValidateParam( fingerPrintLength >= 1 );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeyFingerPrint, kPGPMatchDefault, &newFilter);
if( IsntPGPError( err ) )
{
PGPByte * value = NULL;
value =( PGPByte *)
pgpContextMemAlloc( context, fingerPrintLength, 0);
if( IsntNull( value ) )
{
pgpCopyMemory( fingerPrint, value, fingerPrintLength);
newFilter->value.keyFingerPrint.keyFingerPrintData = value;
newFilter->value.keyFingerPrint.keyFingerPrintLength =
fingerPrintLength;
}
else
{
err = kPGPError_OutOfMemory;
PGPFreeFilter( newFilter );
newFilter = NULL;
}
}
*outFilter = newFilter;
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPNewKeyCreationTimeFilter(
PGPContextRef context,
PGPTime creationTime,
PGPMatchCriterion match,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateMatchCriterion( match );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeyCreationTime, match, outFilter);
if( IsntPGPError( err ) )
{
(*outFilter)->value.keyCreationTime = creationTime;
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
PGPError
PGPNewKeyExpirationTimeFilter(
PGPContextRef context,
PGPTime expirationTime,
PGPMatchCriterion match,
PGPFilterRef * outFilter)
{
PGPError err = kPGPError_NoErr;
PGPValidatePtr( outFilter );
*outFilter = NULL;
PGPValidateContext( context );
PGPValidateMatchCriterion( match );
err = sAllocateFilter( context, kPGPFilterClassDefault,
kPGPFilterTypeKeyExpirationTime, match, outFilter);
if( IsntPGPError( err ) )
{
(*outFilter)->value.keyExpirationTime = expirationTime;
}
pgpAssertErrWithPtr( err, *outFilter );
return err;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -