216 lines
9.3 KiB
C
216 lines
9.3 KiB
C
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is PRIVATE to SSL.
|
|
*
|
|
* 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/. */
|
|
|
|
#ifndef __ssl3ext_h_
|
|
#define __ssl3ext_h_
|
|
|
|
#include "pk11hpke.h"
|
|
#include "sslencode.h"
|
|
|
|
typedef enum {
|
|
sni_nametype_hostname
|
|
} SNINameType;
|
|
typedef struct TLSExtensionDataStr TLSExtensionData;
|
|
|
|
/* Registerable callback function that either appends extension to buffer
|
|
* or returns length of data that it would have appended.
|
|
*/
|
|
typedef SECStatus (*sslExtensionBuilderFunc)(const sslSocket *ss,
|
|
TLSExtensionData *xtnData,
|
|
sslBuffer *buf, PRBool *added);
|
|
|
|
/* row in a table of hello extension senders */
|
|
typedef struct {
|
|
PRInt32 ex_type;
|
|
sslExtensionBuilderFunc ex_sender;
|
|
} sslExtensionBuilder;
|
|
|
|
struct TLSExtensionDataStr {
|
|
/* registered callbacks that send server hello extensions */
|
|
sslExtensionBuilder serverHelloSenders[SSL_MAX_EXTENSIONS];
|
|
sslExtensionBuilder encryptedExtensionsSenders[SSL_MAX_EXTENSIONS];
|
|
sslExtensionBuilder certificateSenders[SSL_MAX_EXTENSIONS];
|
|
|
|
/* Keep track of the extensions that are advertised or negotiated. */
|
|
PRUint16 numAdvertised;
|
|
PRUint16 *advertised; /* Allocated dynamically. */
|
|
PRUint16 echNumAdvertised; /* Tracks Xtns offered in ClientHelloInner. */
|
|
PRUint16 *echAdvertised;
|
|
PRUint16 numNegotiated;
|
|
PRUint16 negotiated[SSL_MAX_EXTENSIONS];
|
|
|
|
/* SessionTicket Extension related data. */
|
|
PRBool ticketTimestampVerified;
|
|
PRBool emptySessionTicket;
|
|
PRBool sentSessionTicketInClientHello;
|
|
SECItem psk_ke_modes;
|
|
PRUint32 max_early_data_size;
|
|
|
|
/* SNI Extension related data
|
|
* Names data is not coppied from the input buffer. It can not be
|
|
* used outside the scope where input buffer is defined and that
|
|
* is beyond ssl3_HandleClientHello function. */
|
|
SECItem *sniNameArr;
|
|
PRUint32 sniNameArrSize;
|
|
|
|
/* Signed Certificate Timestamps extracted from the TLS extension.
|
|
* (client only).
|
|
* This container holds a temporary pointer to the extension data,
|
|
* until a session structure (the sec.ci.sid of an sslSocket) is setup
|
|
* that can hold a permanent copy of the data
|
|
* (in sec.ci.sid.u.ssl3.signedCertTimestamps).
|
|
* The data pointed to by this structure is neither explicitly allocated
|
|
* nor copied: the pointer points to the handshake message buffer and is
|
|
* only valid in the scope of ssl3_HandleServerHello.
|
|
*/
|
|
SECItem signedCertTimestamps;
|
|
|
|
PRBool peerSupportsFfdheGroups; /* if the peer supports named ffdhe groups */
|
|
|
|
/* clientSigAndHash contains the contents of the signature_algorithms
|
|
* extension (if any) the other side supports. This is only valid for TLS
|
|
* 1.2 or later. In TLS 1.3, it is also used for CertificateRequest. */
|
|
SSLSignatureScheme *sigSchemes;
|
|
unsigned int numSigSchemes;
|
|
|
|
/* Keep track of signature schemes that the remote peer supports for
|
|
* Delegated Credentials signatures, as well was those we have
|
|
* advertised (for purposes of validating any received DC).
|
|
* This list may not be the same as those supported for certificates.
|
|
* Only valid for TLS 1.3. */
|
|
SSLSignatureScheme *delegCredSigSchemes;
|
|
unsigned int numDelegCredSigSchemes;
|
|
SSLSignatureScheme *delegCredSigSchemesAdvertised;
|
|
unsigned int numDelegCredSigSchemesAdvertised;
|
|
|
|
SECItem certReqContext;
|
|
CERTDistNames certReqAuthorities;
|
|
|
|
/* In a client: if the server supports Next Protocol Negotiation, then
|
|
* this is the protocol that was negotiated.
|
|
*/
|
|
SECItem nextProto;
|
|
SSLNextProtoState nextProtoState;
|
|
|
|
PRUint16 dtlsSRTPCipherSuite; /* 0 if not selected */
|
|
|
|
unsigned int echXtnOffset; /* The start of the ECH Xtn (if any) */
|
|
unsigned int lastXtnOffset; /* Where to insert any other extensions.
|
|
* 0 = end, otherwise base of PSK xtn. */
|
|
PRCList remoteKeyShares; /* The other side's public keys (TLS 1.3) */
|
|
|
|
/* The following are used by a TLS 1.3 server. */
|
|
SECItem pskBinder; /* The binder for the first PSK. */
|
|
unsigned int pskBindersLen; /* The length of the binders. */
|
|
PRUint32 ticketAge; /* Used to accept early data. */
|
|
SECItem cookie; /* HRR Cookie. */
|
|
const sslNamedGroupDef *selectedGroup; /* For HRR. */
|
|
/* The application token contains a value that was passed to the client via
|
|
* a session ticket, or the cookie in a HelloRetryRequest. */
|
|
SECItem applicationToken;
|
|
|
|
/* The record size limit set by the peer. Our value is kept in ss->opt. */
|
|
PRUint16 recordSizeLimit;
|
|
|
|
/* Delegated credentials.
|
|
*
|
|
* The delegated credential sent by the peer. Set by
|
|
* |tls13_ReadDelegatedCredential|.
|
|
*/
|
|
sslDelegatedCredential *peerDelegCred;
|
|
/* Whether the peer requested a delegated credential. */
|
|
PRBool peerRequestedDelegCred;
|
|
/* Whether the host is committed to using a delegated credential. Set by
|
|
* |tls13_MaybeSetDelegatedCredential|.
|
|
*/
|
|
PRBool sendingDelegCredToPeer;
|
|
|
|
/* A non-owning reference to the selected PSKs. MUST NOT be freed directly,
|
|
* rather through tls13_DestoryPskList(). */
|
|
sslPsk *selectedPsk;
|
|
|
|
/* ECH working state. Non-null when a valid Encrypted Client Hello extension
|
|
* was received. */
|
|
sslEchXtnState *ech;
|
|
|
|
/* The compression algorithm that will be used to encode certificates. */
|
|
SSLCertificateCompressionAlgorithmID compressionAlg;
|
|
PRBool certificateCompressionAdvertised;
|
|
};
|
|
|
|
typedef struct TLSExtensionStr {
|
|
PRCList link; /* The linked list link */
|
|
PRUint16 type; /* Extension type */
|
|
SECItem data; /* Pointers into the handshake data. */
|
|
} TLSExtension;
|
|
|
|
typedef struct sslCustomExtensionHooks {
|
|
PRCList link;
|
|
PRUint16 type;
|
|
SSLExtensionWriter writer;
|
|
void *writerArg;
|
|
SSLExtensionHandler handler;
|
|
void *handlerArg;
|
|
} sslCustomExtensionHooks;
|
|
|
|
SECStatus ssl3_HandleExtensions(sslSocket *ss,
|
|
PRUint8 **b, PRUint32 *length,
|
|
SSLHandshakeType handshakeMessage);
|
|
SECStatus ssl3_ParseExtensions(sslSocket *ss,
|
|
PRUint8 **b, PRUint32 *length);
|
|
SECStatus ssl3_HandleParsedExtensions(sslSocket *ss,
|
|
SSLHandshakeType handshakeMessage);
|
|
TLSExtension *ssl3_FindExtension(sslSocket *ss,
|
|
SSLExtensionType extension_type);
|
|
void ssl3_DestroyRemoteExtensions(PRCList *list);
|
|
void ssl3_MoveRemoteExtensions(PRCList *dst, PRCList *src);
|
|
void ssl3_InitExtensionData(TLSExtensionData *xtnData, const sslSocket *ss);
|
|
void ssl3_DestroyExtensionData(TLSExtensionData *xtnData);
|
|
void ssl3_ResetExtensionData(TLSExtensionData *xtnData, const sslSocket *ss);
|
|
|
|
PRBool ssl3_ExtensionNegotiated(const sslSocket *ss, PRUint16 ex_type);
|
|
PRBool ssl3_ExtensionAdvertised(const sslSocket *ss, PRUint16 ex_type);
|
|
|
|
SECStatus ssl3_RegisterExtensionSender(const sslSocket *ss,
|
|
TLSExtensionData *xtnData,
|
|
PRUint16 ex_type,
|
|
sslExtensionBuilderFunc cb);
|
|
SECStatus ssl_ConstructExtensions(sslSocket *ss, sslBuffer *buf,
|
|
SSLHandshakeType message);
|
|
SECStatus ssl_SendEmptyExtension(const sslSocket *ss, TLSExtensionData *xtnData,
|
|
sslBuffer *buf, PRBool *append);
|
|
SECStatus ssl3_EmplaceExtension(sslSocket *ss, sslBuffer *buf, PRUint16 exType,
|
|
const PRUint8 *data, unsigned int len, PRBool advertise);
|
|
SECStatus ssl_InsertPaddingExtension(sslSocket *ss, unsigned int prefixLen,
|
|
sslBuffer *buf);
|
|
|
|
/* Thunks to let us operate on const sslSocket* objects. */
|
|
void ssl3_ExtSendAlert(const sslSocket *ss, SSL3AlertLevel level,
|
|
SSL3AlertDescription desc);
|
|
void ssl3_ExtDecodeError(const sslSocket *ss);
|
|
SECStatus ssl3_ExtConsumeHandshake(const sslSocket *ss, void *v, PRUint32 bytes,
|
|
PRUint8 **b, PRUint32 *length);
|
|
SECStatus ssl3_ExtConsumeHandshakeNumber(const sslSocket *ss, PRUint32 *num,
|
|
PRUint32 bytes, PRUint8 **b,
|
|
PRUint32 *length);
|
|
SECStatus ssl3_ExtConsumeHandshakeVariable(const sslSocket *ss, SECItem *i,
|
|
PRUint32 bytes, PRUint8 **b,
|
|
PRUint32 *length);
|
|
|
|
SECStatus SSLExp_GetExtensionSupport(PRUint16 type,
|
|
SSLExtensionSupport *support);
|
|
SECStatus SSLExp_InstallExtensionHooks(
|
|
PRFileDesc *fd, PRUint16 extension, SSLExtensionWriter writer,
|
|
void *writerArg, SSLExtensionHandler handler, void *handlerArg);
|
|
sslCustomExtensionHooks *ssl_FindCustomExtensionHooks(sslSocket *ss, PRUint16 extension);
|
|
SECStatus ssl_CallCustomExtensionSenders(sslSocket *ss, sslBuffer *buf,
|
|
SSLHandshakeType message);
|
|
SECStatus tls_ClientHelloExtensionPermutationSetup(sslSocket *ss);
|
|
void tls_ClientHelloExtensionPermutationDestroy(sslSocket *ss);
|
|
|
|
#endif
|