Blame doc/man3/EVP_PKEY_keygen.pod

Packit c4476c
=pod
Packit c4476c
Packit c4476c
=head1 NAME
Packit c4476c
Packit c4476c
EVP_PKEY_keygen_init, EVP_PKEY_keygen, EVP_PKEY_paramgen_init,
Packit c4476c
EVP_PKEY_paramgen, EVP_PKEY_CTX_set_cb, EVP_PKEY_CTX_get_cb,
Packit c4476c
EVP_PKEY_CTX_get_keygen_info, EVP_PKEY_CTX_set_app_data,
Packit c4476c
EVP_PKEY_CTX_get_app_data,
Packit c4476c
EVP_PKEY_gen_cb, EVP_PKEY_check, EVP_PKEY_public_check,
Packit c4476c
EVP_PKEY_param_check
Packit c4476c
- key and parameter generation and check functions
Packit c4476c
Packit c4476c
=head1 SYNOPSIS
Packit c4476c
Packit c4476c
 #include <openssl/evp.h>
Packit c4476c
Packit c4476c
 int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx);
Packit c4476c
 int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);
Packit c4476c
 int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx);
Packit c4476c
 int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);
Packit c4476c
Packit c4476c
 typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx);
Packit c4476c
Packit c4476c
 void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb);
Packit c4476c
 EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx);
Packit c4476c
Packit c4476c
 int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx);
Packit c4476c
Packit c4476c
 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data);
Packit c4476c
 void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx);
Packit c4476c
Packit c4476c
 int EVP_PKEY_check(EVP_PKEY_CTX *ctx);
Packit c4476c
 int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx);
Packit c4476c
 int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx);
Packit c4476c
Packit c4476c
=head1 DESCRIPTION
Packit c4476c
Packit c4476c
The EVP_PKEY_keygen_init() function initializes a public key algorithm
Packit c4476c
context using key B<pkey> for a key generation operation.
Packit c4476c
Packit c4476c
The EVP_PKEY_keygen() function performs a key generation operation, the
Packit c4476c
generated key is written to B<ppkey>.
Packit c4476c
Packit c4476c
The functions EVP_PKEY_paramgen_init() and EVP_PKEY_paramgen() are similar
Packit c4476c
except parameters are generated.
Packit c4476c
Packit c4476c
The function EVP_PKEY_set_cb() sets the key or parameter generation callback
Packit c4476c
to B<cb>. The function EVP_PKEY_CTX_get_cb() returns the key or parameter
Packit c4476c
generation callback.
Packit c4476c
Packit c4476c
The function EVP_PKEY_CTX_get_keygen_info() returns parameters associated
Packit c4476c
with the generation operation. If B<idx> is -1 the total number of
Packit c4476c
parameters available is returned. Any non negative value returns the value of
Packit c4476c
that parameter. EVP_PKEY_CTX_gen_keygen_info() with a non-negative value for
Packit c4476c
B<idx> should only be called within the generation callback.
Packit c4476c
Packit c4476c
If the callback returns 0 then the key generation operation is aborted and an
Packit c4476c
error occurs. This might occur during a time consuming operation where
Packit c4476c
a user clicks on a "cancel" button.
Packit c4476c
Packit c4476c
The functions EVP_PKEY_CTX_set_app_data() and EVP_PKEY_CTX_get_app_data() set
Packit c4476c
and retrieve an opaque pointer. This can be used to set some application
Packit c4476c
defined value which can be retrieved in the callback: for example a handle
Packit c4476c
which is used to update a "progress dialog".
Packit c4476c
Packit c4476c
EVP_PKEY_check() validates the key-pair given by B<ctx>. This function first tries
Packit c4476c
to use customized key check method in B<EVP_PKEY_METHOD> if it's present; otherwise
Packit c4476c
it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.
Packit c4476c
Packit c4476c
EVP_PKEY_public_check() validates the public component of the key-pair given by B<ctx>.
Packit c4476c
This function first tries to use customized key check method in B<EVP_PKEY_METHOD>
Packit c4476c
if it's present; otherwise it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.
Packit c4476c
Packit c4476c
EVP_PKEY_param_check() validates the algorithm parameters of the key-pair given by B<ctx>.
Packit c4476c
This function first tries to use customized key check method in B<EVP_PKEY_METHOD>
Packit c4476c
if it's present; otherwise it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.
Packit c4476c
Packit c4476c
=head1 NOTES
Packit c4476c
Packit c4476c
After the call to EVP_PKEY_keygen_init() or EVP_PKEY_paramgen_init() algorithm
Packit c4476c
specific control operations can be performed to set any appropriate parameters
Packit c4476c
for the operation.
Packit c4476c
Packit c4476c
The functions EVP_PKEY_keygen() and EVP_PKEY_paramgen() can be called more than
Packit c4476c
once on the same context if several operations are performed using the same
Packit c4476c
parameters.
Packit c4476c
Packit c4476c
The meaning of the parameters passed to the callback will depend on the
Packit c4476c
algorithm and the specific implementation of the algorithm. Some might not
Packit c4476c
give any useful information at all during key or parameter generation. Others
Packit c4476c
might not even call the callback.
Packit c4476c
Packit c4476c
The operation performed by key or parameter generation depends on the algorithm
Packit c4476c
used. In some cases (e.g. EC with a supplied named curve) the "generation"
Packit c4476c
option merely sets the appropriate fields in an EVP_PKEY structure.
Packit c4476c
Packit c4476c
In OpenSSL an EVP_PKEY structure containing a private key also contains the
Packit c4476c
public key components and parameters (if any). An OpenSSL private key is
Packit c4476c
equivalent to what some libraries call a "key pair". A private key can be used
Packit c4476c
in functions which require the use of a public key or parameters.
Packit c4476c
Packit c4476c
=head1 RETURN VALUES
Packit c4476c
Packit c4476c
EVP_PKEY_keygen_init(), EVP_PKEY_paramgen_init(), EVP_PKEY_keygen() and
Packit c4476c
EVP_PKEY_paramgen() return 1 for success and 0 or a negative value for failure.
Packit c4476c
In particular a return value of -2 indicates the operation is not supported by
Packit c4476c
the public key algorithm.
Packit c4476c
Packit c4476c
EVP_PKEY_check(), EVP_PKEY_public_check() and EVP_PKEY_param_check() return 1
Packit c4476c
for success or others for failure. They return -2 if the operation is not supported
Packit c4476c
for the specific algorithm.
Packit c4476c
Packit c4476c
=head1 EXAMPLES
Packit c4476c
Packit c4476c
Generate a 2048 bit RSA key:
Packit c4476c
Packit c4476c
 #include <openssl/evp.h>
