1*b077aed3SPierre Pronchery=pod 2*b077aed3SPierre Pronchery 3*b077aed3SPierre Pronchery=head1 NAME 4*b077aed3SPierre Pronchery 5*b077aed3SPierre ProncheryOPTIONS, OPT_PAIR, OPT_COMMON, OPT_ERR, OPT_EOF, OPT_HELP, 6*b077aed3SPierre Proncheryopt_init, opt_progname, opt_appname, opt_getprog, opt_help, 7*b077aed3SPierre Proncheryopt_begin, opt_next, opt_flag, opt_arg, opt_unknown, opt_cipher, 8*b077aed3SPierre Proncheryopt_cipher_any, opt_cipher_silent, opt_md, 9*b077aed3SPierre Proncheryopt_int, opt_int_arg, opt_long, opt_ulong, opt_intmax, opt_uintmax, 10*b077aed3SPierre Proncheryopt_format, opt_isdir, opt_string, opt_pair, 11*b077aed3SPierre Proncheryopt_num_rest, opt_rest, opt_legacy_okay 12*b077aed3SPierre Pronchery- Option parsing for commands and tests 13*b077aed3SPierre Pronchery 14*b077aed3SPierre Pronchery=head1 SYNOPSIS 15*b077aed3SPierre Pronchery 16*b077aed3SPierre Pronchery #include "opt.h" 17*b077aed3SPierre Pronchery 18*b077aed3SPierre Pronchery typedef struct { ... } OPTIONS; 19*b077aed3SPierre Pronchery typedef struct { ... } OPT_PAIR; 20*b077aed3SPierre Pronchery #define OPT_COMMON 21*b077aed3SPierre Pronchery #define OPT_ERR 22*b077aed3SPierre Pronchery #define OPT_EOF 23*b077aed3SPierre Pronchery #define OPT_HELP 24*b077aed3SPierre Pronchery 25*b077aed3SPierre Pronchery char *opt_init(int argc, char **argv, const OPTIONS *o); 26*b077aed3SPierre Pronchery char *opt_progname(const char *argv0); 27*b077aed3SPierre Pronchery char *opt_appname(const char *argv0); 28*b077aed3SPierre Pronchery char *opt_getprog(void); 29*b077aed3SPierre Pronchery void opt_help(const OPTIONS *list); 30*b077aed3SPierre Pronchery 31*b077aed3SPierre Pronchery void opt_begin(void); 32*b077aed3SPierre Pronchery int opt_next(void); 33*b077aed3SPierre Pronchery char *opt_flag(void); 34*b077aed3SPierre Pronchery char *opt_arg(void); 35*b077aed3SPierre Pronchery char *opt_unknown(void); 36*b077aed3SPierre Pronchery int opt_cipher(const char *name, EVP_CIPHER **cipherp); 37*b077aed3SPierre Pronchery int opt_cipher_any(const char *name, EVP_CIPHER **cipherp); 38*b077aed3SPierre Pronchery int opt_cipher_silent(const char *name, EVP_CIPHER **cipherp); 39*b077aed3SPierre Pronchery int opt_md(const char *name, EVP_MD **mdp); 40*b077aed3SPierre Pronchery 41*b077aed3SPierre Pronchery int opt_int(const char *value, int *result); 42*b077aed3SPierre Pronchery int opt_int_arg(void); 43*b077aed3SPierre Pronchery int opt_long(const char *value, long *result); 44*b077aed3SPierre Pronchery int opt_ulong(const char *value, unsigned long *result); 45*b077aed3SPierre Pronchery int opt_intmax(const char *value, intmax_t *result); 46*b077aed3SPierre Pronchery int opt_uintmax(const char *value, uintmax_t *result); 47*b077aed3SPierre Pronchery 48*b077aed3SPierre Pronchery int opt_format(const char *s, unsigned long flags, int *result); 49*b077aed3SPierre Pronchery int opt_isdir(const char *name); 50*b077aed3SPierre Pronchery int opt_string(const char *name, const char **options); 51*b077aed3SPierre Pronchery int opt_pair(const char *name, const OPT_PAIR* pairs, int *result); 52*b077aed3SPierre Pronchery 53*b077aed3SPierre Pronchery int opt_num_rest(void); 54*b077aed3SPierre Pronchery char **opt_rest(void); 55*b077aed3SPierre Pronchery 56*b077aed3SPierre Pronchery int opt_legacy_okay(void); 57*b077aed3SPierre Pronchery 58*b077aed3SPierre Pronchery=head1 DESCRIPTION 59*b077aed3SPierre Pronchery 60*b077aed3SPierre ProncheryThe functions on this page provide a common set of option-parsing for 61*b077aed3SPierre Proncherythe OpenSSL command and the internal test programs. 62*b077aed3SPierre ProncheryIt is intended to be used like the standard getopt(3) routine, except 63*b077aed3SPierre Proncherythat multi-character flag names are supported, and a variety of parsing 64*b077aed3SPierre Proncheryand other utility functions are also provided. 65*b077aed3SPierre Pronchery 66*b077aed3SPierre ProncheryPrograms that use this should make sure to set the appropriate C<-I> 67*b077aed3SPierre Proncheryflag. 68*b077aed3SPierre Pronchery 69*b077aed3SPierre ProncheryThese routines expect a global B<BIO> named B<bio_err> to point to 70*b077aed3SPierre Proncherythe equivalent of B<stderr>. This is already done in the OpenSSL 71*b077aed3SPierre Proncheryapplication. 72*b077aed3SPierre Pronchery 73*b077aed3SPierre Pronchery=head2 Data Types 74*b077aed3SPierre Pronchery 75*b077aed3SPierre ProncheryEach program should define, near the main() routine, an enumeration 76*b077aed3SPierre Proncherythat is the set of options the program accepts. For example: 77*b077aed3SPierre Pronchery 78*b077aed3SPierre Pronchery typedef enum OPTION_choice { 79*b077aed3SPierre Pronchery OPT_COMMON, 80*b077aed3SPierre Pronchery OPT_YES, OPT_NAME, OPT_COUNT, OPT_OFILE, 81*b077aed3SPierre Pronchery ... 82*b077aed3SPierre Pronchery } OPTION_CHOICE; 83*b077aed3SPierre Pronchery 84*b077aed3SPierre ProncheryThe first two lines must appear exactly as shown. 85*b077aed3SPierre ProncheryOPT_COMMON is a macro that expands to C<OPT_ERR = -1, OPT_EOF = 0, OPT_HELP>. 86*b077aed3SPierre ProncheryIn addition to defining symbolic names for the constants that opt_next() 87*b077aed3SPierre Proncheryreturns, it also helps guarantee that every command has a C<-help> option. 88*b077aed3SPierre ProncheryThe third line is a sample 89*b077aed3SPierre Proncheryset of flags, and the closing C<typedef> name is used for error-checking 90*b077aed3SPierre Proncheryas discussed below. 91*b077aed3SPierre ProncheryBy declaring the variable as an C<OPTION_CHOICE>, with the right warning 92*b077aed3SPierre Proncheryflags, the compiler could check that all specified options are handled. 93*b077aed3SPierre Pronchery 94*b077aed3SPierre ProncheryThe B<OPTIONS> C<typedef> specifies an option: what type of argument 95*b077aed3SPierre Proncheryit takes (if any), and an optional "help" string. It is a C<struct> 96*b077aed3SPierre Proncherycontaining these fields: 97*b077aed3SPierre Pronchery 98*b077aed3SPierre Pronchery const char *name; 99*b077aed3SPierre Pronchery int retval; 100*b077aed3SPierre Pronchery int valtype; 101*b077aed3SPierre Pronchery const char *helpstr; 102*b077aed3SPierre Pronchery 103*b077aed3SPierre ProncheryThe B<name> is the name of the option that the user would type. Options 104*b077aed3SPierre Proncheryare words prefaced with a minus sign. If the user uses two minus signs, 105*b077aed3SPierre Proncherythis is also accepted for compatibility with other GNU software. Some 106*b077aed3SPierre Proncherynames are special, and are described below. 107*b077aed3SPierre Pronchery 108*b077aed3SPierre ProncheryThe B<retval> is the value to return if the option is found. It should be 109*b077aed3SPierre Proncheryone of the choices in the enumeration above. 110*b077aed3SPierre Pronchery 111*b077aed3SPierre ProncheryThe B<valtype> defines what the option's parameter must be. It should 112*b077aed3SPierre Proncherybe chosen from the following set: 113*b077aed3SPierre Pronchery 114*b077aed3SPierre Pronchery \0 No value 115*b077aed3SPierre Pronchery '-' No value 116*b077aed3SPierre Pronchery 's' A text string 117*b077aed3SPierre Pronchery '/' A directory 118*b077aed3SPierre Pronchery '<' Name of file to open for input 119*b077aed3SPierre Pronchery '>' Name of file to open for output 120*b077aed3SPierre Pronchery 'n' A signed number that fits in the C<int> type 121*b077aed3SPierre Pronchery 'p' A positive number that fits in the C<int> type 122*b077aed3SPierre Pronchery 'N' A nonnegative number that fits in the C<int> type 123*b077aed3SPierre Pronchery 'M' A signed number that fits in the C<intmax_t> type 124*b077aed3SPierre Pronchery 'U' An unsigned number that fits in the C<uintmax_t> type 125*b077aed3SPierre Pronchery 'l' A signed number that fits in the C<long> type 126*b077aed3SPierre Pronchery 'u' An unsigned number that fits in the C<unsigned long> type 127*b077aed3SPierre Pronchery 'c' File in PEM, DER, or S/MIME format 128*b077aed3SPierre Pronchery 'F' A file in PEM or DER format 129*b077aed3SPierre Pronchery 'E' Like 'F' but also allows ENGINE 130*b077aed3SPierre Pronchery 'f' Any file format 131*b077aed3SPierre Pronchery 132*b077aed3SPierre ProncheryThe B<helpstr> is what to display when the user uses the help option, 133*b077aed3SPierre Proncherywhich should be C<"help">. 134*b077aed3SPierre Pronchery 135*b077aed3SPierre ProncheryA program should declare its options right after the enumeration, 136*b077aed3SPierre Proncheryand should follow the ordering of the enumeration as this helps 137*b077aed3SPierre Proncheryreadability and maintainability: 138*b077aed3SPierre Pronchery 139*b077aed3SPierre Pronchery static OPTIONS my_options[] = { 140*b077aed3SPierre Pronchery {"help", OPT_HELP, '-', "Display this summary"}, 141*b077aed3SPierre Pronchery {"yes", OPT_YES, '-', "Print an affirmative reply"}, 142*b077aed3SPierre Pronchery {"count", OPT_COUNT, 'p', "Repeat count"}, 143*b077aed3SPierre Pronchery {"output" OPT_OFILE, '>', "Output file; default is stdout"}, 144*b077aed3SPierre Pronchery {NULL} 145*b077aed3SPierre Pronchery }; 146*b077aed3SPierre Pronchery 147*b077aed3SPierre ProncheryNote that the B<OPT_HELP> option is explicitly listed, and the list ends with 148*b077aed3SPierre Proncheryan entry of all-null's. The other two special options, B<OPT_ERR> and B<OPT_EOF> 149*b077aed3SPierre Proncheryshould not appear in the array. 150*b077aed3SPierre Pronchery 151*b077aed3SPierre ProncheryIf the help string is too long to fit into one line, it may be continued 152*b077aed3SPierre Proncheryon multiple lines; each entry should use B<OPT_MORE_STR>, like this: 153*b077aed3SPierre Pronchery 154*b077aed3SPierre Pronchery {"output" OPT_OFILE, '>', "Output file; default is stdout"}, 155*b077aed3SPierre Pronchery {OPT_MORE_STR, 0, 0, 156*b077aed3SPierre Pronchery "This flag is not really needed on Unix systems"}, 157*b077aed3SPierre Pronchery {OPT_MORE_STR, 0, 0, 158*b077aed3SPierre Pronchery "(Unix and descendents for ths win!)"} 159*b077aed3SPierre Pronchery 160*b077aed3SPierre ProncheryEach subsequent line will be indented the correct amount. 161*b077aed3SPierre Pronchery 162*b077aed3SPierre ProncheryBy default, the help display will include a standard prolog: 163*b077aed3SPierre Pronchery 164*b077aed3SPierre Pronchery Usage: PROGRAM [options] 165*b077aed3SPierre Pronchery Valid options are: 166*b077aed3SPierre Pronchery ...detailed list of options... 167*b077aed3SPierre Pronchery 168*b077aed3SPierre ProncherySometimes there are parameters that should appear in the synopsis. 169*b077aed3SPierre ProncheryUse B<OPT_HELP_STR> as the first entry in your array: 170*b077aed3SPierre Pronchery 171*b077aed3SPierre Pronchery {OPT_HELP_STR, 1, '-', Usage: %s [options] [text...]\n"} 172*b077aed3SPierre Pronchery 173*b077aed3SPierre ProncheryThe B<retval> and B<valtype> are ignored, and the B<helpstr> should 174*b077aed3SPierre Proncheryfollow the general construction as shown. The C<%s> will get the program 175*b077aed3SPierre Proncheryname. 176*b077aed3SPierre Pronchery 177*b077aed3SPierre ProncheryIf a command has a large set of options, it can be useful to break them 178*b077aed3SPierre Proncheryinto sections. Use the macro B<OPT_SECTION> or B<OPT_SECTION_STR> 179*b077aed3SPierre Proncheryto indicate this. The two lines below are equivalent: 180*b077aed3SPierre Pronchery 181*b077aed3SPierre Pronchery OPT_SECTION("Validation"), 182*b077aed3SPierre Pronchery {OPT_SECTION_STR, 1, '-', "Validation options:\n"}, 183*b077aed3SPierre Pronchery 184*b077aed3SPierre ProncheryIn addition to providing help about options, you can provide a description 185*b077aed3SPierre Proncheryof the parameters a command takes. These should appear at the end of 186*b077aed3SPierre Proncherythe options and are indicated by using B<OPT_PARAM_STR> or the 187*b077aed3SPierre ProncheryB<OPT_PARAMETERS> macro: 188*b077aed3SPierre Pronchery 189*b077aed3SPierre Pronchery OPT_PARAMETERS() 190*b077aed3SPierre Pronchery {OPT_PARAM_STR, 1, '-', "Parameters:\n"} 191*b077aed3SPierre Pronchery 192*b077aed3SPierre ProncheryEvery "option" after after this should contain the parameter and 193*b077aed3SPierre Proncherythe help string: 194*b077aed3SPierre Pronchery 195*b077aed3SPierre Pronchery {"text", 0, 0, "Words to display (optional)"}, 196*b077aed3SPierre Pronchery 197*b077aed3SPierre Pronchery=head2 Functions 198*b077aed3SPierre Pronchery 199*b077aed3SPierre ProncheryThe opt_init() function takes the I<argc> and I<argv> arguments given to main() 200*b077aed3SPierre Proncheryand a pointer I<o> to the list of options. It returns the simple program 201*b077aed3SPierre Proncheryname, as defined by opt_progname(). 202*b077aed3SPierre Pronchery 203*b077aed3SPierre ProncheryThe opt_progname() function takes the full pathname C<argv[0]> in its I<arg0> 204*b077aed3SPierre Proncheryparameter and returns 205*b077aed3SPierre Proncherythe simple short name of the executable, to be used for error messages and 206*b077aed3SPierre Proncherythe like. 207*b077aed3SPierre Pronchery 208*b077aed3SPierre ProncheryThe opt_appname() function takes in its I<argv0> parameter 209*b077aed3SPierre Proncherythe "application" name (such 210*b077aed3SPierre Proncheryas the specific command from L<openssl(1)> and appends it to the program 211*b077aed3SPierre Proncheryname. This function should only be called once. 212*b077aed3SPierre Pronchery 213*b077aed3SPierre ProncheryThe opt_getprog() function returns the value set by opt_appname(). 214*b077aed3SPierre Pronchery 215*b077aed3SPierre ProncheryThe opt_help() function takes a list of option definitions and prints a 216*b077aed3SPierre Proncherynicely-formatted output. 217*b077aed3SPierre Pronchery 218*b077aed3SPierre ProncheryThe opt_begin() function, which is called automatically by opt_init(), 219*b077aed3SPierre Proncherycan be used to reset the option parsing loop. 220*b077aed3SPierre Pronchery 221*b077aed3SPierre ProncheryThe opt_next() function is called, once opt_init() has been called, 222*b077aed3SPierre Proncheryin a loop to fetch each option in turn. It returns -1, or B<OPT_EOF> when the 223*b077aed3SPierre Proncheryend of arguments has been reached. This is typically done like this: 224*b077aed3SPierre Pronchery 225*b077aed3SPierre Pronchery prog = opt_init(argc, argv, my_options); 226*b077aed3SPierre Pronchery while ((o = opt_next()) != OPT_EOF) { 227*b077aed3SPierre Pronchery switch (o) { 228*b077aed3SPierre Pronchery case OPT_EOF: 229*b077aed3SPierre Pronchery case OPT_ERR: 230*b077aed3SPierre Pronchery opthelp: 231*b077aed3SPierre Pronchery fprintf(stderr, "%s: Use -help for summary\n", prog); 232*b077aed3SPierre Pronchery exit(1); 233*b077aed3SPierre Pronchery case OPT_HELP: 234*b077aed3SPierre Pronchery opt_help(my_options); 235*b077aed3SPierre Pronchery exit(0); 236*b077aed3SPierre Pronchery ...other options... 237*b077aed3SPierre Pronchery } 238*b077aed3SPierre Pronchery } 239*b077aed3SPierre Pronchery 240*b077aed3SPierre ProncheryWithin the option parsing loop, the following functions may be called. 241*b077aed3SPierre Pronchery 242*b077aed3SPierre ProncheryThe opt_flag() function returns the most recent option name 243*b077aed3SPierre Proncheryincluding the preceding C<->. 244*b077aed3SPierre Pronchery 245*b077aed3SPierre ProncheryThe opt_arg() function returns the option's argument value, if there is one. 246*b077aed3SPierre Pronchery 247*b077aed3SPierre ProncheryThe opt_unknown() function returns the unknown option. 248*b077aed3SPierre ProncheryIn an option list, there can be at most one option with the empty string. 249*b077aed3SPierre ProncheryThis is a "wildcard" or "unknown" option. For example, it allows an 250*b077aed3SPierre Proncheryoption to be be taken as digest algorithm, like C<-sha1>. The function 251*b077aed3SPierre Proncheryopt_md() takes the specified I<name> and fills in the digest into I<mdp>. 252*b077aed3SPierre ProncheryThe functions opt_cipher(), opt_cipher_any() and opt_cipher_silent() 253*b077aed3SPierre Proncheryeach takes the specified I<name> and fills in the cipher into I<cipherp>. 254*b077aed3SPierre ProncheryThe function opt_cipher() only accepts ciphers which are not 255*b077aed3SPierre ProncheryAEAD and are not using XTS mode. The functions opt_cipher_any() and 256*b077aed3SPierre Proncheryopt_cipher_silent() accept any cipher, the latter not emitting an error 257*b077aed3SPierre Proncheryif the cipher is not located. 258*b077aed3SPierre Pronchery 259*b077aed3SPierre ProncheryThere are a several useful functions for parsing numbers. These are 260*b077aed3SPierre Proncheryopt_int(), opt_long(), opt_ulong(), opt_intmax(), and opt_uintmax(). They all 261*b077aed3SPierre Proncherytake C<0x> to mean hexadecimal and C<0> to mean octal, and will do the 262*b077aed3SPierre Proncherynecessary range-checking. They return 1 if successful and fill in the 263*b077aed3SPierre ProncheryC<result> pointer with the value, or 0 on error. Note that opt_next() 264*b077aed3SPierre Proncherywill also do range-check on the argument if the appropriate B<valtype> 265*b077aed3SPierre Proncheryfield is specified for the option. This means that error-checking inside 266*b077aed3SPierre Proncherythe C<switch> C<case> can often be elided. 267*b077aed3SPierre Pronchery 268*b077aed3SPierre ProncheryThe opt_int_arg() function is a convenience abbreviation to opt_int(). 269*b077aed3SPierre ProncheryIt parses and returns an integer, assuming its range has been checked before. 270*b077aed3SPierre Pronchery 271*b077aed3SPierre ProncheryThe opt_format() function takes a string value, 272*b077aed3SPierre Proncherysuch as used with the B<-informat> or similar option, and fills 273*b077aed3SPierre Proncherythe value from the constants in F<fmt.h> file. 274*b077aed3SPierre Pronchery 275*b077aed3SPierre ProncheryThe opt_isdir() function returns 1 if the specified I<name> is 276*b077aed3SPierre Proncherya directory, or 0 if not. 277*b077aed3SPierre Pronchery 278*b077aed3SPierre ProncheryThe opt_string() function checks that I<name> appears in the 279*b077aed3SPierre ProncheryNULL-terminated array of strings. It returns 1 if found, 280*b077aed3SPierre Proncheryor prints a diagnostic and returns 0 if not. 281*b077aed3SPierre Pronchery 282*b077aed3SPierre ProncheryThe opt_pair() function takes a list of I<pairs>, each of which 283*b077aed3SPierre Proncheryhas a text name and an integer. The specified I<name> is 284*b077aed3SPierre Proncheryfound on the list, it puts the index in I<*result>, and returns 285*b077aed3SPierre Pronchery1. If not found, it returns 0. 286*b077aed3SPierre Pronchery 287*b077aed3SPierre ProncheryThe following functions can be used after processing all the options. 288*b077aed3SPierre Pronchery 289*b077aed3SPierre ProncheryThe opt_num_rest() function returns what is left. 290*b077aed3SPierre Pronchery 291*b077aed3SPierre ProncheryThe opt_rest() function returns a pointer to the first non-option. 292*b077aed3SPierre ProncheryIf there were no parameters, it will point to the NULL that is 293*b077aed3SPierre Proncheryat the end of the standard I<argv> array. 294*b077aed3SPierre Pronchery 295*b077aed3SPierre ProncheryThe opt_legacy_okay() function returns true if no options have been 296*b077aed3SPierre Proncheryspecified that would preclude using legacy code paths. Currently, 297*b077aed3SPierre Proncherythe various provider options preclude legacy operation. This means, 298*b077aed3SPierre Proncheryfor example, that specifying both B<-provider> and B<-engine> in the 299*b077aed3SPierre Proncherysame command line will not work as expected. 300*b077aed3SPierre Pronchery 301*b077aed3SPierre Pronchery=head2 Common Options 302*b077aed3SPierre Pronchery 303*b077aed3SPierre ProncheryThere are a few groups of options that are common to many OpenSSL programs. 304*b077aed3SPierre ProncheryThese are handled with sets of macros that define common option names 305*b077aed3SPierre Proncheryand common code to handle them. The categories are identified by a 306*b077aed3SPierre Proncheryletter: 307*b077aed3SPierre Pronchery 308*b077aed3SPierre Pronchery V Validation 309*b077aed3SPierre Pronchery X Extended certificate 310*b077aed3SPierre Pronchery S TLS/SSL 311*b077aed3SPierre Pronchery R Random state 312*b077aed3SPierre Pronchery 313*b077aed3SPierre ProncheryThe B<OPT_x_ENUM> macro is used to define the numeration values, where B<x> 314*b077aed3SPierre Proncheryis one of the letters above. The B<OPT_x_OPTIONS> macro is used to 315*b077aed3SPierre Proncherylist the set of common options, and the B<OPT_x_CASES> is used in 316*b077aed3SPierre Proncherythe C<switch> statement. 317*b077aed3SPierre Pronchery 318*b077aed3SPierre ProncheryThe common options are used throughout the sources for the OpenSSL commands. 319*b077aed3SPierre ProncheryThey are also used with common descriptions when generating the 320*b077aed3SPierre Proncherymanpages, in the file F<doc/perlvars.pm>, which follow a similar naming 321*b077aed3SPierre Proncheryconvention. 322*b077aed3SPierre Pronchery 323*b077aed3SPierre Pronchery=head1 RETURN VALUES 324*b077aed3SPierre Pronchery 325*b077aed3SPierre ProncheryDetailed above. 326*b077aed3SPierre Pronchery 327*b077aed3SPierre Pronchery=head1 EXAMPLES 328*b077aed3SPierre Pronchery 329*b077aed3SPierre ProncheryThe best examples can be found in sources for the commands in the F<apps> 330*b077aed3SPierre Proncherydirectory of the source tree. 331*b077aed3SPierre ProncheryA notable exception is F<apps/cmp.c> which uses this API, but does 332*b077aed3SPierre Proncherythings very differently. 333*b077aed3SPierre Pronchery 334*b077aed3SPierre Pronchery=head1 COPYRIGHT 335*b077aed3SPierre Pronchery 336*b077aed3SPierre ProncheryCopyright 2021 The OpenSSL Project Authors. All Rights Reserved. 337*b077aed3SPierre Pronchery 338*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use this 339*b077aed3SPierre Proncheryfile except in compliance with the License. You can obtain a copy in the file 340*b077aed3SPierre ProncheryLICENSE in the source distribution or at 341*b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>. 342*b077aed3SPierre Pronchery 343*b077aed3SPierre Pronchery=cut 344