/*
 * loader.c - load platform dependent DSO containing freebl implementation.
 *
 * 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 "loader.h"
#include "prmem.h"
#include "prerror.h"
#include "prinit.h"
#include "prenv.h"
#include "blname.c"

#include "prio.h"
#include "prprf.h"
#include <stdio.h>
#include "prsystem.h"

static const char *NameOfThisSharedLib =
    SHLIB_PREFIX "softokn" SOFTOKEN_SHLIB_VERSION "." SHLIB_SUFFIX;

static PRLibrary *blLib = NULL;

#define LSB(x) ((x)&0xff)
#define MSB(x) ((x) >> 8)

static const FREEBLVector *vector;
static const char *libraryName = NULL;

#include "genload.c"

/* This function must be run only once. */
/*  determine if hybrid platform, then actually load the DSO. */
static PRStatus
freebl_LoadDSO(void)
{
    PRLibrary *handle;
    const char *name = getLibName();

    if (!name) {
        PR_SetError(PR_LOAD_LIBRARY_ERROR, 0);
        return PR_FAILURE;
    }

    handle = loader_LoadLibrary(name);
    if (handle) {
        PRFuncPtr address = PR_FindFunctionSymbol(handle, "FREEBL_GetVector");
        if (address) {
            FREEBLGetVectorFn *getVector = (FREEBLGetVectorFn *)address;
            const FREEBLVector *dsoVector = getVector();
            if (dsoVector) {
                unsigned short dsoVersion = dsoVector->version;
                unsigned short myVersion = FREEBL_VERSION;
                if (MSB(dsoVersion) == MSB(myVersion) &&
                    LSB(dsoVersion) >= LSB(myVersion) &&
                    dsoVector->length >= sizeof(FREEBLVector)) {
                    vector = dsoVector;
                    libraryName = name;
                    blLib = handle;
                    return PR_SUCCESS;
                }
            }
        }
#ifdef DEBUG
        if (blLib) {
            PRStatus status = PR_UnloadLibrary(blLib);
            PORT_Assert(PR_SUCCESS == status);
        }
#else
        if (blLib)
            PR_UnloadLibrary(blLib);
#endif
    }
    return PR_FAILURE;
}

static const PRCallOnceType pristineCallOnce;
static PRCallOnceType loadFreeBLOnce;

static PRStatus
freebl_RunLoaderOnce(void)
{
    PRStatus status;

    status = PR_CallOnce(&loadFreeBLOnce, &freebl_LoadDSO);
    return status;
}

SECStatus
BL_Init(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_BL_Init)();
}

RSAPrivateKey *
RSA_NewKey(int keySizeInBits, SECItem *publicExponent)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RSA_NewKey)(keySizeInBits, publicExponent);
}

SECStatus
RSA_PublicKeyOp(RSAPublicKey *key,
                unsigned char *output,
                const unsigned char *input)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_PublicKeyOp)(key, output, input);
}

SECStatus
RSA_PrivateKeyOp(RSAPrivateKey *key,
                 unsigned char *output,
                 const unsigned char *input)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_PrivateKeyOp)(key, output, input);
}

SECStatus
RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey *key,
                              unsigned char *output,
                              const unsigned char *input)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_PrivateKeyOpDoubleChecked)(key, output, input);
}

SECStatus
RSA_PrivateKeyCheck(const RSAPrivateKey *key)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_PrivateKeyCheck)(key);
}

SECStatus
DSA_NewKey(const PQGParams *params, DSAPrivateKey **privKey)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_NewKey)(params, privKey);
}

SECStatus
DSA_SignDigest(DSAPrivateKey *key, SECItem *signature, const SECItem *digest)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_SignDigest)(key, signature, digest);
}

SECStatus
DSA_VerifyDigest(DSAPublicKey *key, const SECItem *signature,
                 const SECItem *digest)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_VerifyDigest)(key, signature, digest);
}

SECStatus
DSA_NewKeyFromSeed(const PQGParams *params, const unsigned char *seed,
                   DSAPrivateKey **privKey)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_NewKeyFromSeed)(params, seed, privKey);
}

SECStatus
DSA_SignDigestWithSeed(DSAPrivateKey *key, SECItem *signature,
                       const SECItem *digest, const unsigned char *seed)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_SignDigestWithSeed)(key, signature, digest, seed);
}

SECStatus
DSA_NewRandom(PLArenaPool *arena, const SECItem *q, SECItem *seed)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DSA_NewRandom)(arena, q, seed);
}

SECStatus
DH_GenParam(int primeLen, DHParams **params)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DH_GenParam)(primeLen, params);
}

SECStatus
DH_NewKey(DHParams *params, DHPrivateKey **privKey)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DH_NewKey)(params, privKey);
}

SECStatus
DH_Derive(SECItem *publicValue, SECItem *prime, SECItem *privateValue,
          SECItem *derivedSecret, unsigned int maxOutBytes)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DH_Derive)(publicValue, prime, privateValue,
                                 derivedSecret, maxOutBytes);
}

SECStatus
KEA_Derive(SECItem *prime, SECItem *public1, SECItem *public2,
           SECItem *private1, SECItem *private2, SECItem *derivedSecret)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_KEA_Derive)(prime, public1, public2,
                                  private1, private2, derivedSecret);
}

