Home | History | Annotate | Download | only in bodge
      1 /*
      2  * loader.c - load platform dependent DSO containing freebl implementation.
      3  *
      4  * ***** BEGIN LICENSE BLOCK *****
      5  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
      6  *
      7  * The contents of this file are subject to the Mozilla Public License Version
      8  * 1.1 (the "License"); you may not use this file except in compliance with
      9  * the License. You may obtain a copy of the License at
     10  * http://www.mozilla.org/MPL/
     11  *
     12  * Software distributed under the License is distributed on an "AS IS" basis,
     13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
     14  * for the specific language governing rights and limitations under the
     15  * License.
     16  *
     17  * The Original Code is the Netscape security libraries.
     18  *
     19  * The Initial Developer of the Original Code is
     20  * Netscape Communications Corporation.
     21  * Portions created by the Initial Developer are Copyright (C) 2000
     22  * the Initial Developer. All Rights Reserved.
     23  *
     24  * Contributor(s):
     25  *   Dr Vipul Gupta <vipul.gupta (at) sun.com>, Sun Microsystems Laboratories
     26  *
     27  * Alternatively, the contents of this file may be used under the terms of
     28  * either the GNU General Public License Version 2 or later (the "GPL"), or
     29  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
     30  * in which case the provisions of the GPL or the LGPL are applicable instead
     31  * of those above. If you wish to allow use of your version of this file only
     32  * under the terms of either the GPL or the LGPL, and not to allow others to
     33  * use your version of this file under the terms of the MPL, indicate your
     34  * decision by deleting the provisions above and replace them with the notice
     35  * and other provisions required by the GPL or the LGPL. If you do not delete
     36  * the provisions above, a recipient may use your version of this file under
     37  * the terms of any one of the MPL, the GPL or the LGPL.
     38  *
     39  * ***** END LICENSE BLOCK ***** */
     40 /* $Id: loader.c,v 1.44 2009/03/29 03:45:32 wtc%google.com Exp $ */
     41 
     42 #include "loader.h"
     43 #include "prmem.h"
     44 #include "prerror.h"
     45 #include "prinit.h"
     46 #include "prenv.h"
     47 
     48 static const char* default_name =
     49     SHLIB_PREFIX"freebl"SHLIB_VERSION"."SHLIB_SUFFIX;
     50 
     51 /* getLibName() returns the name of the library to load. */
     52 
     53 #if defined(SOLARIS) && defined(__sparc)
     54 #include <stddef.h>
     55 #include <strings.h>
     56 #include <sys/systeminfo.h>
     57 
     58 
     59 #if defined(NSS_USE_64)
     60 
     61 const static char fpu_hybrid_shared_lib[] = "libfreebl_64fpu_3.so";
     62 const static char int_hybrid_shared_lib[] = "libfreebl_64int_3.so";
     63 const static char non_hybrid_shared_lib[] = "libfreebl_64fpu_3.so";
     64 
     65 const static char int_hybrid_isa[] = "sparcv9";
     66 const static char fpu_hybrid_isa[] = "sparcv9+vis";
     67 
     68 #else
     69 
     70 const static char fpu_hybrid_shared_lib[] = "libfreebl_32fpu_3.so";
     71 const static char int_hybrid_shared_lib[] = "libfreebl_32int64_3.so";
     72 const static char non_hybrid_shared_lib[] = "libfreebl_32int_3.so";
     73 
     74 const static char int_hybrid_isa[] = "sparcv8plus";
     75 const static char fpu_hybrid_isa[] = "sparcv8plus+vis";
     76 
     77 #endif
     78 
     79 static const char *
     80 getLibName(void)
     81 {
     82     char * found_int_hybrid;
     83     char * found_fpu_hybrid;
     84     long buflen;
     85     char buf[256];
     86 
     87     buflen = sysinfo(SI_ISALIST, buf, sizeof buf);
     88     if (buflen <= 0)
     89 	return NULL;
     90     /* sysinfo output is always supposed to be NUL terminated, but ... */
     91     if (buflen < sizeof buf)
     92     	buf[buflen] = '\0';
     93     else
     94     	buf[(sizeof buf) - 1] = '\0';
     95     /* The ISA list is a space separated string of names of ISAs and
     96      * ISA extensions, in order of decreasing performance.
     97      * There are two different ISAs with which NSS's crypto code can be
     98      * accelerated. If both are in the list, we take the first one.
     99      * If one is in the list, we use it, and if neither then we use
    100      * the base unaccelerated code.
    101      */
    102     found_int_hybrid = strstr(buf, int_hybrid_isa);
    103     found_fpu_hybrid = strstr(buf, fpu_hybrid_isa);
    104     if (found_fpu_hybrid &&
    105 	(!found_int_hybrid ||
    106 	 (found_int_hybrid - found_fpu_hybrid) >= 0)) {
    107 	return fpu_hybrid_shared_lib;
    108     }
    109     if (found_int_hybrid) {
    110 	return int_hybrid_shared_lib;
    111     }
    112     return non_hybrid_shared_lib;
    113 }
    114 
    115 #elif defined(HPUX) && !defined(NSS_USE_64) && !defined(__ia64)
    116 /* This code tests to see if we're running on a PA2.x CPU.
    117 ** It returns true (1) if so, and false (0) otherwise.
    118 */
    119 static const char *
    120 getLibName(void)
    121 {
    122     long cpu = sysconf(_SC_CPU_VERSION);
    123     return (cpu == CPU_PA_RISC2_0)
    124 		? "libfreebl_32fpu_3.sl"
    125 	        : "libfreebl_32int32_3.sl" ;
    126 }
    127 #else
    128 /* default case, for platforms/ABIs that have only one freebl shared lib. */
    129 static const char * getLibName(void) { return default_name; }
    130 #endif
    131 
    132 #include "prio.h"
    133 #include "prprf.h"
    134 #include <stdio.h>
    135 #include "prsystem.h"
    136 
    137 static const char *NameOfThisSharedLib =
    138   SHLIB_PREFIX"softokn"SOFTOKEN_SHLIB_VERSION"."SHLIB_SUFFIX;
    139 
    140 static PRLibrary* blLib;
    141 
    142 #define LSB(x) ((x)&0xff)
    143 #define MSB(x) ((x)>>8)
    144 
    145 static const FREEBLVector *vector;
    146 static const char *libraryName = NULL;
    147 
    148 #include "genload.c"
    149 
    150 /* This function must be run only once. */
    151 /*  determine if hybrid platform, then actually load the DSO. */
    152 static PRStatus
    153 freebl_LoadDSO( void )
    154 {
    155   PRLibrary *  handle;
    156   const char * name = getLibName();
    157 
    158   if (!name) {
    159     PR_SetError(PR_LOAD_LIBRARY_ERROR, 0);
    160     return PR_FAILURE;
    161   }
    162 
    163   handle = loader_LoadLibrary(name);
    164   if (handle) {
    165     PRFuncPtr address = PR_FindFunctionSymbol(handle, "FREEBL_GetVector");
    166     PRStatus status;
    167     if (address) {
    168       FREEBLGetVectorFn  * getVector = (FREEBLGetVectorFn *)address;
    169       const FREEBLVector * dsoVector = getVector();
    170       if (dsoVector) {
    171 	unsigned short dsoVersion = dsoVector->version;
    172 	unsigned short  myVersion = FREEBL_VERSION;
    173 	if (MSB(dsoVersion) == MSB(myVersion) &&
    174 	    LSB(dsoVersion) >= LSB(myVersion) &&
    175 	    dsoVector->length >= sizeof(FREEBLVector)) {
    176           vector = dsoVector;
    177 	  libraryName = name;
    178 	  blLib = handle;
    179 	  return PR_SUCCESS;
    180 	}
    181       }
    182     }
    183     status = PR_UnloadLibrary(handle);
    184     PORT_Assert(PR_SUCCESS == status);
    185   }
    186   return PR_FAILURE;
    187 }
    188 
    189 static const PRCallOnceType pristineCallOnce;
    190 static PRCallOnceType loadFreeBLOnce;
    191 
    192 static PRStatus
    193 freebl_RunLoaderOnce( void )
    194 {
    195   PRStatus status;
    196 
    197   status = PR_CallOnce(&loadFreeBLOnce, &freebl_LoadDSO);
    198   return status;
    199 }
    200 
    201 SECStatus
    202 BL_Init(void)
    203 {
    204   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    205       return SECFailure;
    206   return (vector->p_BL_Init)();
    207 }
    208 
    209 RSAPrivateKey *
    210 RSA_NewKey(int keySizeInBits, SECItem * publicExponent)
    211 {
    212   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    213       return NULL;
    214   return (vector->p_RSA_NewKey)(keySizeInBits, publicExponent);
    215 }
    216 
    217 SECStatus
    218 RSA_PublicKeyOp(RSAPublicKey *   key,
    219 				 unsigned char *  output,
    220 				 const unsigned char *  input)
    221 {
    222   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    223       return SECFailure;
    224   return (vector->p_RSA_PublicKeyOp)(key, output, input);
    225 }
    226 
    227 SECStatus
    228 RSA_PrivateKeyOp(RSAPrivateKey *  key,
    229 				  unsigned char *  output,
    230 				  const unsigned char *  input)
    231 {
    232   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    233       return SECFailure;
    234   return (vector->p_RSA_PrivateKeyOp)(key, output, input);
    235 }
    236 
    237 SECStatus
    238 RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey *key,
    239                               unsigned char *output,
    240                               const unsigned char *input)
    241 {
    242   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    243       return SECFailure;
    244   return (vector->p_RSA_PrivateKeyOpDoubleChecked)(key, output, input);
    245 }
    246 
    247 SECStatus
    248 RSA_PrivateKeyCheck(RSAPrivateKey *key)
    249 {
    250   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    251       return SECFailure;
    252   return (vector->p_RSA_PrivateKeyCheck)(key);
    253 }
    254 
    255 SECStatus
    256 DSA_NewKey(const PQGParams * params, DSAPrivateKey ** privKey)
    257 {
    258   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    259       return SECFailure;
    260   return (vector->p_DSA_NewKey)(params, privKey);
    261 }
    262 
    263 SECStatus
    264 DSA_SignDigest(DSAPrivateKey * key, SECItem * signature, const SECItem * digest)
    265 {
    266   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    267       return SECFailure;
    268   return (vector->p_DSA_SignDigest)( key,  signature,  digest);
    269 }
    270 
    271 SECStatus
    272 DSA_VerifyDigest(DSAPublicKey * key, const SECItem * signature,
    273                  const SECItem * digest)
    274 {
    275   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    276       return SECFailure;
    277   return (vector->p_DSA_VerifyDigest)( key,  signature,  digest);
    278 }
    279 
    280 SECStatus
    281 DSA_NewKeyFromSeed(const PQGParams *params, const unsigned char * seed,
    282                    DSAPrivateKey **privKey)
    283 {
    284   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    285       return SECFailure;
    286   return (vector->p_DSA_NewKeyFromSeed)(params,  seed, privKey);
    287 }
    288 
    289 SECStatus
    290 DSA_SignDigestWithSeed(DSAPrivateKey * key, SECItem * signature,
    291 		       const SECItem * digest, const unsigned char * seed)
    292 {
    293   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    294       return SECFailure;
    295   return (vector->p_DSA_SignDigestWithSeed)( key, signature, digest, seed);
    296 }
    297 
    298 SECStatus
    299 DH_GenParam(int primeLen, DHParams ** params)
    300 {
    301   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    302       return SECFailure;
    303   return (vector->p_DH_GenParam)(primeLen, params);
    304 }
    305 
    306 SECStatus
    307 DH_NewKey(DHParams * params, DHPrivateKey ** privKey)
    308 {
    309   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    310       return SECFailure;
    311   return (vector->p_DH_NewKey)( params, privKey);
    312 }
    313 
    314 SECStatus
    315 DH_Derive(SECItem * publicValue, SECItem * prime, SECItem * privateValue,
    316 			 SECItem * derivedSecret, unsigned int maxOutBytes)
    317 {
    318   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    319       return SECFailure;
    320   return (vector->p_DH_Derive)( publicValue, prime, privateValue,
    321 				derivedSecret, maxOutBytes);
    322 }
    323 
    324 SECStatus
    325 KEA_Derive(SECItem *prime, SECItem *public1, SECItem *public2,
    326 	   SECItem *private1, SECItem *private2, SECItem *derivedSecret)
    327 {
    328   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    329       return SECFailure;
    330   return (vector->p_KEA_Derive)(prime, public1, public2,
    331 	                        private1, private2, derivedSecret);
    332 }
    333 
    334 PRBool
    335 KEA_Verify(SECItem *Y, SECItem *prime, SECItem *subPrime)
    336 {
    337   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    338       return PR_FALSE;
    339   return (vector->p_KEA_Verify)(Y, prime, subPrime);
    340 }
    341 
    342 RC4Context *
    343 RC4_CreateContext(const unsigned char *key, int len)
    344 {
    345   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    346       return NULL;
    347   return (vector->p_RC4_CreateContext)(key, len);
    348 }
    349 
    350 void
    351 RC4_DestroyContext(RC4Context *cx, PRBool freeit)
    352 {
    353   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    354       return;
    355   (vector->p_RC4_DestroyContext)(cx, freeit);
    356 }
    357 
    358 SECStatus
    359 RC4_Encrypt(RC4Context *cx, unsigned char *output, unsigned int *outputLen,
    360 	    unsigned int maxOutputLen, const unsigned char *input,
    361 	    unsigned int inputLen)
    362 {
    363   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    364       return SECFailure;
    365   return (vector->p_RC4_Encrypt)(cx, output, outputLen, maxOutputLen, input,
    366 	                         inputLen);
    367 }
    368 
    369 SECStatus
    370 RC4_Decrypt(RC4Context *cx, unsigned char *output, unsigned int *outputLen,
    371 	    unsigned int maxOutputLen, const unsigned char *input,
    372 	    unsigned int inputLen)
    373 {
    374   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    375       return SECFailure;
    376   return (vector->p_RC4_Decrypt)(cx, output, outputLen, maxOutputLen, input,
    377 	                         inputLen);
    378 }
    379 
    380 RC2Context *
    381 RC2_CreateContext(const unsigned char *key, unsigned int len,
    382 		  const unsigned char *iv, int mode, unsigned effectiveKeyLen)
    383 {
    384   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    385       return NULL;
    386   return (vector->p_RC2_CreateContext)(key, len, iv, mode, effectiveKeyLen);
    387 }
    388 
    389 void
    390 RC2_DestroyContext(RC2Context *cx, PRBool freeit)
    391 {
    392   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    393       return;
    394   (vector->p_RC2_DestroyContext)(cx, freeit);
    395 }
    396 
    397 SECStatus
    398 RC2_Encrypt(RC2Context *cx, unsigned char *output, unsigned int *outputLen,
    399 	    unsigned int maxOutputLen, const unsigned char *input,
    400 	    unsigned int inputLen)
    401 {
    402   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    403       return SECFailure;
    404   return (vector->p_RC2_Encrypt)(cx, output, outputLen, maxOutputLen, input,
    405 	                         inputLen);
    406 }
    407 
    408 SECStatus
    409 RC2_Decrypt(RC2Context *cx, unsigned char *output, unsigned int *outputLen,
    410 	    unsigned int maxOutputLen, const unsigned char *input,
    411 	    unsigned int inputLen)
    412 {
    413   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    414       return SECFailure;
    415   return (vector->p_RC2_Decrypt)(cx, output, outputLen, maxOutputLen, input,
    416 	                         inputLen);
    417 }
    418 
    419 RC5Context *
    420 RC5_CreateContext(const SECItem *key, unsigned int rounds,
    421 		  unsigned int wordSize, const unsigned char *iv, int mode)
    422 {
    423   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    424       return NULL;
    425   return (vector->p_RC5_CreateContext)(key, rounds, wordSize, iv, mode);
    426 }
    427 
    428 void
    429 RC5_DestroyContext(RC5Context *cx, PRBool freeit)
    430 {
    431   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    432       return;
    433   (vector->p_RC5_DestroyContext)(cx, freeit);
    434 }
    435 
    436 SECStatus
    437 RC5_Encrypt(RC5Context *cx, unsigned char *output, unsigned int *outputLen,
    438 	    unsigned int maxOutputLen, const unsigned char *input,
    439 	    unsigned int inputLen)
    440 {
    441   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    442       return SECFailure;
    443   return (vector->p_RC5_Encrypt)(cx, output, outputLen, maxOutputLen, input,
    444 				 inputLen);
    445 }
    446 
    447 SECStatus
    448 RC5_Decrypt(RC5Context *cx, unsigned char *output, unsigned int *outputLen,
    449 	    unsigned int maxOutputLen, const unsigned char *input,
    450 	    unsigned int inputLen)
    451 {
    452   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    453       return SECFailure;
    454   return (vector->p_RC5_Decrypt)(cx, output, outputLen, maxOutputLen, input,
    455 	                         inputLen);
    456 }
    457 
    458 DESContext *
    459 DES_CreateContext(const unsigned char *key, const unsigned char *iv,
    460 		  int mode, PRBool encrypt)
    461 {
    462   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    463       return NULL;
    464   return (vector->p_DES_CreateContext)(key, iv, mode, encrypt);
    465 }
    466 
    467 void
    468 DES_DestroyContext(DESContext *cx, PRBool freeit)
    469 {
    470   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    471       return;
    472   (vector->p_DES_DestroyContext)(cx, freeit);
    473 }
    474 
    475 SECStatus
    476 DES_Encrypt(DESContext *cx, unsigned char *output, unsigned int *outputLen,
    477 	    unsigned int maxOutputLen, const unsigned char *input,
    478 	    unsigned int inputLen)
    479 {
    480   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    481       return SECFailure;
    482   return (vector->p_DES_Encrypt)(cx, output, outputLen, maxOutputLen, input,
    483 	                         inputLen);
    484 }
    485 
    486 SECStatus
    487 DES_Decrypt(DESContext *cx, unsigned char *output, unsigned int *outputLen,
    488 	    unsigned int maxOutputLen, const unsigned char *input,
    489 	    unsigned int inputLen)
    490 {
    491   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    492       return SECFailure;
    493   return (vector->p_DES_Decrypt)(cx, output, outputLen, maxOutputLen, input,
    494 	                         inputLen);
    495 }
    496 SEEDContext *
    497 SEED_CreateContext(const unsigned char *key, const unsigned char *iv,
    498 		  int mode, PRBool encrypt)
    499 {
    500   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    501       return NULL;
    502   return (vector->p_SEED_CreateContext)(key, iv, mode, encrypt);
    503 }
    504 
    505 void
    506 SEED_DestroyContext(SEEDContext *cx, PRBool freeit)
    507 {
    508   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    509       return;
    510   (vector->p_SEED_DestroyContext)(cx, freeit);
    511 }
    512 
    513 SECStatus
    514 SEED_Encrypt(SEEDContext *cx, unsigned char *output, unsigned int *outputLen,
    515 	    unsigned int maxOutputLen, const unsigned char *input,
    516 	    unsigned int inputLen)
    517 {
    518   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    519       return SECFailure;
    520   return (vector->p_SEED_Encrypt)(cx, output, outputLen, maxOutputLen, input,
    521 	                         inputLen);
    522 }
    523 
    524 SECStatus
    525 SEED_Decrypt(SEEDContext *cx, unsigned char *output, unsigned int *outputLen,
    526 	    unsigned int maxOutputLen, const unsigned char *input,
    527 	    unsigned int inputLen)
    528 {
    529   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    530       return SECFailure;
    531   return (vector->p_SEED_Decrypt)(cx, output, outputLen, maxOutputLen, input,
    532 	                         inputLen);
    533 }
    534 
    535 AESContext *
    536 AES_CreateContext(const unsigned char *key, const unsigned char *iv,
    537                   int mode, int encrypt,
    538                   unsigned int keylen, unsigned int blocklen)
    539 {
    540   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    541       return NULL;
    542   return (vector->p_AES_CreateContext)(key, iv, mode, encrypt, keylen,
    543 				       blocklen);
    544 }
    545 
    546 void
    547 AES_DestroyContext(AESContext *cx, PRBool freeit)
    548 {
    549   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    550       return ;
    551   (vector->p_AES_DestroyContext)(cx, freeit);
    552 }
    553 
    554 SECStatus
    555 AES_Encrypt(AESContext *cx, unsigned char *output,
    556             unsigned int *outputLen, unsigned int maxOutputLen,
    557             const unsigned char *input, unsigned int inputLen)
    558 {
    559   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    560       return SECFailure;
    561   return (vector->p_AES_Encrypt)(cx, output, outputLen, maxOutputLen,
    562 				 input, inputLen);
    563 }
    564 
    565 SECStatus
    566 AES_Decrypt(AESContext *cx, unsigned char *output,
    567             unsigned int *outputLen, unsigned int maxOutputLen,
    568             const unsigned char *input, unsigned int inputLen)
    569 {
    570   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    571       return SECFailure;
    572   return (vector->p_AES_Decrypt)(cx, output, outputLen, maxOutputLen,
    573 				 input, inputLen);
    574 }
    575 
    576 SECStatus
    577 MD5_Hash(unsigned char *dest, const char *src)
    578 {
    579   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    580       return SECFailure;
    581   return (vector->p_MD5_Hash)(dest, src);
    582 }
    583 
    584 SECStatus
    585 MD5_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
    586 {
    587   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    588       return SECFailure;
    589   return (vector->p_MD5_HashBuf)(dest, src, src_length);
    590 }
    591 
    592 MD5Context *
    593 MD5_NewContext(void)
    594 {
    595   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    596       return NULL;
    597   return (vector->p_MD5_NewContext)();
    598 }
    599 
    600 void
    601 MD5_DestroyContext(MD5Context *cx, PRBool freeit)
    602 {
    603   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    604       return;
    605   (vector->p_MD5_DestroyContext)(cx, freeit);
    606 }
    607 
    608 void
    609 MD5_Begin(MD5Context *cx)
    610 {
    611   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    612       return;
    613   (vector->p_MD5_Begin)(cx);
    614 }
    615 
    616 void
    617 MD5_Update(MD5Context *cx, const unsigned char *input, unsigned int inputLen)
    618 {
    619   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    620       return;
    621   (vector->p_MD5_Update)(cx, input, inputLen);
    622 }
    623 
    624 void
    625 MD5_End(MD5Context *cx, unsigned char *digest,
    626 		    unsigned int *digestLen, unsigned int maxDigestLen)
    627 {
    628   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    629       return;
    630   (vector->p_MD5_End)(cx, digest, digestLen, maxDigestLen);
    631 }
    632 
    633 unsigned int
    634 MD5_FlattenSize(MD5Context *cx)
    635 {
    636   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    637       return 0;
    638   return (vector->p_MD5_FlattenSize)(cx);
    639 }
    640 
    641 SECStatus
    642 MD5_Flatten(MD5Context *cx,unsigned char *space)
    643 {
    644   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    645       return SECFailure;
    646   return (vector->p_MD5_Flatten)(cx, space);
    647 }
    648 
    649 MD5Context *
    650 MD5_Resurrect(unsigned char *space, void *arg)
    651 {
    652   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    653       return NULL;
    654   return (vector->p_MD5_Resurrect)(space, arg);
    655 }
    656 
    657 void
    658 MD5_TraceState(MD5Context *cx)
    659 {
    660   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    661       return ;
    662   (vector->p_MD5_TraceState)(cx);
    663 }
    664 
    665 SECStatus
    666 MD2_Hash(unsigned char *dest, const char *src)
    667 {
    668   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    669       return SECFailure;
    670   return (vector->p_MD2_Hash)(dest, src);
    671 }
    672 
    673 MD2Context *
    674 MD2_NewContext(void)
    675 {
    676   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    677       return NULL;
    678   return (vector->p_MD2_NewContext)();
    679 }
    680 
    681 void
    682 MD2_DestroyContext(MD2Context *cx, PRBool freeit)
    683 {
    684   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    685       return ;
    686   (vector->p_MD2_DestroyContext)(cx, freeit);
    687 }
    688 
    689 void
    690 MD2_Begin(MD2Context *cx)
    691 {
    692   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    693       return ;
    694   (vector->p_MD2_Begin)(cx);
    695 }
    696 
    697 void
    698 MD2_Update(MD2Context *cx, const unsigned char *input, unsigned int inputLen)
    699 {
    700   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    701       return ;
    702   (vector->p_MD2_Update)(cx, input, inputLen);
    703 }
    704 
    705 void
    706 MD2_End(MD2Context *cx, unsigned char *digest,
    707 		    unsigned int *digestLen, unsigned int maxDigestLen)
    708 {
    709   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    710       return ;
    711   (vector->p_MD2_End)(cx, digest, digestLen, maxDigestLen);
    712 }
    713 
    714 unsigned int
    715 MD2_FlattenSize(MD2Context *cx)
    716 {
    717   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    718       return 0;
    719   return (vector->p_MD2_FlattenSize)(cx);
    720 }
    721 
    722 SECStatus
    723 MD2_Flatten(MD2Context *cx,unsigned char *space)
    724 {
    725   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    726       return SECFailure;
    727   return (vector->p_MD2_Flatten)(cx, space);
    728 }
    729 
    730 MD2Context *
    731 MD2_Resurrect(unsigned char *space, void *arg)
    732 {
    733   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    734       return NULL;
    735   return (vector->p_MD2_Resurrect)(space, arg);
    736 }
    737 
    738 
    739 SECStatus
    740 SHA1_Hash(unsigned char *dest, const char *src)
    741 {
    742   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    743       return SECFailure;
    744   return (vector->p_SHA1_Hash)(dest, src);
    745 }
    746 
    747 SECStatus
    748 SHA1_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
    749 {
    750   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    751       return SECFailure;
    752   return (vector->p_SHA1_HashBuf)(dest, src, src_length);
    753 }
    754 
    755 SHA1Context *
    756 SHA1_NewContext(void)
    757 {
    758   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    759       return NULL;
    760   return (vector->p_SHA1_NewContext)();
    761 }
    762 
    763 void
    764 SHA1_DestroyContext(SHA1Context *cx, PRBool freeit)
    765 {
    766   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    767       return ;
    768   (vector->p_SHA1_DestroyContext)(cx, freeit);
    769 }
    770 
    771 void
    772 SHA1_Begin(SHA1Context *cx)
    773 {
    774   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    775       return ;
    776   (vector->p_SHA1_Begin)(cx);
    777 }
    778 
    779 void
    780 SHA1_Update(SHA1Context *cx, const unsigned char *input,
    781 			unsigned int inputLen)
    782 {
    783   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    784       return ;
    785   (vector->p_SHA1_Update)(cx, input, inputLen);
    786 }
    787 
    788 void
    789 SHA1_End(SHA1Context *cx, unsigned char *digest,
    790 		     unsigned int *digestLen, unsigned int maxDigestLen)
    791 {
    792   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    793       return ;
    794   (vector->p_SHA1_End)(cx, digest, digestLen, maxDigestLen);
    795 }
    796 
    797 void
    798 SHA1_TraceState(SHA1Context *cx)
    799 {
    800   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    801       return ;
    802   (vector->p_SHA1_TraceState)(cx);
    803 }
    804 
    805 unsigned int
    806 SHA1_FlattenSize(SHA1Context *cx)
    807 {
    808   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    809       return 0;
    810   return (vector->p_SHA1_FlattenSize)(cx);
    811 }
    812 
    813 SECStatus
    814 SHA1_Flatten(SHA1Context *cx,unsigned char *space)
    815 {
    816   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    817       return SECFailure;
    818   return (vector->p_SHA1_Flatten)(cx, space);
    819 }
    820 
    821 SHA1Context *
    822 SHA1_Resurrect(unsigned char *space, void *arg)
    823 {
    824   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    825       return NULL;
    826   return (vector->p_SHA1_Resurrect)(space, arg);
    827 }
    828 
    829 SECStatus
    830 RNG_RNGInit(void)
    831 {
    832   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    833       return SECFailure;
    834   return (vector->p_RNG_RNGInit)();
    835 }
    836 
    837 SECStatus
    838 RNG_RandomUpdate(const void *data, size_t bytes)
    839 {
    840   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    841       return SECFailure;
    842   return (vector->p_RNG_RandomUpdate)(data, bytes);
    843 }
    844 
    845 SECStatus
    846 RNG_GenerateGlobalRandomBytes(void *dest, size_t len)
    847 {
    848   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    849       return SECFailure;
    850   return (vector->p_RNG_GenerateGlobalRandomBytes)(dest, len);
    851 }
    852 
    853 void
    854 RNG_RNGShutdown(void)
    855 {
    856   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    857       return ;
    858   (vector->p_RNG_RNGShutdown)();
    859 }
    860 
    861 SECStatus
    862 PQG_ParamGen(unsigned int j, PQGParams **pParams, PQGVerify **pVfy)
    863 {
    864   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    865       return SECFailure;
    866   return (vector->p_PQG_ParamGen)(j, pParams, pVfy);
    867 }
    868 
    869 SECStatus
    870 PQG_ParamGenSeedLen( unsigned int j, unsigned int seedBytes,
    871                      PQGParams **pParams, PQGVerify **pVfy)
    872 {
    873   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    874       return SECFailure;
    875   return (vector->p_PQG_ParamGenSeedLen)(j, seedBytes, pParams, pVfy);
    876 }
    877 
    878 SECStatus
    879 PQG_VerifyParams(const PQGParams *params, const PQGVerify *vfy,
    880 		 SECStatus *result)
    881 {
    882   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    883       return SECFailure;
    884   return (vector->p_PQG_VerifyParams)(params, vfy, result);
    885 }
    886 
    887 void
    888 PQG_DestroyParams(PQGParams *params)
    889 {
    890   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    891       return;
    892   (vector->p_PQG_DestroyParams)(params);
    893 }
    894 
    895 void
    896 PQG_DestroyVerify(PQGVerify *vfy)
    897 {
    898   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    899       return;
    900   (vector->p_PQG_DestroyVerify)(vfy);
    901 }
    902 
    903 void
    904 BL_Cleanup(void)
    905 {
    906   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    907       return;
    908   (vector->p_BL_Cleanup)();
    909 }
    910 
    911 void
    912 BL_Unload(void)
    913 {
    914   /* This function is not thread-safe, but doesn't need to be, because it is
    915    * only called from functions that are also defined as not thread-safe,
    916    * namely C_Finalize in softoken, and the SSL bypass shutdown callback called
    917    * from NSS_Shutdown. */
    918   char *disableUnload = NULL;
    919   vector = NULL;
    920   /* If an SSL socket is configured with SSL_BYPASS_PKCS11, but the application
    921    * never does a handshake on it, BL_Unload will be called even though freebl
    922    * was never loaded. So, don't assert blLib. */
    923   if (blLib) {
    924       disableUnload = PR_GetEnv("NSS_DISABLE_UNLOAD");
    925       if (!disableUnload) {
    926           PRStatus status = PR_UnloadLibrary(blLib);
    927           PORT_Assert(PR_SUCCESS == status);
    928       }
    929       blLib = NULL;
    930   }
    931   loadFreeBLOnce = pristineCallOnce;
    932 }
    933 
    934 /* ============== New for 3.003 =============================== */
    935 
    936 SECStatus
    937 SHA256_Hash(unsigned char *dest, const char *src)
    938 {
    939   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    940       return SECFailure;
    941   return (vector->p_SHA256_Hash)(dest, src);
    942 }
    943 
    944 SECStatus
    945 SHA256_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
    946 {
    947   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    948       return SECFailure;
    949   return (vector->p_SHA256_HashBuf)(dest, src, src_length);
    950 }
    951 
    952 SHA256Context *
    953 SHA256_NewContext(void)
    954 {
    955   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    956       return NULL;
    957   return (vector->p_SHA256_NewContext)();
    958 }
    959 
    960 void
    961 SHA256_DestroyContext(SHA256Context *cx, PRBool freeit)
    962 {
    963   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    964       return ;
    965   (vector->p_SHA256_DestroyContext)(cx, freeit);
    966 }
    967 
    968 void
    969 SHA256_Begin(SHA256Context *cx)
    970 {
    971   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    972       return ;
    973   (vector->p_SHA256_Begin)(cx);
    974 }
    975 
    976 void
    977 SHA256_Update(SHA256Context *cx, const unsigned char *input,
    978 			unsigned int inputLen)
    979 {
    980   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    981       return ;
    982   (vector->p_SHA256_Update)(cx, input, inputLen);
    983 }
    984 
    985 void
    986 SHA256_End(SHA256Context *cx, unsigned char *digest,
    987 		     unsigned int *digestLen, unsigned int maxDigestLen)
    988 {
    989   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    990       return ;
    991   (vector->p_SHA256_End)(cx, digest, digestLen, maxDigestLen);
    992 }
    993 
    994 void
    995 SHA256_TraceState(SHA256Context *cx)
    996 {
    997   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
    998       return ;
    999   (vector->p_SHA256_TraceState)(cx);
   1000 }
   1001 
   1002 unsigned int
   1003 SHA256_FlattenSize(SHA256Context *cx)
   1004 {
   1005   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1006       return 0;
   1007   return (vector->p_SHA256_FlattenSize)(cx);
   1008 }
   1009 
   1010 SECStatus
   1011 SHA256_Flatten(SHA256Context *cx,unsigned char *space)
   1012 {
   1013   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1014       return SECFailure;
   1015   return (vector->p_SHA256_Flatten)(cx, space);
   1016 }
   1017 
   1018 SHA256Context *
   1019 SHA256_Resurrect(unsigned char *space, void *arg)
   1020 {
   1021   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1022       return NULL;
   1023   return (vector->p_SHA256_Resurrect)(space, arg);
   1024 }
   1025 
   1026 SECStatus
   1027 SHA512_Hash(unsigned char *dest, const char *src)
   1028 {
   1029   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1030       return SECFailure;
   1031   return (vector->p_SHA512_Hash)(dest, src);
   1032 }
   1033 
   1034 SECStatus
   1035 SHA512_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
   1036 {
   1037   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1038       return SECFailure;
   1039   return (vector->p_SHA512_HashBuf)(dest, src, src_length);
   1040 }
   1041 
   1042 SHA512Context *
   1043 SHA512_NewContext(void)
   1044 {
   1045   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1046       return NULL;
   1047   return (vector->p_SHA512_NewContext)();
   1048 }
   1049 
   1050 void
   1051 SHA512_DestroyContext(SHA512Context *cx, PRBool freeit)
   1052 {
   1053   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1054       return ;
   1055   (vector->p_SHA512_DestroyContext)(cx, freeit);
   1056 }
   1057 
   1058 void
   1059 SHA512_Begin(SHA512Context *cx)
   1060 {
   1061   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1062       return ;
   1063   (vector->p_SHA512_Begin)(cx);
   1064 }
   1065 
   1066 void
   1067 SHA512_Update(SHA512Context *cx, const unsigned char *input,
   1068 			unsigned int inputLen)
   1069 {
   1070   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1071       return ;
   1072   (vector->p_SHA512_Update)(cx, input, inputLen);
   1073 }
   1074 
   1075 void
   1076 SHA512_End(SHA512Context *cx, unsigned char *digest,
   1077 		     unsigned int *digestLen, unsigned int maxDigestLen)
   1078 {
   1079   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1080       return ;
   1081   (vector->p_SHA512_End)(cx, digest, digestLen, maxDigestLen);
   1082 }
   1083 
   1084 void
   1085 SHA512_TraceState(SHA512Context *cx)
   1086 {
   1087   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1088       return ;
   1089   (vector->p_SHA512_TraceState)(cx);
   1090 }
   1091 
   1092 unsigned int
   1093 SHA512_FlattenSize(SHA512Context *cx)
   1094 {
   1095   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1096       return 0;
   1097   return (vector->p_SHA512_FlattenSize)(cx);
   1098 }
   1099 
   1100 SECStatus
   1101 SHA512_Flatten(SHA512Context *cx,unsigned char *space)
   1102 {
   1103   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1104       return SECFailure;
   1105   return (vector->p_SHA512_Flatten)(cx, space);
   1106 }
   1107 
   1108 SHA512Context *
   1109 SHA512_Resurrect(unsigned char *space, void *arg)
   1110 {
   1111   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1112       return NULL;
   1113   return (vector->p_SHA512_Resurrect)(space, arg);
   1114 }
   1115 
   1116 
   1117 SECStatus
   1118 SHA384_Hash(unsigned char *dest, const char *src)
   1119 {
   1120   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1121       return SECFailure;
   1122   return (vector->p_SHA384_Hash)(dest, src);
   1123 }
   1124 
   1125 SECStatus
   1126 SHA384_HashBuf(unsigned char *dest, const unsigned char *src, uint32 src_length)
   1127 {
   1128   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1129       return SECFailure;
   1130   return (vector->p_SHA384_HashBuf)(dest, src, src_length);
   1131 }
   1132 
   1133 SHA384Context *
   1134 SHA384_NewContext(void)
   1135 {
   1136   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1137       return NULL;
   1138   return (vector->p_SHA384_NewContext)();
   1139 }
   1140 
   1141 void
   1142 SHA384_DestroyContext(SHA384Context *cx, PRBool freeit)
   1143 {
   1144   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1145       return ;
   1146   (vector->p_SHA384_DestroyContext)(cx, freeit);
   1147 }
   1148 
   1149 void
   1150 SHA384_Begin(SHA384Context *cx)
   1151 {
   1152   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1153       return ;
   1154   (vector->p_SHA384_Begin)(cx);
   1155 }
   1156 
   1157 void
   1158 SHA384_Update(SHA384Context *cx, const unsigned char *input,
   1159 			unsigned int inputLen)
   1160 {
   1161   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1162       return ;
   1163   (vector->p_SHA384_Update)(cx, input, inputLen);
   1164 }
   1165 
   1166 void
   1167 SHA384_End(SHA384Context *cx, unsigned char *digest,
   1168 		     unsigned int *digestLen, unsigned int maxDigestLen)
   1169 {
   1170   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1171       return ;
   1172   (vector->p_SHA384_End)(cx, digest, digestLen, maxDigestLen);
   1173 }
   1174 
   1175 void
   1176 SHA384_TraceState(SHA384Context *cx)
   1177 {
   1178   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1179       return ;
   1180   (vector->p_SHA384_TraceState)(cx);
   1181 }
   1182 
   1183 unsigned int
   1184 SHA384_FlattenSize(SHA384Context *cx)
   1185 {
   1186   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1187       return 0;
   1188   return (vector->p_SHA384_FlattenSize)(cx);
   1189 }
   1190 
   1191 SECStatus
   1192 SHA384_Flatten(SHA384Context *cx,unsigned char *space)
   1193 {
   1194   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1195       return SECFailure;
   1196   return (vector->p_SHA384_Flatten)(cx, space);
   1197 }
   1198 
   1199 SHA384Context *
   1200 SHA384_Resurrect(unsigned char *space, void *arg)
   1201 {
   1202   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1203       return NULL;
   1204   return (vector->p_SHA384_Resurrect)(space, arg);
   1205 }
   1206 
   1207 
   1208 AESKeyWrapContext *
   1209 AESKeyWrap_CreateContext(const unsigned char *key, const unsigned char *iv,
   1210                          int encrypt, unsigned int keylen)
   1211 {
   1212   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1213       return NULL;
   1214   return vector->p_AESKeyWrap_CreateContext(key, iv, encrypt, keylen);
   1215 }
   1216 
   1217 void
   1218 AESKeyWrap_DestroyContext(AESKeyWrapContext *cx, PRBool freeit)
   1219 {
   1220   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1221       return;
   1222   vector->p_AESKeyWrap_DestroyContext(cx, freeit);
   1223 }
   1224 
   1225 SECStatus
   1226 AESKeyWrap_Encrypt(AESKeyWrapContext *cx, unsigned char *output,
   1227 		   unsigned int *outputLen, unsigned int maxOutputLen,
   1228 		   const unsigned char *input, unsigned int inputLen)
   1229 {
   1230   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1231       return SECFailure;
   1232   return vector->p_AESKeyWrap_Encrypt(cx, output, outputLen, maxOutputLen,
   1233                                       input, inputLen);
   1234 }
   1235 SECStatus
   1236 AESKeyWrap_Decrypt(AESKeyWrapContext *cx, unsigned char *output,
   1237 		   unsigned int *outputLen, unsigned int maxOutputLen,
   1238 		   const unsigned char *input, unsigned int inputLen)
   1239 {
   1240   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1241       return SECFailure;
   1242   return vector->p_AESKeyWrap_Decrypt(cx, output, outputLen, maxOutputLen,
   1243 		                      input, inputLen);
   1244 }
   1245 
   1246 PRBool
   1247 BLAPI_SHVerify(const char *name, PRFuncPtr addr)
   1248 {
   1249   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1250       return PR_FALSE;
   1251   return vector->p_BLAPI_SHVerify(name, addr);
   1252 }
   1253 
   1254 /*
   1255  * The Caller is expected to pass NULL as the name, which will
   1256  * trigger the p_BLAPI_VerifySelf() to return 'TRUE'. If we really loaded
   1257  * from a shared library, BLAPI_VerifySelf will get pick up the real name
   1258  * from the static set in freebl_LoadDSO( void )
   1259  */
   1260 PRBool
   1261 BLAPI_VerifySelf(const char *name)
   1262 {
   1263   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1264       return PR_FALSE;
   1265   return vector->p_BLAPI_VerifySelf(libraryName);
   1266 }
   1267 
   1268 /* ============== New for 3.006 =============================== */
   1269 
   1270 SECStatus
   1271 EC_NewKey(ECParams * params, ECPrivateKey ** privKey)
   1272 {
   1273   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1274       return SECFailure;
   1275   return (vector->p_EC_NewKey)( params, privKey );
   1276 }
   1277 
   1278 SECStatus
   1279 EC_NewKeyFromSeed(ECParams * params, ECPrivateKey ** privKey,
   1280     const unsigned char *seed, int seedlen)
   1281 {
   1282   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1283       return SECFailure;
   1284   return (vector->p_EC_NewKeyFromSeed)( params, privKey, seed, seedlen );
   1285 }
   1286 
   1287 SECStatus
   1288 EC_ValidatePublicKey(ECParams * params, SECItem * publicValue)
   1289 {
   1290   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1291       return SECFailure;
   1292   return (vector->p_EC_ValidatePublicKey)( params, publicValue );
   1293 }
   1294 
   1295 SECStatus
   1296 ECDH_Derive(SECItem * publicValue, ECParams * params, SECItem * privateValue,
   1297             PRBool withCofactor, SECItem * derivedSecret)
   1298 {
   1299   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1300       return SECFailure;
   1301   return (vector->p_ECDH_Derive)( publicValue, params, privateValue,
   1302                                   withCofactor, derivedSecret );
   1303 }
   1304 
   1305 SECStatus
   1306 ECDSA_SignDigest(ECPrivateKey * key, SECItem * signature,
   1307     const SECItem * digest)
   1308 {
   1309   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1310       return SECFailure;
   1311   return (vector->p_ECDSA_SignDigest)( key, signature, digest );
   1312 }
   1313 
   1314 SECStatus
   1315 ECDSA_VerifyDigest(ECPublicKey * key, const SECItem * signature,
   1316     const SECItem * digest)
   1317 {
   1318   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1319       return SECFailure;
   1320   return (vector->p_ECDSA_VerifyDigest)( key, signature, digest );
   1321 }
   1322 
   1323 SECStatus
   1324 ECDSA_SignDigestWithSeed(ECPrivateKey * key, SECItem * signature,
   1325     const SECItem * digest, const unsigned char *seed, const int seedlen)
   1326 {
   1327   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1328       return SECFailure;
   1329   return (vector->p_ECDSA_SignDigestWithSeed)( key, signature, digest,
   1330       seed, seedlen );
   1331 }
   1332 
   1333 /* ============== New for 3.008 =============================== */
   1334 
   1335 AESContext *
   1336 AES_AllocateContext(void)
   1337 {
   1338   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1339       return NULL;
   1340   return (vector->p_AES_AllocateContext)();
   1341 }
   1342 
   1343 AESKeyWrapContext *
   1344 AESKeyWrap_AllocateContext(void)
   1345 {
   1346   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1347       return NULL;
   1348   return (vector->p_AESKeyWrap_AllocateContext)();
   1349 }
   1350 
   1351 DESContext *
   1352 DES_AllocateContext(void)
   1353 {
   1354   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1355       return NULL;
   1356   return (vector->p_DES_AllocateContext)();
   1357 }
   1358 
   1359 RC2Context *
   1360 RC2_AllocateContext(void)
   1361 {
   1362   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1363       return NULL;
   1364   return (vector->p_RC2_AllocateContext)();
   1365 }
   1366 
   1367 RC4Context *
   1368 RC4_AllocateContext(void)
   1369 {
   1370   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1371       return NULL;
   1372   return (vector->p_RC4_AllocateContext)();
   1373 }
   1374 
   1375 SECStatus
   1376 AES_InitContext(AESContext *cx, const unsigned char *key,
   1377 		unsigned int keylen, const unsigned char *iv, int mode,
   1378 		unsigned int encrypt, unsigned int blocklen)
   1379 {
   1380   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1381       return SECFailure;
   1382   return (vector->p_AES_InitContext)(cx, key, keylen, iv, mode, encrypt,
   1383 				     blocklen);
   1384 }
   1385 
   1386 SECStatus
   1387 AESKeyWrap_InitContext(AESKeyWrapContext *cx, const unsigned char *key,
   1388 		unsigned int keylen, const unsigned char *iv, int mode,
   1389 		unsigned int encrypt, unsigned int blocklen)
   1390 {
   1391   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1392       return SECFailure;
   1393   return (vector->p_AESKeyWrap_InitContext)(cx, key, keylen, iv, mode,
   1394 					    encrypt, blocklen);
   1395 }
   1396 
   1397 SECStatus
   1398 DES_InitContext(DESContext *cx, const unsigned char *key,
   1399 		unsigned int keylen, const unsigned char *iv, int mode,
   1400 		unsigned int encrypt, unsigned int xtra)
   1401 {
   1402   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1403       return SECFailure;
   1404   return (vector->p_DES_InitContext)(cx, key, keylen, iv, mode, encrypt, xtra);
   1405 }
   1406 
   1407 SECStatus
   1408 SEED_InitContext(SEEDContext *cx, const unsigned char *key,
   1409 		unsigned int keylen, const unsigned char *iv, int mode,
   1410 		unsigned int encrypt, unsigned int xtra)
   1411 {
   1412   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1413       return SECFailure;
   1414   return (vector->p_SEED_InitContext)(cx, key, keylen, iv, mode, encrypt, xtra);
   1415 }
   1416 
   1417 SECStatus
   1418 RC2_InitContext(RC2Context *cx, const unsigned char *key,
   1419 		unsigned int keylen, const unsigned char *iv, int mode,
   1420 		unsigned int effectiveKeyLen, unsigned int xtra)
   1421 {
   1422   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1423       return SECFailure;
   1424   return (vector->p_RC2_InitContext)(cx, key, keylen, iv, mode,
   1425 				     effectiveKeyLen, xtra);
   1426 }
   1427 
   1428 SECStatus
   1429 RC4_InitContext(RC4Context *cx, const unsigned char *key,
   1430 		unsigned int keylen, const unsigned char *x1, int x2,
   1431 		unsigned int x3, unsigned int x4)
   1432 {
   1433   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1434       return SECFailure;
   1435   return (vector->p_RC4_InitContext)(cx, key, keylen, x1, x2, x3, x4);
   1436 }
   1437 
   1438 void
   1439 MD2_Clone(MD2Context *dest, MD2Context *src)
   1440 {
   1441   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1442       return;
   1443   (vector->p_MD2_Clone)(dest, src);
   1444 }
   1445 
   1446 void
   1447 MD5_Clone(MD5Context *dest, MD5Context *src)
   1448 {
   1449   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1450       return;
   1451   (vector->p_MD5_Clone)(dest, src);
   1452 }
   1453 
   1454 void
   1455 SHA1_Clone(SHA1Context *dest, SHA1Context *src)
   1456 {
   1457   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1458       return;
   1459   (vector->p_SHA1_Clone)(dest, src);
   1460 }
   1461 
   1462 void
   1463 SHA256_Clone(SHA256Context *dest, SHA256Context *src)
   1464 {
   1465   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1466       return;
   1467   (vector->p_SHA256_Clone)(dest, src);
   1468 }
   1469 
   1470 void
   1471 SHA384_Clone(SHA384Context *dest, SHA384Context *src)
   1472 {
   1473   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1474       return;
   1475   (vector->p_SHA384_Clone)(dest, src);
   1476 }
   1477 
   1478 void
   1479 SHA512_Clone(SHA512Context *dest, SHA512Context *src)
   1480 {
   1481   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1482       return;
   1483   (vector->p_SHA512_Clone)(dest, src);
   1484 }
   1485 
   1486 SECStatus
   1487 TLS_PRF(const SECItem *secret, const char *label,
   1488 		     SECItem *seed, SECItem *result, PRBool isFIPS)
   1489 {
   1490   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1491       return SECFailure;
   1492   return (vector->p_TLS_PRF)(secret, label, seed, result, isFIPS);
   1493 }
   1494 
   1495 const SECHashObject *
   1496 HASH_GetRawHashObject(HASH_HashType hashType)
   1497 {
   1498   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1499       return NULL;
   1500   return (vector->p_HASH_GetRawHashObject)(hashType);
   1501 }
   1502 
   1503 
   1504 void
   1505 HMAC_Destroy(HMACContext *cx, PRBool freeit)
   1506 {
   1507   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1508       return;
   1509   (vector->p_HMAC_Destroy)(cx, freeit);
   1510 }
   1511 
   1512 HMACContext *
   1513 HMAC_Create(const SECHashObject *hashObj, const unsigned char *secret,
   1514 	    unsigned int secret_len, PRBool isFIPS)
   1515 {
   1516   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1517       return NULL;
   1518   return (vector->p_HMAC_Create)(hashObj, secret, secret_len, isFIPS);
   1519 }
   1520 
   1521 SECStatus
   1522 HMAC_Init(HMACContext *cx, const SECHashObject *hashObj,
   1523 	  const unsigned char *secret, unsigned int secret_len, PRBool isFIPS)
   1524 {
   1525   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1526       return SECFailure;
   1527   return (vector->p_HMAC_Init)(cx, hashObj, secret, secret_len, isFIPS);
   1528 }
   1529 
   1530 void
   1531 HMAC_Begin(HMACContext *cx)
   1532 {
   1533   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1534       return;
   1535   (vector->p_HMAC_Begin)(cx);
   1536 }
   1537 
   1538 void
   1539 HMAC_Update(HMACContext *cx, const unsigned char *data, unsigned int data_len)
   1540 {
   1541   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1542       return;
   1543   (vector->p_HMAC_Update)(cx, data, data_len);
   1544 }
   1545 
   1546 SECStatus
   1547 HMAC_Finish(HMACContext *cx, unsigned char *result, unsigned int *result_len,
   1548 	    unsigned int max_result_len)
   1549 {
   1550   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1551       return SECFailure;
   1552   return (vector->p_HMAC_Finish)(cx, result, result_len, max_result_len);
   1553 }
   1554 
   1555 HMACContext *
   1556 HMAC_Clone(HMACContext *cx)
   1557 {
   1558   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1559       return NULL;
   1560   return (vector->p_HMAC_Clone)(cx);
   1561 }
   1562 
   1563 void
   1564 RNG_SystemInfoForRNG(void)
   1565 {
   1566   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1567       return ;
   1568   (vector->p_RNG_SystemInfoForRNG)();
   1569 
   1570 }
   1571 
   1572 SECStatus
   1573 FIPS186Change_GenerateX(unsigned char *XKEY, const unsigned char *XSEEDj,
   1574                         unsigned char *x_j)
   1575 {
   1576   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1577       return SECFailure;
   1578   return (vector->p_FIPS186Change_GenerateX)(XKEY, XSEEDj, x_j);
   1579 }
   1580 
   1581 SECStatus
   1582 FIPS186Change_ReduceModQForDSA(const unsigned char *w,
   1583                                const unsigned char *q,
   1584                                unsigned char *xj)
   1585 {
   1586   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1587       return SECFailure;
   1588   return (vector->p_FIPS186Change_ReduceModQForDSA)(w, q, xj);
   1589 }
   1590 
   1591 /* === new for Camellia === */
   1592 SECStatus
   1593 Camellia_InitContext(CamelliaContext *cx, const unsigned char *key,
   1594 		unsigned int keylen, const unsigned char *iv, int mode,
   1595 		unsigned int encrypt, unsigned int unused)
   1596 {
   1597   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1598       return SECFailure;
   1599   return (vector->p_Camellia_InitContext)(cx, key, keylen, iv, mode, encrypt,
   1600 					  unused);
   1601 }
   1602 
   1603 CamelliaContext *
   1604 Camellia_AllocateContext(void)
   1605 {
   1606   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1607       return NULL;
   1608   return (vector->p_Camellia_AllocateContext)();
   1609 }
   1610 
   1611 
   1612 CamelliaContext *
   1613 Camellia_CreateContext(const unsigned char *key, const unsigned char *iv,
   1614 		       int mode, int encrypt,
   1615 		       unsigned int keylen)
   1616 {
   1617     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1618 	return NULL;
   1619     return (vector->p_Camellia_CreateContext)(key, iv, mode, encrypt, keylen);
   1620 }
   1621 
   1622 void
   1623 Camellia_DestroyContext(CamelliaContext *cx, PRBool freeit)
   1624 {
   1625     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1626 	return ;
   1627     (vector->p_Camellia_DestroyContext)(cx, freeit);
   1628 }
   1629 
   1630 SECStatus
   1631 Camellia_Encrypt(CamelliaContext *cx, unsigned char *output,
   1632 		 unsigned int *outputLen, unsigned int maxOutputLen,
   1633 		 const unsigned char *input, unsigned int inputLen)
   1634 {
   1635     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1636 	return SECFailure;
   1637     return (vector->p_Camellia_Encrypt)(cx, output, outputLen, maxOutputLen,
   1638 					input, inputLen);
   1639 }
   1640 
   1641 SECStatus
   1642 Camellia_Decrypt(CamelliaContext *cx, unsigned char *output,
   1643 		 unsigned int *outputLen, unsigned int maxOutputLen,
   1644 		 const unsigned char *input, unsigned int inputLen)
   1645 {
   1646     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1647 	return SECFailure;
   1648     return (vector->p_Camellia_Decrypt)(cx, output, outputLen, maxOutputLen,
   1649 					input, inputLen);
   1650 }
   1651 
   1652 void BL_SetForkState(PRBool forked)
   1653 {
   1654     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1655 	return;
   1656     (vector->p_BL_SetForkState)(forked);
   1657 }
   1658 
   1659 SECStatus
   1660 PRNGTEST_Instantiate(const PRUint8 *entropy, unsigned int entropy_len,
   1661 		const PRUint8 *nonce, unsigned int nonce_len,
   1662 		const PRUint8 *personal_string, unsigned int ps_len)
   1663 {
   1664     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1665 	return SECFailure;
   1666     return (vector->p_PRNGTEST_Instantiate)(entropy, entropy_len,
   1667 					   nonce,  nonce_len,
   1668 					   personal_string,  ps_len);
   1669 }
   1670 
   1671 SECStatus
   1672 PRNGTEST_Reseed(const PRUint8 *entropy, unsigned int entropy_len,
   1673 		  const PRUint8 *additional, unsigned int additional_len)
   1674 {
   1675     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1676 	return SECFailure;
   1677     return (vector->p_PRNGTEST_Reseed)(entropy, entropy_len,
   1678 				       additional, additional_len);
   1679 }
   1680 
   1681 SECStatus
   1682 PRNGTEST_Generate(PRUint8 *bytes, unsigned int bytes_len,
   1683 		  const PRUint8 *additional, unsigned int additional_len)
   1684 {
   1685     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1686 	return SECFailure;
   1687     return (vector->p_PRNGTEST_Generate)(bytes, bytes_len,
   1688 					 additional, additional_len);
   1689 }
   1690 
   1691 SECStatus
   1692 PRNGTEST_Uninstantiate()
   1693 {
   1694     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
   1695 	return SECFailure;
   1696     return (vector->p_PRNGTEST_Uninstantiate)();
   1697 }
   1698 
   1699 
   1700