📄 key_acl.c
字号:
/****************************************************************************
* *
* Keyset ACLs *
* Copyright Peter Gutmann 1997-2004 *
* *
****************************************************************************/
#if defined( INC_ALL )
#include "crypt.h"
#include "acl.h"
#include "kernel.h"
#elif defined( INC_CHILD )
#include "../crypt.h"
#include "acl.h"
#include "kernel.h"
#else
#include "crypt.h"
#include "kernel/acl.h"
#include "kernel/kernel.h"
#endif /* Compiler-specific includes */
/* A pointer to the kernel data block */
static KERNEL_DATA *krnlData = NULL;
/****************************************************************************
* *
* Keyset ACLs *
* *
****************************************************************************/
/* Key management ACL information. These work in the same general way as the
crypto mechanism ACL checks enforced by the kernel. The ACL entries are:
Valid keyset types for R/W/D access.
Valid keyset types for getFirst/Next access.
Valid keyset types for query access.
Valid object types to write.
Valid key management flags in the mechanism info.
Access type for which an ID parameter is required.
Access type for which a password (or other aux.info) is required
[ Specific object types requires for some keyset types ]
The access-type entries are used for parameter checking and represent all
access types for which these parameters are required, even if those
access types aren't currently allowed by the valid access types entry.
This is to allow them to be enabled by changing only the valid access
types entry without having to update the other two entries as well.
In addition, there are a few access types (specifically getFirst/Next and
private key reads) for which the semantics of password/aux info use are
complex enough that we have to hardcode them, leaving only a
representative entry in the ACL definition. Examples of this are keyset
vs. crypto device reads (keysets usually need passwords while a logged-
in device doesn't), speculative reads from the keyset to determine
presence (which don't require a password), and so on.
The (optional) specific object types entry is required for some keysets
that require a specific object (typically a certificate or cert chain)
rather than just a generic PKC context for the overall keyset item type */
static const FAR_BSS KEYMGMT_ACL keyManagementACL[] = {
/* Access public key */
MK_KEYACL_EX( KEYMGMT_ITEM_PUBLICKEY,
/* R */ ST_KEYSET_ANY | ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* W */ ST_KEYSET_FILE | ST_KEYSET_DBMS | ST_KEYSET_LDAP | \
ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* D */ ST_KEYSET_FILE | ST_KEYSET_DBMS | ST_KEYSET_LDAP | \
ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* Fn*/ ST_KEYSET_FILE | ST_KEYSET_DBMS | ST_KEYSET_DBMS_STORE | \
ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* Q */ ST_KEYSET_DBMS | ST_KEYSET_DBMS_STORE | ST_KEYSET_LDAP,
/*Obj*/ ST_CTX_PKC | ST_CERT_CERT | ST_CERT_CERTCHAIN,
/*Flg*/ KEYMGMT_FLAG_CHECK_ONLY | KEYMGMT_FLAG_LABEL_ONLY | KEYMGMT_MASK_CERTOPTIONS,
ACCESS_KEYSET_FxRxD, ACCESS_KEYSET_FNxxx,
ST_KEYSET_DBMS | ST_KEYSET_DBMS_STORE | ST_KEYSET_LDAP | \
ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
ST_CERT_CERT | ST_CERT_CERTCHAIN ),
/* Access private key */
MK_KEYACL_RWD( KEYMGMT_ITEM_PRIVATEKEY,
/* R */ ST_KEYSET_FILE | ST_KEYSET_FILE_PARTIAL | ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* W */ ST_KEYSET_FILE | ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/* D */ ST_KEYSET_FILE | ST_DEV_FORT | ST_DEV_P11 | ST_DEV_CAPI,
/*FnQ*/ ST_NONE, ST_NONE,
/*Obj*/ ST_CTX_PKC,
/*Flg*/ KEYMGMT_FLAG_CHECK_ONLY | KEYMGMT_FLAG_LABEL_ONLY | KEYMGMT_MASK_USAGEOPTIONS,
ACCESS_KEYSET_xxRxD, ACCESS_KEYSET_xxXXx ),
/* Access secret key */
MK_KEYACL( KEYMGMT_ITEM_SECRETKEY,
/*RWD*/ ST_KEYSET_FILE,
/*FnQ*/ ST_NONE,
/*Obj*/ ST_CTX_CONV,
/*Flg*/ KEYMGMT_FLAG_NONE,
ACCESS_KEYSET_xxRxD, ACCESS_KEYSET_xxRWx ),
/* Access cert request */
MK_KEYACL_RWD( KEYMGMT_ITEM_REQUEST,
/*RWD*/ ST_KEYSET_DBMS_STORE, ST_KEYSET_DBMS_STORE, ST_NONE,
/*FnQ*/ ST_NONE, ST_KEYSET_DBMS_STORE,
/*Obj*/ ST_CERT_CERTREQ | ST_CERT_REQ_CERT | ST_CERT_REQ_REV,
/*Flg*/ KEYMGMT_FLAG_UPDATE,
ACCESS_KEYSET_FxRxD, ACCESS_KEYSET_FNxxx ),
/* Access PKI user info */
MK_KEYACL_RWD( KEYMGMT_ITEM_PKIUSER,
/*RWD*/ ST_KEYSET_DBMS_STORE, ST_KEYSET_DBMS_STORE, ST_KEYSET_DBMS_STORE,
/*FnQ*/ ST_NONE, ST_NONE,
/*Obj*/ ST_CERT_PKIUSER,
/*Flg*/ KEYMGMT_FLAG_GETISSUER,
ACCESS_KEYSET_FxRxD, ACCESS_KEYSET_FNxxx ),
/* Access revocation info/CRL */
MK_KEYACL_RWD( KEYMGMT_ITEM_REVOCATIONINFO,
/*RWD*/ ST_KEYSET_DBMS | ST_KEYSET_DBMS_STORE, ST_KEYSET_DBMS, ST_NONE,
/*FnQ*/ ST_NONE, ST_NONE,
/*Obj*/ ST_CERT_CRL,
/*Flg*/ KEYMGMT_FLAG_CHECK_ONLY,
ACCESS_KEYSET_FxRxD, ACCESS_KEYSET_FNxxx ),
/* Other data (for PKCS #15 tokens) */
MK_KEYACL_RWD( KEYMGMT_ITEM_DATA,
/*RWD*/ ST_KEYSET_FILE, ST_KEYSET_FILE, ST_NONE,
/*FnQ*/ ST_NONE, ST_NONE,
/*Obj*/ ST_NONE,
/*Flg*/ KEYMGMT_FLAG_NONE,
ACCESS_KEYSET_xxRWD, ACCESS_KEYSET_FNxxx ),
/* Last item type */
MK_KEYACL( KEYMGMT_ITEM_NONE,
/*RWD*/ ST_NONE,
/*FnQ*/ ST_NONE,
/*Obj*/ ST_NONE,
/*Flg*/ KEYMGMT_FLAG_NONE,
ACCESS_KEYSET_xxxxx, ACCESS_KEYSET_xxxxx )
};
/****************************************************************************
* *
* Init/Shutdown Functions *
* *
****************************************************************************/
int initKeymgmtACL( KERNEL_DATA *krnlDataPtr )
{
int i;
/* Perform a consistency check on the cert management ACLs */
for( i = 0; keyManagementACL[ i ].itemType != KEYMGMT_ITEM_NONE; i++ )
{
const KEYMGMT_ACL *keyMgmtACL = &keyManagementACL[ i ];
if( ( keyMgmtACL->keysetR_subTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->keysetR_subTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | \
ST_DEV_P11 | ST_DEV_CAPI ) ) != 0 || \
keyMgmtACL->keysetR_subTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->keysetW_subTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->keysetW_subTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | \
ST_DEV_P11 | ST_DEV_CAPI ) ) != 0 || \
keyMgmtACL->keysetW_subTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->keysetD_subTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->keysetD_subTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | \
ST_DEV_P11 | ST_DEV_CAPI ) ) != 0 || \
keyMgmtACL->keysetD_subTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->keysetFN_subTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->keysetFN_subTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | \
ST_DEV_P11 | ST_DEV_CAPI ) ) != 0 || \
keyMgmtACL->keysetFN_subTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->keysetQ_subTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->keysetQ_subTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | ST_DEV_P11 ) ) != 0 || \
keyMgmtACL->keysetQ_subTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->objSubTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->objSubTypeA & \
~( SUBTYPE_CLASS_A | ST_CERT_ANY | ST_CTX_PKC | ST_CTX_CONV ) ) != 0 || \
keyMgmtACL->objSubTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( keyMgmtACL->allowedFlags < KEYMGMT_FLAG_NONE || \
keyMgmtACL->allowedFlags >= KEYMGMT_FLAG_LAST )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->specificKeysetSubTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->specificKeysetSubTypeA & \
~( SUBTYPE_CLASS_A | ST_KEYSET_ANY | ST_DEV_FORT | \
ST_DEV_P11 | ST_DEV_CAPI ) ) != 0 || \
keyMgmtACL->specificKeysetSubTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
if( ( keyMgmtACL->specificObjSubTypeA & SUBTYPE_CLASS_B ) || \
( keyMgmtACL->specificObjSubTypeA & \
~( SUBTYPE_CLASS_A | ST_CERT_ANY ) ) != 0 || \
keyMgmtACL->specificObjSubTypeB != ST_NONE )
return( CRYPT_ERROR_FAILED );
}
/* Set up the reference to the kernel data block */
krnlData = krnlDataPtr;
return( CRYPT_OK );
}
void endKeymgmtACL( void )
{
krnlData = NULL;
}
/****************************************************************************
* *
* Keyset ACL Check Functions *
* *
****************************************************************************/
/* It's a keyset action message, check the access conditions for the mechanism
objects */
int preDispatchCheckKeysetAccess( const int objectHandle,
const MESSAGE_TYPE message,
const void *messageDataPtr,
const int messageValue,
const void *dummy )
{
const MESSAGE_TYPE localMessage = message & MESSAGE_MASK;
const MESSAGE_KEYMGMT_INFO *mechanismInfo = \
( MESSAGE_KEYMGMT_INFO * ) messageDataPtr;
const KEYMGMT_ACL *keymgmtACL;
const int accessType = \
( localMessage == MESSAGE_KEY_GETKEY ) ? ACCESS_FLAG_R : \
( localMessage == MESSAGE_KEY_SETKEY ) ? ACCESS_FLAG_W : \
( localMessage == MESSAGE_KEY_DELETEKEY ) ? ACCESS_FLAG_D : \
( localMessage == MESSAGE_KEY_GETFIRSTCERT ) ? ACCESS_FLAG_F : \
( localMessage == MESSAGE_KEY_GETNEXTCERT ) ? ACCESS_FLAG_N : 0;
const OBJECT_INFO *objectTable = krnlData->objectTable;
OBJECT_SUBTYPE subType;
int paramObjectHandle, i;
/* Preconditions */
PRE( isValidObject( objectHandle ) );
PRE( localMessage == MESSAGE_KEY_GETKEY || \
localMessage == MESSAGE_KEY_SETKEY || \
localMessage == MESSAGE_KEY_DELETEKEY || \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -