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