/* 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/. */
#include "prlog.h"
#include <stdio.h>
#include "cert.h" /* for CERT_DerNameToAscii & CERT_Hexify */

static PRLogModuleInfo *modlog = NULL;

static CK_FUNCTION_LIST_PTR module_functions;

static CK_FUNCTION_LIST debug_functions;

static void print_final_statistics(void);

#define STRING static const char

STRING fmt_flags[] = "  flags = 0x%x";
STRING fmt_hKey[] = "  hKey = 0x%x";
STRING fmt_hObject[] = "  hObject = 0x%x";
STRING fmt_hSession[] = "  hSession = 0x%x";
STRING fmt_manufacturerID[] = "  manufacturerID = \"%.32s\"";
STRING fmt_pData[] = "  pData = 0x%p";
STRING fmt_pDigest[] = "  pDigest = 0x%p";
STRING fmt_pEncryptedData[] = "  pEncryptedData = 0x%p";
STRING fmt_pEncryptedPart[] = "  pEncryptedPart = 0x%p";
STRING fmt_pInfo[] = "  pInfo = 0x%p";
STRING fmt_pMechanism[] = "  pMechanism = 0x%p";
STRING fmt_pOperationState[] = "  pOperationState = 0x%p";
STRING fmt_pPart[] = "  pPart = 0x%p";
STRING fmt_pPin[] = "  pPin = 0x%p";
STRING fmt_pSignature[] = "  pSignature = 0x%p";
STRING fmt_pTemplate[] = "  pTemplate = 0x%p";
STRING fmt_pWrappedKey[] = "  pWrappedKey = 0x%p";
STRING fmt_phKey[] = "  phKey = 0x%p";
STRING fmt_phObject[] = "  phObject = 0x%p";
STRING fmt_pulCount[] = "  pulCount = 0x%p";
STRING fmt_pulDataLen[] = "  pulDataLen = 0x%p";
STRING fmt_pulDigestLen[] = "  pulDigestLen = 0x%p";
STRING fmt_pulEncryptedPartLen[] = "  pulEncryptedPartLen = 0x%p";
STRING fmt_pulPartLen[] = "  pulPartLen = 0x%p";
STRING fmt_pulSignatureLen[] = "  pulSignatureLen = 0x%p";
STRING fmt_slotID[] = "  slotID = 0x%x";
STRING fmt_sphKey[] = "  *phKey = 0x%x";
STRING fmt_spulCount[] = "  *pulCount = 0x%x";
STRING fmt_spulDataLen[] = "  *pulDataLen = 0x%x";
STRING fmt_spulDigestLen[] = "  *pulDigestLen = 0x%x";
STRING fmt_spulEncryptedPartLen[] = "  *pulEncryptedPartLen = 0x%x";
STRING fmt_spulPartLen[] = "  *pulPartLen = 0x%x";
STRING fmt_spulSignatureLen[] = "  *pulSignatureLen = 0x%x";
STRING fmt_ulAttributeCount[] = "  ulAttributeCount = %d";
STRING fmt_ulCount[] = "  ulCount = %d";
STRING fmt_ulDataLen[] = "  ulDataLen = %d";
STRING fmt_ulEncryptedPartLen[] = "  ulEncryptedPartLen = %d";
STRING fmt_ulPartLen[] = "  ulPartLen = %d";
STRING fmt_ulPinLen[] = "  ulPinLen = %d";
STRING fmt_ulSignatureLen[] = "  ulSignatureLen = %d";

STRING fmt_fwVersion[] = "  firmware version: %d.%d";
STRING fmt_hwVersion[] = "  hardware version: %d.%d";
STRING fmt_s_qsq_d[] = "    %s = \"%s\" [%d]";
STRING fmt_s_s_d[] = "    %s = %s [%d]";
STRING fmt_s_lu[] = "    %s = %lu";
STRING fmt_invalid_handle[] = " (CK_INVALID_HANDLE)";

static void
get_attr_type_str(CK_ATTRIBUTE_TYPE atype, char *str, int len)
{
#define CASE(attr) \
    case attr:     \
        a = #attr; \
        break

    const char *a = NULL;

    switch (atype) {
        CASE(CKA_CLASS);
        CASE(CKA_TOKEN);
        CASE(CKA_PRIVATE);
        CASE(CKA_LABEL);
        CASE(CKA_APPLICATION);
        CASE(CKA_VALUE);
        CASE(CKA_OBJECT_ID);
        CASE(CKA_CERTIFICATE_TYPE);
        CASE(CKA_CERTIFICATE_CATEGORY);
        CASE(CKA_ISSUER);
        CASE(CKA_SERIAL_NUMBER);
        CASE(CKA_AC_ISSUER);
        CASE(CKA_OWNER);
        CASE(CKA_ATTR_TYPES);
        CASE(CKA_TRUSTED);
        CASE(CKA_KEY_TYPE);
        CASE(CKA_SUBJECT);
        CASE(CKA_ID);
        CASE(CKA_SENSITIVE);
        CASE(CKA_ENCRYPT);
        CASE(CKA_DECRYPT);
        CASE(CKA_WRAP);
        CASE(CKA_UNWRAP);
        CASE(CKA_SIGN);
        CASE(CKA_SIGN_RECOVER);
        CASE(CKA_VERIFY);
        CASE(CKA_VERIFY_RECOVER);
        CASE(CKA_DERIVE);
        CASE(CKA_START_DATE);
        CASE(CKA_END_DATE);
        CASE(CKA_MODULUS);
        CASE(CKA_MODULUS_BITS);
        CASE(CKA_PUBLIC_EXPONENT);
        CASE(CKA_PRIVATE_EXPONENT);
        CASE(CKA_PRIME_1);
        CASE(CKA_PRIME_2);
        CASE(CKA_EXPONENT_1);
        CASE(CKA_EXPONENT_2);
        CASE(CKA_COEFFICIENT);
        CASE(CKA_PRIME);
        CASE(CKA_SUBPRIME);
        CASE(CKA_BASE);
        CASE(CKA_PRIME_BITS);
        CASE(CKA_SUBPRIME_BITS);
        CASE(CKA_VALUE_BITS);
        CASE(CKA_VALUE_LEN);
        CASE(CKA_EXTRACTABLE);
        CASE(CKA_LOCAL);
        CASE(CKA_NEVER_EXTRACTABLE);
        CASE(CKA_ALWAYS_SENSITIVE);
        CASE(CKA_KEY_GEN_MECHANISM);
        CASE(CKA_MODIFIABLE);
        CASE(CKA_ECDSA_PARAMS);
        CASE(CKA_EC_POINT);
        CASE(CKA_SECONDARY_AUTH);
        CASE(CKA_AUTH_PIN_FLAGS);
        CASE(CKA_HW_FEATURE_TYPE);
        CASE(CKA_RESET_ON_INIT);
        CASE(CKA_HAS_RESET);
        CASE(CKA_VENDOR_DEFINED);
        CASE(CKA_NSS_URL);
        CASE(CKA_NSS_EMAIL);
        CASE(CKA_NSS_SMIME_INFO);
        CASE(CKA_NSS_SMIME_TIMESTAMP);
        CASE(CKA_NSS_PKCS8_SALT);
        CASE(CKA_NSS_PASSWORD_CHECK);
        CASE(CKA_NSS_EXPIRES);
        CASE(CKA_NSS_KRL);
        CASE(CKA_NSS_PQG_COUNTER);
        CASE(CKA_NSS_PQG_SEED);
        CASE(CKA_NSS_PQG_H);
        CASE(CKA_NSS_PQG_SEED_BITS);
        CASE(CKA_TRUST);
        CASE(CKA_TRUST_DIGITAL_SIGNATURE);
        CASE(CKA_TRUST_NON_REPUDIATION);
        CASE(CKA_TRUST_KEY_ENCIPHERMENT);
        CASE(CKA_TRUST_DATA_ENCIPHERMENT);
        CASE(CKA_TRUST_KEY_AGREEMENT);
        CASE(CKA_TRUST_KEY_CERT_SIGN);
        CASE(CKA_TRUST_CRL_SIGN);
        CASE(CKA_TRUST_SERVER_AUTH);
        CASE(CKA_TRUST_CLIENT_AUTH);
        CASE(CKA_TRUST_CODE_SIGNING);
        CASE(CKA_TRUST_EMAIL_PROTECTION);
        CASE(CKA_TRUST_IPSEC_END_SYSTEM);
        CASE(CKA_TRUST_IPSEC_TUNNEL);
        CASE(CKA_TRUST_IPSEC_USER);
        CASE(CKA_TRUST_TIME_STAMPING);
        CASE(CKA_CERT_SHA1_HASH);
        CASE(CKA_CERT_MD5_HASH);
        CASE(CKA_NETSCAPE_DB);
        CASE(CKA_NETSCAPE_TRUST);
        default:
            break;
    }
    if (a)
        PR_snprintf(str, len, "%s", a);
    else
        PR_snprintf(str, len, "0x%p", atype);
}

static void
get_obj_class(CK_OBJECT_CLASS objClass, char *str, int len)
{

    const char *a = NULL;

    switch (objClass) {
        CASE(CKO_DATA);
        CASE(CKO_CERTIFICATE);
        CASE(CKO_PUBLIC_KEY);
        CASE(CKO_PRIVATE_KEY);
        CASE(CKO_SECRET_KEY);
        CASE(CKO_HW_FEATURE);
        CASE(CKO_DOMAIN_PARAMETERS);
        CASE(CKO_NSS_CRL);
        CASE(CKO_NSS_SMIME);
        CASE(CKO_NSS_TRUST);
        CASE(CKO_NSS_BUILTIN_ROOT_LIST);
        default:
            break;
    }
    if (a)
        PR_snprintf(str, len, "%s", a);
    else
        PR_snprintf(str, len, "0x%p", objClass);
}

static void
get_trust_val(CK_TRUST trust, char *str, int len)
{
    const char *a = NULL;

    switch (trust) {
        CASE(CKT_NSS_TRUSTED);
        CASE(CKT_NSS_TRUSTED_DELEGATOR);
        CASE(CKT_NSS_NOT_TRUSTED);
        CASE(CKT_NSS_MUST_VERIFY_TRUST);
        CASE(CKT_NSS_TRUST_UNKNOWN);
        CASE(CKT_NSS_VALID_DELEGATOR);
        default:
            break;
    }
    if (a)
        PR_snprintf(str, len, "%s", a);
    else
        PR_snprintf(str, len, "0x%p", trust);
}