PRBool
KEA_Verify(SECItem *Y, SECItem *prime, SECItem *subPrime)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return PR_FALSE;
    return (vector->p_KEA_Verify)(Y, prime, subPrime);
}

RC4Context *
RC4_CreateContext(const unsigned char *key, int len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RC4_CreateContext)(key, len);
}

void
RC4_DestroyContext(RC4Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_RC4_DestroyContext)(cx, freeit);
}

SECStatus
RC4_Encrypt(RC4Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC4_Encrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
RC4_Decrypt(RC4Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC4_Decrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

RC2Context *
RC2_CreateContext(const unsigned char *key, unsigned int len,
                  const unsigned char *iv, int mode, unsigned effectiveKeyLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RC2_CreateContext)(key, len, iv, mode, effectiveKeyLen);
}

void
RC2_DestroyContext(RC2Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_RC2_DestroyContext)(cx, freeit);
}

SECStatus
RC2_Encrypt(RC2Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC2_Encrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
RC2_Decrypt(RC2Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC2_Decrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

RC5Context *
RC5_CreateContext(const SECItem *key, unsigned int rounds,
                  unsigned int wordSize, const unsigned char *iv, int mode)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RC5_CreateContext)(key, rounds, wordSize, iv, mode);
}

void
RC5_DestroyContext(RC5Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_RC5_DestroyContext)(cx, freeit);
}

SECStatus
RC5_Encrypt(RC5Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC5_Encrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
RC5_Decrypt(RC5Context *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC5_Decrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

DESContext *
DES_CreateContext(const unsigned char *key, const unsigned char *iv,
                  int mode, PRBool encrypt)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_DES_CreateContext)(key, iv, mode, encrypt);
}

void
DES_DestroyContext(DESContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_DES_DestroyContext)(cx, freeit);
}

SECStatus
DES_Encrypt(DESContext *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DES_Encrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
DES_Decrypt(DESContext *cx, unsigned char *output, unsigned int *outputLen,
            unsigned int maxOutputLen, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DES_Decrypt)(cx, output, outputLen, maxOutputLen, input,
                                   inputLen);
}
SEEDContext *
SEED_CreateContext(const unsigned char *key, const unsigned char *iv,
                   int mode, PRBool encrypt)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SEED_CreateContext)(key, iv, mode, encrypt);
}

void
SEED_DestroyContext(SEEDContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SEED_DestroyContext)(cx, freeit);
}

SECStatus
SEED_Encrypt(SEEDContext *cx, unsigned char *output, unsigned int *outputLen,
             unsigned int maxOutputLen, const unsigned char *input,
             unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SEED_Encrypt)(cx, output, outputLen, maxOutputLen, input,
                                    inputLen);
}

SECStatus
SEED_Decrypt(SEEDContext *cx, unsigned char *output, unsigned int *outputLen,
             unsigned int maxOutputLen, const unsigned char *input,
             unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SEED_Decrypt)(cx, output, outputLen, maxOutputLen, input,
                                    inputLen);
}

AESContext *
AES_CreateContext(const unsigned char *key, const unsigned char *iv,
                  int mode, int encrypt,
                  unsigned int keylen, unsigned int blocklen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_AES_CreateContext)(key, iv, mode, encrypt, keylen,
                                         blocklen);
}

void
AES_DestroyContext(AESContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_AES_DestroyContext)(cx, freeit);
}

SECStatus
AES_Encrypt(AESContext *cx, unsigned char *output,
            unsigned int *outputLen, unsigned int maxOutputLen,
            const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_AES_Encrypt)(cx, output, outputLen, maxOutputLen,
                                   input, inputLen);
}

SECStatus
AES_Decrypt(AESContext *cx, unsigned char *output,
            unsigned int *outputLen, unsigned int maxOutputLen,
            const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_AES_Decrypt)(cx, output, outputLen, maxOutputLen,
                                   input, inputLen);
}

SECStatus
MD5_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_MD5_Hash)(dest, src);
}

SECStatus
MD5_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_MD5_HashBuf)(dest, src, src_length);
}

MD5Context *
MD5_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_MD5_NewContext)();
}

void
MD5_DestroyContext(MD5Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_DestroyContext)(cx, freeit);
}

void
MD5_Begin(MD5Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_Begin)(cx);
}

void
MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_Update)(cx, input, inputLen);
}

void
MD5_End(MD5Context *cx, unsigned char *digest,
        unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_End)(cx, digest, digestLen, maxDigestLen);
}

unsigned int
MD5_FlattenSize(MD5Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_MD5_FlattenSize)(cx);
}

SECStatus
MD5_Flatten(MD5Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_MD5_Flatten)(cx, space);
}

MD5Context *
MD5_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_MD5_Resurrect)(space, arg);
}

void
MD5_TraceState(MD5Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_TraceState)(cx);
}

SECStatus
MD2_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_MD2_Hash)(dest, src);
}

MD2Context *
MD2_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_MD2_NewContext)();
}

void
MD2_DestroyContext(MD2Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD2_DestroyContext)(cx, freeit);
}

void
MD2_Begin(MD2Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD2_Begin)(cx);
}

void
MD2_Update(MD2Context *cx, const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD2_Update)(cx, input, inputLen);
}

void
MD2_End(MD2Context *cx, unsigned char *digest,
        unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD2_End)(cx, digest, digestLen, maxDigestLen);
}

