Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
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/. */
6 #include "nsNSSCertificateFakeTransport.h"
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"
19 #ifdef PR_LOGGING
20 extern PRLogModuleInfo* gPIPNSSLog;
21 #endif
23 /* nsNSSCertificateFakeTransport */
25 NS_IMPL_ISUPPORTS(nsNSSCertificateFakeTransport,
26 nsIX509Cert,
27 nsISerializable,
28 nsIClassInfo)
30 nsNSSCertificateFakeTransport::nsNSSCertificateFakeTransport() :
31 mCertSerialization(nullptr)
32 {
33 }
35 nsNSSCertificateFakeTransport::~nsNSSCertificateFakeTransport()
36 {
37 if (mCertSerialization)
38 SECITEM_FreeItem(mCertSerialization, true);
39 }
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 }
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 }
57 NS_IMETHODIMP
58 nsNSSCertificateFakeTransport::GetNickname(nsAString &aNickname)
59 {
60 NS_NOTREACHED("Unimplemented on content process");
61 return NS_ERROR_NOT_IMPLEMENTED;
62 }
64 NS_IMETHODIMP
65 nsNSSCertificateFakeTransport::GetEmailAddress(nsAString &aEmailAddress)
66 {
67 NS_NOTREACHED("Unimplemented on content process");
68 return NS_ERROR_NOT_IMPLEMENTED;
69 }
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 }
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 }
85 NS_IMETHODIMP
86 nsNSSCertificateFakeTransport::GetCommonName(nsAString &aCommonName)
87 {
88 NS_NOTREACHED("Unimplemented on content process");
89 return NS_ERROR_NOT_IMPLEMENTED;
90 }
92 NS_IMETHODIMP
93 nsNSSCertificateFakeTransport::GetOrganization(nsAString &aOrganization)
94 {
95 NS_NOTREACHED("Unimplemented on content process");
96 return NS_ERROR_NOT_IMPLEMENTED;
97 }
99 NS_IMETHODIMP
100 nsNSSCertificateFakeTransport::GetIssuerCommonName(nsAString &aCommonName)
101 {
102 NS_NOTREACHED("Unimplemented on content process");
103 return NS_ERROR_NOT_IMPLEMENTED;
104 }
106 NS_IMETHODIMP
107 nsNSSCertificateFakeTransport::GetIssuerOrganization(nsAString &aOrganization)
108 {
109 NS_NOTREACHED("Unimplemented on content process");
110 return NS_ERROR_NOT_IMPLEMENTED;
111 }
113 NS_IMETHODIMP
114 nsNSSCertificateFakeTransport::GetIssuerOrganizationUnit(nsAString &aOrganizationUnit)
115 {
116 NS_NOTREACHED("Unimplemented on content process");
117 return NS_ERROR_NOT_IMPLEMENTED;
118 }
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 }
128 NS_IMETHODIMP
129 nsNSSCertificateFakeTransport::GetOrganizationalUnit(nsAString &aOrganizationalUnit)
130 {
131 NS_NOTREACHED("Unimplemented on content process");
132 return NS_ERROR_NOT_IMPLEMENTED;
133 }
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 }
145 NS_IMETHODIMP
146 nsNSSCertificateFakeTransport::GetSubjectName(nsAString &_subjectName)
147 {
148 NS_NOTREACHED("Unimplemented on content process");
149 return NS_ERROR_NOT_IMPLEMENTED;
150 }
152 NS_IMETHODIMP
153 nsNSSCertificateFakeTransport::GetIssuerName(nsAString &_issuerName)
154 {
155 NS_NOTREACHED("Unimplemented on content process");
156 return NS_ERROR_NOT_IMPLEMENTED;
157 }
159 NS_IMETHODIMP
160 nsNSSCertificateFakeTransport::GetSerialNumber(nsAString &_serialNumber)
161 {
162 NS_NOTREACHED("Unimplemented on content process");
163 return NS_ERROR_NOT_IMPLEMENTED;
164 }
166 NS_IMETHODIMP
167 nsNSSCertificateFakeTransport::GetSha1Fingerprint(nsAString &_sha1Fingerprint)
168 {
169 NS_NOTREACHED("Unimplemented on content process");
170 return NS_ERROR_NOT_IMPLEMENTED;
171 }
173 NS_IMETHODIMP
174 nsNSSCertificateFakeTransport::GetMd5Fingerprint(nsAString &_md5Fingerprint)
175 {
176 NS_NOTREACHED("Unimplemented on content process");
177 return NS_ERROR_NOT_IMPLEMENTED;
178 }
180 NS_IMETHODIMP
181 nsNSSCertificateFakeTransport::GetTokenName(nsAString &aTokenName)
182 {
183 NS_NOTREACHED("Unimplemented on content process");
184 return NS_ERROR_NOT_IMPLEMENTED;
185 }
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 }
194 NS_IMETHODIMP
195 nsNSSCertificateFakeTransport::GetValidity(nsIX509CertValidity **aValidity)
196 {
197 NS_NOTREACHED("Unimplemented on content process");
198 return NS_ERROR_NOT_IMPLEMENTED;
199 }
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 }
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 }
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 }
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 }
235 NS_IMETHODIMP
236 nsNSSCertificateFakeTransport::GetSha256SubjectPublicKeyInfoDigest(nsACString_internal&)
237 {
238 NS_NOTREACHED("Unimplemented on content process");
239 return NS_ERROR_NOT_IMPLEMENTED;
240 }
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.
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 }
258 rv = aStream->Write32(mCertSerialization->len);
259 if (NS_FAILED(rv)) {
260 return rv;
261 }
263 return aStream->WriteByteArray(mCertSerialization->data, mCertSerialization->len);
264 }
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 }
277 uint32_t len;
278 rv = aStream->Read32(&len);
279 if (NS_FAILED(rv)) {
280 return rv;
281 }
283 nsXPIDLCString str;
284 rv = aStream->ReadBytes(len, getter_Copies(str));
285 if (NS_FAILED(rv)) {
286 return rv;
287 }
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.
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);
298 return NS_OK;
299 }
301 NS_IMETHODIMP
302 nsNSSCertificateFakeTransport::GetInterfaces(uint32_t *count, nsIID * **array)
303 {
304 *count = 0;
305 *array = nullptr;
306 return NS_OK;
307 }
309 NS_IMETHODIMP
310 nsNSSCertificateFakeTransport::GetHelperForLanguage(uint32_t language, nsISupports **_retval)
311 {
312 *_retval = nullptr;
313 return NS_OK;
314 }
316 NS_IMETHODIMP
317 nsNSSCertificateFakeTransport::GetContractID(char * *aContractID)
318 {
319 *aContractID = nullptr;
320 return NS_OK;
321 }
323 NS_IMETHODIMP
324 nsNSSCertificateFakeTransport::GetClassDescription(char * *aClassDescription)
325 {
326 *aClassDescription = nullptr;
327 return NS_OK;
328 }
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 }
339 NS_IMETHODIMP
340 nsNSSCertificateFakeTransport::GetImplementationLanguage(uint32_t *aImplementationLanguage)
341 {
342 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS;
343 return NS_OK;
344 }
346 NS_IMETHODIMP
347 nsNSSCertificateFakeTransport::GetFlags(uint32_t *aFlags)
348 {
349 *aFlags = nsIClassInfo::THREADSAFE;
350 return NS_OK;
351 }
353 NS_IMETHODIMP
354 nsNSSCertificateFakeTransport::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
355 {
356 static NS_DEFINE_CID(kNSSCertificateCID, NS_X509CERT_CID);
358 *aClassIDNoAlloc = kNSSCertificateCID;
359 return NS_OK;
360 }