gecko/security/nss/lib/dev/dev.h
Wan-Teh Chang d2e338b885 Bug 858231: Update NSS to NSS 3.15 Beta 3, with local patches
bug-835919.patch and bug-835919.patch. r=wtc.
Bug 866525: Add AddressSanitizer annotations to port_ArenaZeroAfterMark.
r=choller.

Also include fixes for bug 866363, bug 866949, bug 835919, bug 863871.
2013-05-02 16:10:01 -07:00

939 lines
15 KiB
C

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef DEV_H
#define DEV_H
/*
* dev.h
*
* Low-level methods for interaction with cryptoki devices
*/
#ifndef NSSDEV_H
#include "nssdev.h"
#endif /* NSSDEV_H */
#ifndef DEVT_H
#include "devt.h"
#endif /* DEVT_H */
PR_BEGIN_EXTERN_C
/* the global module list
*
* These functions are for managing the global set of modules. Trust Domains,
* etc., will draw from this set. These functions are completely internal
* and only invoked when there are changes to the global module state
* (load or unload).
*
* nss_InitializeGlobalModuleList
* nss_DestroyGlobalModuleList
* nss_GetLoadedModules
*
* nssGlobalModuleList_Add
* nssGlobalModuleList_Remove
* nssGlobalModuleList_FindModuleByName
* nssGlobalModuleList_FindSlotByName
* nssGlobalModuleList_FindTokenByName
*/
NSS_EXTERN PRStatus
nss_InitializeGlobalModuleList
(
void
);
NSS_EXTERN PRStatus
nss_DestroyGlobalModuleList
(
void
);
NSS_EXTERN NSSModule **
nss_GetLoadedModules
(
void
);
NSS_EXTERN PRStatus
nssGlobalModuleList_Add
(
NSSModule *module
);
NSS_EXTERN PRStatus
nssGlobalModuleList_Remove
(
NSSModule *module
);
NSS_EXTERN NSSModule *
nssGlobalModuleList_FindModuleByName
(
NSSUTF8 *moduleName
);
NSS_EXTERN NSSSlot *
nssGlobalModuleList_FindSlotByName
(
NSSUTF8 *slotName
);
NSS_EXTERN NSSToken *
nssGlobalModuleList_FindTokenByName
(
NSSUTF8 *tokenName
);
NSS_EXTERN NSSToken *
nss_GetDefaultCryptoToken
(
void
);
NSS_EXTERN NSSToken *
nss_GetDefaultDatabaseToken
(
void
);
/*
* |-----------|<---> NSSSlot <--> NSSToken
* | NSSModule |<---> NSSSlot <--> NSSToken
* |-----------|<---> NSSSlot <--> NSSToken
*/
/* NSSModule
*
* nssModule_Create
* nssModule_CreateFromSpec
* nssModule_AddRef
* nssModule_GetName
* nssModule_GetSlots
* nssModule_FindSlotByName
* nssModule_FindTokenByName
* nssModule_GetCertOrder
*/
NSS_EXTERN NSSModule *
nssModule_Create
(
NSSUTF8 *moduleOpt,
NSSUTF8 *uriOpt,
NSSUTF8 *opaqueOpt,
void *reserved
);
/* This is to use the new loading mechanism. */
NSS_EXTERN NSSModule *
nssModule_CreateFromSpec
(
NSSUTF8 *moduleSpec,
NSSModule *parent,
PRBool loadSubModules
);
NSS_EXTERN PRStatus
nssModule_Destroy
(
NSSModule *mod
);
NSS_EXTERN NSSModule *
nssModule_AddRef
(
NSSModule *mod
);
NSS_EXTERN NSSUTF8 *
nssModule_GetName
(
NSSModule *mod
);
NSS_EXTERN NSSSlot **
nssModule_GetSlots
(
NSSModule *mod
);
NSS_EXTERN NSSSlot *
nssModule_FindSlotByName
(
NSSModule *mod,
NSSUTF8 *slotName
);
NSS_EXTERN NSSToken *
nssModule_FindTokenByName
(
NSSModule *mod,
NSSUTF8 *tokenName
);
NSS_EXTERN PRInt32
nssModule_GetCertOrder
(
NSSModule *module
);
/* NSSSlot
*
* nssSlot_Destroy
* nssSlot_AddRef
* nssSlot_GetName
* nssSlot_GetTokenName
* nssSlot_IsTokenPresent
* nssSlot_IsPermanent
* nssSlot_IsFriendly
* nssSlot_IsHardware
* nssSlot_Refresh
* nssSlot_GetModule
* nssSlot_GetToken
* nssSlot_Login
* nssSlot_Logout
* nssSlot_SetPassword
* nssSlot_CreateSession
*/
NSS_EXTERN PRStatus
nssSlot_Destroy
(
NSSSlot *slot
);
NSS_EXTERN NSSSlot *
nssSlot_AddRef
(
NSSSlot *slot
);
NSS_EXTERN void
nssSlot_ResetDelay
(
NSSSlot *slot
);
NSS_EXTERN NSSUTF8 *
nssSlot_GetName
(
NSSSlot *slot
);
NSS_EXTERN NSSUTF8 *
nssSlot_GetTokenName
(
NSSSlot *slot
);
NSS_EXTERN NSSModule *
nssSlot_GetModule
(
NSSSlot *slot
);
NSS_EXTERN NSSToken *
nssSlot_GetToken
(
NSSSlot *slot
);
NSS_EXTERN PRBool
nssSlot_IsTokenPresent
(
NSSSlot *slot
);
NSS_EXTERN PRBool
nssSlot_IsPermanent
(
NSSSlot *slot
);
NSS_EXTERN PRBool
nssSlot_IsFriendly
(
NSSSlot *slot
);
NSS_EXTERN PRBool
nssSlot_IsHardware
(
NSSSlot *slot
);
NSS_EXTERN PRBool
nssSlot_IsLoggedIn
(
NSSSlot *slot
);
NSS_EXTERN PRStatus
nssSlot_Refresh
(
NSSSlot *slot
);
NSS_EXTERN PRStatus
nssSlot_Login
(
NSSSlot *slot,
NSSCallback *pwcb
);
extern const NSSError NSS_ERROR_INVALID_PASSWORD;
extern const NSSError NSS_ERROR_USER_CANCELED;
NSS_EXTERN PRStatus
nssSlot_Logout
(
NSSSlot *slot,
nssSession *sessionOpt
);
NSS_EXTERN void
nssSlot_EnterMonitor
(
NSSSlot *slot
);
NSS_EXTERN void
nssSlot_ExitMonitor
(
NSSSlot *slot
);
#define NSSSLOT_ASK_PASSWORD_FIRST_TIME -1
#define NSSSLOT_ASK_PASSWORD_EVERY_TIME 0
NSS_EXTERN void
nssSlot_SetPasswordDefaults
(
NSSSlot *slot,
PRInt32 askPasswordTimeout
);
NSS_EXTERN PRStatus
nssSlot_SetPassword
(
NSSSlot *slot,
NSSUTF8 *oldPasswordOpt,
NSSUTF8 *newPassword
);
extern const NSSError NSS_ERROR_INVALID_PASSWORD;
extern const NSSError NSS_ERROR_USER_CANCELED;
/*
* nssSlot_IsLoggedIn
*/
NSS_EXTERN nssSession *
nssSlot_CreateSession
(
NSSSlot *slot,
NSSArena *arenaOpt,
PRBool readWrite /* so far, this is the only flag used */
);
/* NSSToken
*
* nssToken_Destroy
* nssToken_AddRef
* nssToken_GetName
* nssToken_GetModule
* nssToken_GetSlot
* nssToken_NeedsPINInitialization
* nssToken_ImportCertificate
* nssToken_ImportTrust
* nssToken_ImportCRL
* nssToken_GenerateKeyPair
* nssToken_GenerateSymmetricKey
* nssToken_DeleteStoredObject
* nssToken_FindObjects
* nssToken_FindCertificatesBySubject
* nssToken_FindCertificatesByNickname
* nssToken_FindCertificatesByEmail
* nssToken_FindCertificateByIssuerAndSerialNumber
* nssToken_FindCertificateByEncodedCertificate
* nssToken_FindTrustForCertificate
* nssToken_FindCRLsBySubject
* nssToken_FindPrivateKeys
* nssToken_FindPrivateKeyByID
* nssToken_Digest
* nssToken_BeginDigest
* nssToken_ContinueDigest
* nssToken_FinishDigest
*/
NSS_EXTERN PRStatus
nssToken_Destroy
(
NSSToken *tok
);
NSS_EXTERN NSSToken *
nssToken_AddRef
(
NSSToken *tok
);
NSS_EXTERN NSSUTF8 *
nssToken_GetName
(
NSSToken *tok
);
NSS_EXTERN NSSModule *
nssToken_GetModule
(
NSSToken *token
);
NSS_EXTERN NSSSlot *
nssToken_GetSlot
(
NSSToken *tok
);
NSS_EXTERN PRBool
nssToken_NeedsPINInitialization
(
NSSToken *token
);
NSS_EXTERN nssCryptokiObject *
nssToken_ImportCertificate
(
NSSToken *tok,
nssSession *sessionOpt,
NSSCertificateType certType,
NSSItem *id,
const NSSUTF8 *nickname,
NSSDER *encoding,
NSSDER *issuer,
NSSDER *subject,
NSSDER *serial,
NSSASCII7 *emailAddr,
PRBool asTokenObject
);
NSS_EXTERN nssCryptokiObject *
nssToken_ImportTrust
(
NSSToken *tok,
nssSession *sessionOpt,
NSSDER *certEncoding,
NSSDER *certIssuer,
NSSDER *certSerial,
nssTrustLevel serverAuth,
nssTrustLevel clientAuth,
nssTrustLevel codeSigning,
nssTrustLevel emailProtection,
PRBool stepUpApproved,
PRBool asTokenObject
);
NSS_EXTERN nssCryptokiObject *
nssToken_ImportCRL
(
NSSToken *token,
nssSession *sessionOpt,
NSSDER *subject,
NSSDER *encoding,
PRBool isKRL,
NSSUTF8 *url,
PRBool asTokenObject
);
/* Permanently remove an object from the token. */
NSS_EXTERN PRStatus
nssToken_DeleteStoredObject
(
nssCryptokiObject *instance
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindObjects
(
NSSToken *token,
nssSession *sessionOpt,
CK_OBJECT_CLASS objclass,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindCertificatesBySubject
(
NSSToken *token,
nssSession *sessionOpt,
NSSDER *subject,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindCertificatesByNickname
(
NSSToken *token,
nssSession *sessionOpt,
const NSSUTF8 *name,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindCertificatesByEmail
(
NSSToken *token,
nssSession *sessionOpt,
NSSASCII7 *email,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindCertificatesByID
(
NSSToken *token,
nssSession *sessionOpt,
NSSItem *id,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject *
nssToken_FindCertificateByIssuerAndSerialNumber
(
NSSToken *token,
nssSession *sessionOpt,
NSSDER *issuer,
NSSDER *serial,
nssTokenSearchType searchType,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject *
nssToken_FindCertificateByEncodedCertificate
(
NSSToken *token,
nssSession *sessionOpt,
NSSBER *encodedCertificate,
nssTokenSearchType searchType,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject *
nssToken_FindTrustForCertificate
(
NSSToken *token,
nssSession *sessionOpt,
NSSDER *certEncoding,
NSSDER *certIssuer,
NSSDER *certSerial,
nssTokenSearchType searchType
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindCRLsBySubject
(
NSSToken *token,
nssSession *sessionOpt,
NSSDER *subject,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject **
nssToken_FindPrivateKeys
(
NSSToken *token,
nssSession *sessionOpt,
nssTokenSearchType searchType,
PRUint32 maximumOpt,
PRStatus *statusOpt
);
NSS_EXTERN nssCryptokiObject *
nssToken_FindPrivateKeyByID
(
NSSToken *token,
nssSession *sessionOpt,
NSSItem *keyID
);
NSS_EXTERN nssCryptokiObject *
nssToken_FindPublicKeyByID
(
NSSToken *token,
nssSession *sessionOpt,
NSSItem *keyID
);
NSS_EXTERN NSSItem *
nssToken_Digest
(
NSSToken *tok,
nssSession *sessionOpt,
NSSAlgorithmAndParameters *ap,
NSSItem *data,
NSSItem *rvOpt,
NSSArena *arenaOpt
);
NSS_EXTERN PRStatus
nssToken_BeginDigest
(
NSSToken *tok,
nssSession *sessionOpt,
NSSAlgorithmAndParameters *ap
);
NSS_EXTERN PRStatus
nssToken_ContinueDigest
(
NSSToken *tok,
nssSession *sessionOpt,
NSSItem *item
);
NSS_EXTERN NSSItem *
nssToken_FinishDigest
(
NSSToken *tok,
nssSession *sessionOpt,
NSSItem *rvOpt,
NSSArena *arenaOpt
);
/* nssSession
*
* nssSession_Destroy
* nssSession_EnterMonitor
* nssSession_ExitMonitor
* nssSession_IsReadWrite
*/
NSS_EXTERN PRStatus
nssSession_Destroy
(
nssSession *s
);
/* would like to inline */
NSS_EXTERN PRStatus
nssSession_EnterMonitor
(
nssSession *s
);
/* would like to inline */
NSS_EXTERN PRStatus
nssSession_ExitMonitor
(
nssSession *s
);
/* would like to inline */
NSS_EXTERN PRBool
nssSession_IsReadWrite
(
nssSession *s
);
/* nssCryptokiObject
*
* An object living on a cryptoki token.
* Not really proper to mix up the object types just because
* nssCryptokiObject itself is generic, but doing so anyway.
*
* nssCryptokiObject_Destroy
* nssCryptokiObject_Equal
* nssCryptokiObject_Clone
* nssCryptokiCertificate_GetAttributes
* nssCryptokiPrivateKey_GetAttributes
* nssCryptokiPublicKey_GetAttributes
* nssCryptokiTrust_GetAttributes
* nssCryptokiCRL_GetAttributes
*/
NSS_EXTERN void
nssCryptokiObject_Destroy
(
nssCryptokiObject *object
);
NSS_EXTERN PRBool
nssCryptokiObject_Equal
(
nssCryptokiObject *object1,
nssCryptokiObject *object2
);
NSS_EXTERN nssCryptokiObject *
nssCryptokiObject_Clone
(
nssCryptokiObject *object
);
NSS_EXTERN PRStatus
nssCryptokiCertificate_GetAttributes
(
nssCryptokiObject *object,
nssSession *sessionOpt,
NSSArena *arenaOpt,
NSSCertificateType *certTypeOpt,
NSSItem *idOpt,
NSSDER *encodingOpt,
NSSDER *issuerOpt,
NSSDER *serialOpt,
NSSDER *subjectOpt
);
NSS_EXTERN PRStatus
nssCryptokiTrust_GetAttributes
(
nssCryptokiObject *trustObject,
nssSession *sessionOpt,
NSSItem *sha1_hash,
nssTrustLevel *serverAuth,
nssTrustLevel *clientAuth,
nssTrustLevel *codeSigning,
nssTrustLevel *emailProtection,
PRBool *stepUpApproved
);
NSS_EXTERN PRStatus
nssCryptokiCRL_GetAttributes
(
nssCryptokiObject *crlObject,
nssSession *sessionOpt,
NSSArena *arenaOpt,
NSSItem *encodingOpt,
NSSItem * subjectOpt,
CK_ULONG * crl_class,
NSSUTF8 **urlOpt,
PRBool *isKRLOpt
);
/* I'm including this to handle import of certificates in NSS 3.5. This
* function will set the cert-related attributes of a key, in order to
* associate it with a cert. Does it stay like this for 4.0?
*/
NSS_EXTERN PRStatus
nssCryptokiPrivateKey_SetCertificate
(
nssCryptokiObject *keyObject,
nssSession *sessionOpt,
const NSSUTF8 *nickname,
NSSItem *id,
NSSDER *subject
);
NSS_EXTERN void
nssModuleArray_Destroy
(
NSSModule **modules
);
/* nssSlotArray
*
* nssSlotArray_Destroy
*/
NSS_EXTERN void
nssSlotArray_Destroy
(
NSSSlot **slots
);
/* nssTokenArray
*
* nssTokenArray_Destroy
*/
NSS_EXTERN void
nssTokenArray_Destroy
(
NSSToken **tokens
);
/* nssCryptokiObjectArray
*
* nssCryptokiObjectArray_Destroy
*/
NSS_EXTERN void
nssCryptokiObjectArray_Destroy
(
nssCryptokiObject **object
);
/* nssSlotList
*
* An ordered list of slots. The order can be anything, it is set in the
* Add methods. Perhaps it should be CreateInCertOrder, ...?
*
* nssSlotList_Create
* nssSlotList_Destroy
* nssSlotList_Add
* nssSlotList_AddModuleSlots
* nssSlotList_GetSlots
* nssSlotList_FindSlotByName
* nssSlotList_FindTokenByName
* nssSlotList_GetBestSlot
* nssSlotList_GetBestSlotForAlgorithmAndParameters
* nssSlotList_GetBestSlotForAlgorithmsAndParameters
*/
/* nssSlotList_Create
*/
NSS_EXTERN nssSlotList *
nssSlotList_Create
(
NSSArena *arenaOpt
);
/* nssSlotList_Destroy
*/
NSS_EXTERN void
nssSlotList_Destroy
(
nssSlotList *slotList
);
/* nssSlotList_Add
*
* Add the given slot in the given order.
*/
NSS_EXTERN PRStatus
nssSlotList_Add
(
nssSlotList *slotList,
NSSSlot *slot,
PRUint32 order
);
/* nssSlotList_AddModuleSlots
*
* Add all slots in the module, in the given order (the slots will have
* equal weight).
*/
NSS_EXTERN PRStatus
nssSlotList_AddModuleSlots
(
nssSlotList *slotList,
NSSModule *module,
PRUint32 order
);
/* nssSlotList_GetSlots
*/
NSS_EXTERN NSSSlot **
nssSlotList_GetSlots
(
nssSlotList *slotList
);
/* nssSlotList_FindSlotByName
*/
NSS_EXTERN NSSSlot *
nssSlotList_FindSlotByName
(
nssSlotList *slotList,
NSSUTF8 *slotName
);
/* nssSlotList_FindTokenByName
*/
NSS_EXTERN NSSToken *
nssSlotList_FindTokenByName
(
nssSlotList *slotList,
NSSUTF8 *tokenName
);
/* nssSlotList_GetBestSlot
*
* The best slot is the highest ranking in order, i.e., the first in the
* list.
*/
NSS_EXTERN NSSSlot *
nssSlotList_GetBestSlot
(
nssSlotList *slotList
);
/* nssSlotList_GetBestSlotForAlgorithmAndParameters
*
* Highest-ranking slot than can handle algorithm/parameters.
*/
NSS_EXTERN NSSSlot *
nssSlotList_GetBestSlotForAlgorithmAndParameters
(
nssSlotList *slotList,
NSSAlgorithmAndParameters *ap
);
/* nssSlotList_GetBestSlotForAlgorithmsAndParameters
*
* Highest-ranking slot than can handle all algorithms/parameters.
*/
NSS_EXTERN NSSSlot *
nssSlotList_GetBestSlotForAlgorithmsAndParameters
(
nssSlotList *slotList,
NSSAlgorithmAndParameters **ap
);
NSS_EXTERN PRBool
nssToken_IsPresent
(
NSSToken *token
);
NSS_EXTERN nssSession *
nssToken_GetDefaultSession
(
NSSToken *token
);
NSS_EXTERN PRStatus
nssToken_GetTrustOrder
(
NSSToken *tok
);
NSS_EXTERN PRStatus
nssToken_NotifyCertsNotVisible
(
NSSToken *tok
);
NSS_EXTERN PRStatus
nssToken_TraverseCertificates
(
NSSToken *token,
nssSession *sessionOpt,
nssTokenSearchType searchType,
PRStatus (* callback)(nssCryptokiObject *instance, void *arg),
void *arg
);
NSS_EXTERN PRBool
nssToken_IsPrivateKeyAvailable
(
NSSToken *token,
NSSCertificate *c,
nssCryptokiObject *instance
);
PR_END_EXTERN_C
#endif /* DEV_H */