michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsNSSCertificateFakeTransport.h" michael@0: michael@0: #include "nsCOMPtr.h" michael@0: #include "nsIObjectInputStream.h" michael@0: #include "nsIObjectOutputStream.h" michael@0: #include "nsIProgrammingLanguage.h" michael@0: #include "nsISupportsPrimitives.h" michael@0: #include "nsIX509Cert.h" michael@0: #include "nsNSSCertificate.h" michael@0: #include "nsNSSCertificate.h" michael@0: #include "nsString.h" michael@0: #include "nsXPIDLString.h" michael@0: michael@0: #ifdef PR_LOGGING michael@0: extern PRLogModuleInfo* gPIPNSSLog; michael@0: #endif michael@0: michael@0: /* nsNSSCertificateFakeTransport */ michael@0: michael@0: NS_IMPL_ISUPPORTS(nsNSSCertificateFakeTransport, michael@0: nsIX509Cert, michael@0: nsISerializable, michael@0: nsIClassInfo) michael@0: michael@0: nsNSSCertificateFakeTransport::nsNSSCertificateFakeTransport() : michael@0: mCertSerialization(nullptr) michael@0: { michael@0: } michael@0: michael@0: nsNSSCertificateFakeTransport::~nsNSSCertificateFakeTransport() michael@0: { michael@0: if (mCertSerialization) michael@0: SECITEM_FreeItem(mCertSerialization, true); michael@0: } michael@0: michael@0: /* readonly attribute string dbKey; */ michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetDbKey(char * *aDbKey) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* readonly attribute string windowTitle; */ michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetWindowTitle(char * *aWindowTitle) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetNickname(nsAString &aNickname) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetEmailAddress(nsAString &aEmailAddress) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetEmailAddresses(uint32_t *aLength, char16_t*** aAddresses) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::ContainsEmailAddress(const nsAString &aEmailAddress, bool *result) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetCommonName(nsAString &aCommonName) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetOrganization(nsAString &aOrganization) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetIssuerCommonName(nsAString &aCommonName) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetIssuerOrganization(nsAString &aOrganization) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetIssuerOrganizationUnit(nsAString &aOrganizationUnit) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* readonly attribute nsIX509Cert issuer; */ michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetIssuer(nsIX509Cert * *aIssuer) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetOrganizationalUnit(nsAString &aOrganizationalUnit) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* michael@0: * nsIEnumerator getChain(); michael@0: */ michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetChain(nsIArray **_rvChain) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetSubjectName(nsAString &_subjectName) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetIssuerName(nsAString &_issuerName) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetSerialNumber(nsAString &_serialNumber) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetSha1Fingerprint(nsAString &_sha1Fingerprint) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetMd5Fingerprint(nsAString &_md5Fingerprint) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetTokenName(nsAString &aTokenName) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetRawDER(uint32_t *aLength, uint8_t **aArray) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetValidity(nsIX509CertValidity **aValidity) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetUsagesArray(bool localOnly, michael@0: uint32_t *_verified, michael@0: uint32_t *_count, michael@0: char16_t ***_usages) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetUsagesString(bool localOnly, michael@0: uint32_t *_verified, michael@0: nsAString &_usages) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: /* readonly attribute nsIASN1Object ASN1Structure; */ michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetASN1Structure(nsIASN1Object * *aASN1Structure) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::Equals(nsIX509Cert *other, bool *result) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetSha256SubjectPublicKeyInfoDigest(nsACString_internal&) michael@0: { michael@0: NS_NOTREACHED("Unimplemented on content process"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: // NB: This serialization must match that of nsNSSCertificate. michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::Write(nsIObjectOutputStream* aStream) michael@0: { michael@0: // On a non-chrome process we don't have mCert because we lack michael@0: // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to carry the michael@0: // certificate serialization. michael@0: michael@0: // This serialization has to match that of nsNSSCertificate, michael@0: // so write a fake cached EV Status. michael@0: uint32_t status = static_cast(nsNSSCertificate::ev_status_unknown); michael@0: nsresult rv = aStream->Write32(status); michael@0: if (NS_FAILED(rv)) { michael@0: return rv; michael@0: } michael@0: michael@0: rv = aStream->Write32(mCertSerialization->len); michael@0: if (NS_FAILED(rv)) { michael@0: return rv; michael@0: } michael@0: michael@0: return aStream->WriteByteArray(mCertSerialization->data, mCertSerialization->len); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::Read(nsIObjectInputStream* aStream) michael@0: { michael@0: // This serialization has to match that of nsNSSCertificate, michael@0: // so read the cachedEVStatus but don't actually use it. michael@0: uint32_t cachedEVStatus; michael@0: nsresult rv = aStream->Read32(&cachedEVStatus); michael@0: if (NS_FAILED(rv)) { michael@0: return rv; michael@0: } michael@0: michael@0: uint32_t len; michael@0: rv = aStream->Read32(&len); michael@0: if (NS_FAILED(rv)) { michael@0: return rv; michael@0: } michael@0: michael@0: nsXPIDLCString str; michael@0: rv = aStream->ReadBytes(len, getter_Copies(str)); michael@0: if (NS_FAILED(rv)) { michael@0: return rv; michael@0: } michael@0: michael@0: // On a non-chrome process we cannot instatiate mCert because we lack michael@0: // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to carry the michael@0: // certificate serialization. michael@0: michael@0: mCertSerialization = SECITEM_AllocItem(nullptr, nullptr, len); michael@0: if (!mCertSerialization) michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: PORT_Memcpy(mCertSerialization->data, str.Data(), len); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetInterfaces(uint32_t *count, nsIID * **array) michael@0: { michael@0: *count = 0; michael@0: *array = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetHelperForLanguage(uint32_t language, nsISupports **_retval) michael@0: { michael@0: *_retval = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetContractID(char * *aContractID) michael@0: { michael@0: *aContractID = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetClassDescription(char * *aClassDescription) michael@0: { michael@0: *aClassDescription = nullptr; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetClassID(nsCID * *aClassID) michael@0: { michael@0: *aClassID = (nsCID*) nsMemory::Alloc(sizeof(nsCID)); michael@0: if (!*aClassID) michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: return GetClassIDNoAlloc(*aClassID); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetImplementationLanguage(uint32_t *aImplementationLanguage) michael@0: { michael@0: *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetFlags(uint32_t *aFlags) michael@0: { michael@0: *aFlags = nsIClassInfo::THREADSAFE; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsNSSCertificateFakeTransport::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) michael@0: { michael@0: static NS_DEFINE_CID(kNSSCertificateCID, NS_X509CERT_CID); michael@0: michael@0: *aClassIDNoAlloc = kNSSCertificateCID; michael@0: return NS_OK; michael@0: }