• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@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 *
getLibName(void)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 *
getLibName(void)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. */
getLibName(void)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
freebl_LoadDSO(void)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
freebl_RunLoaderOnce(void)193 freebl_RunLoaderOnce( void )
194 {
195   PRStatus status;
196 
197   status = PR_CallOnce(&loadFreeBLOnce, &freebl_LoadDSO);
198   return status;
199 }
200 
201 SECStatus
BL_Init(void)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 *
RSA_NewKey(int keySizeInBits,SECItem * publicExponent)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
RSA_PublicKeyOp(RSAPublicKey * key,unsigned char * output,const unsigned char * input)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
RSA_PrivateKeyOp(RSAPrivateKey * key,unsigned char * output,const unsigned char * input)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
RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey * key,unsigned char * output,const unsigned char * input)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
RSA_PrivateKeyCheck(RSAPrivateKey * key)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
DSA_NewKey(const PQGParams * params,DSAPrivateKey ** privKey)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
DSA_SignDigest(DSAPrivateKey * key,SECItem * signature,const SECItem * digest)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
DSA_VerifyDigest(DSAPublicKey * key,const SECItem * signature,const SECItem * digest)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
DSA_NewKeyFromSeed(const PQGParams * params,const unsigned char * seed,DSAPrivateKey ** privKey)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
DSA_SignDigestWithSeed(DSAPrivateKey * key,SECItem * signature,const SECItem * digest,const unsigned char * seed)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
DH_GenParam(int primeLen,DHParams ** params)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
DH_NewKey(DHParams * params,DHPrivateKey ** privKey)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
DH_Derive(SECItem * publicValue,SECItem * prime,SECItem * privateValue,SECItem * derivedSecret,unsigned int maxOutBytes)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
KEA_Derive(SECItem * prime,SECItem * public1,SECItem * public2,SECItem * private1,SECItem * private2,SECItem * derivedSecret)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
KEA_Verify(SECItem * Y,SECItem * prime,SECItem * subPrime)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 *
RC4_CreateContext(const unsigned char * key,int len)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
RC4_DestroyContext(RC4Context * cx,PRBool freeit)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
RC4_Encrypt(RC4Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
RC4_Decrypt(RC4Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 *
RC2_CreateContext(const unsigned char * key,unsigned int len,const unsigned char * iv,int mode,unsigned effectiveKeyLen)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
RC2_DestroyContext(RC2Context * cx,PRBool freeit)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
RC2_Encrypt(RC2Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
RC2_Decrypt(RC2Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 *
RC5_CreateContext(const SECItem * key,unsigned int rounds,unsigned int wordSize,const unsigned char * iv,int mode)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
RC5_DestroyContext(RC5Context * cx,PRBool freeit)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
RC5_Encrypt(RC5Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
RC5_Decrypt(RC5Context * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 *
DES_CreateContext(const unsigned char * key,const unsigned char * iv,int mode,PRBool encrypt)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
DES_DestroyContext(DESContext * cx,PRBool freeit)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
DES_Encrypt(DESContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
DES_Decrypt(DESContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 *
SEED_CreateContext(const unsigned char * key,const unsigned char * iv,int mode,PRBool encrypt)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
SEED_DestroyContext(SEEDContext * cx,PRBool freeit)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
SEED_Encrypt(SEEDContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
SEED_Decrypt(SEEDContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 *
AES_CreateContext(const unsigned char * key,const unsigned char * iv,int mode,int encrypt,unsigned int keylen,unsigned int blocklen)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
AES_DestroyContext(AESContext * cx,PRBool freeit)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
AES_Encrypt(AESContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
AES_Decrypt(AESContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
MD5_Hash(unsigned char * dest,const char * src)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
MD5_HashBuf(unsigned char * dest,const unsigned char * src,uint32 src_length)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 *
MD5_NewContext(void)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
MD5_DestroyContext(MD5Context * cx,PRBool freeit)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
MD5_Begin(MD5Context * cx)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
MD5_Update(MD5Context * cx,const unsigned char * input,unsigned int inputLen)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
MD5_End(MD5Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
MD5_FlattenSize(MD5Context * cx)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
MD5_Flatten(MD5Context * cx,unsigned char * space)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 *
MD5_Resurrect(unsigned char * space,void * arg)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
MD5_TraceState(MD5Context * cx)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
MD2_Hash(unsigned char * dest,const char * src)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 *
MD2_NewContext(void)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
MD2_DestroyContext(MD2Context * cx,PRBool freeit)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
MD2_Begin(MD2Context * cx)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
MD2_Update(MD2Context * cx,const unsigned char * input,unsigned int inputLen)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
MD2_End(MD2Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
MD2_FlattenSize(MD2Context * cx)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
MD2_Flatten(MD2Context * cx,unsigned char * space)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 *
MD2_Resurrect(unsigned char * space,void * arg)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
SHA1_Hash(unsigned char * dest,const char * src)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
SHA1_HashBuf(unsigned char * dest,const unsigned char * src,uint32 src_length)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 *
SHA1_NewContext(void)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
SHA1_DestroyContext(SHA1Context * cx,PRBool freeit)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
SHA1_Begin(SHA1Context * cx)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
SHA1_Update(SHA1Context * cx,const unsigned char * input,unsigned int inputLen)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
SHA1_End(SHA1Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
SHA1_TraceState(SHA1Context * cx)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
SHA1_FlattenSize(SHA1Context * cx)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
SHA1_Flatten(SHA1Context * cx,unsigned char * space)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 *
SHA1_Resurrect(unsigned char * space,void * arg)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
RNG_RNGInit(void)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
RNG_RandomUpdate(const void * data,size_t bytes)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
RNG_GenerateGlobalRandomBytes(void * dest,size_t len)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
RNG_RNGShutdown(void)854 RNG_RNGShutdown(void)
855 {
856   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
857       return ;
858   (vector->p_RNG_RNGShutdown)();
859 }
860 
861 SECStatus
PQG_ParamGen(unsigned int j,PQGParams ** pParams,PQGVerify ** pVfy)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
PQG_ParamGenSeedLen(unsigned int j,unsigned int seedBytes,PQGParams ** pParams,PQGVerify ** pVfy)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
PQG_VerifyParams(const PQGParams * params,const PQGVerify * vfy,SECStatus * result)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
PQG_DestroyParams(PQGParams * params)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
PQG_DestroyVerify(PQGVerify * vfy)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
BL_Cleanup(void)904 BL_Cleanup(void)
905 {
906   if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
907       return;
908   (vector->p_BL_Cleanup)();
909 }
910 
911 void
BL_Unload(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
SHA256_Hash(unsigned char * dest,const char * src)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
SHA256_HashBuf(unsigned char * dest,const unsigned char * src,uint32 src_length)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 *
SHA256_NewContext(void)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
SHA256_DestroyContext(SHA256Context * cx,PRBool freeit)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
SHA256_Begin(SHA256Context * cx)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
SHA256_Update(SHA256Context * cx,const unsigned char * input,unsigned int inputLen)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
SHA256_End(SHA256Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
SHA256_TraceState(SHA256Context * cx)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
SHA256_FlattenSize(SHA256Context * cx)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
SHA256_Flatten(SHA256Context * cx,unsigned char * space)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 *
SHA256_Resurrect(unsigned char * space,void * arg)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
SHA512_Hash(unsigned char * dest,const char * src)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
SHA512_HashBuf(unsigned char * dest,const unsigned char * src,uint32 src_length)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 *
SHA512_NewContext(void)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
SHA512_DestroyContext(SHA512Context * cx,PRBool freeit)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
SHA512_Begin(SHA512Context * cx)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
SHA512_Update(SHA512Context * cx,const unsigned char * input,unsigned int inputLen)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
SHA512_End(SHA512Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
SHA512_TraceState(SHA512Context * cx)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
SHA512_FlattenSize(SHA512Context * cx)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
SHA512_Flatten(SHA512Context * cx,unsigned char * space)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 *
SHA512_Resurrect(unsigned char * space,void * arg)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
SHA384_Hash(unsigned char * dest,const char * src)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
SHA384_HashBuf(unsigned char * dest,const unsigned char * src,uint32 src_length)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 *
SHA384_NewContext(void)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
SHA384_DestroyContext(SHA384Context * cx,PRBool freeit)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
SHA384_Begin(SHA384Context * cx)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
SHA384_Update(SHA384Context * cx,const unsigned char * input,unsigned int inputLen)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
SHA384_End(SHA384Context * cx,unsigned char * digest,unsigned int * digestLen,unsigned int maxDigestLen)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
SHA384_TraceState(SHA384Context * cx)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
SHA384_FlattenSize(SHA384Context * cx)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
SHA384_Flatten(SHA384Context * cx,unsigned char * space)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 *
SHA384_Resurrect(unsigned char * space,void * arg)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 *
AESKeyWrap_CreateContext(const unsigned char * key,const unsigned char * iv,int encrypt,unsigned int keylen)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
AESKeyWrap_DestroyContext(AESKeyWrapContext * cx,PRBool freeit)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
AESKeyWrap_Encrypt(AESKeyWrapContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
AESKeyWrap_Decrypt(AESKeyWrapContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
BLAPI_SHVerify(const char * name,PRFuncPtr addr)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
BLAPI_VerifySelf(const char * name)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
EC_NewKey(ECParams * params,ECPrivateKey ** privKey)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
EC_NewKeyFromSeed(ECParams * params,ECPrivateKey ** privKey,const unsigned char * seed,int seedlen)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
EC_ValidatePublicKey(ECParams * params,SECItem * publicValue)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
ECDH_Derive(SECItem * publicValue,ECParams * params,SECItem * privateValue,PRBool withCofactor,SECItem * derivedSecret)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
ECDSA_SignDigest(ECPrivateKey * key,SECItem * signature,const SECItem * digest)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
ECDSA_VerifyDigest(ECPublicKey * key,const SECItem * signature,const SECItem * digest)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
ECDSA_SignDigestWithSeed(ECPrivateKey * key,SECItem * signature,const SECItem * digest,const unsigned char * seed,const int seedlen)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 *
AES_AllocateContext(void)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 *
AESKeyWrap_AllocateContext(void)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 *
DES_AllocateContext(void)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 *
RC2_AllocateContext(void)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 *
RC4_AllocateContext(void)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
AES_InitContext(AESContext * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int encrypt,unsigned int blocklen)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
AESKeyWrap_InitContext(AESKeyWrapContext * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int encrypt,unsigned int blocklen)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
DES_InitContext(DESContext * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int encrypt,unsigned int xtra)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
SEED_InitContext(SEEDContext * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int encrypt,unsigned int xtra)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
RC2_InitContext(RC2Context * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int effectiveKeyLen,unsigned int xtra)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
RC4_InitContext(RC4Context * cx,const unsigned char * key,unsigned int keylen,const unsigned char * x1,int x2,unsigned int x3,unsigned int x4)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
MD2_Clone(MD2Context * dest,MD2Context * src)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
MD5_Clone(MD5Context * dest,MD5Context * src)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
SHA1_Clone(SHA1Context * dest,SHA1Context * src)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
SHA256_Clone(SHA256Context * dest,SHA256Context * src)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
SHA384_Clone(SHA384Context * dest,SHA384Context * src)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
SHA512_Clone(SHA512Context * dest,SHA512Context * src)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
TLS_PRF(const SECItem * secret,const char * label,SECItem * seed,SECItem * result,PRBool isFIPS)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 *
HASH_GetRawHashObject(HASH_HashType hashType)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
HMAC_Destroy(HMACContext * cx,PRBool freeit)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 *
HMAC_Create(const SECHashObject * hashObj,const unsigned char * secret,unsigned int secret_len,PRBool isFIPS)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
HMAC_Init(HMACContext * cx,const SECHashObject * hashObj,const unsigned char * secret,unsigned int secret_len,PRBool isFIPS)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
HMAC_Begin(HMACContext * cx)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
HMAC_Update(HMACContext * cx,const unsigned char * data,unsigned int data_len)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
HMAC_Finish(HMACContext * cx,unsigned char * result,unsigned int * result_len,unsigned int max_result_len)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 *
HMAC_Clone(HMACContext * cx)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
RNG_SystemInfoForRNG(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
FIPS186Change_GenerateX(unsigned char * XKEY,const unsigned char * XSEEDj,unsigned char * x_j)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
FIPS186Change_ReduceModQForDSA(const unsigned char * w,const unsigned char * q,unsigned char * xj)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
Camellia_InitContext(CamelliaContext * cx,const unsigned char * key,unsigned int keylen,const unsigned char * iv,int mode,unsigned int encrypt,unsigned int unused)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 *
Camellia_AllocateContext(void)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 *
Camellia_CreateContext(const unsigned char * key,const unsigned char * iv,int mode,int encrypt,unsigned int keylen)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
Camellia_DestroyContext(CamelliaContext * cx,PRBool freeit)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
Camellia_Encrypt(CamelliaContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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
Camellia_Decrypt(CamelliaContext * cx,unsigned char * output,unsigned int * outputLen,unsigned int maxOutputLen,const unsigned char * input,unsigned int inputLen)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 
BL_SetForkState(PRBool forked)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
PRNGTEST_Instantiate(const PRUint8 * entropy,unsigned int entropy_len,const PRUint8 * nonce,unsigned int nonce_len,const PRUint8 * personal_string,unsigned int ps_len)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
PRNGTEST_Reseed(const PRUint8 * entropy,unsigned int entropy_len,const PRUint8 * additional,unsigned int additional_len)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
PRNGTEST_Generate(PRUint8 * bytes,unsigned int bytes_len,const PRUint8 * additional,unsigned int additional_len)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
PRNGTEST_Uninstantiate()1692 PRNGTEST_Uninstantiate()
1693 {
1694     if (!vector && PR_SUCCESS != freebl_RunLoaderOnce())
1695 	return SECFailure;
1696     return (vector->p_PRNGTEST_Uninstantiate)();
1697 }
1698 
1699 
1700