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
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 | } |