static void
log_rv(CK_RV rv)
{
    const char *a = NULL;

    switch (rv) {
        CASE(CKR_OK);
        CASE(CKR_CANCEL);
        CASE(CKR_HOST_MEMORY);
        CASE(CKR_SLOT_ID_INVALID);
        CASE(CKR_GENERAL_ERROR);
        CASE(CKR_FUNCTION_FAILED);
        CASE(CKR_ARGUMENTS_BAD);
        CASE(CKR_NO_EVENT);
        CASE(CKR_NEED_TO_CREATE_THREADS);
        CASE(CKR_CANT_LOCK);
        CASE(CKR_ATTRIBUTE_READ_ONLY);
        CASE(CKR_ATTRIBUTE_SENSITIVE);
        CASE(CKR_ATTRIBUTE_TYPE_INVALID);
        CASE(CKR_ATTRIBUTE_VALUE_INVALID);
        CASE(CKR_DATA_INVALID);
        CASE(CKR_DATA_LEN_RANGE);
        CASE(CKR_DEVICE_ERROR);
        CASE(CKR_DEVICE_MEMORY);
        CASE(CKR_DEVICE_REMOVED);
        CASE(CKR_ENCRYPTED_DATA_INVALID);
        CASE(CKR_ENCRYPTED_DATA_LEN_RANGE);
        CASE(CKR_FUNCTION_CANCELED);
        CASE(CKR_FUNCTION_NOT_PARALLEL);
        CASE(CKR_FUNCTION_NOT_SUPPORTED);
        CASE(CKR_KEY_HANDLE_INVALID);
        CASE(CKR_KEY_SIZE_RANGE);
        CASE(CKR_KEY_TYPE_INCONSISTENT);
        CASE(CKR_KEY_NOT_NEEDED);
        CASE(CKR_KEY_CHANGED);
        CASE(CKR_KEY_NEEDED);
        CASE(CKR_KEY_INDIGESTIBLE);
        CASE(CKR_KEY_FUNCTION_NOT_PERMITTED);
        CASE(CKR_KEY_NOT_WRAPPABLE);
        CASE(CKR_KEY_UNEXTRACTABLE);
        CASE(CKR_MECHANISM_INVALID);
        CASE(CKR_MECHANISM_PARAM_INVALID);
        CASE(CKR_OBJECT_HANDLE_INVALID);
        CASE(CKR_OPERATION_ACTIVE);
        CASE(CKR_OPERATION_NOT_INITIALIZED);
        CASE(CKR_PIN_INCORRECT);
        CASE(CKR_PIN_INVALID);
        CASE(CKR_PIN_LEN_RANGE);
        CASE(CKR_PIN_EXPIRED);
        CASE(CKR_PIN_LOCKED);
        CASE(CKR_SESSION_CLOSED);
        CASE(CKR_SESSION_COUNT);
        CASE(CKR_SESSION_HANDLE_INVALID);
        CASE(CKR_SESSION_PARALLEL_NOT_SUPPORTED);
        CASE(CKR_SESSION_READ_ONLY);
        CASE(CKR_SESSION_EXISTS);
        CASE(CKR_SESSION_READ_ONLY_EXISTS);
        CASE(CKR_SESSION_READ_WRITE_SO_EXISTS);
        CASE(CKR_SIGNATURE_INVALID);
        CASE(CKR_SIGNATURE_LEN_RANGE);
        CASE(CKR_TEMPLATE_INCOMPLETE);
        CASE(CKR_TEMPLATE_INCONSISTENT);
        CASE(CKR_TOKEN_NOT_PRESENT);
        CASE(CKR_TOKEN_NOT_RECOGNIZED);
        CASE(CKR_TOKEN_WRITE_PROTECTED);
        CASE(CKR_UNWRAPPING_KEY_HANDLE_INVALID);
        CASE(CKR_UNWRAPPING_KEY_SIZE_RANGE);
        CASE(CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT);
        CASE(CKR_USER_ALREADY_LOGGED_IN);
        CASE(CKR_USER_NOT_LOGGED_IN);
        CASE(CKR_USER_PIN_NOT_INITIALIZED);
        CASE(CKR_USER_TYPE_INVALID);
        CASE(CKR_USER_ANOTHER_ALREADY_LOGGED_IN);
        CASE(CKR_USER_TOO_MANY_TYPES);
        CASE(CKR_WRAPPED_KEY_INVALID);
        CASE(CKR_WRAPPED_KEY_LEN_RANGE);
        CASE(CKR_WRAPPING_KEY_HANDLE_INVALID);
        CASE(CKR_WRAPPING_KEY_SIZE_RANGE);
        CASE(CKR_WRAPPING_KEY_TYPE_INCONSISTENT);
        CASE(CKR_RANDOM_SEED_NOT_SUPPORTED);
        CASE(CKR_RANDOM_NO_RNG);
        CASE(CKR_DOMAIN_PARAMS_INVALID);
        CASE(CKR_BUFFER_TOO_SMALL);
        CASE(CKR_SAVED_STATE_INVALID);
        CASE(CKR_INFORMATION_SENSITIVE);
        CASE(CKR_STATE_UNSAVEABLE);
        CASE(CKR_CRYPTOKI_NOT_INITIALIZED);
        CASE(CKR_CRYPTOKI_ALREADY_INITIALIZED);
        CASE(CKR_MUTEX_BAD);
        CASE(CKR_MUTEX_NOT_LOCKED);
        CASE(CKR_FUNCTION_REJECTED);
        CASE(CKR_KEY_PARAMS_INVALID);
        default:
            break;
    }
    if (a)
        PR_LOG(modlog, 1, ("  rv = %s\n", a));
    else
        PR_LOG(modlog, 1, ("  rv = 0x%x\n", rv));
}

static void
log_state(CK_STATE state)
{
    const char *a = NULL;

    switch (state) {
        CASE(CKS_RO_PUBLIC_SESSION);
        CASE(CKS_RO_USER_FUNCTIONS);
        CASE(CKS_RW_PUBLIC_SESSION);
        CASE(CKS_RW_USER_FUNCTIONS);
        CASE(CKS_RW_SO_FUNCTIONS);
        default:
            break;
    }
    if (a)
        PR_LOG(modlog, 1, ("  state = %s\n", a));
    else
        PR_LOG(modlog, 1, ("  state = 0x%x\n", state));
}

static void
log_handle(int level, const char *format, CK_ULONG handle)
{
    char fmtBuf[80];
    if (handle)
        PR_LOG(modlog, level, (format, handle));
    else {
        PL_strncpyz(fmtBuf, format, sizeof fmtBuf);
        PL_strcatn(fmtBuf, sizeof fmtBuf, fmt_invalid_handle);
        PR_LOG(modlog, level, (fmtBuf, handle));
    }
}

static void
print_mechanism(CK_MECHANISM_PTR m)
{

    const char *a = NULL;

    switch (m->mechanism) {
        CASE(CKM_AES_CBC);
        CASE(CKM_AES_CBC_ENCRYPT_DATA);
        CASE(CKM_AES_CBC_PAD);
        CASE(CKM_AES_CCM);
        CASE(CKM_AES_CTR);
        CASE(CKM_AES_CTS);
        CASE(CKM_AES_GCM);
        CASE(CKM_AES_ECB);
        CASE(CKM_AES_ECB_ENCRYPT_DATA);
        CASE(CKM_AES_KEY_GEN);
        CASE(CKM_AES_MAC);
        CASE(CKM_AES_MAC_GENERAL);
        CASE(CKM_CAMELLIA_CBC);
        CASE(CKM_CAMELLIA_CBC_ENCRYPT_DATA);
        CASE(CKM_CAMELLIA_CBC_PAD);
        CASE(CKM_CAMELLIA_ECB);
        CASE(CKM_CAMELLIA_ECB_ENCRYPT_DATA);
        CASE(CKM_CAMELLIA_KEY_GEN);
        CASE(CKM_CAMELLIA_MAC);
        CASE(CKM_CAMELLIA_MAC_GENERAL);
        CASE(CKM_CDMF_CBC);
        CASE(CKM_CDMF_CBC_PAD);
        CASE(CKM_CDMF_ECB);
        CASE(CKM_CDMF_KEY_GEN);
        CASE(CKM_CDMF_MAC);
        CASE(CKM_CDMF_MAC_GENERAL);
        CASE(CKM_CMS_SIG);
        CASE(CKM_CONCATENATE_BASE_AND_DATA);
        CASE(CKM_CONCATENATE_BASE_AND_KEY);
        CASE(CKM_CONCATENATE_DATA_AND_BASE);
        CASE(CKM_DES2_KEY_GEN);
        CASE(CKM_DES3_CBC);
        CASE(CKM_DES3_CBC_ENCRYPT_DATA);
        CASE(CKM_DES3_CBC_PAD);
        CASE(CKM_DES3_ECB);
        CASE(CKM_DES3_ECB_ENCRYPT_DATA);
        CASE(CKM_DES3_KEY_GEN);
        CASE(CKM_DES3_MAC);
        CASE(CKM_DES3_MAC_GENERAL);
        CASE(CKM_DES_CBC);
        CASE(CKM_DES_CBC_ENCRYPT_DATA);
        CASE(CKM_DES_CBC_PAD);
        CASE(CKM_DES_CFB64);
        CASE(CKM_DES_CFB8);
        CASE(CKM_DES_ECB);
        CASE(CKM_DES_ECB_ENCRYPT_DATA);
        CASE(CKM_DES_KEY_GEN);
        CASE(CKM_DES_MAC);
        CASE(CKM_DES_MAC_GENERAL);
        CASE(CKM_DES_OFB64);
        CASE(CKM_DES_OFB8);
        CASE(CKM_DH_PKCS_DERIVE);
        CASE(CKM_DH_PKCS_KEY_PAIR_GEN);
        CASE(CKM_DH_PKCS_PARAMETER_GEN);
        CASE(CKM_DSA);
        CASE(CKM_DSA_KEY_PAIR_GEN);
        CASE(CKM_DSA_PARAMETER_GEN);
        CASE(CKM_DSA_SHA1);
        CASE(CKM_ECDH1_COFACTOR_DERIVE);
        CASE(CKM_ECDH1_DERIVE);
        CASE(CKM_ECDSA);
        CASE(CKM_ECDSA_SHA1);
        CASE(CKM_ECMQV_DERIVE);
        CASE(CKM_EC_KEY_PAIR_GEN); /* also CASE(CKM_ECDSA_KEY_PAIR_GEN); */
        CASE(CKM_EXTRACT_KEY_FROM_KEY);
        CASE(CKM_FASTHASH);
        CASE(CKM_FORTEZZA_TIMESTAMP);
        CASE(CKM_GENERIC_SECRET_KEY_GEN);
        CASE(CKM_IDEA_CBC);
        CASE(CKM_IDEA_CBC_PAD);
        CASE(CKM_IDEA_ECB);
        CASE(CKM_IDEA_KEY_GEN);
        CASE(CKM_IDEA_MAC);
        CASE(CKM_IDEA_MAC_GENERAL);
        CASE(CKM_KEA_KEY_DERIVE);
        CASE(CKM_KEA_KEY_PAIR_GEN);
        CASE(CKM_KEY_WRAP_LYNKS);
        CASE(CKM_KEY_WRAP_SET_OAEP);
        CASE(CKM_MD2);
        CASE(CKM_MD2_HMAC);
        CASE(CKM_MD2_HMAC_GENERAL);
        CASE(CKM_MD2_KEY_DERIVATION);
        CASE(CKM_MD2_RSA_PKCS);
        CASE(CKM_MD5);
        CASE(CKM_MD5_HMAC);
        CASE(CKM_MD5_HMAC_GENERAL);
        CASE(CKM_MD5_KEY_DERIVATION);
        CASE(CKM_MD5_RSA_PKCS);
        CASE(CKM_PBA_SHA1_WITH_SHA1_HMAC);
        CASE(CKM_PBE_MD2_DES_CBC);
        CASE(CKM_PBE_MD5_DES_CBC);
        CASE(CKM_PBE_SHA1_DES2_EDE_CBC);
        CASE(CKM_PBE_SHA1_DES3_EDE_CBC);
        CASE(CKM_PBE_SHA1_RC2_128_CBC);
        CASE(CKM_PBE_SHA1_RC2_40_CBC);
        CASE(CKM_PBE_SHA1_RC4_128);
        CASE(CKM_PBE_SHA1_RC4_40);
        CASE(CKM_PKCS5_PBKD2);
        CASE(CKM_RC2_CBC);
        CASE(CKM_RC2_CBC_PAD);
        CASE(CKM_RC2_ECB);
        CASE(CKM_RC2_KEY_GEN);
        CASE(CKM_RC2_MAC);
        CASE(CKM_RC2_MAC_GENERAL);
        CASE(CKM_RC4);
        CASE(CKM_RC4_KEY_GEN);
        CASE(CKM_RC5_CBC);
        CASE(CKM_RC5_CBC_PAD);
        CASE(CKM_RC5_ECB);
        CASE(CKM_RC5_KEY_GEN);
        CASE(CKM_RC5_MAC);
        CASE(CKM_RC5_MAC_GENERAL);
        CASE(CKM_RIPEMD128);
        CASE(CKM_RIPEMD128_HMAC);
        CASE(CKM_RIPEMD128_HMAC_GENERAL);
        CASE(CKM_RIPEMD128_RSA_PKCS);
        CASE(CKM_RIPEMD160);
        CASE(CKM_RIPEMD160_HMAC);
        CASE(CKM_RIPEMD160_HMAC_GENERAL);
        CASE(CKM_RIPEMD160_RSA_PKCS);
        CASE(CKM_RSA_9796);
        CASE(CKM_RSA_PKCS);
        CASE(CKM_RSA_PKCS_KEY_PAIR_GEN);
        CASE(CKM_RSA_PKCS_OAEP);
        CASE(CKM_RSA_PKCS_PSS);
        CASE(CKM_RSA_X9_31);
        CASE(CKM_RSA_X9_31_KEY_PAIR_GEN);
        CASE(CKM_RSA_X_509);
        CASE(CKM_SHA1_KEY_DERIVATION);
        CASE(CKM_SHA1_RSA_PKCS);
        CASE(CKM_SHA1_RSA_PKCS_PSS);
        CASE(CKM_SHA1_RSA_X9_31);
        CASE(CKM_SHA224);
        CASE(CKM_SHA224_HMAC);
        CASE(CKM_SHA224_HMAC_GENERAL);
        CASE(CKM_SHA224_KEY_DERIVATION);
        CASE(CKM_SHA224_RSA_PKCS);
        CASE(CKM_SHA224_RSA_PKCS_PSS);
        CASE(CKM_SHA256);
        CASE(CKM_SHA256_HMAC);
        CASE(CKM_SHA256_HMAC_GENERAL);
        CASE(CKM_SHA256_KEY_DERIVATION);
        CASE(CKM_SHA256_RSA_PKCS);
        CASE(CKM_SHA256_RSA_PKCS_PSS);
        CASE(CKM_SHA384);
        CASE(CKM_SHA384_HMAC);
        CASE(CKM_SHA384_HMAC_GENERAL);
        CASE(CKM_SHA384_KEY_DERIVATION);
        CASE(CKM_SHA384_RSA_PKCS);
        CASE(CKM_SHA384_RSA_PKCS_PSS);
        CASE(CKM_SHA512);
        CASE(CKM_SHA512_HMAC);
        CASE(CKM_SHA512_HMAC_GENERAL);
        CASE(CKM_SHA512_KEY_DERIVATION);
        CASE(CKM_SHA512_RSA_PKCS);
        CASE(CKM_SHA512_RSA_PKCS_PSS);
        CASE(CKM_SHA_1);
        CASE(CKM_SHA_1_HMAC);
        CASE(CKM_SHA_1_HMAC_GENERAL);
        CASE(CKM_SKIPJACK_CBC64);
        CASE(CKM_SKIPJACK_CFB16);
        CASE(CKM_SKIPJACK_CFB32);
        CASE(CKM_SKIPJACK_CFB64);
        CASE(CKM_SKIPJACK_CFB8);
        CASE(CKM_SKIPJACK_ECB64);
        CASE(CKM_SKIPJACK_KEY_GEN);
        CASE(CKM_SKIPJACK_OFB64);
        CASE(CKM_SKIPJACK_PRIVATE_WRAP);
        CASE(CKM_SKIPJACK_RELAYX);
        CASE(CKM_SKIPJACK_WRAP);
        CASE(CKM_SSL3_KEY_AND_MAC_DERIVE);
        CASE(CKM_SSL3_MASTER_KEY_DERIVE);
        CASE(CKM_SSL3_MASTER_KEY_DERIVE_DH);
        CASE(CKM_SSL3_MD5_MAC);
        CASE(CKM_SSL3_PRE_MASTER_KEY_GEN);
        CASE(CKM_SSL3_SHA1_MAC);
        CASE(CKM_TLS_KEY_AND_MAC_DERIVE);
        CASE(CKM_TLS_MASTER_KEY_DERIVE);
        CASE(CKM_TLS_MASTER_KEY_DERIVE_DH);
        CASE(CKM_TLS_PRE_MASTER_KEY_GEN);
        CASE(CKM_TLS_PRF);
        CASE(CKM_TWOFISH_CBC);
        CASE(CKM_TWOFISH_KEY_GEN);
        CASE(CKM_X9_42_DH_DERIVE);
        CASE(CKM_X9_42_DH_HYBRID_DERIVE);
        CASE(CKM_X9_42_DH_KEY_PAIR_GEN);
        CASE(CKM_X9_42_DH_PARAMETER_GEN);
        CASE(CKM_X9_42_MQV_DERIVE);
        CASE(CKM_XOR_BASE_AND_DATA);
        default:
            break;
    }
    if (a)
        PR_LOG(modlog, 4, ("      mechanism = %s", a));
    else
        PR_LOG(modlog, 4, ("      mechanism = 0x%p", m->mechanism));
}

