OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * crypto.h - public data structures and prototypes for the crypto library |
| 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) 1994-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: blapi.h,v 1.33 2009/03/29 03:45:32 wtc%google.com Exp $ */ |
| 41 |
| 42 #ifndef _BLAPI_H_ |
| 43 #define _BLAPI_H_ |
| 44 |
| 45 #include "blapit.h" |
| 46 #include "hasht.h" |
| 47 #include "alghmac.h" |
| 48 |
| 49 SEC_BEGIN_PROTOS |
| 50 |
| 51 /* |
| 52 ** RSA encryption/decryption. When encrypting/decrypting the output |
| 53 ** buffer must be at least the size of the public key modulus. |
| 54 */ |
| 55 |
| 56 extern SECStatus BL_Init(void); |
| 57 |
| 58 /* |
| 59 ** Generate and return a new RSA public and private key. |
| 60 ** Both keys are encoded in a single RSAPrivateKey structure. |
| 61 ** "cx" is the random number generator context |
| 62 ** "keySizeInBits" is the size of the key to be generated, in bits. |
| 63 ** 512, 1024, etc. |
| 64 ** "publicExponent" when not NULL is a pointer to some data that |
| 65 ** represents the public exponent to use. The data is a byte |
| 66 ** encoded integer, in "big endian" order. |
| 67 */ |
| 68 extern RSAPrivateKey *RSA_NewKey(int keySizeInBits, |
| 69 SECItem * publicExponent); |
| 70 |
| 71 /* |
| 72 ** Perform a raw public-key operation |
| 73 ** Length of input and output buffers are equal to key's modulus len. |
| 74 */ |
| 75 extern SECStatus RSA_PublicKeyOp(RSAPublicKey * key, |
| 76 unsigned char * output, |
| 77 const unsigned char * input); |
| 78 |
| 79 /* |
| 80 ** Perform a raw private-key operation |
| 81 ** Length of input and output buffers are equal to key's modulus len. |
| 82 */ |
| 83 extern SECStatus RSA_PrivateKeyOp(RSAPrivateKey * key, |
| 84 unsigned char * output, |
| 85 const unsigned char * input); |
| 86 |
| 87 /* |
| 88 ** Perform a raw private-key operation, and check the parameters used in |
| 89 ** the operation for validity by performing a test operation first. |
| 90 ** Length of input and output buffers are equal to key's modulus len. |
| 91 */ |
| 92 extern SECStatus RSA_PrivateKeyOpDoubleChecked(RSAPrivateKey * key, |
| 93 unsigned char * output, |
| 94 const unsigned char * input); |
| 95 |
| 96 /* |
| 97 ** Perform a check of private key parameters for consistency. |
| 98 */ |
| 99 extern SECStatus RSA_PrivateKeyCheck(RSAPrivateKey *key); |
| 100 |
| 101 |
| 102 /******************************************************************** |
| 103 ** DSA signing algorithm |
| 104 */ |
| 105 |
| 106 /* |
| 107 ** Generate and return a new DSA public and private key pair, |
| 108 ** both of which are encoded into a single DSAPrivateKey struct. |
| 109 ** "params" is a pointer to the PQG parameters for the domain |
| 110 ** Uses a random seed. |
| 111 */ |
| 112 extern SECStatus DSA_NewKey(const PQGParams * params, |
| 113 DSAPrivateKey ** privKey); |
| 114 |
| 115 /* signature is caller-supplied buffer of at least 20 bytes. |
| 116 ** On input, signature->len == size of buffer to hold signature. |
| 117 ** digest->len == size of digest. |
| 118 ** On output, signature->len == size of signature in buffer. |
| 119 ** Uses a random seed. |
| 120 */ |
| 121 extern SECStatus DSA_SignDigest(DSAPrivateKey * key, |
| 122 SECItem * signature, |
| 123 const SECItem * digest); |
| 124 |
| 125 /* signature is caller-supplied buffer of at least 20 bytes. |
| 126 ** On input, signature->len == size of buffer to hold signature. |
| 127 ** digest->len == size of digest. |
| 128 */ |
| 129 extern SECStatus DSA_VerifyDigest(DSAPublicKey * key, |
| 130 const SECItem * signature, |
| 131 const SECItem * digest); |
| 132 |
| 133 /* For FIPS compliance testing. Seed must be exactly 20 bytes long */ |
| 134 extern SECStatus DSA_NewKeyFromSeed(const PQGParams *params, |
| 135 const unsigned char * seed, |
| 136 DSAPrivateKey **privKey); |
| 137 |
| 138 /* For FIPS compliance testing. Seed must be exactly 20 bytes. */ |
| 139 extern SECStatus DSA_SignDigestWithSeed(DSAPrivateKey * key, |
| 140 SECItem * signature, |
| 141 const SECItem * digest, |
| 142 const unsigned char * seed); |
| 143 |
| 144 /****************************************************** |
| 145 ** Diffie Helman key exchange algorithm |
| 146 */ |
| 147 |
| 148 /* Generates parameters for Diffie-Helman key generation. |
| 149 ** primeLen is the length in bytes of prime P to be generated. |
| 150 */ |
| 151 extern SECStatus DH_GenParam(int primeLen, DHParams ** params); |
| 152 |
| 153 /* Generates a public and private key, both of which are encoded in a single |
| 154 ** DHPrivateKey struct. Params is input, privKey are output. |
| 155 ** This is Phase 1 of Diffie Hellman. |
| 156 */ |
| 157 extern SECStatus DH_NewKey(DHParams * params, |
| 158 DHPrivateKey ** privKey); |
| 159 |
| 160 /* |
| 161 ** DH_Derive does the Diffie-Hellman phase 2 calculation, using the |
| 162 ** other party's publicValue, and the prime and our privateValue. |
| 163 ** maxOutBytes is the requested length of the generated secret in bytes. |
| 164 ** A zero value means produce a value of any length up to the size of |
| 165 ** the prime. If successful, derivedSecret->data is set |
| 166 ** to the address of the newly allocated buffer containing the derived |
| 167 ** secret, and derivedSecret->len is the size of the secret produced. |
| 168 ** The size of the secret produced will never be larger than the length |
| 169 ** of the prime, and it may be smaller than maxOutBytes. |
| 170 ** It is the caller's responsibility to free the allocated buffer |
| 171 ** containing the derived secret. |
| 172 */ |
| 173 extern SECStatus DH_Derive(SECItem * publicValue, |
| 174 SECItem * prime, |
| 175 SECItem * privateValue, |
| 176 SECItem * derivedSecret, |
| 177 unsigned int maxOutBytes); |
| 178 |
| 179 /* |
| 180 ** KEA_CalcKey returns octet string with the private key for a dual |
| 181 ** Diffie-Helman key generation as specified for government key exchange. |
| 182 */ |
| 183 extern SECStatus KEA_Derive(SECItem *prime, |
| 184 SECItem *public1, |
| 185 SECItem *public2, |
| 186 SECItem *private1, |
| 187 SECItem *private2, |
| 188 SECItem *derivedSecret); |
| 189 |
| 190 /* |
| 191 * verify that a KEA or DSA public key is a valid key for this prime and |
| 192 * subprime domain. |
| 193 */ |
| 194 extern PRBool KEA_Verify(SECItem *Y, SECItem *prime, SECItem *subPrime); |
| 195 |
| 196 /****************************************************** |
| 197 ** Elliptic Curve algorithms |
| 198 */ |
| 199 |
| 200 /* Generates a public and private key, both of which are encoded |
| 201 ** in a single ECPrivateKey struct. Params is input, privKey are |
| 202 ** output. |
| 203 */ |
| 204 extern SECStatus EC_NewKey(ECParams * params, |
| 205 ECPrivateKey ** privKey); |
| 206 |
| 207 extern SECStatus EC_NewKeyFromSeed(ECParams * params, |
| 208 ECPrivateKey ** privKey, |
| 209 const unsigned char* seed, |
| 210 int seedlen); |
| 211 |
| 212 /* Validates an EC public key as described in Section 5.2.2 of |
| 213 * X9.62. Such validation prevents against small subgroup attacks |
| 214 * when the ECDH primitive is used with the cofactor. |
| 215 */ |
| 216 extern SECStatus EC_ValidatePublicKey(ECParams * params, |
| 217 SECItem * publicValue); |
| 218 |
| 219 /* |
| 220 ** ECDH_Derive performs a scalar point multiplication of a point |
| 221 ** representing a (peer's) public key and a large integer representing |
| 222 ** a private key (its own). Both keys must use the same elliptic curve |
| 223 ** parameters. If the withCofactor parameter is true, the |
| 224 ** multiplication also uses the cofactor associated with the curve |
| 225 ** parameters. The output of this scheme is the x-coordinate of the |
| 226 ** resulting point. If successful, derivedSecret->data is set to the |
| 227 ** address of the newly allocated buffer containing the derived |
| 228 ** secret, and derivedSecret->len is the size of the secret |
| 229 ** produced. It is the caller's responsibility to free the allocated |
| 230 ** buffer containing the derived secret. |
| 231 */ |
| 232 extern SECStatus ECDH_Derive(SECItem * publicValue, |
| 233 ECParams * params, |
| 234 SECItem * privateValue, |
| 235 PRBool withCofactor, |
| 236 SECItem * derivedSecret); |
| 237 |
| 238 /* On input, signature->len == size of buffer to hold signature. |
| 239 ** digest->len == size of digest. |
| 240 ** On output, signature->len == size of signature in buffer. |
| 241 ** Uses a random seed. |
| 242 */ |
| 243 extern SECStatus ECDSA_SignDigest(ECPrivateKey *key, |
| 244 SECItem *signature, |
| 245 const SECItem *digest); |
| 246 |
| 247 /* On input, signature->len == size of buffer to hold signature. |
| 248 ** digest->len == size of digest. |
| 249 */ |
| 250 extern SECStatus ECDSA_VerifyDigest(ECPublicKey *key, |
| 251 const SECItem *signature, |
| 252 const SECItem *digest); |
| 253 |
| 254 /* Uses the provided seed. */ |
| 255 extern SECStatus ECDSA_SignDigestWithSeed(ECPrivateKey *key, |
| 256 SECItem *signature, |
| 257 const SECItem *digest, |
| 258 const unsigned char *seed, |
| 259 const int seedlen); |
| 260 |
| 261 /******************************************/ |
| 262 /* |
| 263 ** RC4 symmetric stream cypher |
| 264 */ |
| 265 |
| 266 /* |
| 267 ** Create a new RC4 context suitable for RC4 encryption/decryption. |
| 268 ** "key" raw key data |
| 269 ** "len" the number of bytes of key data |
| 270 */ |
| 271 extern RC4Context *RC4_CreateContext(const unsigned char *key, int len); |
| 272 |
| 273 extern RC4Context *RC4_AllocateContext(void); |
| 274 extern SECStatus RC4_InitContext(RC4Context *cx, |
| 275 const unsigned char *key, |
| 276 unsigned int keylen, |
| 277 const unsigned char *, |
| 278 int, |
| 279 unsigned int , |
| 280 unsigned int ); |
| 281 |
| 282 /* |
| 283 ** Destroy an RC4 encryption/decryption context. |
| 284 ** "cx" the context |
| 285 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 286 */ |
| 287 extern void RC4_DestroyContext(RC4Context *cx, PRBool freeit); |
| 288 |
| 289 /* |
| 290 ** Perform RC4 encryption. |
| 291 ** "cx" the context |
| 292 ** "output" the output buffer to store the encrypted data. |
| 293 ** "outputLen" how much data is stored in "output". Set by the routine |
| 294 ** after some data is stored in output. |
| 295 ** "maxOutputLen" the maximum amount of data that can ever be |
| 296 ** stored in "output" |
| 297 ** "input" the input data |
| 298 ** "inputLen" the amount of input data |
| 299 */ |
| 300 extern SECStatus RC4_Encrypt(RC4Context *cx, unsigned char *output, |
| 301 unsigned int *outputLen, unsigned int maxOutputLen, |
| 302 const unsigned char *input, unsigned int inputLen); |
| 303 |
| 304 /* |
| 305 ** Perform RC4 decryption. |
| 306 ** "cx" the context |
| 307 ** "output" the output buffer to store the decrypted data. |
| 308 ** "outputLen" how much data is stored in "output". Set by the routine |
| 309 ** after some data is stored in output. |
| 310 ** "maxOutputLen" the maximum amount of data that can ever be |
| 311 ** stored in "output" |
| 312 ** "input" the input data |
| 313 ** "inputLen" the amount of input data |
| 314 */ |
| 315 extern SECStatus RC4_Decrypt(RC4Context *cx, unsigned char *output, |
| 316 unsigned int *outputLen, unsigned int maxOutputLen, |
| 317 const unsigned char *input, unsigned int inputLen); |
| 318 |
| 319 /******************************************/ |
| 320 /* |
| 321 ** RC2 symmetric block cypher |
| 322 */ |
| 323 |
| 324 /* |
| 325 ** Create a new RC2 context suitable for RC2 encryption/decryption. |
| 326 ** "key" raw key data |
| 327 ** "len" the number of bytes of key data |
| 328 ** "iv" is the CBC initialization vector (if mode is NSS_RC2_CBC) |
| 329 ** "mode" one of NSS_RC2 or NSS_RC2_CBC |
| 330 ** "effectiveKeyLen" is the effective key length (as specified in |
| 331 ** RFC 2268) in bytes (not bits). |
| 332 ** |
| 333 ** When mode is set to NSS_RC2_CBC the RC2 cipher is run in "cipher block |
| 334 ** chaining" mode. |
| 335 */ |
| 336 extern RC2Context *RC2_CreateContext(const unsigned char *key, unsigned int len, |
| 337 const unsigned char *iv, int mode, |
| 338 unsigned effectiveKeyLen); |
| 339 extern RC2Context *RC2_AllocateContext(void); |
| 340 extern SECStatus RC2_InitContext(RC2Context *cx, |
| 341 const unsigned char *key, |
| 342 unsigned int keylen, |
| 343 const unsigned char *iv, |
| 344 int mode, |
| 345 unsigned int effectiveKeyLen, |
| 346 unsigned int ); |
| 347 |
| 348 /* |
| 349 ** Destroy an RC2 encryption/decryption context. |
| 350 ** "cx" the context |
| 351 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 352 */ |
| 353 extern void RC2_DestroyContext(RC2Context *cx, PRBool freeit); |
| 354 |
| 355 /* |
| 356 ** Perform RC2 encryption. |
| 357 ** "cx" the context |
| 358 ** "output" the output buffer to store the encrypted data. |
| 359 ** "outputLen" how much data is stored in "output". Set by the routine |
| 360 ** after some data is stored in output. |
| 361 ** "maxOutputLen" the maximum amount of data that can ever be |
| 362 ** stored in "output" |
| 363 ** "input" the input data |
| 364 ** "inputLen" the amount of input data |
| 365 */ |
| 366 extern SECStatus RC2_Encrypt(RC2Context *cx, unsigned char *output, |
| 367 unsigned int *outputLen, unsigned int maxOutputLen, |
| 368 const unsigned char *input, unsigned int inputLen); |
| 369 |
| 370 /* |
| 371 ** Perform RC2 decryption. |
| 372 ** "cx" the context |
| 373 ** "output" the output buffer to store the decrypted data. |
| 374 ** "outputLen" how much data is stored in "output". Set by the routine |
| 375 ** after some data is stored in output. |
| 376 ** "maxOutputLen" the maximum amount of data that can ever be |
| 377 ** stored in "output" |
| 378 ** "input" the input data |
| 379 ** "inputLen" the amount of input data |
| 380 */ |
| 381 extern SECStatus RC2_Decrypt(RC2Context *cx, unsigned char *output, |
| 382 unsigned int *outputLen, unsigned int maxOutputLen, |
| 383 const unsigned char *input, unsigned int inputLen); |
| 384 |
| 385 /******************************************/ |
| 386 /* |
| 387 ** RC5 symmetric block cypher -- 64-bit block size |
| 388 */ |
| 389 |
| 390 /* |
| 391 ** Create a new RC5 context suitable for RC5 encryption/decryption. |
| 392 ** "key" raw key data |
| 393 ** "len" the number of bytes of key data |
| 394 ** "iv" is the CBC initialization vector (if mode is NSS_RC5_CBC) |
| 395 ** "mode" one of NSS_RC5 or NSS_RC5_CBC |
| 396 ** |
| 397 ** When mode is set to NSS_RC5_CBC the RC5 cipher is run in "cipher block |
| 398 ** chaining" mode. |
| 399 */ |
| 400 extern RC5Context *RC5_CreateContext(const SECItem *key, unsigned int rounds, |
| 401 unsigned int wordSize, const unsigned char *iv, int mode); |
| 402 extern RC5Context *RC5_AllocateContext(void); |
| 403 extern SECStatus RC5_InitContext(RC5Context *cx, |
| 404 const unsigned char *key, |
| 405 unsigned int keylen, |
| 406 const unsigned char *iv, |
| 407 int mode, |
| 408 unsigned int rounds, |
| 409 unsigned int wordSize); |
| 410 |
| 411 /* |
| 412 ** Destroy an RC5 encryption/decryption context. |
| 413 ** "cx" the context |
| 414 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 415 */ |
| 416 extern void RC5_DestroyContext(RC5Context *cx, PRBool freeit); |
| 417 |
| 418 /* |
| 419 ** Perform RC5 encryption. |
| 420 ** "cx" the context |
| 421 ** "output" the output buffer to store the encrypted data. |
| 422 ** "outputLen" how much data is stored in "output". Set by the routine |
| 423 ** after some data is stored in output. |
| 424 ** "maxOutputLen" the maximum amount of data that can ever be |
| 425 ** stored in "output" |
| 426 ** "input" the input data |
| 427 ** "inputLen" the amount of input data |
| 428 */ |
| 429 extern SECStatus RC5_Encrypt(RC5Context *cx, unsigned char *output, |
| 430 unsigned int *outputLen, unsigned int maxOutputLen, |
| 431 const unsigned char *input, unsigned int inputLen); |
| 432 |
| 433 /* |
| 434 ** Perform RC5 decryption. |
| 435 ** "cx" the context |
| 436 ** "output" the output buffer to store the decrypted data. |
| 437 ** "outputLen" how much data is stored in "output". Set by the routine |
| 438 ** after some data is stored in output. |
| 439 ** "maxOutputLen" the maximum amount of data that can ever be |
| 440 ** stored in "output" |
| 441 ** "input" the input data |
| 442 ** "inputLen" the amount of input data |
| 443 */ |
| 444 |
| 445 extern SECStatus RC5_Decrypt(RC5Context *cx, unsigned char *output, |
| 446 unsigned int *outputLen, unsigned int maxOutputLen, |
| 447 const unsigned char *input, unsigned int inputLen); |
| 448 |
| 449 |
| 450 |
| 451 /******************************************/ |
| 452 /* |
| 453 ** DES symmetric block cypher |
| 454 */ |
| 455 |
| 456 /* |
| 457 ** Create a new DES context suitable for DES encryption/decryption. |
| 458 ** "key" raw key data |
| 459 ** "len" the number of bytes of key data |
| 460 ** "iv" is the CBC initialization vector (if mode is NSS_DES_CBC or |
| 461 ** mode is DES_EDE3_CBC) |
| 462 ** "mode" one of NSS_DES, NSS_DES_CBC, NSS_DES_EDE3 or NSS_DES_EDE3_CBC |
| 463 ** "encrypt" is PR_TRUE if the context will be used for encryption |
| 464 ** |
| 465 ** When mode is set to NSS_DES_CBC or NSS_DES_EDE3_CBC then the DES |
| 466 ** cipher is run in "cipher block chaining" mode. |
| 467 */ |
| 468 extern DESContext *DES_CreateContext(const unsigned char *key, |
| 469 const unsigned char *iv, |
| 470 int mode, PRBool encrypt); |
| 471 extern DESContext *DES_AllocateContext(void); |
| 472 extern SECStatus DES_InitContext(DESContext *cx, |
| 473 const unsigned char *key, |
| 474 unsigned int keylen, |
| 475 const unsigned char *iv, |
| 476 int mode, |
| 477 unsigned int encrypt, |
| 478 unsigned int ); |
| 479 |
| 480 /* |
| 481 ** Destroy an DES encryption/decryption context. |
| 482 ** "cx" the context |
| 483 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 484 */ |
| 485 extern void DES_DestroyContext(DESContext *cx, PRBool freeit); |
| 486 |
| 487 /* |
| 488 ** Perform DES encryption. |
| 489 ** "cx" the context |
| 490 ** "output" the output buffer to store the encrypted data. |
| 491 ** "outputLen" how much data is stored in "output". Set by the routine |
| 492 ** after some data is stored in output. |
| 493 ** "maxOutputLen" the maximum amount of data that can ever be |
| 494 ** stored in "output" |
| 495 ** "input" the input data |
| 496 ** "inputLen" the amount of input data |
| 497 ** |
| 498 ** NOTE: the inputLen must be a multiple of DES_KEY_LENGTH |
| 499 */ |
| 500 extern SECStatus DES_Encrypt(DESContext *cx, unsigned char *output, |
| 501 unsigned int *outputLen, unsigned int maxOutputLen, |
| 502 const unsigned char *input, unsigned int inputLen); |
| 503 |
| 504 /* |
| 505 ** Perform DES decryption. |
| 506 ** "cx" the context |
| 507 ** "output" the output buffer to store the decrypted data. |
| 508 ** "outputLen" how much data is stored in "output". Set by the routine |
| 509 ** after some data is stored in output. |
| 510 ** "maxOutputLen" the maximum amount of data that can ever be |
| 511 ** stored in "output" |
| 512 ** "input" the input data |
| 513 ** "inputLen" the amount of input data |
| 514 ** |
| 515 ** NOTE: the inputLen must be a multiple of DES_KEY_LENGTH |
| 516 */ |
| 517 extern SECStatus DES_Decrypt(DESContext *cx, unsigned char *output, |
| 518 unsigned int *outputLen, unsigned int maxOutputLen, |
| 519 const unsigned char *input, unsigned int inputLen); |
| 520 |
| 521 /******************************************/ |
| 522 /* |
| 523 ** SEED symmetric block cypher |
| 524 */ |
| 525 extern SEEDContext * |
| 526 SEED_CreateContext(const unsigned char *key, const unsigned char *iv, |
| 527 int mode, PRBool encrypt); |
| 528 extern SEEDContext *SEED_AllocateContext(void); |
| 529 extern SECStatus SEED_InitContext(SEEDContext *cx, |
| 530 const unsigned char *key, |
| 531 unsigned int keylen, |
| 532 const unsigned char *iv, |
| 533 int mode, unsigned int encrypt, |
| 534 unsigned int ); |
| 535 extern void SEED_DestroyContext(SEEDContext *cx, PRBool freeit); |
| 536 extern SECStatus |
| 537 SEED_Encrypt(SEEDContext *cx, unsigned char *output, |
| 538 unsigned int *outputLen, unsigned int maxOutputLen, |
| 539 const unsigned char *input, unsigned int inputLen); |
| 540 extern SECStatus |
| 541 SEED_Decrypt(SEEDContext *cx, unsigned char *output, |
| 542 unsigned int *outputLen, unsigned int maxOutputLen, |
| 543 const unsigned char *input, unsigned int inputLen); |
| 544 |
| 545 /******************************************/ |
| 546 /* |
| 547 ** AES symmetric block cypher (Rijndael) |
| 548 */ |
| 549 |
| 550 /* |
| 551 ** Create a new AES context suitable for AES encryption/decryption. |
| 552 ** "key" raw key data |
| 553 ** "keylen" the number of bytes of key data (16, 24, or 32) |
| 554 ** "blocklen" is the blocksize to use (16, 24, or 32) |
| 555 ** XXX currently only blocksize==16 has been tested! |
| 556 */ |
| 557 extern AESContext * |
| 558 AES_CreateContext(const unsigned char *key, const unsigned char *iv, |
| 559 int mode, int encrypt, |
| 560 unsigned int keylen, unsigned int blocklen); |
| 561 extern AESContext *AES_AllocateContext(void); |
| 562 extern SECStatus AES_InitContext(AESContext *cx, |
| 563 const unsigned char *key, |
| 564 unsigned int keylen, |
| 565 const unsigned char *iv, |
| 566 int mode, |
| 567 unsigned int encrypt, |
| 568 unsigned int blocklen); |
| 569 |
| 570 /* |
| 571 ** Destroy a AES encryption/decryption context. |
| 572 ** "cx" the context |
| 573 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 574 */ |
| 575 extern void |
| 576 AES_DestroyContext(AESContext *cx, PRBool freeit); |
| 577 |
| 578 /* |
| 579 ** Perform AES encryption. |
| 580 ** "cx" the context |
| 581 ** "output" the output buffer to store the encrypted data. |
| 582 ** "outputLen" how much data is stored in "output". Set by the routine |
| 583 ** after some data is stored in output. |
| 584 ** "maxOutputLen" the maximum amount of data that can ever be |
| 585 ** stored in "output" |
| 586 ** "input" the input data |
| 587 ** "inputLen" the amount of input data |
| 588 */ |
| 589 extern SECStatus |
| 590 AES_Encrypt(AESContext *cx, unsigned char *output, |
| 591 unsigned int *outputLen, unsigned int maxOutputLen, |
| 592 const unsigned char *input, unsigned int inputLen); |
| 593 |
| 594 /* |
| 595 ** Perform AES decryption. |
| 596 ** "cx" the context |
| 597 ** "output" the output buffer to store the decrypted data. |
| 598 ** "outputLen" how much data is stored in "output". Set by the routine |
| 599 ** after some data is stored in output. |
| 600 ** "maxOutputLen" the maximum amount of data that can ever be |
| 601 ** stored in "output" |
| 602 ** "input" the input data |
| 603 ** "inputLen" the amount of input data |
| 604 */ |
| 605 extern SECStatus |
| 606 AES_Decrypt(AESContext *cx, unsigned char *output, |
| 607 unsigned int *outputLen, unsigned int maxOutputLen, |
| 608 const unsigned char *input, unsigned int inputLen); |
| 609 |
| 610 /******************************************/ |
| 611 /* |
| 612 ** AES key wrap algorithm, RFC 3394 |
| 613 */ |
| 614 |
| 615 /* |
| 616 ** Create a new AES context suitable for AES encryption/decryption. |
| 617 ** "key" raw key data |
| 618 ** "iv" The 8 byte "initial value" |
| 619 ** "encrypt", a boolean, true for key wrapping, false for unwrapping. |
| 620 ** "keylen" the number of bytes of key data (16, 24, or 32) |
| 621 */ |
| 622 extern AESKeyWrapContext * |
| 623 AESKeyWrap_CreateContext(const unsigned char *key, const unsigned char *iv, |
| 624 int encrypt, unsigned int keylen); |
| 625 extern AESKeyWrapContext * AESKeyWrap_AllocateContext(void); |
| 626 extern SECStatus |
| 627 AESKeyWrap_InitContext(AESKeyWrapContext *cx, |
| 628 const unsigned char *key, |
| 629 unsigned int keylen, |
| 630 const unsigned char *iv, |
| 631 int , |
| 632 unsigned int encrypt, |
| 633 unsigned int ); |
| 634 |
| 635 /* |
| 636 ** Destroy a AES KeyWrap context. |
| 637 ** "cx" the context |
| 638 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 639 */ |
| 640 extern void |
| 641 AESKeyWrap_DestroyContext(AESKeyWrapContext *cx, PRBool freeit); |
| 642 |
| 643 /* |
| 644 ** Perform AES key wrap. |
| 645 ** "cx" the context |
| 646 ** "output" the output buffer to store the encrypted data. |
| 647 ** "outputLen" how much data is stored in "output". Set by the routine |
| 648 ** after some data is stored in output. |
| 649 ** "maxOutputLen" the maximum amount of data that can ever be |
| 650 ** stored in "output" |
| 651 ** "input" the input data |
| 652 ** "inputLen" the amount of input data |
| 653 */ |
| 654 extern SECStatus |
| 655 AESKeyWrap_Encrypt(AESKeyWrapContext *cx, unsigned char *output, |
| 656 unsigned int *outputLen, unsigned int maxOutputLen, |
| 657 const unsigned char *input, unsigned int inputLen); |
| 658 |
| 659 /* |
| 660 ** Perform AES key unwrap. |
| 661 ** "cx" the context |
| 662 ** "output" the output buffer to store the decrypted data. |
| 663 ** "outputLen" how much data is stored in "output". Set by the routine |
| 664 ** after some data is stored in output. |
| 665 ** "maxOutputLen" the maximum amount of data that can ever be |
| 666 ** stored in "output" |
| 667 ** "input" the input data |
| 668 ** "inputLen" the amount of input data |
| 669 */ |
| 670 extern SECStatus |
| 671 AESKeyWrap_Decrypt(AESKeyWrapContext *cx, unsigned char *output, |
| 672 unsigned int *outputLen, unsigned int maxOutputLen, |
| 673 const unsigned char *input, unsigned int inputLen); |
| 674 |
| 675 /******************************************/ |
| 676 /* |
| 677 ** Camellia symmetric block cypher |
| 678 */ |
| 679 |
| 680 /* |
| 681 ** Create a new Camellia context suitable for Camellia encryption/decryption. |
| 682 ** "key" raw key data |
| 683 ** "keylen" the number of bytes of key data (16, 24, or 32) |
| 684 */ |
| 685 extern CamelliaContext * |
| 686 Camellia_CreateContext(const unsigned char *key, const unsigned char *iv, |
| 687 int mode, int encrypt, unsigned int keylen); |
| 688 |
| 689 extern CamelliaContext *Camellia_AllocateContext(void); |
| 690 extern SECStatus Camellia_InitContext(CamelliaContext *cx, |
| 691 const unsigned char *key, |
| 692 unsigned int keylen, |
| 693 const unsigned char *iv, |
| 694 int mode, |
| 695 unsigned int encrypt, |
| 696 unsigned int unused); |
| 697 /* |
| 698 ** Destroy a Camellia encryption/decryption context. |
| 699 ** "cx" the context |
| 700 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 701 */ |
| 702 extern void |
| 703 Camellia_DestroyContext(CamelliaContext *cx, PRBool freeit); |
| 704 |
| 705 /* |
| 706 ** Perform Camellia encryption. |
| 707 ** "cx" the context |
| 708 ** "output" the output buffer to store the encrypted data. |
| 709 ** "outputLen" how much data is stored in "output". Set by the routine |
| 710 ** after some data is stored in output. |
| 711 ** "maxOutputLen" the maximum amount of data that can ever be |
| 712 ** stored in "output" |
| 713 ** "input" the input data |
| 714 ** "inputLen" the amount of input data |
| 715 */ |
| 716 extern SECStatus |
| 717 Camellia_Encrypt(CamelliaContext *cx, unsigned char *output, |
| 718 unsigned int *outputLen, unsigned int maxOutputLen, |
| 719 const unsigned char *input, unsigned int inputLen); |
| 720 |
| 721 /* |
| 722 ** Perform Camellia decryption. |
| 723 ** "cx" the context |
| 724 ** "output" the output buffer to store the decrypted data. |
| 725 ** "outputLen" how much data is stored in "output". Set by the routine |
| 726 ** after some data is stored in output. |
| 727 ** "maxOutputLen" the maximum amount of data that can ever be |
| 728 ** stored in "output" |
| 729 ** "input" the input data |
| 730 ** "inputLen" the amount of input data |
| 731 */ |
| 732 extern SECStatus |
| 733 Camellia_Decrypt(CamelliaContext *cx, unsigned char *output, |
| 734 unsigned int *outputLen, unsigned int maxOutputLen, |
| 735 const unsigned char *input, unsigned int inputLen); |
| 736 |
| 737 |
| 738 /******************************************/ |
| 739 /* |
| 740 ** MD5 secure hash function |
| 741 */ |
| 742 |
| 743 /* |
| 744 ** Hash a null terminated string "src" into "dest" using MD5 |
| 745 */ |
| 746 extern SECStatus MD5_Hash(unsigned char *dest, const char *src); |
| 747 |
| 748 /* |
| 749 ** Hash a non-null terminated string "src" into "dest" using MD5 |
| 750 */ |
| 751 extern SECStatus MD5_HashBuf(unsigned char *dest, const unsigned char *src, |
| 752 uint32 src_length); |
| 753 |
| 754 /* |
| 755 ** Create a new MD5 context |
| 756 */ |
| 757 extern MD5Context *MD5_NewContext(void); |
| 758 |
| 759 |
| 760 /* |
| 761 ** Destroy an MD5 secure hash context. |
| 762 ** "cx" the context |
| 763 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 764 */ |
| 765 extern void MD5_DestroyContext(MD5Context *cx, PRBool freeit); |
| 766 |
| 767 /* |
| 768 ** Reset an MD5 context, preparing it for a fresh round of hashing |
| 769 */ |
| 770 extern void MD5_Begin(MD5Context *cx); |
| 771 |
| 772 /* |
| 773 ** Update the MD5 hash function with more data. |
| 774 ** "cx" the context |
| 775 ** "input" the data to hash |
| 776 ** "inputLen" the amount of data to hash |
| 777 */ |
| 778 extern void MD5_Update(MD5Context *cx, |
| 779 const unsigned char *input, unsigned int inputLen); |
| 780 |
| 781 /* |
| 782 ** Finish the MD5 hash function. Produce the digested results in "digest" |
| 783 ** "cx" the context |
| 784 ** "digest" where the 16 bytes of digest data are stored |
| 785 ** "digestLen" where the digest length (16) is stored |
| 786 ** "maxDigestLen" the maximum amount of data that can ever be |
| 787 ** stored in "digest" |
| 788 */ |
| 789 extern void MD5_End(MD5Context *cx, unsigned char *digest, |
| 790 unsigned int *digestLen, unsigned int maxDigestLen); |
| 791 |
| 792 /* |
| 793 * Return the the size of a buffer needed to flatten the MD5 Context into |
| 794 * "cx" the context |
| 795 * returns size; |
| 796 */ |
| 797 extern unsigned int MD5_FlattenSize(MD5Context *cx); |
| 798 |
| 799 /* |
| 800 * Flatten the MD5 Context into a buffer: |
| 801 * "cx" the context |
| 802 * "space" the buffer to flatten to |
| 803 * returns status; |
| 804 */ |
| 805 extern SECStatus MD5_Flatten(MD5Context *cx,unsigned char *space); |
| 806 |
| 807 /* |
| 808 * Resurrect a flattened context into a MD5 Context |
| 809 * "space" the buffer of the flattend buffer |
| 810 * "arg" ptr to void used by cryptographic resurrect |
| 811 * returns resurected context; |
| 812 */ |
| 813 extern MD5Context * MD5_Resurrect(unsigned char *space, void *arg); |
| 814 extern void MD5_Clone(MD5Context *dest, MD5Context *src); |
| 815 |
| 816 /* |
| 817 ** trace the intermediate state info of the MD5 hash. |
| 818 */ |
| 819 extern void MD5_TraceState(MD5Context *cx); |
| 820 |
| 821 |
| 822 /******************************************/ |
| 823 /* |
| 824 ** MD2 secure hash function |
| 825 */ |
| 826 |
| 827 /* |
| 828 ** Hash a null terminated string "src" into "dest" using MD2 |
| 829 */ |
| 830 extern SECStatus MD2_Hash(unsigned char *dest, const char *src); |
| 831 |
| 832 /* |
| 833 ** Create a new MD2 context |
| 834 */ |
| 835 extern MD2Context *MD2_NewContext(void); |
| 836 |
| 837 |
| 838 /* |
| 839 ** Destroy an MD2 secure hash context. |
| 840 ** "cx" the context |
| 841 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 842 */ |
| 843 extern void MD2_DestroyContext(MD2Context *cx, PRBool freeit); |
| 844 |
| 845 /* |
| 846 ** Reset an MD2 context, preparing it for a fresh round of hashing |
| 847 */ |
| 848 extern void MD2_Begin(MD2Context *cx); |
| 849 |
| 850 /* |
| 851 ** Update the MD2 hash function with more data. |
| 852 ** "cx" the context |
| 853 ** "input" the data to hash |
| 854 ** "inputLen" the amount of data to hash |
| 855 */ |
| 856 extern void MD2_Update(MD2Context *cx, |
| 857 const unsigned char *input, unsigned int inputLen); |
| 858 |
| 859 /* |
| 860 ** Finish the MD2 hash function. Produce the digested results in "digest" |
| 861 ** "cx" the context |
| 862 ** "digest" where the 16 bytes of digest data are stored |
| 863 ** "digestLen" where the digest length (16) is stored |
| 864 ** "maxDigestLen" the maximum amount of data that can ever be |
| 865 ** stored in "digest" |
| 866 */ |
| 867 extern void MD2_End(MD2Context *cx, unsigned char *digest, |
| 868 unsigned int *digestLen, unsigned int maxDigestLen); |
| 869 |
| 870 /* |
| 871 * Return the the size of a buffer needed to flatten the MD2 Context into |
| 872 * "cx" the context |
| 873 * returns size; |
| 874 */ |
| 875 extern unsigned int MD2_FlattenSize(MD2Context *cx); |
| 876 |
| 877 /* |
| 878 * Flatten the MD2 Context into a buffer: |
| 879 * "cx" the context |
| 880 * "space" the buffer to flatten to |
| 881 * returns status; |
| 882 */ |
| 883 extern SECStatus MD2_Flatten(MD2Context *cx,unsigned char *space); |
| 884 |
| 885 /* |
| 886 * Resurrect a flattened context into a MD2 Context |
| 887 * "space" the buffer of the flattend buffer |
| 888 * "arg" ptr to void used by cryptographic resurrect |
| 889 * returns resurected context; |
| 890 */ |
| 891 extern MD2Context * MD2_Resurrect(unsigned char *space, void *arg); |
| 892 extern void MD2_Clone(MD2Context *dest, MD2Context *src); |
| 893 |
| 894 /******************************************/ |
| 895 /* |
| 896 ** SHA-1 secure hash function |
| 897 */ |
| 898 |
| 899 /* |
| 900 ** Hash a null terminated string "src" into "dest" using SHA-1 |
| 901 */ |
| 902 extern SECStatus SHA1_Hash(unsigned char *dest, const char *src); |
| 903 |
| 904 /* |
| 905 ** Hash a non-null terminated string "src" into "dest" using SHA-1 |
| 906 */ |
| 907 extern SECStatus SHA1_HashBuf(unsigned char *dest, const unsigned char *src, |
| 908 uint32 src_length); |
| 909 |
| 910 /* |
| 911 ** Create a new SHA-1 context |
| 912 */ |
| 913 extern SHA1Context *SHA1_NewContext(void); |
| 914 |
| 915 |
| 916 /* |
| 917 ** Destroy a SHA-1 secure hash context. |
| 918 ** "cx" the context |
| 919 ** "freeit" if PR_TRUE then free the object as well as its sub-objects |
| 920 */ |
| 921 extern void SHA1_DestroyContext(SHA1Context *cx, PRBool freeit); |
| 922 |
| 923 /* |
| 924 ** Reset a SHA-1 context, preparing it for a fresh round of hashing |
| 925 */ |
| 926 extern void SHA1_Begin(SHA1Context *cx); |
| 927 |
| 928 /* |
| 929 ** Update the SHA-1 hash function with more data. |
| 930 ** "cx" the context |
| 931 ** "input" the data to hash |
| 932 ** "inputLen" the amount of data to hash |
| 933 */ |
| 934 extern void SHA1_Update(SHA1Context *cx, const unsigned char *input, |
| 935 unsigned int inputLen); |
| 936 |
| 937 /* |
| 938 ** Finish the SHA-1 hash function. Produce the digested results in "digest" |
| 939 ** "cx" the context |
| 940 ** "digest" where the 16 bytes of digest data are stored |
| 941 ** "digestLen" where the digest length (20) is stored |
| 942 ** "maxDigestLen" the maximum amount of data that can ever be |
| 943 ** stored in "digest" |
| 944 */ |
| 945 extern void SHA1_End(SHA1Context *cx, unsigned char *digest, |
| 946 unsigned int *digestLen, unsigned int maxDigestLen); |
| 947 |
| 948 /* |
| 949 ** trace the intermediate state info of the SHA1 hash. |
| 950 */ |
| 951 extern void SHA1_TraceState(SHA1Context *cx); |
| 952 |
| 953 /* |
| 954 * Return the the size of a buffer needed to flatten the SHA-1 Context into |
| 955 * "cx" the context |
| 956 * returns size; |
| 957 */ |
| 958 extern unsigned int SHA1_FlattenSize(SHA1Context *cx); |
| 959 |
| 960 /* |
| 961 * Flatten the SHA-1 Context into a buffer: |
| 962 * "cx" the context |
| 963 * "space" the buffer to flatten to |
| 964 * returns status; |
| 965 */ |
| 966 extern SECStatus SHA1_Flatten(SHA1Context *cx,unsigned char *space); |
| 967 |
| 968 /* |
| 969 * Resurrect a flattened context into a SHA-1 Context |
| 970 * "space" the buffer of the flattend buffer |
| 971 * "arg" ptr to void used by cryptographic resurrect |
| 972 * returns resurected context; |
| 973 */ |
| 974 extern SHA1Context * SHA1_Resurrect(unsigned char *space, void *arg); |
| 975 extern void SHA1_Clone(SHA1Context *dest, SHA1Context *src); |
| 976 |
| 977 /******************************************/ |
| 978 |
| 979 extern SHA256Context *SHA256_NewContext(void); |
| 980 extern void SHA256_DestroyContext(SHA256Context *cx, PRBool freeit); |
| 981 extern void SHA256_Begin(SHA256Context *cx); |
| 982 extern void SHA256_Update(SHA256Context *cx, const unsigned char *input, |
| 983 unsigned int inputLen); |
| 984 extern void SHA256_End(SHA256Context *cx, unsigned char *digest, |
| 985 unsigned int *digestLen, unsigned int maxDigestLen); |
| 986 extern SECStatus SHA256_HashBuf(unsigned char *dest, const unsigned char *src, |
| 987 uint32 src_length); |
| 988 extern SECStatus SHA256_Hash(unsigned char *dest, const char *src); |
| 989 extern void SHA256_TraceState(SHA256Context *cx); |
| 990 extern unsigned int SHA256_FlattenSize(SHA256Context *cx); |
| 991 extern SECStatus SHA256_Flatten(SHA256Context *cx,unsigned char *space); |
| 992 extern SHA256Context * SHA256_Resurrect(unsigned char *space, void *arg); |
| 993 extern void SHA256_Clone(SHA256Context *dest, SHA256Context *src); |
| 994 |
| 995 /******************************************/ |
| 996 |
| 997 extern SHA512Context *SHA512_NewContext(void); |
| 998 extern void SHA512_DestroyContext(SHA512Context *cx, PRBool freeit); |
| 999 extern void SHA512_Begin(SHA512Context *cx); |
| 1000 extern void SHA512_Update(SHA512Context *cx, const unsigned char *input, |
| 1001 unsigned int inputLen); |
| 1002 extern void SHA512_End(SHA512Context *cx, unsigned char *digest, |
| 1003 unsigned int *digestLen, unsigned int maxDigestLen); |
| 1004 extern SECStatus SHA512_HashBuf(unsigned char *dest, const unsigned char *src, |
| 1005 uint32 src_length); |
| 1006 extern SECStatus SHA512_Hash(unsigned char *dest, const char *src); |
| 1007 extern void SHA512_TraceState(SHA512Context *cx); |
| 1008 extern unsigned int SHA512_FlattenSize(SHA512Context *cx); |
| 1009 extern SECStatus SHA512_Flatten(SHA512Context *cx,unsigned char *space); |
| 1010 extern SHA512Context * SHA512_Resurrect(unsigned char *space, void *arg); |
| 1011 extern void SHA512_Clone(SHA512Context *dest, SHA512Context *src); |
| 1012 |
| 1013 /******************************************/ |
| 1014 |
| 1015 extern SHA384Context *SHA384_NewContext(void); |
| 1016 extern void SHA384_DestroyContext(SHA384Context *cx, PRBool freeit); |
| 1017 extern void SHA384_Begin(SHA384Context *cx); |
| 1018 extern void SHA384_Update(SHA384Context *cx, const unsigned char *input, |
| 1019 unsigned int inputLen); |
| 1020 extern void SHA384_End(SHA384Context *cx, unsigned char *digest, |
| 1021 unsigned int *digestLen, unsigned int maxDigestLen); |
| 1022 extern SECStatus SHA384_HashBuf(unsigned char *dest, const unsigned char *src, |
| 1023 uint32 src_length); |
| 1024 extern SECStatus SHA384_Hash(unsigned char *dest, const char *src); |
| 1025 extern void SHA384_TraceState(SHA384Context *cx); |
| 1026 extern unsigned int SHA384_FlattenSize(SHA384Context *cx); |
| 1027 extern SECStatus SHA384_Flatten(SHA384Context *cx,unsigned char *space); |
| 1028 extern SHA384Context * SHA384_Resurrect(unsigned char *space, void *arg); |
| 1029 extern void SHA384_Clone(SHA384Context *dest, SHA384Context *src); |
| 1030 |
| 1031 /**************************************** |
| 1032 * implement TLS Pseudo Random Function (PRF) |
| 1033 */ |
| 1034 |
| 1035 extern SECStatus |
| 1036 TLS_PRF(const SECItem *secret, const char *label, SECItem *seed, |
| 1037 SECItem *result, PRBool isFIPS); |
| 1038 |
| 1039 /******************************************/ |
| 1040 /* |
| 1041 ** Pseudo Random Number Generation. FIPS compliance desirable. |
| 1042 */ |
| 1043 |
| 1044 /* |
| 1045 ** Initialize the global RNG context and give it some seed input taken |
| 1046 ** from the system. This function is thread-safe and will only allow |
| 1047 ** the global context to be initialized once. The seed input is likely |
| 1048 ** small, so it is imperative that RNG_RandomUpdate() be called with |
| 1049 ** additional seed data before the generator is used. A good way to |
| 1050 ** provide the generator with additional entropy is to call |
| 1051 ** RNG_SystemInfoForRNG(). Note that NSS_Init() does exactly that. |
| 1052 */ |
| 1053 extern SECStatus RNG_RNGInit(void); |
| 1054 |
| 1055 /* |
| 1056 ** Update the global random number generator with more seeding |
| 1057 ** material |
| 1058 */ |
| 1059 extern SECStatus RNG_RandomUpdate(const void *data, size_t bytes); |
| 1060 |
| 1061 /* |
| 1062 ** Generate some random bytes, using the global random number generator |
| 1063 ** object. |
| 1064 */ |
| 1065 extern SECStatus RNG_GenerateGlobalRandomBytes(void *dest, size_t len); |
| 1066 |
| 1067 /* Destroy the global RNG context. After a call to RNG_RNGShutdown() |
| 1068 ** a call to RNG_RNGInit() is required in order to use the generator again, |
| 1069 ** along with seed data (see the comment above RNG_RNGInit()). |
| 1070 */ |
| 1071 extern void RNG_RNGShutdown(void); |
| 1072 |
| 1073 extern void RNG_SystemInfoForRNG(void); |
| 1074 |
| 1075 /* |
| 1076 * FIPS 186-2 Change Notice 1 RNG Algorithm 1, used both to |
| 1077 * generate the DSA X parameter and as a generic purpose RNG. |
| 1078 * |
| 1079 * The following two FIPS186Change functions are needed for |
| 1080 * NIST RNG Validation System. |
| 1081 */ |
| 1082 |
| 1083 /* |
| 1084 * FIPS186Change_GenerateX is now deprecated. It will return SECFailure with |
| 1085 * the error set to PR_NOT_IMPLEMENTED_ERROR. |
| 1086 */ |
| 1087 extern SECStatus |
| 1088 FIPS186Change_GenerateX(unsigned char *XKEY, |
| 1089 const unsigned char *XSEEDj, |
| 1090 unsigned char *x_j); |
| 1091 |
| 1092 /* |
| 1093 * When generating the DSA X parameter, we generate 2*GSIZE bytes |
| 1094 * of random output and reduce it mod q. |
| 1095 * |
| 1096 * Input: w, 2*GSIZE bytes |
| 1097 * q, DSA_SUBPRIME_LEN bytes |
| 1098 * Output: xj, DSA_SUBPRIME_LEN bytes |
| 1099 */ |
| 1100 extern SECStatus |
| 1101 FIPS186Change_ReduceModQForDSA(const unsigned char *w, |
| 1102 const unsigned char *q, |
| 1103 unsigned char *xj); |
| 1104 |
| 1105 /* |
| 1106 * The following functions are for FIPS poweron self test and FIPS algorithm |
| 1107 * testing. |
| 1108 */ |
| 1109 extern SECStatus |
| 1110 PRNGTEST_Instantiate(const PRUint8 *entropy, unsigned int entropy_len, |
| 1111 const PRUint8 *nonce, unsigned int nonce_len, |
| 1112 const PRUint8 *personal_string, unsigned int ps_len); |
| 1113 |
| 1114 extern SECStatus |
| 1115 PRNGTEST_Reseed(const PRUint8 *entropy, unsigned int entropy_len, |
| 1116 const PRUint8 *additional, unsigned int additional_len); |
| 1117 |
| 1118 extern SECStatus |
| 1119 PRNGTEST_Generate(PRUint8 *bytes, unsigned int bytes_len, |
| 1120 const PRUint8 *additional, unsigned int additional_len); |
| 1121 |
| 1122 extern SECStatus |
| 1123 PRNGTEST_Uninstantiate(void); |
| 1124 |
| 1125 |
| 1126 /* Generate PQGParams and PQGVerify structs. |
| 1127 * Length of seed and length of h both equal length of P. |
| 1128 * All lengths are specified by "j", according to the table above. |
| 1129 */ |
| 1130 extern SECStatus |
| 1131 PQG_ParamGen(unsigned int j, /* input : determines length of P. */ |
| 1132 PQGParams **pParams, /* output: P Q and G returned here */ |
| 1133 PQGVerify **pVfy); /* output: counter and seed. */ |
| 1134 |
| 1135 /* Generate PQGParams and PQGVerify structs. |
| 1136 * Length of P specified by j. Length of h will match length of P. |
| 1137 * Length of SEED in bytes specified in seedBytes. |
| 1138 * seedBbytes must be in the range [20..255] or an error will result. |
| 1139 */ |
| 1140 extern SECStatus |
| 1141 PQG_ParamGenSeedLen( |
| 1142 unsigned int j, /* input : determines length of P. */ |
| 1143 unsigned int seedBytes, /* input : length of seed in bytes.*/ |
| 1144 PQGParams **pParams, /* output: P Q and G returned here */ |
| 1145 PQGVerify **pVfy); /* output: counter and seed. */ |
| 1146 |
| 1147 |
| 1148 /* Test PQGParams for validity as DSS PQG values. |
| 1149 * If vfy is non-NULL, test PQGParams to make sure they were generated |
| 1150 * using the specified seed, counter, and h values. |
| 1151 * |
| 1152 * Return value indicates whether Verification operation ran successfully |
| 1153 * to completion, but does not indicate if PQGParams are valid or not. |
| 1154 * If return value is SECSuccess, then *pResult has these meanings: |
| 1155 * SECSuccess: PQGParams are valid. |
| 1156 * SECFailure: PQGParams are invalid. |
| 1157 * |
| 1158 * Verify the following 12 facts about PQG counter SEED g and h |
| 1159 * 1. Q is 160 bits long. |
| 1160 * 2. P is one of the 9 valid lengths. |
| 1161 * 3. G < P |
| 1162 * 4. P % Q == 1 |
| 1163 * 5. Q is prime |
| 1164 * 6. P is prime |
| 1165 * Steps 7-12 are done only if the optional PQGVerify is supplied. |
| 1166 * 7. counter < 4096 |
| 1167 * 8. g >= 160 and g < 2048 (g is length of seed in bits) |
| 1168 * 9. Q generated from SEED matches Q in PQGParams. |
| 1169 * 10. P generated from (L, counter, g, SEED, Q) matches P in PQGParams. |
| 1170 * 11. 1 < h < P-1 |
| 1171 * 12. G generated from h matches G in PQGParams. |
| 1172 */ |
| 1173 |
| 1174 extern SECStatus PQG_VerifyParams(const PQGParams *params, |
| 1175 const PQGVerify *vfy, SECStatus *result); |
| 1176 |
| 1177 extern void PQG_DestroyParams(PQGParams *params); |
| 1178 |
| 1179 extern void PQG_DestroyVerify(PQGVerify *vfy); |
| 1180 |
| 1181 |
| 1182 /* |
| 1183 * clean-up any global tables freebl may have allocated after it starts up. |
| 1184 * This function is not thread safe and should be called only after the |
| 1185 * library has been quiessed. |
| 1186 */ |
| 1187 extern void BL_Cleanup(void); |
| 1188 |
| 1189 /* unload freebl shared library from memory */ |
| 1190 extern void BL_Unload(void); |
| 1191 |
| 1192 /************************************************************************** |
| 1193 * Verify a given Shared library signature * |
| 1194 **************************************************************************/ |
| 1195 PRBool BLAPI_SHVerify(const char *name, PRFuncPtr addr); |
| 1196 |
| 1197 /************************************************************************** |
| 1198 * Verify Are Own Shared library signature * |
| 1199 **************************************************************************/ |
| 1200 PRBool BLAPI_VerifySelf(const char *name); |
| 1201 |
| 1202 /*********************************************************************/ |
| 1203 extern const SECHashObject * HASH_GetRawHashObject(HASH_HashType hashType); |
| 1204 |
| 1205 extern void BL_SetForkState(PRBool forked); |
| 1206 |
| 1207 SEC_END_PROTOS |
| 1208 |
| 1209 #endif /* _BLAPI_H_ */ |
OLD | NEW |