tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

nsspki.h (58492B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #ifndef NSSPKI_H
      6 #define NSSPKI_H
      7 
      8 /*
      9 * nsspki.h
     10 *
     11 * This file prototypes the methods of the top-level PKI objects.
     12 */
     13 
     14 #ifndef NSSDEVT_H
     15 #include "nssdevt.h"
     16 #endif /* NSSDEVT_H */
     17 
     18 #ifndef NSSPKIT_H
     19 #include "nsspkit.h"
     20 #endif /* NSSPKIT_H */
     21 
     22 #ifndef BASE_H
     23 #include "base.h"
     24 #endif /* BASE_H */
     25 
     26 #include "pkcs11uri.h"
     27 
     28 PR_BEGIN_EXTERN_C
     29 
     30 /*
     31 * A note about interfaces
     32 *
     33 * Although these APIs are specified in C, a language which does
     34 * not have fancy support for abstract interfaces, this library
     35 * was designed from an object-oriented perspective.  It may be
     36 * useful to consider the standard interfaces which went into
     37 * the writing of these APIs.
     38 *
     39 * Basic operations on all objects:
     40 *  Destroy -- free a pointer to an object
     41 *  DeleteStoredObject -- delete an object permanently
     42 *
     43 * Public Key cryptographic operations:
     44 *  Encrypt
     45 *  Verify
     46 *  VerifyRecover
     47 *  Wrap
     48 *  Derive
     49 *
     50 * Private Key cryptographic operations:
     51 *  IsStillPresent
     52 *  Decrypt
     53 *  Sign
     54 *  SignRecover
     55 *  Unwrap
     56 *  Derive
     57 *
     58 * Symmetric Key cryptographic operations:
     59 *  IsStillPresent
     60 *  Encrypt
     61 *  Decrypt
     62 *  Sign
     63 *  SignRecover
     64 *  Verify
     65 *  VerifyRecover
     66 *  Wrap
     67 *  Unwrap
     68 *  Derive
     69 *
     70 */
     71 
     72 /*
     73 * NSSCertificate
     74 *
     75 * These things can do crypto ops like public keys, except that the trust,
     76 * usage, and other constraints are checked.  These objects are "high-level,"
     77 * so trust, usages, etc. are in the form we throw around (client auth,
     78 * email signing, etc.).  Remember that theoretically another implementation
     79 * (think PGP) could be beneath this object.
     80 */
     81 
     82 /*
     83 * NSSCertificate_Destroy
     84 *
     85 * Free a pointer to a certificate object.
     86 */
     87 
     88 NSS_EXTERN PRStatus
     89 NSSCertificate_Destroy(NSSCertificate *c);
     90 
     91 /*
     92 * NSSCertificate_DeleteStoredObject
     93 *
     94 * Permanently remove this certificate from storage.  If this is the
     95 * only (remaining) certificate corresponding to a private key,
     96 * public key, and/or other object; then that object (those objects)
     97 * are deleted too.
     98 */
     99 
    100 NSS_EXTERN PRStatus
    101 NSSCertificate_DeleteStoredObject(
    102    NSSCertificate *c,
    103    NSSCallback *uhh);
    104 
    105 /*
    106 * NSSCertificate_Validate
    107 *
    108 * Verify that this certificate is trusted, for the specified usage(s),
    109 * at the specified time, {word word} the specified policies.
    110 */
    111 
    112 NSS_EXTERN PRStatus
    113 NSSCertificate_Validate(
    114    NSSCertificate *c,
    115    NSSTime *timeOpt, /* NULL for "now" */
    116    NSSUsage *usage,
    117    NSSPolicies *policiesOpt /* NULL for none */
    118 );
    119 
    120 /*
    121 * NSSCertificate_ValidateCompletely
    122 *
    123 * Verify that this certificate is trusted.  The difference between
    124 * this and the previous call is that NSSCertificate_Validate merely
    125 * returns success or failure with an appropriate error stack.
    126 * However, there may be (and often are) multiple problems with a
    127 * certificate.  This routine returns an array of errors, specifying
    128 * every problem.
    129 */
    130 
    131 /*
    132 * Return value must be an array of objects, each of which has
    133 * an NSSError, and any corresponding certificate (in the chain)
    134 * and/or policy.
    135 */
    136 
    137 NSS_EXTERN void ** /* void *[] */
    138 NSSCertificate_ValidateCompletely(
    139    NSSCertificate *c,
    140    NSSTime *timeOpt, /* NULL for "now" */
    141    NSSUsage *usage,
    142    NSSPolicies *policiesOpt, /* NULL for none */
    143    void **rvOpt,             /* NULL for allocate */
    144    PRUint32 rvLimit,         /* zero for no limit */
    145    NSSArena *arenaOpt        /* NULL for heap */
    146 );
    147 
    148 /*
    149 * NSSCertificate_ValidateAndDiscoverUsagesAndPolicies
    150 *
    151 * Returns PR_SUCCESS if the certificate is valid for at least something.
    152 */
    153 
    154 NSS_EXTERN PRStatus
    155 NSSCertificate_ValidateAndDiscoverUsagesAndPolicies(
    156    NSSCertificate *c,
    157    NSSTime **notBeforeOutOpt,
    158    NSSTime **notAfterOutOpt,
    159    void *allowedUsages,
    160    void *disallowedUsages,
    161    void *allowedPolicies,
    162    void *disallowedPolicies,
    163    /* more args.. work on this fgmr */
    164    NSSArena *arenaOpt);
    165 
    166 /*
    167 * NSSCertificate_Encode
    168 *
    169 */
    170 
    171 NSS_EXTERN NSSDER *
    172 NSSCertificate_Encode(
    173    NSSCertificate *c,
    174    NSSDER *rvOpt,
    175    NSSArena *arenaOpt);
    176 
    177 /*
    178 * NSSCertificate_BuildChain
    179 *
    180 * This routine returns NSSCertificate *'s for each certificate
    181 * in the "chain" starting from the specified one up to and
    182 * including the root.  The zeroth element in the array is the
    183 * specified ("leaf") certificate.
    184 *
    185 * If statusOpt is supplied, and is returned as PR_FAILURE, possible
    186 * error values are:
    187 *
    188 * NSS_ERROR_CERTIFICATE_ISSUER_NOT_FOUND - the chain is incomplete
    189 *
    190 */
    191 
    192 extern const NSSError NSS_ERROR_CERTIFICATE_ISSUER_NOT_FOUND;
    193 
    194 NSS_EXTERN NSSCertificate **
    195 NSSCertificate_BuildChain(
    196    NSSCertificate *c,
    197    NSSTime *timeOpt,
    198    NSSUsage *usage,
    199    NSSPolicies *policiesOpt,
    200    NSSCertificate **rvOpt,
    201    PRUint32 rvLimit, /* zero for no limit */
    202    NSSArena *arenaOpt,
    203    PRStatus *statusOpt,
    204    NSSTrustDomain *td,
    205    NSSCryptoContext *cc);
    206 
    207 /*
    208 * NSSCertificate_GetTrustDomain
    209 *
    210 */
    211 
    212 NSS_EXTERN NSSTrustDomain *
    213 NSSCertificate_GetTrustDomain(NSSCertificate *c);
    214 
    215 /*
    216 * NSSCertificate_GetToken
    217 *
    218 * There doesn't have to be one.
    219 */
    220 
    221 NSS_EXTERN NSSToken *
    222 NSSCertificate_GetToken(
    223    NSSCertificate *c,
    224    PRStatus *statusOpt);
    225 
    226 /*
    227 * NSSCertificate_GetSlot
    228 *
    229 * There doesn't have to be one.
    230 */
    231 
    232 NSS_EXTERN NSSSlot *
    233 NSSCertificate_GetSlot(
    234    NSSCertificate *c,
    235    PRStatus *statusOpt);
    236 
    237 /*
    238 * NSSCertificate_GetModule
    239 *
    240 * There doesn't have to be one.
    241 */
    242 
    243 NSS_EXTERN NSSModule *
    244 NSSCertificate_GetModule(
    245    NSSCertificate *c,
    246    PRStatus *statusOpt);
    247 
    248 /*
    249 * NSSCertificate_Encrypt
    250 *
    251 * Encrypt a single chunk of data with the public key corresponding to
    252 * this certificate.
    253 */
    254 
    255 NSS_EXTERN NSSItem *
    256 NSSCertificate_Encrypt(
    257    NSSCertificate *c,
    258    NSSAlgorithmAndParameters *apOpt,
    259    NSSItem *data,
    260    NSSTime *timeOpt,
    261    NSSUsage *usage,
    262    NSSPolicies *policiesOpt,
    263    NSSCallback *uhh,
    264    NSSItem *rvOpt,
    265    NSSArena *arenaOpt);
    266 
    267 /*
    268 * NSSCertificate_Verify
    269 *
    270 */
    271 
    272 NSS_EXTERN PRStatus
    273 NSSCertificate_Verify(
    274    NSSCertificate *c,
    275    NSSAlgorithmAndParameters *apOpt,
    276    NSSItem *data,
    277    NSSItem *signature,
    278    NSSTime *timeOpt,
    279    NSSUsage *usage,
    280    NSSPolicies *policiesOpt,
    281    NSSCallback *uhh);
    282 
    283 /*
    284 * NSSCertificate_VerifyRecover
    285 *
    286 */
    287 
    288 NSS_EXTERN NSSItem *
    289 NSSCertificate_VerifyRecover(
    290    NSSCertificate *c,
    291    NSSAlgorithmAndParameters *apOpt,
    292    NSSItem *signature,
    293    NSSTime *timeOpt,
    294    NSSUsage *usage,
    295    NSSPolicies *policiesOpt,
    296    NSSCallback *uhh,
    297    NSSItem *rvOpt,
    298    NSSArena *arenaOpt);
    299 
    300 /*
    301 * NSSCertificate_WrapSymmetricKey
    302 *
    303 * This method tries very hard to to succeed, even in situations
    304 * involving sensitive keys and multiple modules.
    305 * { relyea: want to add verbiage? }
    306 */
    307 
    308 NSS_EXTERN NSSItem *
    309 NSSCertificate_WrapSymmetricKey(
    310    NSSCertificate *c,
    311    NSSAlgorithmAndParameters *apOpt,
    312    NSSSymmetricKey *keyToWrap,
    313    NSSTime *timeOpt,
    314    NSSUsage *usage,
    315    NSSPolicies *policiesOpt,
    316    NSSCallback *uhh,
    317    NSSItem *rvOpt,
    318    NSSArena *arenaOpt);
    319 
    320 /*
    321 * NSSCertificate_CreateCryptoContext
    322 *
    323 * Create a crypto context, in this certificate's trust domain, with this
    324 * as the distinguished certificate.
    325 */
    326 
    327 NSS_EXTERN NSSCryptoContext *
    328 NSSCertificate_CreateCryptoContext(
    329    NSSCertificate *c,
    330    NSSAlgorithmAndParameters *apOpt,
    331    NSSTime *timeOpt,
    332    NSSUsage *usage,
    333    NSSPolicies *policiesOpt,
    334    NSSCallback *uhh);
    335 
    336 /*
    337 * NSSCertificate_GetPublicKey
    338 *
    339 * Returns the public key corresponding to this certificate.
    340 */
    341 
    342 NSS_EXTERN NSSPublicKey *
    343 NSSCertificate_GetPublicKey(NSSCertificate *c);
    344 
    345 /*
    346 * NSSCertificate_FindPrivateKey
    347 *
    348 * Finds and returns the private key corresponding to this certificate,
    349 * if it is available.
    350 *
    351 * { Should this hang off of NSSUserCertificate? }
    352 */
    353 
    354 NSS_EXTERN NSSPrivateKey *
    355 NSSCertificate_FindPrivateKey(
    356    NSSCertificate *c,
    357    NSSCallback *uhh);
    358 
    359 /*
    360 * NSSCertificate_IsPrivateKeyAvailable
    361 *
    362 * Returns success if the private key corresponding to this certificate
    363 * is available to be used.
    364 *
    365 * { Should *this* hang off of NSSUserCertificate?? }
    366 */
    367 
    368 NSS_EXTERN PRBool
    369 NSSCertificate_IsPrivateKeyAvailable(
    370    NSSCertificate *c,
    371    NSSCallback *uhh,
    372    PRStatus *statusOpt);
    373 
    374 /*
    375 * If we make NSSUserCertificate not a typedef of NSSCertificate,
    376 * then we'll need implementations of the following:
    377 *
    378 *  NSSUserCertificate_Destroy
    379 *  NSSUserCertificate_DeleteStoredObject
    380 *  NSSUserCertificate_Validate
    381 *  NSSUserCertificate_ValidateCompletely
    382 *  NSSUserCertificate_ValidateAndDiscoverUsagesAndPolicies
    383 *  NSSUserCertificate_Encode
    384 *  NSSUserCertificate_BuildChain
    385 *  NSSUserCertificate_GetTrustDomain
    386 *  NSSUserCertificate_GetToken
    387 *  NSSUserCertificate_GetSlot
    388 *  NSSUserCertificate_GetModule
    389 *  NSSUserCertificate_GetCryptoContext
    390 *  NSSUserCertificate_GetPublicKey
    391 */
    392 
    393 /*
    394 * NSSUserCertificate_IsStillPresent
    395 *
    396 * Verify that if this certificate lives on a token, that the token
    397 * is still present and the certificate still exists.  This is a
    398 * lightweight call which should be used whenever it should be
    399 * verified that the user hasn't perhaps popped out his or her
    400 * token and strolled away.
    401 */
    402 
    403 NSS_EXTERN PRBool
    404 NSSUserCertificate_IsStillPresent(
    405    NSSUserCertificate *uc,
    406    PRStatus *statusOpt);
    407 
    408 /*
    409 * NSSUserCertificate_Decrypt
    410 *
    411 * Decrypt a single chunk of data with the private key corresponding
    412 * to this certificate.
    413 */
    414 
    415 NSS_EXTERN NSSItem *
    416 NSSUserCertificate_Decrypt(
    417    NSSUserCertificate *uc,
    418    NSSAlgorithmAndParameters *apOpt,
    419    NSSItem *data,
    420    NSSTime *timeOpt,
    421    NSSUsage *usage,
    422    NSSPolicies *policiesOpt,
    423    NSSCallback *uhh,
    424    NSSItem *rvOpt,
    425    NSSArena *arenaOpt);
    426 
    427 /*
    428 * NSSUserCertificate_Sign
    429 *
    430 */
    431 
    432 NSS_EXTERN NSSItem *
    433 NSSUserCertificate_Sign(
    434    NSSUserCertificate *uc,
    435    NSSAlgorithmAndParameters *apOpt,
    436    NSSItem *data,
    437    NSSTime *timeOpt,
    438    NSSUsage *usage,
    439    NSSPolicies *policiesOpt,
    440    NSSCallback *uhh,
    441    NSSItem *rvOpt,
    442    NSSArena *arenaOpt);
    443 
    444 /*
    445 * NSSUserCertificate_SignRecover
    446 *
    447 */
    448 
    449 NSS_EXTERN NSSItem *
    450 NSSUserCertificate_SignRecover(
    451    NSSUserCertificate *uc,
    452    NSSAlgorithmAndParameters *apOpt,
    453    NSSItem *data,
    454    NSSTime *timeOpt,
    455    NSSUsage *usage,
    456    NSSPolicies *policiesOpt,
    457    NSSCallback *uhh,
    458    NSSItem *rvOpt,
    459    NSSArena *arenaOpt);
    460 
    461 /*
    462 * NSSUserCertificate_UnwrapSymmetricKey
    463 *
    464 */
    465 
    466 NSS_EXTERN NSSSymmetricKey *
    467 NSSUserCertificate_UnwrapSymmetricKey(
    468    NSSUserCertificate *uc,
    469    NSSAlgorithmAndParameters *apOpt,
    470    NSSItem *wrappedKey,
    471    NSSTime *timeOpt,
    472    NSSUsage *usage,
    473    NSSPolicies *policiesOpt,
    474    NSSCallback *uhh,
    475    NSSItem *rvOpt,
    476    NSSArena *arenaOpt);
    477 
    478 /*
    479 * NSSUserCertificate_DeriveSymmetricKey
    480 *
    481 */
    482 
    483 NSS_EXTERN NSSSymmetricKey *
    484 NSSUserCertificate_DeriveSymmetricKey(
    485    NSSUserCertificate *uc, /* provides private key */
    486    NSSCertificate *c,      /* provides public key */
    487    NSSAlgorithmAndParameters *apOpt,
    488    NSSOID *target,
    489    PRUint32 keySizeOpt, /* zero for best allowed */
    490    NSSOperations operations,
    491    NSSCallback *uhh);
    492 
    493 /* filter-certs function(s) */
    494 
    495 /**
    496 ** fgmr -- trust objects
    497 **/
    498 
    499 /*
    500 * NSSPrivateKey
    501 *
    502 */
    503 
    504 /*
    505 * NSSPrivateKey_Destroy
    506 *
    507 * Free a pointer to a private key object.
    508 */
    509 
    510 NSS_EXTERN PRStatus
    511 NSSPrivateKey_Destroy(NSSPrivateKey *vk);
    512 
    513 /*
    514 * NSSPrivateKey_DeleteStoredObject
    515 *
    516 * Permanently remove this object, and any related objects (such as the
    517 * certificates corresponding to this key).
    518 */
    519 
    520 NSS_EXTERN PRStatus
    521 NSSPrivateKey_DeleteStoredObject(
    522    NSSPrivateKey *vk,
    523    NSSCallback *uhh);
    524 
    525 /*
    526 * NSSPrivateKey_GetSignatureLength
    527 *
    528 */
    529 
    530 NSS_EXTERN PRUint32
    531 NSSPrivateKey_GetSignatureLength(NSSPrivateKey *vk);
    532 
    533 /*
    534 * NSSPrivateKey_GetPrivateModulusLength
    535 *
    536 */
    537 
    538 NSS_EXTERN PRUint32
    539 NSSPrivateKey_GetPrivateModulusLength(NSSPrivateKey *vk);
    540 
    541 /*
    542 * NSSPrivateKey_IsStillPresent
    543 *
    544 */
    545 
    546 NSS_EXTERN PRBool
    547 NSSPrivateKey_IsStillPresent(
    548    NSSPrivateKey *vk,
    549    PRStatus *statusOpt);
    550 
    551 /*
    552 * NSSPrivateKey_Encode
    553 *
    554 */
    555 
    556 NSS_EXTERN NSSItem *
    557 NSSPrivateKey_Encode(
    558    NSSPrivateKey *vk,
    559    NSSAlgorithmAndParameters *ap,
    560    NSSItem *passwordOpt, /* NULL will cause a callback; "" for no password */
    561    NSSCallback *uhhOpt,
    562    NSSItem *rvOpt,
    563    NSSArena *arenaOpt);
    564 
    565 /*
    566 * NSSPrivateKey_GetTrustDomain
    567 *
    568 * There doesn't have to be one.
    569 */
    570 
    571 NSS_EXTERN NSSTrustDomain *
    572 NSSPrivateKey_GetTrustDomain(
    573    NSSPrivateKey *vk,
    574    PRStatus *statusOpt);
    575 
    576 /*
    577 * NSSPrivateKey_GetToken
    578 *
    579 */
    580 
    581 NSS_EXTERN NSSToken *
    582 NSSPrivateKey_GetToken(NSSPrivateKey *vk);
    583 
    584 /*
    585 * NSSPrivateKey_GetSlot
    586 *
    587 */
    588 
    589 NSS_EXTERN NSSSlot *
    590 NSSPrivateKey_GetSlot(NSSPrivateKey *vk);
    591 
    592 /*
    593 * NSSPrivateKey_GetModule
    594 *
    595 */
    596 
    597 NSS_EXTERN NSSModule *
    598 NSSPrivateKey_GetModule(NSSPrivateKey *vk);
    599 
    600 /*
    601 * NSSPrivateKey_Decrypt
    602 *
    603 */
    604 
    605 NSS_EXTERN NSSItem *
    606 NSSPrivateKey_Decrypt(
    607    NSSPrivateKey *vk,
    608    NSSAlgorithmAndParameters *apOpt,
    609    NSSItem *encryptedData,
    610    NSSCallback *uhh,
    611    NSSItem *rvOpt,
    612    NSSArena *arenaOpt);
    613 
    614 /*
    615 * NSSPrivateKey_Sign
    616 *
    617 */
    618 
    619 NSS_EXTERN NSSItem *
    620 NSSPrivateKey_Sign(
    621    NSSPrivateKey *vk,
    622    NSSAlgorithmAndParameters *apOpt,
    623    NSSItem *data,
    624    NSSCallback *uhh,
    625    NSSItem *rvOpt,
    626    NSSArena *arenaOpt);
    627 
    628 /*
    629 * NSSPrivateKey_SignRecover
    630 *
    631 */
    632 
    633 NSS_EXTERN NSSItem *
    634 NSSPrivateKey_SignRecover(
    635    NSSPrivateKey *vk,
    636    NSSAlgorithmAndParameters *apOpt,
    637    NSSItem *data,
    638    NSSCallback *uhh,
    639    NSSItem *rvOpt,
    640    NSSArena *arenaOpt);
    641 
    642 /*
    643 * NSSPrivateKey_UnwrapSymmetricKey
    644 *
    645 */
    646 
    647 NSS_EXTERN NSSSymmetricKey *
    648 NSSPrivateKey_UnwrapSymmetricKey(
    649    NSSPrivateKey *vk,
    650    NSSAlgorithmAndParameters *apOpt,
    651    NSSItem *wrappedKey,
    652    NSSCallback *uhh);
    653 
    654 /*
    655 * NSSPrivateKey_DeriveSymmetricKey
    656 *
    657 */
    658 
    659 NSS_EXTERN NSSSymmetricKey *
    660 NSSPrivateKey_DeriveSymmetricKey(
    661    NSSPrivateKey *vk,
    662    NSSPublicKey *bk,
    663    NSSAlgorithmAndParameters *apOpt,
    664    NSSOID *target,
    665    PRUint32 keySizeOpt, /* zero for best allowed */
    666    NSSOperations operations,
    667    NSSCallback *uhh);
    668 
    669 /*
    670 * NSSPrivateKey_FindPublicKey
    671 *
    672 */
    673 
    674 NSS_EXTERN NSSPublicKey *
    675 NSSPrivateKey_FindPublicKey(
    676    NSSPrivateKey *vk
    677    /* { don't need the callback here, right? } */
    678 );
    679 
    680 /*
    681 * NSSPrivateKey_CreateCryptoContext
    682 *
    683 * Create a crypto context, in this key's trust domain,
    684 * with this as the distinguished private key.
    685 */
    686 
    687 NSS_EXTERN NSSCryptoContext *
    688 NSSPrivateKey_CreateCryptoContext(
    689    NSSPrivateKey *vk,
    690    NSSAlgorithmAndParameters *apOpt,
    691    NSSCallback *uhh);
    692 
    693 /*
    694 * NSSPrivateKey_FindCertificates
    695 *
    696 * Note that there may be more than one certificate for this
    697 * private key.  { FilterCertificates function to further
    698 * reduce the list. }
    699 */
    700 
    701 NSS_EXTERN NSSCertificate **
    702 NSSPrivateKey_FindCertificates(
    703    NSSPrivateKey *vk,
    704    NSSCertificate *rvOpt[],
    705    PRUint32 maximumOpt, /* 0 for no max */
    706    NSSArena *arenaOpt);
    707 
    708 /*
    709 * NSSPrivateKey_FindBestCertificate
    710 *
    711 * The parameters for this function will depend on what the users
    712 * need.  This is just a starting point.
    713 */
    714 
    715 NSS_EXTERN NSSCertificate *
    716 NSSPrivateKey_FindBestCertificate(
    717    NSSPrivateKey *vk,
    718    NSSTime *timeOpt,
    719    NSSUsage *usageOpt,
    720    NSSPolicies *policiesOpt);
    721 
    722 /*
    723 * NSSPublicKey
    724 *
    725 * Once you generate, find, or derive one of these, you can use it
    726 * to perform (simple) cryptographic operations.  Though there may
    727 * be certificates associated with these public keys, they are not
    728 * verified.
    729 */
    730 
    731 /*
    732 * NSSPublicKey_Destroy
    733 *
    734 * Free a pointer to a public key object.
    735 */
    736 
    737 NSS_EXTERN PRStatus
    738 NSSPublicKey_Destroy(NSSPublicKey *bk);
    739 
    740 /*
    741 * NSSPublicKey_DeleteStoredObject
    742 *
    743 * Permanently remove this object, and any related objects (such as the
    744 * corresponding private keys and certificates).
    745 */
    746 
    747 NSS_EXTERN PRStatus
    748 NSSPublicKey_DeleteStoredObject(
    749    NSSPublicKey *bk,
    750    NSSCallback *uhh);
    751 
    752 /*
    753 * NSSPublicKey_Encode
    754 *
    755 */
    756 
    757 NSS_EXTERN NSSItem *
    758 NSSPublicKey_Encode(
    759    NSSPublicKey *bk,
    760    NSSAlgorithmAndParameters *ap,
    761    NSSCallback *uhhOpt,
    762    NSSItem *rvOpt,
    763    NSSArena *arenaOpt);
    764 
    765 /*
    766 * NSSPublicKey_GetTrustDomain
    767 *
    768 * There doesn't have to be one.
    769 */
    770 
    771 NSS_EXTERN NSSTrustDomain *
    772 NSSPublicKey_GetTrustDomain(
    773    NSSPublicKey *bk,
    774    PRStatus *statusOpt);
    775 
    776 /*
    777 * NSSPublicKey_GetToken
    778 *
    779 * There doesn't have to be one.
    780 */
    781 
    782 NSS_EXTERN NSSToken *
    783 NSSPublicKey_GetToken(
    784    NSSPublicKey *bk,
    785    PRStatus *statusOpt);
    786 
    787 /*
    788 * NSSPublicKey_GetSlot
    789 *
    790 * There doesn't have to be one.
    791 */
    792 
    793 NSS_EXTERN NSSSlot *
    794 NSSPublicKey_GetSlot(
    795    NSSPublicKey *bk,
    796    PRStatus *statusOpt);
    797 
    798 /*
    799 * NSSPublicKey_GetModule
    800 *
    801 * There doesn't have to be one.
    802 */
    803 
    804 NSS_EXTERN NSSModule *
    805 NSSPublicKey_GetModule(
    806    NSSPublicKey *bk,
    807    PRStatus *statusOpt);
    808 
    809 /*
    810 * NSSPublicKey_Encrypt
    811 *
    812 * Encrypt a single chunk of data with the public key corresponding to
    813 * this certificate.
    814 */
    815 
    816 NSS_EXTERN NSSItem *
    817 NSSPublicKey_Encrypt(
    818    NSSPublicKey *bk,
    819    NSSAlgorithmAndParameters *apOpt,
    820    NSSItem *data,
    821    NSSCallback *uhh,
    822    NSSItem *rvOpt,
    823    NSSArena *arenaOpt);
    824 
    825 /*
    826 * NSSPublicKey_Verify
    827 *
    828 */
    829 
    830 NSS_EXTERN PRStatus
    831 NSSPublicKey_Verify(
    832    NSSPublicKey *bk,
    833    NSSAlgorithmAndParameters *apOpt,
    834    NSSItem *data,
    835    NSSItem *signature,
    836    NSSCallback *uhh);
    837 
    838 /*
    839 * NSSPublicKey_VerifyRecover
    840 *
    841 */
    842 
    843 NSS_EXTERN NSSItem *
    844 NSSPublicKey_VerifyRecover(
    845    NSSPublicKey *bk,
    846    NSSAlgorithmAndParameters *apOpt,
    847    NSSItem *signature,
    848    NSSCallback *uhh,
    849    NSSItem *rvOpt,
    850    NSSArena *arenaOpt);
    851 
    852 /*
    853 * NSSPublicKey_WrapSymmetricKey
    854 *
    855 */
    856 
    857 NSS_EXTERN NSSItem *
    858 NSSPublicKey_WrapSymmetricKey(
    859    NSSPublicKey *bk,
    860    NSSAlgorithmAndParameters *apOpt,
    861    NSSSymmetricKey *keyToWrap,
    862    NSSCallback *uhh,
    863    NSSItem *rvOpt,
    864    NSSArena *arenaOpt);
    865 
    866 /*
    867 * NSSPublicKey_CreateCryptoContext
    868 *
    869 * Create a crypto context, in this key's trust domain, with this
    870 * as the distinguished public key.
    871 */
    872 
    873 NSS_EXTERN NSSCryptoContext *
    874 NSSPublicKey_CreateCryptoContext(
    875    NSSPublicKey *bk,
    876    NSSAlgorithmAndParameters *apOpt,
    877    NSSCallback *uhh);
    878 
    879 /*
    880 * NSSPublicKey_FindCertificates
    881 *
    882 * Note that there may be more than one certificate for this
    883 * public key.  The current implementation may not find every
    884 * last certificate available for this public key: that would
    885 * involve trolling e.g. huge ldap databases, which will be
    886 * grossly inefficient and not generally useful.
    887 * { FilterCertificates function to further reduce the list }
    888 */
    889 
    890 NSS_EXTERN NSSCertificate **
    891 NSSPublicKey_FindCertificates(
    892    NSSPublicKey *bk,
    893    NSSCertificate *rvOpt[],
    894    PRUint32 maximumOpt, /* 0 for no max */
    895    NSSArena *arenaOpt);
    896 
    897 /*
    898 * NSSPrivateKey_FindBestCertificate
    899 *
    900 * The parameters for this function will depend on what the users
    901 * need.  This is just a starting point.
    902 */
    903 
    904 NSS_EXTERN NSSCertificate *
    905 NSSPublicKey_FindBestCertificate(
    906    NSSPublicKey *bk,
    907    NSSTime *timeOpt,
    908    NSSUsage *usageOpt,
    909    NSSPolicies *policiesOpt);
    910 
    911 /*
    912 * NSSPublicKey_FindPrivateKey
    913 *
    914 */
    915 
    916 NSS_EXTERN NSSPrivateKey *
    917 NSSPublicKey_FindPrivateKey(
    918    NSSPublicKey *bk,
    919    NSSCallback *uhh);
    920 
    921 /*
    922 * NSSSymmetricKey
    923 *
    924 */
    925 
    926 /*
    927 * NSSSymmetricKey_Destroy
    928 *
    929 * Free a pointer to a symmetric key object.
    930 */
    931 
    932 NSS_EXTERN PRStatus
    933 NSSSymmetricKey_Destroy(NSSSymmetricKey *mk);
    934 
    935 /*
    936 * NSSSymmetricKey_DeleteStoredObject
    937 *
    938 * Permanently remove this object.
    939 */
    940 
    941 NSS_EXTERN PRStatus
    942 NSSSymmetricKey_DeleteStoredObject(
    943    NSSSymmetricKey *mk,
    944    NSSCallback *uhh);
    945 
    946 /*
    947 * NSSSymmetricKey_GetKeyLength
    948 *
    949 */
    950 
    951 NSS_EXTERN PRUint32
    952 NSSSymmetricKey_GetKeyLength(NSSSymmetricKey *mk);
    953 
    954 /*
    955 * NSSSymmetricKey_GetKeyStrength
    956 *
    957 */
    958 
    959 NSS_EXTERN PRUint32
    960 NSSSymmetricKey_GetKeyStrength(NSSSymmetricKey *mk);
    961 
    962 /*
    963 * NSSSymmetricKey_IsStillPresent
    964 *
    965 */
    966 
    967 NSS_EXTERN PRStatus
    968 NSSSymmetricKey_IsStillPresent(NSSSymmetricKey *mk);
    969 
    970 /*
    971 * NSSSymmetricKey_GetTrustDomain
    972 *
    973 * There doesn't have to be one.
    974 */
    975 
    976 NSS_EXTERN NSSTrustDomain *
    977 NSSSymmetricKey_GetTrustDomain(
    978    NSSSymmetricKey *mk,
    979    PRStatus *statusOpt);
    980 
    981 /*
    982 * NSSSymmetricKey_GetToken
    983 *
    984 * There doesn't have to be one.
    985 */
    986 
    987 NSS_EXTERN NSSToken *
    988 NSSSymmetricKey_GetToken(
    989    NSSSymmetricKey *mk,
    990    PRStatus *statusOpt);
    991 
    992 /*
    993 * NSSSymmetricKey_GetSlot
    994 *
    995 * There doesn't have to be one.
    996 */
    997 
    998 NSS_EXTERN NSSSlot *
    999 NSSSymmetricKey_GetSlot(
   1000    NSSSymmetricKey *mk,
   1001    PRStatus *statusOpt);
   1002 
   1003 /*
   1004 * NSSSymmetricKey_GetModule
   1005 *
   1006 * There doesn't have to be one.
   1007 */
   1008 
   1009 NSS_EXTERN NSSModule *
   1010 NSSSymmetricKey_GetModule(
   1011    NSSSymmetricKey *mk,
   1012    PRStatus *statusOpt);
   1013 
   1014 /*
   1015 * NSSSymmetricKey_Encrypt
   1016 *
   1017 */
   1018 
   1019 NSS_EXTERN NSSItem *
   1020 NSSSymmetricKey_Encrypt(
   1021    NSSSymmetricKey *mk,
   1022    NSSAlgorithmAndParameters *apOpt,
   1023    NSSItem *data,
   1024    NSSCallback *uhh,
   1025    NSSItem *rvOpt,
   1026    NSSArena *arenaOpt);
   1027 
   1028 /*
   1029 * NSSSymmetricKey_Decrypt
   1030 *
   1031 */
   1032 
   1033 NSS_EXTERN NSSItem *
   1034 NSSSymmetricKey_Decrypt(
   1035    NSSSymmetricKey *mk,
   1036    NSSAlgorithmAndParameters *apOpt,
   1037    NSSItem *encryptedData,
   1038    NSSCallback *uhh,
   1039    NSSItem *rvOpt,
   1040    NSSArena *arenaOpt);
   1041 
   1042 /*
   1043 * NSSSymmetricKey_Sign
   1044 *
   1045 */
   1046 
   1047 NSS_EXTERN NSSItem *
   1048 NSSSymmetricKey_Sign(
   1049    NSSSymmetricKey *mk,
   1050    NSSAlgorithmAndParameters *apOpt,
   1051    NSSItem *data,
   1052    NSSCallback *uhh,
   1053    NSSItem *rvOpt,
   1054    NSSArena *arenaOpt);
   1055 
   1056 /*
   1057 * NSSSymmetricKey_SignRecover
   1058 *
   1059 */
   1060 
   1061 NSS_EXTERN NSSItem *
   1062 NSSSymmetricKey_SignRecover(
   1063    NSSSymmetricKey *mk,
   1064    NSSAlgorithmAndParameters *apOpt,
   1065    NSSItem *data,
   1066    NSSCallback *uhh,
   1067    NSSItem *rvOpt,
   1068    NSSArena *arenaOpt);
   1069 
   1070 /*
   1071 * NSSSymmetricKey_Verify
   1072 *
   1073 */
   1074 
   1075 NSS_EXTERN PRStatus
   1076 NSSSymmetricKey_Verify(
   1077    NSSSymmetricKey *mk,
   1078    NSSAlgorithmAndParameters *apOpt,
   1079    NSSItem *data,
   1080    NSSItem *signature,
   1081    NSSCallback *uhh);
   1082 
   1083 /*
   1084 * NSSSymmetricKey_VerifyRecover
   1085 *
   1086 */
   1087 
   1088 NSS_EXTERN NSSItem *
   1089 NSSSymmetricKey_VerifyRecover(
   1090    NSSSymmetricKey *mk,
   1091    NSSAlgorithmAndParameters *apOpt,
   1092    NSSItem *signature,
   1093    NSSCallback *uhh,
   1094    NSSItem *rvOpt,
   1095    NSSArena *arenaOpt);
   1096 
   1097 /*
   1098 * NSSSymmetricKey_WrapSymmetricKey
   1099 *
   1100 */
   1101 
   1102 NSS_EXTERN NSSItem *
   1103 NSSSymmetricKey_WrapSymmetricKey(
   1104    NSSSymmetricKey *wrappingKey,
   1105    NSSAlgorithmAndParameters *apOpt,
   1106    NSSSymmetricKey *keyToWrap,
   1107    NSSCallback *uhh,
   1108    NSSItem *rvOpt,
   1109    NSSArena *arenaOpt);
   1110 
   1111 /*
   1112 * NSSSymmetricKey_WrapPrivateKey
   1113 *
   1114 */
   1115 
   1116 NSS_EXTERN NSSItem *
   1117 NSSSymmetricKey_WrapPrivateKey(
   1118    NSSSymmetricKey *wrappingKey,
   1119    NSSAlgorithmAndParameters *apOpt,
   1120    NSSPrivateKey *keyToWrap,
   1121    NSSCallback *uhh,
   1122    NSSItem *rvOpt,
   1123    NSSArena *arenaOpt);
   1124 
   1125 /*
   1126 * NSSSymmetricKey_UnwrapSymmetricKey
   1127 *
   1128 */
   1129 
   1130 NSS_EXTERN NSSSymmetricKey *
   1131 NSSSymmetricKey_UnwrapSymmetricKey(
   1132    NSSSymmetricKey *wrappingKey,
   1133    NSSAlgorithmAndParameters *apOpt,
   1134    NSSItem *wrappedKey,
   1135    NSSOID *target,
   1136    PRUint32 keySizeOpt,
   1137    NSSOperations operations,
   1138    NSSCallback *uhh);
   1139 
   1140 /*
   1141 * NSSSymmetricKey_UnwrapPrivateKey
   1142 *
   1143 */
   1144 
   1145 NSS_EXTERN NSSPrivateKey *
   1146 NSSSymmetricKey_UnwrapPrivateKey(
   1147    NSSSymmetricKey *wrappingKey,
   1148    NSSAlgorithmAndParameters *apOpt,
   1149    NSSItem *wrappedKey,
   1150    NSSUTF8 *labelOpt,
   1151    NSSItem *keyIDOpt,
   1152    PRBool persistant,
   1153    PRBool sensitive,
   1154    NSSToken *destinationOpt,
   1155    NSSCallback *uhh);
   1156 
   1157 /*
   1158 * NSSSymmetricKey_DeriveSymmetricKey
   1159 *
   1160 */
   1161 
   1162 NSS_EXTERN NSSSymmetricKey *
   1163 NSSSymmetricKey_DeriveSymmetricKey(
   1164    NSSSymmetricKey *originalKey,
   1165    NSSAlgorithmAndParameters *apOpt,
   1166    NSSOID *target,
   1167    PRUint32 keySizeOpt,
   1168    NSSOperations operations,
   1169    NSSCallback *uhh);
   1170 
   1171 /*
   1172 * NSSSymmetricKey_CreateCryptoContext
   1173 *
   1174 * Create a crypto context, in this key's trust domain,
   1175 * with this as the distinguished symmetric key.
   1176 */
   1177 
   1178 NSS_EXTERN NSSCryptoContext *
   1179 NSSSymmetricKey_CreateCryptoContext(
   1180    NSSSymmetricKey *mk,
   1181    NSSAlgorithmAndParameters *apOpt,
   1182    NSSCallback *uhh);
   1183 
   1184 /*
   1185 * NSSTrustDomain
   1186 *
   1187 */
   1188 
   1189 /*
   1190 * NSSTrustDomain_Create
   1191 *
   1192 * This creates a trust domain, optionally with an initial cryptoki
   1193 * module.  If the module name is not null, the module is loaded if
   1194 * needed (using the uriOpt argument), and initialized with the
   1195 * opaqueOpt argument.  If mumble mumble priority settings, then
   1196 * module-specification objects in the module can cause the loading
   1197 * and initialization of further modules.
   1198 *
   1199 * The uriOpt is defined to take a URI.  At present, we only
   1200 * support file: URLs pointing to platform-native shared libraries.
   1201 * However, by specifying this as a URI, this keeps open the
   1202 * possibility of supporting other, possibly remote, resources.
   1203 *
   1204 * The "reserved" arguments is held for when we figure out the
   1205 * module priority stuff.
   1206 */
   1207 
   1208 NSS_EXTERN NSSTrustDomain *
   1209 NSSTrustDomain_Create(
   1210    NSSUTF8 *moduleOpt,
   1211    NSSUTF8 *uriOpt,
   1212    NSSUTF8 *opaqueOpt,
   1213    void *reserved);
   1214 
   1215 /*
   1216 * NSSTrustDomain_Destroy
   1217 *
   1218 */
   1219 
   1220 NSS_EXTERN PRStatus
   1221 NSSTrustDomain_Destroy(NSSTrustDomain *td);
   1222 
   1223 /*
   1224 * NSSTrustDomain_SetDefaultCallback
   1225 *
   1226 */
   1227 
   1228 NSS_EXTERN PRStatus
   1229 NSSTrustDomain_SetDefaultCallback(
   1230    NSSTrustDomain *td,
   1231    NSSCallback *newCallback,
   1232    NSSCallback **oldCallbackOpt);
   1233 
   1234 /*
   1235 * NSSTrustDomain_GetDefaultCallback
   1236 *
   1237 */
   1238 
   1239 NSS_EXTERN NSSCallback *
   1240 NSSTrustDomain_GetDefaultCallback(
   1241    NSSTrustDomain *td,
   1242    PRStatus *statusOpt);
   1243 
   1244 /*
   1245 * Default policies?
   1246 * Default usage?
   1247 * Default time, for completeness?
   1248 */
   1249 
   1250 /*
   1251 * NSSTrustDomain_LoadModule
   1252 *
   1253 */
   1254 
   1255 NSS_EXTERN PRStatus
   1256 NSSTrustDomain_LoadModule(
   1257    NSSTrustDomain *td,
   1258    NSSUTF8 *moduleOpt,
   1259    NSSUTF8 *uriOpt,
   1260    NSSUTF8 *opaqueOpt,
   1261    void *reserved);
   1262 
   1263 /*
   1264 * NSSTrustDomain_AddModule
   1265 * NSSTrustDomain_AddSlot
   1266 * NSSTrustDomain_UnloadModule
   1267 * Managing modules, slots, tokens; priorities;
   1268 * Traversing all of the above
   1269 * this needs more work
   1270 */
   1271 
   1272 /*
   1273 * NSSTrustDomain_DisableToken
   1274 *
   1275 */
   1276 
   1277 NSS_EXTERN PRStatus
   1278 NSSTrustDomain_DisableToken(
   1279    NSSTrustDomain *td,
   1280    NSSToken *token,
   1281    NSSError why);
   1282 
   1283 /*
   1284 * NSSTrustDomain_EnableToken
   1285 *
   1286 */
   1287 
   1288 NSS_EXTERN PRStatus
   1289 NSSTrustDomain_EnableToken(
   1290    NSSTrustDomain *td,
   1291    NSSToken *token);
   1292 
   1293 /*
   1294 * NSSTrustDomain_IsTokenEnabled
   1295 *
   1296 * If disabled, "why" is always on the error stack.
   1297 * The optional argument is just for convenience.
   1298 */
   1299 
   1300 NSS_EXTERN PRStatus
   1301 NSSTrustDomain_IsTokenEnabled(
   1302    NSSTrustDomain *td,
   1303    NSSToken *token,
   1304    NSSError *whyOpt);
   1305 
   1306 /*
   1307 * NSSTrustDomain_FindTokensByURI
   1308 *
   1309 */
   1310 
   1311 NSS_EXTERN NSSToken **
   1312 NSSTrustDomain_FindTokensByURI(
   1313    NSSTrustDomain *td,
   1314    PK11URI *uri);
   1315 
   1316 /*
   1317 * NSSTrustDomain_FindSlotByName
   1318 *
   1319 */
   1320 
   1321 NSS_EXTERN NSSSlot *
   1322 NSSTrustDomain_FindSlotByName(
   1323    NSSTrustDomain *td,
   1324    NSSUTF8 *slotName);
   1325 
   1326 /*
   1327 * NSSTrustDomain_FindTokenByName
   1328 *
   1329 */
   1330 
   1331 NSS_EXTERN NSSToken *
   1332 NSSTrustDomain_FindTokenByName(
   1333    NSSTrustDomain *td,
   1334    NSSUTF8 *tokenName);
   1335 
   1336 /*
   1337 * NSSTrustDomain_FindTokenBySlotName
   1338 *
   1339 */
   1340 
   1341 NSS_EXTERN NSSToken *
   1342 NSSTrustDomain_FindTokenBySlotName(
   1343    NSSTrustDomain *td,
   1344    NSSUTF8 *slotName);
   1345 
   1346 /*
   1347 * NSSTrustDomain_FindBestTokenForAlgorithm
   1348 *
   1349 */
   1350 
   1351 NSS_EXTERN NSSToken *
   1352 NSSTrustDomain_FindTokenForAlgorithm(
   1353    NSSTrustDomain *td,
   1354    NSSOID *algorithm);
   1355 
   1356 /*
   1357 * NSSTrustDomain_FindBestTokenForAlgorithms
   1358 *
   1359 */
   1360 
   1361 NSS_EXTERN NSSToken *
   1362 NSSTrustDomain_FindBestTokenForAlgorithms(
   1363    NSSTrustDomain *td,
   1364    NSSOID *algorithms[],   /* may be null-terminated */
   1365    PRUint32 nAlgorithmsOpt /* limits the array if nonzero */
   1366 );
   1367 
   1368 /*
   1369 * NSSTrustDomain_Login
   1370 *
   1371 */
   1372 
   1373 NSS_EXTERN PRStatus
   1374 NSSTrustDomain_Login(
   1375    NSSTrustDomain *td,
   1376    NSSCallback *uhhOpt);
   1377 
   1378 /*
   1379 * NSSTrustDomain_Logout
   1380 *
   1381 */
   1382 
   1383 NSS_EXTERN PRStatus
   1384 NSSTrustDomain_Logout(NSSTrustDomain *td);
   1385 
   1386 /* Importing things */
   1387 
   1388 /*
   1389 * NSSTrustDomain_ImportCertificate
   1390 *
   1391 * The implementation will pull some data out of the certificate
   1392 * (e.g. e-mail address) for use in pkcs#11 object attributes.
   1393 */
   1394 
   1395 NSS_EXTERN NSSCertificate *
   1396 NSSTrustDomain_ImportCertificate(
   1397    NSSTrustDomain *td,
   1398    NSSCertificate *c);
   1399 
   1400 /*
   1401 * NSSTrustDomain_ImportPKIXCertificate
   1402 *
   1403 */
   1404 
   1405 NSS_EXTERN NSSCertificate *
   1406 NSSTrustDomain_ImportPKIXCertificate(
   1407    NSSTrustDomain *td,
   1408    /* declared as a struct until these "data types" are defined */
   1409    struct NSSPKIXCertificateStr *pc);
   1410 
   1411 /*
   1412 * NSSTrustDomain_ImportEncodedCertificate
   1413 *
   1414 * Imports any type of certificate we support.
   1415 */
   1416 
   1417 NSS_EXTERN NSSCertificate *
   1418 NSSTrustDomain_ImportEncodedCertificate(
   1419    NSSTrustDomain *td,
   1420    NSSBER *ber);
   1421 
   1422 /*
   1423 * NSSTrustDomain_ImportEncodedCertificateChain
   1424 *
   1425 * If you just want the leaf, pass in a maximum of one.
   1426 */
   1427 
   1428 NSS_EXTERN NSSCertificate **
   1429 NSSTrustDomain_ImportEncodedCertificateChain(
   1430    NSSTrustDomain *td,
   1431    NSSBER *ber,
   1432    NSSCertificate *rvOpt[],
   1433    PRUint32 maximumOpt, /* 0 for no max */
   1434    NSSArena *arenaOpt);
   1435 
   1436 /*
   1437 * NSSTrustDomain_ImportEncodedPrivateKey
   1438 *
   1439 */
   1440 
   1441 NSS_EXTERN NSSPrivateKey *
   1442 NSSTrustDomain_ImportEncodedPrivateKey(
   1443    NSSTrustDomain *td,
   1444    NSSBER *ber,
   1445    NSSItem *passwordOpt, /* NULL will cause a callback */
   1446    NSSCallback *uhhOpt,
   1447    NSSToken *destination);
   1448 
   1449 /*
   1450 * NSSTrustDomain_ImportEncodedPublicKey
   1451 *
   1452 */
   1453 
   1454 NSS_EXTERN NSSPublicKey *
   1455 NSSTrustDomain_ImportEncodedPublicKey(
   1456    NSSTrustDomain *td,
   1457    NSSBER *ber);
   1458 
   1459 /* Other importations: S/MIME capabilities */
   1460 
   1461 /*
   1462 * NSSTrustDomain_FindBestCertificateByNickname
   1463 *
   1464 */
   1465 
   1466 NSS_EXTERN NSSCertificate *
   1467 NSSTrustDomain_FindBestCertificateByNickname(
   1468    NSSTrustDomain *td,
   1469    const NSSUTF8 *name,
   1470    NSSTime *timeOpt, /* NULL for "now" */
   1471    NSSUsage *usage,
   1472    NSSPolicies *policiesOpt /* NULL for none */
   1473 );
   1474 
   1475 /*
   1476 * NSSTrustDomain_FindCertificatesByNickname
   1477 *
   1478 */
   1479 
   1480 NSS_EXTERN NSSCertificate **
   1481 NSSTrustDomain_FindCertificatesByNickname(
   1482    NSSTrustDomain *td,
   1483    NSSUTF8 *name,
   1484    NSSCertificate *rvOpt[],
   1485    PRUint32 maximumOpt, /* 0 for no max */
   1486    NSSArena *arenaOpt);
   1487 
   1488 /*
   1489 * NSSTrustDomain_FindCertificateByIssuerAndSerialNumber
   1490 *
   1491 */
   1492 
   1493 NSS_EXTERN NSSCertificate *
   1494 NSSTrustDomain_FindCertificateByIssuerAndSerialNumber(
   1495    NSSTrustDomain *td,
   1496    NSSDER *issuer,
   1497    NSSDER *serialNumber);
   1498 
   1499 /*
   1500 * NSSTrustDomain_FindCertificatesByIssuerAndSerialNumber
   1501 *
   1502 * Theoretically, this should never happen.  However, some companies
   1503 * we know have issued duplicate certificates with the same issuer
   1504 * and serial number.  Do we just ignore them?  I'm thinking yes.
   1505 */
   1506 
   1507 /*
   1508 * NSSTrustDomain_FindBestCertificateBySubject
   1509 *
   1510 * This does not search through alternate names hidden in extensions.
   1511 */
   1512 
   1513 NSS_EXTERN NSSCertificate *
   1514 NSSTrustDomain_FindBestCertificateBySubject(
   1515    NSSTrustDomain *td,
   1516    NSSDER /*NSSUTF8*/ *subject,
   1517    NSSTime *timeOpt,
   1518    NSSUsage *usage,
   1519    NSSPolicies *policiesOpt);
   1520 
   1521 /*
   1522 * NSSTrustDomain_FindCertificatesBySubject
   1523 *
   1524 * This does not search through alternate names hidden in extensions.
   1525 */
   1526 
   1527 NSS_EXTERN NSSCertificate **
   1528 NSSTrustDomain_FindCertificatesBySubject(
   1529    NSSTrustDomain *td,
   1530    NSSDER /*NSSUTF8*/ *subject,
   1531    NSSCertificate *rvOpt[],
   1532    PRUint32 maximumOpt, /* 0 for no max */
   1533    NSSArena *arenaOpt);
   1534 
   1535 /*
   1536 * NSSTrustDomain_FindBestCertificateByNameComponents
   1537 *
   1538 * This call does try several tricks, including a pseudo pkcs#11
   1539 * attribute for the ldap module to try as a query.  Eventually
   1540 * this call falls back to a traversal if that's what's required.
   1541 * It will search through alternate names hidden in extensions.
   1542 */
   1543 
   1544 NSS_EXTERN NSSCertificate *
   1545 NSSTrustDomain_FindBestCertificateByNameComponents(
   1546    NSSTrustDomain *td,
   1547    NSSUTF8 *nameComponents,
   1548    NSSTime *timeOpt,
   1549    NSSUsage *usage,
   1550    NSSPolicies *policiesOpt);
   1551 
   1552 /*
   1553 * NSSTrustDomain_FindCertificatesByNameComponents
   1554 *
   1555 * This call, too, tries several tricks.  It will stop on the first
   1556 * attempt that generates results, so it won't e.g. traverse the
   1557 * entire ldap database.
   1558 */
   1559 
   1560 NSS_EXTERN NSSCertificate **
   1561 NSSTrustDomain_FindCertificatesByNameComponents(
   1562    NSSTrustDomain *td,
   1563    NSSUTF8 *nameComponents,
   1564    NSSCertificate *rvOpt[],
   1565    PRUint32 maximumOpt, /* 0 for no max */
   1566    NSSArena *arenaOpt);
   1567 
   1568 /*
   1569 * NSSTrustDomain_FindCertificateByEncodedCertificate
   1570 *
   1571 */
   1572 
   1573 NSS_EXTERN NSSCertificate *
   1574 NSSTrustDomain_FindCertificateByEncodedCertificate(
   1575    NSSTrustDomain *td,
   1576    NSSBER *encodedCertificate);
   1577 
   1578 /*
   1579 * NSSTrustDomain_FindBestCertificateByEmail
   1580 *
   1581 */
   1582 
   1583 NSS_EXTERN NSSCertificate *
   1584 NSSTrustDomain_FindCertificateByEmail(
   1585    NSSTrustDomain *td,
   1586    NSSASCII7 *email,
   1587    NSSTime *timeOpt,
   1588    NSSUsage *usage,
   1589    NSSPolicies *policiesOpt);
   1590 
   1591 /*
   1592 * NSSTrustDomain_FindCertificatesByEmail
   1593 *
   1594 */
   1595 
   1596 NSS_EXTERN NSSCertificate **
   1597 NSSTrustDomain_FindCertificatesByEmail(
   1598    NSSTrustDomain *td,
   1599    NSSASCII7 *email,
   1600    NSSCertificate *rvOpt[],
   1601    PRUint32 maximumOpt, /* 0 for no max */
   1602    NSSArena *arenaOpt);
   1603 
   1604 /*
   1605 * NSSTrustDomain_FindCertificateByOCSPHash
   1606 *
   1607 * There can be only one.
   1608 */
   1609 
   1610 NSS_EXTERN NSSCertificate *
   1611 NSSTrustDomain_FindCertificateByOCSPHash(
   1612    NSSTrustDomain *td,
   1613    NSSItem *hash);
   1614 
   1615 /*
   1616 * NSSTrustDomain_TraverseCertificates
   1617 *
   1618 * This function descends from one in older versions of NSS which
   1619 * traverses the certs in the permanent database.  That function
   1620 * was used to implement selection routines, but was directly
   1621 * available too.  Trust domains are going to contain a lot more
   1622 * certs now (e.g., an ldap server), so we'd really like to
   1623 * discourage traversal.  Thus for now, this is commented out.
   1624 * If it's needed, let's look at the situation more closely to
   1625 * find out what the actual requirements are.
   1626 */
   1627 
   1628 /* For now, adding this function.  This may only be for debugging
   1629 * purposes.
   1630 * Perhaps some equivalent function, on a specified token, will be
   1631 * needed in a "friend" header file?
   1632 */
   1633 NSS_EXTERN PRStatus *
   1634 NSSTrustDomain_TraverseCertificates(
   1635    NSSTrustDomain *td,
   1636    PRStatus (*callback)(NSSCertificate *c, void *arg),
   1637    void *arg);
   1638 
   1639 /*
   1640 * NSSTrustDomain_FindBestUserCertificate
   1641 *
   1642 */
   1643 
   1644 NSS_EXTERN NSSCertificate *
   1645 NSSTrustDomain_FindBestUserCertificate(
   1646    NSSTrustDomain *td,
   1647    NSSTime *timeOpt,
   1648    NSSUsage *usage,
   1649    NSSPolicies *policiesOpt);
   1650 
   1651 /*
   1652 * NSSTrustDomain_FindUserCertificates
   1653 *
   1654 */
   1655 
   1656 NSS_EXTERN NSSCertificate **
   1657 NSSTrustDomain_FindUserCertificates(
   1658    NSSTrustDomain *td,
   1659    NSSTime *timeOpt,
   1660    NSSUsage *usageOpt,
   1661    NSSPolicies *policiesOpt,
   1662    NSSCertificate **rvOpt,
   1663    PRUint32 rvLimit, /* zero for no limit */
   1664    NSSArena *arenaOpt);
   1665 
   1666 /*
   1667 * NSSTrustDomain_FindBestUserCertificateForSSLClientAuth
   1668 *
   1669 */
   1670 
   1671 NSS_EXTERN NSSCertificate *
   1672 NSSTrustDomain_FindBestUserCertificateForSSLClientAuth(
   1673    NSSTrustDomain *td,
   1674    NSSUTF8 *sslHostOpt,
   1675    NSSDER *rootCAsOpt[],   /* null pointer for none */
   1676    PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */
   1677    NSSAlgorithmAndParameters *apOpt,
   1678    NSSPolicies *policiesOpt);
   1679 
   1680 /*
   1681 * NSSTrustDomain_FindUserCertificatesForSSLClientAuth
   1682 *
   1683 */
   1684 
   1685 NSS_EXTERN NSSCertificate **
   1686 NSSTrustDomain_FindUserCertificatesForSSLClientAuth(
   1687    NSSTrustDomain *td,
   1688    NSSUTF8 *sslHostOpt,
   1689    NSSDER *rootCAsOpt[],   /* null pointer for none */
   1690    PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */
   1691    NSSAlgorithmAndParameters *apOpt,
   1692    NSSPolicies *policiesOpt,
   1693    NSSCertificate **rvOpt,
   1694    PRUint32 rvLimit, /* zero for no limit */
   1695    NSSArena *arenaOpt);
   1696 
   1697 /*
   1698 * NSSTrustDomain_FindBestUserCertificateForEmailSigning
   1699 *
   1700 */
   1701 
   1702 NSS_EXTERN NSSCertificate *
   1703 NSSTrustDomain_FindBestUserCertificateForEmailSigning(
   1704    NSSTrustDomain *td,
   1705    NSSASCII7 *signerOpt,
   1706    NSSASCII7 *recipientOpt,
   1707    /* anything more here? */
   1708    NSSAlgorithmAndParameters *apOpt,
   1709    NSSPolicies *policiesOpt);
   1710 
   1711 /*
   1712 * NSSTrustDomain_FindUserCertificatesForEmailSigning
   1713 *
   1714 */
   1715 
   1716 NSS_EXTERN NSSCertificate **
   1717 NSSTrustDomain_FindUserCertificatesForEmailSigning(
   1718    NSSTrustDomain *td,
   1719    NSSASCII7 *signerOpt,
   1720    NSSASCII7 *recipientOpt,
   1721    /* anything more here? */
   1722    NSSAlgorithmAndParameters *apOpt,
   1723    NSSPolicies *policiesOpt,
   1724    NSSCertificate **rvOpt,
   1725    PRUint32 rvLimit, /* zero for no limit */
   1726    NSSArena *arenaOpt);
   1727 
   1728 /*
   1729 * Here is where we'd add more Find[Best]UserCertificate[s]For<usage>
   1730 * routines.
   1731 */
   1732 
   1733 /* Private Keys */
   1734 
   1735 /*
   1736 * NSSTrustDomain_GenerateKeyPair
   1737 *
   1738 * Creates persistant objects.  If you want session objects, use
   1739 * NSSCryptoContext_GenerateKeyPair.  The destination token is where
   1740 * the keys are stored.  If that token can do the required math, then
   1741 * that's where the keys are generated too.  Otherwise, the keys are
   1742 * generated elsewhere and moved to that token.
   1743 */
   1744 
   1745 NSS_EXTERN PRStatus
   1746 NSSTrustDomain_GenerateKeyPair(
   1747    NSSTrustDomain *td,
   1748    NSSAlgorithmAndParameters *ap,
   1749    NSSPrivateKey **pvkOpt,
   1750    NSSPublicKey **pbkOpt,
   1751    PRBool privateKeyIsSensitive,
   1752    NSSToken *destination,
   1753    NSSCallback *uhhOpt);
   1754 
   1755 /*
   1756 * NSSTrustDomain_TraversePrivateKeys
   1757 *
   1758 *
   1759 * NSS_EXTERN PRStatus *
   1760 * NSSTrustDomain_TraversePrivateKeys
   1761 * (
   1762 *   NSSTrustDomain *td,
   1763 *   PRStatus (*callback)(NSSPrivateKey *vk, void *arg),
   1764 *   void *arg
   1765 * );
   1766 */
   1767 
   1768 /* Symmetric Keys */
   1769 
   1770 /*
   1771 * NSSTrustDomain_GenerateSymmetricKey
   1772 *
   1773 */
   1774 
   1775 NSS_EXTERN NSSSymmetricKey *
   1776 NSSTrustDomain_GenerateSymmetricKey(
   1777    NSSTrustDomain *td,
   1778    NSSAlgorithmAndParameters *ap,
   1779    PRUint32 keysize,
   1780    NSSToken *destination,
   1781    NSSCallback *uhhOpt);
   1782 
   1783 /*
   1784 * NSSTrustDomain_GenerateSymmetricKeyFromPassword
   1785 *
   1786 */
   1787 
   1788 NSS_EXTERN NSSSymmetricKey *
   1789 NSSTrustDomain_GenerateSymmetricKeyFromPassword(
   1790    NSSTrustDomain *td,
   1791    NSSAlgorithmAndParameters *ap,
   1792    NSSUTF8 *passwordOpt, /* if null, prompt */
   1793    NSSToken *destinationOpt,
   1794    NSSCallback *uhhOpt);
   1795 
   1796 /*
   1797 * NSSTrustDomain_FindSymmetricKeyByAlgorithm
   1798 *
   1799 * Is this still needed?
   1800 *
   1801 * NSS_EXTERN NSSSymmetricKey *
   1802 * NSSTrustDomain_FindSymmetricKeyByAlgorithm
   1803 * (
   1804 *   NSSTrustDomain *td,
   1805 *   NSSOID *algorithm,
   1806 *   NSSCallback *uhhOpt
   1807 * );
   1808 */
   1809 
   1810 /*
   1811 * NSSTrustDomain_FindSymmetricKeyByAlgorithmAndKeyID
   1812 *
   1813 */
   1814 
   1815 NSS_EXTERN NSSSymmetricKey *
   1816 NSSTrustDomain_FindSymmetricKeyByAlgorithmAndKeyID(
   1817    NSSTrustDomain *td,
   1818    NSSOID *algorithm,
   1819    NSSItem *keyID,
   1820    NSSCallback *uhhOpt);
   1821 
   1822 /*
   1823 * NSSTrustDomain_TraverseSymmetricKeys
   1824 *
   1825 *
   1826 * NSS_EXTERN PRStatus *
   1827 * NSSTrustDomain_TraverseSymmetricKeys
   1828 * (
   1829 *   NSSTrustDomain *td,
   1830 *   PRStatus (*callback)(NSSSymmetricKey *mk, void *arg),
   1831 *   void *arg
   1832 * );
   1833 */
   1834 
   1835 /*
   1836 * NSSTrustDomain_CreateCryptoContext
   1837 *
   1838 * If a callback object is specified, it becomes the for the crypto
   1839 * context; otherwise, this trust domain's default (if any) is
   1840 * inherited.
   1841 */
   1842 
   1843 NSS_EXTERN NSSCryptoContext *
   1844 NSSTrustDomain_CreateCryptoContext(
   1845    NSSTrustDomain *td,
   1846    NSSCallback *uhhOpt);
   1847 
   1848 /*
   1849 * NSSTrustDomain_CreateCryptoContextForAlgorithm
   1850 *
   1851 */
   1852 
   1853 NSS_EXTERN NSSCryptoContext *
   1854 NSSTrustDomain_CreateCryptoContextForAlgorithm(
   1855    NSSTrustDomain *td,
   1856    NSSOID *algorithm);
   1857 
   1858 /*
   1859 * NSSTrustDomain_CreateCryptoContextForAlgorithmAndParameters
   1860 *
   1861 */
   1862 
   1863 NSS_EXTERN NSSCryptoContext *
   1864 NSSTrustDomain_CreateCryptoContextForAlgorithmAndParameters(
   1865    NSSTrustDomain *td,
   1866    NSSAlgorithmAndParameters *ap);
   1867 
   1868 /* find/traverse other objects, e.g. s/mime profiles */
   1869 
   1870 /*
   1871 * NSSCryptoContext
   1872 *
   1873 * A crypto context is sort of a short-term snapshot of a trust domain,
   1874 * used for the life of "one crypto operation."  You can also think of
   1875 * it as a "temporary database."
   1876 *
   1877 * Just about all of the things you can do with a trust domain -- importing
   1878 * or creating certs, keys, etc. -- can be done with a crypto context.
   1879 * The difference is that the objects will be temporary ("session") objects.
   1880 *
   1881 * Also, if the context was created for a key, cert, and/or algorithm; or
   1882 * if such objects have been "associated" with the context, then the context
   1883 * can do everything the keys can, like crypto operations.
   1884 *
   1885 * And finally, because it keeps the state of the crypto operations, it
   1886 * can do streaming crypto ops.
   1887 */
   1888 
   1889 /*
   1890 * NSSTrustDomain_Destroy
   1891 *
   1892 */
   1893 
   1894 NSS_EXTERN PRStatus
   1895 NSSCryptoContext_Destroy(NSSCryptoContext *cc);
   1896 
   1897 /* establishing a default callback */
   1898 
   1899 /*
   1900 * NSSCryptoContext_SetDefaultCallback
   1901 *
   1902 */
   1903 
   1904 NSS_EXTERN PRStatus
   1905 NSSCryptoContext_SetDefaultCallback(
   1906    NSSCryptoContext *cc,
   1907    NSSCallback *newCallback,
   1908    NSSCallback **oldCallbackOpt);
   1909 
   1910 /*
   1911 * NSSCryptoContext_GetDefaultCallback
   1912 *
   1913 */
   1914 
   1915 NSS_EXTERN NSSCallback *
   1916 NSSCryptoContext_GetDefaultCallback(
   1917    NSSCryptoContext *cc,
   1918    PRStatus *statusOpt);
   1919 
   1920 /*
   1921 * NSSCryptoContext_GetTrustDomain
   1922 *
   1923 */
   1924 
   1925 NSS_EXTERN NSSTrustDomain *
   1926 NSSCryptoContext_GetTrustDomain(
   1927    NSSCryptoContext *cc);
   1928 
   1929 /* AddModule, etc: should we allow "temporary" changes here? */
   1930 /* DisableToken, etc: ditto */
   1931 /* Ordering of tokens? */
   1932 /* Finding slots+token etc. */
   1933 /* login+logout */
   1934 
   1935 /* Importing things */
   1936 
   1937 /*
   1938 * NSSCryptoContext_FindOrImportCertificate
   1939 *
   1940 * If the certificate store already contains this DER cert, return the
   1941 * address of the matching NSSCertificate that is already in the store,
   1942 * and bump its reference count.
   1943 *
   1944 * If this DER cert is NOT already in the store, then add the new
   1945 * NSSCertificate to the store and bump its reference count,
   1946 * then return its address.
   1947 *
   1948 * if this DER cert is not in the store and cannot be added to it,
   1949 * return NULL;
   1950 *
   1951 * Record the associated crypto context in the certificate.
   1952 */
   1953 
   1954 NSS_EXTERN NSSCertificate *
   1955 NSSCryptoContext_FindOrImportCertificate(
   1956    NSSCryptoContext *cc,
   1957    NSSCertificate *c);
   1958 
   1959 /*
   1960 * NSSCryptoContext_ImportPKIXCertificate
   1961 *
   1962 */
   1963 
   1964 NSS_EXTERN NSSCertificate *
   1965 NSSCryptoContext_ImportPKIXCertificate(
   1966    NSSCryptoContext *cc,
   1967    struct NSSPKIXCertificateStr *pc);
   1968 
   1969 /*
   1970 * NSSCryptoContext_ImportEncodedCertificate
   1971 *
   1972 */
   1973 
   1974 NSS_EXTERN NSSCertificate *
   1975 NSSCryptoContext_ImportEncodedCertificate(
   1976    NSSCryptoContext *cc,
   1977    NSSBER *ber);
   1978 
   1979 /*
   1980 * NSSCryptoContext_ImportEncodedPKIXCertificateChain
   1981 *
   1982 */
   1983 
   1984 NSS_EXTERN PRStatus
   1985 NSSCryptoContext_ImportEncodedPKIXCertificateChain(
   1986    NSSCryptoContext *cc,
   1987    NSSBER *ber);
   1988 
   1989 /* Other importations: S/MIME capabilities
   1990 */
   1991 
   1992 /*
   1993 * NSSCryptoContext_FindBestCertificateByNickname
   1994 *
   1995 */
   1996 
   1997 NSS_EXTERN NSSCertificate *
   1998 NSSCryptoContext_FindBestCertificateByNickname(
   1999    NSSCryptoContext *cc,
   2000    const NSSUTF8 *name,
   2001    NSSTime *timeOpt, /* NULL for "now" */
   2002    NSSUsage *usage,
   2003    NSSPolicies *policiesOpt /* NULL for none */
   2004 );
   2005 
   2006 /*
   2007 * NSSCryptoContext_FindCertificatesByNickname
   2008 *
   2009 */
   2010 
   2011 NSS_EXTERN NSSCertificate **
   2012 NSSCryptoContext_FindCertificatesByNickname(
   2013    NSSCryptoContext *cc,
   2014    NSSUTF8 *name,
   2015    NSSCertificate *rvOpt[],
   2016    PRUint32 maximumOpt, /* 0 for no max */
   2017    NSSArena *arenaOpt);
   2018 
   2019 /*
   2020 * NSSCryptoContext_FindCertificateByIssuerAndSerialNumber
   2021 *
   2022 */
   2023 
   2024 NSS_EXTERN NSSCertificate *
   2025 NSSCryptoContext_FindCertificateByIssuerAndSerialNumber(
   2026    NSSCryptoContext *cc,
   2027    NSSDER *issuer,
   2028    NSSDER *serialNumber);
   2029 
   2030 /*
   2031 * NSSCryptoContext_FindBestCertificateBySubject
   2032 *
   2033 * This does not search through alternate names hidden in extensions.
   2034 */
   2035 
   2036 NSS_EXTERN NSSCertificate *
   2037 NSSCryptoContext_FindBestCertificateBySubject(
   2038    NSSCryptoContext *cc,
   2039    NSSDER /*NSSUTF8*/ *subject,
   2040    NSSTime *timeOpt,
   2041    NSSUsage *usage,
   2042    NSSPolicies *policiesOpt);
   2043 
   2044 /*
   2045 * NSSCryptoContext_FindCertificatesBySubject
   2046 *
   2047 * This does not search through alternate names hidden in extensions.
   2048 */
   2049 
   2050 NSS_EXTERN NSSCertificate **
   2051 NSSCryptoContext_FindCertificatesBySubject(
   2052    NSSCryptoContext *cc,
   2053    NSSDER /*NSSUTF8*/ *subject,
   2054    NSSCertificate *rvOpt[],
   2055    PRUint32 maximumOpt, /* 0 for no max */
   2056    NSSArena *arenaOpt);
   2057 
   2058 /*
   2059 * NSSCryptoContext_FindBestCertificateByNameComponents
   2060 *
   2061 * This call does try several tricks, including a pseudo pkcs#11
   2062 * attribute for the ldap module to try as a query.  Eventually
   2063 * this call falls back to a traversal if that's what's required.
   2064 * It will search through alternate names hidden in extensions.
   2065 */
   2066 
   2067 NSS_EXTERN NSSCertificate *
   2068 NSSCryptoContext_FindBestCertificateByNameComponents(
   2069    NSSCryptoContext *cc,
   2070    NSSUTF8 *nameComponents,
   2071    NSSTime *timeOpt,
   2072    NSSUsage *usage,
   2073    NSSPolicies *policiesOpt);
   2074 
   2075 /*
   2076 * NSSCryptoContext_FindCertificatesByNameComponents
   2077 *
   2078 * This call, too, tries several tricks.  It will stop on the first
   2079 * attempt that generates results, so it won't e.g. traverse the
   2080 * entire ldap database.
   2081 */
   2082 
   2083 NSS_EXTERN NSSCertificate **
   2084 NSSCryptoContext_FindCertificatesByNameComponents(
   2085    NSSCryptoContext *cc,
   2086    NSSUTF8 *nameComponents,
   2087    NSSCertificate *rvOpt[],
   2088    PRUint32 maximumOpt, /* 0 for no max */
   2089    NSSArena *arenaOpt);
   2090 
   2091 /*
   2092 * NSSCryptoContext_FindCertificateByEncodedCertificate
   2093 *
   2094 */
   2095 
   2096 NSS_EXTERN NSSCertificate *
   2097 NSSCryptoContext_FindCertificateByEncodedCertificate(
   2098    NSSCryptoContext *cc,
   2099    NSSBER *encodedCertificate);
   2100 
   2101 /*
   2102 * NSSCryptoContext_FindBestCertificateByEmail
   2103 *
   2104 */
   2105 
   2106 NSS_EXTERN NSSCertificate *
   2107 NSSCryptoContext_FindBestCertificateByEmail(
   2108    NSSCryptoContext *cc,
   2109    NSSASCII7 *email,
   2110    NSSTime *timeOpt,
   2111    NSSUsage *usage,
   2112    NSSPolicies *policiesOpt);
   2113 
   2114 /*
   2115 * NSSCryptoContext_FindCertificatesByEmail
   2116 *
   2117 */
   2118 
   2119 NSS_EXTERN NSSCertificate **
   2120 NSSCryptoContext_FindCertificatesByEmail(
   2121    NSSCryptoContext *cc,
   2122    NSSASCII7 *email,
   2123    NSSCertificate *rvOpt[],
   2124    PRUint32 maximumOpt, /* 0 for no max */
   2125    NSSArena *arenaOpt);
   2126 
   2127 /*
   2128 * NSSCryptoContext_FindCertificateByOCSPHash
   2129 *
   2130 */
   2131 
   2132 NSS_EXTERN NSSCertificate *
   2133 NSSCryptoContext_FindCertificateByOCSPHash(
   2134    NSSCryptoContext *cc,
   2135    NSSItem *hash);
   2136 
   2137 /*
   2138 * NSSCryptoContext_TraverseCertificates
   2139 *
   2140 *
   2141 * NSS_EXTERN PRStatus *
   2142 * NSSCryptoContext_TraverseCertificates
   2143 * (
   2144 *   NSSCryptoContext *cc,
   2145 *   PRStatus (*callback)(NSSCertificate *c, void *arg),
   2146 *   void *arg
   2147 * );
   2148 */
   2149 
   2150 /*
   2151 * NSSCryptoContext_FindBestUserCertificate
   2152 *
   2153 */
   2154 
   2155 NSS_EXTERN NSSCertificate *
   2156 NSSCryptoContext_FindBestUserCertificate(
   2157    NSSCryptoContext *cc,
   2158    NSSTime *timeOpt,
   2159    NSSUsage *usage,
   2160    NSSPolicies *policiesOpt);
   2161 
   2162 /*
   2163 * NSSCryptoContext_FindUserCertificates
   2164 *
   2165 */
   2166 
   2167 NSS_EXTERN NSSCertificate **
   2168 NSSCryptoContext_FindUserCertificates(
   2169    NSSCryptoContext *cc,
   2170    NSSTime *timeOpt,
   2171    NSSUsage *usageOpt,
   2172    NSSPolicies *policiesOpt,
   2173    NSSCertificate **rvOpt,
   2174    PRUint32 rvLimit, /* zero for no limit */
   2175    NSSArena *arenaOpt);
   2176 
   2177 /*
   2178 * NSSCryptoContext_FindBestUserCertificateForSSLClientAuth
   2179 *
   2180 */
   2181 
   2182 NSS_EXTERN NSSCertificate *
   2183 NSSCryptoContext_FindBestUserCertificateForSSLClientAuth(
   2184    NSSCryptoContext *cc,
   2185    NSSUTF8 *sslHostOpt,
   2186    NSSDER *rootCAsOpt[],   /* null pointer for none */
   2187    PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */
   2188    NSSAlgorithmAndParameters *apOpt,
   2189    NSSPolicies *policiesOpt);
   2190 
   2191 /*
   2192 * NSSCryptoContext_FindUserCertificatesForSSLClientAuth
   2193 *
   2194 */
   2195 
   2196 NSS_EXTERN NSSCertificate **
   2197 NSSCryptoContext_FindUserCertificatesForSSLClientAuth(
   2198    NSSCryptoContext *cc,
   2199    NSSUTF8 *sslHostOpt,
   2200    NSSDER *rootCAsOpt[],   /* null pointer for none */
   2201    PRUint32 rootCAsMaxOpt, /* zero means list is null-terminated */
   2202    NSSAlgorithmAndParameters *apOpt,
   2203    NSSPolicies *policiesOpt,
   2204    NSSCertificate **rvOpt,
   2205    PRUint32 rvLimit, /* zero for no limit */
   2206    NSSArena *arenaOpt);
   2207 
   2208 /*
   2209 * NSSCryptoContext_FindBestUserCertificateForEmailSigning
   2210 *
   2211 */
   2212 
   2213 NSS_EXTERN NSSCertificate *
   2214 NSSCryptoContext_FindBestUserCertificateForEmailSigning(
   2215    NSSCryptoContext *cc,
   2216    NSSASCII7 *signerOpt,
   2217    NSSASCII7 *recipientOpt,
   2218    /* anything more here? */
   2219    NSSAlgorithmAndParameters *apOpt,
   2220    NSSPolicies *policiesOpt);
   2221 
   2222 /*
   2223 * NSSCryptoContext_FindUserCertificatesForEmailSigning
   2224 *
   2225 */
   2226 
   2227 NSS_EXTERN NSSCertificate *
   2228 NSSCryptoContext_FindUserCertificatesForEmailSigning(
   2229    NSSCryptoContext *cc,
   2230    NSSASCII7 *signerOpt, /* fgmr or a more general name? */
   2231    NSSASCII7 *recipientOpt,
   2232    /* anything more here? */
   2233    NSSAlgorithmAndParameters *apOpt,
   2234    NSSPolicies *policiesOpt,
   2235    NSSCertificate **rvOpt,
   2236    PRUint32 rvLimit, /* zero for no limit */
   2237    NSSArena *arenaOpt);
   2238 
   2239 /* Private Keys */
   2240 
   2241 /*
   2242 * NSSCryptoContext_GenerateKeyPair
   2243 *
   2244 * Creates session objects.  If you want persistant objects, use
   2245 * NSSTrustDomain_GenerateKeyPair.  The destination token is where
   2246 * the keys are stored.  If that token can do the required math, then
   2247 * that's where the keys are generated too.  Otherwise, the keys are
   2248 * generated elsewhere and moved to that token.
   2249 */
   2250 
   2251 NSS_EXTERN PRStatus
   2252 NSSCryptoContext_GenerateKeyPair(
   2253    NSSCryptoContext *cc,
   2254    NSSAlgorithmAndParameters *ap,
   2255    NSSPrivateKey **pvkOpt,
   2256    NSSPublicKey **pbkOpt,
   2257    PRBool privateKeyIsSensitive,
   2258    NSSToken *destination,
   2259    NSSCallback *uhhOpt);
   2260 
   2261 /*
   2262 * NSSCryptoContext_TraversePrivateKeys
   2263 *
   2264 *
   2265 * NSS_EXTERN PRStatus *
   2266 * NSSCryptoContext_TraversePrivateKeys
   2267 * (
   2268 *   NSSCryptoContext *cc,
   2269 *   PRStatus (*callback)(NSSPrivateKey *vk, void *arg),
   2270 *   void *arg
   2271 * );
   2272 */
   2273 
   2274 /* Symmetric Keys */
   2275 
   2276 /*
   2277 * NSSCryptoContext_GenerateSymmetricKey
   2278 *
   2279 */
   2280 
   2281 NSS_EXTERN NSSSymmetricKey *
   2282 NSSCryptoContext_GenerateSymmetricKey(
   2283    NSSCryptoContext *cc,
   2284    NSSAlgorithmAndParameters *ap,
   2285    PRUint32 keysize,
   2286    NSSToken *destination,
   2287    NSSCallback *uhhOpt);
   2288 
   2289 /*
   2290 * NSSCryptoContext_GenerateSymmetricKeyFromPassword
   2291 *
   2292 */
   2293 
   2294 NSS_EXTERN NSSSymmetricKey *
   2295 NSSCryptoContext_GenerateSymmetricKeyFromPassword(
   2296    NSSCryptoContext *cc,
   2297    NSSAlgorithmAndParameters *ap,
   2298    NSSUTF8 *passwordOpt, /* if null, prompt */
   2299    NSSToken *destinationOpt,
   2300    NSSCallback *uhhOpt);
   2301 
   2302 /*
   2303 * NSSCryptoContext_FindSymmetricKeyByAlgorithm
   2304 *
   2305 *
   2306 * NSS_EXTERN NSSSymmetricKey *
   2307 * NSSCryptoContext_FindSymmetricKeyByType
   2308 * (
   2309 *   NSSCryptoContext *cc,
   2310 *   NSSOID *type,
   2311 *   NSSCallback *uhhOpt
   2312 * );
   2313 */
   2314 
   2315 /*
   2316 * NSSCryptoContext_FindSymmetricKeyByAlgorithmAndKeyID
   2317 *
   2318 */
   2319 
   2320 NSS_EXTERN NSSSymmetricKey *
   2321 NSSCryptoContext_FindSymmetricKeyByAlgorithmAndKeyID(
   2322    NSSCryptoContext *cc,
   2323    NSSOID *algorithm,
   2324    NSSItem *keyID,
   2325    NSSCallback *uhhOpt);
   2326 
   2327 /*
   2328 * NSSCryptoContext_TraverseSymmetricKeys
   2329 *
   2330 *
   2331 * NSS_EXTERN PRStatus *
   2332 * NSSCryptoContext_TraverseSymmetricKeys
   2333 * (
   2334 *   NSSCryptoContext *cc,
   2335 *   PRStatus (*callback)(NSSSymmetricKey *mk, void *arg),
   2336 *   void *arg
   2337 * );
   2338 */
   2339 
   2340 /* Crypto ops on distinguished keys */
   2341 
   2342 /*
   2343 * NSSCryptoContext_Decrypt
   2344 *
   2345 */
   2346 
   2347 NSS_EXTERN NSSItem *
   2348 NSSCryptoContext_Decrypt(
   2349    NSSCryptoContext *cc,
   2350    NSSAlgorithmAndParameters *apOpt,
   2351    NSSItem *encryptedData,
   2352    NSSCallback *uhhOpt,
   2353    NSSItem *rvOpt,
   2354    NSSArena *arenaOpt);
   2355 
   2356 /*
   2357 * NSSCryptoContext_BeginDecrypt
   2358 *
   2359 */
   2360 
   2361 NSS_EXTERN PRStatus
   2362 NSSCryptoContext_BeginDecrypt(
   2363    NSSCryptoContext *cc,
   2364    NSSAlgorithmAndParameters *apOpt,
   2365    NSSCallback *uhhOpt);
   2366 
   2367 /*
   2368 * NSSCryptoContext_ContinueDecrypt
   2369 *
   2370 */
   2371 
   2372 /*
   2373 * NSSItem semantics:
   2374 *
   2375 *   If rvOpt is NULL, a new NSSItem and buffer are allocated.
   2376 *   If rvOpt is not null, but the buffer pointer is null,
   2377 *     then rvOpt is returned but a new buffer is allocated.
   2378 *     In this case, if the length value is not zero, then
   2379 *     no more than that much space will be allocated.
   2380 *   If rvOpt is not null and the buffer pointer is not null,
   2381 *     then that buffer is re-used.  No more than the buffer
   2382 *     length value will be used; if it's not enough, an
   2383 *     error is returned.  If less is used, the number is
   2384 *     adjusted downwards.
   2385 *
   2386 *  Note that although this is short of some ideal "Item"
   2387 *  definition, we can usually tell how big these buffers
   2388 *  have to be.
   2389 *
   2390 *  Feedback is requested; and earlier is better than later.
   2391 */
   2392 
   2393 NSS_EXTERN NSSItem *
   2394 NSSCryptoContext_ContinueDecrypt(
   2395    NSSCryptoContext *cc,
   2396    NSSItem *data,
   2397    NSSItem *rvOpt,
   2398    NSSArena *arenaOpt);
   2399 
   2400 /*
   2401 * NSSCryptoContext_FinishDecrypt
   2402 *
   2403 */
   2404 
   2405 NSS_EXTERN NSSItem *
   2406 NSSCryptoContext_FinishDecrypt(
   2407    NSSCryptoContext *cc,
   2408    NSSItem *rvOpt,
   2409    NSSArena *arenaOpt);
   2410 
   2411 /*
   2412 * NSSCryptoContext_Sign
   2413 *
   2414 */
   2415 
   2416 NSS_EXTERN NSSItem *
   2417 NSSCryptoContext_Sign(
   2418    NSSCryptoContext *cc,
   2419    NSSAlgorithmAndParameters *apOpt,
   2420    NSSItem *data,
   2421    NSSCallback *uhhOpt,
   2422    NSSItem *rvOpt,
   2423    NSSArena *arenaOpt);
   2424 
   2425 /*
   2426 * NSSCryptoContext_BeginSign
   2427 *
   2428 */
   2429 
   2430 NSS_EXTERN PRStatus
   2431 NSSCryptoContext_BeginSign(
   2432    NSSCryptoContext *cc,
   2433    NSSAlgorithmAndParameters *apOpt,
   2434    NSSCallback *uhhOpt);
   2435 
   2436 /*
   2437 * NSSCryptoContext_ContinueSign
   2438 *
   2439 */
   2440 
   2441 NSS_EXTERN PRStatus
   2442 NSSCryptoContext_ContinueSign(
   2443    NSSCryptoContext *cc,
   2444    NSSItem *data);
   2445 
   2446 /*
   2447 * NSSCryptoContext_FinishSign
   2448 *
   2449 */
   2450 
   2451 NSS_EXTERN NSSItem *
   2452 NSSCryptoContext_FinishSign(
   2453    NSSCryptoContext *cc,
   2454    NSSItem *rvOpt,
   2455    NSSArena *arenaOpt);
   2456 
   2457 /*
   2458 * NSSCryptoContext_SignRecover
   2459 *
   2460 */
   2461 
   2462 NSS_EXTERN NSSItem *
   2463 NSSCryptoContext_SignRecover(
   2464    NSSCryptoContext *cc,
   2465    NSSAlgorithmAndParameters *apOpt,
   2466    NSSItem *data,
   2467    NSSCallback *uhhOpt,
   2468    NSSItem *rvOpt,
   2469    NSSArena *arenaOpt);
   2470 
   2471 /*
   2472 * NSSCryptoContext_BeginSignRecover
   2473 *
   2474 */
   2475 
   2476 NSS_EXTERN PRStatus
   2477 NSSCryptoContext_BeginSignRecover(
   2478    NSSCryptoContext *cc,
   2479    NSSAlgorithmAndParameters *apOpt,
   2480    NSSCallback *uhhOpt);
   2481 
   2482 /*
   2483 * NSSCryptoContext_ContinueSignRecover
   2484 *
   2485 */
   2486 
   2487 NSS_EXTERN NSSItem *
   2488 NSSCryptoContext_ContinueSignRecover(
   2489    NSSCryptoContext *cc,
   2490    NSSItem *data,
   2491    NSSItem *rvOpt,
   2492    NSSArena *arenaOpt);
   2493 
   2494 /*
   2495 * NSSCryptoContext_FinishSignRecover
   2496 *
   2497 */
   2498 
   2499 NSS_EXTERN NSSItem *
   2500 NSSCryptoContext_FinishSignRecover(
   2501    NSSCryptoContext *cc,
   2502    NSSItem *rvOpt,
   2503    NSSArena *arenaOpt);
   2504 
   2505 /*
   2506 * NSSCryptoContext_UnwrapSymmetricKey
   2507 *
   2508 */
   2509 
   2510 NSS_EXTERN NSSSymmetricKey *
   2511 NSSCryptoContext_UnwrapSymmetricKey(
   2512    NSSCryptoContext *cc,
   2513    NSSAlgorithmAndParameters *apOpt,
   2514    NSSItem *wrappedKey,
   2515    NSSCallback *uhhOpt);
   2516 
   2517 /*
   2518 * NSSCryptoContext_DeriveSymmetricKey
   2519 *
   2520 */
   2521 
   2522 NSS_EXTERN NSSSymmetricKey *
   2523 NSSCryptoContext_DeriveSymmetricKey(
   2524    NSSCryptoContext *cc,
   2525    NSSPublicKey *bk,
   2526    NSSAlgorithmAndParameters *apOpt,
   2527    NSSOID *target,
   2528    PRUint32 keySizeOpt, /* zero for best allowed */
   2529    NSSOperations operations,
   2530    NSSCallback *uhhOpt);
   2531 
   2532 /*
   2533 * NSSCryptoContext_Encrypt
   2534 *
   2535 * Encrypt a single chunk of data with the distinguished public key
   2536 * of this crypto context.
   2537 */
   2538 
   2539 NSS_EXTERN NSSItem *
   2540 NSSCryptoContext_Encrypt(
   2541    NSSCryptoContext *cc,
   2542    NSSAlgorithmAndParameters *apOpt,
   2543    NSSItem *data,
   2544    NSSCallback *uhhOpt,
   2545    NSSItem *rvOpt,
   2546    NSSArena *arenaOpt);
   2547 
   2548 /*
   2549 * NSSCryptoContext_BeginEncrypt
   2550 *
   2551 */
   2552 
   2553 NSS_EXTERN PRStatus
   2554 NSSCryptoContext_BeginEncrypt(
   2555    NSSCryptoContext *cc,
   2556    NSSAlgorithmAndParameters *apOpt,
   2557    NSSCallback *uhhOpt);
   2558 
   2559 /*
   2560 * NSSCryptoContext_ContinueEncrypt
   2561 *
   2562 */
   2563 
   2564 NSS_EXTERN NSSItem *
   2565 NSSCryptoContext_ContinueEncrypt(
   2566    NSSCryptoContext *cc,
   2567    NSSItem *data,
   2568    NSSItem *rvOpt,
   2569    NSSArena *arenaOpt);
   2570 
   2571 /*
   2572 * NSSCryptoContext_FinishEncrypt
   2573 *
   2574 */
   2575 
   2576 NSS_EXTERN NSSItem *
   2577 NSSCryptoContext_FinishEncrypt(
   2578    NSSCryptoContext *cc,
   2579    NSSItem *rvOpt,
   2580    NSSArena *arenaOpt);
   2581 
   2582 /*
   2583 * NSSCryptoContext_Verify
   2584 *
   2585 */
   2586 
   2587 NSS_EXTERN PRStatus
   2588 NSSCryptoContext_Verify(
   2589    NSSCryptoContext *cc,
   2590    NSSAlgorithmAndParameters *apOpt,
   2591    NSSItem *data,
   2592    NSSItem *signature,
   2593    NSSCallback *uhhOpt);
   2594 
   2595 /*
   2596 * NSSCryptoContext_BeginVerify
   2597 *
   2598 */
   2599 
   2600 NSS_EXTERN PRStatus
   2601 NSSCryptoContext_BeginVerify(
   2602    NSSCryptoContext *cc,
   2603    NSSAlgorithmAndParameters *apOpt,
   2604    NSSItem *signature,
   2605    NSSCallback *uhhOpt);
   2606 
   2607 /*
   2608 * NSSCryptoContext_ContinueVerify
   2609 *
   2610 */
   2611 
   2612 NSS_EXTERN PRStatus
   2613 NSSCryptoContext_ContinueVerify(
   2614    NSSCryptoContext *cc,
   2615    NSSItem *data);
   2616 
   2617 /*
   2618 * NSSCryptoContext_FinishVerify
   2619 *
   2620 */
   2621 
   2622 NSS_EXTERN PRStatus
   2623 NSSCryptoContext_FinishVerify(
   2624    NSSCryptoContext *cc);
   2625 
   2626 /*
   2627 * NSSCryptoContext_VerifyRecover
   2628 *
   2629 */
   2630 
   2631 NSS_EXTERN NSSItem *
   2632 NSSCryptoContext_VerifyRecover(
   2633    NSSCryptoContext *cc,
   2634    NSSAlgorithmAndParameters *apOpt,
   2635    NSSItem *signature,
   2636    NSSCallback *uhhOpt,
   2637    NSSItem *rvOpt,
   2638    NSSArena *arenaOpt);
   2639 
   2640 /*
   2641 * NSSCryptoContext_BeginVerifyRecover
   2642 *
   2643 */
   2644 
   2645 NSS_EXTERN PRStatus
   2646 NSSCryptoContext_BeginVerifyRecover(
   2647    NSSCryptoContext *cc,
   2648    NSSAlgorithmAndParameters *apOpt,
   2649    NSSCallback *uhhOpt);
   2650 
   2651 /*
   2652 * NSSCryptoContext_ContinueVerifyRecover
   2653 *
   2654 */
   2655 
   2656 NSS_EXTERN NSSItem *
   2657 NSSCryptoContext_ContinueVerifyRecover(
   2658    NSSCryptoContext *cc,
   2659    NSSItem *data,
   2660    NSSItem *rvOpt,
   2661    NSSArena *arenaOpt);
   2662 
   2663 /*
   2664 * NSSCryptoContext_FinishVerifyRecover
   2665 *
   2666 */
   2667 
   2668 NSS_EXTERN NSSItem *
   2669 NSSCryptoContext_FinishVerifyRecover(
   2670    NSSCryptoContext *cc,
   2671    NSSItem *rvOpt,
   2672    NSSArena *arenaOpt);
   2673 
   2674 /*
   2675 * NSSCryptoContext_WrapSymmetricKey
   2676 *
   2677 */
   2678 
   2679 NSS_EXTERN NSSItem *
   2680 NSSCryptoContext_WrapSymmetricKey(
   2681    NSSCryptoContext *cc,
   2682    NSSAlgorithmAndParameters *apOpt,
   2683    NSSSymmetricKey *keyToWrap,
   2684    NSSCallback *uhhOpt,
   2685    NSSItem *rvOpt,
   2686    NSSArena *arenaOpt);
   2687 
   2688 /*
   2689 * NSSCryptoContext_Digest
   2690 *
   2691 * Digest a single chunk of data with the distinguished digest key
   2692 * of this crypto context.
   2693 */
   2694 
   2695 NSS_EXTERN NSSItem *
   2696 NSSCryptoContext_Digest(
   2697    NSSCryptoContext *cc,
   2698    NSSAlgorithmAndParameters *apOpt,
   2699    NSSItem *data,
   2700    NSSCallback *uhhOpt,
   2701    NSSItem *rvOpt,
   2702    NSSArena *arenaOpt);
   2703 
   2704 /*
   2705 * NSSCryptoContext_BeginDigest
   2706 *
   2707 */
   2708 
   2709 NSS_EXTERN PRStatus
   2710 NSSCryptoContext_BeginDigest(
   2711    NSSCryptoContext *cc,
   2712    NSSAlgorithmAndParameters *apOpt,
   2713    NSSCallback *uhhOpt);
   2714 
   2715 /*
   2716 * NSSCryptoContext_ContinueDigest
   2717 *
   2718 */
   2719 
   2720 NSS_EXTERN PRStatus
   2721 NSSCryptoContext_ContinueDigest(
   2722    NSSCryptoContext *cc,
   2723    NSSAlgorithmAndParameters *apOpt,
   2724    NSSItem *item);
   2725 
   2726 /*
   2727 * NSSCryptoContext_FinishDigest
   2728 *
   2729 */
   2730 
   2731 NSS_EXTERN NSSItem *
   2732 NSSCryptoContext_FinishDigest(
   2733    NSSCryptoContext *cc,
   2734    NSSItem *rvOpt,
   2735    NSSArena *arenaOpt);
   2736 
   2737 /*
   2738 * tbd: Combination ops
   2739 */
   2740 
   2741 /*
   2742 * NSSCryptoContext_Clone
   2743 *
   2744 */
   2745 
   2746 NSS_EXTERN NSSCryptoContext *
   2747 NSSCryptoContext_Clone(NSSCryptoContext *cc);
   2748 
   2749 /*
   2750 * NSSCryptoContext_Save
   2751 * NSSCryptoContext_Restore
   2752 *
   2753 * We need to be able to save and restore the state of contexts.
   2754 * Perhaps a mark-and-release mechanism would be better?
   2755 */
   2756 
   2757 /*
   2758 * ..._SignTBSCertificate
   2759 *
   2760 * This requires feedback from the cert server team.
   2761 */
   2762 
   2763 /*
   2764 * PRBool NSSCertificate_GetIsTrustedFor{xxx}(NSSCertificate *c);
   2765 * PRStatus NSSCertificate_SetIsTrustedFor{xxx}(NSSCertificate *c, PRBool trusted);
   2766 *
   2767 * These will be helper functions which get the trust object for a cert,
   2768 * and then call the corresponding function(s) on it.
   2769 *
   2770 * PKIX trust objects will have methods to manipulate the low-level trust
   2771 * bits (which are based on key usage and extended key usage), and also the
   2772 * conceptual high-level usages (e.g. ssl client auth, email encryption, etc.)
   2773 *
   2774 * Other types of trust objects (if any) might have different low-level
   2775 * representations, but hopefully high-level concepts would map.
   2776 *
   2777 * Only these high-level general routines would be promoted to the
   2778 * general certificate level here.  Hence the {xxx} above would be things
   2779 * like "EmailSigning."
   2780 *
   2781 *
   2782 * NSSPKIXTrust *NSSCertificate_GetPKIXTrustObject(NSSCertificate *c);
   2783 * PRStatus NSSCertificate_SetPKIXTrustObject(NSSCertificate *c, NSPKIXTrust *t);
   2784 *
   2785 * I want to hold off on any general trust object until we've investigated
   2786 * other models more thoroughly.
   2787 */
   2788 
   2789 PR_END_EXTERN_C
   2790 
   2791 #endif /* NSSPKI_H */