Skip to content
This repository has been archived by the owner on Aug 4, 2022. It is now read-only.

Commit

Permalink
Bug 1566342 - Implement changes for HTTP2 fuzzing in Necko. r=mayhemer
Browse files Browse the repository at this point in the history
  • Loading branch information
choller committed Aug 13, 2019
1 parent b992cbb commit fad5375
Show file tree
Hide file tree
Showing 8 changed files with 411 additions and 11 deletions.
5 changes: 4 additions & 1 deletion netwerk/base/FuzzyLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "FuzzyLayer.h"
#include "nsIRunnable.h"
#include "nsThreadUtils.h"

#include "prmem.h"
#include "prio.h"
#include "mozilla/Logging.h"
Expand Down Expand Up @@ -185,7 +188,7 @@ nsresult AttachFuzzyIOLayer(PRFileDesc* fd) {
return NS_ERROR_FAILURE;
}

PRStatus status = PR_PushIOLayer(fd, PR_NSPR_IO_LAYER, layer);
PRStatus status = PR_PushIOLayer(fd, PR_TOP_IO_LAYER, layer);

if (status == PR_FAILURE) {
PR_Free(layer); // PR_CreateIOLayerStub() uses PR_Malloc().
Expand Down
2 changes: 2 additions & 0 deletions netwerk/base/FuzzyLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#define FuzzyLayer_h__

#include "prerror.h"
#include "nsError.h"
#include "nsIFile.h"

namespace mozilla {
namespace net {
Expand Down
327 changes: 327 additions & 0 deletions netwerk/base/FuzzySecurityInfo.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,327 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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 "FuzzySecurityInfo.h"
#include "mozilla/Logging.h"
#include "mozilla/OriginAttributes.h"
#include "nsThreadManager.h"

namespace mozilla {
namespace net {

FuzzySecurityInfo::FuzzySecurityInfo() {}

FuzzySecurityInfo::~FuzzySecurityInfo() {}

NS_IMPL_ISUPPORTS(FuzzySecurityInfo, nsITransportSecurityInfo,
nsIInterfaceRequestor, nsISSLSocketControl)

NS_IMETHODIMP
FuzzySecurityInfo::GetErrorCode(int32_t* state) {
*state = 0;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSecurityState(uint32_t* state) {
*state = 0;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetErrorCodeString(nsAString& aErrorString) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetFailedCertChain(nsIX509CertList** _result) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetServerCert(nsIX509Cert** aServerCert) {
NS_ENSURE_ARG_POINTER(aServerCert);
// This method is called by nsHttpChannel::ProcessSSLInformation()
// in order to display certain information in the console.
// Returning NULL is okay here and handled by the caller.
*aServerCert = NULL;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSucceededCertChain(nsIX509CertList** _result) {
NS_ENSURE_ARG_POINTER(_result);
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetCipherName(nsACString& aCipherName) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetKeyLength(uint32_t* aKeyLength) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSecretKeyLength(uint32_t* aSecretKeyLength) {
MOZ_CRASH("Unused");
*aSecretKeyLength = 4096;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetKeaGroupName(nsACString& aKeaGroup) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSignatureSchemeName(nsACString& aSignatureScheme) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetProtocolVersion(uint16_t* aProtocolVersion) {
NS_ENSURE_ARG_POINTER(aProtocolVersion);
// Must be >= TLS 1.2 for HTTP2
*aProtocolVersion = nsITransportSecurityInfo::TLS_VERSION_1_2;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetCertificateTransparencyStatus(
uint16_t* aCertificateTransparencyStatus) {
NS_ENSURE_ARG_POINTER(aCertificateTransparencyStatus);
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetIsDomainMismatch(bool* aIsDomainMismatch) {
NS_ENSURE_ARG_POINTER(aIsDomainMismatch);
*aIsDomainMismatch = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetIsNotValidAtThisTime(bool* aIsNotValidAtThisTime) {
NS_ENSURE_ARG_POINTER(aIsNotValidAtThisTime);
*aIsNotValidAtThisTime = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetIsUntrusted(bool* aIsUntrusted) {
NS_ENSURE_ARG_POINTER(aIsUntrusted);
*aIsUntrusted = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetIsExtendedValidation(bool* aIsEV) {
NS_ENSURE_ARG_POINTER(aIsEV);
*aIsEV = true;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetInterface(const nsIID& uuid, void** result) {
if (!NS_IsMainThread()) {
MOZ_CRASH("FuzzySecurityInfo::GetInterface called off the main thread");
return NS_ERROR_NOT_SAME_THREAD;
}

nsresult rv = NS_ERROR_NO_INTERFACE;
if (mCallbacks) {
rv = mCallbacks->GetInterface(uuid, result);
}
return rv;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetNotificationCallbacks(
nsIInterfaceRequestor** aCallbacks) {
nsCOMPtr<nsIInterfaceRequestor> ir(mCallbacks);
ir.forget(aCallbacks);
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks) {
mCallbacks = aCallbacks;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetProviderFlags(uint32_t* aProviderFlags) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetProviderTlsFlags(uint32_t* aProviderTlsFlags) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetKEAUsed(int16_t* aKea) {
// Can be ssl_kea_dh or ssl_kea_ecdh for HTTP2
*aKea = ssl_kea_ecdh;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetKEAKeyBits(uint32_t* aKeyBits) {
// Must be >= 224 for ecdh and >= 2048 for dh when using HTTP2
*aKeyBits = 256;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSSLVersionUsed(int16_t* aSSLVersionUsed) {
// Must be >= TLS 1.2 for HTTP2
*aSSLVersionUsed = nsISSLSocketControl::TLS_VERSION_1_2;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetSSLVersionOffered(int16_t* aSSLVersionOffered) {
*aSSLVersionOffered = nsISSLSocketControl::TLS_VERSION_1_2;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetMACAlgorithmUsed(int16_t* aMac) {
// The only valid choice for HTTP2 is SSL_MAC_AEAD
*aMac = nsISSLSocketControl::SSL_MAC_AEAD;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetClientCert(nsIX509Cert** aClientCert) {
NS_ENSURE_ARG_POINTER(aClientCert);
*aClientCert = nullptr;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::SetClientCert(nsIX509Cert* aClientCert) {
MOZ_CRASH("Unused");
return NS_OK;
}

bool FuzzySecurityInfo::GetDenyClientCert() { return false; }

void FuzzySecurityInfo::SetDenyClientCert(bool aDenyClientCert) {
// Called by mozilla::net::nsHttpConnection::StartSpdy
}

NS_IMETHODIMP
FuzzySecurityInfo::GetClientCertSent(bool* arg) {
*arg = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetBypassAuthentication(bool* arg) {
*arg = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetFailedVerification(bool* arg) {
*arg = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetNegotiatedNPN(nsACString& aNegotiatedNPN) {
aNegotiatedNPN = "h2";
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetAlpnEarlySelection(nsACString& aAlpnSelected) {
// TODO: For now we don't support early selection
return NS_ERROR_NOT_AVAILABLE;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetEarlyDataAccepted(bool* aAccepted) {
*aAccepted = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetResumed(bool* aResumed) {
*aResumed = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::DriveHandshake() { return NS_OK; }

NS_IMETHODIMP
FuzzySecurityInfo::IsAcceptableForHost(const nsACString& hostname,
bool* _retval) {
NS_ENSURE_ARG(_retval);
*_retval = true;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::TestJoinConnection(const nsACString& npnProtocol,
const nsACString& hostname, int32_t port,
bool* _retval) {
*_retval = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::JoinConnection(const nsACString& npnProtocol,
const nsACString& hostname, int32_t port,
bool* _retval) {
*_retval = false;
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::ProxyStartSSL() { return NS_OK; }

NS_IMETHODIMP
FuzzySecurityInfo::StartTLS() { return NS_OK; }

NS_IMETHODIMP
FuzzySecurityInfo::SetNPNList(nsTArray<nsCString>& protocolArray) {
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetEsniTxt(nsACString& aEsniTxt) { return NS_OK; }

NS_IMETHODIMP
FuzzySecurityInfo::SetEsniTxt(const nsACString& aEsniTxt) {
MOZ_CRASH("Unused");
return NS_OK;
}

NS_IMETHODIMP
FuzzySecurityInfo::GetServerRootCertIsBuiltInRoot(bool* aIsBuiltInRoot) {
*aIsBuiltInRoot = true;
return NS_OK;
}

} // namespace net
} // namespace mozilla
Loading

0 comments on commit fad5375

Please sign in to comment.