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