security/manager/ssl/src/nsNSSCertificateFakeTransport.cpp

Wed, 31 Dec 2014 07:16:47 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:16:47 +0100
branch
TOR_BUG_9701
changeset 3
141e0f1194b1
permissions
-rw-r--r--

Revert simplistic fix pending revisit of Mozilla integration attempt.

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

mercurial