unsigned int
MD2_FlattenSize(MD2Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_MD2_FlattenSize)(cx);
}

SECStatus
MD2_Flatten(MD2Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_MD2_Flatten)(cx, space);
}

MD2Context *
MD2_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_MD2_Resurrect)(space, arg);
}

SECStatus
SHA1_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA1_Hash)(dest, src);
}

SECStatus
SHA1_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA1_HashBuf)(dest, src, src_length);
}

SHA1Context *
SHA1_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA1_NewContext)();
}

void
SHA1_DestroyContext(SHA1Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_DestroyContext)(cx, freeit);
}

void
SHA1_Begin(SHA1Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_Begin)(cx);
}

void
SHA1_Update(SHA1Context *cx, const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_Update)(cx, input, inputLen);
}

void
SHA1_End(SHA1Context *cx, unsigned char *digest,
         unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_End)(cx, digest, digestLen, maxDigestLen);
}

void
SHA1_TraceState(SHA1Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_TraceState)(cx);
}

unsigned int
SHA1_FlattenSize(SHA1Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_SHA1_FlattenSize)(cx);
}

SECStatus
SHA1_Flatten(SHA1Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA1_Flatten)(cx, space);
}

SHA1Context *
SHA1_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA1_Resurrect)(space, arg);
}

SECStatus
RNG_RNGInit(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RNG_RNGInit)();
}

SECStatus
RNG_RandomUpdate(const void *data, size_t bytes)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RNG_RandomUpdate)(data, bytes);
}

SECStatus
RNG_GenerateGlobalRandomBytes(void *dest, size_t len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RNG_GenerateGlobalRandomBytes)(dest, len);
}

void
RNG_RNGShutdown(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_RNG_RNGShutdown)();
}

SECStatus
PQG_ParamGen(unsigned int j, PQGParams **pParams, PQGVerify **pVfy)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PQG_ParamGen)(j, pParams, pVfy);
}

SECStatus
PQG_ParamGenSeedLen(unsigned int j, unsigned int seedBytes,
                    PQGParams **pParams, PQGVerify **pVfy)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PQG_ParamGenSeedLen)(j, seedBytes, pParams, pVfy);
}

SECStatus
PQG_VerifyParams(const PQGParams *params, const PQGVerify *vfy,
                 SECStatus *result)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PQG_VerifyParams)(params, vfy, result);
}

void
PQG_DestroyParams(PQGParams *params)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_PQG_DestroyParams)(params);
}

void
PQG_DestroyVerify(PQGVerify *vfy)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_PQG_DestroyVerify)(vfy);
}

void
BL_Cleanup(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_BL_Cleanup)();
}

void
BL_Unload(void)
{
    /* This function is not thread-safe, but doesn't need to be, because it is
     * only called from functions that are also defined as not thread-safe,
     * namely C_Finalize in softoken, and the SSL bypass shutdown callback called
     * from NSS_Shutdown. */
    char *disableUnload = NULL;
    vector = NULL;
    disableUnload = PR_GetEnvSecure("NSS_DISABLE_UNLOAD");
    if (blLib && !disableUnload) {
#ifdef DEBUG
        PRStatus status = PR_UnloadLibrary(blLib);
        PORT_Assert(PR_SUCCESS == status);
#else
        PR_UnloadLibrary(blLib);
#endif
    }
    blLib = NULL;
    loadFreeBLOnce = pristineCallOnce;
}

/* ============== New for 3.003 =============================== */

SECStatus
SHA256_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA256_Hash)(dest, src);
}

SECStatus
SHA256_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA256_HashBuf)(dest, src, src_length);
}

SHA256Context *
SHA256_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA256_NewContext)();
}

void
SHA256_DestroyContext(SHA256Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_DestroyContext)(cx, freeit);
}

void
SHA256_Begin(SHA256Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_Begin)(cx);
}

void
SHA256_Update(SHA256Context *cx, const unsigned char *input,
              unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_Update)(cx, input, inputLen);
}

void
SHA256_End(SHA256Context *cx, unsigned char *digest,
           unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_End)(cx, digest, digestLen, maxDigestLen);
}

void
SHA256_TraceState(SHA256Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_TraceState)(cx);
}

unsigned int
SHA256_FlattenSize(SHA256Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_SHA256_FlattenSize)(cx);
}

SECStatus
SHA256_Flatten(SHA256Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA256_Flatten)(cx, space);
}

SHA256Context *
SHA256_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA256_Resurrect)(space, arg);
}

SECStatus
SHA512_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA512_Hash)(dest, src);
}

SECStatus
SHA512_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA512_HashBuf)(dest, src, src_length);
}

SHA512Context *
SHA512_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA512_NewContext)();
}

void
SHA512_DestroyContext(SHA512Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_DestroyContext)(cx, freeit);
}

void
SHA512_Begin(SHA512Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_Begin)(cx);
}

void
SHA512_Update(SHA512Context *cx, const unsigned char *input,
              unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_Update)(cx, input, inputLen);
}

void
SHA512_End(SHA512Context *cx, unsigned char *digest,
           unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_End)(cx, digest, digestLen, maxDigestLen);
}

void
SHA512_TraceState(SHA512Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_TraceState)(cx);
}

unsigned int
SHA512_FlattenSize(SHA512Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_SHA512_FlattenSize)(cx);
}

SECStatus
SHA512_Flatten(SHA512Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA512_Flatten)(cx, space);
}

