=pod

=head1 NAME

EVP_PKEY_missing_parameters, EVP_PKEY_copy_parameters, EVP_PKEY_parameters_eq,
EVP_PKEY_cmp_parameters, EVP_PKEY_eq,
EVP_PKEY_cmp - public key parameter and comparison functions

=head1 SYNOPSIS

 #include <openssl/evp.h>

 int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey);
 int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from);

 int EVP_PKEY_parameters_eq(const EVP_PKEY *a, const EVP_PKEY *b);
 int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b);
 int EVP_PKEY_eq(const EVP_PKEY *a, const EVP_PKEY *b);
 int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b);

=head1 DESCRIPTION

The function EVP_PKEY_missing_parameters() returns 1 if the public key
parameters of B<pkey> are missing and 0 if they are present or the algorithm
doesn't use parameters.

The function EVP_PKEY_copy_parameters() copies the parameters from key
B<from> to key B<to>. An error is returned if the parameters are missing in
B<from> or present in both B<from> and B<to> and mismatch. If the parameters
in B<from> and B<to> are both present and match this function has no effect.

The function EVP_PKEY_parameters_eq() checks the parameters of keys
B<a> and B<b> for equality.

The function EVP_PKEY_eq() checks the public key components and parameters
(if present) of keys B<a> and B<b> for equality.

=head1 NOTES

The main purpose of the functions EVP_PKEY_missing_parameters() and
EVP_PKEY_copy_parameters() is to handle public keys in certificates where the
parameters are sometimes omitted from a public key if they are inherited from
the CA that signed it.

Since OpenSSL private keys contain public key components too the function
EVP_PKEY_eq() can also be used to determine if a private key matches
a public key.

EVP_PKEY_cmp() and EVP_PKEY_cmp_parameters() differ in their return values 
compared to other _cmp() functions. They are aliases for EVP_PKEY_eq() and 
EVP_PKEY_parameters_eq() functions provided for backwards compatibility 
with existing applications.

=head1 RETURN VALUES

The function EVP_PKEY_missing_parameters() returns 1 if the public key
parameters of B<pkey> are missing and 0 if they are present or the algorithm
doesn't use parameters.

These functions EVP_PKEY_copy_parameters() returns 1 for success and 0 for
failure.

The functions EVP_PKEY_cmp_parameters(), EVP_PKEY_parameters_eq(), 
EVP_PKEY_cmp() and EVP_PKEY_eq() return 1 if their
inputs match, 0 if they don't match, -1 if the key types are different and
-2 if the operation is not supported.

=head1 SEE ALSO

L<EVP_PKEY_CTX_new(3)>,
L<EVP_PKEY_keygen(3)>

=head1 HISTORY

EVP_PKEY_eq() and EVP_PKEY_parameters_eq() were added in OpenSSL 3.0 to 
avoid confusion on the return values of EVP_PKEY_cmp() and 
EVP_PKEY_cmp_parameters() which unlike other _cmp()
functions do not return 0 in case their arguments are equal.

=head1 COPYRIGHT

Copyright 2006-2020 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
