1*e7be843bSPierre Pronchery=pod 2*e7be843bSPierre Pronchery 3*e7be843bSPierre Pronchery=head1 NAME 4*e7be843bSPierre Pronchery 5*e7be843bSPierre Proncheryopenssl-quic-concurrency - OpenSSL QUIC Concurrency Model 6*e7be843bSPierre Pronchery 7*e7be843bSPierre Pronchery=head1 DESCRIPTION 8*e7be843bSPierre Pronchery 9*e7be843bSPierre ProncheryA QUIC domain is a group of QUIC resources such as listeners (see 10*e7be843bSPierre ProncheryL<SSL_new_listener(3)>) and connections which share common event processing 11*e7be843bSPierre Proncheryresources, such as internal pollers, timers and locks. All usage of OpenSSL QUIC 12*e7be843bSPierre Proncheryhappens inside a QUIC domain. 13*e7be843bSPierre Pronchery 14*e7be843bSPierre ProncheryThese resources can be accessed and used concurrently depending on the 15*e7be843bSPierre Proncherycircumstances. This man page discusses the available concurrency models and how 16*e7be843bSPierre Proncherythey can be used. 17*e7be843bSPierre Pronchery 18*e7be843bSPierre Pronchery=head1 EXPLICIT AND IMPLICIT QUIC DOMAINS 19*e7be843bSPierre Pronchery 20*e7be843bSPierre ProncheryA QUIC domain is instantiated either explicitly (L<SSL_new_domain(3)>) or 21*e7be843bSPierre Proncheryimplicitly by calling L<SSL_new(3)> or L<SSL_new_listener(3)>: 22*e7be843bSPierre Pronchery 23*e7be843bSPierre Pronchery=over 4 24*e7be843bSPierre Pronchery 25*e7be843bSPierre Pronchery=item 26*e7be843bSPierre Pronchery 27*e7be843bSPierre ProncheryAn explicit QUIC domain is created by and visible to the application as a QUIC 28*e7be843bSPierre Proncherydomain SSL object and has other QUIC SSL objects created underneath it, such as 29*e7be843bSPierre Proncherylisteners or connections. 30*e7be843bSPierre Pronchery 31*e7be843bSPierre Pronchery=item 32*e7be843bSPierre Pronchery 33*e7be843bSPierre ProncheryAn implicit QUIC domain is one which is created internally due to the direct 34*e7be843bSPierre Proncherycreation of a QUIC connection or listener SSL object; the application does not 35*e7be843bSPierre Proncheryexplicitly create a QUIC domain SSL object and never directly references the 36*e7be843bSPierre Proncherydomain. 37*e7be843bSPierre Pronchery 38*e7be843bSPierre Pronchery=back 39*e7be843bSPierre Pronchery 40*e7be843bSPierre ProncheryExplicit creation of a QUIC domain provides the greatest level of control for an 41*e7be843bSPierre Proncheryapplication. Applications can use an implicit QUIC domain for ease of use and to 42*e7be843bSPierre Proncheryavoid needing to create a separate QUIC domain SSL object. 43*e7be843bSPierre Pronchery 44*e7be843bSPierre ProncheryRegardless of whether a QUIC domain is explicitly created, the internal 45*e7be843bSPierre Proncheryprocessing model is the same and the application must choose an appropriate 46*e7be843bSPierre Proncheryconcurrency model as discussed below. 47*e7be843bSPierre Pronchery 48*e7be843bSPierre Pronchery=head1 CONCURRENCY MODELS 49*e7be843bSPierre Pronchery 50*e7be843bSPierre ProncheryThe OpenSSL QUIC implementation supports multiple concurrency models to support 51*e7be843bSPierre Proncherya wide variety of usage scenarios. 52*e7be843bSPierre Pronchery 53*e7be843bSPierre ProncheryThe available concurrency models are as follows: 54*e7be843bSPierre Pronchery 55*e7be843bSPierre Pronchery=over 4 56*e7be843bSPierre Pronchery 57*e7be843bSPierre Pronchery=item * 58*e7be843bSPierre Pronchery 59*e7be843bSPierre ProncheryThe B<Single-Threaded Concurrency Model (SCM)>, which supports only 60*e7be843bSPierre Proncheryapplication-synchronised single-threaded usage. 61*e7be843bSPierre Pronchery 62*e7be843bSPierre Pronchery=item * 63*e7be843bSPierre Pronchery 64*e7be843bSPierre ProncheryThe B<Contentive Concurrency Model (CCM)>, which supports multi-threaded usage. 65*e7be843bSPierre Pronchery 66*e7be843bSPierre Pronchery=item * 67*e7be843bSPierre Pronchery 68*e7be843bSPierre ProncheryThe B<Thread-Assisted Concurrency Model (TACM)>, which also supports 69*e7be843bSPierre Proncherymulti-threaded usage and provides assistance to an application for handling QUIC 70*e7be843bSPierre Proncherytimer events. 71*e7be843bSPierre Pronchery 72*e7be843bSPierre Pronchery=back 73*e7be843bSPierre Pronchery 74*e7be843bSPierre ProncheryThe merits of these models are as follows: 75*e7be843bSPierre Pronchery 76*e7be843bSPierre Pronchery=over 4 77*e7be843bSPierre Pronchery 78*e7be843bSPierre Pronchery=item * 79*e7be843bSPierre Pronchery 80*e7be843bSPierre ProncheryThe B<Single-Threaded Concurrency Model (SCM)> performs no locking or 81*e7be843bSPierre Proncherysynchronisation. It is entirely up to the application to synchronise access to 82*e7be843bSPierre Proncherythe QUIC domain and its subsidiary SSL objects. 83*e7be843bSPierre Pronchery 84*e7be843bSPierre ProncheryThis concurrency model is also useful for an application which wants to use the 85*e7be843bSPierre ProncheryOpenSSL QUIC implementation as a pure state machine. 86*e7be843bSPierre Pronchery 87*e7be843bSPierre Pronchery=item * 88*e7be843bSPierre Pronchery 89*e7be843bSPierre ProncheryThe B<Contentive Concurrency Model (CCM)> performs automatic locking when making 90*e7be843bSPierre ProncheryAPI calls to SSL objects in a QUIC domain. This provides automatic 91*e7be843bSPierre Proncherysynchronisation for multi-threaded usage of QUIC objects. For example, different 92*e7be843bSPierre ProncheryQUIC stream SSL objects in the same QUIC connection can be safely accessed from 93*e7be843bSPierre Proncherydifferent threads. 94*e7be843bSPierre Pronchery 95*e7be843bSPierre ProncheryThis concurrency model adds the overhead of locking over the Single-Threaded 96*e7be843bSPierre ProncheryConcurrency Model in order to support multi-threaded usage, but provides limited 97*e7be843bSPierre Proncheryperformance in highly contended multi-threaded usage due to its simple approach. 98*e7be843bSPierre ProncheryHowever, it may still prove a good solution for a broad class of applications 99*e7be843bSPierre Proncherywhich spend the majority of their time in application logic and not in QUIC I/O 100*e7be843bSPierre Proncheryprocessing. 101*e7be843bSPierre Pronchery 102*e7be843bSPierre ProncheryAn advantage of this model relative to the more sophisticated concurrency models 103*e7be843bSPierre Proncherybelow is that it does not create any OS threads. 104*e7be843bSPierre Pronchery 105*e7be843bSPierre Pronchery=item * 106*e7be843bSPierre Pronchery 107*e7be843bSPierre ProncheryThe B<Thread-Assisted Concurrency Model (TACM)> is identical to the Contentive 108*e7be843bSPierre ProncheryConcurrency Model except that a thread is spun up in the background to ensure 109*e7be843bSPierre Proncherythat QUIC timer events are handled in a timely fashion. This ensures that QUIC 110*e7be843bSPierre Proncherytimeout events are handled even if an application does not periodically call 111*e7be843bSPierre Proncheryinto the QUIC domain to ensure that any outstanding QUIC-related timer or 112*e7be843bSPierre Proncherynetwork I/O events are handled. The assist thread contends for the same 113*e7be843bSPierre Proncheryresources like any other thread. However, handshake layer events (TLS) are never 114*e7be843bSPierre Proncheryprocessed by the assist thread. 115*e7be843bSPierre Pronchery 116*e7be843bSPierre Pronchery=back 117*e7be843bSPierre Pronchery 118*e7be843bSPierre ProncheryThe default concurrency model is CCM or TACM, depending on the B<SSL_METHOD> 119*e7be843bSPierre Proncheryused with a B<SSL_CTX>. Using L<OSSL_QUIC_client_method(3)> results in a default 120*e7be843bSPierre Proncheryconcurrency model of CCM, whereas using L<OSSL_QUIC_client_thread_method(3)> 121*e7be843bSPierre Proncheryresults in a default concurrency model of TACM. 122*e7be843bSPierre Pronchery 123*e7be843bSPierre ProncheryAdditional concurrency models may be offered in future releases of OpenSSL. 124*e7be843bSPierre Pronchery 125*e7be843bSPierre Pronchery=head1 BLOCKING I/O CAPABILITIES 126*e7be843bSPierre Pronchery 127*e7be843bSPierre ProncheryAll of the supported concurrency models are capable of supporting blocking I/O 128*e7be843bSPierre Proncherycalls, where application-level I/O calls (for example, to L<SSL_read_ex(3)> or 129*e7be843bSPierre ProncheryL<SSL_write_ex(3)> on a QUIC stream SSL object) block until the request can be 130*e7be843bSPierre Proncheryserviced. This includes the use of L<SSL_poll(3)> in a blocking fashion. 131*e7be843bSPierre Pronchery 132*e7be843bSPierre ProncherySupporting blocking API calls reliably with multi-threaded usage requires the 133*e7be843bSPierre Proncherycreation of additional OS resources such as internal file descriptors to allow 134*e7be843bSPierre Proncherythreads to be woken when necessary. This creation of internal OS resources is 135*e7be843bSPierre Proncheryoptional and may need to be explicitly requested by an application depending on 136*e7be843bSPierre Proncherythe chosen concurrency model. If this functionality is disabled, depending on 137*e7be843bSPierre Proncherythe chosen concurrency model, blocking API calls may not be available and calls 138*e7be843bSPierre Proncheryto L<SSL_set_blocking_mode(3)> attempting to enable blocking mode may fail, 139*e7be843bSPierre Proncherynotwithstanding the following section. 140*e7be843bSPierre Pronchery 141*e7be843bSPierre Pronchery=head2 Legacy Blocking Support Compatibility 142*e7be843bSPierre Pronchery 143*e7be843bSPierre ProncheryOpenSSL 3.2 and 3.3 contained a buggy implementation of blocking QUIC I/O calls 144*e7be843bSPierre Proncherywhich is only reliable under single-threaded usage. This functionality is always 145*e7be843bSPierre Proncheryavailable in the Single-Threaded Concurrency Model (SCM), where it works 146*e7be843bSPierre Proncheryreliably. 147*e7be843bSPierre Pronchery 148*e7be843bSPierre ProncheryFor compatibility reasons, this functionality is also available under the 149*e7be843bSPierre Proncherydefault concurrency model if the application does not explicitly specify a 150*e7be843bSPierre Proncheryconcurrency model or disable it. This is known as Legacy Blocking Compatibility 151*e7be843bSPierre ProncheryMode, and its usage is not recommended for multi-threaded applications. 152*e7be843bSPierre Pronchery 153*e7be843bSPierre Pronchery=head1 RECOMMENDED USAGE 154*e7be843bSPierre Pronchery 155*e7be843bSPierre ProncheryNew applications are advised to choose a concurrency model as follows: 156*e7be843bSPierre Pronchery 157*e7be843bSPierre Pronchery=over 4 158*e7be843bSPierre Pronchery 159*e7be843bSPierre Pronchery=item * 160*e7be843bSPierre Pronchery 161*e7be843bSPierre ProncheryA purely single-threaded application, or an application which wishes to use 162*e7be843bSPierre ProncheryOpenSSL QUIC as a state machine and manage synchronisation itself, should 163*e7be843bSPierre Proncheryexplicitly select the SCM concurrency model. 164*e7be843bSPierre Pronchery 165*e7be843bSPierre Pronchery=item * 166*e7be843bSPierre Pronchery 167*e7be843bSPierre ProncheryAn application which wants to engage in multi-threaded usage of different QUIC 168*e7be843bSPierre Proncheryconnections or streams in the same QUIC domain should a) select the CCM or TACM 169*e7be843bSPierre Proncheryconcurrency model and b) explicitly opt in or out of blocking I/O support 170*e7be843bSPierre Pronchery(depending on whether the application wishes to make blocking I/O calls), 171*e7be843bSPierre Proncherydisabling Legacy Blocking Compatibility Mode. 172*e7be843bSPierre Pronchery 173*e7be843bSPierre ProncheryAn application should select the CCM concurrency model if the application can 174*e7be843bSPierre Proncheryguarantee that a QUIC domain will be serviced regularly (for example, because 175*e7be843bSPierre Proncherythe application can guarantee that the timeout returned by 176*e7be843bSPierre ProncheryL<SSL_get_event_timeout(3)> will be handled). If an application is unable to do 177*e7be843bSPierre Proncherythis, it should select the TACM concurrency model. 178*e7be843bSPierre Pronchery 179*e7be843bSPierre Pronchery=item * 180*e7be843bSPierre Pronchery 181*e7be843bSPierre ProncheryApplications should explicitly configure a concurrency model during 182*e7be843bSPierre Proncheryinitialisation. 183*e7be843bSPierre Pronchery 184*e7be843bSPierre Pronchery=back 185*e7be843bSPierre Pronchery 186*e7be843bSPierre Pronchery=head1 CONFIGURING A CONCURRENCY MODEL 187*e7be843bSPierre Pronchery 188*e7be843bSPierre ProncheryIf using an explicit QUIC domain, a concurrency model is chosen when calling 189*e7be843bSPierre ProncheryL<SSL_new_domain(3)> by specifying zero or more of the following flags: 190*e7be843bSPierre Pronchery 191*e7be843bSPierre Pronchery=over 4 192*e7be843bSPierre Pronchery 193*e7be843bSPierre Pronchery=item B<SSL_DOMAIN_FLAG_SINGLE_THREAD> 194*e7be843bSPierre Pronchery 195*e7be843bSPierre ProncherySpecifying this flag configures the Single-Threaded Concurrency Model (SCM). 196*e7be843bSPierre Pronchery 197*e7be843bSPierre Pronchery=item B<SSL_DOMAIN_FLAG_MULTI_THREAD> 198*e7be843bSPierre Pronchery 199*e7be843bSPierre ProncherySpeciyfing this flag configures the Contentive Concurrency Model (CCM) (unless 200*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_THREAD_ASSISTED> is also specified). 201*e7be843bSPierre Pronchery 202*e7be843bSPierre Pronchery=item B<SSL_DOMAIN_FLAG_THREAD_ASSISTED> 203*e7be843bSPierre Pronchery 204*e7be843bSPierre ProncherySpecifying this flag configures the Thread-Assisted Concurrency Model (TACM). 205*e7be843bSPierre ProncheryIt implies B<SSL_DOMAIN_FLAG_MULTI_THREAD>. 206*e7be843bSPierre Pronchery 207*e7be843bSPierre Pronchery=item B<SSL_DOMAIN_FLAG_BLOCKING> 208*e7be843bSPierre Pronchery 209*e7be843bSPierre ProncheryEnable reliable support for blocking I/O calls, allocating whatever OS resources 210*e7be843bSPierre Proncheryare necessary to realise this. If this flag is specified, 211*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_LEGACY_BLOCKING> is ignored. 212*e7be843bSPierre Pronchery 213*e7be843bSPierre ProncheryDetails on the allocated OS resources can be found under L</CONSUMPTION OF OS 214*e7be843bSPierre ProncheryRESOURCES> below. 215*e7be843bSPierre Pronchery 216*e7be843bSPierre Pronchery=item B<SSL_DOMAIN_FLAG_LEGACY_BLOCKING> 217*e7be843bSPierre Pronchery 218*e7be843bSPierre ProncheryEnables legacy blocking compatibility mode. See L</Legacy Blocking Support 219*e7be843bSPierre ProncheryCompatibility>. 220*e7be843bSPierre Pronchery 221*e7be843bSPierre Pronchery=back 222*e7be843bSPierre Pronchery 223*e7be843bSPierre ProncheryMutually exclusive flag combinations result in an error (for example, combining 224*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_SINGLE_THREAD> and B<SSL_DOMAIN_FLAG_MULTI_THREADED>). 225*e7be843bSPierre Pronchery 226*e7be843bSPierre ProncheryThe concurrency model for a domain cannot be changed after the domain is 227*e7be843bSPierre Proncherycreated. 228*e7be843bSPierre Pronchery 229*e7be843bSPierre Pronchery=head2 Default Behaviour 230*e7be843bSPierre Pronchery 231*e7be843bSPierre ProncheryIf none of B<SSL_DOMAIN_FLAG_SINGLE_THREAD>, B<SSL_DOMAIN_FLAG_MULTI_THREAD> or 232*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_THREAD_ASSISTED> are provided to L<SSL_new_domain(3)> or 233*e7be843bSPierre Proncheryanother constructor function which can accept the above flags, the default 234*e7be843bSPierre Proncheryconcurrency model set on the B<SSL_CTX> is used. This default can be set and get 235*e7be843bSPierre Proncheryusing L<SSL_CTX_set_domain_flags(3)> and L<SSL_CTX_get_domain_flags(3)>. Any 236*e7be843bSPierre Proncheryadditional flags provided (for example, B<SSL_DOMAIN_FLAG_BLOCCKING>) are added 237*e7be843bSPierre Proncheryto the set of inherited flags. 238*e7be843bSPierre Pronchery 239*e7be843bSPierre ProncheryThe default concurrency model set on a newly created B<SSL_CTX> is determined as 240*e7be843bSPierre Proncheryfollows: 241*e7be843bSPierre Pronchery 242*e7be843bSPierre Pronchery=over 4 243*e7be843bSPierre Pronchery 244*e7be843bSPierre Pronchery=item * 245*e7be843bSPierre Pronchery 246*e7be843bSPierre ProncheryIf an B<SSL_METHOD> of L<OSSL_QUIC_client_thread_method(3)> is used, the 247*e7be843bSPierre ProncheryThread-Assisted Concurrency Model (TACM) is used with the 248*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_BLOCKING> flag. This provides reliable blocking functionality. 249*e7be843bSPierre Pronchery 250*e7be843bSPierre Pronchery=item * 251*e7be843bSPierre Pronchery 252*e7be843bSPierre ProncheryOtherwise, if OpenSSL was built without threading support, the Single-Threaded 253*e7be843bSPierre ProncheryConcurrency Model (SCM) is used, with the B<SSL_DOMAIN_FLAG_LEGACY_BLOCKING> 254*e7be843bSPierre Proncheryflag. 255*e7be843bSPierre Pronchery 256*e7be843bSPierre Pronchery=item * 257*e7be843bSPierre Pronchery 258*e7be843bSPierre ProncheryOtherwise, if an B<SSL_METHOD> of L<OSSL_QUIC_client_method(3)> is used, the 259*e7be843bSPierre ProncheryContentive Concurrency Model (CCM) is used with the 260*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_LEGACY_BLOCKING> flag. 261*e7be843bSPierre Pronchery 262*e7be843bSPierre Pronchery=item * 263*e7be843bSPierre Pronchery 264*e7be843bSPierre ProncheryOtherwise, the Contentive Concurrency Model (CCM) is used. 265*e7be843bSPierre Pronchery 266*e7be843bSPierre Pronchery=back 267*e7be843bSPierre Pronchery 268*e7be843bSPierre ProncheryThe default concurrency model may vary between releases of OpenSSL. An 269*e7be843bSPierre Proncheryapplication may specify one or more of the domain flags above to ensure 270*e7be843bSPierre Proncheryconsistent usage of a specific concurrency model between releases. 271*e7be843bSPierre Pronchery 272*e7be843bSPierre Pronchery=head2 Configuration of Concurrency Models with Implicit QUIC Domains 273*e7be843bSPierre Pronchery 274*e7be843bSPierre ProncheryIf an explicit QUIC domain is not explicitly created using L<SSL_new_domain(3)>, 275*e7be843bSPierre Proncheryan implicit QUIC domain is created when calling L<SSL_new_listener(3)> or 276*e7be843bSPierre ProncheryL<SSL_new(3)>. Such a domain will use the default domain flags configured on the 277*e7be843bSPierre ProncheryB<SSL_CTX> as described above. 278*e7be843bSPierre Pronchery 279*e7be843bSPierre Pronchery=head1 CONSUMPTION OF OS RESOURCES 280*e7be843bSPierre Pronchery 281*e7be843bSPierre ProncheryIf full blocking I/O support is selected using B<SSL_DOMAIN_FLAG_BLOCKING>, at 282*e7be843bSPierre Proncheryleast one socket, socket-like OS handle or file descriptor must be allocated to 283*e7be843bSPierre Proncheryallow one thread to wake other threads which may be blocking in calls to OS 284*e7be843bSPierre Proncherysocket polling interfaces such as select(2) or poll(2). This is allocated 285*e7be843bSPierre Proncheryautomatically internally by OpenSSL. 286*e7be843bSPierre Pronchery 287*e7be843bSPierre ProncheryIf the Thread-Assisted Concurrency Model (TACM) is selected, a background thread 288*e7be843bSPierre Proncheryis spawned. This also implies B<SSL_DOMAIN_FLAG_BLOCKING> and the above. 289*e7be843bSPierre Pronchery 290*e7be843bSPierre ProncheryThe internal consumption by OpenSSL of mutexes, condition variables, spin locks 291*e7be843bSPierre Proncheryor other similar thread synchronisation primitives is unspecified under all 292*e7be843bSPierre Proncheryconcurrency models. 293*e7be843bSPierre Pronchery 294*e7be843bSPierre ProncheryThe internal consumption by OpenSSL of threads is unspecified under the 295*e7be843bSPierre ProncheryThread-Assisted Concurrency Model. 296*e7be843bSPierre Pronchery 297*e7be843bSPierre ProncheryThe internal consumption by OpenSSL of sockets, socket-like OS handles or file 298*e7be843bSPierre Proncherydescriptors, or other resources as needed to support inter-thread notification, 299*e7be843bSPierre Proncheryis unspecified under the Thread-Assisted Concurrency Model or when using 300*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_BLOCKING>. 301*e7be843bSPierre Pronchery 302*e7be843bSPierre Pronchery=head1 BEHAVIOUR OF SSL OBJECTS 303*e7be843bSPierre Pronchery 304*e7be843bSPierre ProncheryA QUIC SSL object has blocking mode enabled by default where B<all> of the 305*e7be843bSPierre Proncheryfollowing criteria are met: 306*e7be843bSPierre Pronchery 307*e7be843bSPierre Pronchery=over 4 308*e7be843bSPierre Pronchery 309*e7be843bSPierre Pronchery=item * 310*e7be843bSPierre Pronchery 311*e7be843bSPierre ProncheryB<SSL_DOMAIN_FLAG_BLOCKING> or B<SSL_DOMAIN_FLAG_LEGACY_BLOCKING> is enabled; 312*e7be843bSPierre Proncheryand 313*e7be843bSPierre Pronchery 314*e7be843bSPierre Pronchery=item * 315*e7be843bSPierre Pronchery 316*e7be843bSPierre ProncheryThe QUIC connection is being used with network read and write BIOs which expose 317*e7be843bSPierre Proncherysupported poll descriptors. See L<openssl-quic(7)> for details. 318*e7be843bSPierre Pronchery 319*e7be843bSPierre Pronchery=back 320*e7be843bSPierre Pronchery 321*e7be843bSPierre ProncheryIn all other cases, a QUIC SSL object has blocking mode disabled by default. The 322*e7be843bSPierre Proncheryblocking mode can be changed explicitly using L<SSL_set_blocking_mode(3)>. 323*e7be843bSPierre Pronchery 324*e7be843bSPierre Pronchery=head1 SEE ALSO 325*e7be843bSPierre Pronchery 326*e7be843bSPierre ProncheryL<openssl-quic(7)>, L<SSL_handle_events(3)>, L<SSL_get_event_timeout(3)>, 327*e7be843bSPierre ProncheryL<OSSL_QUIC_client_thread_method(3)>, L<SSL_CTX_set_domain_flags(3)>, 328*e7be843bSPierre ProncheryL<SSL_new_domain(3)> 329*e7be843bSPierre Pronchery 330*e7be843bSPierre Pronchery=head1 COPYRIGHT 331*e7be843bSPierre Pronchery 332*e7be843bSPierre ProncheryCopyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved. 333*e7be843bSPierre Pronchery 334*e7be843bSPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 335*e7be843bSPierre Proncherythis file except in compliance with the License. You can obtain a copy 336*e7be843bSPierre Proncheryin the file LICENSE in the source distribution or at 337*e7be843bSPierre ProncheryL<https://www.openssl.org/source/license.html>. 338*e7be843bSPierre Pronchery 339*e7be843bSPierre Pronchery=cut 340