Blame nss/lib/ssl/sslreveal.c

Packit 40b132
/* 
Packit 40b132
 * Accessor functions for SSLSocket private members.
Packit 40b132
 *
Packit 40b132
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
#include "cert.h"
Packit 40b132
#include "ssl.h"
Packit 40b132
#include "certt.h"
Packit 40b132
#include "sslimpl.h"
Packit 40b132
Packit 40b132
/* given PRFileDesc, returns a copy of certificate associated with the socket
Packit 40b132
 * the caller should delete the cert when done with SSL_DestroyCertificate
Packit 40b132
 */
Packit 40b132
CERTCertificate * 
Packit 40b132
SSL_RevealCert(PRFileDesc * fd)
Packit 40b132
{
Packit 40b132
  CERTCertificate * cert = NULL;
Packit 40b132
  sslSocket * sslsocket = NULL;
Packit 40b132
Packit 40b132
  sslsocket = ssl_FindSocket(fd);
Packit 40b132
  
Packit 40b132
  /* CERT_DupCertificate increases reference count and returns pointer to 
Packit 40b132
   * the same cert
Packit 40b132
   */
Packit 40b132
  if (sslsocket && sslsocket->sec.peerCert)
Packit 40b132
    cert = CERT_DupCertificate(sslsocket->sec.peerCert);
Packit 40b132
  
Packit 40b132
  return cert;
Packit 40b132
}
Packit 40b132
Packit 40b132
/* given PRFileDesc, returns a pointer to PinArg associated with the socket
Packit 40b132
 */
Packit 40b132
void * 
Packit 40b132
SSL_RevealPinArg(PRFileDesc * fd)
Packit 40b132
{
Packit 40b132
  sslSocket * sslsocket = NULL;
Packit 40b132
  void * PinArg = NULL;
Packit 40b132
  
Packit 40b132
  sslsocket = ssl_FindSocket(fd);
Packit 40b132
  
Packit 40b132
  /* is pkcs11PinArg part of the sslSocket or sslSecurityInfo ? */
Packit 40b132
  if (sslsocket)
Packit 40b132
    PinArg = sslsocket->pkcs11PinArg;
Packit 40b132
  
Packit 40b132
  return PinArg;
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
/* given PRFileDesc, returns a pointer to the URL associated with the socket
Packit 40b132
 * the caller should free url when done
Packit 40b132
 */
Packit 40b132
char * 
Packit 40b132
SSL_RevealURL(PRFileDesc * fd)
Packit 40b132
{
Packit 40b132
  sslSocket * sslsocket = NULL;
Packit 40b132
  char * url = NULL;
Packit 40b132
Packit 40b132
  sslsocket = ssl_FindSocket(fd);
Packit 40b132
  
Packit 40b132
  if (sslsocket && sslsocket->url)
Packit 40b132
    url = PL_strdup(sslsocket->url);
Packit 40b132
  
Packit 40b132
  return url;
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
/* given PRFileDesc, returns status information related to extensions 
Packit 40b132
 * negotiated with peer during the handshake.
Packit 40b132
 */
Packit 40b132
Packit 40b132
SECStatus
Packit 40b132
SSL_HandshakeNegotiatedExtension(PRFileDesc * socket, 
Packit 40b132
                                 SSLExtensionType extId,
Packit 40b132
                                 PRBool *pYes)
Packit 40b132
{
Packit 40b132
  /* some decisions derived from SSL_GetChannelInfo */
Packit 40b132
  sslSocket * sslsocket = NULL;
Packit 40b132
Packit 40b132
  if (!pYes) {
Packit 40b132
    PORT_SetError(SEC_ERROR_INVALID_ARGS);
Packit 40b132
    return SECFailure;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  sslsocket = ssl_FindSocket(socket);
Packit 40b132
  if (!sslsocket) {
Packit 40b132
    SSL_DBG(("%d: SSL[%d]: bad socket in HandshakeNegotiatedExtension",
Packit 40b132
             SSL_GETPID(), socket));
Packit 40b132
    return SECFailure;
Packit 40b132
  }
Packit 40b132
Packit 40b132
  *pYes = PR_FALSE;
Packit 40b132
Packit 40b132
  /* according to public API SSL_GetChannelInfo, this doesn't need a lock */
Packit 40b132
  if (sslsocket->opt.useSecurity) {
Packit 40b132
    if (sslsocket->ssl3.initialized) { /* SSL3 and TLS */
Packit 40b132
      /* now we know this socket went through ssl3_InitState() and
Packit 40b132
       * ss->xtnData got initialized, which is the only member accessed by
Packit 40b132
       * ssl3_ExtensionNegotiated();
Packit 40b132
       * Member xtnData appears to get accessed in functions that handle
Packit 40b132
       * the handshake (hello messages and extension sending),
Packit 40b132
       * therefore the handshake lock should be sufficient.
Packit 40b132
       */
Packit 40b132
      ssl_GetSSL3HandshakeLock(sslsocket);
Packit 40b132
      *pYes = ssl3_ExtensionNegotiated(sslsocket, extId);
Packit 40b132
      ssl_ReleaseSSL3HandshakeLock(sslsocket);
Packit 40b132
    }
Packit 40b132
  }
Packit 40b132
Packit 40b132
  return SECSuccess;
Packit 40b132
}