/* 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_3_0_PTR module_functions;

static CK_FUNCTION_LIST_3_0 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_pAssociatedData[] = "  pAssociatedData = 0x%p";
STRING fmt_pCiphertext[] = "  pCiphertext = 0x%p";
STRING fmt_pCiphertextPart[] = "  pCiphertextPart = 0x%p";
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_pParameter[] = "  pParameter = 0x%p";
STRING fmt_pPart[] = "  pPart = 0x%p";
STRING fmt_pPlaintext[] = "  pPlaintext = 0x%p";
STRING fmt_pPlaintextPart[] = "  pPlaintextPart = 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_pulCiphertextLen[] = "  pulCiphertextLen = 0x%p";
STRING fmt_pulCiphertextPartLen[] = "  pulCiphertextPartLen = 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_pulPlaintextLen[] = "  pulPlaintextLen = 0x%p";
STRING fmt_pulPlaintextPartLen[] = "  pulPlaintextPartLen = 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_ulCiphertextLen[] = "  ulCiphertextLen = %d";
STRING fmt_ulCiphertextPartLen[] = "  ulCiphertextPartLen = %d";
STRING fmt_ulCount[] = "  ulCount = %d";
STRING fmt_ulDataLen[] = "  ulDataLen = %d";
STRING fmt_ulEncryptedPartLen[] = "  ulEncryptedPartLen = %d";
STRING fmt_ulAssociatedDataLen[] = "  ulAssociatedDataLen = 0x%p";
STRING fmt_ulParameterLen[] = "  ulParameterLen = 0x%p";
STRING fmt_ulPartLen[] = "  ulPartLen = %d";
STRING fmt_ulPlaintextLen[] = "  ulPlaintextLen = 0x%p";
STRING fmt_ulPlaintextPartLen[] = "  ulPlaintextPartLen = 0x%p";
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_PROFILE_ID);
        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_NSS_DB);
        CASE(CKA_NSS_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_PROFILE);
        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_profile_val(CK_PROFILE_ID profile, char *str, int len)
{

    const char *a = NULL;

    switch (profile) {
        CASE(CKP_INVALID_ID);
        CASE(CKP_BASELINE_PROVIDER);
        CASE(CKP_EXTENDED_PROVIDER);
        CASE(CKP_AUTHENTICATION_TOKEN);
        CASE(CKP_PUBLIC_CERTIFICATES_TOKEN);
        default:
            break;
    }
    if (a)
        PR_snprintf(str, len, "%s", a);
    else
        PR_snprintf(str, len, "0x%p", profile);
}

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_ACTION_PROHIBITED);
        CASE(CKR_CURVE_NOT_SUPPORTED);
        CASE(CKR_NEW_PIN_MODE);
        CASE(CKR_NEXT_OTP);
        CASE(CKR_EXCEEDED_MAX_ITERATIONS);
        CASE(CKR_FIPS_SELF_TEST_FAILED);
        CASE(CKR_LIBRARY_LOAD_FAILED);
        CASE(CKR_PIN_TOO_WEAK);
        CASE(CKR_TOKEN_RESOURCE_EXCEEDED);
        CASE(CKR_OPERATION_CANCEL_FAILED);
        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(PRLogModuleLevel 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_AES_CMAC);
        CASE(CKM_AES_CMAC_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_CHACHA20_KEY_GEN);
        CASE(CKM_CHACHA20);
        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_ECDSA_SHA224);
        CASE(CKM_ECDSA_SHA256);
        CASE(CKM_ECDSA_SHA384);
        CASE(CKM_ECDSA_SHA512);
        CASE(CKM_EC_KEY_PAIR_GEN_W_EXTRA_BITS);
        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_POLY1305_KEY_GEN);
        CASE(CKM_POLY1305);
        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);
        CASE(CKK_MD5_HMAC);
        CASE(CKK_SHA_1_HMAC);
        CASE(CKK_RIPEMD128_HMAC);
        CASE(CKK_RIPEMD160_HMAC);
        CASE(CKK_SHA256_HMAC);
        CASE(CKK_SHA384_HMAC);
        CASE(CKK_SHA512_HMAC);
        CASE(CKK_SHA224_HMAC);
        CASE(CKK_GOSTR3410);
        CASE(CKK_GOSTR3411);
        CASE(CKK_GOST28147);
        CASE(CKK_CHACHA20);
        CASE(CKK_POLY1305);
        CASE(CKK_AES_XTS);
        CASE(CKK_SHA3_224_HMAC);
        CASE(CKK_SHA3_256_HMAC);
        CASE(CKK_SHA3_384_HMAC);
        CASE(CKK_SHA3_512_HMAC);
        CASE(CKK_BLAKE2B_160_HMAC);
        CASE(CKK_BLAKE2B_256_HMAC);
        CASE(CKK_BLAKE2B_384_HMAC);
        CASE(CKK_BLAKE2B_512_HMAC);
        CASE(CKK_SALSA20);
        CASE(CKK_X2RATCHET);
        CASE(CKK_EC_EDWARDS);
        CASE(CKK_EC_MONTGOMERY);
        CASE(CKK_HKDF);
        CASE(CKK_SHA512_224_HMAC);
        CASE(CKK_SHA512_256_HMAC);
        CASE(CKK_SHA512_T_HMAC);
        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_PROFILE_ID:
            if (attr->ulValueLen > 0 && attr->pValue) {
                CK_PROFILE_ID profile = *((CK_PROFILE_ID *)attr->pValue);
                get_profile_val(profile, valstr, sizeof valstr);
                PR_LOG(modlog, 4, (fmt_s_s_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),
#define FUNC_C_GETINTERFACELIST 68
    NSSDBG_DEFINE(C_GetInterfaceList),
#define FUNC_C_GETINTERFACE 69
    NSSDBG_DEFINE(C_GetInterface),
#define FUNC_C_LOGINUSER 70
    NSSDBG_DEFINE(C_LoginUser),
#define FUNC_C_SESSIONCANCEL 71
    NSSDBG_DEFINE(C_SessionCancel),
#define FUNC_C_MESSAGEENCRYPTINIT 72
    NSSDBG_DEFINE(C_MessageEncryptInit),
#define FUNC_C_ENCRYPTMESSAGE 73
    NSSDBG_DEFINE(C_EncryptMessage),
#define FUNC_C_ENCRYPTMESSAGEBEGIN 74
    NSSDBG_DEFINE(C_EncryptMessageBegin),
#define FUNC_C_ENCRYPTMESSAGENEXT 75
    NSSDBG_DEFINE(C_EncryptMessageNext),
#define FUNC_C_MESSAGEENCRYPTFINAL 76
    NSSDBG_DEFINE(C_MessageEncryptFinal),
#define FUNC_C_MESSAGEDECRYPTINIT 77
    NSSDBG_DEFINE(C_MessageDecryptInit),
#define FUNC_C_DECRYPTMESSAGE 78
    NSSDBG_DEFINE(C_DecryptMessage),
#define FUNC_C_DECRYPTMESSAGEBEGIN 79
    NSSDBG_DEFINE(C_DecryptMessageBegin),
#define FUNC_C_DECRYPTMESSAGENEXT 80
    NSSDBG_DEFINE(C_DecryptMessageNext),
#define FUNC_C_MESSAGEDECRYPTFINAL 81
    NSSDBG_DEFINE(C_MessageDecryptFinal),
#define FUNC_C_MESSAGESIGNINIT 82
    NSSDBG_DEFINE(C_MessageSignInit),
#define FUNC_C_SIGNMESSAGE 83
    NSSDBG_DEFINE(C_SignMessage),
#define FUNC_C_SIGNMESSAGEBEGIN 84
    NSSDBG_DEFINE(C_SignMessageBegin),
#define FUNC_C_SIGNMESSAGENEXT 85
    NSSDBG_DEFINE(C_SignMessageNext),
#define FUNC_C_MESSAGESIGNFINAL 86
    NSSDBG_DEFINE(C_MessageSignFinal),
#define FUNC_C_MESSAGEVERIFYINIT 87
    NSSDBG_DEFINE(C_MessageVerifyInit),
#define FUNC_C_VERIFYMESSAGE 88
    NSSDBG_DEFINE(C_VerifyMessage),
#define FUNC_C_VERIFYMESSAGEBEGIN 89
    NSSDBG_DEFINE(C_VerifyMessageBegin),
#define FUNC_C_VERIFYMESSAGENEXT 90
    NSSDBG_DEFINE(C_VerifyMessageNext),
#define FUNC_C_MESSAGEVERIFYFINAL 91
    NSSDBG_DEFINE(C_MessageVerifyFinal)
};

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_RV
NSSDBGC_GetInterfaceList(CK_INTERFACE_PTR interfaces,
                         CK_ULONG_PTR pulCount)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_GetInterfaceList"));
    PR_LOG(modlog, 3, ("  interfaces = 0x%p", interfaces));
    PR_LOG(modlog, 3, ("  pulCount = %d", pulCount));
    nssdbg_start_time(FUNC_C_GETINTERFACELIST, &start);
    rv = module_functions->C_GetInterfaceList(interfaces,
                                              pulCount);
    nssdbg_finish_time(FUNC_C_GETINTERFACELIST, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_GetInterface(CK_UTF8CHAR_PTR pInterfaceName,
                     CK_VERSION_PTR pVersion,
                     CK_INTERFACE_PTR_PTR ppInterface,
                     CK_FLAGS flags)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_GetInterface"));
    PR_LOG(modlog, 3, ("  pInterfaceName = 0x%p", pInterfaceName));
    PR_LOG(modlog, 3, ("  pVersion = 0x%p", pVersion));
    PR_LOG(modlog, 3, ("  ppInterface = 0x%p", ppInterface));
    PR_LOG(modlog, 3, (fmt_flags, flags));
    nssdbg_start_time(FUNC_C_GETINTERFACE, &start);
    rv = module_functions->C_GetInterface(pInterfaceName,
                                          pVersion,
                                          ppInterface,
                                          flags);
    nssdbg_finish_time(FUNC_C_GETINTERFACE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_LoginUser(CK_SESSION_HANDLE hSession,
                  CK_USER_TYPE userType,
                  CK_CHAR_PTR pPin,
                  CK_ULONG ulPinLen,
                  CK_UTF8CHAR_PTR pUsername,
                  CK_ULONG ulUsernameLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_LoginUser"));
    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));
    PR_LOG(modlog, 3, ("  pUsername = 0x%p", pUsername));
    PR_LOG(modlog, 3, ("  ulUsernameLen = %d", ulUsernameLen));
    nssdbg_start_time(FUNC_C_LOGINUSER, &start);
    rv = module_functions->C_LoginUser(hSession,
                                       userType,
                                       pPin,
                                       ulPinLen,
                                       pUsername,
                                       ulUsernameLen);
    nssdbg_finish_time(FUNC_C_LOGINUSER, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SessionCancel(CK_SESSION_HANDLE hSession,
                      CK_FLAGS flags)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_SessionCancel"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_flags, flags));
    nssdbg_start_time(FUNC_C_SESSIONCANCEL, &start);
    rv = module_functions->C_SessionCancel(hSession,
                                           flags);
    nssdbg_finish_time(FUNC_C_SESSIONCANCEL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageEncryptInit(CK_SESSION_HANDLE hSession,
                           CK_MECHANISM_PTR pMechanism,
                           CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageEncryptInit"));
    log_handle(3, fmt_hSession, hSession);
    print_mechanism(pMechanism);
    log_handle(3, fmt_hKey, hKey);
    nssdbg_start_time(FUNC_C_MESSAGEENCRYPTINIT, &start);
    rv = module_functions->C_MessageEncryptInit(hSession,
                                                pMechanism,
                                                hKey);
    nssdbg_finish_time(FUNC_C_MESSAGEENCRYPTINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptMessage(CK_SESSION_HANDLE hSession,
                       CK_VOID_PTR pParameter,
                       CK_ULONG ulParameterLen,
                       CK_BYTE_PTR pAssociatedData,
                       CK_ULONG ulAssociatedDataLen,
                       CK_BYTE_PTR pPlaintext,
                       CK_ULONG ulPlaintextLen,
                       CK_BYTE_PTR pCiphertext,
                       CK_ULONG_PTR pulCiphertextLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_EncryptMessage"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pAssociatedData, pAssociatedData));
    PR_LOG(modlog, 3, (fmt_ulAssociatedDataLen, ulAssociatedDataLen));
    PR_LOG(modlog, 3, (fmt_pPlaintext, pPlaintext));
    PR_LOG(modlog, 3, (fmt_ulPlaintextLen, ulPlaintextLen));
    PR_LOG(modlog, 3, (fmt_pCiphertext, pCiphertext));
    PR_LOG(modlog, 3, (fmt_pulCiphertextLen, pulCiphertextLen));
    nssdbg_start_time(FUNC_C_ENCRYPTMESSAGE, &start);
    rv = module_functions->C_EncryptMessage(hSession,
                                            pParameter,
                                            ulParameterLen,
                                            pAssociatedData,
                                            ulAssociatedDataLen,
                                            pPlaintext,
                                            ulPlaintextLen,
                                            pCiphertext,
                                            pulCiphertextLen);
    nssdbg_finish_time(FUNC_C_ENCRYPTMESSAGE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptMessageBegin(CK_SESSION_HANDLE hSession,
                            CK_VOID_PTR pParameter,
                            CK_ULONG ulParameterLen,
                            CK_BYTE_PTR pAssociatedData,
                            CK_ULONG ulAssociatedDataLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_EncryptMessageBegin"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pAssociatedData, pAssociatedData));
    PR_LOG(modlog, 3, (fmt_ulAssociatedDataLen, ulAssociatedDataLen));
    nssdbg_start_time(FUNC_C_ENCRYPTMESSAGEBEGIN, &start);
    rv = module_functions->C_EncryptMessageBegin(hSession,
                                                 pParameter,
                                                 ulParameterLen,
                                                 pAssociatedData,
                                                 ulAssociatedDataLen);
    nssdbg_finish_time(FUNC_C_ENCRYPTMESSAGEBEGIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_EncryptMessageNext(CK_SESSION_HANDLE hSession,
                           CK_VOID_PTR pParameter,
                           CK_ULONG ulParameterLen,
                           CK_BYTE_PTR pPlaintextPart,
                           CK_ULONG ulPlaintextPartLen,
                           CK_BYTE_PTR pCiphertextPart,
                           CK_ULONG_PTR pulCiphertextPartLen,
                           CK_FLAGS flags)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_EncryptMessageNext"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pPlaintextPart, pPlaintextPart));
    PR_LOG(modlog, 3, (fmt_ulPlaintextPartLen, ulPlaintextPartLen));
    PR_LOG(modlog, 3, (fmt_pCiphertextPart, pCiphertextPart));
    PR_LOG(modlog, 3, (fmt_pulCiphertextPartLen, pulCiphertextPartLen));
    nssdbg_start_time(FUNC_C_ENCRYPTMESSAGENEXT, &start);
    rv = module_functions->C_EncryptMessageNext(hSession,
                                                pParameter,
                                                ulParameterLen,
                                                pPlaintextPart,
                                                ulPlaintextPartLen,
                                                pCiphertextPart,
                                                pulCiphertextPartLen,
                                                flags);
    nssdbg_finish_time(FUNC_C_ENCRYPTMESSAGENEXT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageEncryptFinal(CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageEncryptFinal"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_MESSAGEENCRYPTFINAL, &start);
    rv = module_functions->C_MessageEncryptFinal(hSession);
    nssdbg_finish_time(FUNC_C_MESSAGEENCRYPTFINAL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageDecryptInit(CK_SESSION_HANDLE hSession,
                           CK_MECHANISM_PTR pMechanism,
                           CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageDecryptInit"));
    log_handle(3, fmt_hSession, hSession);
    print_mechanism(pMechanism);
    log_handle(3, fmt_hKey, hKey);
    nssdbg_start_time(FUNC_C_MESSAGEDECRYPTINIT, &start);
    rv = module_functions->C_MessageDecryptInit(hSession,
                                                pMechanism,
                                                hKey);
    nssdbg_finish_time(FUNC_C_MESSAGEDECRYPTINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptMessage(CK_SESSION_HANDLE hSession,
                       CK_VOID_PTR pParameter,
                       CK_ULONG ulParameterLen,
                       CK_BYTE_PTR pAssociatedData,
                       CK_ULONG ulAssociatedDataLen,
                       CK_BYTE_PTR pCiphertext,
                       CK_ULONG ulCiphertextLen,
                       CK_BYTE_PTR pPlaintext,
                       CK_ULONG_PTR pulPlaintextLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_DecryptMessage"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pAssociatedData, pAssociatedData));
    PR_LOG(modlog, 3, (fmt_ulAssociatedDataLen, ulAssociatedDataLen));
    PR_LOG(modlog, 3, (fmt_pCiphertext, pCiphertext));
    PR_LOG(modlog, 3, (fmt_ulCiphertextLen, ulCiphertextLen));
    PR_LOG(modlog, 3, (fmt_pPlaintext, pPlaintext));
    PR_LOG(modlog, 3, (fmt_pulPlaintextLen, pulPlaintextLen));
    nssdbg_start_time(FUNC_C_DECRYPTMESSAGE, &start);
    rv = module_functions->C_DecryptMessage(hSession,
                                            pParameter,
                                            ulParameterLen,
                                            pAssociatedData,
                                            ulAssociatedDataLen,
                                            pCiphertext,
                                            ulCiphertextLen,
                                            pPlaintext,
                                            pulPlaintextLen);
    nssdbg_finish_time(FUNC_C_DECRYPTMESSAGE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptMessageBegin(CK_SESSION_HANDLE hSession,
                            CK_VOID_PTR pParameter,
                            CK_ULONG ulParameterLen,
                            CK_BYTE_PTR pAssociatedData,
                            CK_ULONG ulAssociatedDataLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_DecryptMessageBegin"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pAssociatedData, pAssociatedData));
    PR_LOG(modlog, 3, (fmt_ulAssociatedDataLen, ulAssociatedDataLen));
    nssdbg_start_time(FUNC_C_DECRYPTMESSAGEBEGIN, &start);
    rv = module_functions->C_DecryptMessageBegin(hSession,
                                                 pParameter,
                                                 ulParameterLen,
                                                 pAssociatedData,
                                                 ulAssociatedDataLen);
    nssdbg_finish_time(FUNC_C_DECRYPTMESSAGEBEGIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_DecryptMessageNext(CK_SESSION_HANDLE hSession,
                           CK_VOID_PTR pParameter,
                           CK_ULONG ulParameterLen,
                           CK_BYTE_PTR pCiphertextPart,
                           CK_ULONG ulCiphertextPartLen,
                           CK_BYTE_PTR pPlaintextPart,
                           CK_ULONG_PTR pulPlaintextPartLen,
                           CK_FLAGS flags)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_DecryptMessageNext"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    PR_LOG(modlog, 3, (fmt_pCiphertextPart, pCiphertextPart));
    PR_LOG(modlog, 3, (fmt_ulCiphertextPartLen, ulCiphertextPartLen));
    PR_LOG(modlog, 3, (fmt_pPlaintextPart, pPlaintextPart));
    PR_LOG(modlog, 3, (fmt_pulPlaintextPartLen, pulPlaintextPartLen));
    nssdbg_start_time(FUNC_C_DECRYPTMESSAGENEXT, &start);
    rv = module_functions->C_DecryptMessageNext(hSession,
                                                pParameter,
                                                ulParameterLen,
                                                pCiphertextPart,
                                                ulCiphertextPartLen,
                                                pPlaintextPart,
                                                pulPlaintextPartLen,
                                                flags);
    nssdbg_finish_time(FUNC_C_DECRYPTMESSAGENEXT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageDecryptFinal(CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageDecryptFinal"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_MESSAGEDECRYPTFINAL, &start);
    rv = module_functions->C_MessageDecryptFinal(hSession);
    nssdbg_finish_time(FUNC_C_MESSAGEDECRYPTFINAL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageSignInit(CK_SESSION_HANDLE hSession,
                        CK_MECHANISM_PTR pMechanism,
                        CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageSignInit"));
    log_handle(3, fmt_hSession, hSession);
    print_mechanism(pMechanism);
    log_handle(3, fmt_hKey, hKey);
    nssdbg_start_time(FUNC_C_MESSAGESIGNINIT, &start);
    rv = module_functions->C_MessageSignInit(hSession,
                                             pMechanism,
                                             hKey);
    nssdbg_finish_time(FUNC_C_MESSAGESIGNINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignMessage(CK_SESSION_HANDLE hSession,
                    CK_VOID_PTR pParameter,
                    CK_ULONG ulParameterLen,
                    CK_BYTE_PTR pData,
                    CK_ULONG ulDataLen,
                    CK_BYTE_PTR pSignature,
                    CK_ULONG_PTR pulSignatureLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_SignMessage"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    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_SIGNMESSAGE, &start);
    rv = module_functions->C_SignMessage(hSession,
                                         pParameter,
                                         ulParameterLen,
                                         pData,
                                         ulDataLen,
                                         pSignature,
                                         pulSignatureLen);
    nssdbg_finish_time(FUNC_C_SIGNMESSAGE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignMessageBegin(CK_SESSION_HANDLE hSession,
                         CK_VOID_PTR pParameter,
                         CK_ULONG ulParameterLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_SignMessageBegin"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    nssdbg_start_time(FUNC_C_SIGNMESSAGEBEGIN, &start);
    rv = module_functions->C_SignMessageBegin(hSession,
                                              pParameter,
                                              ulParameterLen);
    nssdbg_finish_time(FUNC_C_SIGNMESSAGEBEGIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_SignMessageNext(CK_SESSION_HANDLE hSession,
                        CK_VOID_PTR pParameter,
                        CK_ULONG ulParameterLen,
                        CK_BYTE_PTR pData,
                        CK_ULONG ulDataLen,
                        CK_BYTE_PTR pSignature,
                        CK_ULONG_PTR pulSignatureLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_SignMessageNext"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    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_SIGNMESSAGENEXT, &start);
    rv = module_functions->C_SignMessageNext(hSession,
                                             pParameter,
                                             ulParameterLen,
                                             pData,
                                             ulDataLen,
                                             pSignature,
                                             pulSignatureLen);
    nssdbg_finish_time(FUNC_C_SIGNMESSAGENEXT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageSignFinal(CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageSignFinal"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_MESSAGESIGNFINAL, &start);
    rv = module_functions->C_MessageSignFinal(hSession);
    nssdbg_finish_time(FUNC_C_MESSAGESIGNFINAL, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageVerifyInit(CK_SESSION_HANDLE hSession,
                          CK_MECHANISM_PTR pMechanism,
                          CK_OBJECT_HANDLE hKey)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageVerifyInit"));
    log_handle(3, fmt_hSession, hSession);
    print_mechanism(pMechanism);
    log_handle(3, fmt_hKey, hKey);
    nssdbg_start_time(FUNC_C_MESSAGEVERIFYINIT, &start);
    rv = module_functions->C_MessageVerifyInit(hSession,
                                               pMechanism,
                                               hKey);
    nssdbg_finish_time(FUNC_C_MESSAGEVERIFYINIT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyMessage(CK_SESSION_HANDLE hSession,
                      CK_VOID_PTR pParameter,
                      CK_ULONG ulParameterLen,
                      CK_BYTE_PTR pData,
                      CK_ULONG ulDataLen,
                      CK_BYTE_PTR pSignature,
                      CK_ULONG ulSignatureLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_VerifyMessage"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    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_VERIFYMESSAGE, &start);
    rv = module_functions->C_VerifyMessage(hSession,
                                           pParameter,
                                           ulParameterLen,
                                           pData,
                                           ulDataLen,
                                           pSignature,
                                           ulSignatureLen);
    nssdbg_finish_time(FUNC_C_VERIFYMESSAGE, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyMessageBegin(CK_SESSION_HANDLE hSession,
                           CK_VOID_PTR pParameter,
                           CK_ULONG ulParameterLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_VerifyMessageBegin"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    nssdbg_start_time(FUNC_C_VERIFYMESSAGEBEGIN, &start);
    rv = module_functions->C_VerifyMessageBegin(hSession,
                                                pParameter,
                                                ulParameterLen);
    nssdbg_finish_time(FUNC_C_VERIFYMESSAGEBEGIN, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_VerifyMessageNext(CK_SESSION_HANDLE hSession,
                          CK_VOID_PTR pParameter,
                          CK_ULONG ulParameterLen,
                          CK_BYTE_PTR pData,
                          CK_ULONG ulDataLen,
                          CK_BYTE_PTR pSignature,
                          CK_ULONG ulSignatureLen)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_VerifyMessageNext"));
    log_handle(3, fmt_hSession, hSession);
    PR_LOG(modlog, 3, (fmt_pParameter, pParameter));
    PR_LOG(modlog, 3, (fmt_ulParameterLen, ulParameterLen));
    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_VERIFYMESSAGENEXT, &start);
    rv = module_functions->C_VerifyMessageNext(hSession,
                                               pParameter,
                                               ulParameterLen,
                                               pData,
                                               ulDataLen,
                                               pSignature,
                                               ulSignatureLen);
    nssdbg_finish_time(FUNC_C_VERIFYMESSAGENEXT, start);
    log_rv(rv);
    return rv;
}

CK_RV
NSSDBGC_MessageVerifyFinal(CK_SESSION_HANDLE hSession)
{
    COMMON_DEFINITIONS;
    PR_LOG(modlog, 1, ("C_MessageVerifyFinal"));
    log_handle(3, fmt_hSession, hSession);
    nssdbg_start_time(FUNC_C_MESSAGEVERIFYFINAL, &start);
    rv = module_functions->C_MessageVerifyFinal(hSession);
    nssdbg_finish_time(FUNC_C_MESSAGEVERIFYFINAL, start);
    log_rv(rv);
    return rv;
}

CK_FUNCTION_LIST_3_0_PTR
nss_InsertDeviceLog(
    CK_FUNCTION_LIST_3_0_PTR devEPV)
{
    module_functions = devEPV;
    debug_functions.version = devEPV->version;
    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;
    debug_functions.C_GetInterfaceList = NSSDBGC_GetInterfaceList;
    debug_functions.C_GetInterface = NSSDBGC_GetInterface;
    debug_functions.C_LoginUser = NSSDBGC_LoginUser;
    debug_functions.C_SessionCancel = NSSDBGC_SessionCancel;
    debug_functions.C_MessageEncryptInit = NSSDBGC_MessageEncryptInit;
    debug_functions.C_EncryptMessage = NSSDBGC_EncryptMessage;
    debug_functions.C_EncryptMessageBegin = NSSDBGC_EncryptMessageBegin;
    debug_functions.C_EncryptMessageNext = NSSDBGC_EncryptMessageNext;
    debug_functions.C_MessageEncryptFinal = NSSDBGC_MessageEncryptFinal;
    debug_functions.C_MessageDecryptInit = NSSDBGC_MessageDecryptInit;
    debug_functions.C_DecryptMessage = NSSDBGC_DecryptMessage;
    debug_functions.C_DecryptMessageBegin = NSSDBGC_DecryptMessageBegin;
    debug_functions.C_DecryptMessageNext = NSSDBGC_DecryptMessageNext;
    debug_functions.C_MessageDecryptFinal = NSSDBGC_MessageDecryptFinal;
    debug_functions.C_MessageSignInit = NSSDBGC_MessageSignInit;
    debug_functions.C_SignMessage = NSSDBGC_SignMessage;
    debug_functions.C_SignMessageBegin = NSSDBGC_SignMessageBegin;
    debug_functions.C_SignMessageNext = NSSDBGC_SignMessageNext;
    debug_functions.C_MessageSignFinal = NSSDBGC_MessageSignFinal;
    debug_functions.C_MessageVerifyInit = NSSDBGC_MessageVerifyInit;
    debug_functions.C_VerifyMessage = NSSDBGC_VerifyMessage;
    debug_functions.C_VerifyMessageBegin = NSSDBGC_VerifyMessageBegin;
    debug_functions.C_VerifyMessageNext = NSSDBGC_VerifyMessageNext;
    debug_functions.C_MessageVerifyFinal = NSSDBGC_MessageVerifyFinal;
    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);
    }
}
