Home | History | Annotate | Download | only in patches
      1 Index: net/third_party/nss/ssl/ssl.h
      2 ===================================================================
      3 --- net/third_party/nss/ssl/ssl.h	(revision 225295)
      4 +++ net/third_party/nss/ssl/ssl.h	(working copy)
      5 @@ -434,6 +434,15 @@
      6  */
      7  SSL_IMPORT CERTCertificate *SSL_PeerCertificate(PRFileDesc *fd);
      8  
      9 +/*
     10 +** Return the certificates presented by the SSL peer. If the SSL peer
     11 +** did not present certificates, return NULL with the
     12 +** SSL_ERROR_NO_CERTIFICATE error. On failure, return NULL with an error
     13 +** code other than SSL_ERROR_NO_CERTIFICATE.
     14 +**	"fd" the socket "file" descriptor
     15 +*/
     16 +SSL_IMPORT CERTCertList *SSL_PeerCertificateChain(PRFileDesc *fd);
     17 +
     18  /* SSL_PeerStapledOCSPResponses returns the OCSP responses that were provided
     19   * by the TLS server. The return value is a pointer to an internal SECItemArray
     20   * that contains the returned OCSP responses; it is only valid until the
     21 @@ -463,18 +472,6 @@
     22  			    SSLKEAType kea);
     23  
     24  /*
     25 -** Return references to the certificates presented by the SSL peer.
     26 -** |maxNumCerts| must contain the size of the |certs| array. On successful
     27 -** return, |*numCerts| contains the number of certificates available and
     28 -** |certs| will contain references to as many certificates as would fit.
     29 -** Therefore if |*numCerts| contains a value less than or equal to
     30 -** |maxNumCerts|, then all certificates were returned.
     31 -*/
     32 -SSL_IMPORT SECStatus SSL_PeerCertificateChain(
     33 -	PRFileDesc *fd, CERTCertificate **certs,
     34 -	unsigned int *numCerts, unsigned int maxNumCerts);
     35 -
     36 -/*
     37  ** Authenticate certificate hook. Called when a certificate comes in
     38  ** (because of SSL_REQUIRE_CERTIFICATE in SSL_Enable) to authenticate the
     39  ** certificate.
     40 Index: net/third_party/nss/ssl/sslauth.c
     41 ===================================================================
     42 --- net/third_party/nss/ssl/sslauth.c	(revision 225295)
     43 +++ net/third_party/nss/ssl/sslauth.c	(working copy)
     44 @@ -28,38 +28,43 @@
     45  }
     46  
     47  /* NEED LOCKS IN HERE.  */
     48 -SECStatus
     49 -SSL_PeerCertificateChain(PRFileDesc *fd, CERTCertificate **certs,
     50 -			 unsigned int *numCerts, unsigned int maxNumCerts)
     51 +CERTCertList *
     52 +SSL_PeerCertificateChain(PRFileDesc *fd)
     53  {
     54      sslSocket *ss;
     55 -    ssl3CertNode* cur;
     56 +    CERTCertList *chain = NULL;
     57 +    CERTCertificate *cert;
     58 +    ssl3CertNode *cur;
     59  
     60      ss = ssl_FindSocket(fd);
     61      if (!ss) {
     62  	SSL_DBG(("%d: SSL[%d]: bad socket in PeerCertificateChain",
     63  		 SSL_GETPID(), fd));
     64 -	return SECFailure;
     65 +	return NULL;
     66      }
     67 -    if (!ss->opt.useSecurity)
     68 -	return SECFailure;
     69 -
     70 -    if (ss->sec.peerCert == NULL) {
     71 -      *numCerts = 0;
     72 -      return SECSuccess;
     73 +    if (!ss->opt.useSecurity || !ss->sec.peerCert) {
     74 +	PORT_SetError(SSL_ERROR_NO_CERTIFICATE);
     75 +	return NULL;
     76      }
     77 -
     78 -    *numCerts = 1;  /* for the leaf certificate */
     79 -    if (maxNumCerts > 0)
     80 -	certs[0] = CERT_DupCertificate(ss->sec.peerCert);
     81 -
     82 +    chain = CERT_NewCertList();
     83 +    if (!chain) {
     84 +	return NULL;
     85 +    }
     86 +    cert = CERT_DupCertificate(ss->sec.peerCert);
     87 +    if (CERT_AddCertToListTail(chain, cert) != SECSuccess) {
     88 +	goto loser;
     89 +    }
     90      for (cur = ss->ssl3.peerCertChain; cur; cur = cur->next) {
     91 -	if (*numCerts < maxNumCerts)
     92 -	    certs[*numCerts] = CERT_DupCertificate(cur->cert);
     93 -	(*numCerts)++;
     94 +	cert = CERT_DupCertificate(cur->cert);
     95 +	if (CERT_AddCertToListTail(chain, cert) != SECSuccess) {
     96 +	    goto loser;
     97 +	}
     98      }
     99 +    return chain;
    100  
    101 -    return SECSuccess;
    102 +loser:
    103 +    CERT_DestroyCertList(chain);
    104 +    return NULL;
    105  }
    106  
    107  /* NEED LOCKS IN HERE.  */
    108