| File: | root/firefox-clang/security/nss/lib/ssl/ssl3ext.h |
| Warning: | line 33, column 8 Excessive padding in 'struct TLSExtensionDataStr' (52 padding bytes, where 4 is optimal). Optimal fields order: advertised, echAdvertised, sniNameArr, sigSchemes, delegCredSigSchemes, delegCredSigSchemesAdvertised, selectedGroup, peerDelegCred, selectedPsk, ech, remoteKeyShares, psk_ke_modes, signedCertTimestamps, certReqContext, nextProto, pskBinder, cookie, applicationToken, certReqAuthorities, serverHelloSenders, encryptedExtensionsSenders, certificateSenders, ticketTimestampVerified, emptySessionTicket, sentSessionTicketInClientHello, max_early_data_size, sniNameArrSize, peerSupportsFfdheGroups, numSigSchemes, numDelegCredSigSchemes, numDelegCredSigSchemesAdvertised, nextProtoState, echXtnOffset, lastXtnOffset, pskBindersLen, ticketAge, peerRequestedDelegCred, sendingDelegCredToPeer, certificateCompressionAdvertised, numAdvertised, echNumAdvertised, numNegotiated, dtlsSRTPCipherSuite, recordSizeLimit, compressionAlg, negotiated, consider reordering the fields or adding explicit padding members |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
| 2 | /* |
| 3 | * This file is PRIVATE to SSL. |
| 4 | * |
| 5 | * This Source Code Form is subject to the terms of the Mozilla Public |
| 6 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 7 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 8 | |
| 9 | #ifndef __ssl3ext_h_ |
| 10 | #define __ssl3ext_h_ |
| 11 | |
| 12 | #include "pk11hpke.h" |
| 13 | #include "sslencode.h" |
| 14 | |
| 15 | typedef enum { |
| 16 | sni_nametype_hostname |
| 17 | } SNINameType; |
| 18 | typedef struct TLSExtensionDataStr TLSExtensionData; |
| 19 | |
| 20 | /* Registerable callback function that either appends extension to buffer |
| 21 | * or returns length of data that it would have appended. |
| 22 | */ |
| 23 | typedef SECStatus (*sslExtensionBuilderFunc)(const sslSocket *ss, |
| 24 | TLSExtensionData *xtnData, |
| 25 | sslBuffer *buf, PRBool *added); |
| 26 | |
| 27 | /* row in a table of hello extension senders */ |
| 28 | typedef struct { |
| 29 | PRInt32 ex_type; |
| 30 | sslExtensionBuilderFunc ex_sender; |
| 31 | } sslExtensionBuilder; |
| 32 | |
| 33 | struct TLSExtensionDataStr { |
Excessive padding in 'struct TLSExtensionDataStr' (52 padding bytes, where 4 is optimal). Optimal fields order: advertised, echAdvertised, sniNameArr, sigSchemes, delegCredSigSchemes, delegCredSigSchemesAdvertised, selectedGroup, peerDelegCred, selectedPsk, ech, remoteKeyShares, psk_ke_modes, signedCertTimestamps, certReqContext, nextProto, pskBinder, cookie, applicationToken, certReqAuthorities, serverHelloSenders, encryptedExtensionsSenders, certificateSenders, ticketTimestampVerified, emptySessionTicket, sentSessionTicketInClientHello, max_early_data_size, sniNameArrSize, peerSupportsFfdheGroups, numSigSchemes, numDelegCredSigSchemes, numDelegCredSigSchemesAdvertised, nextProtoState, echXtnOffset, lastXtnOffset, pskBindersLen, ticketAge, peerRequestedDelegCred, sendingDelegCredToPeer, certificateCompressionAdvertised, numAdvertised, echNumAdvertised, numNegotiated, dtlsSRTPCipherSuite, recordSizeLimit, compressionAlg, negotiated, consider reordering the fields or adding explicit padding members | |
| 34 | /* registered callbacks that send server hello extensions */ |
| 35 | sslExtensionBuilder serverHelloSenders[SSL_MAX_EXTENSIONS22]; |
| 36 | sslExtensionBuilder encryptedExtensionsSenders[SSL_MAX_EXTENSIONS22]; |
| 37 | sslExtensionBuilder certificateSenders[SSL_MAX_EXTENSIONS22]; |
| 38 | |
| 39 | /* Keep track of the extensions that are advertised or negotiated. */ |
| 40 | PRUint16 numAdvertised; |
| 41 | PRUint16 *advertised; /* Allocated dynamically. */ |
| 42 | PRUint16 echNumAdvertised; /* Tracks Xtns offered in ClientHelloInner. */ |
| 43 | PRUint16 *echAdvertised; |
| 44 | PRUint16 numNegotiated; |
| 45 | PRUint16 negotiated[SSL_MAX_EXTENSIONS22]; |
| 46 | |
| 47 | /* SessionTicket Extension related data. */ |
| 48 | PRBool ticketTimestampVerified; |
| 49 | PRBool emptySessionTicket; |
| 50 | PRBool sentSessionTicketInClientHello; |
| 51 | SECItem psk_ke_modes; |
| 52 | PRUint32 max_early_data_size; |
| 53 | |
| 54 | /* SNI Extension related data |
| 55 | * Names data is not coppied from the input buffer. It can not be |
| 56 | * used outside the scope where input buffer is defined and that |
| 57 | * is beyond ssl3_HandleClientHello function. */ |
| 58 | SECItem *sniNameArr; |
| 59 | PRUint32 sniNameArrSize; |
| 60 | |
| 61 | /* Signed Certificate Timestamps extracted from the TLS extension. |
| 62 | * (client only). |
| 63 | * This container holds a temporary pointer to the extension data, |
| 64 | * until a session structure (the sec.ci.sid of an sslSocket) is setup |
| 65 | * that can hold a permanent copy of the data |
| 66 | * (in sec.ci.sid.u.ssl3.signedCertTimestamps). |
| 67 | * The data pointed to by this structure is neither explicitly allocated |
| 68 | * nor copied: the pointer points to the handshake message buffer and is |
| 69 | * only valid in the scope of ssl3_HandleServerHello. |
| 70 | */ |
| 71 | SECItem signedCertTimestamps; |
| 72 | |
| 73 | PRBool peerSupportsFfdheGroups; /* if the peer supports named ffdhe groups */ |
| 74 | |
| 75 | /* clientSigAndHash contains the contents of the signature_algorithms |
| 76 | * extension (if any) the other side supports. This is only valid for TLS |
| 77 | * 1.2 or later. In TLS 1.3, it is also used for CertificateRequest. */ |
| 78 | SSLSignatureScheme *sigSchemes; |
| 79 | unsigned int numSigSchemes; |
| 80 | |
| 81 | /* Keep track of signature schemes that the remote peer supports for |
| 82 | * Delegated Credentials signatures, as well was those we have |
| 83 | * advertised (for purposes of validating any received DC). |
| 84 | * This list may not be the same as those supported for certificates. |
| 85 | * Only valid for TLS 1.3. */ |
| 86 | SSLSignatureScheme *delegCredSigSchemes; |
| 87 | unsigned int numDelegCredSigSchemes; |
| 88 | SSLSignatureScheme *delegCredSigSchemesAdvertised; |
| 89 | unsigned int numDelegCredSigSchemesAdvertised; |
| 90 | |
| 91 | SECItem certReqContext; |
| 92 | CERTDistNames certReqAuthorities; |
| 93 | |
| 94 | /* In a client: if the server supports Next Protocol Negotiation, then |
| 95 | * this is the protocol that was negotiated. |
| 96 | */ |
| 97 | SECItem nextProto; |
| 98 | SSLNextProtoState nextProtoState; |
| 99 | |
| 100 | PRUint16 dtlsSRTPCipherSuite; /* 0 if not selected */ |
| 101 | |
| 102 | unsigned int echXtnOffset; /* The start of the ECH Xtn (if any) */ |
| 103 | unsigned int lastXtnOffset; /* Where to insert any other extensions. |
| 104 | * 0 = end, otherwise base of PSK xtn. */ |
| 105 | PRCList remoteKeyShares; /* The other side's public keys (TLS 1.3) */ |
| 106 | |
| 107 | /* The following are used by a TLS 1.3 server. */ |
| 108 | SECItem pskBinder; /* The binder for the first PSK. */ |
| 109 | unsigned int pskBindersLen; /* The length of the binders. */ |
| 110 | PRUint32 ticketAge; /* Used to accept early data. */ |
| 111 | SECItem cookie; /* HRR Cookie. */ |
| 112 | const sslNamedGroupDef *selectedGroup; /* For HRR. */ |
| 113 | /* The application token contains a value that was passed to the client via |
| 114 | * a session ticket, or the cookie in a HelloRetryRequest. */ |
| 115 | SECItem applicationToken; |
| 116 | |
| 117 | /* The record size limit set by the peer. Our value is kept in ss->opt. */ |
| 118 | PRUint16 recordSizeLimit; |
| 119 | |
| 120 | /* Delegated credentials. |
| 121 | * |
| 122 | * The delegated credential sent by the peer. Set by |
| 123 | * |tls13_ReadDelegatedCredential|. |
| 124 | */ |
| 125 | sslDelegatedCredential *peerDelegCred; |
| 126 | /* Whether the peer requested a delegated credential. */ |
| 127 | PRBool peerRequestedDelegCred; |
| 128 | /* Whether the host is committed to using a delegated credential. Set by |
| 129 | * |tls13_MaybeSetDelegatedCredential|. |
| 130 | */ |
| 131 | PRBool sendingDelegCredToPeer; |
| 132 | |
| 133 | /* A non-owning reference to the selected PSKs. MUST NOT be freed directly, |
| 134 | * rather through tls13_DestoryPskList(). */ |
| 135 | sslPsk *selectedPsk; |
| 136 | |
| 137 | /* ECH working state. Non-null when a valid Encrypted Client Hello extension |
| 138 | * was received. */ |
| 139 | sslEchXtnState *ech; |
| 140 | |
| 141 | /* The compression algorithm that will be used to encode certificates. */ |
| 142 | SSLCertificateCompressionAlgorithmID compressionAlg; |
| 143 | PRBool certificateCompressionAdvertised; |
| 144 | }; |
| 145 | |
| 146 | typedef struct TLSExtensionStr { |
| 147 | PRCList link; /* The linked list link */ |
| 148 | PRUint16 type; /* Extension type */ |
| 149 | SECItem data; /* Pointers into the handshake data. */ |
| 150 | } TLSExtension; |
| 151 | |
| 152 | typedef struct sslCustomExtensionHooks { |
| 153 | PRCList link; |
| 154 | PRUint16 type; |
| 155 | SSLExtensionWriter writer; |
| 156 | void *writerArg; |
| 157 | SSLExtensionHandler handler; |
| 158 | void *handlerArg; |
| 159 | } sslCustomExtensionHooks; |
| 160 | |
| 161 | SECStatus ssl3_HandleExtensions(sslSocket *ss, |
| 162 | PRUint8 **b, PRUint32 *length, |
| 163 | SSLHandshakeType handshakeMessage); |
| 164 | SECStatus ssl3_ParseExtensions(sslSocket *ss, |
| 165 | PRUint8 **b, PRUint32 *length); |
| 166 | SECStatus ssl3_HandleParsedExtensions(sslSocket *ss, |
| 167 | SSLHandshakeType handshakeMessage); |
| 168 | TLSExtension *ssl3_FindExtension(sslSocket *ss, |
| 169 | SSLExtensionType extension_type); |
| 170 | void ssl3_DestroyRemoteExtensions(PRCList *list); |
| 171 | void ssl3_MoveRemoteExtensions(PRCList *dst, PRCList *src); |
| 172 | void ssl3_InitExtensionData(TLSExtensionData *xtnData, const sslSocket *ss); |
| 173 | void ssl3_DestroyExtensionData(TLSExtensionData *xtnData); |
| 174 | void ssl3_ResetExtensionData(TLSExtensionData *xtnData, const sslSocket *ss); |
| 175 | |
| 176 | PRBool ssl3_ExtensionNegotiated(const sslSocket *ss, PRUint16 ex_type); |
| 177 | PRBool ssl3_ExtensionAdvertised(const sslSocket *ss, PRUint16 ex_type); |
| 178 | |
| 179 | SECStatus ssl3_RegisterExtensionSender(const sslSocket *ss, |
| 180 | TLSExtensionData *xtnData, |
| 181 | PRUint16 ex_type, |
| 182 | sslExtensionBuilderFunc cb); |
| 183 | SECStatus ssl_ConstructExtensions(sslSocket *ss, sslBuffer *buf, |
| 184 | SSLHandshakeType message); |
| 185 | SECStatus ssl_SendEmptyExtension(const sslSocket *ss, TLSExtensionData *xtnData, |
| 186 | sslBuffer *buf, PRBool *append); |
| 187 | SECStatus ssl3_EmplaceExtension(sslSocket *ss, sslBuffer *buf, PRUint16 exType, |
| 188 | const PRUint8 *data, unsigned int len, PRBool advertise); |
| 189 | SECStatus ssl_InsertPaddingExtension(sslSocket *ss, unsigned int prefixLen, |
| 190 | sslBuffer *buf); |
| 191 | |
| 192 | /* Thunks to let us operate on const sslSocket* objects. */ |
| 193 | void ssl3_ExtSendAlert(const sslSocket *ss, SSL3AlertLevel level, |
| 194 | SSL3AlertDescription desc); |
| 195 | void ssl3_ExtDecodeError(const sslSocket *ss); |
| 196 | SECStatus ssl3_ExtConsumeHandshake(const sslSocket *ss, void *v, PRUint32 bytes, |
| 197 | PRUint8 **b, PRUint32 *length); |
| 198 | SECStatus ssl3_ExtConsumeHandshakeNumber(const sslSocket *ss, PRUint32 *num, |
| 199 | PRUint32 bytes, PRUint8 **b, |
| 200 | PRUint32 *length); |
| 201 | SECStatus ssl3_ExtConsumeHandshakeVariable(const sslSocket *ss, SECItem *i, |
| 202 | PRUint32 bytes, PRUint8 **b, |
| 203 | PRUint32 *length); |
| 204 | |
| 205 | SECStatus SSLExp_GetExtensionSupport(PRUint16 type, |
| 206 | SSLExtensionSupport *support); |
| 207 | SECStatus SSLExp_InstallExtensionHooks( |
| 208 | PRFileDesc *fd, PRUint16 extension, SSLExtensionWriter writer, |
| 209 | void *writerArg, SSLExtensionHandler handler, void *handlerArg); |
| 210 | sslCustomExtensionHooks *ssl_FindCustomExtensionHooks(sslSocket *ss, PRUint16 extension); |
| 211 | SECStatus ssl_CallCustomExtensionSenders(sslSocket *ss, sslBuffer *buf, |
| 212 | SSLHandshakeType message); |
| 213 | SECStatus tls_ClientHelloExtensionPermutationSetup(sslSocket *ss); |
| 214 | void tls_ClientHelloExtensionPermutationDestroy(sslSocket *ss); |
| 215 | |
| 216 | #endif |