|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "nsNSSCertificateFakeTransport.h" |
|
7 |
|
8 #include "nsCOMPtr.h" |
|
9 #include "nsIObjectInputStream.h" |
|
10 #include "nsIObjectOutputStream.h" |
|
11 #include "nsIProgrammingLanguage.h" |
|
12 #include "nsISupportsPrimitives.h" |
|
13 #include "nsIX509Cert.h" |
|
14 #include "nsNSSCertificate.h" |
|
15 #include "nsNSSCertificate.h" |
|
16 #include "nsString.h" |
|
17 #include "nsXPIDLString.h" |
|
18 |
|
19 #ifdef PR_LOGGING |
|
20 extern PRLogModuleInfo* gPIPNSSLog; |
|
21 #endif |
|
22 |
|
23 /* nsNSSCertificateFakeTransport */ |
|
24 |
|
25 NS_IMPL_ISUPPORTS(nsNSSCertificateFakeTransport, |
|
26 nsIX509Cert, |
|
27 nsISerializable, |
|
28 nsIClassInfo) |
|
29 |
|
30 nsNSSCertificateFakeTransport::nsNSSCertificateFakeTransport() : |
|
31 mCertSerialization(nullptr) |
|
32 { |
|
33 } |
|
34 |
|
35 nsNSSCertificateFakeTransport::~nsNSSCertificateFakeTransport() |
|
36 { |
|
37 if (mCertSerialization) |
|
38 SECITEM_FreeItem(mCertSerialization, true); |
|
39 } |
|
40 |
|
41 /* readonly attribute string dbKey; */ |
|
42 NS_IMETHODIMP |
|
43 nsNSSCertificateFakeTransport::GetDbKey(char * *aDbKey) |
|
44 { |
|
45 NS_NOTREACHED("Unimplemented on content process"); |
|
46 return NS_ERROR_NOT_IMPLEMENTED; |
|
47 } |
|
48 |
|
49 /* readonly attribute string windowTitle; */ |
|
50 NS_IMETHODIMP |
|
51 nsNSSCertificateFakeTransport::GetWindowTitle(char * *aWindowTitle) |
|
52 { |
|
53 NS_NOTREACHED("Unimplemented on content process"); |
|
54 return NS_ERROR_NOT_IMPLEMENTED; |
|
55 } |
|
56 |
|
57 NS_IMETHODIMP |
|
58 nsNSSCertificateFakeTransport::GetNickname(nsAString &aNickname) |
|
59 { |
|
60 NS_NOTREACHED("Unimplemented on content process"); |
|
61 return NS_ERROR_NOT_IMPLEMENTED; |
|
62 } |
|
63 |
|
64 NS_IMETHODIMP |
|
65 nsNSSCertificateFakeTransport::GetEmailAddress(nsAString &aEmailAddress) |
|
66 { |
|
67 NS_NOTREACHED("Unimplemented on content process"); |
|
68 return NS_ERROR_NOT_IMPLEMENTED; |
|
69 } |
|
70 |
|
71 NS_IMETHODIMP |
|
72 nsNSSCertificateFakeTransport::GetEmailAddresses(uint32_t *aLength, char16_t*** aAddresses) |
|
73 { |
|
74 NS_NOTREACHED("Unimplemented on content process"); |
|
75 return NS_ERROR_NOT_IMPLEMENTED; |
|
76 } |
|
77 |
|
78 NS_IMETHODIMP |
|
79 nsNSSCertificateFakeTransport::ContainsEmailAddress(const nsAString &aEmailAddress, bool *result) |
|
80 { |
|
81 NS_NOTREACHED("Unimplemented on content process"); |
|
82 return NS_ERROR_NOT_IMPLEMENTED; |
|
83 } |
|
84 |
|
85 NS_IMETHODIMP |
|
86 nsNSSCertificateFakeTransport::GetCommonName(nsAString &aCommonName) |
|
87 { |
|
88 NS_NOTREACHED("Unimplemented on content process"); |
|
89 return NS_ERROR_NOT_IMPLEMENTED; |
|
90 } |
|
91 |
|
92 NS_IMETHODIMP |
|
93 nsNSSCertificateFakeTransport::GetOrganization(nsAString &aOrganization) |
|
94 { |
|
95 NS_NOTREACHED("Unimplemented on content process"); |
|
96 return NS_ERROR_NOT_IMPLEMENTED; |
|
97 } |
|
98 |
|
99 NS_IMETHODIMP |
|
100 nsNSSCertificateFakeTransport::GetIssuerCommonName(nsAString &aCommonName) |
|
101 { |
|
102 NS_NOTREACHED("Unimplemented on content process"); |
|
103 return NS_ERROR_NOT_IMPLEMENTED; |
|
104 } |
|
105 |
|
106 NS_IMETHODIMP |
|
107 nsNSSCertificateFakeTransport::GetIssuerOrganization(nsAString &aOrganization) |
|
108 { |
|
109 NS_NOTREACHED("Unimplemented on content process"); |
|
110 return NS_ERROR_NOT_IMPLEMENTED; |
|
111 } |
|
112 |
|
113 NS_IMETHODIMP |
|
114 nsNSSCertificateFakeTransport::GetIssuerOrganizationUnit(nsAString &aOrganizationUnit) |
|
115 { |
|
116 NS_NOTREACHED("Unimplemented on content process"); |
|
117 return NS_ERROR_NOT_IMPLEMENTED; |
|
118 } |
|
119 |
|
120 /* readonly attribute nsIX509Cert issuer; */ |
|
121 NS_IMETHODIMP |
|
122 nsNSSCertificateFakeTransport::GetIssuer(nsIX509Cert * *aIssuer) |
|
123 { |
|
124 NS_NOTREACHED("Unimplemented on content process"); |
|
125 return NS_ERROR_NOT_IMPLEMENTED; |
|
126 } |
|
127 |
|
128 NS_IMETHODIMP |
|
129 nsNSSCertificateFakeTransport::GetOrganizationalUnit(nsAString &aOrganizationalUnit) |
|
130 { |
|
131 NS_NOTREACHED("Unimplemented on content process"); |
|
132 return NS_ERROR_NOT_IMPLEMENTED; |
|
133 } |
|
134 |
|
135 /* |
|
136 * nsIEnumerator getChain(); |
|
137 */ |
|
138 NS_IMETHODIMP |
|
139 nsNSSCertificateFakeTransport::GetChain(nsIArray **_rvChain) |
|
140 { |
|
141 NS_NOTREACHED("Unimplemented on content process"); |
|
142 return NS_ERROR_NOT_IMPLEMENTED; |
|
143 } |
|
144 |
|
145 NS_IMETHODIMP |
|
146 nsNSSCertificateFakeTransport::GetSubjectName(nsAString &_subjectName) |
|
147 { |
|
148 NS_NOTREACHED("Unimplemented on content process"); |
|
149 return NS_ERROR_NOT_IMPLEMENTED; |
|
150 } |
|
151 |
|
152 NS_IMETHODIMP |
|
153 nsNSSCertificateFakeTransport::GetIssuerName(nsAString &_issuerName) |
|
154 { |
|
155 NS_NOTREACHED("Unimplemented on content process"); |
|
156 return NS_ERROR_NOT_IMPLEMENTED; |
|
157 } |
|
158 |
|
159 NS_IMETHODIMP |
|
160 nsNSSCertificateFakeTransport::GetSerialNumber(nsAString &_serialNumber) |
|
161 { |
|
162 NS_NOTREACHED("Unimplemented on content process"); |
|
163 return NS_ERROR_NOT_IMPLEMENTED; |
|
164 } |
|
165 |
|
166 NS_IMETHODIMP |
|
167 nsNSSCertificateFakeTransport::GetSha1Fingerprint(nsAString &_sha1Fingerprint) |
|
168 { |
|
169 NS_NOTREACHED("Unimplemented on content process"); |
|
170 return NS_ERROR_NOT_IMPLEMENTED; |
|
171 } |
|
172 |
|
173 NS_IMETHODIMP |
|
174 nsNSSCertificateFakeTransport::GetMd5Fingerprint(nsAString &_md5Fingerprint) |
|
175 { |
|
176 NS_NOTREACHED("Unimplemented on content process"); |
|
177 return NS_ERROR_NOT_IMPLEMENTED; |
|
178 } |
|
179 |
|
180 NS_IMETHODIMP |
|
181 nsNSSCertificateFakeTransport::GetTokenName(nsAString &aTokenName) |
|
182 { |
|
183 NS_NOTREACHED("Unimplemented on content process"); |
|
184 return NS_ERROR_NOT_IMPLEMENTED; |
|
185 } |
|
186 |
|
187 NS_IMETHODIMP |
|
188 nsNSSCertificateFakeTransport::GetRawDER(uint32_t *aLength, uint8_t **aArray) |
|
189 { |
|
190 NS_NOTREACHED("Unimplemented on content process"); |
|
191 return NS_ERROR_NOT_IMPLEMENTED; |
|
192 } |
|
193 |
|
194 NS_IMETHODIMP |
|
195 nsNSSCertificateFakeTransport::GetValidity(nsIX509CertValidity **aValidity) |
|
196 { |
|
197 NS_NOTREACHED("Unimplemented on content process"); |
|
198 return NS_ERROR_NOT_IMPLEMENTED; |
|
199 } |
|
200 |
|
201 NS_IMETHODIMP |
|
202 nsNSSCertificateFakeTransport::GetUsagesArray(bool localOnly, |
|
203 uint32_t *_verified, |
|
204 uint32_t *_count, |
|
205 char16_t ***_usages) |
|
206 { |
|
207 NS_NOTREACHED("Unimplemented on content process"); |
|
208 return NS_ERROR_NOT_IMPLEMENTED; |
|
209 } |
|
210 |
|
211 NS_IMETHODIMP |
|
212 nsNSSCertificateFakeTransport::GetUsagesString(bool localOnly, |
|
213 uint32_t *_verified, |
|
214 nsAString &_usages) |
|
215 { |
|
216 NS_NOTREACHED("Unimplemented on content process"); |
|
217 return NS_ERROR_NOT_IMPLEMENTED; |
|
218 } |
|
219 |
|
220 /* readonly attribute nsIASN1Object ASN1Structure; */ |
|
221 NS_IMETHODIMP |
|
222 nsNSSCertificateFakeTransport::GetASN1Structure(nsIASN1Object * *aASN1Structure) |
|
223 { |
|
224 NS_NOTREACHED("Unimplemented on content process"); |
|
225 return NS_ERROR_NOT_IMPLEMENTED; |
|
226 } |
|
227 |
|
228 NS_IMETHODIMP |
|
229 nsNSSCertificateFakeTransport::Equals(nsIX509Cert *other, bool *result) |
|
230 { |
|
231 NS_NOTREACHED("Unimplemented on content process"); |
|
232 return NS_ERROR_NOT_IMPLEMENTED; |
|
233 } |
|
234 |
|
235 NS_IMETHODIMP |
|
236 nsNSSCertificateFakeTransport::GetSha256SubjectPublicKeyInfoDigest(nsACString_internal&) |
|
237 { |
|
238 NS_NOTREACHED("Unimplemented on content process"); |
|
239 return NS_ERROR_NOT_IMPLEMENTED; |
|
240 } |
|
241 |
|
242 // NB: This serialization must match that of nsNSSCertificate. |
|
243 NS_IMETHODIMP |
|
244 nsNSSCertificateFakeTransport::Write(nsIObjectOutputStream* aStream) |
|
245 { |
|
246 // On a non-chrome process we don't have mCert because we lack |
|
247 // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to carry the |
|
248 // certificate serialization. |
|
249 |
|
250 // This serialization has to match that of nsNSSCertificate, |
|
251 // so write a fake cached EV Status. |
|
252 uint32_t status = static_cast<uint32_t>(nsNSSCertificate::ev_status_unknown); |
|
253 nsresult rv = aStream->Write32(status); |
|
254 if (NS_FAILED(rv)) { |
|
255 return rv; |
|
256 } |
|
257 |
|
258 rv = aStream->Write32(mCertSerialization->len); |
|
259 if (NS_FAILED(rv)) { |
|
260 return rv; |
|
261 } |
|
262 |
|
263 return aStream->WriteByteArray(mCertSerialization->data, mCertSerialization->len); |
|
264 } |
|
265 |
|
266 NS_IMETHODIMP |
|
267 nsNSSCertificateFakeTransport::Read(nsIObjectInputStream* aStream) |
|
268 { |
|
269 // This serialization has to match that of nsNSSCertificate, |
|
270 // so read the cachedEVStatus but don't actually use it. |
|
271 uint32_t cachedEVStatus; |
|
272 nsresult rv = aStream->Read32(&cachedEVStatus); |
|
273 if (NS_FAILED(rv)) { |
|
274 return rv; |
|
275 } |
|
276 |
|
277 uint32_t len; |
|
278 rv = aStream->Read32(&len); |
|
279 if (NS_FAILED(rv)) { |
|
280 return rv; |
|
281 } |
|
282 |
|
283 nsXPIDLCString str; |
|
284 rv = aStream->ReadBytes(len, getter_Copies(str)); |
|
285 if (NS_FAILED(rv)) { |
|
286 return rv; |
|
287 } |
|
288 |
|
289 // On a non-chrome process we cannot instatiate mCert because we lack |
|
290 // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to carry the |
|
291 // certificate serialization. |
|
292 |
|
293 mCertSerialization = SECITEM_AllocItem(nullptr, nullptr, len); |
|
294 if (!mCertSerialization) |
|
295 return NS_ERROR_OUT_OF_MEMORY; |
|
296 PORT_Memcpy(mCertSerialization->data, str.Data(), len); |
|
297 |
|
298 return NS_OK; |
|
299 } |
|
300 |
|
301 NS_IMETHODIMP |
|
302 nsNSSCertificateFakeTransport::GetInterfaces(uint32_t *count, nsIID * **array) |
|
303 { |
|
304 *count = 0; |
|
305 *array = nullptr; |
|
306 return NS_OK; |
|
307 } |
|
308 |
|
309 NS_IMETHODIMP |
|
310 nsNSSCertificateFakeTransport::GetHelperForLanguage(uint32_t language, nsISupports **_retval) |
|
311 { |
|
312 *_retval = nullptr; |
|
313 return NS_OK; |
|
314 } |
|
315 |
|
316 NS_IMETHODIMP |
|
317 nsNSSCertificateFakeTransport::GetContractID(char * *aContractID) |
|
318 { |
|
319 *aContractID = nullptr; |
|
320 return NS_OK; |
|
321 } |
|
322 |
|
323 NS_IMETHODIMP |
|
324 nsNSSCertificateFakeTransport::GetClassDescription(char * *aClassDescription) |
|
325 { |
|
326 *aClassDescription = nullptr; |
|
327 return NS_OK; |
|
328 } |
|
329 |
|
330 NS_IMETHODIMP |
|
331 nsNSSCertificateFakeTransport::GetClassID(nsCID * *aClassID) |
|
332 { |
|
333 *aClassID = (nsCID*) nsMemory::Alloc(sizeof(nsCID)); |
|
334 if (!*aClassID) |
|
335 return NS_ERROR_OUT_OF_MEMORY; |
|
336 return GetClassIDNoAlloc(*aClassID); |
|
337 } |
|
338 |
|
339 NS_IMETHODIMP |
|
340 nsNSSCertificateFakeTransport::GetImplementationLanguage(uint32_t *aImplementationLanguage) |
|
341 { |
|
342 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; |
|
343 return NS_OK; |
|
344 } |
|
345 |
|
346 NS_IMETHODIMP |
|
347 nsNSSCertificateFakeTransport::GetFlags(uint32_t *aFlags) |
|
348 { |
|
349 *aFlags = nsIClassInfo::THREADSAFE; |
|
350 return NS_OK; |
|
351 } |
|
352 |
|
353 NS_IMETHODIMP |
|
354 nsNSSCertificateFakeTransport::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) |
|
355 { |
|
356 static NS_DEFINE_CID(kNSSCertificateCID, NS_X509CERT_CID); |
|
357 |
|
358 *aClassIDNoAlloc = kNSSCertificateCID; |
|
359 return NS_OK; |
|
360 } |