tor-browser

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

nsspkit.h (7251B)


      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 NSSPKIT_H
      6 #define NSSPKIT_H
      7 
      8 /*
      9 * nsspkit.h
     10 *
     11 * This file defines the types of the top-level PKI objects.
     12 */
     13 
     14 #ifndef NSSBASET_H
     15 #include "nssbaset.h"
     16 #endif /* NSSBASET_H */
     17 
     18 PR_BEGIN_EXTERN_C
     19 
     20 /*
     21 * NSSCertificate
     22 *
     23 * This is the public representation of a Certificate.  The certificate
     24 * may be one found on a smartcard or other token, one decoded from data
     25 * received as part of a protocol, one constructed from constituent
     26 * parts, etc.  Usually it is associated with ("in") a trust domain; as
     27 * it can be verified only within a trust domain.  The underlying type
     28 * of certificate may be of any supported standard, e.g. PKIX, PGP, etc.
     29 *
     30 * People speak of "verifying (with) the server's, or correspondant's,
     31 * certificate"; for simple operations we support that simplification
     32 * by implementing public-key crypto operations as methods on this type.
     33 */
     34 
     35 struct NSSCertificateStr;
     36 typedef struct NSSCertificateStr NSSCertificate;
     37 
     38 /*
     39 * NSSUserCertificate
     40 *
     41 * A ``User'' certificate is one for which the private key is available.
     42 * People speak of "using my certificate to sign my email" and "using
     43 * my certificate to authenticate to (or login to) the server"; for
     44 * simple operations, we support that simplification by implementing
     45 * private-key crypto operations as methods on this type.
     46 *
     47 * The current design only weakly distinguishes between certificates
     48 * and user certificates: as far as the compiler goes they're
     49 * interchangeable; debug libraries only have one common pointer-tracker;
     50 * etc.  However, attempts to do private-key operations on a certificate
     51 * for which the private key is not available will fail.
     52 *
     53 * Open design question: should these types be more firmly separated?
     54 */
     55 
     56 typedef NSSCertificate NSSUserCertificate;
     57 
     58 /*
     59 * NSSPrivateKey
     60 *
     61 * This is the public representation of a Private Key.  In general,
     62 * the actual value of the key is not available, but operations may
     63 * be performed with it.
     64 */
     65 
     66 struct NSSPrivateKeyStr;
     67 typedef struct NSSPrivateKeyStr NSSPrivateKey;
     68 
     69 /*
     70 * NSSPublicKey
     71 *
     72 */
     73 
     74 struct NSSPublicKeyStr;
     75 typedef struct NSSPublicKeyStr NSSPublicKey;
     76 
     77 /*
     78 * NSSSymmetricKey
     79 *
     80 */
     81 
     82 struct NSSSymmetricKeyStr;
     83 typedef struct NSSSymmetricKeyStr NSSSymmetricKey;
     84 
     85 /*
     86 * NSSTrustDomain
     87 *
     88 * A Trust Domain is the field in which certificates may be validated.
     89 * A trust domain will generally have one or more cryptographic modules
     90 * open; these modules perform the cryptographic operations, and
     91 * provide the basic "root" trust information from which the trust in
     92 * a specific certificate or key depends.
     93 *
     94 * A client program, or a simple server, would typically have one
     95 * trust domain.  A server supporting multiple "virtual servers" might
     96 * have a separate trust domain for each virtual server.  The separate
     97 * trust domains might share some modules (e.g., a hardware crypto
     98 * accelerator) but not others (e.g., the tokens storing the different
     99 * servers' private keys, or the databases with each server's trusted
    100 * root certificates).
    101 *
    102 * This object descends from the "permananet database" in the old code.
    103 */
    104 
    105 struct NSSTrustDomainStr;
    106 typedef struct NSSTrustDomainStr NSSTrustDomain;
    107 
    108 /*
    109 * NSSCryptoContext
    110 *
    111 * A Crypto Context is a short-term, "helper" object which is used
    112 * for the lifetime of one ongoing "crypto operation."  Such an
    113 * operation may be the creation of a signed message, the use of an
    114 * TLS socket connection, etc.  Each crypto context is "in" a
    115 * specific trust domain, and it may have associated with it a
    116 * distinguished certificate, public key, private key, and/or
    117 * symmetric key.  It can also temporarily hold and use temporary
    118 * data (e.g. intermediate certificates) which is not stored
    119 * permanently in the trust domain.
    120 *
    121 * In OO terms, this interface inherits interfaces from the trust
    122 * domain, the certificates, and the keys.  It also provides
    123 * streaming crypto operations.
    124 *
    125 * This object descends from the "temporary database" concept in the
    126 * old code, but it has changed a lot as a result of what we've
    127 * learned.
    128 */
    129 
    130 typedef struct NSSCryptoContextStr NSSCryptoContext;
    131 
    132 /*
    133 * fgmr others
    134 */
    135 
    136 /*
    137 * OBJECT IDENTIFIER
    138 *
    139 * This is the basic OID that crops up everywhere.
    140 */
    141 
    142 struct NSSOIDStr; /* unused opaque structure */
    143 typedef struct NSSOIDStr NSSOID;
    144 
    145 /*
    146 * NSSTime
    147 *
    148 * Unfortunately, we need an "exceptional" value to indicate
    149 * an error upon return, or "no value" on input.  Note that zero
    150 * is a perfectly valid value for both time_t and PRTime.
    151 *
    152 * If we were to create a "range" object, with two times for
    153 * Not Before and Not After, we would have an obvious place for
    154 * the somewhat arbitrary logic involved in comparing them.
    155 *
    156 * Failing that, let's have an NSSTime_CompareRanges function.
    157 */
    158 
    159 struct NSSTimeStr;
    160 typedef struct NSSTimeStr NSSTime;
    161 
    162 struct NSSTrustStr;
    163 typedef struct NSSTrustStr NSSTrust;
    164 
    165 /*
    166 * NSSUsage
    167 *
    168 * This is trickier than originally planned; I'll write up a
    169 * doc on it.
    170 *
    171 * We'd still like nsspki.h to have a list of common usages,
    172 * e.g.:
    173 *
    174 *  extern const NSSUsage *NSSUsage_ClientAuth;
    175 *  extern const NSSUsage *NSSUsage_ServerAuth;
    176 *  extern const NSSUsage *NSSUsage_SignEmail;
    177 *  extern const NSSUsage *NSSUsage_EncryptEmail;
    178 *  etc.
    179 */
    180 
    181 struct NSSUsageStr;
    182 typedef struct NSSUsageStr NSSUsage;
    183 
    184 /*
    185 * NSSPolicies
    186 *
    187 * Placeholder, for now.
    188 */
    189 
    190 struct NSSPoliciesStr;
    191 typedef struct NSSPoliciesStr NSSPolicies;
    192 
    193 /*
    194 * NSSAlgorithmAndParameters
    195 *
    196 * Algorithm is an OID
    197 * Parameters depend on the algorithm
    198 */
    199 
    200 struct NSSAlgorithmAndParametersStr;
    201 typedef struct NSSAlgorithmAndParametersStr NSSAlgorithmAndParameters;
    202 
    203 /*
    204 * NSSCallback
    205 *
    206 * At minimum, a "challenge" method and a closure argument.
    207 * Usually the challenge will just be prompting for a password.
    208 * How OO do we want to make it?
    209 */
    210 
    211 typedef struct NSSCallbackStr NSSCallback;
    212 
    213 struct NSSCallbackStr {
    214    /* Prompt for a password to initialize a slot.  */
    215    PRStatus (*getInitPW)(NSSUTF8 *slotName, void *arg,
    216                          NSSUTF8 **ssoPW, NSSUTF8 **userPW);
    217    /* Prompt for oldPW and newPW in order to change the
    218     * password on a slot.
    219     */
    220    PRStatus (*getNewPW)(NSSUTF8 *slotName, PRUint32 *retries, void *arg,
    221                         NSSUTF8 **oldPW, NSSUTF8 **newPW);
    222    /* Prompt for slot password.  */
    223    PRStatus (*getPW)(NSSUTF8 *slotName, PRUint32 *retries, void *arg,
    224                      NSSUTF8 **password);
    225    void *arg;
    226 };
    227 
    228 /* set errors - user cancelled, ... */
    229 
    230 typedef PRUint32 NSSOperations;
    231 /* 1) Do we want these to be preprocessor definitions or constants? */
    232 /* 2) What is the correct and complete list? */
    233 
    234 #define NSSOperations_ENCRYPT 0x0001
    235 #define NSSOperations_DECRYPT 0x0002
    236 #define NSSOperations_WRAP 0x0004
    237 #define NSSOperations_UNWRAP 0x0008
    238 #define NSSOperations_SIGN 0x0010
    239 #define NSSOperations_SIGN_RECOVER 0x0020
    240 #define NSSOperations_VERIFY 0x0040
    241 #define NSSOperations_VERIFY_RECOVER 0x0080
    242 
    243 struct NSSPKIXCertificateStr;
    244 
    245 PR_END_EXTERN_C
    246 
    247 #endif /* NSSPKIT_H */