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 */
248