- add sources.
[platform/framework/web/crosswalk.git] / src / net / third_party / nss / patches / peercertchain2.patch
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.  */