SHA512Context *
SHA512_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA512_Resurrect)(space, arg);
}

SECStatus
SHA384_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA384_Hash)(dest, src);
}

SECStatus
SHA384_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA384_HashBuf)(dest, src, src_length);
}

SHA384Context *
SHA384_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA384_NewContext)();
}

void
SHA384_DestroyContext(SHA384Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_DestroyContext)(cx, freeit);
}

void
SHA384_Begin(SHA384Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_Begin)(cx);
}

void
SHA384_Update(SHA384Context *cx, const unsigned char *input,
              unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_Update)(cx, input, inputLen);
}

void
SHA384_End(SHA384Context *cx, unsigned char *digest,
           unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_End)(cx, digest, digestLen, maxDigestLen);
}

void
SHA384_TraceState(SHA384Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_TraceState)(cx);
}

unsigned int
SHA384_FlattenSize(SHA384Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_SHA384_FlattenSize)(cx);
}

SECStatus
SHA384_Flatten(SHA384Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA384_Flatten)(cx, space);
}

SHA384Context *
SHA384_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA384_Resurrect)(space, arg);
}

AESKeyWrapContext *
AESKeyWrap_CreateContext(const unsigned char *key, const unsigned char *iv,
                         int encrypt, unsigned int keylen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return vector->p_AESKeyWrap_CreateContext(key, iv, encrypt, keylen);
}

void
AESKeyWrap_DestroyContext(AESKeyWrapContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    vector->p_AESKeyWrap_DestroyContext(cx, freeit);
}

SECStatus
AESKeyWrap_Encrypt(AESKeyWrapContext *cx, unsigned char *output,
                   unsigned int *outputLen, unsigned int maxOutputLen,
                   const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return vector->p_AESKeyWrap_Encrypt(cx, output, outputLen, maxOutputLen,
                                        input, inputLen);
}
SECStatus
AESKeyWrap_Decrypt(AESKeyWrapContext *cx, unsigned char *output,
                   unsigned int *outputLen, unsigned int maxOutputLen,
                   const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return vector->p_AESKeyWrap_Decrypt(cx, output, outputLen, maxOutputLen,
                                        input, inputLen);
}

PRBool
BLAPI_SHVerify(const char *name, PRFuncPtr addr)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return PR_FALSE;
    return vector->p_BLAPI_SHVerify(name, addr);
}

/*
 * The Caller is expected to pass NULL as the name, which will
 * trigger the p_BLAPI_VerifySelf() to return 'TRUE'. Pass the real
 * name of the shared library we loaded (the static libraryName set
 * in freebl_LoadDSO) to p_BLAPI_VerifySelf.
 */
PRBool
BLAPI_VerifySelf(const char *name)
{
    PORT_Assert(!name);
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return PR_FALSE;
    return vector->p_BLAPI_VerifySelf(libraryName);
}

/* ============== New for 3.006 =============================== */

SECStatus
EC_NewKey(ECParams *params, ECPrivateKey **privKey)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_NewKey)(params, privKey);
}

SECStatus
EC_NewKeyFromSeed(ECParams *params, ECPrivateKey **privKey,
                  const unsigned char *seed, int seedlen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_NewKeyFromSeed)(params, privKey, seed, seedlen);
}

SECStatus
EC_ValidatePublicKey(ECParams *params, SECItem *publicValue)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_ValidatePublicKey)(params, publicValue);
}

SECStatus
ECDH_Derive(SECItem *publicValue, ECParams *params, SECItem *privateValue,
            PRBool withCofactor, SECItem *derivedSecret)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ECDH_Derive)(publicValue, params, privateValue,
                                   withCofactor, derivedSecret);
}

SECStatus
ECDSA_SignDigest(ECPrivateKey *key, SECItem *signature,
                 const SECItem *digest)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ECDSA_SignDigest)(key, signature, digest);
}

SECStatus
ECDSA_VerifyDigest(ECPublicKey *key, const SECItem *signature,
                   const SECItem *digest)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ECDSA_VerifyDigest)(key, signature, digest);
}

SECStatus
ECDSA_SignDigestWithSeed(ECPrivateKey *key, SECItem *signature,
                         const SECItem *digest, const unsigned char *seed, const int seedlen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ECDSA_SignDigestWithSeed)(key, signature, digest,
                                                seed, seedlen);
}

/* ============== New for 3.008 =============================== */

AESContext *
AES_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_AES_AllocateContext)();
}

AESKeyWrapContext *
AESKeyWrap_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_AESKeyWrap_AllocateContext)();
}

DESContext *
DES_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_DES_AllocateContext)();
}

RC2Context *
RC2_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RC2_AllocateContext)();
}

RC4Context *
RC4_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_RC4_AllocateContext)();
}

SECStatus
AES_InitContext(AESContext *cx, const unsigned char *key,
                unsigned int keylen, const unsigned char *iv, int mode,
                unsigned int encrypt, unsigned int blocklen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_AES_InitContext)(cx, key, keylen, iv, mode, encrypt,
                                       blocklen);
}

SECStatus
AESKeyWrap_InitContext(AESKeyWrapContext *cx, const unsigned char *key,
                       unsigned int keylen, const unsigned char *iv, int mode,
                       unsigned int encrypt, unsigned int blocklen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_AESKeyWrap_InitContext)(cx, key, keylen, iv, mode,
                                              encrypt, blocklen);
}

