| /* 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_FindObjectsByTemplate( |
| NSSToken *token, |
| nssSession *sessionOpt, |
| CK_ATTRIBUTE_PTR obj_template, |
| CK_ULONG otsize, |
| PRUint32 maximumOpt, |
| PRStatus *statusOpt); |
| |
| 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 */ |