[xmlsec] xmlsec-nss patches from Sun( 2003-07-22 )
Andrew Fan
Andrew.Fan@sun.com
Tue, 22 Jul 2003 17:39:45 +0800
This is a multi-part message in MIME format.
--------------030502060201080000040609
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Hi,
This xmlsec-nss patch is based on the XMLSEC_NSS_030714 branch. It add
two new files in order to support end-user designated PKCS#11 slot
instead of useing the default NSS built-in ones( PK11_GetBestSlot ).
Why I add the new interfaces:
1. NSS' function "PK11_GetBestSlot ", which will load all of the
internal built-in slots or all of the actived pkcs11 module's slots;
2. Some time, end user hopes that a certain crypto operation act in a
certain crypto device, especially in multi-crypto-devices environment.
3. Some time, a key generated from a certain slot, it only work in that
slot( such as RSA private key ). PK11_GetBestSlot can not ensure this.
In the case, end user can assign the specific slot with the new interface.
Here's the usage of the interfaces:
1. "xmlSecSetSlotList" is used to set the user designated slot list.
2. "xmlSecFreeSlot" is used to destroy the slot list repository.
3. When generate a new key, "xmlSecGetSlot" gives the user designated slot;
4. If end user want to maintain the slot list repository, he can access
the repository with "xmlSecGetSlotList".
Andrew
--------------030502060201080000040609
Content-Type: text/plain;
name="tokens.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="tokens.h"
/**
* XMLSec library
*
* This is free software; see Copyright file in the source
* distribution for preciese wording.
*
* Copyright (c) 2003 Sun Microsystems, Inc. All rights reserved.
*
* Contributor(s): _____________________________
*
*/
#ifndef __XMLSEC_NSS_TOKENS_H__
#define __XMLSEC_NSS_TOKENS_H__
#include "globals.h"
#include <string.h>
#include <nss.h>
#include <pk11func.h>
#include <xmlsec/xmlsec.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/************************************************************************
* PKCS#11 crypto token interfaces
*
* A PKCS#11 slot repository will be defined internally. From the
* repository, a user can specify a particular slot for a certain crypto
* mechanism.
*
* In some situation, some cryptographic operation should act in a user
* designated devices. The interfaces defined here provide the way. If
* the user do not initialize the repository distinctly, the interfaces
* use the default functions provided by NSS itself.
*
************************************************************************/
/**
* Get PKCS#11 slot handler
* @type the mechanism that the slot must support.
*
* Returns a pointer to PKCS#11 slot or NULL if an error occurs.
*
* Notes: The returned handler should be destroied distinctly.
*/
XMLSEC_CRYPTO_EXPORT PK11SlotInfo* xmlSecGetSlot( CK_MECHANISM_TYPE type ) ;
/**
* Free NSS crypto engine PKCS#11 slot repository
*/
XMLSEC_CRYPTO_EXPORT void xmlSecFreeSlot( void ) ;
/**
* Set NSS crypto engine PKCS11 slots
* @list the PKCS#11 slot list that the crypto engine should work with.
*
* Returns a pointer to PKCS#11 slot list or NULL if an error occurs.
*/
XMLSEC_CRYPTO_EXPORT PK11SlotList* xmlSecSetSlotList( PK11SlotList* list ) ;
/**
* Get NSS crypto engine PKCS#11 slot list
*
* Returns a pointer to PKCS#11 slot list or NULL if an error occurs.
*/
XMLSEC_CRYPTO_EXPORT PK11SlotList* xmlSecGetSlotList( void ) ;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __XMLSEC_NSS_TOKENS_H__ */
--------------030502060201080000040609
Content-Type: text/plain;
name="tokens.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="tokens.c"
/**
* XMLSec library
*
* This is free software; see Copyright file in the source
* distribution for preciese wording.
*
* Copyright (c) 2003 Sun Microsystems, Inc. All rights reserved.
*
* Contributor(s): _____________________________
*
*/
#include "globals.h"
#include <string.h>
#include <xmlsec/nss/tokens.h>
/*-
* Global PKCS#11 crypto token repository
*/
static PK11SlotList* _xmlSecSlotList = NULL ;
/**
* Get PKCS#11 slot handler
* @type the mechanism that the slot must support.
*
* Returns a pointer to PKCS#11 slot or NULL if an error occurs.
*
* Notes: The returned handler should be destroied distinctly.
*/
PK11SlotInfo*
xmlSecGetSlot(
CK_MECHANISM_TYPE type
) {
PK11SlotInfo* slot = NULL ;
if( _xmlSecSlotList == NULL ) {
slot = PK11_GetBestSlot( type , NULL ) ;
} else {
PK11SlotListElement* sle = NULL ;
for( sle = PK11_GetFirstSafe( _xmlSecSlotList ) ; sle != NULL ; PK11_GetNextSafe( _xmlSecSlotList , sle , PR_TRUE ) ) {
if( !PK11_IsPresent( sle->slot ) )
continue ;
if( !PK11_DoesMechanism( sle->slot , type ) )
continue ;
if( PK11_NeedLogin( sle->slot ) ) {
if( PK11_Authenticate( sle->slot , PR_TRUE , NULL ) != SECSuccess )
continue ;
}
slot = PK11_ReferenceSlot( sle->slot ) ;
break ;
}
//Shall I destroy the non-null PK11SlotListElement?
}
return slot ;
}
/**
* Free NSS crypto engine PKCS#11 slot repository
*/
void
xmlSecFreeSlot(
void
) {
if( _xmlSecSlotList != NULL ) {
PK11_FreeSlotList( _xmlSecSlotList ) ;
_xmlSecSlotList = NULL ;
}
}
/**
* Set NSS crypto engine PKCS11 slots
* @list the PKCS#11 slot list that the crypto engine should work with.
*
* Returns a pointer to PKCS#11 slot list or NULL if an error occurs.
*/
PK11SlotList*
xmlSecSetSlotList(
PK11SlotList* list
) {
if( _xmlSecSlotList != NULL ) {
PK11_FreeSlotList( _xmlSecSlotList ) ;
_xmlSecSlotList = NULL ;
}
_xmlSecSlotList = list ;
return _xmlSecSlotList ;
}
/**
* Get NSS crypto engine PKCS#11 slot list
*
* Returns a pointer to PKCS#11 slot list or NULL if an error occurs.
*/
PK11SlotList*
xmlSecGetSlotList(
void
) {
return _xmlSecSlotList ;
}
--------------030502060201080000040609--