/* vim:set ts=2 sw=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/. */
// We don't currently notify the server API consumer of renegotiation events // (to revalidate peer certs, etc.), so disable it for now.
SSL_OptionSet(mFD, SSL_ENABLE_RENEGOTIATION, SSL_RENEGOTIATE_NEVER);
RefPtr<nsSocketTransport> trans = new nsSocketTransport; if (NS_WARN_IF(!trans)) {
mCondition = NS_ERROR_OUT_OF_MEMORY; return;
}
RefPtr<TLSServerConnectionInfo> info = new TLSServerConnectionInfo();
info->mServerSocket = this;
info->mTransport = trans;
nsCOMPtr<nsIInterfaceRequestor> infoInterfaceRequestor(info);
rv = trans->InitWithConnectedSocket(aClientFD, &aClientAddr,
infoInterfaceRequestor); if (NS_WARN_IF(NS_FAILED(rv))) {
mCondition = rv; return;
}
// Override the default peer certificate validation, so that server consumers // can make their own choice after the handshake completes.
SSL_AuthCertificateHook(aClientFD, AuthCertificateHook, nullptr); // Once the TLS handshake has completed, the server consumer is notified and // has access to various TLS state details. // It's safe to pass info here because the socket transport holds it as // |mSecInfo| which keeps it alive for the lifetime of the socket.
SSL_HandshakeCallback(aClientFD, TLSServerConnectionInfo::HandshakeCallback,
info);
// Notify the consumer of the new client so it can manage the streams. // Security details aren't known yet. The security observer will be notified // later when they are ready.
nsCOMPtr<nsIServerSocket> serverSocket =
do_QueryInterface(NS_ISUPPORTS_CAST(nsITLSServerSocket*, this));
mListener->OnSocketAccepted(serverSocket, trans);
}
nsresult TLSServerSocket::OnSocketListen() { if (NS_WARN_IF(!mServerCert)) { return NS_ERROR_NOT_INITIALIZED;
}
UniqueCERTCertificate cert(mServerCert->GetCert()); if (NS_WARN_IF(!cert)) { return mozilla::psm::GetXPCOMFromNSSError(PR_GetError());
}
UniqueSECKEYPrivateKey key(PK11_FindKeyByAnyCert(cert.get(), nullptr)); if (NS_WARN_IF(!key)) { return mozilla::psm::GetXPCOMFromNSSError(PR_GetError());
}
// static
SECStatus TLSServerSocket::AuthCertificateHook(void* arg, PRFileDesc* fd,
PRBool checksig,
PRBool isServer) { // Allow any client cert here, server consumer code can decide whether it's // okay after being notified of the new client socket. return SECSuccess;
}
NS_IMETHODIMP
TLSServerSocket::SetServerCert(nsIX509Cert* aCert) { // If AsyncListen was already called (and set mListener), it's too late to set // this. if (NS_WARN_IF(mListener)) { return NS_ERROR_IN_PROGRESS;
}
mServerCert = aCert; return NS_OK;
}
NS_IMETHODIMP
TLSServerSocket::SetSessionTickets(bool aEnabled) { // If AsyncListen was already called (and set mListener), it's too late to set // this. if (NS_WARN_IF(mListener)) { return NS_ERROR_IN_PROGRESS;
}
SSL_OptionSet(mFD, SSL_ENABLE_SESSION_TICKETS, aEnabled); return NS_OK;
}
NS_IMETHODIMP
TLSServerSocket::SetRequestClientCertificate(uint32_t aMode) { // If AsyncListen was already called (and set mListener), it's too late to set // this. if (NS_WARN_IF(mListener)) { return NS_ERROR_IN_PROGRESS;
}
SSL_OptionSet(mFD, SSL_REQUEST_CERTIFICATE, aMode != REQUEST_NEVER);
switch (aMode) { case REQUEST_ALWAYS:
SSL_OptionSet(mFD, SSL_REQUIRE_CERTIFICATE, SSL_REQUIRE_NO_ERROR); break; case REQUIRE_FIRST_HANDSHAKE:
SSL_OptionSet(mFD, SSL_REQUIRE_CERTIFICATE, SSL_REQUIRE_FIRST_HANDSHAKE); break; case REQUIRE_ALWAYS:
SSL_OptionSet(mFD, SSL_REQUIRE_CERTIFICATE, SSL_REQUIRE_ALWAYS); break; default:
SSL_OptionSet(mFD, SSL_REQUIRE_CERTIFICATE, SSL_REQUIRE_NEVER);
} return NS_OK;
}
NS_IMETHODIMP
TLSServerSocket::SetVersionRange(uint16_t aMinVersion, uint16_t aMaxVersion) { // If AsyncListen was already called (and set mListener), it's too late to set // this. if (NS_WARN_IF(mListener)) { return NS_ERROR_IN_PROGRESS;
}
SSLVersionRange range = {aMinVersion, aMaxVersion}; if (SSL_VersionRangeSet(mFD, &range) != SECSuccess) { return mozilla::psm::GetXPCOMFromNSSError(PR_GetError());
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.