SECStatus
DES_InitContext(DESContext *cx, const unsigned char *key,
                unsigned int keylen, const unsigned char *iv, int mode,
                unsigned int encrypt, unsigned int xtra)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_DES_InitContext)(cx, key, keylen, iv, mode, encrypt, xtra);
}

SECStatus
SEED_InitContext(SEEDContext *cx, const unsigned char *key,
                 unsigned int keylen, const unsigned char *iv, int mode,
                 unsigned int encrypt, unsigned int xtra)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SEED_InitContext)(cx, key, keylen, iv, mode, encrypt, xtra);
}

SECStatus
RC2_InitContext(RC2Context *cx, const unsigned char *key,
                unsigned int keylen, const unsigned char *iv, int mode,
                unsigned int effectiveKeyLen, unsigned int xtra)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC2_InitContext)(cx, key, keylen, iv, mode,
                                       effectiveKeyLen, xtra);
}

SECStatus
RC4_InitContext(RC4Context *cx, const unsigned char *key,
                unsigned int keylen, const unsigned char *x1, int x2,
                unsigned int x3, unsigned int x4)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RC4_InitContext)(cx, key, keylen, x1, x2, x3, x4);
}

void
MD2_Clone(MD2Context *dest, MD2Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD2_Clone)(dest, src);
}

void
MD5_Clone(MD5Context *dest, MD5Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_MD5_Clone)(dest, src);
}

void
SHA1_Clone(SHA1Context *dest, SHA1Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA1_Clone)(dest, src);
}

void
SHA256_Clone(SHA256Context *dest, SHA256Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA256_Clone)(dest, src);
}

void
SHA384_Clone(SHA384Context *dest, SHA384Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA384_Clone)(dest, src);
}

void
SHA512_Clone(SHA512Context *dest, SHA512Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA512_Clone)(dest, src);
}

SECStatus
TLS_PRF(const SECItem *secret, const char *label,
        SECItem *seed, SECItem *result, PRBool isFIPS)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_TLS_PRF)(secret, label, seed, result, isFIPS);
}

const SECHashObject *
HASH_GetRawHashObject(HASH_HashType hashType)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_HASH_GetRawHashObject)(hashType);
}

void
HMAC_Destroy(HMACContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_HMAC_Destroy)(cx, freeit);
}

HMACContext *
HMAC_Create(const SECHashObject *hashObj, const unsigned char *secret,
            unsigned int secret_len, PRBool isFIPS)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_HMAC_Create)(hashObj, secret, secret_len, isFIPS);
}

SECStatus
HMAC_Init(HMACContext *cx, const SECHashObject *hashObj,
          const unsigned char *secret, unsigned int secret_len, PRBool isFIPS)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_HMAC_Init)(cx, hashObj, secret, secret_len, isFIPS);
}

void
HMAC_Begin(HMACContext *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_HMAC_Begin)(cx);
}

void
HMAC_Update(HMACContext *cx, const unsigned char *data, unsigned int data_len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_HMAC_Update)(cx, data, data_len);
}

SECStatus
HMAC_Finish(HMACContext *cx, unsigned char *result, unsigned int *result_len,
            unsigned int max_result_len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_HMAC_Finish)(cx, result, result_len, max_result_len);
}

HMACContext *
HMAC_Clone(HMACContext *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_HMAC_Clone)(cx);
}

void
RNG_SystemInfoForRNG(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_RNG_SystemInfoForRNG)();
}

SECStatus
FIPS186Change_GenerateX(unsigned char *XKEY, const unsigned char *XSEEDj,
                        unsigned char *x_j)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_FIPS186Change_GenerateX)(XKEY, XSEEDj, x_j);
}

SECStatus
FIPS186Change_ReduceModQForDSA(const unsigned char *w,
                               const unsigned char *q,
                               unsigned char *xj)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_FIPS186Change_ReduceModQForDSA)(w, q, xj);
}

/* === new for Camellia === */
SECStatus
Camellia_InitContext(CamelliaContext *cx, const unsigned char *key,
                     unsigned int keylen, const unsigned char *iv, int mode,
                     unsigned int encrypt, unsigned int unused)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_Camellia_InitContext)(cx, key, keylen, iv, mode, encrypt,
                                            unused);
}

CamelliaContext *
Camellia_AllocateContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_Camellia_AllocateContext)();
}

CamelliaContext *
Camellia_CreateContext(const unsigned char *key, const unsigned char *iv,
                       int mode, int encrypt,
                       unsigned int keylen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_Camellia_CreateContext)(key, iv, mode, encrypt, keylen);
}

void
Camellia_DestroyContext(CamelliaContext *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_Camellia_DestroyContext)(cx, freeit);
}

SECStatus
Camellia_Encrypt(CamelliaContext *cx, unsigned char *output,
                 unsigned int *outputLen, unsigned int maxOutputLen,
                 const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_Camellia_Encrypt)(cx, output, outputLen, maxOutputLen,
                                        input, inputLen);
}

SECStatus
Camellia_Decrypt(CamelliaContext *cx, unsigned char *output,
                 unsigned int *outputLen, unsigned int maxOutputLen,
                 const unsigned char *input, unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_Camellia_Decrypt)(cx, output, outputLen, maxOutputLen,
                                        input, inputLen);
}