static void
get_key_type(CK_KEY_TYPE keyType, char *str, int len)
{

    const char *a = NULL;

    switch (keyType) {
        CASE(CKK_AES);
        CASE(CKK_CAMELLIA);
        CASE(CKK_CDMF);
        CASE(CKK_DES);
        CASE(CKK_DES2);
        CASE(CKK_DES3);
        CASE(CKK_DH);
        CASE(CKK_DSA);
        CASE(CKK_EC); /* also CASE(CKK_ECDSA); */
        CASE(CKK_GENERIC_SECRET);
        CASE(CKK_IDEA);
        CASE(CKK_INVALID_KEY_TYPE);
        CASE(CKK_KEA);
        CASE(CKK_RC2);
        CASE(CKK_RC4);
        CASE(CKK_RC5);
        CASE(CKK_RSA);
        CASE(CKK_SKIPJACK);
        CASE(CKK_TWOFISH);
        CASE(CKK_X9_42_DH);
        default:
            break;
    }
    if (a)
        PR_snprintf(str, len, "%s", a);
    else
        PR_snprintf(str, len, "0x%p", keyType);
}

static void
print_attr_value(CK_ATTRIBUTE_PTR attr)
{
    char atype[48];
    char valstr[49];
    int len;

    get_attr_type_str(attr->type, atype, sizeof atype);
    switch (attr->type) {
        case CKA_ALWAYS_SENSITIVE:
        case CKA_DECRYPT:
        case CKA_DERIVE:
        case CKA_ENCRYPT:
        case CKA_EXTRACTABLE:
        case CKA_LOCAL:
        case CKA_MODIFIABLE:
        case CKA_NEVER_EXTRACTABLE:
        case CKA_PRIVATE:
        case CKA_SENSITIVE:
        case CKA_SIGN:
        case CKA_SIGN_RECOVER:
        case CKA_TOKEN:
        case CKA_UNWRAP:
        case CKA_VERIFY:
        case CKA_VERIFY_RECOVER:
        case CKA_WRAP:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_BBOOL tf = *((CK_BBOOL *)attr->pValue);
                PR_LOG(modlog, 4, (fmt_s_s_d,
                                   atype, tf ? "CK_TRUE" : "CK_FALSE", attr->ulValueLen));
                break;
            }
        case CKA_CLASS:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_OBJECT_CLASS objClass = *((CK_OBJECT_CLASS *)attr->pValue);
                get_obj_class(objClass, valstr, sizeof valstr);
                PR_LOG(modlog, 4, (fmt_s_s_d,
                                   atype, valstr, attr->ulValueLen));
                break;
            }
        case CKA_TRUST_CLIENT_AUTH:
        case CKA_TRUST_CODE_SIGNING:
        case CKA_TRUST_EMAIL_PROTECTION:
        case CKA_TRUST_SERVER_AUTH:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_TRUST trust = *((CK_TRUST *)attr->pValue);
                get_trust_val(trust, valstr, sizeof valstr);
                PR_LOG(modlog, 4, (fmt_s_s_d,
                                   atype, valstr, attr->ulValueLen));
                break;
            }
        case CKA_KEY_TYPE:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_KEY_TYPE keyType = *((CK_KEY_TYPE *)attr->pValue);
                get_key_type(keyType, valstr, sizeof valstr);
                PR_LOG(modlog, 4, (fmt_s_s_d,
                                   atype, valstr, attr->ulValueLen));
                break;
            }
        case CKA_PIXEL_X:
        case CKA_PIXEL_Y:
        case CKA_RESOLUTION:
        case CKA_CHAR_ROWS:
        case CKA_CHAR_COLUMNS:
        case CKA_BITS_PER_PIXEL:
        case CKA_CERTIFICATE_CATEGORY:      /* should print as enum/string */
        case CKA_JAVA_MIDP_SECURITY_DOMAIN: /* should print as enum/string */
        case CKA_MODULUS_BITS:
        case CKA_PRIME_BITS:
        case CKA_SUBPRIME_BITS:
        case CKA_VALUE_BITS:
        case CKA_VALUE_LEN:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_ULONG valueLen = *((CK_ULONG *)attr->pValue);
                /* XXX check for the special value CK_UNAVAILABLE_INFORMATION */
                PR_LOG(modlog, 4, (fmt_s_lu, atype, (PRUint32)valueLen));
                break;
            }
        case CKA_LABEL:
        case CKA_NSS_EMAIL:
        case CKA_NSS_URL:
            if (attr->ulValueLen > 0 && attr->pValue) {
                len = PR_MIN(attr->ulValueLen + 1, sizeof valstr);
                PR_snprintf(valstr, len, "%s", attr->pValue);
                PR_LOG(modlog, 4, (fmt_s_qsq_d,
                                   atype, valstr, attr->ulValueLen));
                break;
            }
        case CKA_ISSUER:
        case CKA_SUBJECT:
            if (attr->ulValueLen > 0 && attr->pValue) {
                char *asciiName;
                SECItem derName;
                derName.type = siDERNameBuffer;
                derName.data = attr->pValue;
                derName.len = attr->ulValueLen;
                asciiName = CERT_DerNameToAscii(&derName);
                if (asciiName) {
                    PR_LOG(modlog, 4, (fmt_s_s_d,
                                       atype, asciiName, attr->ulValueLen));
                    PORT_Free(asciiName);
                    break;
                }
                /* else treat like a binary buffer */
                goto binary_buffer;
            }
        case CKA_ID:
            if (attr->ulValueLen > 0 && attr->pValue) {
                unsigned char *pV = attr->pValue;
                for (len = (int)attr->ulValueLen; len > 0; --len) {
                    unsigned int ch = *pV++;
                    if (ch >= 0x20 && ch < 0x7f)
                        continue;
                    if (!ch && len == 1) /* will ignore NUL if last character */
                        continue;
                    break;
                }
                if (!len) { /* entire string is printable */
                    len = PR_MIN(attr->ulValueLen + 1, sizeof valstr);
                    PR_snprintf(valstr, len, "%s", attr->pValue);
                    PR_LOG(modlog, 4, (fmt_s_qsq_d,
                                       atype, valstr, attr->ulValueLen));
                    break;
                }
                /* else fall through and treat like a binary buffer */
            }
        binary_buffer:
        case CKA_SERIAL_NUMBER:
        default:
            if (attr->ulValueLen > 0 && attr->pValue) {
                char *hexBuf;
                SECItem attrBuf;
                attrBuf.type = siDERNameBuffer;
                attrBuf.data = attr->pValue;
                attrBuf.len = PR_MIN(attr->ulValueLen, (sizeof valstr) / 2);

                hexBuf = CERT_Hexify(&attrBuf, PR_FALSE);
                if (hexBuf) {
                    PR_LOG(modlog, 4, (fmt_s_s_d,
                                       atype, hexBuf, attr->ulValueLen));
                    PORT_Free(hexBuf);
                    break;
                }
                /* else fall through and show only the address. :( */
            }
            PR_LOG(modlog, 4, ("    %s = [0x%p] [%d]",
                               atype, attr->pValue, attr->ulValueLen));
            break;
    }
}

static void
print_template(CK_ATTRIBUTE_PTR templ, CK_ULONG tlen)
{
    CK_ULONG i;
    for (i = 0; i < tlen; i++) {
        print_attr_value(&templ[i]);
    }
}

struct nssdbg_prof_str {
    PRUint32 time;
    PRUint32 calls;
    char *function;
};

#define NSSDBG_DEFINE(func) \
    {                       \
        0, 0, #func         \
    }