Packit c4476c
 #include <openssl/rsa.h>
Packit c4476c
Packit c4476c
 EVP_PKEY_CTX *ctx;
Packit c4476c
 EVP_PKEY *pkey = NULL;
Packit c4476c
Packit c4476c
 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
Packit c4476c
 if (!ctx)
Packit c4476c
     /* Error occurred */
Packit c4476c
 if (EVP_PKEY_keygen_init(ctx) <= 0)
Packit c4476c
     /* Error */
Packit c4476c
 if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0)
Packit c4476c
     /* Error */
Packit c4476c
Packit c4476c
 /* Generate key */
Packit c4476c
 if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
Packit c4476c
     /* Error */
Packit c4476c
Packit c4476c
Generate a key from a set of parameters:
Packit c4476c
Packit c4476c
 #include <openssl/evp.h>
Packit c4476c
 #include <openssl/rsa.h>
Packit c4476c
Packit c4476c
 EVP_PKEY_CTX *ctx;
Packit c4476c
 ENGINE *eng;
Packit c4476c
 EVP_PKEY *pkey = NULL, *param;
Packit c4476c
Packit c4476c
 /* Assumed param, eng are set up already */
Packit c4476c
 ctx = EVP_PKEY_CTX_new(param, eng);
Packit c4476c
 if (!ctx)
Packit c4476c
     /* Error occurred */
Packit c4476c
 if (EVP_PKEY_keygen_init(ctx) <= 0)
Packit c4476c
     /* Error */
Packit c4476c
Packit c4476c
 /* Generate key */
Packit c4476c
 if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
Packit c4476c
     /* Error */
Packit c4476c
Packit c4476c
Example of generation callback for OpenSSL public key implementations:
Packit c4476c
Packit c4476c
 /* Application data is a BIO to output status to */
Packit c4476c
Packit c4476c
 EVP_PKEY_CTX_set_app_data(ctx, status_bio);
Packit c4476c
Packit c4476c
 static int genpkey_cb(EVP_PKEY_CTX *ctx)
Packit c4476c
 {
Packit c4476c
     char c = '*';
Packit c4476c
     BIO *b = EVP_PKEY_CTX_get_app_data(ctx);
Packit c4476c
     int p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
Packit c4476c
Packit c4476c
     if (p == 0)
Packit c4476c
         c = '.';
Packit c4476c
     if (p == 1)
Packit c4476c
         c = '+';
Packit c4476c
     if (p == 2)
Packit c4476c
         c = '*';
Packit c4476c
     if (p == 3)
Packit c4476c
         c = '\n';
Packit c4476c
     BIO_write(b, &c, 1);
Packit c4476c
     (void)BIO_flush(b);
Packit c4476c
     return 1;
Packit c4476c
 }
Packit c4476c
Packit c4476c
=head1 SEE ALSO
Packit c4476c
Packit c4476c
L<EVP_PKEY_CTX_new(3)>,
Packit c4476c
L<EVP_PKEY_encrypt(3)>,
Packit c4476c
L<EVP_PKEY_decrypt(3)>,
Packit c4476c
L<EVP_PKEY_sign(3)>,
Packit c4476c
L<EVP_PKEY_verify(3)>,
Packit c4476c
L<EVP_PKEY_verify_recover(3)>,
Packit c4476c
L<EVP_PKEY_derive(3)>
Packit c4476c
Packit c4476c
=head1 HISTORY
Packit c4476c
Packit c4476c
These functions were added in OpenSSL 1.0.0.
Packit c4476c
Packit c4476c
EVP_PKEY_check(), EVP_PKEY_public_check() and EVP_PKEY_param_check() were added
Packit c4476c
in OpenSSL 1.1.1.
Packit c4476c
Packit c4476c
=head1 COPYRIGHT
Packit c4476c
Packit c4476c
Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
Packit c4476c
Packit c4476c
Licensed under the OpenSSL license (the "License").  You may not use
Packit c4476c
this file except in compliance with the License.  You can obtain a copy
Packit c4476c
in the file LICENSE in the source distribution or at
Packit c4476c
L<https://www.openssl.org/source/license.html>.
Packit c4476c
Packit c4476c
=cut