void
BL_SetForkState(PRBool forked)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_BL_SetForkState)(forked);
}

SECStatus
PRNGTEST_Instantiate(const PRUint8 *entropy, unsigned int entropy_len,
                     const PRUint8 *nonce, unsigned int nonce_len,
                     const PRUint8 *personal_string, unsigned int ps_len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PRNGTEST_Instantiate)(entropy, entropy_len,
                                            nonce, nonce_len,
                                            personal_string, ps_len);
}

SECStatus
PRNGTEST_Reseed(const PRUint8 *entropy, unsigned int entropy_len,
                const PRUint8 *additional, unsigned int additional_len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PRNGTEST_Reseed)(entropy, entropy_len,
                                       additional, additional_len);
}

SECStatus
PRNGTEST_Generate(PRUint8 *bytes, unsigned int bytes_len,
                  const PRUint8 *additional, unsigned int additional_len)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PRNGTEST_Generate)(bytes, bytes_len,
                                         additional, additional_len);
}

SECStatus
PRNGTEST_Uninstantiate()
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PRNGTEST_Uninstantiate)();
}

SECStatus
RSA_PopulatePrivateKey(RSAPrivateKey *key)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_PopulatePrivateKey)(key);
}

SECStatus
JPAKE_Sign(PLArenaPool *arena, const PQGParams *pqg, HASH_HashType hashType,
           const SECItem *signerID, const SECItem *x,
           const SECItem *testRandom, const SECItem *gxIn, SECItem *gxOut,
           SECItem *gv, SECItem *r)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_JPAKE_Sign)(arena, pqg, hashType, signerID, x,
                                  testRandom, gxIn, gxOut, gv, r);
}

SECStatus
JPAKE_Verify(PLArenaPool *arena, const PQGParams *pqg,
             HASH_HashType hashType, const SECItem *signerID,
             const SECItem *peerID, const SECItem *gx,
             const SECItem *gv, const SECItem *r)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_JPAKE_Verify)(arena, pqg, hashType, signerID, peerID,
                                    gx, gv, r);
}

SECStatus
JPAKE_Round2(PLArenaPool *arena, const SECItem *p, const SECItem *q,
             const SECItem *gx1, const SECItem *gx3, const SECItem *gx4,
             SECItem *base, const SECItem *x2, const SECItem *s, SECItem *x2s)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_JPAKE_Round2)(arena, p, q, gx1, gx3, gx4, base, x2, s, x2s);
}

SECStatus
JPAKE_Final(PLArenaPool *arena, const SECItem *p, const SECItem *q,
            const SECItem *x2, const SECItem *gx4, const SECItem *x2s,
            const SECItem *B, SECItem *K)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_JPAKE_Final)(arena, p, q, x2, gx4, x2s, B, K);
}

SECStatus
TLS_P_hash(HASH_HashType hashAlg, const SECItem *secret, const char *label,
           SECItem *seed, SECItem *result, PRBool isFIPS)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_TLS_P_hash)(hashAlg, secret, label, seed, result, isFIPS);
}

SECStatus
SHA224_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA224_Hash)(dest, src);
}

SECStatus
SHA224_HashBuf(unsigned char *dest, const unsigned char *src, PRUint32 src_length)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA224_HashBuf)(dest, src, src_length);
}

SHA224Context *
SHA224_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA224_NewContext)();
}

void
SHA224_DestroyContext(SHA224Context *cx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_DestroyContext)(cx, freeit);
}

void
SHA224_Begin(SHA256Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_Begin)(cx);
}

void
SHA224_Update(SHA224Context *cx, const unsigned char *input,
              unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_Update)(cx, input, inputLen);
}

void
SHA224_End(SHA224Context *cx, unsigned char *digest,
           unsigned int *digestLen, unsigned int maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_End)(cx, digest, digestLen, maxDigestLen);
}

void
SHA224_TraceState(SHA224Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_TraceState)(cx);
}

unsigned int
SHA224_FlattenSize(SHA224Context *cx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return 0;
    return (vector->p_SHA224_FlattenSize)(cx);
}

SECStatus
SHA224_Flatten(SHA224Context *cx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SHA224_Flatten)(cx, space);
}

SHA224Context *
SHA224_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_SHA224_Resurrect)(space, arg);
}

void
SHA224_Clone(SHA224Context *dest, SHA224Context *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_SHA224_Clone)(dest, src);
}

PRBool
BLAPI_SHVerifyFile(const char *name)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return PR_FALSE;
    return vector->p_BLAPI_SHVerifyFile(name);
}

/* === new for DSA-2 === */
SECStatus
PQG_ParamGenV2(unsigned int L, unsigned int N, unsigned int seedBytes,
               PQGParams **pParams, PQGVerify **pVfy)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_PQG_ParamGenV2)(L, N, seedBytes, pParams, pVfy);
}

SECStatus
PRNGTEST_RunHealthTests(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return vector->p_PRNGTEST_RunHealthTests();
}

SECStatus
SSLv3_MAC_ConstantTime(
    unsigned char *result,
    unsigned int *resultLen,
    unsigned int maxResultLen,
    const SECHashObject *hashObj,
    const unsigned char *secret,
    unsigned int secretLen,
    const unsigned char *header,
    unsigned int headerLen,
    const unsigned char *body,
    unsigned int bodyLen,
    unsigned int bodyTotalLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_SSLv3_MAC_ConstantTime)(
        result, resultLen, maxResultLen,
        hashObj,
        secret, secretLen,
        header, headerLen,
        body, bodyLen, bodyTotalLen);
}