struct nssdbg_prof_str nssdbg_prof_data[] = {
#define FUNC_C_INITIALIZE 0
    NSSDBG_DEFINE(C_Initialize),
#define FUNC_C_FINALIZE 1
    NSSDBG_DEFINE(C_Finalize),
#define FUNC_C_GETINFO 2
    NSSDBG_DEFINE(C_GetInfo),
#define FUNC_C_GETFUNCITONLIST 3
    NSSDBG_DEFINE(C_GetFunctionList),
#define FUNC_C_GETSLOTLIST 4
    NSSDBG_DEFINE(C_GetSlotList),
#define FUNC_C_GETSLOTINFO 5
    NSSDBG_DEFINE(C_GetSlotInfo),
#define FUNC_C_GETTOKENINFO 6
    NSSDBG_DEFINE(C_GetTokenInfo),
#define FUNC_C_GETMECHANISMLIST 7
    NSSDBG_DEFINE(C_GetMechanismList),
#define FUNC_C_GETMECHANISMINFO 8
    NSSDBG_DEFINE(C_GetMechanismInfo),
#define FUNC_C_INITTOKEN 9
    NSSDBG_DEFINE(C_InitToken),
#define FUNC_C_INITPIN 10
    NSSDBG_DEFINE(C_InitPIN),
#define FUNC_C_SETPIN 11
    NSSDBG_DEFINE(C_SetPIN),
#define FUNC_C_OPENSESSION 12
    NSSDBG_DEFINE(C_OpenSession),
#define FUNC_C_CLOSESESSION 13
    NSSDBG_DEFINE(C_CloseSession),
#define FUNC_C_CLOSEALLSESSIONS 14
    NSSDBG_DEFINE(C_CloseAllSessions),
#define FUNC_C_GETSESSIONINFO 15
    NSSDBG_DEFINE(C_GetSessionInfo),
#define FUNC_C_GETOPERATIONSTATE 16
    NSSDBG_DEFINE(C_GetOperationState),
#define FUNC_C_SETOPERATIONSTATE 17
    NSSDBG_DEFINE(C_SetOperationState),
#define FUNC_C_LOGIN 18
    NSSDBG_DEFINE(C_Login),
#define FUNC_C_LOGOUT 19
    NSSDBG_DEFINE(C_Logout),
#define FUNC_C_CREATEOBJECT 20
    NSSDBG_DEFINE(C_CreateObject),
#define FUNC_C_COPYOBJECT 21
    NSSDBG_DEFINE(C_CopyObject),
#define FUNC_C_DESTROYOBJECT 22
    NSSDBG_DEFINE(C_DestroyObject),
#define FUNC_C_GETOBJECTSIZE 23
    NSSDBG_DEFINE(C_GetObjectSize),
#define FUNC_C_GETATTRIBUTEVALUE 24
    NSSDBG_DEFINE(C_GetAttributeValue),
#define FUNC_C_SETATTRIBUTEVALUE 25
    NSSDBG_DEFINE(C_SetAttributeValue),
#define FUNC_C_FINDOBJECTSINIT 26
    NSSDBG_DEFINE(C_FindObjectsInit),
#define FUNC_C_FINDOBJECTS 27
    NSSDBG_DEFINE(C_FindObjects),
#define FUNC_C_FINDOBJECTSFINAL 28
    NSSDBG_DEFINE(C_FindObjectsFinal),
#define FUNC_C_ENCRYPTINIT 29
    NSSDBG_DEFINE(C_EncryptInit),
#define FUNC_C_ENCRYPT 30
    NSSDBG_DEFINE(C_Encrypt),
#define FUNC_C_ENCRYPTUPDATE 31
    NSSDBG_DEFINE(C_EncryptUpdate),
#define FUNC_C_ENCRYPTFINAL 32
    NSSDBG_DEFINE(C_EncryptFinal),
#define FUNC_C_DECRYPTINIT 33
    NSSDBG_DEFINE(C_DecryptInit),
#define FUNC_C_DECRYPT 34
    NSSDBG_DEFINE(C_Decrypt),
#define FUNC_C_DECRYPTUPDATE 35
    NSSDBG_DEFINE(C_DecryptUpdate),
#define FUNC_C_DECRYPTFINAL 36
    NSSDBG_DEFINE(C_DecryptFinal),
#define FUNC_C_DIGESTINIT 37
    NSSDBG_DEFINE(C_DigestInit),
#define FUNC_C_DIGEST 38
    NSSDBG_DEFINE(C_Digest),
#define FUNC_C_DIGESTUPDATE 39
    NSSDBG_DEFINE(C_DigestUpdate),
#define FUNC_C_DIGESTKEY 40
    NSSDBG_DEFINE(C_DigestKey),
#define FUNC_C_DIGESTFINAL 41
    NSSDBG_DEFINE(C_DigestFinal),
#define FUNC_C_SIGNINIT 42
    NSSDBG_DEFINE(C_SignInit),
#define FUNC_C_SIGN 43
    NSSDBG_DEFINE(C_Sign),
#define FUNC_C_SIGNUPDATE 44
    NSSDBG_DEFINE(C_SignUpdate),
#define FUNC_C_SIGNFINAL 45
    NSSDBG_DEFINE(C_SignFinal),
#define FUNC_C_SIGNRECOVERINIT 46
    NSSDBG_DEFINE(C_SignRecoverInit),
#define FUNC_C_SIGNRECOVER 47
    NSSDBG_DEFINE(C_SignRecover),
#define FUNC_C_VERIFYINIT 48
    NSSDBG_DEFINE(C_VerifyInit),
#define FUNC_C_VERIFY 49
    NSSDBG_DEFINE(C_Verify),
#define FUNC_C_VERIFYUPDATE 50
    NSSDBG_DEFINE(C_VerifyUpdate),
#define FUNC_C_VERIFYFINAL 51
    NSSDBG_DEFINE(C_VerifyFinal),
#define FUNC_C_VERIFYRECOVERINIT 52
    NSSDBG_DEFINE(C_VerifyRecoverInit),
#define FUNC_C_VERIFYRECOVER 53
    NSSDBG_DEFINE(C_VerifyRecover),
#define FUNC_C_DIGESTENCRYPTUPDATE 54
    NSSDBG_DEFINE(C_DigestEncryptUpdate),
#define FUNC_C_DECRYPTDIGESTUPDATE 55
    NSSDBG_DEFINE(C_DecryptDigestUpdate),
#define FUNC_C_SIGNENCRYPTUPDATE 56
    NSSDBG_DEFINE(C_SignEncryptUpdate),
#define FUNC_C_DECRYPTVERIFYUPDATE 57
    NSSDBG_DEFINE(C_DecryptVerifyUpdate),
#define FUNC_C_GENERATEKEY 58
    NSSDBG_DEFINE(C_GenerateKey),
#define FUNC_C_GENERATEKEYPAIR 59
    NSSDBG_DEFINE(C_GenerateKeyPair),
#define FUNC_C_WRAPKEY 60
    NSSDBG_DEFINE(C_WrapKey),
#define FUNC_C_UNWRAPKEY 61
    NSSDBG_DEFINE(C_UnWrapKey),
#define FUNC_C_DERIVEKEY 62
    NSSDBG_DEFINE(C_DeriveKey),
#define FUNC_C_SEEDRANDOM 63
    NSSDBG_DEFINE(C_SeedRandom),
#define FUNC_C_GENERATERANDOM 64
    NSSDBG_DEFINE(C_GenerateRandom),
#define FUNC_C_GETFUNCTIONSTATUS 65
    NSSDBG_DEFINE(C_GetFunctionStatus),
#define FUNC_C_CANCELFUNCTION 66
    NSSDBG_DEFINE(C_CancelFunction),
#define FUNC_C_WAITFORSLOTEVENT 67
    NSSDBG_DEFINE(C_WaitForSlotEvent)
};

int nssdbg_prof_size = sizeof(nssdbg_prof_data) / sizeof(nssdbg_prof_data[0]);

static void
nssdbg_finish_time(PRInt32 fun_number, PRIntervalTime start)
{
    PRIntervalTime ival;
    PRIntervalTime end = PR_IntervalNow();

    ival = end - start;
    /* sigh, lie to PRAtomic add and say we are using signed values */
    PR_ATOMIC_ADD((PRInt32 *)&nssdbg_prof_data[fun_number].time, (PRInt32)ival);
}

static void
nssdbg_start_time(PRInt32 fun_number, PRIntervalTime *start)
{
    PR_ATOMIC_INCREMENT((PRInt32 *)&nssdbg_prof_data[fun_number].calls);
    *start = PR_IntervalNow();
}

#define COMMON_DEFINITIONS \
    CK_RV rv;              \
    PRIntervalTime start

