/* -*- 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 __tls13esni_h_
#define __tls13esni_h_

struct sslEsniKeysStr {
    SECItem data; /* The encoded record. */
    sslEphemeralKeyPair *privKey;
    const char *dummySni;
    PRCList keyShares; /* List of TLS13KeyShareEntry */
    SECItem suites;
    PRUint16 paddedLength;
    PRUint64 notBefore;
    PRUint64 notAfter;
};

SECStatus SSLExp_SetESNIKeyPair(PRFileDesc *fd,
                                SECKEYPrivateKey *privKey,
                                const PRUint8 *record, unsigned int recordLen);

SECStatus SSLExp_EnableESNI(PRFileDesc *fd, const PRUint8 *esniKeys,
                            unsigned int esniKeysLen, const char *dummySNI);
SECStatus SSLExp_EncodeESNIKeys(PRUint16 *cipherSuites, unsigned int cipherSuiteCount,
                                SSLNamedGroup group, SECKEYPublicKey *pubKey,
                                PRUint16 pad, PRUint64 notBefore, PRUint64 notAfter,
                                PRUint8 *out, unsigned int *outlen, unsigned int maxlen);
sslEsniKeys *tls13_CopyESNIKeys(sslEsniKeys *okeys);
void tls13_DestroyESNIKeys(sslEsniKeys *keys);
SECStatus tls13_ClientSetupESNI(sslSocket *ss);
SECStatus tls13_ComputeESNIKeys(const sslSocket *ss,
                                TLS13KeyShareEntry *entry,
                                sslKeyPair *keyPair,
                                const ssl3CipherSuiteDef *suite,
                                const PRUint8 *esniKeysHash,
                                const PRUint8 *keyShareBuf,
                                unsigned int keyShareBufLen,
                                const PRUint8 *clientRandom,
                                ssl3KeyMaterial *keyMat);
SECStatus tls13_FormatEsniAADInput(sslBuffer *aadInput,
                                   PRUint8 *keyShare, unsigned int keyShareLen);

SECStatus tls13_ServerDecryptEsniXtn(const sslSocket *ss, PRUint8 *in, unsigned int inLen,
                                     PRUint8 *out, int *outLen, int maxLen);

#endif
