summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/nsNSSCertificateFakeTransport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'security/manager/ssl/nsNSSCertificateFakeTransport.cpp')
-rw-r--r--security/manager/ssl/nsNSSCertificateFakeTransport.cpp478
1 files changed, 478 insertions, 0 deletions
diff --git a/security/manager/ssl/nsNSSCertificateFakeTransport.cpp b/security/manager/ssl/nsNSSCertificateFakeTransport.cpp
new file mode 100644
index 000000000..088a5c4ed
--- /dev/null
+++ b/security/manager/ssl/nsNSSCertificateFakeTransport.cpp
@@ -0,0 +1,478 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsNSSCertificateFakeTransport.h"
+
+#include "mozilla/Assertions.h"
+#include "nsIClassInfoImpl.h"
+#include "nsIObjectInputStream.h"
+#include "nsIObjectOutputStream.h"
+#include "nsISupportsPrimitives.h"
+#include "nsNSSCertificate.h"
+#include "nsString.h"
+
+NS_IMPL_ISUPPORTS(nsNSSCertificateFakeTransport,
+ nsIX509Cert,
+ nsISerializable,
+ nsIClassInfo)
+
+nsNSSCertificateFakeTransport::nsNSSCertificateFakeTransport()
+ : mCertSerialization(nullptr)
+{
+}
+
+nsNSSCertificateFakeTransport::~nsNSSCertificateFakeTransport()
+{
+ mCertSerialization = nullptr;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetDbKey(nsACString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetWindowTitle(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetNickname(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetEmailAddress(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetEmailAddresses(uint32_t*, char16_t***)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::ContainsEmailAddress(const nsAString&, bool*)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetCommonName(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetOrganization(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIssuerCommonName(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIssuerOrganization(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIssuerOrganizationUnit(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIssuer(nsIX509Cert**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetOrganizationalUnit(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetChain(nsIArray**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetSubjectName(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIssuerName(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetSerialNumber(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetSha256Fingerprint(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetSha1Fingerprint(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetTokenName(nsAString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetRawDER(uint32_t*, uint8_t**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetValidity(nsIX509CertValidity**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetKeyUsages(nsAString&)
+{
+ MOZ_ASSERT_UNREACHABLE("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetASN1Structure(nsIASN1Object**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::Equals(nsIX509Cert*, bool*)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetSha256SubjectPublicKeyInfoDigest(nsACString&)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+// NB: This serialization must match that of nsNSSCertificate.
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::Write(nsIObjectOutputStream* aStream)
+{
+ // On a non-chrome process we don't have mCert because we lack
+ // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to
+ // carry the certificate serialization.
+
+ // This serialization has to match that of nsNSSCertificate, so include this
+ // now-unused field.
+ nsresult rv = aStream->Write32(0);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ rv = aStream->Write32(mCertSerialization->len);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ return aStream->WriteByteArray(mCertSerialization->data,
+ mCertSerialization->len);
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::Read(nsIObjectInputStream* aStream)
+{
+ // This serialization has to match that of nsNSSCertificate, so read the (now
+ // unused) cachedEVStatus.
+ uint32_t unusedCachedEVStatus;
+ nsresult rv = aStream->Read32(&unusedCachedEVStatus);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ uint32_t len;
+ rv = aStream->Read32(&len);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ nsXPIDLCString str;
+ rv = aStream->ReadBytes(len, getter_Copies(str));
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ // On a non-chrome process we cannot instatiate mCert because we lack
+ // nsNSSComponent. nsNSSCertificateFakeTransport object is used only to
+ // carry the certificate serialization.
+ mCertSerialization =
+ mozilla::UniqueSECItem(SECITEM_AllocItem(nullptr, nullptr, len));
+ if (!mCertSerialization) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ PORT_Memcpy(mCertSerialization->data, str.Data(), len);
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetInterfaces(uint32_t* count, nsIID*** array)
+{
+ *count = 0;
+ *array = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetScriptableHelper(nsIXPCScriptable** _retval)
+{
+ *_retval = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetContractID(char** aContractID)
+{
+ *aContractID = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetClassDescription(char** aClassDescription)
+{
+ *aClassDescription = nullptr;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetClassID(nsCID** aClassID)
+{
+ *aClassID = (nsCID*) moz_xmalloc(sizeof(nsCID));
+ if (!*aClassID)
+ return NS_ERROR_OUT_OF_MEMORY;
+ return GetClassIDNoAlloc(*aClassID);
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetFlags(uint32_t* aFlags)
+{
+ *aFlags = nsIClassInfo::THREADSAFE;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetClassIDNoAlloc(nsCID* aClassIDNoAlloc)
+{
+ static NS_DEFINE_CID(kNSSCertificateCID, NS_X509CERT_CID);
+
+ *aClassIDNoAlloc = kNSSCertificateCID;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetCertType(unsigned int*)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIsSelfSigned(bool*)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetIsBuiltInRoot(bool* aIsBuiltInRoot)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::GetAllTokenNames(unsigned int*, char16_t***)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+CERTCertificate*
+nsNSSCertificateFakeTransport::GetCert()
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return nullptr;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::ExportAsCMS(unsigned int,
+ unsigned int*,
+ unsigned char**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertificateFakeTransport::MarkForPermDeletion()
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMPL_CLASSINFO(nsNSSCertListFakeTransport,
+ nullptr,
+ // inferred from nsIX509Cert
+ nsIClassInfo::THREADSAFE,
+ NS_X509CERTLIST_CID)
+
+NS_IMPL_ISUPPORTS_CI(nsNSSCertListFakeTransport,
+ nsIX509CertList,
+ nsISerializable)
+
+nsNSSCertListFakeTransport::nsNSSCertListFakeTransport()
+{
+}
+
+nsNSSCertListFakeTransport::~nsNSSCertListFakeTransport()
+{
+}
+
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::AddCert(nsIX509Cert* aCert)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::DeleteCert(nsIX509Cert* aCert)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+CERTCertList*
+nsNSSCertListFakeTransport::GetRawCertList()
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return nullptr;
+}
+
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::GetEnumerator(nsISimpleEnumerator**)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::Equals(nsIX509CertList*, bool*)
+{
+ NS_NOTREACHED("Unimplemented on content process");
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+// NB: This serialization must match that of nsNSSCertList.
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::Write(nsIObjectOutputStream* aStream)
+{
+ uint32_t certListLen = mFakeCertList.length();
+ // Write the length of the list
+ nsresult rv = aStream->Write32(certListLen);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ for (size_t i = 0; i < certListLen; i++) {
+ nsCOMPtr<nsIX509Cert> cert = mFakeCertList[i];
+ nsCOMPtr<nsISerializable> serializableCert = do_QueryInterface(cert);
+ rv = aStream->WriteCompoundObject(serializableCert,
+ NS_GET_IID(nsIX509Cert), true);
+ if (NS_FAILED(rv)) {
+ break;
+ }
+ }
+
+ return rv;
+}
+
+NS_IMETHODIMP
+nsNSSCertListFakeTransport::Read(nsIObjectInputStream* aStream)
+{
+ uint32_t certListLen;
+ nsresult rv = aStream->Read32(&certListLen);
+ if (NS_FAILED(rv)) {
+ return rv;
+ }
+
+ for (uint32_t i = 0; i < certListLen; i++) {
+ nsCOMPtr<nsISupports> certSupports;
+ rv = aStream->ReadObject(true, getter_AddRefs(certSupports));
+ if (NS_FAILED(rv)) {
+ break;
+ }
+
+ nsCOMPtr<nsIX509Cert> cert = do_QueryInterface(certSupports);
+ if (!mFakeCertList.append(cert)) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
+ }
+
+ return rv;
+}