CK_RV
NSSDBGC_Initialize(
    CK_VOID_PTR pInitArgs)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Initialize"));
    PR_LOG(modlog, 3, ("  pInitArgs = 0x%p", pInitArgs));
    nssdbg_start_time(FUNC_C_INITIALIZE, &start);
    rv = module_functions->C_Initialize(pInitArgs);
    nssdbg_finish_time(FUNC_C_INITIALIZE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Finalize(
    CK_VOID_PTR pReserved)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Finalize"));
    PR_LOG(modlog, 3, ("  pReserved = 0x%p", pReserved));
    nssdbg_start_time(FUNC_C_FINALIZE, &start);
    rv = module_functions->C_Finalize(pReserved);
    nssdbg_finish_time(FUNC_C_FINALIZE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetInfo(
    CK_INFO_PTR pInfo)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetInfo"));
    PR_LOG(modlog, 3, (fmt_pInfo, pInfo));
    nssdbg_start_time(FUNC_C_GETINFO, &start);
    rv = module_functions->C_GetInfo(pInfo);
    nssdbg_finish_time(FUNC_C_GETINFO, start);
    if (rv == CKR_OK) {
        PR_LOG(modlog, 4, ("  cryptoki version: %d.%d",
                           pInfo->cryptokiVersion.major,
                           pInfo->cryptokiVersion.minor));
        PR_LOG(modlog, 4, (fmt_manufacturerID, pInfo->manufacturerID));
        PR_LOG(modlog, 4, ("  library description = \"%.32s\"",
                           pInfo->libraryDescription));
        PR_LOG(modlog, 4, ("  library version: %d.%d",
                           pInfo->libraryVersion.major,
                           pInfo->libraryVersion.minor));
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetFunctionList(
    CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetFunctionList"));
    PR_LOG(modlog, 3, ("  ppFunctionList = 0x%p", ppFunctionList));
    nssdbg_start_time(FUNC_C_GETFUNCITONLIST, &start);
    rv = module_functions->C_GetFunctionList(ppFunctionList);
    nssdbg_finish_time(FUNC_C_GETFUNCITONLIST, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetSlotList(
    CK_BBOOL tokenPresent,
    CK_SLOT_ID_PTR pSlotList,
    CK_ULONG_PTR pulCount)
{
    COMMON_DEFINITIONS;

    CK_ULONG i;
    PR_LOG(modlog, 1, ("C_GetSlotList"));
    PR_LOG(modlog, 3, ("  tokenPresent = 0x%x", tokenPresent));
    PR_LOG(modlog, 3, ("  pSlotList = 0x%p", pSlotList));
    PR_LOG(modlog, 3, (fmt_pulCount, pulCount));
    nssdbg_start_time(FUNC_C_GETSLOTLIST, &start);
    rv = module_functions->C_GetSlotList(tokenPresent, pSlotList, pulCount);
    nssdbg_finish_time(FUNC_C_GETSLOTLIST, start);
    PR_LOG(modlog, 4, (fmt_spulCount, *pulCount));
    if (pSlotList) {
        for (i = 0; i < *pulCount; i++) {
            PR_LOG(modlog, 4, ("  slotID[%d] = %x", i, pSlotList[i]));
        }
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetSlotInfo(
    CK_SLOT_ID slotID,
    CK_SLOT_INFO_PTR pInfo)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetSlotInfo"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, (fmt_pInfo, pInfo));
    nssdbg_start_time(FUNC_C_GETSLOTINFO, &start);
    rv = module_functions->C_GetSlotInfo(slotID, pInfo);
    nssdbg_finish_time(FUNC_C_GETSLOTINFO, start);
    if (rv == CKR_OK) {
        PR_LOG(modlog, 4, ("  slotDescription = \"%.64s\"",
                           pInfo->slotDescription));
        PR_LOG(modlog, 4, (fmt_manufacturerID, pInfo->manufacturerID));
        PR_LOG(modlog, 4, ("  flags = %s %s %s",
                           pInfo->flags & CKF_HW_SLOT ? "CKF_HW_SLOT" : "",
                           pInfo->flags & CKF_REMOVABLE_DEVICE ? "CKF_REMOVABLE_DEVICE" : "",
                           pInfo->flags & CKF_TOKEN_PRESENT ? "CKF_TOKEN_PRESENT" : ""));
        PR_LOG(modlog, 4, (fmt_hwVersion,
                           pInfo->hardwareVersion.major,
                           pInfo->hardwareVersion.minor));
        PR_LOG(modlog, 4, (fmt_fwVersion,
                           pInfo->firmwareVersion.major,
                           pInfo->firmwareVersion.minor));
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetTokenInfo(
    CK_SLOT_ID slotID,
    CK_TOKEN_INFO_PTR pInfo)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetTokenInfo"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, (fmt_pInfo, pInfo));
    nssdbg_start_time(FUNC_C_GETTOKENINFO, &start);
    rv = module_functions->C_GetTokenInfo(slotID, pInfo);
    nssdbg_finish_time(FUNC_C_GETTOKENINFO, start);
    if (rv == CKR_OK) {
        PR_LOG(modlog, 4, ("  label = \"%.32s\"", pInfo->label));
        PR_LOG(modlog, 4, (fmt_manufacturerID, pInfo->manufacturerID));
        PR_LOG(modlog, 4, ("  model = \"%.16s\"", pInfo->model));
        PR_LOG(modlog, 4, ("  serial = \"%.16s\"", pInfo->serialNumber));
        PR_LOG(modlog, 4, ("  flags = %s %s %s %s",
                           pInfo->flags & CKF_RNG ? "CKF_RNG" : "",
                           pInfo->flags & CKF_WRITE_PROTECTED ? "CKF_WRITE_PROTECTED" : "",
                           pInfo->flags & CKF_LOGIN_REQUIRED ? "CKF_LOGIN_REQUIRED" : "",
                           pInfo->flags & CKF_USER_PIN_INITIALIZED ? "CKF_USER_PIN_INIT" : ""));
        PR_LOG(modlog, 4, ("  maxSessions = %u, Sessions = %u",
                           pInfo->ulMaxSessionCount, pInfo->ulSessionCount));
        PR_LOG(modlog, 4, ("  maxRwSessions = %u, RwSessions = %u",
                           pInfo->ulMaxRwSessionCount,
                           pInfo->ulRwSessionCount));
        /* ignore Max & Min Pin Len, Public and Private Memory */
        PR_LOG(modlog, 4, (fmt_hwVersion,
                           pInfo->hardwareVersion.major,
                           pInfo->hardwareVersion.minor));
        PR_LOG(modlog, 4, (fmt_fwVersion,
                           pInfo->firmwareVersion.major,
                           pInfo->firmwareVersion.minor));
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetMechanismList(
    CK_SLOT_ID slotID,
    CK_MECHANISM_TYPE_PTR pMechanismList,
    CK_ULONG_PTR pulCount)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetMechanismList"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, ("  pMechanismList = 0x%p", pMechanismList));
    PR_LOG(modlog, 3, (fmt_pulCount, pulCount));
    nssdbg_start_time(FUNC_C_GETMECHANISMLIST, &start);
    rv = module_functions->C_GetMechanismList(slotID,
                                              pMechanismList,
                                              pulCount);
    nssdbg_finish_time(FUNC_C_GETMECHANISMLIST, start);
    PR_LOG(modlog, 4, (fmt_spulCount, *pulCount));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetMechanismInfo(
    CK_SLOT_ID slotID,
    CK_MECHANISM_TYPE type,
    CK_MECHANISM_INFO_PTR pInfo)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetMechanismInfo"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, ("  type = 0x%x", type));
    PR_LOG(modlog, 3, (fmt_pInfo, pInfo));
    nssdbg_start_time(FUNC_C_GETMECHANISMINFO, &start);
    rv = module_functions->C_GetMechanismInfo(slotID,
                                              type,
                                              pInfo);
    nssdbg_finish_time(FUNC_C_GETMECHANISMINFO, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_InitToken(
    CK_SLOT_ID slotID,
    CK_CHAR_PTR pPin,
    CK_ULONG ulPinLen,
    CK_CHAR_PTR pLabel)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_InitToken"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, (fmt_pPin, pPin));
    PR_LOG(modlog, 3, (fmt_ulPinLen, ulPinLen));
    PR_LOG(modlog, 3, ("  pLabel = 0x%p", pLabel));
    nssdbg_start_time(FUNC_C_INITTOKEN, &start);
    rv = module_functions->C_InitToken(slotID,
                                       pPin,
                                       ulPinLen,
                                       pLabel);
    nssdbg_finish_time(FUNC_C_INITTOKEN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_InitPIN(
    CK_SESSION_HANDLE hSession,
    CK_CHAR_PTR pPin,
    CK_ULONG ulPinLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_InitPIN"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPin, pPin));
    PR_LOG(modlog, 3, (fmt_ulPinLen, ulPinLen));
    nssdbg_start_time(FUNC_C_INITPIN, &start);
    rv = module_functions->C_InitPIN(hSession,
                                     pPin,
                                     ulPinLen);
    nssdbg_finish_time(FUNC_C_INITPIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SetPIN(
    CK_SESSION_HANDLE hSession,
    CK_CHAR_PTR pOldPin,
    CK_ULONG ulOldLen,
    CK_CHAR_PTR pNewPin,
    CK_ULONG ulNewLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SetPIN"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  pOldPin = 0x%p", pOldPin));
    PR_LOG(modlog, 3, ("  ulOldLen = %d", ulOldLen));
    PR_LOG(modlog, 3, ("  pNewPin = 0x%p", pNewPin));
    PR_LOG(modlog, 3, ("  ulNewLen = %d", ulNewLen));
    nssdbg_start_time(FUNC_C_SETPIN, &start);
    rv = module_functions->C_SetPIN(hSession,
                                    pOldPin,
                                    ulOldLen,
                                    pNewPin,
                                    ulNewLen);
    nssdbg_finish_time(FUNC_C_SETPIN, start);
    log_rv(rv);
    return rv;
}

static PRUint32 numOpenSessions = 0;
static PRUint32 maxOpenSessions = 0;

CK_RV
NSSDBGC_OpenSession(
    CK_SLOT_ID slotID,
    CK_FLAGS flags,
    CK_VOID_PTR pApplication,
    CK_NOTIFY Notify,
    CK_SESSION_HANDLE_PTR phSession)
{
    COMMON_DEFINITIONS;

    PR_ATOMIC_INCREMENT((PRInt32 *)&numOpenSessions);
    maxOpenSessions = PR_MAX(numOpenSessions, maxOpenSessions);
    PR_LOG(modlog, 1, ("C_OpenSession"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    PR_LOG(modlog, 3, (fmt_flags, flags));
    PR_LOG(modlog, 3, ("  pApplication = 0x%p", pApplication));
    PR_LOG(modlog, 3, ("  Notify = 0x%x", Notify));
    PR_LOG(modlog, 3, ("  phSession = 0x%p", phSession));
    nssdbg_start_time(FUNC_C_OPENSESSION, &start);
    rv = module_functions->C_OpenSession(slotID,
                                         flags,
                                         pApplication,
                                         Notify,
                                         phSession);
    nssdbg_finish_time(FUNC_C_OPENSESSION, start);
    log_handle(4, "  *phSession = 0x%x", *phSession);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_CloseSession(
    CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;

    PR_ATOMIC_DECREMENT((PRInt32 *)&numOpenSessions);
    PR_LOG(modlog, 1, ("C_CloseSession"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_CLOSESESSION, &start);
    rv = module_functions->C_CloseSession(hSession);
    nssdbg_finish_time(FUNC_C_CLOSESESSION, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_CloseAllSessions(
    CK_SLOT_ID slotID)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_CloseAllSessions"));
    PR_LOG(modlog, 3, (fmt_slotID, slotID));
    nssdbg_start_time(FUNC_C_CLOSEALLSESSIONS, &start);
    rv = module_functions->C_CloseAllSessions(slotID);
    nssdbg_finish_time(FUNC_C_CLOSEALLSESSIONS, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetSessionInfo(
    CK_SESSION_HANDLE hSession,
    CK_SESSION_INFO_PTR pInfo)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetSessionInfo"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pInfo, pInfo));
    nssdbg_start_time(FUNC_C_GETSESSIONINFO, &start);
    rv = module_functions->C_GetSessionInfo(hSession,
                                            pInfo);
    nssdbg_finish_time(FUNC_C_GETSESSIONINFO, start);
    if (rv == CKR_OK) {
        PR_LOG(modlog, 4, (fmt_slotID, pInfo->slotID));
        log_state(pInfo->state);
        PR_LOG(modlog, 4, ("  flags = %s %s",
                           pInfo->flags & CKF_RW_SESSION ? "CKF_RW_SESSION" : "",
                           pInfo->flags & CKF_SERIAL_SESSION ? "CKF_SERIAL_SESSION" : ""));
        PR_LOG(modlog, 4, ("  deviceError = 0x%x", pInfo->ulDeviceError));
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetOperationState(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pOperationState,
    CK_ULONG_PTR pulOperationStateLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetOperationState"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pOperationState, pOperationState));
    PR_LOG(modlog, 3, ("  pulOperationStateLen = 0x%p", pulOperationStateLen));
    nssdbg_start_time(FUNC_C_GETOPERATIONSTATE, &start);
    rv = module_functions->C_GetOperationState(hSession,
                                               pOperationState,
                                               pulOperationStateLen);
    nssdbg_finish_time(FUNC_C_GETOPERATIONSTATE, start);
    PR_LOG(modlog, 4, ("  *pulOperationStateLen = 0x%x", *pulOperationStateLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SetOperationState(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pOperationState,
    CK_ULONG ulOperationStateLen,
    CK_OBJECT_HANDLE hEncryptionKey,
    CK_OBJECT_HANDLE hAuthenticationKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SetOperationState"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pOperationState, pOperationState));
    PR_LOG(modlog, 3, ("  ulOperationStateLen = %d", ulOperationStateLen));
    log_handle(3, "  hEncryptionKey = 0x%x", hEncryptionKey);
    log_handle(3, "  hAuthenticationKey = 0x%x", hAuthenticationKey);
    nssdbg_start_time(FUNC_C_SETOPERATIONSTATE, &start);
    rv = module_functions->C_SetOperationState(hSession,
                                               pOperationState,
                                               ulOperationStateLen,
                                               hEncryptionKey,
                                               hAuthenticationKey);
    nssdbg_finish_time(FUNC_C_SETOPERATIONSTATE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Login(
    CK_SESSION_HANDLE hSession,
    CK_USER_TYPE userType,
    CK_CHAR_PTR pPin,
    CK_ULONG ulPinLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Login"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  userType = 0x%x", userType));
    PR_LOG(modlog, 3, (fmt_pPin, pPin));
    PR_LOG(modlog, 3, (fmt_ulPinLen, ulPinLen));
    nssdbg_start_time(FUNC_C_LOGIN, &start);
    rv = module_functions->C_Login(hSession,
                                   userType,
                                   pPin,
                                   ulPinLen);
    nssdbg_finish_time(FUNC_C_LOGIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Logout(
    CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Logout"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_LOGOUT, &start);
    rv = module_functions->C_Logout(hSession);
    nssdbg_finish_time(FUNC_C_LOGOUT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_CreateObject(
    CK_SESSION_HANDLE hSession,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount,
    CK_OBJECT_HANDLE_PTR phObject)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_CreateObject"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    PR_LOG(modlog, 3, (fmt_phObject, phObject));
    print_template(pTemplate, ulCount);
    nssdbg_start_time(FUNC_C_CREATEOBJECT, &start);
    rv = module_functions->C_CreateObject(hSession,
                                          pTemplate,
                                          ulCount,
                                          phObject);
    nssdbg_finish_time(FUNC_C_CREATEOBJECT, start);
    log_handle(4, "  *phObject = 0x%x", *phObject);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_CopyObject(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hObject,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount,
    CK_OBJECT_HANDLE_PTR phNewObject)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_CopyObject"));
    log_handle(3, fmt_hSession, hSession);
    log_handle(3, fmt_hObject, hObject);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    PR_LOG(modlog, 3, ("  phNewObject = 0x%p", phNewObject));
    print_template(pTemplate, ulCount);
    nssdbg_start_time(FUNC_C_COPYOBJECT, &start);
    rv = module_functions->C_CopyObject(hSession,
                                        hObject,
                                        pTemplate,
                                        ulCount,
                                        phNewObject);
    nssdbg_finish_time(FUNC_C_COPYOBJECT, start);
    log_handle(4, "  *phNewObject = 0x%x", *phNewObject);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DestroyObject(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hObject)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DestroyObject"));
    log_handle(3, fmt_hSession, hSession);
    log_handle(3, fmt_hObject, hObject);
    nssdbg_start_time(FUNC_C_DESTROYOBJECT, &start);
    rv = module_functions->C_DestroyObject(hSession,
                                           hObject);
    nssdbg_finish_time(FUNC_C_DESTROYOBJECT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetObjectSize(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hObject,
    CK_ULONG_PTR pulSize)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetObjectSize"));
    log_handle(3, fmt_hSession, hSession);
    log_handle(3, fmt_hObject, hObject);
    PR_LOG(modlog, 3, ("  pulSize = 0x%p", pulSize));
    nssdbg_start_time(FUNC_C_GETOBJECTSIZE, &start);
    rv = module_functions->C_GetObjectSize(hSession,
                                           hObject,
                                           pulSize);
    nssdbg_finish_time(FUNC_C_GETOBJECTSIZE, start);
    PR_LOG(modlog, 4, ("  *pulSize = 0x%x", *pulSize));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetAttributeValue(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hObject,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetAttributeValue"));
    log_handle(3, fmt_hSession, hSession);
    log_handle(3, fmt_hObject, hObject);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    nssdbg_start_time(FUNC_C_GETATTRIBUTEVALUE, &start);
    rv = module_functions->C_GetAttributeValue(hSession,
                                               hObject,
                                               pTemplate,
                                               ulCount);
    nssdbg_finish_time(FUNC_C_GETATTRIBUTEVALUE, start);
    print_template(pTemplate, ulCount);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SetAttributeValue(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hObject,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SetAttributeValue"));
    log_handle(3, fmt_hSession, hSession);
    log_handle(3, fmt_hObject, hObject);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    print_template(pTemplate, ulCount);
    nssdbg_start_time(FUNC_C_SETATTRIBUTEVALUE, &start);
    rv = module_functions->C_SetAttributeValue(hSession,
                                               hObject,
                                               pTemplate,
                                               ulCount);
    nssdbg_finish_time(FUNC_C_SETATTRIBUTEVALUE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_FindObjectsInit(
    CK_SESSION_HANDLE hSession,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_FindObjectsInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    print_template(pTemplate, ulCount);
    nssdbg_start_time(FUNC_C_FINDOBJECTSINIT, &start);
    rv = module_functions->C_FindObjectsInit(hSession,
                                             pTemplate,
                                             ulCount);
    nssdbg_finish_time(FUNC_C_FINDOBJECTSINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_FindObjects(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE_PTR phObject,
    CK_ULONG ulMaxObjectCount,
    CK_ULONG_PTR pulObjectCount)
{
    COMMON_DEFINITIONS;
    CK_ULONG i;

    PR_LOG(modlog, 1, ("C_FindObjects"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_phObject, phObject));
    PR_LOG(modlog, 3, ("  ulMaxObjectCount = %d", ulMaxObjectCount));
    PR_LOG(modlog, 3, ("  pulObjectCount = 0x%p", pulObjectCount));
    nssdbg_start_time(FUNC_C_FINDOBJECTS, &start);
    rv = module_functions->C_FindObjects(hSession,
                                         phObject,
                                         ulMaxObjectCount,
                                         pulObjectCount);
    nssdbg_finish_time(FUNC_C_FINDOBJECTS, start);
    PR_LOG(modlog, 4, ("  *pulObjectCount = 0x%x", *pulObjectCount));
    for (i = 0; i < *pulObjectCount; i++) {
        PR_LOG(modlog, 4, ("  phObject[%d] = 0x%x%s", i, phObject[i],
                           phObject[i] ? "" : fmt_invalid_handle));
    }
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_FindObjectsFinal(
    CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_FindObjectsFinal"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_FINDOBJECTSFINAL, &start);
    rv = module_functions->C_FindObjectsFinal(hSession);
    nssdbg_finish_time(FUNC_C_FINDOBJECTSFINAL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_EncryptInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_ENCRYPTINIT, &start);
    rv = module_functions->C_EncryptInit(hSession,
                                         pMechanism,
                                         hKey);
    nssdbg_finish_time(FUNC_C_ENCRYPTINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Encrypt(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pData,
    CK_ULONG ulDataLen,
    CK_BYTE_PTR pEncryptedData,
    CK_ULONG_PTR pulEncryptedDataLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Encrypt"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_ulDataLen, ulDataLen));
    PR_LOG(modlog, 3, (fmt_pEncryptedData, pEncryptedData));
    PR_LOG(modlog, 3, ("  pulEncryptedDataLen = 0x%p", pulEncryptedDataLen));
    nssdbg_start_time(FUNC_C_ENCRYPT, &start);
    rv = module_functions->C_Encrypt(hSession,
                                     pData,
                                     ulDataLen,
                                     pEncryptedData,
                                     pulEncryptedDataLen);
    nssdbg_finish_time(FUNC_C_ENCRYPT, start);
    PR_LOG(modlog, 4, ("  *pulEncryptedDataLen = 0x%x", *pulEncryptedDataLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG_PTR pulEncryptedPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_EncryptUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_pulEncryptedPartLen, pulEncryptedPartLen));
    nssdbg_start_time(FUNC_C_ENCRYPTUPDATE, &start);
    rv = module_functions->C_EncryptUpdate(hSession,
                                           pPart,
                                           ulPartLen,
                                           pEncryptedPart,
                                           pulEncryptedPartLen);
    nssdbg_finish_time(FUNC_C_ENCRYPTUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulEncryptedPartLen, *pulEncryptedPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptFinal(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pLastEncryptedPart,
    CK_ULONG_PTR pulLastEncryptedPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_EncryptFinal"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  pLastEncryptedPart = 0x%p", pLastEncryptedPart));
    PR_LOG(modlog, 3, ("  pulLastEncryptedPartLen = 0x%p", pulLastEncryptedPartLen));
    nssdbg_start_time(FUNC_C_ENCRYPTFINAL, &start);
    rv = module_functions->C_EncryptFinal(hSession,
                                          pLastEncryptedPart,
                                          pulLastEncryptedPartLen);
    nssdbg_finish_time(FUNC_C_ENCRYPTFINAL, start);
    PR_LOG(modlog, 4, ("  *pulLastEncryptedPartLen = 0x%x", *pulLastEncryptedPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DecryptInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_DECRYPTINIT, &start);
    rv = module_functions->C_DecryptInit(hSession,
                                         pMechanism,
                                         hKey);
    nssdbg_finish_time(FUNC_C_DECRYPTINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Decrypt(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pEncryptedData,
    CK_ULONG ulEncryptedDataLen,
    CK_BYTE_PTR pData,
    CK_ULONG_PTR pulDataLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Decrypt"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pEncryptedData, pEncryptedData));
    PR_LOG(modlog, 3, ("  ulEncryptedDataLen = %d", ulEncryptedDataLen));
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_pulDataLen, pulDataLen));
    nssdbg_start_time(FUNC_C_DECRYPT, &start);
    rv = module_functions->C_Decrypt(hSession,
                                     pEncryptedData,
                                     ulEncryptedDataLen,
                                     pData,
                                     pulDataLen);
    nssdbg_finish_time(FUNC_C_DECRYPT, start);
    PR_LOG(modlog, 4, (fmt_spulDataLen, *pulDataLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG ulEncryptedPartLen,
    CK_BYTE_PTR pPart,
    CK_ULONG_PTR pulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DecryptUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_ulEncryptedPartLen, ulEncryptedPartLen));
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_pulPartLen, pulPartLen));
    nssdbg_start_time(FUNC_C_DECRYPTUPDATE, &start);
    rv = module_functions->C_DecryptUpdate(hSession,
                                           pEncryptedPart,
                                           ulEncryptedPartLen,
                                           pPart,
                                           pulPartLen);
    nssdbg_finish_time(FUNC_C_DECRYPTUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulPartLen, *pulPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptFinal(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pLastPart,
    CK_ULONG_PTR pulLastPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DecryptFinal"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  pLastPart = 0x%p", pLastPart));
    PR_LOG(modlog, 3, ("  pulLastPartLen = 0x%p", pulLastPartLen));
    nssdbg_start_time(FUNC_C_DECRYPTFINAL, &start);
    rv = module_functions->C_DecryptFinal(hSession,
                                          pLastPart,
                                          pulLastPartLen);
    nssdbg_finish_time(FUNC_C_DECRYPTFINAL, start);
    PR_LOG(modlog, 4, ("  *pulLastPartLen = 0x%x", *pulLastPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DigestInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DigestInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_DIGESTINIT, &start);
    rv = module_functions->C_DigestInit(hSession,
                                        pMechanism);
    nssdbg_finish_time(FUNC_C_DIGESTINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Digest(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pData,
    CK_ULONG ulDataLen,
    CK_BYTE_PTR pDigest,
    CK_ULONG_PTR pulDigestLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Digest"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_ulDataLen, ulDataLen));
    PR_LOG(modlog, 3, (fmt_pDigest, pDigest));
    PR_LOG(modlog, 3, (fmt_pulDigestLen, pulDigestLen));
    nssdbg_start_time(FUNC_C_DIGEST, &start);
    rv = module_functions->C_Digest(hSession,
                                    pData,
                                    ulDataLen,
                                    pDigest,
                                    pulDigestLen);
    nssdbg_finish_time(FUNC_C_DIGEST, start);
    PR_LOG(modlog, 4, (fmt_spulDigestLen, *pulDigestLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DigestUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DigestUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    nssdbg_start_time(FUNC_C_DIGESTUPDATE, &start);
    rv = module_functions->C_DigestUpdate(hSession,
                                          pPart,
                                          ulPartLen);
    nssdbg_finish_time(FUNC_C_DIGESTUPDATE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DigestKey(
    CK_SESSION_HANDLE hSession,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DigestKey"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_DIGESTKEY, &start);
    rv = module_functions->C_DigestKey(hSession,
                                       hKey);
    nssdbg_finish_time(FUNC_C_DIGESTKEY, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DigestFinal(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pDigest,
    CK_ULONG_PTR pulDigestLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DigestFinal"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pDigest, pDigest));
    PR_LOG(modlog, 3, (fmt_pulDigestLen, pulDigestLen));
    nssdbg_start_time(FUNC_C_DIGESTFINAL, &start);
    rv = module_functions->C_DigestFinal(hSession,
                                         pDigest,
                                         pulDigestLen);
    nssdbg_finish_time(FUNC_C_DIGESTFINAL, start);
    PR_LOG(modlog, 4, (fmt_spulDigestLen, *pulDigestLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_SIGNINIT, &start);
    rv = module_functions->C_SignInit(hSession,
                                      pMechanism,
                                      hKey);
    nssdbg_finish_time(FUNC_C_SIGNINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Sign(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pData,
    CK_ULONG ulDataLen,
    CK_BYTE_PTR pSignature,
    CK_ULONG_PTR pulSignatureLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Sign"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_ulDataLen, ulDataLen));
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_pulSignatureLen, pulSignatureLen));
    nssdbg_start_time(FUNC_C_SIGN, &start);
    rv = module_functions->C_Sign(hSession,
                                  pData,
                                  ulDataLen,
                                  pSignature,
                                  pulSignatureLen);
    nssdbg_finish_time(FUNC_C_SIGN, start);
    PR_LOG(modlog, 4, (fmt_spulSignatureLen, *pulSignatureLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    nssdbg_start_time(FUNC_C_SIGNUPDATE, &start);
    rv = module_functions->C_SignUpdate(hSession,
                                        pPart,
                                        ulPartLen);
    nssdbg_finish_time(FUNC_C_SIGNUPDATE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignFinal(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pSignature,
    CK_ULONG_PTR pulSignatureLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignFinal"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_pulSignatureLen, pulSignatureLen));
    nssdbg_start_time(FUNC_C_SIGNFINAL, &start);
    rv = module_functions->C_SignFinal(hSession,
                                       pSignature,
                                       pulSignatureLen);
    nssdbg_finish_time(FUNC_C_SIGNFINAL, start);
    PR_LOG(modlog, 4, (fmt_spulSignatureLen, *pulSignatureLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignRecoverInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignRecoverInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_SIGNRECOVERINIT, &start);
    rv = module_functions->C_SignRecoverInit(hSession,
                                             pMechanism,
                                             hKey);
    nssdbg_finish_time(FUNC_C_SIGNRECOVERINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignRecover(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pData,
    CK_ULONG ulDataLen,
    CK_BYTE_PTR pSignature,
    CK_ULONG_PTR pulSignatureLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignRecover"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_ulDataLen, ulDataLen));
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_pulSignatureLen, pulSignatureLen));
    nssdbg_start_time(FUNC_C_SIGNRECOVER, &start);
    rv = module_functions->C_SignRecover(hSession,
                                         pData,
                                         ulDataLen,
                                         pSignature,
                                         pulSignatureLen);
    nssdbg_finish_time(FUNC_C_SIGNRECOVER, start);
    PR_LOG(modlog, 4, (fmt_spulSignatureLen, *pulSignatureLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_VerifyInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_VERIFYINIT, &start);
    rv = module_functions->C_VerifyInit(hSession,
                                        pMechanism,
                                        hKey);
    nssdbg_finish_time(FUNC_C_VERIFYINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_Verify(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pData,
    CK_ULONG ulDataLen,
    CK_BYTE_PTR pSignature,
    CK_ULONG ulSignatureLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_Verify"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_ulDataLen, ulDataLen));
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_ulSignatureLen, ulSignatureLen));
    nssdbg_start_time(FUNC_C_VERIFY, &start);
    rv = module_functions->C_Verify(hSession,
                                    pData,
                                    ulDataLen,
                                    pSignature,
                                    ulSignatureLen);
    nssdbg_finish_time(FUNC_C_VERIFY, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_VerifyUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    nssdbg_start_time(FUNC_C_VERIFYUPDATE, &start);
    rv = module_functions->C_VerifyUpdate(hSession,
                                          pPart,
                                          ulPartLen);
    nssdbg_finish_time(FUNC_C_VERIFYUPDATE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyFinal(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pSignature,
    CK_ULONG ulSignatureLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_VerifyFinal"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_ulSignatureLen, ulSignatureLen));
    nssdbg_start_time(FUNC_C_VERIFYFINAL, &start);
    rv = module_functions->C_VerifyFinal(hSession,
                                         pSignature,
                                         ulSignatureLen);
    nssdbg_finish_time(FUNC_C_VERIFYFINAL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyRecoverInit(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_VerifyRecoverInit"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, fmt_hKey, hKey);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_VERIFYRECOVERINIT, &start);
    rv = module_functions->C_VerifyRecoverInit(hSession,
                                               pMechanism,
                                               hKey);
    nssdbg_finish_time(FUNC_C_VERIFYRECOVERINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyRecover(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pSignature,
    CK_ULONG ulSignatureLen,
    CK_BYTE_PTR pData,
    CK_ULONG_PTR pulDataLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_VerifyRecover"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pSignature, pSignature));
    PR_LOG(modlog, 3, (fmt_ulSignatureLen, ulSignatureLen));
    PR_LOG(modlog, 3, (fmt_pData, pData));
    PR_LOG(modlog, 3, (fmt_pulDataLen, pulDataLen));
    nssdbg_start_time(FUNC_C_VERIFYRECOVER, &start);
    rv = module_functions->C_VerifyRecover(hSession,
                                           pSignature,
                                           ulSignatureLen,
                                           pData,
                                           pulDataLen);
    nssdbg_finish_time(FUNC_C_VERIFYRECOVER, start);
    PR_LOG(modlog, 4, (fmt_spulDataLen, *pulDataLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DigestEncryptUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG_PTR pulEncryptedPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DigestEncryptUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_pulEncryptedPartLen, pulEncryptedPartLen));
    nssdbg_start_time(FUNC_C_DIGESTENCRYPTUPDATE, &start);
    rv = module_functions->C_DigestEncryptUpdate(hSession,
                                                 pPart,
                                                 ulPartLen,
                                                 pEncryptedPart,
                                                 pulEncryptedPartLen);
    nssdbg_finish_time(FUNC_C_DIGESTENCRYPTUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulEncryptedPartLen, *pulEncryptedPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptDigestUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG ulEncryptedPartLen,
    CK_BYTE_PTR pPart,
    CK_ULONG_PTR pulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DecryptDigestUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_ulEncryptedPartLen, ulEncryptedPartLen));
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_pulPartLen, pulPartLen));
    nssdbg_start_time(FUNC_C_DECRYPTDIGESTUPDATE, &start);
    rv = module_functions->C_DecryptDigestUpdate(hSession,
                                                 pEncryptedPart,
                                                 ulEncryptedPartLen,
                                                 pPart,
                                                 pulPartLen);
    nssdbg_finish_time(FUNC_C_DECRYPTDIGESTUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulPartLen, *pulPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignEncryptUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pPart,
    CK_ULONG ulPartLen,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG_PTR pulEncryptedPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SignEncryptUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_ulPartLen, ulPartLen));
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_pulEncryptedPartLen, pulEncryptedPartLen));
    nssdbg_start_time(FUNC_C_SIGNENCRYPTUPDATE, &start);
    rv = module_functions->C_SignEncryptUpdate(hSession,
                                               pPart,
                                               ulPartLen,
                                               pEncryptedPart,
                                               pulEncryptedPartLen);
    nssdbg_finish_time(FUNC_C_SIGNENCRYPTUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulEncryptedPartLen, *pulEncryptedPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptVerifyUpdate(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pEncryptedPart,
    CK_ULONG ulEncryptedPartLen,
    CK_BYTE_PTR pPart,
    CK_ULONG_PTR pulPartLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DecryptVerifyUpdate"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pEncryptedPart, pEncryptedPart));
    PR_LOG(modlog, 3, (fmt_ulEncryptedPartLen, ulEncryptedPartLen));
    PR_LOG(modlog, 3, (fmt_pPart, pPart));
    PR_LOG(modlog, 3, (fmt_pulPartLen, pulPartLen));
    nssdbg_start_time(FUNC_C_DECRYPTVERIFYUPDATE, &start);
    rv = module_functions->C_DecryptVerifyUpdate(hSession,
                                                 pEncryptedPart,
                                                 ulEncryptedPartLen,
                                                 pPart,
                                                 pulPartLen);
    nssdbg_finish_time(FUNC_C_DECRYPTVERIFYUPDATE, start);
    PR_LOG(modlog, 4, (fmt_spulPartLen, *pulPartLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GenerateKey(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulCount,
    CK_OBJECT_HANDLE_PTR phKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GenerateKey"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulCount, ulCount));
    PR_LOG(modlog, 3, (fmt_phKey, phKey));
    print_template(pTemplate, ulCount);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_GENERATEKEY, &start);
    rv = module_functions->C_GenerateKey(hSession,
                                         pMechanism,
                                         pTemplate,
                                         ulCount,
                                         phKey);
    nssdbg_finish_time(FUNC_C_GENERATEKEY, start);
    log_handle(4, fmt_sphKey, *phKey);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GenerateKeyPair(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_ATTRIBUTE_PTR pPublicKeyTemplate,
    CK_ULONG ulPublicKeyAttributeCount,
    CK_ATTRIBUTE_PTR pPrivateKeyTemplate,
    CK_ULONG ulPrivateKeyAttributeCount,
    CK_OBJECT_HANDLE_PTR phPublicKey,
    CK_OBJECT_HANDLE_PTR phPrivateKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GenerateKeyPair"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    PR_LOG(modlog, 3, ("  pPublicKeyTemplate = 0x%p", pPublicKeyTemplate));
    PR_LOG(modlog, 3, ("  ulPublicKeyAttributeCount = %d", ulPublicKeyAttributeCount));
    PR_LOG(modlog, 3, ("  pPrivateKeyTemplate = 0x%p", pPrivateKeyTemplate));
    PR_LOG(modlog, 3, ("  ulPrivateKeyAttributeCount = %d", ulPrivateKeyAttributeCount));
    PR_LOG(modlog, 3, ("  phPublicKey = 0x%p", phPublicKey));
    print_template(pPublicKeyTemplate, ulPublicKeyAttributeCount);
    PR_LOG(modlog, 3, ("  phPrivateKey = 0x%p", phPrivateKey));
    print_template(pPrivateKeyTemplate, ulPrivateKeyAttributeCount);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_GENERATEKEYPAIR, &start);
    rv = module_functions->C_GenerateKeyPair(hSession,
                                             pMechanism,
                                             pPublicKeyTemplate,
                                             ulPublicKeyAttributeCount,
                                             pPrivateKeyTemplate,
                                             ulPrivateKeyAttributeCount,
                                             phPublicKey,
                                             phPrivateKey);
    nssdbg_finish_time(FUNC_C_GENERATEKEYPAIR, start);
    log_handle(4, "  *phPublicKey = 0x%x", *phPublicKey);
    log_handle(4, "  *phPrivateKey = 0x%x", *phPrivateKey);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_WrapKey(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hWrappingKey,
    CK_OBJECT_HANDLE hKey,
    CK_BYTE_PTR pWrappedKey,
    CK_ULONG_PTR pulWrappedKeyLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_WrapKey"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, "  hWrappingKey = 0x%x", hWrappingKey);
    log_handle(3, fmt_hKey, hKey);
    PR_LOG(modlog, 3, (fmt_pWrappedKey, pWrappedKey));
    PR_LOG(modlog, 3, ("  pulWrappedKeyLen = 0x%p", pulWrappedKeyLen));
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_WRAPKEY, &start);
    rv = module_functions->C_WrapKey(hSession,
                                     pMechanism,
                                     hWrappingKey,
                                     hKey,
                                     pWrappedKey,
                                     pulWrappedKeyLen);
    nssdbg_finish_time(FUNC_C_WRAPKEY, start);
    PR_LOG(modlog, 4, ("  *pulWrappedKeyLen = 0x%x", *pulWrappedKeyLen));
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_UnwrapKey(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hUnwrappingKey,
    CK_BYTE_PTR pWrappedKey,
    CK_ULONG ulWrappedKeyLen,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulAttributeCount,
    CK_OBJECT_HANDLE_PTR phKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_UnwrapKey"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, "  hUnwrappingKey = 0x%x", hUnwrappingKey);
    PR_LOG(modlog, 3, (fmt_pWrappedKey, pWrappedKey));
    PR_LOG(modlog, 3, ("  ulWrappedKeyLen = %d", ulWrappedKeyLen));
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulAttributeCount, ulAttributeCount));
    PR_LOG(modlog, 3, (fmt_phKey, phKey));
    print_template(pTemplate, ulAttributeCount);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_UNWRAPKEY, &start);
    rv = module_functions->C_UnwrapKey(hSession,
                                       pMechanism,
                                       hUnwrappingKey,
                                       pWrappedKey,
                                       ulWrappedKeyLen,
                                       pTemplate,
                                       ulAttributeCount,
                                       phKey);
    nssdbg_finish_time(FUNC_C_UNWRAPKEY, start);
    log_handle(4, fmt_sphKey, *phKey);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DeriveKey(
    CK_SESSION_HANDLE hSession,
    CK_MECHANISM_PTR pMechanism,
    CK_OBJECT_HANDLE hBaseKey,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulAttributeCount,
    CK_OBJECT_HANDLE_PTR phKey)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_DeriveKey"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pMechanism, pMechanism));
    log_handle(3, "  hBaseKey = 0x%x", hBaseKey);
    PR_LOG(modlog, 3, (fmt_pTemplate, pTemplate));
    PR_LOG(modlog, 3, (fmt_ulAttributeCount, ulAttributeCount));
    PR_LOG(modlog, 3, (fmt_phKey, phKey));
    print_template(pTemplate, ulAttributeCount);
    print_mechanism(pMechanism);
    nssdbg_start_time(FUNC_C_DERIVEKEY, &start);
    rv = module_functions->C_DeriveKey(hSession,
                                       pMechanism,
                                       hBaseKey,
                                       pTemplate,
                                       ulAttributeCount,
                                       phKey);
    nssdbg_finish_time(FUNC_C_DERIVEKEY, start);
    log_handle(4, fmt_sphKey, *phKey);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SeedRandom(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR pSeed,
    CK_ULONG ulSeedLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_SeedRandom"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  pSeed = 0x%p", pSeed));
    PR_LOG(modlog, 3, ("  ulSeedLen = %d", ulSeedLen));
    nssdbg_start_time(FUNC_C_SEEDRANDOM, &start);
    rv = module_functions->C_SeedRandom(hSession,
                                        pSeed,
                                        ulSeedLen);
    nssdbg_finish_time(FUNC_C_SEEDRANDOM, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GenerateRandom(
    CK_SESSION_HANDLE hSession,
    CK_BYTE_PTR RandomData,
    CK_ULONG ulRandomLen)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GenerateRandom"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, ("  RandomData = 0x%p", RandomData));
    PR_LOG(modlog, 3, ("  ulRandomLen = %d", ulRandomLen));
    nssdbg_start_time(FUNC_C_GENERATERANDOM, &start);
    rv = module_functions->C_GenerateRandom(hSession,
                                            RandomData,
                                            ulRandomLen);
    nssdbg_finish_time(FUNC_C_GENERATERANDOM, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetFunctionStatus(
    CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_GetFunctionStatus"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_GETFUNCTIONSTATUS, &start);
    rv = module_functions->C_GetFunctionStatus(hSession);
    nssdbg_finish_time(FUNC_C_GETFUNCTIONSTATUS, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_CancelFunction(
    CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_CancelFunction"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_CANCELFUNCTION, &start);
    rv = module_functions->C_CancelFunction(hSession);
    nssdbg_finish_time(FUNC_C_CANCELFUNCTION, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_WaitForSlotEvent(
    CK_FLAGS flags,
    CK_SLOT_ID_PTR pSlot,
    CK_VOID_PTR pRserved)
{
    COMMON_DEFINITIONS;

    PR_LOG(modlog, 1, ("C_WaitForSlotEvent"));
    PR_LOG(modlog, 3, (fmt_flags, flags));
    PR_LOG(modlog, 3, ("  pSlot = 0x%p", pSlot));
    PR_LOG(modlog, 3, ("  pRserved = 0x%p", pRserved));
    nssdbg_start_time(FUNC_C_WAITFORSLOTEVENT, &start);
    rv = module_functions->C_WaitForSlotEvent(flags,
                                              pSlot,
                                              pRserved);
    nssdbg_finish_time(FUNC_C_WAITFORSLOTEVENT, start);
    log_rv(rv);
    return rv;
}

CK_FUNCTION_LIST_PTR
nss_InsertDeviceLog(
    CK_FUNCTION_LIST_PTR devEPV)
{
    module_functions = devEPV;
    modlog = PR_NewLogModule("nss_mod_log");
    debug_functions.C_Initialize = NSSDBGC_Initialize;
    debug_functions.C_Finalize = NSSDBGC_Finalize;
    debug_functions.C_GetInfo = NSSDBGC_GetInfo;
    debug_functions.C_GetFunctionList = NSSDBGC_GetFunctionList;
    debug_functions.C_GetSlotList = NSSDBGC_GetSlotList;
    debug_functions.C_GetSlotInfo = NSSDBGC_GetSlotInfo;
    debug_functions.C_GetTokenInfo = NSSDBGC_GetTokenInfo;
    debug_functions.C_GetMechanismList = NSSDBGC_GetMechanismList;
    debug_functions.C_GetMechanismInfo = NSSDBGC_GetMechanismInfo;
    debug_functions.C_InitToken = NSSDBGC_InitToken;
    debug_functions.C_InitPIN = NSSDBGC_InitPIN;
    debug_functions.C_SetPIN = NSSDBGC_SetPIN;
    debug_functions.C_OpenSession = NSSDBGC_OpenSession;
    debug_functions.C_CloseSession = NSSDBGC_CloseSession;
    debug_functions.C_CloseAllSessions = NSSDBGC_CloseAllSessions;
    debug_functions.C_GetSessionInfo = NSSDBGC_GetSessionInfo;
    debug_functions.C_GetOperationState = NSSDBGC_GetOperationState;
    debug_functions.C_SetOperationState = NSSDBGC_SetOperationState;
    debug_functions.C_Login = NSSDBGC_Login;
    debug_functions.C_Logout = NSSDBGC_Logout;
    debug_functions.C_CreateObject = NSSDBGC_CreateObject;
    debug_functions.C_CopyObject = NSSDBGC_CopyObject;
    debug_functions.C_DestroyObject = NSSDBGC_DestroyObject;
    debug_functions.C_GetObjectSize = NSSDBGC_GetObjectSize;
    debug_functions.C_GetAttributeValue = NSSDBGC_GetAttributeValue;
    debug_functions.C_SetAttributeValue = NSSDBGC_SetAttributeValue;
    debug_functions.C_FindObjectsInit = NSSDBGC_FindObjectsInit;
    debug_functions.C_FindObjects = NSSDBGC_FindObjects;
    debug_functions.C_FindObjectsFinal = NSSDBGC_FindObjectsFinal;
    debug_functions.C_EncryptInit = NSSDBGC_EncryptInit;
    debug_functions.C_Encrypt = NSSDBGC_Encrypt;
    debug_functions.C_EncryptUpdate = NSSDBGC_EncryptUpdate;
    debug_functions.C_EncryptFinal = NSSDBGC_EncryptFinal;
    debug_functions.C_DecryptInit = NSSDBGC_DecryptInit;
    debug_functions.C_Decrypt = NSSDBGC_Decrypt;
    debug_functions.C_DecryptUpdate = NSSDBGC_DecryptUpdate;
    debug_functions.C_DecryptFinal = NSSDBGC_DecryptFinal;
    debug_functions.C_DigestInit = NSSDBGC_DigestInit;
    debug_functions.C_Digest = NSSDBGC_Digest;
    debug_functions.C_DigestUpdate = NSSDBGC_DigestUpdate;
    debug_functions.C_DigestKey = NSSDBGC_DigestKey;
    debug_functions.C_DigestFinal = NSSDBGC_DigestFinal;
    debug_functions.C_SignInit = NSSDBGC_SignInit;
    debug_functions.C_Sign = NSSDBGC_Sign;
    debug_functions.C_SignUpdate = NSSDBGC_SignUpdate;
    debug_functions.C_SignFinal = NSSDBGC_SignFinal;
    debug_functions.C_SignRecoverInit = NSSDBGC_SignRecoverInit;
    debug_functions.C_SignRecover = NSSDBGC_SignRecover;
    debug_functions.C_VerifyInit = NSSDBGC_VerifyInit;
    debug_functions.C_Verify = NSSDBGC_Verify;
    debug_functions.C_VerifyUpdate = NSSDBGC_VerifyUpdate;
    debug_functions.C_VerifyFinal = NSSDBGC_VerifyFinal;
    debug_functions.C_VerifyRecoverInit = NSSDBGC_VerifyRecoverInit;
    debug_functions.C_VerifyRecover = NSSDBGC_VerifyRecover;
    debug_functions.C_DigestEncryptUpdate = NSSDBGC_DigestEncryptUpdate;
    debug_functions.C_DecryptDigestUpdate = NSSDBGC_DecryptDigestUpdate;
    debug_functions.C_SignEncryptUpdate = NSSDBGC_SignEncryptUpdate;
    debug_functions.C_DecryptVerifyUpdate = NSSDBGC_DecryptVerifyUpdate;
    debug_functions.C_GenerateKey = NSSDBGC_GenerateKey;
    debug_functions.C_GenerateKeyPair = NSSDBGC_GenerateKeyPair;
    debug_functions.C_WrapKey = NSSDBGC_WrapKey;
    debug_functions.C_UnwrapKey = NSSDBGC_UnwrapKey;
    debug_functions.C_DeriveKey = NSSDBGC_DeriveKey;
    debug_functions.C_SeedRandom = NSSDBGC_SeedRandom;
    debug_functions.C_GenerateRandom = NSSDBGC_GenerateRandom;
    debug_functions.C_GetFunctionStatus = NSSDBGC_GetFunctionStatus;
    debug_functions.C_CancelFunction = NSSDBGC_CancelFunction;
    debug_functions.C_WaitForSlotEvent = NSSDBGC_WaitForSlotEvent;
    return &debug_functions;
}

/*
 * scale the time factor up accordingly.
 * This routine tries to keep at least 2 significant figures on output.
 *    If the time is 0, then indicate that with a 'z' for units.
 *    If the time is greater than 10 minutes, output the time in minutes.
 *    If the time is less than 10 minutes but greater than 10 seconds output 
 * the time in second.
 *    If the time is less than 10 seconds but greater than 10 milliseconds 
 * output * the time in millisecond.
 *    If the time is less than 10 milliseconds but greater than 0 ticks output 
 * the time in microsecond.
 *
 */
static PRUint32
getPrintTime(PRIntervalTime time, char **type)
{
    PRUint32 prTime;

    /* detect a programming error by outputting 'bu' to the output stream
     * rather than crashing */
    *type = "bug";
    if (time == 0) {
        *type = "z";
        return 0;
    }

    prTime = PR_IntervalToSeconds(time);

    if (prTime >= 600) {
        *type = "m";
        return prTime / 60;
    }
    if (prTime >= 10) {
        *type = "s";
        return prTime;
    }
    prTime = PR_IntervalToMilliseconds(time);
    if (prTime >= 10) {
        *type = "ms";
        return prTime;
    }
    *type = "us";
    return PR_IntervalToMicroseconds(time);
}

static void
print_final_statistics(void)
{
    int total_calls = 0;
    PRIntervalTime total_time = 0;
    PRUint32 pr_total_time;
    char *type;
    char *fname;
    FILE *outfile = NULL;
    int i;

    fname = PR_GetEnvSecure("NSS_OUTPUT_FILE");
    if (fname) {
        /* need to add an optional process id to the filename */
        outfile = fopen(fname, "w+");
    }
    if (!outfile) {
        outfile = stdout;
    }

    fprintf(outfile, "%-25s %10s %12s %12s %10s\n", "Function", "# Calls",
            "Time", "Avg.", "% Time");
    fprintf(outfile, "\n");
    for (i = 0; i < nssdbg_prof_size; i++) {
        total_calls += nssdbg_prof_data[i].calls;
        total_time += nssdbg_prof_data[i].time;
    }
    for (i = 0; i < nssdbg_prof_size; i++) {
        PRIntervalTime time = nssdbg_prof_data[i].time;
        PRUint32 usTime = PR_IntervalToMicroseconds(time);
        PRUint32 prTime = 0;
        PRUint32 calls = nssdbg_prof_data[i].calls;
        /* don't print out functions that weren't even called */
        if (calls == 0) {
            continue;
        }

        prTime = getPrintTime(time, &type);

        fprintf(outfile, "%-25s %10d %10d%2s ", nssdbg_prof_data[i].function,
                calls, prTime, type);
        /* for now always output the average in microseconds */
        fprintf(outfile, "%10.2f%2s", (float)usTime / (float)calls, "us");
        fprintf(outfile, "%10.2f%%", ((float)time / (float)total_time) * 100);
        fprintf(outfile, "\n");
    }
    fprintf(outfile, "\n");

    pr_total_time = getPrintTime(total_time, &type);

    fprintf(outfile, "%25s %10d %10d%2s\n", "Totals", total_calls,
            pr_total_time, type);
    fprintf(outfile, "\n\nMaximum number of concurrent open sessions: %d\n\n",
            maxOpenSessions);
    fflush(outfile);
    if (outfile != stdout) {
        fclose(outfile);
    }
}
