=pod

=head1 NAME

EVP_PKEY_print_public, EVP_PKEY_print_private, EVP_PKEY_print_params - public key algorithm printing routines.

=head1 SYNOPSIS

 #include <openssl/evp.h>

 int EVP_PKEY_print_public(BIO *out, const EVP_PKEY *pkey,
				int indent, ASN1_PCTX *pctx);
 int EVP_PKEY_print_private(BIO *out, const EVP_PKEY *pkey,
				int indent, ASN1_PCTX *pctx);
 int EVP_PKEY_print_params(BIO *out, const EVP_PKEY *pkey,
				int indent, ASN1_PCTX *pctx);

=head1 DESCRIPTION

The functions EVP_PKEY_print_public(), EVP_PKEY_print_private() and
EVP_PKEY_print_params() print out the public, private or parameter components
of key B<pkey> respectively. The key is sent to BIO B<out> in human readable
form. The parameter B<indent> indicated how far the printout should be indented.

The B<pctx> parameter allows the print output to be finely tuned by using
ASN1 printing options. If B<pctx> is set to NULL then default values will
be used.

=head1 NOTES

Currently no public key algorithms include any options in the B<pctx> parameter 
parameter.

If the key does not include all the components indicated by the function then
only those contained in the key will be printed. For example passing a public
key to EVP_PKEY_print_private() will only print the public components.

=head1 RETURN VALUES

These functions all 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 public key algorithm.

=head1 SEE ALSO

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

=head1 HISTORY

These functions were first added to OpenSSL 1.0.0.

=cut
