123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396 |
- /*
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License").
- * You may not use this file except in compliance with the License.
- * A copy of the License is located at
- *
- * http://aws.amazon.com/apache2.0
- *
- * or in the "license" file accompanying this file. This file is distributed
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
- /**
- * @file s2n.h
- * s2n-tls is a C99 implementation of the TLS/SSL protocols that is designed to
- * be simple, small, fast, and with security as a priority. <br> It is released and
- * licensed under the Apache License 2.0.
- */
- #pragma once
- #if ((__GNUC__ >= 4) || defined(__clang__)) && defined(S2N_EXPORTS)
- /**
- * Marks a function as belonging to the public s2n API.
- */
- #define S2N_API __attribute__((visibility("default")))
- #else
- /**
- * Marks a function as belonging to the public s2n API.
- */
- #define S2N_API
- #endif /* __GNUC__ >= 4 || defined(__clang__) */
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <stdbool.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/uio.h>
- /**
- * Function return code
- */
- #define S2N_SUCCESS 0
- /**
- * Function return code
- */
- #define S2N_FAILURE -1
- /**
- * Callback return code
- */
- #define S2N_CALLBACK_BLOCKED -2
- /**
- * s2n minimum supported TLS record major version
- */
- #define S2N_MINIMUM_SUPPORTED_TLS_RECORD_MAJOR_VERSION 2
- /**
- * s2n maximum supported TLS record major version
- */
- #define S2N_MAXIMUM_SUPPORTED_TLS_RECORD_MAJOR_VERSION 3
- /**
- * s2n SSL 2.0 Version Constant
- */
- #define S2N_SSLv2 20
- /**
- * s2n SSL 3.0 Version Constant
- */
- #define S2N_SSLv3 30
- /**
- * s2n TLS 1.0 Version Constant
- */
- #define S2N_TLS10 31
- /**
- * s2n TLS 1.1 Version Constant
- */
- #define S2N_TLS11 32
- /**
- * s2n TLS 1.2 Version Constant
- */
- #define S2N_TLS12 33
- /**
- * s2n TLS 1.3 Version Constant
- */
- #define S2N_TLS13 34
- /**
- * s2n Unknown TLS Version
- */
- #define S2N_UNKNOWN_PROTOCOL_VERSION 0
- /**
- * s2n-tls functions that return 'int' return 0 to indicate success and -1 to indicate
- * failure.
- *
- * s2n-tls functions that return pointer types return NULL in the case of
- * failure.
- *
- * When an s2n-tls function returns a failure, s2n_errno will be set to a value
- * corresponding to the error. This error value can be translated into a string
- * explaining the error in English by calling s2n_strerror(s2n_errno, "EN").
- * A string containing human readable error name; can be generated with `s2n_strerror_name`.
- * A string containing internal debug information, including filename and line number, can be generated with `s2n_strerror_debug`.
- * A string containing only the filename and line number can be generated with `s2n_strerror_source`.
- * This string is useful to include when reporting issues to the s2n-tls development team.
- *
- * @warning To avoid possible confusion, s2n_errno should be cleared after processing an error: `s2n_errno = S2N_ERR_T_OK`
- */
- S2N_API extern __thread int s2n_errno;
- /**
- * This function can be used instead of trying to resolve `s2n_errno` directly
- * in runtimes where thread-local variables may not be easily accessible.
- *
- * @returns The address of the thread-local `s2n_errno` variable
- */
- S2N_API extern int *s2n_errno_location(void);
- /**
- * Used to help applications determine why an s2n-tls function failed.
- *
- * This enum is optimized for use in C switch statements. Each value in the enum represents
- * an error "category".
- *
- * s2n-tls organizes errors into different "types" to allow applications to handle error
- * values without catching all possibilities. Applications using non-blocking I/O should check
- * the error type to determine if the I/O operation failed because it would block or for some other
- * error. To retrieve the type for a given error use `s2n_error_get_type()`. Applications should
- * perform any error handling logic using these high level types.
- *
- * See the [Error Handling](https://github.com/aws/s2n-tls/blob/main/docs/USAGE-GUIDE.md#error-handling) section for how the errors should be interpreted.
- */
- typedef enum {
- /** No error */
- S2N_ERR_T_OK = 0,
- /** Underlying I/O operation failed, check system errno */
- S2N_ERR_T_IO,
- /** EOF */
- S2N_ERR_T_CLOSED,
- /** Underlying I/O operation would block */
- S2N_ERR_T_BLOCKED,
- /** Incoming Alert */
- S2N_ERR_T_ALERT,
- /** Failure in some part of the TLS protocol. Ex: CBC verification failure */
- S2N_ERR_T_PROTO,
- /** Error internal to s2n-tls. A precondition could have failed. */
- S2N_ERR_T_INTERNAL,
- /** User input error. Ex: Providing an invalid cipher preference version */
- S2N_ERR_T_USAGE
- } s2n_error_type;
- /**
- * Gets the category of error from an error.
- *
- * s2n-tls organizes errors into different "types" to allow applications to do logic on error values without catching all possibilities.
- * Applications using non-blocking I/O should check error type to determine if the I/O operation failed because
- * it would block or for some other error.
- *
- * @param error The error from s2n. Usually this is `s2n_errno`.
- * @returns An s2n_error_type
- */
- S2N_API extern int s2n_error_get_type(int error);
- /**
- * An opaque configuration object, used by clients and servers for holding cryptographic certificates, keys and preferences.
- */
- struct s2n_config;
- /**
- * An opaque connection. Used to track each s2n connection.
- */
- struct s2n_connection;
- /**
- * Prevents S2N from calling `OPENSSL_init_crypto`/`OPENSSL_cleanup`/`EVP_cleanup` on OpenSSL versions
- * prior to 1.1.x. This allows applications or languages that also init OpenSSL to interoperate
- * with S2N.
- *
- * @warning This function must be called BEFORE s2n_init() to have any effect. It will return an error
- * if s2n is already initialized.
- *
- * @note If you disable this and are using a version of OpenSSL/libcrypto < 1.1.x, you will
- * be responsible for library init and cleanup (specifically `OPENSSL_add_all_algorithms()`
- * or `OPENSSL_init_crypto()`, and EVP_* APIs will not be usable unless the library is initialized.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_crypto_disable_init(void);
- /**
- * Prevents S2N from installing an atexit handler, which allows safe shutdown of S2N from within a
- * re-entrant shared library
- *
- * @warning This function must be called BEFORE s2n_init() to have any effect. It will return an error
- * if s2n is already initialized.
- *
- * @note This will cause `s2n_cleanup` to do complete cleanup of s2n-tls when called from the main
- * thread (the thread `s2n_init` was called from).
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_disable_atexit(void);
- /**
- * Fetches the OpenSSL version s2n-tls was compiled with. This can be used by applications to validate at runtime
- * that the versions of s2n-tls and Openssl that they have loaded are correct.
- *
- * @returns the version number of OpenSSL that s2n-tls was compiled with
- */
- S2N_API extern unsigned long s2n_get_openssl_version(void);
- /**
- * Initializes the s2n-tls library and should be called once in your application, before any other s2n-tls
- * functions are called. Failure to call s2n_init() will result in errors from other s2n-tls functions.
- *
- * @warning This function is not thread safe and should only be called once.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_init(void);
- /**
- * Cleans up any internal resources used by s2n-tls. This function should be called from each thread or process
- * that is created subsequent to calling `s2n_init` when that thread or process is done calling other s2n-tls functions.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cleanup(void);
- /**
- * Creates a new s2n_config object. This object can (and should) be associated with many connection
- * objects.
- *
- * The returned config will be initialized with default system certificates in its trust store.
- *
- * The returned config should be freed with `s2n_config_free()` after it's no longer in use by any
- * connection.
- *
- * @returns A new configuration object suitable for configuring connections and associating certs
- * and keys.
- */
- S2N_API extern struct s2n_config *s2n_config_new(void);
- /**
- * Creates a new s2n_config object with minimal default options.
- *
- * This function has better performance than `s2n_config_new()` because it does not load default
- * system certificates into the trust store by default. To add system certificates to this config,
- * call `s2n_config_load_system_certs()`.
- *
- * The returned config should be freed with `s2n_config_free()` after it's no longer in use by any
- * connection.
- *
- * @returns A new configuration object suitable for configuring connections and associating certs
- * and keys.
- */
- S2N_API extern struct s2n_config *s2n_config_new_minimal(void);
- /**
- * Frees the memory associated with an `s2n_config` object.
- *
- * @param config The configuration object being freed
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_free(struct s2n_config *config);
- /**
- * Frees the DH params associated with an `s2n_config` object.
- *
- * @param config The configuration object with DH params being freed
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_free_dhparams(struct s2n_config *config);
- /**
- * Frees the certificate chain and key associated with an `s2n_config` object.
- *
- * @param config The configuration object with DH params being freed
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_free_cert_chain_and_key(struct s2n_config *config);
- /**
- * Callback function type used to get the system time.
- *
- * @param void* A pointer to arbitrary data for use within the callback
- * @param uint64_t* A pointer that the callback will set to the time in nanoseconds
- * The function should return 0 on success and -1 on failure.
- */
- typedef int (*s2n_clock_time_nanoseconds)(void *, uint64_t *);
- /**
- * Cache callback function that allows the caller to retrieve SSL session data
- * from a cache.
- *
- * The callback function takes six arguments:
- * a pointer to the s2n_connection object,
- * a pointer to arbitrary data for use within the callback,
- * a pointer to a key which can be used to retrieve the cached entry,
- * a 64 bit unsigned integer specifying the size of this key,
- * a pointer to a memory location where the value should be stored,
- * and a pointer to a 64 bit unsigned integer specifying the size of this value.
- *
- * Initially *value_size will be set to the amount of space allocated for the value,
- * the callback should set *value_size to the actual size of the data returned.
- * If there is insufficient space, -1 should be returned.
- * If the cache is not ready to provide data for the request,
- * S2N_CALLBACK_BLOCKED should be returned.
- *
- * This will cause s2n_negotiate() to return S2N_BLOCKED_ON_APPLICATION_INPUT.
- */
- typedef int (*s2n_cache_retrieve_callback)(struct s2n_connection *conn, void *, const void *key, uint64_t key_size, void *value, uint64_t *value_size);
- /**
- * Cache callback function that allows the caller to store SSL session data in a
- * cache.
- *
- * The callback function takes seven arguments:
- * a pointer to the s2n_connection object,
- * a pointer to arbitrary data for use within the callback,
- * a 64-bit unsigned integer specifying the number of seconds the session data may be stored for,
- * a pointer to a key which can be used to retrieve the cached entry,
- * a 64 bit unsigned integer specifying the size of this key,
- * a pointer to a value which should be stored,
- * and a 64 bit unsigned integer specified the size of this value.
- */
- typedef int (*s2n_cache_store_callback)(struct s2n_connection *conn, void *, uint64_t ttl_in_seconds, const void *key, uint64_t key_size, const void *value, uint64_t value_size);
- /**
- * Cache callback function that allows the caller to set a callback function
- * that will be used to delete SSL session data from a cache.
- *
- * The callback function takes four arguments:
- * a pointer to s2n_connection object,
- * a pointer to arbitrary data for use within the callback,
- * a pointer to a key which can be used to delete the cached entry,
- * and a 64 bit unsigned integer specifying the size of this key.
- */
- typedef int (*s2n_cache_delete_callback)(struct s2n_connection *conn, void *, const void *key, uint64_t key_size);
- /**
- * Allows the caller to set a callback function that will be used to get the
- * system time. The time returned should be the number of nanoseconds since the
- * Unix epoch (Midnight, January 1st, 1970).
- *
- * s2n-tls uses this clock for timestamps.
- *
- * @param config The configuration object being updated
- * @param clock_fn The wall clock time callback function
- * @param ctx An opaque pointer that the callback will be invoked with
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_wall_clock(struct s2n_config *config, s2n_clock_time_nanoseconds clock_fn, void *ctx);
- /**
- * Allows the caller to set a callback function that will be used to get
- * monotonic time. The monotonic time is the time since an arbitrary, unspecified
- * point. Unlike wall clock time, it MUST never move backwards.
- *
- * s2n-tls uses this clock for timers.
- *
- * @param config The configuration object being updated
- * @param clock_fn The monotonic time callback function
- * @param ctx An opaque pointer that the callback will be invoked with
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_monotonic_clock(struct s2n_config *config, s2n_clock_time_nanoseconds clock_fn, void *ctx);
- /**
- * Translates an s2n_error code to a human readable string explaining the error.
- *
- * @param error The error code to explain. Usually this is s2n_errno
- * @param lang The language to explain the error code. Pass "EN" or NULL for English.
- * @returns The error string
- */
- S2N_API extern const char *s2n_strerror(int error, const char *lang);
- /**
- * Translates an s2n_error code to a human readable string containing internal debug
- * information, including file name and line number. This function is useful when
- * reporting issues to the s2n-tls development team.
- *
- * @param error The error code to explain. Usually this is s2n_errno
- * @param lang The language to explain the error code. Pass "EN" or NULL for English.
- * @returns The error string
- */
- S2N_API extern const char *s2n_strerror_debug(int error, const char *lang);
- /**
- * Translates an s2n_error code to a human readable string.
- *
- * @param error The error code to explain. Usually this is s2n_errno
- * @returns The error string
- */
- S2N_API extern const char *s2n_strerror_name(int error);
- /**
- * Translates an s2n_error code to a filename and line number.
- *
- * @param error The error code to explain. Usually this is s2n_errno.
- * @returns The error string.
- */
- S2N_API extern const char *s2n_strerror_source(int error);
- /**
- * Opaque stack trace structure.
- */
- struct s2n_stacktrace;
- /**
- * Checks if s2n stack trace captures are enabled.
- *
- * @returns True if stack traces are enabled. False if they are disabled.
- */
- S2N_API extern bool s2n_stack_traces_enabled(void);
- /**
- * Configures the s2n stack trace captures option.
- *
- * @param newval Boolean to determine if stack traces should be enabled. True to enable them. False to disable them.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_stack_traces_enabled_set(bool newval);
- /**
- * Calculates the s2n stack trace.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_calculate_stacktrace(void);
- /**
- * Prints the s2n stack trace to a file. The file descriptor is expected to be
- * open and ready for writing.
- *
- * @param fptr A pointer to the file s2n-tls should write the stack trace to.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_print_stacktrace(FILE *fptr);
- /**
- * Clean up the memory used to contain the stack trace.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_free_stacktrace(void);
- /**
- * Export the s2n_stacktrace.
- *
- * @param trace A pointer to the s2n_stacktrace to fill.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_get_stacktrace(struct s2n_stacktrace *trace);
- /**
- * Allows the caller to set a callback function that will be used to store SSL
- * session data in a cache.
- *
- * @param config The configuration object being updated
- * @param cache_store_callback The cache store callback function.
- * @param data An opaque context pointer that the callback will be invoked with.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_cache_store_callback(struct s2n_config *config, s2n_cache_store_callback cache_store_callback, void *data);
- /**
- * Allows the caller to set a callback function that will be used to retrieve SSL
- * session data from a cache.
- *
- * @param config The configuration object being updated
- * @param cache_retrieve_callback The cache retrieve callback function.
- * @param data An opaque context pointer that the callback will be invoked with.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_cache_retrieve_callback(struct s2n_config *config, s2n_cache_retrieve_callback cache_retrieve_callback, void *data);
- /**
- * Allows the caller to set a callback function that will be used to delete SSL
- * session data from a cache.
- *
- * @param config The configuration object being updated
- * @param cache_delete_callback The cache delete callback function.
- * @param data An opaque context pointer that the callback will be invoked with.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_cache_delete_callback(struct s2n_config *config, s2n_cache_delete_callback cache_delete_callback, void *data);
- /**
- * Called when `s2n_init` is executed.
- */
- typedef int (*s2n_mem_init_callback)(void);
- /**
- * Will be called when `s2n_cleanup` is executed.
- */
- typedef int (*s2n_mem_cleanup_callback)(void);
- /**
- * A function that can allocate at least `requested` bytes of memory.
- *
- * It stores the location of that memory in **\*ptr** and the size of the allocated
- * data in **\*allocated**. The function may choose to allocate more memory
- * than was requested. s2n-tls will consider all allocated memory available for
- * use, and will attempt to free all allocated memory when able.
- */
- typedef int (*s2n_mem_malloc_callback)(void **ptr, uint32_t requested, uint32_t *allocated);
- /**
- * Frees memory allocated by s2n_mem_malloc_callback.
- */
- typedef int (*s2n_mem_free_callback)(void *ptr, uint32_t size);
- /**
- * Allows the caller to override s2n-tls's internal memory handling functions.
- *
- * @warning This function must be called before s2n_init().
- *
- * @param mem_init_callback The s2n_mem_init_callback
- * @param mem_cleanup_callback The s2n_mem_cleanup_callback
- * @param mem_malloc_callback The s2n_mem_malloc_callback
- * @param mem_free_callback The s2n_mem_free_callback
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_mem_set_callbacks(s2n_mem_init_callback mem_init_callback, s2n_mem_cleanup_callback mem_cleanup_callback,
- s2n_mem_malloc_callback mem_malloc_callback, s2n_mem_free_callback mem_free_callback);
- /**
- * A callback function that will be called when s2n-tls is initialized.
- */
- typedef int (*s2n_rand_init_callback)(void);
- /**
- * A callback function that will be called when `s2n_cleanup` is executed.
- */
- typedef int (*s2n_rand_cleanup_callback)(void);
- /**
- * A callback function that will be used to provide entropy to the s2n-tls
- * random number generators.
- */
- typedef int (*s2n_rand_seed_callback)(void *data, uint32_t size);
- /**
- * A callback function that will be used to mix in entropy every time the RNG
- * is invoked.
- */
- typedef int (*s2n_rand_mix_callback)(void *data, uint32_t size);
- /**
- * Allows the caller to override s2n-tls's entropy functions.
- *
- * @warning This function must be called before s2n_init().
- *
- * @note The overriden random callbacks will not be used when s2n-tls is operating in FIPS mode.
- *
- * @param rand_init_callback The s2n_rand_init_callback
- * @param rand_cleanup_callback The s2n_rand_cleanup_callback
- * @param rand_seed_callback The s2n_rand_seed_callback
- * @param rand_mix_callback The s2n_rand_mix_callback
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_rand_set_callbacks(s2n_rand_init_callback rand_init_callback, s2n_rand_cleanup_callback rand_cleanup_callback,
- s2n_rand_seed_callback rand_seed_callback, s2n_rand_mix_callback rand_mix_callback);
- /**
- * TLS extensions supported by s2n-tls
- */
- typedef enum {
- S2N_EXTENSION_SERVER_NAME = 0,
- S2N_EXTENSION_MAX_FRAG_LEN = 1,
- S2N_EXTENSION_OCSP_STAPLING = 5,
- S2N_EXTENSION_SUPPORTED_GROUPS = 10,
- S2N_EXTENSION_EC_POINT_FORMATS = 11,
- S2N_EXTENSION_SIGNATURE_ALGORITHMS = 13,
- S2N_EXTENSION_ALPN = 16,
- S2N_EXTENSION_CERTIFICATE_TRANSPARENCY = 18,
- S2N_EXTENSION_SUPPORTED_VERSIONS = 43,
- S2N_EXTENSION_RENEGOTIATION_INFO = 65281,
- } s2n_tls_extension_type;
- /**
- * MFL configurations from https://datatracker.ietf.org/doc/html/rfc6066#section-4.
- */
- typedef enum {
- S2N_TLS_MAX_FRAG_LEN_512 = 1,
- S2N_TLS_MAX_FRAG_LEN_1024 = 2,
- S2N_TLS_MAX_FRAG_LEN_2048 = 3,
- S2N_TLS_MAX_FRAG_LEN_4096 = 4,
- } s2n_max_frag_len;
- /**
- * Opaque certificate type.
- */
- struct s2n_cert;
- /**
- * Opaque certificate chain and key type.
- */
- struct s2n_cert_chain_and_key;
- /**
- * Opaque key type.
- */
- struct s2n_pkey;
- /**
- * Opaque public key type.
- */
- typedef struct s2n_pkey s2n_cert_public_key;
- /**
- * Opaque private key type.
- */
- typedef struct s2n_pkey s2n_cert_private_key;
- /**
- * Creates a new s2n_cert_chain_and_key object. This object can be associated
- * with many config objects. It is used to represent a certificate and key pair.
- *
- * @returns A new object used to represent a certificate-chain/key pair
- */
- S2N_API extern struct s2n_cert_chain_and_key *s2n_cert_chain_and_key_new(void);
- /**
- * Associates a certificate chain and private key with an `s2n_cert_chain_and_key` object.
- *
- * `cert_chain_pem` should be a PEM encoded certificate chain, with the first
- * certificate in the chain being your leaf certificate. `private_key_pem`
- * should be a PEM encoded private key corresponding to the leaf certificate.
- *
- * @note Prefer using s2n_cert_chain_and_key_load_pem_bytes.
- *
- * @param chain_and_key The certificate chain and private key handle
- * @param chain_pem A byte array of a PEM encoded certificate chain.
- * @param private_key_pem A byte array of a PEM encoded key.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_load_pem(struct s2n_cert_chain_and_key *chain_and_key, const char *chain_pem, const char *private_key_pem);
- /**
- * Associates a certificate chain and private key with an `s2n_cert_chain_and_key` object.
- *
- * `cert_chain_pem` should be a PEM encoded certificate chain, with the first
- * certificate in the chain being your leaf certificate. `private_key_pem`
- * should be a PEM encoded private key corresponding to the leaf certificate.
- *
- * @param chain_and_key The certificate chain and private key handle
- * @param chain_pem A byte array of a PEM encoded certificate chain.
- * @param chain_pem_len Size of `chain_pem`
- * @param private_key_pem A byte array of a PEM encoded key.
- * @param private_key_pem_len Size of `private_key_pem`
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_load_pem_bytes(struct s2n_cert_chain_and_key *chain_and_key, uint8_t *chain_pem, uint32_t chain_pem_len, uint8_t *private_key_pem, uint32_t private_key_pem_len);
- /**
- * Associates a public certificate chain with a `s2n_cert_chain_and_key` object. It does
- * NOT set a private key, so the connection will need to be configured to
- * [offload private key operations](https://github.com/aws/s2n-tls/blob/main/docs/USAGE-GUIDE.md#offloading-asynchronous-private-key-operations).
- *
- * @param chain_and_key The certificate chain and private key handle
- * @param chain_pem A byte array of a PEM encoded certificate chain.
- * @param chain_pem_len Size of `chain_pem`
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_load_public_pem_bytes(struct s2n_cert_chain_and_key *chain_and_key, uint8_t *chain_pem, uint32_t chain_pem_len);
- /**
- * Frees the memory associated with an `s2n_cert_chain_and_key` object.
- *
- * @param cert_and_key The certificate chain and private key handle
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_free(struct s2n_cert_chain_and_key *cert_and_key);
- /**
- * Adds a context to the `s2n_cert_chain_and_key` object.
- *
- * @param cert_and_key The certificate chain and private key handle
- * @param ctx An opaque pointer to user supplied data.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_set_ctx(struct s2n_cert_chain_and_key *cert_and_key, void *ctx);
- /**
- * Get the user supplied context from the `s2n_cert_chain_and_key` object.
- *
- * @param cert_and_key The certificate chain and private key handle
- * @returns The user supplied pointer from s2n_cert_chain_and_key_set_ctx()
- */
- S2N_API extern void *s2n_cert_chain_and_key_get_ctx(struct s2n_cert_chain_and_key *cert_and_key);
- /**
- * Get the private key from the `s2n_cert_chain_and_key` object.
- *
- * @param cert_and_key The certificate chain and private key handle
- * @returns A pointer to the `s2n_cert_private_key`
- */
- S2N_API extern s2n_cert_private_key *s2n_cert_chain_and_key_get_private_key(struct s2n_cert_chain_and_key *cert_and_key);
- /**
- * Set the raw OCSP stapling data for a certificate chain.
- *
- * @param chain_and_key The certificate chain handle
- * @param data A pointer to the raw OCSP stapling data bytes. The data will be copied.
- * @param length The length of the data bytes.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_set_ocsp_data(struct s2n_cert_chain_and_key *chain_and_key, const uint8_t *data, uint32_t length);
- /**
- * Set the signed certificate timestamp (SCT) for a certificate chain.
- * This is used for Certificate Transparency.
- *
- * @param chain_and_key The certificate chain handle
- * @param data A pointer to the SCT data. The data will be copied.
- * @param length The length of the data bytes.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_cert_chain_and_key_set_sct_list(struct s2n_cert_chain_and_key *chain_and_key, const uint8_t *data, uint32_t length);
- /**
- * A callback function that is invoked if s2n-tls cannot resolve a conflict between
- * two certificates with the same domain name. This function is invoked while certificates
- * are added to an `s2n_config`.
- *
- * Currently, the only builtin resolution for domain name conflicts is certificate type(RSA,
- * ECDSA, etc). The callback should return a pointer to the `s2n_cert_chain_and_key` that
- * should be used for dns name `name`.
- *
- * If NULL is returned, the first certificate will be used. Typically an application
- * will use properties like trust and expiry to implement tiebreaking.
- */
- typedef struct s2n_cert_chain_and_key *(*s2n_cert_tiebreak_callback)(struct s2n_cert_chain_and_key *cert1, struct s2n_cert_chain_and_key *cert2, uint8_t *name, uint32_t name_len);
- /**
- * Sets the `s2n_cert_tiebreak_callback` for resolving domain name conflicts.
- * If no callback is set, the first certificate added for a domain name will always be preferred.
- *
- * @param config The configuration object being updated
- * @param cert_tiebreak_cb The pointer to the certificate tiebreak function
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_cert_tiebreak_callback(struct s2n_config *config, s2n_cert_tiebreak_callback cert_tiebreak_cb);
- /**
- * Associates a certificate chain and private key with an `s2n_config` object.
- * Using this API, only one cert chain of each type (like ECDSA or RSA) may be associated with a config.
- * `cert_chain_pem` should be a PEM encoded certificate chain, with the first certificate
- * in the chain being your server's certificate. `private_key_pem` should be a
- * PEM encoded private key corresponding to the server certificate.
- *
- * @deprecated Use s2n_config_add_cert_chain_and_key_to_store instead.
- *
- * @param config The configuration object being updated
- * @param cert_chain_pem A byte array of a PEM encoded certificate chain.
- * @param private_key_pem A byte array of a PEM encoded key.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure.
- */
- S2N_API extern int s2n_config_add_cert_chain_and_key(struct s2n_config *config, const char *cert_chain_pem, const char *private_key_pem);
- /**
- * The preferred method of associating a certificate chain and private key pair with an `s2n_config` object.
- * This method may be called multiple times to support multiple key types(RSA, ECDSA) and multiple domains.
- * On the server side, the certificate selected will be based on the incoming SNI value and the
- * client's capabilities(supported ciphers).
- *
- * In the case of no certificate matching the client's SNI extension or if no SNI extension was sent by
- * the client, the certificate from the `first` call to `s2n_config_add_cert_chain_and_key_to_store`
- * will be selected.
- *
- * @warning It is not recommended to free or modify the `cert_key_pair` as any subsequent changes will be
- * reflected in the config.
- *
- * @param config The configuration object being updated
- * @param cert_key_pair The certificate chain and private key handle
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_add_cert_chain_and_key_to_store(struct s2n_config *config, struct s2n_cert_chain_and_key *cert_key_pair);
- /**
- * Explicitly sets certificate chain and private key pairs to be used as defaults for each auth
- * method (key type). A "default" certificate is used when there is not an SNI match with any other
- * configured certificate.
- *
- * Only one certificate can be set as the default per auth method (one RSA default, one ECDSA default,
- * etc.). All previous default certificates will be cleared and re-set when this API is called.
- *
- * This API is called for a specific `s2n_config` object. s2n-tls will attempt to automatically choose
- * default certificates for each auth method (key type) based on the order that `s2n_cert_chain_and_key`
- * are added to the `s2n_config` using one of the APIs listed above.
- * `s2n_config_set_cert_chain_and_key_defaults` can be called at any time; s2n-tls will clear defaults
- * and no longer attempt to automatically choose any default certificates.
- *
- * @param config The configuration object being updated
- * @param cert_key_pairs An array of certificate chain and private key handles
- * @param num_cert_key_pairs The amount of handles in cert_key_pairs
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_cert_chain_and_key_defaults(struct s2n_config *config,
- struct s2n_cert_chain_and_key **cert_key_pairs, uint32_t num_cert_key_pairs);
- /**
- * Adds to the trust store from a CA file or directory containing trusted certificates.
- *
- * When configs are created with `s2n_config_new()`, the trust store is initialized with default
- * system certificates. To completely override these certificates, call
- * `s2n_config_wipe_trust_store()` before calling this function.
- *
- * @note The trust store will be initialized with the common locations for the host
- * operating system by default.
- * @param config The configuration object being updated
- * @param ca_pem_filename A string for the file path of the CA PEM file.
- * @param ca_dir A string for the directory of the CA PEM files.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_verification_ca_location(struct s2n_config *config, const char *ca_pem_filename, const char *ca_dir);
- /**
- * Adds a PEM to the trust store. This will allocate memory, and load `pem` into the trust store.
- *
- * When configs are created with `s2n_config_new()`, the trust store is initialized with default
- * system certificates. To completely override these certificates, call
- * `s2n_config_wipe_trust_store()` before calling this function.
- *
- * @param config The configuration object being updated
- * @param pem The string value of the PEM certificate.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_add_pem_to_trust_store(struct s2n_config *config, const char *pem);
- /**
- * Clears the trust store of all certificates.
- *
- * When configs are created with `s2n_config_new()`, the trust store is initialized with default
- * system certificates. To completely override these certificates, call this function before
- * functions like `s2n_config_set_verification_ca_location()` or
- * `s2n_config_add_pem_to_trust_store()`.
- *
- * @param config The configuration object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_wipe_trust_store(struct s2n_config *config);
- /**
- * Loads default system certificates into the trust store.
- *
- * `s2n_config_new_minimal()` doesn't load default system certificates into the config's trust
- * store by default. If `config` was created with `s2n_config_new_minimal`, this function can be
- * used to load system certificates into the trust store.
- *
- * @note This API will error if called on a config that has already loaded system certificates
- * into its trust store, which includes all configs created with `s2n_config_new()`.
- *
- * @param config The configuration object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_load_system_certs(struct s2n_config *config);
- typedef enum {
- S2N_VERIFY_AFTER_SIGN_DISABLED,
- S2N_VERIFY_AFTER_SIGN_ENABLED
- } s2n_verify_after_sign;
- /**
- * Toggle whether generated signatures are verified before being sent.
- *
- * Although signatures produced by the underlying libcrypto should always be valid,
- * hardware faults, bugs in the signing implementation, or other uncommon factors
- * can cause unexpected mistakes in the final signatures. Because these mistakes
- * can leak information about the private key, applications with low trust in their
- * hardware or libcrypto may want to verify signatures before sending them.
- *
- * However, this feature will significantly impact handshake latency.
- * Additionally, most libcrypto implementations already check for common errors in signatures.
- */
- S2N_API extern int s2n_config_set_verify_after_sign(struct s2n_config *config, s2n_verify_after_sign mode);
- /**
- * Set a custom send buffer size.
- *
- * This buffer is used to stage records for sending. By default,
- * enough memory is allocated to hold a single record of the maximum
- * size configured for the connection. With the default fragment size,
- * that is about 8K bytes.
- *
- * Less memory can be allocated for the send buffer, but this will result in
- * smaller, more fragmented records and increased overhead. While the absolute
- * minimum size required is 1034 bytes, at least 2K bytes is recommended for
- * reasonable record sizes.
- *
- * More memory can be allocated for the send buffer. This will result in s2n-tls
- * buffering multiple records before sending them, reducing system write calls.
- * At least 17K bytes is recommended for this use case, or at least 35K bytes
- * if larger fragment sizes are used via `s2n_connection_prefer_throughput()`.
- *
- * @param config The configuration object being updated
- * @param size The desired custom buffer size.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_send_buffer_size(struct s2n_config *config, uint32_t size);
- /**
- * Enable or disable receiving of multiple TLS records in a single s2n_recv call
- *
- * By default, s2n-tls returns from s2n_recv() after reading a single TLS record.
- * Enabling receiving of multiple records will instead cause s2n_recv() to attempt
- * to read until the application-provided output buffer is full. This may be more
- * efficient, especially if larger receive buffers are used.
- *
- * @note If this option is enabled with blocking IO, the call to s2n_recv() will
- * not return until either the application-provided output buffer is full or the
- * peer closes the connection. This may lead to unintentionally long waits if the
- * peer does not send enough data.
- *
- * @param config The configuration object being updated
- * @param enabled Set to `true` if multiple record receive is to be enabled; `false` to disable.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_recv_multi_record(struct s2n_config *config, bool enabled);
- /**
- * A callback function invoked (usually multiple times) during X.509 validation for each
- * name encountered in the leaf certificate.
- *
- * Return 1 to trust that hostname or 0 to not trust the hostname.
- *
- * If this function returns 1, then the certificate is considered trusted and that portion
- * of the X.509 validation will succeed.
- *
- * If no hostname results in a 1 being returned, the certificate will be untrusted and the
- * validation will terminate immediately.
- *
- * Data is a opaque user context set in s2n_config_set_verify_host_callback() or s2n_connection_set_verify_host_callback().
- */
- typedef uint8_t (*s2n_verify_host_fn)(const char *host_name, size_t host_name_len, void *data);
- /**
- * Sets the callback to use for verifying that a hostname from an X.509 certificate is trusted.
- *
- * The default behavior is to require that the hostname match the server name set with s2n_set_server_name().
- * This will likely lead to all client certificates being rejected, so the callback will need to be overriden when using
- * client authentication.
- *
- * This change will be inherited by s2n_connections using this config. If a separate callback for different connections
- * using the same config is desired, see s2n_connection_set_verify_host_callback().
- *
- * @param config The configuration object being updated
- * @param data A user supplied opaque context to pass back to the callback
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_verify_host_callback(struct s2n_config *config, s2n_verify_host_fn, void *data);
- /**
- * Toggles whether or not to validate stapled OCSP responses.
- *
- * 1 means OCSP responses will be validated when they are encountered, while 0 means this step will
- * be skipped.
- *
- * The default value is 1 if the underlying libCrypto implementation supports OCSP.
- *
- * @param config The configuration object being updated
- * @param check_ocsp The desired OCSP response check configuration
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_check_stapled_ocsp_response(struct s2n_config *config, uint8_t check_ocsp);
- /**
- * Disables timestamp validation for received certificates.
- *
- * By default, s2n-tls checks the notBefore and notAfter fields on the certificates it receives
- * during the handshake. If the current date is not within the range of these fields for any
- * certificate in the chain of trust, `s2n_negotiate()` will error. This validation is in
- * accordance with RFC 5280, section 6.1.3 a.2:
- * https://datatracker.ietf.org/doc/html/rfc5280#section-6.1.3.
- *
- * This API will disable this timestamp validation, permitting negotiation with peers that send
- * expired certificates, or certificates that are not yet considered valid.
- *
- * @warning Applications calling this API should seriously consider the security implications of
- * disabling this validation. The validity period of a certificate corresponds to the range of time
- * in which the CA is guaranteed to maintain information regarding the certificate's revocation
- * status. As such, it may not be possible to obtain accurate revocation information for
- * certificates with invalid timestamps. Applications disabling this validation MUST implement
- * some external method for limiting certificate lifetime.
- *
- * @param config The associated connection config.
- * @returns S2N_SUCCESS on success, S2N_FAILURE on failure.
- */
- S2N_API extern int s2n_config_disable_x509_time_verification(struct s2n_config *config);
- /**
- * Turns off all X.509 validation during the negotiation phase of the connection. This should only
- * be used for testing or debugging purposes.
- *
- * @param config The configuration object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_disable_x509_verification(struct s2n_config *config);
- /**
- * Sets the maximum allowed depth of a cert chain used for X509 validation. The default value is
- * 7. If this limit is exceeded, validation will fail if s2n_config_disable_x509_verification()
- * has not been called. 0 is an illegal value and will return an error.
- * 1 means only a root certificate will be used.
- *
- * @param config The configuration object being updated
- * @param max_depth The number of allowed certificates in the certificate chain
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_max_cert_chain_depth(struct s2n_config *config, uint16_t max_depth);
- /**
- * Associates a set of Diffie-Hellman parameters with an `s2n_config` object.
- * @note `dhparams_pem` should be PEM encoded DH parameters.
- *
- * @param config The configuration object being updated
- * @param dhparams_pem A string containing the PEM encoded DH parameters.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_add_dhparams(struct s2n_config *config, const char *dhparams_pem);
- /**
- * Sets the security policy that includes the cipher/kem/signature/ecc preferences and
- * protocol version.
- *
- * See the [USAGE-GUIDE.md](https://github.com/aws/s2n-tls/blob/main/docs/USAGE-GUIDE.md) for how to use security policies.
- */
- S2N_API extern int s2n_config_set_cipher_preferences(struct s2n_config *config, const char *version);
- /**
- * Appends the provided application protocol to the preference list
- *
- * The data provided in `protocol` parameter will be copied into an internal buffer
- *
- * @param config The configuration object being updated
- * @param protocol A pointer to a byte array value
- * @param protocol_len The length of bytes that should be read from `protocol`. Note: this value cannot be 0, otherwise an error will be returned.
- */
- S2N_API extern int s2n_config_append_protocol_preference(struct s2n_config *config, const uint8_t *protocol, uint8_t protocol_len);
- /**
- * Sets the application protocol preferences on an `s2n_config` object.
- * `protocols` is a list in order of preference, with most preferred protocol first, and of
- * length `protocol_count`.
- *
- * When acting as an `S2N_CLIENT` the protocol list is included in the Client Hello message
- * as the ALPN extension.
- *
- * As an `S2N_SERVER`, the list is used to negotiate a mutual application protocol with the
- * client. After the negotiation for the connection has completed, the agreed upon protocol
- * can be retrieved with s2n_get_application_protocol()
- *
- * @param config The configuration object being updated
- * @param protocols The list of preferred protocols, in order of preference
- * @param protocol_count The size of the protocols list
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_protocol_preferences(struct s2n_config *config, const char *const *protocols, int protocol_count);
- /**
- * Enum used to define the type, if any, of certificate status request
- * a connection should make during the handshake. The only supported status request type is
- * OCSP, `S2N_STATUS_REQUEST_OCSP`.
- */
- typedef enum {
- S2N_STATUS_REQUEST_NONE = 0,
- S2N_STATUS_REQUEST_OCSP = 1
- } s2n_status_request_type;
- /**
- * Sets up a connection to request the certificate status of a peer during an SSL handshake. If set
- * to S2N_STATUS_REQUEST_NONE, no status request is made.
- *
- * @param config The configuration object being updated
- * @param type The desired request status type
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_status_request_type(struct s2n_config *config, s2n_status_request_type type);
- /**
- * Enum to set Certificate Transparency Support level.
- */
- typedef enum {
- S2N_CT_SUPPORT_NONE = 0,
- S2N_CT_SUPPORT_REQUEST = 1
- } s2n_ct_support_level;
- /**
- * Set the Certificate Transparency Support level.
- *
- * @param config The configuration object being updated
- * @param level The desired Certificate Transparency Support configuration
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_ct_support_level(struct s2n_config *config, s2n_ct_support_level level);
- /**
- * Sets whether or not a connection should terminate on receiving a WARNING alert from its peer.
- *
- * `alert_behavior` can take the following values:
- * - `S2N_ALERT_FAIL_ON_WARNINGS` default behavior: s2n-tls will terminate the connection if its peer sends a WARNING alert.
- * - `S2N_ALERT_IGNORE_WARNINGS` - with the exception of `close_notify` s2n-tls will ignore all WARNING alerts and keep communicating with its peer. This setting is ignored in TLS1.3
- *
- * @note TLS1.3 terminates a connection for all alerts except user_canceled.
- * @warning S2N_ALERT_FAIL_ON_WARNINGS is the recommended behavior. Past TLS protocol vulnerabilities have involved downgrading alerts to warnings.
- */
- typedef enum {
- S2N_ALERT_FAIL_ON_WARNINGS = 0,
- S2N_ALERT_IGNORE_WARNINGS = 1
- } s2n_alert_behavior;
- /**
- * Sets the config's alert behavior based on the `s2n_alert_behavior` enum.
- *
- * @param config The configuration object being updated
- * @param alert_behavior The desired alert behavior.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_alert_behavior(struct s2n_config *config, s2n_alert_behavior alert_behavior);
- /**
- * Sets the extension data in the `s2n_config` object for the specified extension.
- * This method will clear any existing data that is set. If the data and length
- * parameters are set to NULL, no new data is set in the `s2n_config` object,
- * effectively clearing existing data.
- *
- * @deprecated Use s2n_cert_chain_and_key_set_ocsp_data and s2n_cert_chain_and_key_set_sct_list instead.
- *
- * @param config The configuration object being updated
- * @param type The extension type
- * @param data Data for the extension
- * @param length Length of the `data` buffer
- */
- S2N_API extern int s2n_config_set_extension_data(struct s2n_config *config, s2n_tls_extension_type type, const uint8_t *data, uint32_t length);
- /**
- * Allows the caller to set a TLS Maximum Fragment Length extension that will be used
- * to fragment outgoing messages. s2n-tls currently does not reject fragments larger
- * than the configured maximum when in server mode. The TLS negotiated maximum fragment
- * length overrides the preference set by the `s2n_connection_prefer_throughput` and
- * `s2n_connection_prefer_low_latency`.
- *
- * @note Some TLS implementations do not respect their peer's max fragment length extension.
- *
- * @param config The configuration object being updated
- * @param mfl_code The selected MFL size
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_send_max_fragment_length(struct s2n_config *config, s2n_max_frag_len mfl_code);
- /**
- * Allows the server to opt-in to accept client's TLS maximum fragment length extension
- * requests. If this API is not called, and client requests the extension, server will ignore
- * the request and continue TLS handshake with default maximum fragment length of 8k bytes
- *
- * @note Some TLS implementations do not respect their peer's max fragment length extension.
- *
- * @param config The configuration object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_accept_max_fragment_length(struct s2n_config *config);
- /**
- * Sets the lifetime of the cached session state. The default value is 15 hours.
- *
- * @param config The configuration object being updated
- * @param lifetime_in_secs The desired lifetime of the session state in seconds
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_session_state_lifetime(struct s2n_config *config, uint64_t lifetime_in_secs);
- /**
- * Enable or disable session resumption using session ticket.
- *
- * @param config The configuration object being updated
- * @param enabled The configuration object being updated. Set to 1 to enable. Set to 0 to disable.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_session_tickets_onoff(struct s2n_config *config, uint8_t enabled);
- /**
- * Enable or disable session caching.
- *
- * @note Session caching will not be turned on unless all three session cache callbacks are set
- * prior to calling this function.
- *
- * @param config The configuration object being updated
- * @param enabled The configuration object being updated. Set to 1 to enable. Set to 0 to disable.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_session_cache_onoff(struct s2n_config *config, uint8_t enabled);
- /**
- * Sets how long a session ticket key will be in a state where it can be used for both encryption
- * and decryption of tickets on the server side.
- *
- * @note The default value is 2 hours.
- * @param config The configuration object being updated
- * @param lifetime_in_secs The desired lifetime of decrypting and encrypting tickets in seconds
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_ticket_encrypt_decrypt_key_lifetime(struct s2n_config *config, uint64_t lifetime_in_secs);
- /**
- * Sets how long a session ticket key will be in a state where it can used just for decryption of
- * already assigned tickets on the server side. Once decrypted, the session will resume and the
- * server will issue a new session ticket encrypted using a key in encrypt-decrypt state.
- *
- * @note The default value is 13 hours.
- * @param config The configuration object being updated
- * @param lifetime_in_secs The desired lifetime of decrypting and encrypting tickets in seconds
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_ticket_decrypt_key_lifetime(struct s2n_config *config, uint64_t lifetime_in_secs);
- /**
- * Adds session ticket key on the server side. It would be ideal to add new keys after every
- * (encrypt_decrypt_key_lifetime_in_nanos/2) nanos because this will allow for gradual and
- * linear transition of a key from encrypt-decrypt state to decrypt-only state.
- *
- * @param config The configuration object being updated
- * @param name Name of the session ticket key that should be randomly generated to avoid collisions
- * @param name_len Length of session ticket key name
- * @param key Key used to perform encryption/decryption of session ticket
- * @param key_len Length of the session ticket key
- * @param intro_time_in_seconds_from_epoch Time at which the session ticket key is introduced. If this is 0, then intro_time_in_seconds_from_epoch is set to now.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_add_ticket_crypto_key(struct s2n_config *config, const uint8_t *name, uint32_t name_len,
- uint8_t *key, uint32_t key_len, uint64_t intro_time_in_seconds_from_epoch);
- /**
- * Sets user defined context on the `s2n_config` object.
- *
- * @param config The configuration object being updated
- * @param ctx A pointer to the user defined ctx.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_ctx(struct s2n_config *config, void *ctx);
- /**
- * Gets the user defined context from the `s2n_config` object.
- * The context is set by calling s2n_config_set_ctx()
- *
- * @param config The configuration object being accessed
- * @param ctx A pointer to the user defined ctx.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_get_ctx(struct s2n_config *config, void **ctx);
- /**
- * Used to declare connections as server or client type, respectively.
- */
- typedef enum {
- S2N_SERVER,
- S2N_CLIENT
- } s2n_mode;
- /**
- * Creates a new connection object. Each s2n-tls SSL/TLS connection uses
- * one of these objects. These connection objects can be operated on by up
- * to two threads at a time, one sender and one receiver, but neither sending
- * nor receiving are atomic, so if these objects are being called by multiple
- * sender or receiver threads, you must perform your own locking to ensure
- * that only one sender or receiver is active at a time.
- *
- * The `mode` parameters specifies if the caller is a server, or is a client.
- * Connections objects are re-usable across many connections, and should be
- * re-used (to avoid deallocating and allocating memory). You should wipe
- * connections immediately after use.
- *
- * @param mode The desired connection type
- * @returns A s2n_connection handle
- */
- S2N_API extern struct s2n_connection *s2n_connection_new(s2n_mode mode);
- /**
- * Associates a configuration object with a connection.
- *
- * @param conn The connection object being associated
- * @param config The configuration object being associated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_config(struct s2n_connection *conn, struct s2n_config *config);
- /**
- * Sets user defined context in `s2n_connection` object.
- *
- * @param conn The connection object being updated
- * @param ctx A pointer to the user defined context
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_ctx(struct s2n_connection *conn, void *ctx);
- /**
- * Gets user defined context from a `s2n_connection` object.
- *
- * @param conn The connection object that contains the desired context
- */
- S2N_API extern void *s2n_connection_get_ctx(struct s2n_connection *conn);
- /**
- * The callback function takes a s2n-tls connection as input, which receives the ClientHello
- * and the context previously provided in `s2n_config_set_client_hello_cb`. The callback can
- * access any ClientHello information from the connection and use the `s2n_connection_set_config`
- * call to change the config of the connection.
- */
- typedef int s2n_client_hello_fn(struct s2n_connection *conn, void *ctx);
- /**
- * Client Hello callback modes
- * - `S2N_CLIENT_HELLO_CB_BLOCKING` (default):
- * - In this mode s2n-tls expects the callback to complete its work and return the appropriate response code before the handshake continues. If any of the connection properties were changed based on the server_name extension the callback must either return a value greater than 0 or invoke `s2n_connection_server_name_extension_used`, otherwise the callback returns 0 to continue the handshake.
- * - `S2N_CLIENT_HELLO_CB_NONBLOCKING`:
- * - In non-blocking mode, s2n-tls expects the callback to not complete its work. If the callback returns a response code of 0, s2n-tls will return `S2N_FAILURE` with `S2N_ERR_T_BLOCKED` error type and `s2n_blocked_status` set to `S2N_BLOCKED_ON_APPLICATION_INPUT`. The handshake is paused and further calls to `s2n_negotiate` will continue to return the same error until `s2n_client_hello_cb_done` is invoked for the `s2n_connection` to resume the handshake. If any of the connection properties were changed on the basis of the server_name extension then `s2n_connection_server_name_extension_used` must be invoked before marking the callback done.
- */
- typedef enum {
- S2N_CLIENT_HELLO_CB_BLOCKING,
- S2N_CLIENT_HELLO_CB_NONBLOCKING
- } s2n_client_hello_cb_mode;
- /**
- * Allows the caller to set a callback function that will be called after ClientHello was parsed.
- *
- * @param config The configuration object being updated
- * @param client_hello_callback The client hello callback function
- * @param ctx A pointer to a user defined context that the Client Hello callback will be invoked with.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_client_hello_cb(struct s2n_config *config, s2n_client_hello_fn client_hello_callback, void *ctx);
- /**
- * Sets the callback execution mode.
- *
- * See s2n_client_hello_cb_mode for each mode's behavior.
- *
- * @param config The configuration object being updated
- * @param cb_mode The desired callback mode
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_client_hello_cb_mode(struct s2n_config *config, s2n_client_hello_cb_mode cb_mode);
- /**
- * Marks the non-blocking callback as complete. Can be invoked from within the callback when
- * operating in non-blocking mode to continue the handshake.
- *
- * @param conn The connection object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_client_hello_cb_done(struct s2n_connection *conn);
- /**
- * Must be invoked if any of the connection properties were changed on the basis of the server_name
- * extension. This must be invoked before marking the Client Hello callback done.
- *
- * @param conn The connection object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_server_name_extension_used(struct s2n_connection *conn);
- /**
- * Opaque client hello handle
- */
- struct s2n_client_hello;
- /**
- * Get the Client Hello from a s2n_connection.
- *
- * Earliest point during the handshake when this structure is available for use is in the
- * client_hello_callback (see s2n_config_set_client_hello_cb()).
- *
- * @param conn The connection object containing the client hello
- * @returns A handle to the s2n_client_hello structure holding the client hello message sent by the client during the handshake. NULL is returned if a Client Hello has not yet been received and parsed.
- */
- S2N_API extern struct s2n_client_hello *s2n_connection_get_client_hello(struct s2n_connection *conn);
- /**
- * Function to determine the size of the raw Client Hello buffer.
- *
- * Can be used to determine the necessary size of the `out` buffer for
- * s2n_client_hello_get_raw_message()
- *
- * @param ch The Client Hello handle
- * @returns The size of the ClientHello message received by the server
- */
- S2N_API extern ssize_t s2n_client_hello_get_raw_message_length(struct s2n_client_hello *ch);
- /**
- * Copies `max_length` bytes of the ClientHello message into the `out` buffer.
- * The ClientHello instrumented using this function will have the Random bytes
- * zero-ed out.
- *
- * Note: SSLv2 ClientHello messages follow a different structure than more modern
- * ClientHello messages. See [RFC5246](https://tools.ietf.org/html/rfc5246#appendix-E.2).
- * In addition, due to how s2n-tls parses SSLv2 ClientHellos, the raw message is
- * missing the first three bytes (the msg_type and version) and instead begins with
- * the cipher_specs. To determine whether a ClientHello is an SSLv2 ClientHello,
- * you will need to use s2n_connection_get_client_hello_version(). To get the
- * protocol version advertised in the SSLv2 ClientHello (which may be higher
- * than SSLv2), you will need to use s2n_connection_get_client_protocol_version().
- *
- * @param ch The Client Hello handle
- * @param out The destination buffer for the raw Client Hello
- * @param max_length The size of out in bytes
- * @returns The number of copied bytes
- */
- S2N_API extern ssize_t s2n_client_hello_get_raw_message(struct s2n_client_hello *ch, uint8_t *out, uint32_t max_length);
- /**
- * Function to determine the size of the Client Hello cipher suites.
- * This can be used to allocate the `out` buffer for s2n_client_hello_get_cipher_suites().
- *
- * @param ch The Client Hello handle
- * @returns the number of bytes the cipher_suites takes on the ClientHello message received by the server
- */
- S2N_API extern ssize_t s2n_client_hello_get_cipher_suites_length(struct s2n_client_hello *ch);
- /**
- * Copies into the `out` buffer `max_length` bytes of the cipher_suites on the ClientHello.
- *
- * Note: SSLv2 ClientHello cipher suites follow a different structure than modern
- * ClientHello messages. See [RFC5246](https://tools.ietf.org/html/rfc5246#appendix-E.2).
- * To determine whether a ClientHello is an SSLv2 ClientHello,
- * you will need to use s2n_connection_get_client_hello_version().
- *
- * @param ch The Client Hello handle
- * @param out The destination buffer for the raw Client Hello cipher suites
- * @param max_length The size of out in bytes
- * @returns The number of copied bytes
- */
- S2N_API extern ssize_t s2n_client_hello_get_cipher_suites(struct s2n_client_hello *ch, uint8_t *out, uint32_t max_length);
- /**
- * Function to determine the size of the Client Hello extensions.
- * This can be used to allocate the `out` buffer for s2n_client_hello_get_extensions().
- *
- * @param ch The Client Hello handle
- * @returns the number of bytes the extensions take in the ClientHello message received by the server
- */
- S2N_API extern ssize_t s2n_client_hello_get_extensions_length(struct s2n_client_hello *ch);
- /**
- * Copies into the `out` buffer `max_length` bytes of the extensions in the ClientHello.
- *
- * @param ch The Client Hello handle
- * @param out The destination buffer for the raw Client Hello extensions
- * @param max_length The size of out in bytes
- * @returns The number of copied bytes
- */
- S2N_API extern ssize_t s2n_client_hello_get_extensions(struct s2n_client_hello *ch, uint8_t *out, uint32_t max_length);
- /**
- * Query the ClientHello message received by the server. Use this function to allocate the `out` buffer for
- * other client hello extension functions.
- *
- * @param ch A pointer to the Client Hello
- * @param extension_type Indicates the desired extension
- * @returns The number of bytes the given extension type takes
- */
- S2N_API extern ssize_t s2n_client_hello_get_extension_length(struct s2n_client_hello *ch, s2n_tls_extension_type extension_type);
- /**
- * Copies into the `out` buffer `max_length` bytes of a given extension type on the ClientHello
- *
- * `ch` is a pointer to the `s2n_client_hello` of the `s2n_connection` which can be obtained using s2n_connection_get_client_hello().
- *
- * @param ch A pointer to the Client Hello
- * @param extension_type Indicates the desired extension
- * @param out A pointer to the buffer that s2n will write the client session id to. This buffer MUST be the size of `max_length`
- * @param max_length The size of `out`.
- * @returns The number of copied bytes
- */
- S2N_API extern ssize_t s2n_client_hello_get_extension_by_id(struct s2n_client_hello *ch, s2n_tls_extension_type extension_type, uint8_t *out, uint32_t max_length);
- /**
- * Used to check if a particular extension exists in the client hello.
- *
- * `ch` is a pointer to the `s2n_client_hello` of the `s2n_connection` which can be obtained using s2n_connection_get_client_hello().
- *
- * @param ch A pointer to the client hello object
- * @param extension_iana The iana value of the extension
- * @param exists A pointer that will be set to whether or not the extension exists
- */
- S2N_API extern int s2n_client_hello_has_extension(struct s2n_client_hello *ch, uint16_t extension_iana, bool *exists);
- /**
- * Get the the ClientHello session id length in bytes
- *
- * `ch` is a pointer to the `s2n_client_hello` of the `s2n_connection` which can be obtained using s2n_connection_get_client_hello().
- *
- * @param ch A pointer to the Client Hello
- * @param out_length An out pointer. s2n will set it's value to the size of the session_id in bytes.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_client_hello_get_session_id_length(struct s2n_client_hello *ch, uint32_t *out_length);
- /**
- * Copies up to `max_length` bytes of the ClientHello session_id into the `out` buffer and stores the number of copied bytes in `out_length`.
- *
- * Retrieve the session id as sent by the client in the ClientHello message. The session id on the `s2n_connection` may change later
- * when the server sends the ServerHello; see `s2n_connection_get_session_id` for how to get the final session id used for future session resumption.
- *
- * Use s2n_client_hello_get_session_id_length() to get the the ClientHello session id length in bytes. `ch` is a pointer to the `s2n_client_hello`
- * of the `s2n_connection` which can be obtained using s2n_connection_get_client_hello().
- *
- * @param ch A pointer to the Client Hello
- * @param out A pointer to the buffer that s2n will write the client session id to. This buffer MUST be the size of `max_length`
- * @param out_length An out pointer. s2n will set it's value to the size of the session_id in bytes.
- * @param max_length The size of `out`.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_client_hello_get_session_id(struct s2n_client_hello *ch, uint8_t *out, uint32_t *out_length, uint32_t max_length);
- /**
- * Retrieves the supported groups received from the client in the supported groups extension.
- *
- * IANA values for each of the received supported groups are written to the provided `groups`
- * array, and `groups_count` is set to the number of received supported groups.
- *
- * `groups_count_max` should be set to the maximum capacity of the `groups` array. If
- * `groups_count_max` is less than the number of received supported groups, this function will
- * error. To determine how large `groups` should be in advance, use
- * `s2n_client_hello_get_extension_length()` with the S2N_EXTENSION_SUPPORTED_GROUPS extension
- * type, and divide the value by 2.
- *
- * If no supported groups extension was received from the peer, or the received supported groups
- * extension is malformed, this function will error.
- *
- * @param ch A pointer to the ClientHello. Can be retrieved from a connection via
- * `s2n_connection_get_client_hello()`.
- * @param groups The array to populate with the received supported groups.
- * @param groups_count_max The maximum number of supported groups that can fit in the `groups` array.
- * @param groups_count Returns the number of received supported groups.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure.
- */
- S2N_API extern int s2n_client_hello_get_supported_groups(struct s2n_client_hello *ch, uint16_t *groups,
- uint16_t groups_count_max, uint16_t *groups_count);
- /**
- * Sets the file descriptor for a s2n connection.
- *
- * @warning If the read end of the pipe is closed unexpectedly, writing to the pipe will raise a SIGPIPE signal.
- * **s2n-tls does NOT handle SIGPIPE.** A SIGPIPE signal will cause the process to terminate unless it is handled
- * or ignored by the application.
- * @note This file-descriptor should be active and connected
- * @param conn A pointer to the s2n connection
- * @param fd The new file descriptor
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_fd(struct s2n_connection *conn, int fd);
- /**
- * Sets the file descriptor for the read channel of an s2n connection.
- *
- * @warning If the read end of the pipe is closed unexpectedly, writing to the pipe will raise a SIGPIPE signal.
- * **s2n-tls does NOT handle SIGPIPE.** A SIGPIPE signal will cause the process to terminate unless it is handled
- * or ignored by the application.
- * @note This file-descriptor should be active and connected
- * @param conn A pointer to the s2n connection
- * @param readfd The new read file descriptor
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_read_fd(struct s2n_connection *conn, int readfd);
- /**
- * Sets the assigned file descriptor for the write channel of an s2n connection.
- *
- * @note This file-descriptor should be active and connected
- * @param conn A pointer to the s2n connection
- * @param writefd The new write file descriptor
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_write_fd(struct s2n_connection *conn, int writefd);
- /**
- * Gets the assigned file descriptor for the read channel of an s2n connection.
- *
- * @param conn A pointer to the s2n connection
- * @param readfd pointer to place the used file descriptor.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_get_read_fd(struct s2n_connection *conn, int *readfd);
- /**
- * Gets the assigned file descriptor for the write channel of an s2n connection.
- *
- * @param conn A pointer to the s2n connection
- * @param writefd pointer to place the used file descriptor.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_get_write_fd(struct s2n_connection *conn, int *writefd);
- /**
- * Indicates to s2n that the connection is using corked IO.
- *
- * @warning This API should only be used when using managed send IO.
- *
- * @param conn The connection object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_use_corked_io(struct s2n_connection *conn);
- /**
- * Function pointer for a user provided send callback.
- */
- typedef int s2n_recv_fn(void *io_context, uint8_t *buf, uint32_t len);
- /**
- * Function pointer for a user provided send callback.
- */
- typedef int s2n_send_fn(void *io_context, const uint8_t *buf, uint32_t len);
- /**
- * Set a context containing anything needed in the recv callback function (for example,
- * a file descriptor), the buffer holding data to be sent or received, and the length of the buffer.
- *
- * @note The `io_context` passed to the callbacks may be set separately using `s2n_connection_set_recv_ctx` and `s2n_connection_set_send_ctx`.
- *
- * @param conn The connection object being updated
- * @param ctx A user provided context that the callback will be invoked with
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_recv_ctx(struct s2n_connection *conn, void *ctx);
- /**
- * Set a context containing anything needed in the send callback function (for example,
- * a file descriptor), the buffer holding data to be sent or received, and the length of the buffer.
- *
- * @note The `io_context` passed to the callbacks may be set separately using `s2n_connection_set_recv_ctx` and `s2n_connection_set_send_ctx`.
- *
- * @param conn The connection object being updated
- * @param ctx A user provided context that the callback will be invoked with
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_send_ctx(struct s2n_connection *conn, void *ctx);
- /**
- * Configure a connection to use a recv callback to receive data.
- *
- * @note This callback may be blocking or nonblocking.
- * @note The callback may receive less than the requested length. The function should return the number
- * of bytes received, or set errno and return an error code < 0.
- *
- * @param conn The connection object being updated
- * @param recv A recv callback function pointer
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_recv_cb(struct s2n_connection *conn, s2n_recv_fn recv);
- /**
- * Configure a connection to use a send callback to send data.
- *
- * @note This callback may be blocking or nonblocking.
- * @note The callback may send less than the requested length. The function should return the
- * number of bytes sent or set errno and return an error code < 0.
- *
- * @param conn The connection object being updated
- * @param send A send callback function pointer
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_send_cb(struct s2n_connection *conn, s2n_send_fn send);
- /**
- * Change the behavior of s2n-tls when sending data to prefer high throughput.
- *
- * Connections preferring throughput will use
- * large record sizes that minimize overhead.
- *
- * @param conn The connection object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_prefer_throughput(struct s2n_connection *conn);
- /**
- * Change the behavior of s2n-tls when sending data to prefer low latency.
- *
- * Connections preferring low latency will be encrypted
- * using small record sizes that can be decrypted sooner by the recipient.
- *
- * @param conn The connection object being updated
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_prefer_low_latency(struct s2n_connection *conn);
- /**
- * Configure the connection to free IO buffers when they are not currently in use.
- *
- * This configuration can be used to minimize connection memory footprint size, at the cost
- * of more calls to alloc and free. Some of these costs can be mitigated by configuring s2n-tls
- * to use an allocator that includes thread-local caches or lock-free allocation patterns.
- *
- * @param conn The connection object being update
- * @param enabled Set to `true` if dynamic buffers are enabled; `false` if disabled
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_dynamic_buffers(struct s2n_connection *conn, bool enabled);
- /**
- * Changes the behavior of s2n-tls when sending data to initially prefer records
- * small enough to fit in single ethernet frames.
- *
- * When dynamic record sizing is active, the connection sends records small enough
- * to fit in a single standard 1500 byte ethernet frame. Otherwise, the connection
- * chooses record sizes according to the configured maximum fragment length.
- *
- * Dynamic record sizing is active for the first resize_threshold bytes of a connection,
- * and is reactivated whenever timeout_threshold seconds pass without sending data.
- *
- * @param conn The connection object being updated
- * @param resize_threshold The number of bytes to send before changing the record size. Maximum 8MiB.
- * @param timeout_threshold Reset record size back to a single segment after threshold seconds of inactivity
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_dynamic_record_threshold(struct s2n_connection *conn, uint32_t resize_threshold, uint16_t timeout_threshold);
- /**
- * Sets the callback to use for verifying that a hostname from an X.509 certificate is trusted.
- *
- * The default behavior is to require that the hostname match the server name set with s2n_set_server_name(). This will
- * likely lead to all client certificates being rejected, so the callback will need to be overriden when using client authentication.
- *
- * If a single callback for different connections using the same config is desired, see s2n_config_set_verify_host_callback().
- *
- * @param conn A pointer to a s2n_connection object
- * @param host_fn A pointer to a callback function that s2n will invoke in order to verify the hostname of an X.509 certificate
- * @param data Opaque pointer to data that the verify host function will be invoked with
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_verify_host_callback(struct s2n_connection *conn, s2n_verify_host_fn host_fn, void *data);
- /**
- * Used to opt-out of s2n-tls's built-in blinding. Blinding is a
- * mitigation against timing side-channels which in some cases can leak information
- * about encrypted data. By default s2n-tls will cause a thread to sleep between 10 and
- * 30 seconds whenever tampering is detected.
- *
- * Setting the S2N_SELF_SERVICE_BLINDING option with s2n_connection_set_blinding()
- * turns off this behavior. This is useful for applications that are handling many connections
- * in a single thread. In that case, if s2n_recv() or s2n_negotiate() return an error,
- * self-service applications should call s2n_connection_get_delay() and pause
- * activity on the connection for the specified number of nanoseconds before calling
- * close() or shutdown().
- */
- typedef enum {
- S2N_BUILT_IN_BLINDING,
- S2N_SELF_SERVICE_BLINDING
- } s2n_blinding;
- /**
- * Used to configure s2n-tls to either use built-in blinding (set blinding to S2N_BUILT_IN_BLINDING) or
- * self-service blinding (set blinding to S2N_SELF_SERVICE_BLINDING).
- *
- * @param conn The connection object being updated
- * @param blinding The desired blinding mode for the connection
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_blinding(struct s2n_connection *conn, s2n_blinding blinding);
- /**
- * Query the connection object for the configured blinding delay.
- * @param conn The connection object being updated
- * @returns the number of nanoseconds an application using self-service blinding should pause before calling close() or shutdown().
- */
- S2N_API extern uint64_t s2n_connection_get_delay(struct s2n_connection *conn);
- /**
- * Sets the cipher preference override for the s2n_connection. Calling this function is not necessary
- * unless you want to set the cipher preferences on the connection to something different than what is in the s2n_config.
- *
- * @param conn The connection object being updated
- * @param version The human readable string representation of the security policy version.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_cipher_preferences(struct s2n_connection *conn, const char *version);
- /**
- * Appends the provided application protocol to the preference list
- *
- * The data provided in `protocol` parameter will be copied into an internal buffer
- *
- * @param conn The connection object being updated
- * @param protocol A pointer to a slice of bytes
- * @param protocol_len The length of bytes that should be read from `protocol`. Note: this value cannot be 0, otherwise an error will be returned.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_append_protocol_preference(struct s2n_connection *conn, const uint8_t *protocol, uint8_t protocol_len);
- /**
- * Sets the protocol preference override for the s2n_connection. Calling this function is not necessary unless you want
- * to set the protocol preferences on the connection to something different than what is in the s2n_config.
- *
- * @param conn The connection object being updated
- * @param protocols A pointer to an array of protocol strings
- * @param protocol_count The number of protocols contained in protocols
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_protocol_preferences(struct s2n_connection *conn, const char *const *protocols, int protocol_count);
- /**
- * Sets the server name for the connection.
- *
- * The provided server name will be sent by the client to the server in the
- * server_name ClientHello extension. It may be desirable for clients
- * to provide this information to facilitate secure connections to
- * servers that host multiple 'virtual' servers at a single underlying
- * network address.
- *
- * s2n-tls does not place any restrictions on the provided server name. However,
- * other TLS implementations might. Specifically, the TLS specification for the
- * server_name extension requires that it be an ASCII-encoded DNS name without a
- * trailing dot, and explicitly forbids literal IPv4 or IPv6 addresses.
- *
- * @param conn The connection object being queried
- * @param server_name A pointer to a string containing the desired server name
- * @warning `server_name` must be a NULL terminated string.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_set_server_name(struct s2n_connection *conn, const char *server_name);
- /**
- * Query the connection for the selected server name.
- *
- * This can be used by a server to determine which server name the client is using. This function returns the first ServerName entry
- * in the ServerNameList sent by the client. Subsequent entries are not returned.
- *
- * @param conn The connection object being queried
- * @returns The server name associated with a connection, or NULL if none is found.
- */
- S2N_API extern const char *s2n_get_server_name(struct s2n_connection *conn);
- /**
- * Query the connection for the selected application protocol.
- *
- * @param conn The connection object being queried
- * @returns The negotiated application protocol for a `s2n_connection`. In the event of no protocol being negotiated, NULL is returned.
- */
- S2N_API extern const char *s2n_get_application_protocol(struct s2n_connection *conn);
- /**
- * Query the connection for a buffer containing the OCSP response.
- *
- * @param conn The connection object being queried
- * @param length A pointer that is set to the certificate transparency response buffer's size
- * @returns A pointer to the OCSP response sent by a server during the handshake. If no status response is received, NULL is returned.
- */
- S2N_API extern const uint8_t *s2n_connection_get_ocsp_response(struct s2n_connection *conn, uint32_t *length);
- /**
- * Query the connection for a buffer containing the Certificate Transparency response.
- *
- * @param conn The connection object being queried
- * @param length A pointer that is set to the certificate transparency response buffer's size
- * @returns A pointer to the certificate transparency response buffer.
- */
- S2N_API extern const uint8_t *s2n_connection_get_sct_list(struct s2n_connection *conn, uint32_t *length);
- /**
- * Used in non-blocking mode to indicate in which direction s2n-tls became blocked on I/O before it
- * returned control to the caller. This allows an application to avoid retrying s2n-tls operations
- * until I/O is possible in that direction.
- */
- typedef enum {
- S2N_NOT_BLOCKED = 0,
- S2N_BLOCKED_ON_READ,
- S2N_BLOCKED_ON_WRITE,
- S2N_BLOCKED_ON_APPLICATION_INPUT,
- S2N_BLOCKED_ON_EARLY_DATA,
- } s2n_blocked_status;
- /**
- * Performs the initial "handshake" phase of a TLS connection and must be called before any s2n_recv() or s2n_send() calls.
- *
- * @note When using client authentication with TLS1.3, s2n_negotiate() will report a successful
- * handshake to clients before the server validates the client certificate. If the server then
- * rejects the client certificate, the client may later receive an alert while calling s2n_recv,
- * potentially after already having sent application data with s2n_send.
- *
- * See the following example for guidance on calling `s2n_negotiate()`:
- * https://github.com/aws/s2n-tls/blob/main/docs/examples/s2n_negotiate.c
- *
- * @param conn A pointer to the s2n_connection object
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns S2N_SUCCESS if the handshake completed. S2N_FAILURE if the handshake encountered an error or is blocked.
- */
- S2N_API extern int s2n_negotiate(struct s2n_connection *conn, s2n_blocked_status *blocked);
- /**
- * Writes and encrypts `size` of `buf` data to the associated connection. s2n_send() will return the number of bytes
- * written, and may indicate a partial write.
- *
- * @note Partial writes are possible not just for non-blocking I/O, but also for connections aborted while active.
- * @note Unlike OpenSSL, repeated calls to s2n_send() should not duplicate the original parameters, but should
- * update `buf` and `size` per the indication of size written.
- *
- * See the following example for guidance on calling `s2n_send()`:
- * https://github.com/aws/s2n-tls/blob/main/docs/examples/s2n_send.c
- *
- * @param conn A pointer to the s2n_connection object
- * @param buf A pointer to a buffer that s2n will write data from
- * @param size The size of buf
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns The number of bytes written, and may indicate a partial write
- */
- S2N_API extern ssize_t s2n_send(struct s2n_connection *conn, const void *buf, ssize_t size, s2n_blocked_status *blocked);
- /**
- * Works in the same way as s2n_sendv_with_offset() but with the `offs` parameter implicitly assumed to be 0.
- * Therefore in the partial write case, the caller would have to make sure that the `bufs` and `count` fields are modified in a way that takes
- * the partial writes into account.
- *
- * @param conn A pointer to the s2n_connection object
- * @param bufs A pointer to a vector of buffers that s2n will write data from.
- * @param count The number of buffers in `bufs`
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns The number of bytes written, and may indicate a partial write.
- */
- S2N_API extern ssize_t s2n_sendv(struct s2n_connection *conn, const struct iovec *bufs, ssize_t count, s2n_blocked_status *blocked);
- /**
- * Works in the same way as s2n_send() except that it accepts vectorized buffers. Will return the number of bytes written, and may indicate a partial write. Partial writes are possible not just for non-blocking I/O, but also for connections aborted while active.
- *
- * @note Partial writes are possible not just for non-blocking I/O, but also for connections aborted while active.
- *
- * @note Unlike OpenSSL, repeated calls to s2n_sendv_with_offset() should not duplicate the original parameters, but should update `bufs` and `count` per the indication of size written.
- *
- * See the following example for guidance on calling `s2n_sendv_with_offset()`:
- * https://github.com/aws/s2n-tls/blob/main/docs/examples/s2n_send.c
- *
- * @param conn A pointer to the s2n_connection object
- * @param bufs A pointer to a vector of buffers that s2n will write data from.
- * @param count The number of buffers in `bufs`
- * @param offs The write cursor offset. This should be updated as data is written. See the example code.
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns The number of bytes written, and may indicate a partial write.
- */
- S2N_API extern ssize_t s2n_sendv_with_offset(struct s2n_connection *conn, const struct iovec *bufs, ssize_t count, ssize_t offs, s2n_blocked_status *blocked);
- /**
- * Decrypts and reads **size* to `buf` data from the associated
- * connection.
- *
- * @note Unlike OpenSSL, repeated calls to `s2n_recv` should not duplicate the original parameters, but should update `buf` and `size` per the indication of size read.
- *
- * See the following example for guidance on calling `s2n_recv()`:
- * https://github.com/aws/s2n-tls/blob/main/docs/examples/s2n_recv.c
- *
- * @param conn A pointer to the s2n_connection object
- * @param buf A pointer to a buffer that s2n will place read data into.
- * @param size Size of `buf`
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns number of bytes read. 0 if the connection was shutdown by peer.
- */
- S2N_API extern ssize_t s2n_recv(struct s2n_connection *conn, void *buf, ssize_t size, s2n_blocked_status *blocked);
- /**
- * Allows users of s2n-tls to peek inside the data buffer of an s2n-tls connection to see if there more data to be read without actually reading it.
- *
- * This is useful when using select() on the underlying s2n-tls file descriptor with a message based application layer protocol. As a single call
- * to s2n_recv may read all data off the underlying file descriptor, select() will be unable to tell you there if there is more application data
- * ready for processing already loaded into the s2n-tls buffer.
- *
- * @note can then be used to determine if s2n_recv() needs to be called before more data comes in on the raw fd
- * @param conn A pointer to the s2n_connection object
- * @returns The number of bytes that can be read from the connection
- */
- S2N_API extern uint32_t s2n_peek(struct s2n_connection *conn);
- /**
- * Wipes and releases buffers and memory allocated during the TLS handshake.
- *
- * @note This function should be called after the handshake is successfully negotiated and logging or recording of handshake data is complete.
- *
- * @param conn A pointer to the s2n_connection object
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_free_handshake(struct s2n_connection *conn);
- /**
- * Wipes and free the `in` and `out` buffers associated with a connection.
- *
- * @note This function may be called when a connection is
- * in keep-alive or idle state to reduce memory overhead of long lived connections.
- *
- * @param conn A pointer to the s2n_connection object
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_release_buffers(struct s2n_connection *conn);
- /**
- * Wipes an existing connection and allows it to be reused. Erases all data associated with a connection including
- * pending reads.
- *
- * @note This function should be called after all I/O is completed and s2n_shutdown has been called.
- * @note Reusing the same connection handle(s) is more performant than repeatedly calling s2n_connection_new() and s2n_connection_free().
- *
- * @param conn A pointer to the s2n_connection object
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_wipe(struct s2n_connection *conn);
- /**
- * Frees the memory associated with an s2n_connection
- * handle. The handle is considered invalid after `s2n_connection_free` is used.
- * s2n_connection_wipe() does not need to be called prior to this function. `s2n_connection_free` performs its own wipe
- * of sensitive data.
- *
- * @param conn A pointer to the s2n_connection object
- * @returns 0 on success. -1 on failure
- */
- S2N_API extern int s2n_connection_free(struct s2n_connection *conn);
- /**
- * Attempts a closure at the TLS layer. Does not close the underlying transport. This call may block in either direction.
- *
- * Unlike other TLS implementations, `s2n_shutdown` attempts a graceful shutdown by default. It will not return with success unless a close_notify alert is successfully
- * sent and received. As a result, `s2n_shutdown` may fail when interacting with a non-conformant TLS implementation.
- *
- * Once `s2n_shutdown` is complete:
- * * The s2n_connection handle cannot be used for reading for writing.
- * * The underlying transport can be closed. Most likely via `shutdown()` or `close()`.
- * * The s2n_connection handle can be freed via s2n_connection_free() or reused via s2n_connection_wipe()
- *
- * @param conn A pointer to the s2n_connection object
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_shutdown(struct s2n_connection *conn, s2n_blocked_status *blocked);
- /**
- * Attempts to close the write side of the TLS connection.
- *
- * TLS1.3 supports closing the write side of a TLS connection while leaving the read
- * side unaffected. This feature is usually referred to as "half-close". We send
- * a close_notify alert, but do not wait for the peer to respond.
- *
- * Like `s2n_shutdown()`, this method does not affect the underlying transport.
- *
- * `s2n_shutdown_send()` may still be called for earlier TLS versions, but most
- * TLS implementations will react by immediately discarding any pending writes and
- * closing the connection.
- *
- * Once `s2n_shutdown_send()` is complete:
- * * The s2n_connection handle CANNOT be used for writing.
- * * The s2n_connection handle CAN be used for reading.
- * * The write side of the underlying transport can be closed. Most likely via `shutdown()`.
- *
- * The application should still call `s2n_shutdown()` or wait for `s2n_recv()` to
- * return 0 to indicate end-of-data before cleaning up the connection or closing
- * the read side of the underlying transport.
- *
- * @param conn A pointer to the s2n_connection object
- * @param blocked A pointer which will be set to the blocked status if an `S2N_ERR_T_BLOCKED` error is returned.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_shutdown_send(struct s2n_connection *conn, s2n_blocked_status *blocked);
- /**
- * Used to declare what type of client certificate authentication to use.
- *
- * Currently the default for s2n-tls is for neither the server side or the client side to use Client (aka Mutual) authentication.
- */
- typedef enum {
- S2N_CERT_AUTH_NONE,
- S2N_CERT_AUTH_REQUIRED,
- S2N_CERT_AUTH_OPTIONAL
- } s2n_cert_auth_type;
- /**
- * Gets Client Certificate authentication method the s2n_config object is using.
- *
- * @param config A pointer to a s2n_config object
- * @param client_auth_type A pointer to a client auth policy. This will be updated to the s2n_config value.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_get_client_auth_type(struct s2n_config *config, s2n_cert_auth_type *client_auth_type);
- /**
- * Sets whether or not a Client Certificate should be required to complete the TLS Connection.
- *
- * If this is set to `S2N_CERT_AUTH_OPTIONAL` the server will request a client certificate but allow the client to not provide one.
- * Rejecting a client certificate when using `S2N_CERT_AUTH_OPTIONAL` will terminate the handshake.
- *
- * @param config A pointer to a s2n_config object
- * @param client_auth_type The client auth policy for the connection
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_client_auth_type(struct s2n_config *config, s2n_cert_auth_type client_auth_type);
- /**
- * Gets Client Certificate authentication method the s2n_connection object is using.
- *
- * @param conn A pointer to the s2n_connection object
- * @param client_auth_type A pointer to a client auth policy. This will be updated to the s2n_connection value.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_get_client_auth_type(struct s2n_connection *conn, s2n_cert_auth_type *client_auth_type);
- /**
- * Sets whether or not a Client Certificate should be required to complete the TLS Connection.
- *
- * If this is set to `S2N_CERT_AUTH_OPTIONAL` the server will request a client certificate but allow the client to not provide one.
- * Rejecting a client certificate when using `S2N_CERT_AUTH_OPTIONAL` will terminate the handshake.
- *
- * @param conn A pointer to the s2n_connection object
- * @param client_auth_type The client auth policy for the connection
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_client_auth_type(struct s2n_connection *conn, s2n_cert_auth_type client_auth_type);
- /**
- * Gets the raw certificate chain received from the client.
- *
- * The retrieved certificate chain has the format described by the TLS 1.2 RFC:
- * https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.2. Each certificate is a DER-encoded ASN.1 X.509,
- * prepended by a 3 byte network-endian length value. Note that this format is used regardless of the connection's
- * protocol version.
- *
- * @warning The buffer pointed to by `cert_chain_out` shares its lifetime with the s2n_connection object.
- *
- * @param conn A pointer to the s2n_connection object
- * @param cert_chain_out A pointer that's set to the client certificate chain.
- * @param cert_chain_len A pointer that's set to the size of the `cert_chain_out` buffer.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_get_client_cert_chain(struct s2n_connection *conn, uint8_t **der_cert_chain_out, uint32_t *cert_chain_len);
- /**
- * Sets the initial number of session tickets to send after a >=TLS1.3 handshake. The default value is one ticket.
- *
- * @param config A pointer to the config object.
- * @param num The number of session tickets that will be sent.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_config_set_initial_ticket_count(struct s2n_config *config, uint8_t num);
- /**
- * Increases the number of session tickets to send after a >=TLS1.3 handshake.
- *
- * @param conn A pointer to the connection object.
- * @param num The number of additional session tickets to send.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_add_new_tickets_to_send(struct s2n_connection *conn, uint8_t num);
- /**
- * Returns the number of session tickets issued by the server.
- *
- * In TLS1.3, this number can be up to the limit configured by s2n_config_set_initial_ticket_count
- * and s2n_connection_add_new_tickets_to_send. In earlier versions of TLS, this number will be either 0 or 1.
- *
- * This method only works for server connections.
- *
- * @param conn A pointer to the connection object.
- * @param num The number of additional session tickets sent.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_get_tickets_sent(struct s2n_connection *conn, uint16_t *num);
- /**
- * Sets the keying material lifetime for >=TLS1.3 session tickets so that one session doesn't get re-used ad infinitum.
- * The default value is one week.
- *
- * @param conn A pointer to the connection object.
- * @param lifetime_in_secs Lifetime of keying material in seconds.
- * @returns S2N_SUCCESS on success. S2N_FAILURE on failure
- */
- S2N_API extern int s2n_connection_set_server_keying_material_lifetime(struct s2n_connection *conn, uint32_t lifetime_in_secs);
- struct s2n_session_ticket;
- /**
- * Callback function for receiving a session ticket.
- *
- * This function will be called each time a session ticket is received, which may be multiple times for TLS1.3.
- *
- * # Safety
- *
- * `ctx` is a void pointer and the caller is responsible for ensuring it is cast to the correct type.
- * `ticket` is valid only within the scope of this callback.
- *
- * @param conn A pointer to the connection object.
- * @param ctx Context for the session ticket callback function.
- * @param ticket Pointer to the received session ticket object.
- */
- typedef int (*s2n_session_ticket_fn)(struct s2n_connection *conn, void *ctx, struct s2n_session_ticket *ticket);
- /**
- * Sets a session ticket callback to be called when a client receives a new session ticket.
- *
- * # Safety
- *
- * `callback` MUST cast `ctx` into the same type of pointer that was originally created.
- * `ctx` MUST be valid for the lifetime of the config, or until a different context is set.
- *
- * @param config A pointer to the config object.
- * @param callback The function that should be called when the callback is triggered.
- * @param ctx The context to be passed when the callback is called.
- */
- S2N_API extern int s2n_config_set_session_ticket_cb(struct s2n_config *config, s2n_session_ticket_fn callback, void *ctx);
- /**
- * Gets the length of the session ticket from a session ticket object.
- *
- * @param ticket Pointer to the session ticket object.
- * @param data_len Pointer to be set to the length of the session ticket on success.
- */
- S2N_API extern int s2n_session_ticket_get_data_len(struct s2n_session_ticket *ticket, size_t *data_len);
- /**
- * Gets the session ticket data from a session ticket object.
- *
- * # Safety
- * The entire session ticket will be copied into `data` on success. Therefore, `data` MUST have enough
- * memory to store the session ticket data.
- *
- * @param ticket Pointer to the session ticket object.
- * @param max_data_len Maximum length of data that can be written to the 'data' pointer.
- * @param data Pointer to where the session ticket data will be stored.
- */
- S2N_API extern int s2n_session_ticket_get_data(struct s2n_session_ticket *ticket, size_t max_data_len, uint8_t *data);
- /**
- * Gets the lifetime in seconds of the session ticket from a session ticket object.
- *
- * @param ticket Pointer to the session ticket object.
- * @param session_lifetime Pointer to a variable where the lifetime of the session ticket will be stored.
- */
- S2N_API extern int s2n_session_ticket_get_lifetime(struct s2n_session_ticket *ticket, uint32_t *session_lifetime);
- /**
- * De-serializes the session state and updates the connection accordingly.
- *
- * If this method fails, the connection should not be affected: calling s2n_negotiate
- * with the connection should simply result in a full handshake.
- *
- * @param conn A pointer to the s2n_connection object
- * @param session A pointer to a buffer of size `length`
- * @param length The size of the `session` buffer
- *
- * @returns The number of copied bytes
- */
- S2N_API extern int s2n_connection_set_session(struct s2n_connection *conn, const uint8_t *session, size_t length);
- /**
- * Serializes the session state from connection and copies into the `session` buffer and returns the number of copied bytes
- *
- * @note This function is not recommended for > TLS 1.2 because in TLS1.3
- * servers can send multiple session tickets and this function will only
- * return the most recently received ticket.
- *
- * @param conn A pointer to the s2n_connection object
- * @param session A pointer to a buffer of size `max_length`
- * @param max_length The size of the `session` buffer
- *
- * @returns The number of copied bytes
- */
- S2N_API extern int s2n_connection_get_session(struct s2n_connection *conn, uint8_t *session, size_t max_length);
- /**
- * Retrieves a hint from the server indicating how long this ticket's lifetime is.
- *
- * @note This function is not recommended for > TLS 1.2 because in TLS1.3
- * servers can send multiple session tickets and this function will only
- * return the most recently received ticket lifetime hint.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns The session ticket lifetime hint in seconds from the server or -1 when session ticket was not used for resumption.
- */
- S2N_API extern int s2n_connection_get_session_ticket_lifetime_hint(struct s2n_connection *conn);
- /**
- * Use this to query the serialized session state size before copying it into a buffer.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns number of bytes needed to store serialized session state
- */
- S2N_API extern int s2n_connection_get_session_length(struct s2n_connection *conn);
- /**
- * Gets the latest session id's length from the connection.
- *
- * Use this to query the session id size before copying it into a buffer.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns The latest session id length from the connection. Session id length will be 0 for TLS versions >= TLS1.3 as stateful session resumption has not yet been implemented in TLS1.3.
- */
- S2N_API extern int s2n_connection_get_session_id_length(struct s2n_connection *conn);
- /**
- * Gets the latest session id from the connection, copies it into the `session_id` buffer, and returns the number of copied bytes.
- *
- * The session id may change between s2n receiving the ClientHello and sending the ServerHello, but this function will always describe the latest session id.
- *
- * See s2n_client_hello_get_session_id() to get the session id as it was sent by the client in the ClientHello message.
- *
- * @param conn A pointer to the s2n_connection object
- * @param session_id A pointer to a buffer of size `max_length`
- * @param max_length The size of the `session_id` buffer
- *
- * @returns The number of copied bytes.
- */
- S2N_API extern int s2n_connection_get_session_id(struct s2n_connection *conn, uint8_t *session_id, size_t max_length);
- /**
- * Check if the connection was resumed from an earlier handshake.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns returns 1 if the handshake was abbreviated, otherwise returns 0
- */
- S2N_API extern int s2n_connection_is_session_resumed(struct s2n_connection *conn);
- /**
- * Check if the connection is OCSP stapled.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns 1 if OCSP response was sent (if connection is in S2N_SERVER mode) or received (if connection is in S2N_CLIENT mode) during handshake, otherwise it returns 0.
- */
- S2N_API extern int s2n_connection_is_ocsp_stapled(struct s2n_connection *conn);
- /**
- * TLS Signature Algorithms - RFC 5246 7.4.1.4.1
- * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-16
- */
- typedef enum {
- S2N_TLS_SIGNATURE_ANONYMOUS = 0,
- S2N_TLS_SIGNATURE_RSA = 1,
- S2N_TLS_SIGNATURE_ECDSA = 3,
- /* Use Private Range for RSA PSS since it's not defined there */
- S2N_TLS_SIGNATURE_RSA_PSS_RSAE = 224,
- S2N_TLS_SIGNATURE_RSA_PSS_PSS
- } s2n_tls_signature_algorithm;
- /** TLS Hash Algorithms - https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
- * https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-18
- */
- typedef enum {
- S2N_TLS_HASH_NONE = 0,
- S2N_TLS_HASH_MD5 = 1,
- S2N_TLS_HASH_SHA1 = 2,
- S2N_TLS_HASH_SHA224 = 3,
- S2N_TLS_HASH_SHA256 = 4,
- S2N_TLS_HASH_SHA384 = 5,
- S2N_TLS_HASH_SHA512 = 6,
- /* Use Private Range for MD5_SHA1 */
- S2N_TLS_HASH_MD5_SHA1 = 224
- } s2n_tls_hash_algorithm;
- /**
- * Get the connection's selected signature algorithm.
- *
- * @param conn A pointer to the s2n_connection object
- * @param chosen_alg A pointer to a s2n_tls_signature_algorithm object. This is an output parameter.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE if bad parameters are received.
- */
- S2N_API extern int s2n_connection_get_selected_signature_algorithm(struct s2n_connection *conn, s2n_tls_signature_algorithm *chosen_alg);
- /**
- * Get the connection's selected digest algorithm.
- *
- * @param conn A pointer to the s2n_connection object
- * @param chosen_alg A pointer to a s2n_tls_hash_algorithm object. This is an output parameter.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE if bad parameters are received.
- */
- S2N_API extern int s2n_connection_get_selected_digest_algorithm(struct s2n_connection *conn, s2n_tls_hash_algorithm *chosen_alg);
- /**
- * Get the client certificate's signature algorithm.
- *
- * @param conn A pointer to the s2n_connection object
- * @param chosen_alg A pointer to a s2n_tls_signature_algorithm object. This is an output parameter.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE if bad parameters are received.
- */
- S2N_API extern int s2n_connection_get_selected_client_cert_signature_algorithm(struct s2n_connection *conn, s2n_tls_signature_algorithm *chosen_alg);
- /**
- * Get the client certificate's digest algorithm.
- *
- * @param conn A pointer to the s2n_connection object
- * @param chosen_alg A pointer to a s2n_tls_hash_algorithm object. This is an output parameter.
- *
- * @returns S2N_SUCCESS on success. S2N_FAILURE if bad parameters are received.
- */
- S2N_API extern int s2n_connection_get_selected_client_cert_digest_algorithm(struct s2n_connection *conn, s2n_tls_hash_algorithm *chosen_alg);
- /**
- * Get the certificate used during the TLS handshake
- *
- * - If `conn` is a server connection, the certificate selected will depend on the
- * ServerName sent by the client and supported ciphers.
- * - If `conn` is a client connection, the certificate sent in response to a CertificateRequest
- * message is returned. Currently s2n-tls supports loading only one certificate in client mode. Note that
- * not all TLS endpoints will request a certificate.
- *
- * @param conn A pointer to the s2n_connection object
- *
- * @returns NULL if the certificate selection phase of the handshake has not completed or if a certificate was not requested by the peer
- */
- S2N_API extern struct s2n_cert_chain_and_key *s2n_connection_get_selected_cert(struct s2n_connection *conn);
- /**
- * @param chain_and_key A pointer to the s2n_cert_chain_and_key object being read.
- * @param cert_length This return value represents the length of the s2n certificate chain `chain_and_key`.
- * @returns the length of the s2n certificate chain `chain_and_key`.
- */
- S2N_API extern int s2n_cert_chain_get_length(const struct s2n_cert_chain_and_key *chain_and_key, uint32_t *cert_length);
- /**
- * Returns the certificate `out_cert` present at the index `cert_idx` of the certificate chain `chain_and_key`.
- *
- * Note that the index of the leaf certificate is zero. If the certificate chain `chain_and_key` is NULL or the
- * certificate index value is not in the acceptable range for the input certificate chain, an error is returned.
- *
- * # Safety
- *
- * There is no memory allocation required for `out_cert` buffer prior to calling the `s2n_cert_chain_get_cert` API.
- * The `out_cert` will contain the pointer to the s2n_cert initialized within the input s2n_cert_chain_and_key `chain_and_key`.
- * The pointer to the output s2n certificate `out_cert` is valid until `chain_and_key` is freed up.
- * If a caller wishes to persist the `out_cert` beyond the lifetime of `chain_and_key`, the contents would need to be
- * copied prior to freeing `chain_and_key`.
- *
- * @param chain_and_key A pointer to the s2n_cert_chain_and_key object being read.
- * @param out_cert A pointer to the output s2n_cert `out_cert` present at the index `cert_idx` of the certificate chain `chain_and_key`.
- * @param cert_idx The certificate index for the requested certificate within the s2n certificate chain.
- */
- S2N_API extern int s2n_cert_chain_get_cert(const struct s2n_cert_chain_and_key *chain_and_key, struct s2n_cert **out_cert, const uint32_t cert_idx);
- /**
- * Returns the s2n certificate in DER format along with its length.
- *
- * The API gets the s2n certificate `cert` in DER format. The certificate is returned in the `out_cert_der` buffer.
- * Here, `cert_len` represents the length of the certificate.
- *
- * A caller can use certificate parsing tools such as the ones provided by OpenSSL to parse the DER encoded certificate chain returned.
- *
- * # Safety
- *
- * The memory for the `out_cert_der` buffer is allocated and owned by s2n-tls.
- * Since the size of the certificate can potentially be very large, a pointer to internal connection data is returned instead of
- * copying the contents into a caller-provided buffer.
- *
- * The pointer to the output buffer `out_cert_der` is valid only while the connection exists.
- * The `s2n_connection_free` API frees the memory associated with the out_cert_der buffer and after the `s2n_connection_wipe` API is
- * called the memory pointed by out_cert_der is invalid.
- *
- * If a caller wishes to persist the `out_cert_der` beyond the lifetime of the connection, the contents would need to be
- * copied prior to the connection termination.
- *
- * @param cert A pointer to the s2n_cert object being read.
- * @param out_cert_der A pointer to the output buffer which will hold the s2n certificate `cert` in DER format.
- * @param cert_length This return value represents the length of the certificate.
- */
- S2N_API extern int s2n_cert_get_der(const struct s2n_cert *cert, const uint8_t **out_cert_der, uint32_t *cert_length);
- /**
- * Returns the validated peer certificate chain as a `s2n_cert_chain_and_key` opaque object.
- *
- * The `s2n_cert_chain_and_key` parameter must be allocated by the caller using the `s2n_cert_chain_and_key_new` API
- * prior to this function call and must be empty. To free the memory associated with the `s2n_cert_chain_and_key` object use the
- * `s2n_cert_chain_and_key_free` API.
- *
- * @param conn A pointer to the s2n_connection object being read.
- * @param cert_chain The returned validated peer certificate chain `cert_chain` retrieved from the s2n connection.
- */
- S2N_API extern int s2n_connection_get_peer_cert_chain(const struct s2n_connection *conn, struct s2n_cert_chain_and_key *cert_chain);
- /**
- * Returns the length of the DER encoded extension value of the ASN.1 X.509 certificate extension.
- *
- * @param cert A pointer to the s2n_cert object being read.
- * @param oid A null-terminated cstring that contains the OID of the X.509 certificate extension to be read.
- * @param ext_value_len This return value contains the length of DER encoded extension value of the ASN.1 X.509 certificate extension.
- */
- S2N_API extern int s2n_cert_get_x509_extension_value_length(struct s2n_cert *cert, const uint8_t *oid, uint32_t *ext_value_len);
- /**
- * Returns the DER encoding of an ASN.1 X.509 certificate extension value, it's length and a boolean critical.
- *
- * @param cert A pointer to the s2n_cert object being read.
- * @param oid A null-terminated cstring that contains the OID of the X.509 certificate extension to be read.
- * @param ext_value A pointer to the output buffer which will hold the DER encoding of an ASN.1 X.509 certificate extension value returned.
- * @param ext_value_len This value is both an input and output parameter and represents the length of the output buffer `ext_value`.
- * When used as an input parameter, the caller must use this parameter to convey the maximum length of `ext_value`.
- * When used as an output parameter, `ext_value_len` holds the actual length of the DER encoding of the ASN.1 X.509 certificate extension value returned.
- * @param critical This return value contains the boolean value for `critical`.
- */
- S2N_API extern int s2n_cert_get_x509_extension_value(struct s2n_cert *cert, const uint8_t *oid, uint8_t *ext_value, uint32_t *ext_value_len, bool *critical);
- /**
- * Returns the UTF8 String length of the ASN.1 X.509 certificate extension data.
- *
- * @param extension_data A pointer to the DER encoded ASN.1 X.509 certificate extension value being read.
- * @param extension_len represents the length of the input buffer `extension_data`.
- * @param utf8_str_len This return value contains the UTF8 String length of the ASN.1 X.509 certificate extension data.
- */
- S2N_API extern int s2n_cert_get_utf8_string_from_extension_data_length(const uint8_t *extension_data, uint32_t extension_len, uint32_t *utf8_str_len);
- /**
- * Returns the UTF8 String representation of the DER encoded ASN.1 X.509 certificate extension data.
- *
- * @param extension_data A pointer to the DER encoded ASN.1 X.509 certificate extension value being read.
- * @param extension_len represents the length of the input buffer `extension_data`.
- * @param out_data A pointer to the output buffer which will hold the UTF8 String representation of the DER encoded ASN.1 X.509
- * certificate extension data returned.
- * @param out_len This value is both an input and output parameter and represents the length of the output buffer `out_data`.
- * When used as an input parameter, the caller must use this parameter to convey the maximum length of `out_data`.
- * When used as an output parameter, `out_len` holds the actual length of UTF8 String returned.
- */
- S2N_API extern int s2n_cert_get_utf8_string_from_extension_data(const uint8_t *extension_data, uint32_t extension_len, uint8_t *out_data, uint32_t *out_len);
- /**
- * Pre-shared key (PSK) Hash Algorithm - RFC 8446 Section-2.2
- */
- typedef enum {
- S2N_PSK_HMAC_SHA256,
- S2N_PSK_HMAC_SHA384,
- } s2n_psk_hmac;
- /**
- * Opaque pre shared key handle
- */
- struct s2n_psk;
- /**
- * Creates a new s2n external pre-shared key (PSK) object with `S2N_PSK_HMAC_SHA256` as the default
- * PSK hash algorithm. An external PSK is a key established outside of TLS using a secure mutually agreed upon mechanism.
- *
- * Use `s2n_psk_free` to free the memory allocated to the s2n external PSK object created by this API.
- *
- * @returns struct s2n_psk* Returns a pointer to the newly created external PSK object.
- */
- S2N_API struct s2n_psk *s2n_external_psk_new(void);
- /**
- * Frees the memory associated with the external PSK object.
- *
- * @param psk Pointer to the PSK object to be freed.
- */
- S2N_API int s2n_psk_free(struct s2n_psk **psk);
- /**
- * Sets the identity for a given external PSK object.
- * The identity is a unique identifier for the pre-shared secret.
- * It is a non-secret value represented by raw bytes.
- *
- * # Safety
- *
- * The identity is transmitted over the network unencrypted and is a non-secret value.
- * Do not include confidential information in the identity.
- *
- * Note that the identity is copied into s2n-tls memory and the caller is responsible for
- * freeing the memory associated with the identity input.
- *
- * @param psk A pointer to a PSK object to be updated with the identity.
- * @param identity The identity in raw bytes format to be copied.
- * @param identity_size The length of the PSK identity being set.
- */
- S2N_API int s2n_psk_set_identity(struct s2n_psk *psk, const uint8_t *identity, uint16_t identity_size);
- /**
- * Sets the out-of-band/externally provisioned secret for a given external PSK object.
- *
- * # Safety
- *
- * Note that the secret is copied into s2n-tls memory and the caller is responsible for
- * freeing the memory associated with the `secret` input.
- *
- * Deriving a shared secret from a password or other low-entropy source
- * is not secure and is subject to dictionary attacks.
- * See https://tools.ietf.org/rfc/rfc8446#section-2.2 for more information.
- *
- * @param psk A pointer to a PSK object to be updated with the secret.
- * @param secret The secret in raw bytes format to be copied.
- * @param secret_size The length of the pre-shared secret being set.
- */
- S2N_API int s2n_psk_set_secret(struct s2n_psk *psk, const uint8_t *secret, uint16_t secret_size);
- /**
- * Sets the hash algorithm for a given external PSK object. The supported PSK hash
- * algorithms are as listed in the enum `s2n_psk_hmac` above.
- *
- * @param psk A pointer to the external PSK object to be updated with the PSK hash algorithm.
- * @param hmac The PSK hash algorithm being set.
- */
- S2N_API int s2n_psk_set_hmac(struct s2n_psk *psk, s2n_psk_hmac hmac);
- /**
- * Appends a PSK object to the list of PSKs supported by the s2n connection.
- * If a PSK with a duplicate identity is found, an error is returned and the PSK is not added to the list.
- * Note that a copy of `psk` is stored on the connection. The user is still responsible for freeing the
- * memory associated with `psk`.
- *
- * @param conn A pointer to the s2n_connection object that contains the list of PSKs supported.
- * @param psk A pointer to the `s2n_psk` object to be appended to the list of PSKs on the s2n connection.
- */
- S2N_API int s2n_connection_append_psk(struct s2n_connection *conn, struct s2n_psk *psk);
- /**
- * The list of PSK modes supported by s2n-tls for TLS versions >= TLS1.3.
- * Currently s2n-tls supports two modes - `S2N_PSK_MODE_RESUMPTION`, which represents the PSKs established
- * using the previous connection via session resumption, and `S2N_PSK_MODE_EXTERNAL`, which represents PSKs
- * established out-of-band/externally using a secure mutually agreed upon mechanism.
- */
- typedef enum {
- S2N_PSK_MODE_RESUMPTION,
- S2N_PSK_MODE_EXTERNAL
- } s2n_psk_mode;
- /**
- * Sets the PSK mode on the s2n config object.
- * The supported PSK modes are listed in the enum `s2n_psk_mode` above.
- *
- * @param config A pointer to the s2n_config object being updated.
- * @param mode The PSK mode to be set.
- */
- S2N_API int s2n_config_set_psk_mode(struct s2n_config *config, s2n_psk_mode mode);
- /**
- * Sets the PSK mode on the s2n connection object.
- * The supported PSK modes are listed in the enum `s2n_psk_mode` above.
- * This API overrides the PSK mode set on config for this connection.
- *
- * @param conn A pointer to the s2n_connection object being updated.
- * @param mode The PSK mode to be set.
- */
- S2N_API int s2n_connection_set_psk_mode(struct s2n_connection *conn, s2n_psk_mode mode);
- /**
- * Gets the negotiated PSK identity length from the s2n connection object. The negotiated PSK
- * refers to the chosen PSK by the server to be used for the connection.
- *
- * This API can be used to determine if the negotiated PSK exists. If negotiated PSK exists a
- * call to this API returns a value greater than zero. If the negotiated PSK does not exist, the
- * value `0` is returned.
- *
- * @param conn A pointer to the s2n_connection object that successfully negotiated a PSK connection.
- * @param identity_length The length of the negotiated PSK identity.
- */
- S2N_API int s2n_connection_get_negotiated_psk_identity_length(struct s2n_connection *conn, uint16_t *identity_length);
- /**
- * Gets the negotiated PSK identity from the s2n connection object.
- * If the negotiated PSK does not exist, the PSK identity will not be obtained and no error will be returned.
- * Prior to this API call, use `s2n_connection_get_negotiated_psk_identity_length` to determine if a
- * negotiated PSK exists or not.
- *
- * # Safety
- *
- * The negotiated PSK identity will be copied into the identity buffer on success.
- * Therefore, the identity buffer must have enough memory to fit the identity length.
- *
- * @param conn A pointer to the s2n_connection object.
- * @param identity The negotiated PSK identity obtained from the s2n_connection object.
- * @param max_identity_length The maximum length for the PSK identity. If the negotiated psk_identity length is
- * greater than this `max_identity_length` value an error will be returned.
- */
- S2N_API int s2n_connection_get_negotiated_psk_identity(struct s2n_connection *conn, uint8_t *identity, uint16_t max_identity_length);
- struct s2n_offered_psk;
- /**
- * Creates a new s2n offered PSK object.
- * An offered PSK object represents a single PSK sent by the client.
- *
- * # Safety
- *
- * Use `s2n_offered_psk_free` to free the memory allocated to the s2n offered PSK object created by this API.
- *
- * @returns struct s2n_offered_psk* Returns a pointer to the newly created offered PSK object.
- */
- S2N_API struct s2n_offered_psk *s2n_offered_psk_new(void);
- /**
- * Frees the memory associated with the `s2n_offered_psk` object.
- *
- * @param psk A pointer to the `s2n_offered_psk` object to be freed.
- */
- S2N_API int s2n_offered_psk_free(struct s2n_offered_psk **psk);
- /**
- * Gets the PSK identity and PSK identity length for a given offered PSK object.
- *
- * @param psk A pointer to the offered PSK object being read.
- * @param identity The PSK identity being obtained.
- * @param size The length of the PSK identity being obtained.
- */
- S2N_API int s2n_offered_psk_get_identity(struct s2n_offered_psk *psk, uint8_t **identity, uint16_t *size);
- struct s2n_offered_psk_list;
- /**
- * Checks whether the offered PSK list has an offered psk object next in line in the list.
- * An offered PSK list contains all the PSKs offered by the client for the server to select.
- *
- * # Safety
- *
- * This API returns a pointer to the s2n-tls internal memory with limited lifetime.
- * After the completion of `s2n_psk_selection_callback` this pointer is invalid.
- *
- * @param psk_list A pointer to the offered PSK list being read.
- * @returns bool A boolean value representing whether an offered psk object is present next in line in the offered PSK list.
- */
- S2N_API bool s2n_offered_psk_list_has_next(struct s2n_offered_psk_list *psk_list);
- /**
- * Obtains the next offered PSK object from the list of offered PSKs. Use `s2n_offered_psk_list_has_next`
- * prior to this API call to ensure we have not reached the end of the list.
- *
- * @param psk_list A pointer to the offered PSK list being read.
- * @param psk A pointer to the next offered PSK object being obtained.
- */
- S2N_API int s2n_offered_psk_list_next(struct s2n_offered_psk_list *psk_list, struct s2n_offered_psk *psk);
- /**
- * Returns the offered PSK list to its original read state.
- *
- * When `s2n_offered_psk_list_reread` is called, `s2n_offered_psk_list_next` will return the first PSK
- * in the offered PSK list.
- *
- * @param psk_list A pointer to the offered PSK list being reread.
- */
- S2N_API int s2n_offered_psk_list_reread(struct s2n_offered_psk_list *psk_list);
- /**
- * Chooses a PSK from the offered PSK list to be used for the connection.
- * This API matches the PSK identity received from the client against the server's known PSK identities
- * list, in order to choose the PSK to be used for the connection. If the PSK identity sent from the client
- * is NULL, no PSK is chosen for the connection. If the client offered PSK identity has no matching PSK identity
- * with the server, an error will be returned. Use this API along with the `s2n_psk_selection_callback` callback
- * to select a PSK identity.
- *
- * @param psk_list A pointer to the server's known PSK list used to compare for a matching PSK with the client.
- * @param psk A pointer to the client's PSK object used to compare with the server's known PSK identities.
- */
- S2N_API int s2n_offered_psk_list_choose_psk(struct s2n_offered_psk_list *psk_list, struct s2n_offered_psk *psk);
- /**
- * Callback function to select a PSK from a list of offered PSKs.
- * Use this callback to implement custom PSK selection logic. The s2n-tls default PSK selection logic
- * chooses the first matching PSK from the list of offered PSKs sent by the client.
- *
- * # Safety
- *
- * `context` is a void pointer and the caller is responsible for ensuring it is cast to the correct type.
- * After the completion of this callback, the pointer to `psk_list` is invalid.
- *
- * @param conn A pointer to the s2n_connection object.
- * @param context A pointer to a context for the caller to pass state to the callback, if needed.
- * @param psk_list A pointer to the offered PSK list being read.
- */
- typedef int (*s2n_psk_selection_callback)(struct s2n_connection *conn, void *context,
- struct s2n_offered_psk_list *psk_list);
- /**
- * Sets the callback to select the matching PSK.
- * If this callback is not set s2n-tls uses a default PSK selection logic that selects the first matching
- * server PSK.
- *
- * @param config A pointer to the s2n_config object.
- * @param cb The function that should be called when the callback is triggered.
- * @param context A pointer to a context for the caller to pass state to the callback, if needed.
- */
- S2N_API int s2n_config_set_psk_selection_callback(struct s2n_config *config, s2n_psk_selection_callback cb, void *context);
- /**
- * Get the number of bytes the connection has received.
- *
- * @param conn A pointer to the connection
- * @returns return the number of bytes received by s2n-tls "on the wire"
- */
- S2N_API extern uint64_t s2n_connection_get_wire_bytes_in(struct s2n_connection *conn);
- /**
- * Get the number of bytes the connection has transmitted out.
- *
- * @param conn A pointer to the connection
- * @returns return the number of bytes transmitted out by s2n-tls "on the wire"
- */
- S2N_API extern uint64_t s2n_connection_get_wire_bytes_out(struct s2n_connection *conn);
- /**
- * Access the protocol version supported by the client.
- *
- * @note The return value corresponds to the macros defined as S2N_SSLv2,
- * S2N_SSLv3, S2N_TLS10, S2N_TLS11, S2N_TLS12, and S2N_TLS13.
- *
- * @param conn A pointer to the connection
- * @returns returns the highest protocol version supported by the client
- */
- S2N_API extern int s2n_connection_get_client_protocol_version(struct s2n_connection *conn);
- /**
- * Access the protocol version supported by the server.
- *
- * @note The return value corresponds to the macros defined as S2N_SSLv2,
- * S2N_SSLv3, S2N_TLS10, S2N_TLS11, S2N_TLS12, and S2N_TLS13.
- *
- * @param conn A pointer to the connection
- * @returns Returns the highest protocol version supported by the server
- */
- S2N_API extern int s2n_connection_get_server_protocol_version(struct s2n_connection *conn);
- /**
- * Access the protocol version selected for the connection.
- *
- * @note The return value corresponds to the macros defined as S2N_SSLv2,
- * S2N_SSLv3, S2N_TLS10, S2N_TLS11, S2N_TLS12, and S2N_TLS13.
- *
- * @param conn A pointer to the connection
- * @returns The protocol version actually negotiated by the handshake
- */
- S2N_API extern int s2n_connection_get_actual_protocol_version(struct s2n_connection *conn);
- /**
- * Access the client hello protocol version for the connection.
- *
- * @note The return value corresponds to the macros defined as S2N_SSLv2,
- * S2N_SSLv3, S2N_TLS10, S2N_TLS11, S2N_TLS12, and S2N_TLS13.
- *
- * @param conn A pointer to the connection
- * @returns The protocol version used to send the initial client hello message.
- */
- S2N_API extern int s2n_connection_get_client_hello_version(struct s2n_connection *conn);
- /**
- * Check if Client Auth was used for a connection.
- *
- * @param conn A pointer to the connection
- * @returns 1 if the handshake completed and Client Auth was negotiated during then
- * handshake.
- */
- S2N_API extern int s2n_connection_client_cert_used(struct s2n_connection *conn);
- /**
- * A function that provides a human readable string of the cipher suite that was chosen
- * for a connection.
- *
- * @warning The string "TLS_NULL_WITH_NULL_NULL" is returned before the TLS handshake has been performed.
- * This does not mean that the ciphersuite "TLS_NULL_WITH_NULL_NULL" will be used by the connection,
- * it is merely being used as a placeholder.
- *
- * @note This function is only accurate after the TLS handshake.
- *
- * @param conn A pointer to the connection
- * @returns A string indicating the cipher suite negotiated by s2n in OpenSSL format.
- */
- S2N_API extern const char *s2n_connection_get_cipher(struct s2n_connection *conn);
- /**
- * Provides access to the TLS-Exporter functionality.
- *
- * See https://datatracker.ietf.org/doc/html/rfc5705 and https://www.rfc-editor.org/rfc/rfc8446.
- *
- * @note This is currently only available with TLS 1.3 connections which have finished a handshake.
- *
- * @param conn A pointer to the connection
- * @returns A POSIX error signal. If an error was returned, the value contained in `output` should be considered invalid.
- */
- S2N_API extern int s2n_connection_tls_exporter(struct s2n_connection *conn,
- const uint8_t *label, uint32_t label_length, const uint8_t *context, uint32_t context_length,
- uint8_t *output, uint32_t output_length);
- /**
- * Returns the IANA value for the connection's negotiated cipher suite.
- *
- * The value is returned in the form of `first,second`, in order to closely match
- * the values defined in the [IANA Registry](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#table-tls-parameters-4).
- * For example if the connection's negotiated cipher suite is `TLS_AES_128_GCM_SHA256`,
- * which is registered as `0x13,0x01`, then `first = 0x13` and `second = 0x01`.
- *
- * This method will only succeed after the cipher suite has been negotiated with the peer.
- *
- * @param conn A pointer to the connection being read
- * @param first A pointer to a single byte, which will be updated with the first byte in the registered IANA value.
- * @param second A pointer to a single byte, which will be updated with the second byte in the registered IANA value.
- * @returns A POSIX error signal. If an error was returned, the values contained in `first` and `second` should be considered invalid.
- */
- S2N_API extern int s2n_connection_get_cipher_iana_value(struct s2n_connection *conn, uint8_t *first, uint8_t *second);
- /**
- * Function to check if the cipher used by current connection is supported by the current
- * cipher preferences.
- * @param conn A pointer to the s2n connection
- * @param version A string representing the security policy to check against.
- * @returns 1 if the connection satisfies the cipher suite. 0 if the connection does not satisfy the cipher suite. -1 if there is an error.
- */
- S2N_API extern int s2n_connection_is_valid_for_cipher_preferences(struct s2n_connection *conn, const char *version);
- /**
- * Function to get the human readable elliptic curve name for the connection.
- *
- * @param conn A pointer to the s2n connection
- * @returns A string indicating the elliptic curve used during ECDHE key exchange. The string "NONE" is returned if no curve was used.
- */
- S2N_API extern const char *s2n_connection_get_curve(struct s2n_connection *conn);
- /**
- * Function to get the human readable KEM name for the connection.
- *
- * @param conn A pointer to the s2n connection
- * @returns A human readable string for the KEM group. If there is no KEM configured returns "NONE"
- */
- S2N_API extern const char *s2n_connection_get_kem_name(struct s2n_connection *conn);
- /**
- * Function to get the human readable KEM group name for the connection.
- *
- * @param conn A pointer to the s2n connection
- * @returns A human readable string for the KEM group. If the connection is < TLS1.3 or there is no KEM group configured returns "NONE"
- */
- S2N_API extern const char *s2n_connection_get_kem_group_name(struct s2n_connection *conn);
- /**
- * Function to get the alert that caused a connection to close. s2n-tls considers all
- * TLS alerts fatal and shuts down a connection whenever one is received.
- *
- * @param conn A pointer to the s2n connection
- * @returns The TLS alert code that caused a connection to be shut down
- */
- S2N_API extern int s2n_connection_get_alert(struct s2n_connection *conn);
- /**
- * Function to return the last TLS handshake type that was processed. The returned format is a human readable string.
- *
- * @param conn A pointer to the s2n connection
- * @returns A human-readable handshake type name, e.g. "NEGOTIATED|FULL_HANDSHAKE|PERFECT_FORWARD_SECRECY"
- */
- S2N_API extern const char *s2n_connection_get_handshake_type_name(struct s2n_connection *conn);
- /**
- * Function to return the last TLS message that was processed. The returned format is a human readable string.
- * @param conn A pointer to the s2n connection
- * @returns The last message name in the TLS state machine, e.g. "SERVER_HELLO", "APPLICATION_DATA".
- */
- S2N_API extern const char *s2n_connection_get_last_message_name(struct s2n_connection *conn);
- /**
- * Opaque async private key operation handle
- */
- struct s2n_async_pkey_op;
- /**
- * Sets whether or not a connection should enforce strict signature validation during the
- * `s2n_async_pkey_op_apply` call.
- *
- * `mode` can take the following values:
- * - `S2N_ASYNC_PKEY_VALIDATION_FAST` - default behavior: s2n-tls will perform only the minimum validation required for safe use of the asyn pkey operation.
- * - `S2N_ASYNC_PKEY_VALIDATION_STRICT` - in addition to the previous checks, s2n-tls will also ensure that the signature created as a result of the async private key sign operation matches the public key on the connection.
- */
- typedef enum {
- S2N_ASYNC_PKEY_VALIDATION_FAST,
- S2N_ASYNC_PKEY_VALIDATION_STRICT
- } s2n_async_pkey_validation_mode;
- /**
- * The type of private key operation
- */
- typedef enum {
- S2N_ASYNC_DECRYPT,
- S2N_ASYNC_SIGN
- } s2n_async_pkey_op_type;
- /**
- * Callback function for handling private key operations
- *
- * Invoked every time an operation requiring the private key is encountered
- * during the handshake.
- *
- * # Safety
- * * `op` is owned by the application and MUST be freed.
- *
- * @param conn Connection which triggered the callback
- * @param op An opaque object representing the private key operation
- */
- typedef int (*s2n_async_pkey_fn)(struct s2n_connection *conn, struct s2n_async_pkey_op *op);
- /**
- * Sets up the callback to invoke when private key operations occur.
- *
- * @param config Config to set the callback
- * @param fn The function that should be called for each private key operation
- */
- S2N_API extern int s2n_config_set_async_pkey_callback(struct s2n_config *config, s2n_async_pkey_fn fn);
- /**
- * Performs a private key operation using the given private key.
- *
- * # Safety
- * * Can only be called once. Any subsequent calls will produce a `S2N_ERR_T_USAGE` error.
- * * Safe to call from inside s2n_async_pkey_fn
- * * Safe to call from a different thread, as long as no other thread is operating on `op`.
- *
- * @param op An opaque object representing the private key operation
- * @param key The private key used for the operation. It can be extracted from
- * `conn` through the `s2n_connection_get_selected_cert` and `s2n_cert_chain_and_key_get_private_key` calls
- */
- S2N_API extern int s2n_async_pkey_op_perform(struct s2n_async_pkey_op *op, s2n_cert_private_key *key);
- /**
- * Finalizes a private key operation and unblocks the connection.
- *
- * # Safety
- * * `conn` must match the connection that originally triggered the callback.
- * * Must be called after the operation is performed.
- * * Can only be called once. Any subsequent calls will produce a `S2N_ERR_T_USAGE` error.
- * * Safe to call from inside s2n_async_pkey_fn
- * * Safe to call from a different thread, as long as no other thread is operating on `op`.
- *
- * @param op An opaque object representing the private key operation
- * @param conn The connection associated with the operation that should be unblocked
- */
- S2N_API extern int s2n_async_pkey_op_apply(struct s2n_async_pkey_op *op, struct s2n_connection *conn);
- /**
- * Frees the opaque structure representing a private key operation.
- *
- * # Safety
- * * MUST be called for every operation passed to s2n_async_pkey_fn
- * * Safe to call before or after the connection that created the operation is freed
- *
- * @param op An opaque object representing the private key operation
- */
- S2N_API extern int s2n_async_pkey_op_free(struct s2n_async_pkey_op *op);
- /**
- * Configures whether or not s2n-tls will perform potentially expensive validation of
- * the results of a private key operation.
- *
- * @param config Config to set the validation mode for
- * @param mode What level of validation to perform
- */
- S2N_API extern int s2n_config_set_async_pkey_validation_mode(struct s2n_config *config, s2n_async_pkey_validation_mode mode);
- /**
- * Returns the type of the private key operation.
- *
- * @param op An opaque object representing the private key operation
- * @param type A pointer to be set to the type
- */
- S2N_API extern int s2n_async_pkey_op_get_op_type(struct s2n_async_pkey_op *op, s2n_async_pkey_op_type *type);
- /**
- * Returns the size of the input to the private key operation.
- *
- * @param op An opaque object representing the private key operation
- * @param data_len A pointer to be set to the size
- */
- S2N_API extern int s2n_async_pkey_op_get_input_size(struct s2n_async_pkey_op *op, uint32_t *data_len);
- /**
- * Returns the input to the private key operation.
- *
- * When signing, the input is the digest to sign.
- * When decrypting, the input is the data to decrypt.
- *
- * # Safety
- * * `data` must be sufficiently large to contain the input.
- * `s2n_async_pkey_op_get_input_size` can be called to determine how much memory is required.
- * * s2n-tls does not take ownership of `data`.
- * The application still owns the memory and must free it if necessary.
- *
- * @param op An opaque object representing the private key operation
- * @param data A pointer to a buffer to copy the input into
- * @param data_len The maximum size of the `data` buffer
- */
- S2N_API extern int s2n_async_pkey_op_get_input(struct s2n_async_pkey_op *op, uint8_t *data, uint32_t data_len);
- /**
- * Sets the output of the private key operation.
- *
- * # Safety
- * * s2n-tls does not take ownership of `data`.
- * The application still owns the memory and must free it if necessary.
- *
- * @param op An opaque object representing the private key operation
- * @param data A pointer to a buffer containing the output
- * @param data_len The size of the `data` buffer
- */
- S2N_API extern int s2n_async_pkey_op_set_output(struct s2n_async_pkey_op *op, const uint8_t *data, uint32_t data_len);
- /**
- * Callback function for handling key log events
- *
- * THIS SHOULD BE USED FOR DEBUGGING PURPOSES ONLY!
- *
- * Each log line is formatted with the
- * [NSS Key Log Format](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format)
- * without a newline.
- *
- * # Safety
- *
- * * `ctx` MUST be cast into the same type of pointer that was originally created
- * * `logline` bytes MUST be copied or discarded before this function returns
- *
- * @param ctx Context for the callback
- * @param conn Connection for which the log line is being emitted
- * @param logline Pointer to the log line data
- * @param len Length of the log line data
- */
- typedef int (*s2n_key_log_fn)(void *ctx, struct s2n_connection *conn, uint8_t *logline, size_t len);
- /**
- * Sets a key logging callback on the provided config
- *
- * THIS SHOULD BE USED FOR DEBUGGING PURPOSES ONLY!
- *
- * Setting this function enables configurations to emit secrets in the
- * [NSS Key Log Format](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format)
- *
- * # Safety
- *
- * * `callback` MUST cast `ctx` into the same type of pointer that was originally created
- * * `ctx` MUST live for at least as long as it is set on the config
- *
- * @param config Config to set the callback
- * @param callback The function that should be called for each secret log entry
- * @param ctx The context to be passed when the callback is called
- */
- S2N_API extern int s2n_config_set_key_log_cb(struct s2n_config *config, s2n_key_log_fn callback, void *ctx);
- /**
- * s2n_config_enable_cert_req_dss_legacy_compat adds a dss cert type in the server certificate request when being called.
- * It only sends the dss cert type in the cert request but does not succeed the handshake if a dss cert is received.
- * Please DO NOT call this api unless you know you actually need legacy DSS certificate type compatibility
- * @param config Config to enable legacy DSS certificates for
- */
- S2N_API extern int s2n_config_enable_cert_req_dss_legacy_compat(struct s2n_config *config);
- /**
- * Sets the maximum bytes of early data the server will accept.
- *
- * The default maximum is 0. If the maximum is 0, the server rejects all early data requests.
- * The config maximum can be overridden by the connection maximum or the maximum on an external pre-shared key.
- *
- * @param config A pointer to the config
- * @param max_early_data_size The maximum early data that the server will accept
- * @returns A POSIX error signal. If successful, the maximum early data size was updated.
- */
- S2N_API int s2n_config_set_server_max_early_data_size(struct s2n_config *config, uint32_t max_early_data_size);
- /**
- * Sets the maximum bytes of early data the server will accept.
- *
- * The default maximum is 0. If the maximum is 0, the server rejects all early data requests.
- * The connection maximum can be overridden by the maximum on an external pre-shared key.
- *
- * @param conn A pointer to the connection
- * @param max_early_data_size The maximum early data the server will accept
- * @returns A POSIX error signal. If successful, the maximum early data size was updated.
- */
- S2N_API int s2n_connection_set_server_max_early_data_size(struct s2n_connection *conn, uint32_t max_early_data_size);
- /**
- * Sets the user context associated with early data on a server.
- *
- * This context is passed to the `s2n_early_data_cb` callback to help decide whether to accept or reject early data.
- *
- * Unlike most contexts, the early data context is a byte buffer instead of a void pointer.
- * This is because we need to serialize the context into session tickets.
- *
- * This API is intended for use with session resumption, and will not affect pre-shared keys.
- *
- * @param conn A pointer to the connection
- * @param context A pointer to the user context data. This data will be copied.
- * @param context_size The size of the data to read from the `context` pointer.
- * @returns A POSIX error signal. If successful, the context was updated.
- */
- S2N_API int s2n_connection_set_server_early_data_context(struct s2n_connection *conn, const uint8_t *context, uint16_t context_size);
- /**
- * Configures a particular pre-shared key to allow early data.
- *
- * `max_early_data_size` must be set to the maximum early data accepted by the server.
- *
- * In order to use early data, the cipher suite set on the pre-shared key must match the cipher suite
- * ultimately negotiated by the TLS handshake. Additionally, the cipher suite must have the same
- * hmac algorithm as the pre-shared key.
- *
- * @param psk A pointer to the pre-shared key, created with `s2n_external_psk_new`.
- * @param max_early_data_size The maximum early data that can be sent or received using this key.
- * @param cipher_suite_first_byte The first byte in the registered IANA value of the associated cipher suite.
- * @param cipher_suite_second_byte The second byte in the registered IANA value of the associated cipher suite.
- * @returns A POSIX error signal. If successful, `psk` was updated.
- */
- S2N_API int s2n_psk_configure_early_data(struct s2n_psk *psk, uint32_t max_early_data_size,
- uint8_t cipher_suite_first_byte, uint8_t cipher_suite_second_byte);
- /**
- * Sets the optional `application_protocol` associated with the given pre-shared key.
- *
- * In order to use early data, the `application_protocol` set on the pre-shared key must match
- * the `application_protocol` ultimately negotiated by the TLS handshake.
- *
- * @param psk A pointer to the pre-shared key, created with `s2n_external_psk_new`.
- * @param application_protocol A pointer to the associated application protocol data. This data will be copied.
- * @param size The size of the data to read from the `application_protocol` pointer.
- * @returns A POSIX error signal. If successful, the application protocol was set.
- */
- S2N_API int s2n_psk_set_application_protocol(struct s2n_psk *psk, const uint8_t *application_protocol, uint8_t size);
- /**
- * Sets the optional user early data context associated with the given pre-shared key.
- *
- * The early data context is passed to the `s2n_early_data_cb` callback to help decide whether
- * to accept or reject early data.
- *
- * @param psk A pointer to the pre-shared key, created with `s2n_external_psk_new`.
- * @param context A pointer to the associated user context data. This data will be copied.
- * @param size The size of the data to read from the `context` pointer.
- * @returns A POSIX error signal. If successful, the context was set.
- */
- S2N_API int s2n_psk_set_early_data_context(struct s2n_psk *psk, const uint8_t *context, uint16_t size);
- /**
- * The status of early data on a connection.
- *
- * S2N_EARLY_DATA_STATUS_OK: Early data is in progress.
- * S2N_EARLY_DATA_STATUS_NOT_REQUESTED: The client did not request early data, so none was sent or received.
- * S2N_EARLY_DATA_STATUS_REJECTED: The client requested early data, but the server rejected the request.
- * Early data may have been sent, but was not received.
- * S2N_EARLY_DATA_STATUS_END: All early data was successfully sent and received.
- */
- typedef enum {
- S2N_EARLY_DATA_STATUS_OK,
- S2N_EARLY_DATA_STATUS_NOT_REQUESTED,
- S2N_EARLY_DATA_STATUS_REJECTED,
- S2N_EARLY_DATA_STATUS_END,
- } s2n_early_data_status_t;
- /**
- * Reports the current state of early data for a connection.
- *
- * See `s2n_early_data_status_t` for all possible states.
- *
- * @param conn A pointer to the connection
- * @param status A pointer which will be set to the current early data status
- * @returns A POSIX error signal.
- */
- S2N_API int s2n_connection_get_early_data_status(struct s2n_connection *conn, s2n_early_data_status_t *status);
- /**
- * Reports the remaining size of the early data allowed by a connection.
- *
- * If early data was rejected or not requested, the remaining early data size is 0.
- * Otherwise, the remaining early data size is the maximum early data allowed by the connection,
- * minus the early data sent or received so far.
- *
- * @param conn A pointer to the connection
- * @param allowed_early_data_size A pointer which will be set to the remaining early data currently allowed by `conn`
- * @returns A POSIX error signal.
- */
- S2N_API int s2n_connection_get_remaining_early_data_size(struct s2n_connection *conn, uint32_t *allowed_early_data_size);
- /**
- * Reports the maximum size of the early data allowed by a connection.
- *
- * This is the maximum amount of early data that can ever be sent and received for a connection.
- * It is not affected by the actual status of the early data, so can be non-zero even if early data
- * is rejected or not requested.
- *
- * @param conn A pointer to the connection
- * @param max_early_data_size A pointer which will be set to the maximum early data allowed by `conn`
- * @returns A POSIX error signal.
- */
- S2N_API int s2n_connection_get_max_early_data_size(struct s2n_connection *conn, uint32_t *max_early_data_size);
- /**
- * Called by the client to begin negotiation and send early data.
- *
- * See https://github.com/aws/s2n-tls/blob/main/docs/USAGE-GUIDE.md#using-early-data--0rtt
- * for usage and examples. DO NOT USE unless you have considered the security issues and
- * implemented mitigation for anti-replay attacks.
- *
- * @param conn A pointer to the connection
- * @param data A pointer to the early data to be sent
- * @param data_len The size of the early data to send
- * @param data_sent A pointer which will be set to the size of the early data sent
- * @param blocked A pointer which will be set to the blocked status, as in `s2n_negotiate`.
- * @returns A POSIX error signal. The error should be handled as in `s2n_negotiate`.
- */
- S2N_API int s2n_send_early_data(struct s2n_connection *conn, const uint8_t *data, ssize_t data_len,
- ssize_t *data_sent, s2n_blocked_status *blocked);
- /**
- * Called by the server to begin negotiation and accept any early data the client sends.
- *
- * See https://github.com/aws/s2n-tls/blob/main/docs/USAGE-GUIDE.md#using-early-data--0rtt
- * for usage and examples. DO NOT USE unless you have considered the security issues and
- * implemented mitigation for anti-replay attacks.
- *
- * @param conn A pointer to the connection
- * @param data A pointer to a buffer to store the early data received
- * @param max_data_len The size of the early data buffer
- * @param data_received A pointer which will be set to the size of the early data received
- * @param blocked A pointer which will be set to the blocked status, as in `s2n_negotiate`.
- * @returns A POSIX error signal. The error should be handled as in `s2n_negotiate`.
- */
- S2N_API int s2n_recv_early_data(struct s2n_connection *conn, uint8_t *data, ssize_t max_data_len,
- ssize_t *data_received, s2n_blocked_status *blocked);
- struct s2n_offered_early_data;
- /**
- * A callback which can be implemented to accept or reject early data.
- *
- * This callback is triggered only after the server has determined early data is otherwise acceptable according
- * to the TLS early data specification. Implementations therefore only need to cover application-specific checks,
- * not the standard TLS early data validation.
- *
- * This callback can be synchronous or asynchronous. For asynchronous behavior, return success without
- * calling `s2n_offered_early_data_reject` or `s2n_offered_early_data_accept`. `early_data` will
- * still be a valid reference, and the connection will block until `s2n_offered_early_data_reject` or
- * `s2n_offered_early_data_accept` is called.
- *
- * @param conn A pointer to the connection
- * @param early_data A pointer which can be used to access information about the proposed early data
- * and then accept or reject it.
- * @returns A POSIX error signal. If unsuccessful, the connection will be closed with an error.
- */
- typedef int (*s2n_early_data_cb)(struct s2n_connection *conn, struct s2n_offered_early_data *early_data);
- /**
- * Set a callback to accept or reject early data.
- *
- * @param config A pointer to the connection config
- * @param cb A pointer to the implementation of the callback.
- * @returns A POSIX error signal. If successful, the callback was set.
- */
- S2N_API int s2n_config_set_early_data_cb(struct s2n_config *config, s2n_early_data_cb cb);
- /**
- * Get the length of the early data context set by the user.
- *
- * @param early_data A pointer to the early data information
- * @param context_len The length of the user context
- * @returns A POSIX error signal.
- */
- S2N_API int s2n_offered_early_data_get_context_length(struct s2n_offered_early_data *early_data, uint16_t *context_len);
- /**
- * Get the early data context set by the user.
- *
- * @param early_data A pointer to the early data information
- * @param context A byte buffer to copy the user context into
- * @param max_len The size of `context`. Must be >= to the result of `s2n_offered_early_data_get_context_length`.
- * @returns A POSIX error signal.
- */
- S2N_API int s2n_offered_early_data_get_context(struct s2n_offered_early_data *early_data, uint8_t *context, uint16_t max_len);
- /**
- * Reject early data offered by the client.
- *
- * @param early_data A pointer to the early data information
- * @returns A POSIX error signal. If success, the client's early data will be rejected.
- */
- S2N_API int s2n_offered_early_data_reject(struct s2n_offered_early_data *early_data);
- /**
- * Accept early data offered by the client.
- *
- * @param early_data A pointer to the early data information
- * @returns A POSIX error signal. If success, the client's early data will be accepted.
- */
- S2N_API int s2n_offered_early_data_accept(struct s2n_offered_early_data *early_data);
- #ifdef __cplusplus
- }
- #endif
|