Latest update
This commit is contained in:
@@ -3,8 +3,9 @@
|
||||
=head1 NAME
|
||||
|
||||
CRYPTO_EX_new, CRYPTO_EX_free, CRYPTO_EX_dup,
|
||||
CRYPTO_free_ex_index, CRYPTO_get_ex_new_index, CRYPTO_set_ex_data,
|
||||
CRYPTO_get_ex_data, CRYPTO_free_ex_data, CRYPTO_new_ex_data
|
||||
CRYPTO_free_ex_index, CRYPTO_get_ex_new_index,
|
||||
CRYPTO_alloc_ex_data, CRYPTO_set_ex_data, CRYPTO_get_ex_data,
|
||||
CRYPTO_free_ex_data, CRYPTO_new_ex_data
|
||||
- functions supporting application-specific data
|
||||
|
||||
=head1 SYNOPSIS
|
||||
@@ -26,6 +27,9 @@ CRYPTO_get_ex_data, CRYPTO_free_ex_data, CRYPTO_new_ex_data
|
||||
|
||||
int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad)
|
||||
|
||||
int CRYPTO_alloc_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad,
|
||||
int idx);
|
||||
|
||||
int CRYPTO_set_ex_data(CRYPTO_EX_DATA *r, int idx, void *arg);
|
||||
|
||||
void *CRYPTO_get_ex_data(CRYPTO_EX_DATA *r, int idx);
|
||||
@@ -114,7 +118,8 @@ new_func() is called for every defined index. There is no requirement
|
||||
that the entire parent, or containing, structure has been set up.
|
||||
The new_func() is typically used only to allocate memory to store the
|
||||
exdata, and perhaps an "initialized" flag within that memory.
|
||||
The exdata value should be set by calling CRYPTO_set_ex_data().
|
||||
The exdata value may be allocated later on with CRYPTO_alloc_ex_data(),
|
||||
or may be set by calling CRYPTO_set_ex_data().
|
||||
|
||||
When a structure is free'd (such as SSL_CTX_free()) then the
|
||||
free_func() is called for every defined index. Again, the state of the
|
||||
@@ -147,14 +152,18 @@ will fail.
|
||||
|
||||
CRYPTO_get_ex_new_index() returns a new index or -1 on failure.
|
||||
|
||||
CRYPTO_free_ex_index() and
|
||||
CRYPTO_set_ex_data() return 1 on success or 0 on failure.
|
||||
CRYPTO_free_ex_index(), CRYPTO_alloc_ex_data() and CRYPTO_set_ex_data()
|
||||
return 1 on success or 0 on failure.
|
||||
|
||||
CRYPTO_get_ex_data() returns the application data or NULL on failure;
|
||||
note that NULL may be a valid value.
|
||||
|
||||
dup_func() should return 0 for failure and 1 for success.
|
||||
|
||||
=head1 HISTORY
|
||||
|
||||
CRYPTO_alloc_ex_data() was added in OpenSSL 3.0.0.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
@@ -11,7 +11,7 @@ EC_GROUP_get_point_conversion_form, EC_GROUP_get0_seed,
|
||||
EC_GROUP_get_seed_len, EC_GROUP_set_seed, EC_GROUP_get_degree,
|
||||
EC_GROUP_check, EC_GROUP_check_discriminant, EC_GROUP_cmp,
|
||||
EC_GROUP_get_basis_type, EC_GROUP_get_trinomial_basis,
|
||||
EC_GROUP_get_pentanomial_basis
|
||||
EC_GROUP_get_pentanomial_basis, EC_GROUP_get0_field
|
||||
- Functions for manipulating EC_GROUP objects
|
||||
|
||||
=head1 SYNOPSIS
|
||||
@@ -32,6 +32,7 @@ EC_GROUP_get_pentanomial_basis
|
||||
int EC_GROUP_order_bits(const EC_GROUP *group);
|
||||
int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor, BN_CTX *ctx);
|
||||
const BIGNUM *EC_GROUP_get0_cofactor(const EC_GROUP *group);
|
||||
const BIGNUM *EC_GROUP_get0_field(const EC_GROUP *group);
|
||||
|
||||
void EC_GROUP_set_curve_name(EC_GROUP *group, int nid);
|
||||
int EC_GROUP_get_curve_name(const EC_GROUP *group);
|
||||
@@ -177,6 +178,8 @@ specified curve respectively. If there is no curve name associated with a curve
|
||||
EC_GROUP_get0_order() returns an internal pointer to the group order.
|
||||
EC_GROUP_order_bits() returns the number of bits in the group order.
|
||||
EC_GROUP_get0_cofactor() returns an internal pointer to the group cofactor.
|
||||
EC_GROUP_get0_field() returns an internal pointer to the group field. For curves over GF(p), this is the modulus; for curves
|
||||
over GF(2^m), this is the irreducible polynomial defining the field.
|
||||
|
||||
EC_GROUP_get0_seed returns a pointer to the seed that was used to generate the parameter b, or NULL if the seed is not
|
||||
specified. EC_GROUP_get_seed_len returns the length of the seed or 0 if the seed is not specified.
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
EVP_KDF_CTX, EVP_KDF_CTX_new_id, EVP_KDF_CTX_free, EVP_KDF_reset,
|
||||
EVP_KDF_ctrl, EVP_KDF_vctrl, EVP_KDF_ctrl_str, EVP_KDF_size,
|
||||
EVP_KDF_derive - EVP KDF routines
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/kdf.h>
|
||||
|
||||
typedef struct evp_kdf_ctx_st EVP_KDF_CTX;
|
||||
|
||||
EVP_KDF_CTX *EVP_KDF_CTX_new_id(int id);
|
||||
void EVP_KDF_CTX_free(EVP_KDF_CTX *ctx);
|
||||
void EVP_KDF_reset(EVP_KDF_CTX *ctx);
|
||||
int EVP_KDF_ctrl(EVP_KDF_CTX *ctx, int cmd, ...);
|
||||
int EVP_KDF_vctrl(EVP_KDF_CTX *ctx, int cmd, va_list args);
|
||||
int EVP_KDF_ctrl_str(EVP_KDF_CTX *ctx, const char *type, const char *value);
|
||||
size_t EVP_KDF_size(EVP_KDF_CTX *ctx);
|
||||
int EVP_KDF_derive(EVP_KDF_CTX *ctx, unsigned char *key, size_t keylen);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
The EVP KDF routines are a high level interface to Key Derivation Function
|
||||
algorithms and should be used instead of algorithm-specific functions.
|
||||
|
||||
After creating a C<EVP_KDF_CTX> for the required algorithm using
|
||||
EVP_KDF_CTX_new_id(), inputs to the algorithm are supplied using calls to
|
||||
EVP_KDF_ctrl(), EVP_KDF_vctrl() or EVP_KDF_ctrl_str() before calling
|
||||
EVP_KDF_derive() to derive the key.
|
||||
|
||||
=head2 Types
|
||||
|
||||
B<EVP_KDF_CTX> is a context type that holds the algorithm inputs.
|
||||
|
||||
=head2 Context manipulation functions
|
||||
|
||||
EVP_KDF_CTX_new_id() creates a KDF context for the algorithm identified by the
|
||||
specified NID.
|
||||
|
||||
EVP_KDF_CTX_free() frees up the context C<ctx>. If C<ctx> is C<NULL>, nothing
|
||||
is done.
|
||||
|
||||
=head2 Computing functions
|
||||
|
||||
EVP_KDF_reset() resets the context to the default state as if the context
|
||||
had just been created.
|
||||
|
||||
EVP_KDF_ctrl() is used to provide inputs to the KDF algorithm prior to
|
||||
EVP_KDF_derive() being called. The inputs that may be provided will vary
|
||||
depending on the KDF algorithm or its implementation. This functions takes
|
||||
variable arguments, the exact expected arguments depend on C<cmd>.
|
||||
See L</CONTROLS> below for a description of standard controls.
|
||||
|
||||
EVP_KDF_vctrl() is the variant of EVP_KDF_ctrl() that takes a C<va_list>
|
||||
argument instead of variadic arguments.
|
||||
|
||||
EVP_KDF_ctrl_str() allows an application to send an algorithm specific control
|
||||
operation to a context C<ctx> in string form. This is intended to be used for
|
||||
options specified on the command line or in text files.
|
||||
|
||||
EVP_KDF_size() returns the output size if the algorithm produces a fixed amount
|
||||
of output and C<SIZE_MAX> otherwise. If an error occurs then 0 is returned.
|
||||
For some algorithms an error may result if input parameters necessary to
|
||||
calculate a fixed output size have not yet been supplied.
|
||||
|
||||
EVP_KDF_derive() derives C<keylen> bytes of key material and places it in the
|
||||
C<key> buffer. If the algorithm produces a fixed amount of output then an
|
||||
error will occur unless the C<keylen> parameter is equal to that output size,
|
||||
as returned by EVP_KDF_size().
|
||||
|
||||
=head1 CONTROLS
|
||||
|
||||
The standard controls are:
|
||||
|
||||
=over 4
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_PASS>
|
||||
|
||||
This control expects two arguments: C<unsigned char *pass>, C<size_t passlen>
|
||||
|
||||
Some KDF implementations require a password. For those KDF implementations
|
||||
that support it, this control sets the password.
|
||||
|
||||
EVP_KDF_ctrl_str() takes two type strings for this control:
|
||||
|
||||
=over 4
|
||||
|
||||
=item "pass"
|
||||
|
||||
The value string is used as is.
|
||||
|
||||
=item "hexpass"
|
||||
|
||||
The value string is expected to be a hexadecimal number, which will be
|
||||
decoded before being passed on as the control value.
|
||||
|
||||
=back
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_SALT>
|
||||
|
||||
This control expects two arguments: C<unsigned char *salt>, C<size_t saltlen>
|
||||
|
||||
Some KDF implementations can take a salt. For those KDF implementations that
|
||||
support it, this control sets the salt.
|
||||
|
||||
The default value, if any, is implementation dependent.
|
||||
|
||||
EVP_KDF_ctrl_str() takes two type strings for this control:
|
||||
|
||||
=over 4
|
||||
|
||||
=item "salt"
|
||||
|
||||
The value string is used as is.
|
||||
|
||||
=item "hexsalt"
|
||||
|
||||
The value string is expected to be a hexadecimal number, which will be
|
||||
decoded before being passed on as the control value.
|
||||
|
||||
=back
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_ITER>
|
||||
|
||||
This control expects one argument: C<int iter>
|
||||
|
||||
Some KDF implementations require an iteration count. For those KDF implementations that support it, this control sets the iteration count.
|
||||
|
||||
The default value, if any, is implementation dependent.
|
||||
|
||||
EVP_KDF_ctrl_str() type string: "iter"
|
||||
|
||||
The value string is expected to be a decimal number.
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_MD>
|
||||
|
||||
This control expects one argument: C<EVP_MD *md>
|
||||
|
||||
For MAC implementations that use a message digest as an underlying computation
|
||||
algorithm, this control set what the digest algorithm should be.
|
||||
|
||||
EVP_KDF_ctrl_str() type string: "md"
|
||||
|
||||
The value string is expected to be the name of a digest.
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_KEY>
|
||||
|
||||
This control expects two arguments: C<unsigned char *key>, C<size_t keylen>
|
||||
|
||||
Some KDF implementations require a key. For those KDF implementations that
|
||||
support it, this control sets the key.
|
||||
|
||||
EVP_KDF_ctrl_str() takes two type strings for this control:
|
||||
|
||||
=over 4
|
||||
|
||||
=item "key"
|
||||
|
||||
The value string is used as is.
|
||||
|
||||
=item "hexkey"
|
||||
|
||||
The value string is expected to be a hexadecimal number, which will be
|
||||
decoded before being passed on as the control value.
|
||||
|
||||
=back
|
||||
|
||||
=item B<EVP_KDF_CTRL_SET_MAXMEM_BYTES>
|
||||
|
||||
This control expects one argument: C<uint64_t maxmem_bytes>
|
||||
|
||||
Memory-hard password-based KDF algorithms, such as scrypt, use an amount of
|
||||
memory that depends on the load factors provided as input. For those KDF
|
||||
implementations that support it, this control sets an upper limit on the amount
|
||||
of memory that may be consumed while performing a key derivation. If this
|
||||
memory usage limit is exceeded because the load factors are chosen too high,
|
||||
the key derivation will fail.
|
||||
|
||||
The default value is implementation dependent.
|
||||
|
||||
EVP_KDF_ctrl_str() type string: "maxmem_bytes"
|
||||
|
||||
The value string is expected to be a decimal number.
|
||||
|
||||
=back
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
EVP_KDF_CTX_new_id() returns either the newly allocated C<EVP_KDF_CTX>
|
||||
structure or C<NULL> if an error occurred.
|
||||
|
||||
EVP_KDF_CTX_free() and EVP_KDF_reset() do not return a value.
|
||||
|
||||
EVP_KDF_size() returns the output size. C<SIZE_MAX> is returned to indicate
|
||||
that the algorithm produces a variable amount of output; 0 to indicate failure.
|
||||
|
||||
The remaining functions return 1 for success and 0 or a negative value for
|
||||
failure. In particular, a return value of -2 indicates the operation is not
|
||||
supported by the KDF algorithm.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<EVP_KDF_SCRYPT(7)>
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
this file except in compliance with the License. You can obtain a copy
|
||||
in the file LICENSE in the source distribution or at
|
||||
L<https://www.openssl.org/source/license.html>.
|
||||
|
||||
=cut
|
||||
@@ -0,0 +1,48 @@
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
OPENSSL_CTX, OPENSSL_CTX_new, OPENSSL_CTX_free - OpenSSL library context
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
|
||||
typedef struct openssl_ctx_st OPENSSL_CTX;
|
||||
|
||||
OPENSSL_CTX *OPENSSL_CTX_new(void);
|
||||
void OPENSSL_CTX_free(OPENSSL_CTX *ctx);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
C<OPENSSL_CTX> is an internal OpenSSL library context type.
|
||||
Applications may allocate their own, but may also use C<NULL> to use
|
||||
the internal default context with functions that take a C<OPENSSL_CTX>
|
||||
argument.
|
||||
|
||||
OPENSSL_CTX_new() creates a new OpenSSL library context.
|
||||
|
||||
OPENSSL_CTX_free() frees the given C<ctx>.
|
||||
|
||||
=head1 RETURN VALUES
|
||||
|
||||
OPENSSL_CTX_new() return a library context pointer on success, or
|
||||
C<NULL> on error.
|
||||
|
||||
OPENSSL_CTX_free() doesn't return any value.
|
||||
|
||||
=head1 HISTORY
|
||||
|
||||
OPENSSL_CTX, OPENSSL_CTX_new() and OPENSSL_CTX_free()
|
||||
were added in OpenSSL 3.0.0.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
this file except in compliance with the License. You can obtain a copy
|
||||
in the file LICENSE in the source distribution or at
|
||||
L<https://www.openssl.org/source/license.html>.
|
||||
|
||||
=cut
|
||||
@@ -6,7 +6,7 @@ LHASH, DECLARE_LHASH_OF,
|
||||
OPENSSL_LH_COMPFUNC, OPENSSL_LH_HASHFUNC, OPENSSL_LH_DOALL_FUNC,
|
||||
LHASH_DOALL_ARG_FN_TYPE,
|
||||
IMPLEMENT_LHASH_HASH_FN, IMPLEMENT_LHASH_COMP_FN,
|
||||
lh_TYPE_new, lh_TYPE_free,
|
||||
lh_TYPE_new, lh_TYPE_free, lh_TYPE_flush,
|
||||
lh_TYPE_insert, lh_TYPE_delete, lh_TYPE_retrieve,
|
||||
lh_TYPE_doall, lh_TYPE_doall_arg, lh_TYPE_error - dynamic hash table
|
||||
|
||||
@@ -20,6 +20,7 @@ lh_TYPE_doall, lh_TYPE_doall_arg, lh_TYPE_error - dynamic hash table
|
||||
|
||||
LHASH *lh_TYPE_new(OPENSSL_LH_HASHFUNC hash, OPENSSL_LH_COMPFUNC compare);
|
||||
void lh_TYPE_free(LHASH_OF(TYPE) *table);
|
||||
void lh_TYPE_flush(LHASH_OF(TYPE) *table);
|
||||
|
||||
TYPE *lh_TYPE_insert(LHASH_OF(TYPE) *table, TYPE *data);
|
||||
TYPE *lh_TYPE_delete(LHASH_OF(TYPE) *table, TYPE *data);
|
||||
@@ -95,6 +96,11 @@ B<table>. Allocated hash table entries will not be freed; consider
|
||||
using lh_TYPE_doall() to deallocate any remaining entries in the
|
||||
hash table (see below).
|
||||
|
||||
lh_TYPE_flush() empties the B<LHASH_OF(TYPE)> structure B<table>. New
|
||||
entries can be added to the flushed table. Allocated hash table entries
|
||||
will not be freed; consider using lh_TYPE_doall() to deallocate any
|
||||
remaining entries in the hash table (see below).
|
||||
|
||||
lh_TYPE_insert() inserts the structure pointed to by B<data> into
|
||||
B<table>. If there already is an entry with the same key, the old
|
||||
value is replaced. Note that lh_TYPE_insert() stores pointers, the
|
||||
@@ -173,7 +179,8 @@ B<NULL> otherwise.
|
||||
lh_TYPE_error() returns 1 if an error occurred in the last operation, 0
|
||||
otherwise. It's meaningful only after non-retrieve operations.
|
||||
|
||||
lh_TYPE_free(), lh_TYPE_doall() and lh_TYPE_doall_arg() return no values.
|
||||
lh_TYPE_free(), lh_TYPE_flush, lh_TYPE_doall() and lh_TYPE_doall_arg()
|
||||
return no values.
|
||||
|
||||
=head1 NOTE
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ RIPEMD-160 hash function
|
||||
unsigned char *md);
|
||||
|
||||
int RIPEMD160_Init(RIPEMD160_CTX *c);
|
||||
int RIPEMD160_Update(RIPEMD_CTX *c, const void *data, unsigned long len);
|
||||
int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, unsigned long len);
|
||||
int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -308,11 +308,6 @@ Attempts to pad TLSv1.3 records so that they are a multiple of B<value> in
|
||||
length on send. A B<value> of 0 or 1 turns off padding. Otherwise, the
|
||||
B<value> must be >1 or <=16384.
|
||||
|
||||
=item B<NoRenegotiation>
|
||||
|
||||
Disables all attempts at renegotiation in TLSv1.2 and earlier, same as setting
|
||||
B<SSL_OP_NO_RENEGOTIATION>.
|
||||
|
||||
=item B<SignatureAlgorithms>
|
||||
|
||||
This sets the supported signature algorithms for TLSv1.2 and TLSv1.3.
|
||||
@@ -456,6 +451,9 @@ Only used by servers.
|
||||
B<NoResumptionOnRenegotiation>: set
|
||||
B<SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION> flag. Only used by servers.
|
||||
|
||||
B<NoRenegotiation>: disables all attempts at renegotiation in TLSv1.2 and
|
||||
earlier, same as setting B<SSL_OP_NO_RENEGOTIATION>.
|
||||
|
||||
B<UnsafeLegacyRenegotiation>: permits the use of unsafe legacy renegotiation.
|
||||
Equivalent to B<SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION>.
|
||||
|
||||
@@ -486,6 +484,10 @@ specification. Some applications may be able to mitigate the replay risks in
|
||||
other ways and in such cases the built-in OpenSSL functionality is not required.
|
||||
Disabling anti-replay is equivalent to setting B<SSL_OP_NO_ANTI_REPLAY>.
|
||||
|
||||
B<ExtendedMasterSecret>: use extended master secret extension, enabled by
|
||||
default. Inverse of B<SSL_OP_NO_EXTENDED_MASTER_SECRET>: that is,
|
||||
B<-ExtendedMasterSecret> is the same as setting B<SSL_OP_NO_EXTENDED_MASTER_SECRET>.
|
||||
|
||||
=item B<VerifyMode>
|
||||
|
||||
The B<value> argument is a comma separated list of flags to set.
|
||||
|
||||
@@ -92,17 +92,13 @@ Callback has been called due to an alert being sent or received.
|
||||
|
||||
=item SSL_CB_HANDSHAKE_START
|
||||
|
||||
Callback has been called because a new handshake is started. In TLSv1.3 this is
|
||||
also used for the start of post-handshake message exchanges such as for the
|
||||
exchange of session tickets, or for key updates. It also occurs when resuming a
|
||||
handshake following a pause to handle early data.
|
||||
Callback has been called because a new handshake is started. It also occurs when
|
||||
resuming a handshake following a pause to handle early data.
|
||||
|
||||
=item SSL_CB_HANDSHAKE_DONE 0x20
|
||||
=item SSL_CB_HANDSHAKE_DONE
|
||||
|
||||
Callback has been called because a handshake is finished. In TLSv1.3 this is
|
||||
also used at the end of an exchange of post-handshake messages such as for
|
||||
session tickets or key updates. It also occurs if the handshake is paused to
|
||||
allow the exchange of early data.
|
||||
Callback has been called because a handshake is finished. It also occurs if the
|
||||
handshake is paused to allow the exchange of early data.
|
||||
|
||||
=back
|
||||
|
||||
|
||||
@@ -198,6 +198,14 @@ RFC7366 Encrypt-then-MAC option on TLS and DTLS connection.
|
||||
If this option is set, Encrypt-then-MAC is disabled. Clients will not
|
||||
propose, and servers will not accept the extension.
|
||||
|
||||
=item SSL_OP_NO_EXTENDED_MASTER_SECRET
|
||||
|
||||
Normally clients and servers will transparently attempt to negotiate the
|
||||
RFC7627 Extended Master Secret option on TLS and DTLS connection.
|
||||
|
||||
If this option is set, Extended Master Secret is disabled. Clients will
|
||||
not propose, and servers will not accept the extension.
|
||||
|
||||
=item SSL_OP_NO_RENEGOTIATION
|
||||
|
||||
Disable all renegotiation in TLSv1.2 and earlier. Do not send HelloRequest
|
||||
@@ -366,9 +374,11 @@ OpenSSL 0.9.8m.
|
||||
The B<SSL_OP_PRIORITIZE_CHACHA> and B<SSL_OP_NO_RENEGOTIATION> options
|
||||
were added in OpenSSL 1.1.1.
|
||||
|
||||
The B<SSL_OP_NO_EXTENDED_MASTER_SECRET> option was added in OpenSSL 3.0.0.
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
Copyright 2001-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
|
||||
Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
this file except in compliance with the License. You can obtain a copy
|
||||
|
||||
Reference in New Issue
Block a user