SECStatus
HMAC_ConstantTime(
    unsigned char *result,
    unsigned int *resultLen,
    unsigned int maxResultLen,
    const SECHashObject *hashObj,
    const unsigned char *secret,
    unsigned int secretLen,
    const unsigned char *header,
    unsigned int headerLen,
    const unsigned char *body,
    unsigned int bodyLen,
    unsigned int bodyTotalLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_HMAC_ConstantTime)(
        result, resultLen, maxResultLen,
        hashObj,
        secret, secretLen,
        header, headerLen,
        body, bodyLen, bodyTotalLen);
}

SECStatus
RSA_SignRaw(RSAPrivateKey *key,
            unsigned char *output,
            unsigned int *outputLen,
            unsigned int maxOutputLen,
            const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_SignRaw)(key, output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
RSA_CheckSignRaw(RSAPublicKey *key,
                 const unsigned char *sig,
                 unsigned int sigLen,
                 const unsigned char *hash,
                 unsigned int hashLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_CheckSignRaw)(key, sig, sigLen, hash, hashLen);
}

SECStatus
RSA_CheckSignRecoverRaw(RSAPublicKey *key,
                        unsigned char *data,
                        unsigned int *dataLen,
                        unsigned int maxDataLen,
                        const unsigned char *sig,
                        unsigned int sigLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_CheckSignRecoverRaw)(key, data, dataLen, maxDataLen,
                                               sig, sigLen);
}

SECStatus
RSA_EncryptRaw(RSAPublicKey *key,
               unsigned char *output,
               unsigned int *outputLen,
               unsigned int maxOutputLen,
               const unsigned char *input,
               unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_EncryptRaw)(key, output, outputLen, maxOutputLen,
                                      input, inputLen);
}

SECStatus
RSA_DecryptRaw(RSAPrivateKey *key,
               unsigned char *output,
               unsigned int *outputLen,
               unsigned int maxOutputLen,
               const unsigned char *input,
               unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_DecryptRaw)(key, output, outputLen, maxOutputLen,
                                      input, inputLen);
}

SECStatus
RSA_EncryptOAEP(RSAPublicKey *key,
                HASH_HashType hashAlg,
                HASH_HashType maskHashAlg,
                const unsigned char *label,
                unsigned int labelLen,
                const unsigned char *seed,
                unsigned int seedLen,
                unsigned char *output,
                unsigned int *outputLen,
                unsigned int maxOutputLen,
                const unsigned char *input,
                unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_EncryptOAEP)(key, hashAlg, maskHashAlg, label,
                                       labelLen, seed, seedLen, output,
                                       outputLen, maxOutputLen, input, inputLen);
}

SECStatus
RSA_DecryptOAEP(RSAPrivateKey *key,
                HASH_HashType hashAlg,
                HASH_HashType maskHashAlg,
                const unsigned char *label,
                unsigned int labelLen,
                unsigned char *output,
                unsigned int *outputLen,
                unsigned int maxOutputLen,
                const unsigned char *input,
                unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_DecryptOAEP)(key, hashAlg, maskHashAlg, label,
                                       labelLen, output, outputLen,
                                       maxOutputLen, input, inputLen);
}

SECStatus
RSA_EncryptBlock(RSAPublicKey *key,
                 unsigned char *output,
                 unsigned int *outputLen,
                 unsigned int maxOutputLen,
                 const unsigned char *input,
                 unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_EncryptBlock)(key, output, outputLen, maxOutputLen,
                                        input, inputLen);
}

SECStatus
RSA_DecryptBlock(RSAPrivateKey *key,
                 unsigned char *output,
                 unsigned int *outputLen,
                 unsigned int maxOutputLen,
                 const unsigned char *input,
                 unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_DecryptBlock)(key, output, outputLen, maxOutputLen,
                                        input, inputLen);
}

SECStatus
RSA_SignPSS(RSAPrivateKey *key,
            HASH_HashType hashAlg,
            HASH_HashType maskHashAlg,
            const unsigned char *salt,
            unsigned int saltLen,
            unsigned char *output,
            unsigned int *outputLen,
            unsigned int maxOutputLen,
            const unsigned char *input,
            unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_SignPSS)(key, hashAlg, maskHashAlg, salt, saltLen,
                                   output, outputLen, maxOutputLen, input,
                                   inputLen);
}

SECStatus
RSA_CheckSignPSS(RSAPublicKey *key,
                 HASH_HashType hashAlg,
                 HASH_HashType maskHashAlg,
                 unsigned int saltLen,
                 const unsigned char *sig,
                 unsigned int sigLen,
                 const unsigned char *hash,
                 unsigned int hashLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_CheckSignPSS)(key, hashAlg, maskHashAlg, saltLen,
                                        sig, sigLen, hash, hashLen);
}

SECStatus
RSA_Sign(RSAPrivateKey *key,
         unsigned char *output,
         unsigned int *outputLen,
         unsigned int maxOutputLen,
         const unsigned char *input,
         unsigned int inputLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_Sign)(key, output, outputLen, maxOutputLen, input,
                                inputLen);
}

