/* 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 DEVT_H
#define DEVT_H

/*
 * devt.h
 *
 * This file contains definitions for the low-level cryptoki devices.
 */

#ifndef NSSBASET_H
#include "nssbaset.h"
#endif /* NSSBASET_H */

#ifndef NSSPKIT_H
#include "nsspkit.h"
#endif /* NSSPKIT_H */

#ifndef NSSDEVT_H
#include "nssdevt.h"
#endif /* NSSDEVT_H */

#ifndef BASET_H
#include "baset.h"
#endif /* BASET_H */

#include "secmodt.h"

PR_BEGIN_EXTERN_C

typedef struct nssSessionStr nssSession;

/* XXX until NSSTokenStr is moved */
struct nssDeviceBaseStr {
    NSSArena *arena;
    PZLock *lock;
    PRInt32 refCount;
    NSSUTF8 *name;
    PRUint32 flags;
};

typedef struct nssTokenObjectCacheStr nssTokenObjectCache;

/* XXX until devobject.c goes away */
struct NSSTokenStr {
    struct nssDeviceBaseStr base;
    NSSSlot *slot;    /* Parent (or peer, if you will) */
    CK_FLAGS ckFlags; /* from CK_TOKEN_INFO.flags */
    PRUint32 flags;
    void *epv;
    nssSession *defaultSession;
    NSSTrustDomain *trustDomain;
    PRIntervalTime lastTime;
    nssTokenObjectCache *cache;
    PK11SlotInfo *pk11slot;
};

typedef enum {
    nssSlotAskPasswordTimes_FirstTime = 0,
    nssSlotAskPasswordTimes_EveryTime = 1,
    nssSlotAskPasswordTimes_Timeout = 2
} nssSlotAskPasswordTimes;

struct nssSlotAuthInfoStr {
    PRTime lastLogin;
    nssSlotAskPasswordTimes askTimes;
    PRIntervalTime askPasswordTimeout;
};

/* values for lastTokenPingState */
typedef enum {
    nssSlotLastPingState_Reset = 0,  /* the state has just been reset, discard
                                      * our cache */
    nssSlotLastPingState_Update = 1, /* we are updating the lastTokenPingTime */
    nssSlotLastPingState_Valid = 2,  /* lastTokenPingTime is valid */
} nssSlotLastPingState;

struct NSSSlotStr {
    struct nssDeviceBaseStr base;
    NSSModule *module; /* Parent */
    NSSToken *token;   /* Peer */
    CK_SLOT_ID slotID;
    CK_FLAGS ckFlags; /* from CK_SLOT_INFO.flags */
    struct nssSlotAuthInfoStr authInfo;
    PRIntervalTime lastTokenPingTime;
    nssSlotLastPingState lastTokenPingState;
    PZLock *lock;
    void *epv;
    PK11SlotInfo *pk11slot;
    PZLock *isPresentLock;
    PRCondVar *isPresentCondition;
    PRThread *isPresentThread;
};

struct nssSessionStr {
    /* Must not hold slot->lock when taking lock.
     * See ordering in nssSlot_IsTokenPresent.
     */
    PZLock *lock;
    CK_SESSION_HANDLE handle;
    NSSSlot *slot;
    PRBool isRW;
    PRBool ownLock;
};

typedef enum {
    NSSCertificateType_Unknown = 0,
    NSSCertificateType_PKIX = 1
} NSSCertificateType;

typedef enum {
    nssTrustLevel_Unknown = 0,
    nssTrustLevel_NotTrusted = 1,
    nssTrustLevel_Trusted = 2,
    nssTrustLevel_TrustedDelegator = 3,
    nssTrustLevel_MustVerify = 4,
    nssTrustLevel_ValidDelegator = 5
} nssTrustLevel;

typedef struct nssCryptokiInstanceStr nssCryptokiInstance;

struct nssCryptokiInstanceStr {
    CK_OBJECT_HANDLE handle;
    NSSToken *token;
    PRBool isTokenObject;
    NSSUTF8 *label;
};

typedef struct nssCryptokiInstanceStr nssCryptokiObject;

typedef struct nssTokenCertSearchStr nssTokenCertSearch;

typedef enum {
    nssTokenSearchType_AllObjects = 0,
    nssTokenSearchType_SessionOnly = 1,
    nssTokenSearchType_TokenOnly = 2,
    nssTokenSearchType_TokenForced = 3
} nssTokenSearchType;

struct nssTokenCertSearchStr {
    nssTokenSearchType searchType;
    PRStatus (*callback)(NSSCertificate *c, void *arg);
    void *cbarg;
    nssList *cached;
    /* TODO: add a cache query callback if the list would be large
     *       (traversal)
     */
};

struct nssSlotListStr;
typedef struct nssSlotListStr nssSlotList;

struct NSSAlgorithmAndParametersStr {
    CK_MECHANISM mechanism;
};

PR_END_EXTERN_C

#endif /* DEVT_H */