SECStatus
RSA_CheckSign(RSAPublicKey *key,
              const unsigned char *sig,
              unsigned int sigLen,
              const unsigned char *data,
              unsigned int dataLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_CheckSign)(key, sig, sigLen, data, dataLen);
}

SECStatus
RSA_CheckSignRecover(RSAPublicKey *key,
                     unsigned char *output,
                     unsigned int *outputLen,
                     unsigned int maxOutputLen,
                     const unsigned char *sig,
                     unsigned int sigLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_RSA_CheckSignRecover)(key, output, outputLen, maxOutputLen,
                                            sig, sigLen);
}

SECStatus
EC_FillParams(PLArenaPool *arena,
              const SECItem *encodedParams,
              ECParams *params)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_FillParams)(arena, encodedParams, params);
}

SECStatus
EC_DecodeParams(const SECItem *encodedParams,
                ECParams **ecparams)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_DecodeParams)(encodedParams, ecparams);
}

SECStatus
EC_CopyParams(PLArenaPool *arena, ECParams *dstParams,
              const ECParams *srcParams)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_CopyParams)(arena, dstParams, srcParams);
}

SECStatus
ChaCha20Poly1305_InitContext(ChaCha20Poly1305Context *ctx,
                             const unsigned char *key, unsigned int keyLen,
                             unsigned int tagLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ChaCha20Poly1305_InitContext)(ctx, key, keyLen, tagLen);
}

ChaCha20Poly1305Context *
ChaCha20Poly1305_CreateContext(const unsigned char *key, unsigned int keyLen,
                               unsigned int tagLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return NULL;
    return (vector->p_ChaCha20Poly1305_CreateContext)(key, keyLen, tagLen);
}

void
ChaCha20Poly1305_DestroyContext(ChaCha20Poly1305Context *ctx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return;
    (vector->p_ChaCha20Poly1305_DestroyContext)(ctx, freeit);
}

SECStatus
ChaCha20Poly1305_Seal(const ChaCha20Poly1305Context *ctx,
                      unsigned char *output, unsigned int *outputLen,
                      unsigned int maxOutputLen,
                      const unsigned char *input, unsigned int inputLen,
                      const unsigned char *nonce, unsigned int nonceLen,
                      const unsigned char *ad, unsigned int adLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ChaCha20Poly1305_Seal)(
        ctx, output, outputLen, maxOutputLen, input, inputLen,
        nonce, nonceLen, ad, adLen);
}

SECStatus
ChaCha20Poly1305_Open(const ChaCha20Poly1305Context *ctx,
                      unsigned char *output, unsigned int *outputLen,
                      unsigned int maxOutputLen,
                      const unsigned char *input, unsigned int inputLen,
                      const unsigned char *nonce, unsigned int nonceLen,
                      const unsigned char *ad, unsigned int adLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_ChaCha20Poly1305_Open)(
        ctx, output, outputLen, maxOutputLen, input, inputLen,
        nonce, nonceLen, ad, adLen);
}

int
EC_GetPointSize(const ECParams *params)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
        return SECFailure;
    return (vector->p_EC_GetPointSize)(params);
}

SECStatus
BLAKE2B_Hash(unsigned char *dest, const char *src)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_Hash)(dest, src);
}

SECStatus
BLAKE2B_HashBuf(unsigned char *output, const unsigned char *input, PRUint32 inlen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_HashBuf)(output, input, inlen);
}

SECStatus
BLAKE2B_MAC_HashBuf(unsigned char *output, const unsigned char *input,
                    unsigned int inlen, const unsigned char *key,
                    unsigned int keylen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_MAC_HashBuf)(output, input, inlen, key, keylen);
}

BLAKE2BContext *
BLAKE2B_NewContext(void)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return NULL;
    }
    return (vector->p_BLAKE2B_NewContext)();
}

void
BLAKE2B_DestroyContext(BLAKE2BContext *ctx, PRBool freeit)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return;
    }
    (vector->p_BLAKE2B_DestroyContext)(ctx, freeit);
}

SECStatus
BLAKE2B_Begin(BLAKE2BContext *ctx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_Begin)(ctx);
}

SECStatus
BLAKE2B_MAC_Begin(BLAKE2BContext *ctx, const PRUint8 *key, const size_t keylen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_MAC_Begin)(ctx, key, keylen);
}

SECStatus
BLAKE2B_Update(BLAKE2BContext *ctx, const unsigned char *in, unsigned int inlen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_Update)(ctx, in, inlen);
}

SECStatus
BLAKE2B_End(BLAKE2BContext *ctx, unsigned char *out,
            unsigned int *digestLen, size_t maxDigestLen)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_End)(ctx, out, digestLen, maxDigestLen);
}

unsigned int
BLAKE2B_FlattenSize(BLAKE2BContext *ctx)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return 0;
    }
    return (vector->p_BLAKE2B_FlattenSize)(ctx);
}

SECStatus
BLAKE2B_Flatten(BLAKE2BContext *ctx, unsigned char *space)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return SECFailure;
    }
    return (vector->p_BLAKE2B_Flatten)(ctx, space);
}

BLAKE2BContext *
BLAKE2B_Resurrect(unsigned char *space, void *arg)
{
    if (!vector && PR_SUCCESS != freebl_RunLoaderOnce()) {
        return NULL;
    }
    return (vector->p_BLAKE2B_Resurrect)(space, arg);
}
