EVP_PKEY_keygen.pod 6.7 KB
Newer Older
D
Dr. Stephen Henson 已提交
1 2 3 4
=pod

=head1 NAME

R
Rich Salz 已提交
5 6 7
EVP_PKEY_keygen_init, EVP_PKEY_keygen, EVP_PKEY_paramgen_init,
EVP_PKEY_paramgen, EVP_PKEY_CTX_set_cb, EVP_PKEY_CTX_get_cb,
EVP_PKEY_CTX_get_keygen_info, EVP_PKEY_CTX_set_app_data,
R
Rich Salz 已提交
8
EVP_PKEY_CTX_get_app_data,
9 10
EVP_PKEY_gen_cb, EVP_PKEY_check, EVP_PKEY_public_check,
EVP_PKEY_param_check
P
Paul Yang 已提交
11
- key and parameter generation and check functions
D
Dr. Stephen Henson 已提交
12 13 14 15 16 17 18 19 20 21

=head1 SYNOPSIS

 #include <openssl/evp.h>

 int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);
 int EVP_PKEY_paramgen_init(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);

22
 typedef int EVP_PKEY_gen_cb(EVP_PKEY_CTX *ctx);
D
Dr. Stephen Henson 已提交
23 24 25 26 27 28 29 30 31

 void EVP_PKEY_CTX_set_cb(EVP_PKEY_CTX *ctx, EVP_PKEY_gen_cb *cb);
 EVP_PKEY_gen_cb *EVP_PKEY_CTX_get_cb(EVP_PKEY_CTX *ctx);

 int EVP_PKEY_CTX_get_keygen_info(EVP_PKEY_CTX *ctx, int idx);

 void EVP_PKEY_CTX_set_app_data(EVP_PKEY_CTX *ctx, void *data);
 void *EVP_PKEY_CTX_get_app_data(EVP_PKEY_CTX *ctx);

P
Paul Yang 已提交
32
 int EVP_PKEY_check(EVP_PKEY_CTX *ctx);
33 34
 int EVP_PKEY_public_check(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_param_check(EVP_PKEY_CTX *ctx);
P
Paul Yang 已提交
35

D
Dr. Stephen Henson 已提交
36 37 38
=head1 DESCRIPTION

The EVP_PKEY_keygen_init() function initializes a public key algorithm
39
context using key B<pkey> for a key generation operation.
D
Dr. Stephen Henson 已提交
40

R
Rich Salz 已提交
41
The EVP_PKEY_keygen() function performs a key generation operation, the
D
Dr. Stephen Henson 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
generated key is written to B<ppkey>.

The functions EVP_PKEY_paramgen_init() and EVP_PKEY_paramgen() are similar
except parameters are generated.

The function EVP_PKEY_set_cb() sets the key or parameter generation callback
to B<cb>. The function EVP_PKEY_CTX_get_cb() returns the key or parameter
generation callback.

The function EVP_PKEY_CTX_get_keygen_info() returns parameters associated
with the generation operation. If B<idx> is -1 the total number of
parameters available is returned. Any non negative value returns the value of
that parameter. EVP_PKEY_CTX_gen_keygen_info() with a non-negative value for
B<idx> should only be called within the generation callback.

57
If the callback returns 0 then the key generation operation is aborted and an
D
Dr. Stephen Henson 已提交
58 59 60 61 62 63 64 65
error occurs. This might occur during a time consuming operation where
a user clicks on a "cancel" button.

The functions EVP_PKEY_CTX_set_app_data() and EVP_PKEY_CTX_get_app_data() set
and retrieve an opaque pointer. This can be used to set some application
defined value which can be retrieved in the callback: for example a handle
which is used to update a "progress dialog".

P
Paul Yang 已提交
66 67 68 69
EVP_PKEY_check() validates the key-pair given by B<ctx>. This function first tries
to use customized key check method in B<EVP_PKEY_METHOD> if it's present; otherwise
it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.

70 71 72 73 74 75 76 77
EVP_PKEY_public_check() validates the public component of the key-pair given by B<ctx>.
This function first tries to use customized key check method in B<EVP_PKEY_METHOD>
if it's present; otherwise it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.

EVP_PKEY_param_check() validates the algorithm parameters of the key-pair given by B<ctx>.
This function first tries to use customized key check method in B<EVP_PKEY_METHOD>
if it's present; otherwise it calls a default one defined in B<EVP_PKEY_ASN1_METHOD>.

D
Dr. Stephen Henson 已提交
78 79 80 81 82 83 84 85 86 87 88
=head1 NOTES

After the call to EVP_PKEY_keygen_init() or EVP_PKEY_paramgen_init() algorithm
specific control operations can be performed to set any appropriate parameters
for the operation.

The functions EVP_PKEY_keygen() and EVP_PKEY_paramgen() can be called more than
once on the same context if several operations are performed using the same
parameters.

The meaning of the parameters passed to the callback will depend on the
89
algorithm and the specific implementation of the algorithm. Some might not
D
Dr. Stephen Henson 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
give any useful information at all during key or parameter generation. Others
might not even call the callback.

The operation performed by key or parameter generation depends on the algorithm
used. In some cases (e.g. EC with a supplied named curve) the "generation"
option merely sets the appropriate fields in an EVP_PKEY structure.

In OpenSSL an EVP_PKEY structure containing a private key also contains the
public key components and parameters (if any). An OpenSSL private key is
equivalent to what some libraries call a "key pair". A private key can be used
in functions which require the use of a public key or parameters.

=head1 RETURN VALUES

EVP_PKEY_keygen_init(), EVP_PKEY_paramgen_init(), EVP_PKEY_keygen() and
EVP_PKEY_paramgen() 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.

109 110 111
EVP_PKEY_check(), EVP_PKEY_public_check() and EVP_PKEY_param_check() return 1
for success or others for failure. They return -2 if the operation is not supported
for the specific algorithm.
P
Paul Yang 已提交
112

D
Dr. Stephen Henson 已提交
113 114 115 116 117 118 119 120 121
=head1 EXAMPLES

Generate a 2048 bit RSA key:

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
 EVP_PKEY *pkey = NULL;
122

D
Dr. Stephen Henson 已提交
123 124
 ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
 if (!ctx)
125
     /* Error occurred */
D
Dr. Stephen Henson 已提交
126
 if (EVP_PKEY_keygen_init(ctx) <= 0)
127
     /* Error */
D
Dr. Stephen Henson 已提交
128
 if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0)
129
     /* Error */
D
Dr. Stephen Henson 已提交
130 131 132

 /* Generate key */
 if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
133
     /* Error */
D
Dr. Stephen Henson 已提交
134 135 136 137 138 139 140

Generate a key from a set of parameters:

 #include <openssl/evp.h>
 #include <openssl/rsa.h>

 EVP_PKEY_CTX *ctx;
141
 ENGINE *eng;
D
Dr. Stephen Henson 已提交
142
 EVP_PKEY *pkey = NULL, *param;
143

144 145
 /* Assumed param, eng are set up already */
 ctx = EVP_PKEY_CTX_new(param, eng);
D
Dr. Stephen Henson 已提交
146
 if (!ctx)
147
     /* Error occurred */
D
Dr. Stephen Henson 已提交
148
 if (EVP_PKEY_keygen_init(ctx) <= 0)
149
     /* Error */
D
Dr. Stephen Henson 已提交
150 151 152

 /* Generate key */
 if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
153
     /* Error */
D
Dr. Stephen Henson 已提交
154 155 156 157 158 159 160 161

Example of generation callback for OpenSSL public key implementations:

 /* Application data is a BIO to output status to */

 EVP_PKEY_CTX_set_app_data(ctx, status_bio);

 static int genpkey_cb(EVP_PKEY_CTX *ctx)
162 163 164 165
 {
     char c = '*';
     BIO *b = EVP_PKEY_CTX_get_app_data(ctx);
     int p = EVP_PKEY_CTX_get_keygen_info(ctx, 0);
166

167 168 169 170 171 172 173 174 175 176 177 178
     if (p == 0)
         c = '.';
     if (p == 1)
         c = '+';
     if (p == 2)
         c = '*';
     if (p == 3)
         c = '\n';
     BIO_write(b, &c, 1);
     (void)BIO_flush(b);
     return 1;
 }
D
Dr. Stephen Henson 已提交
179 180 181

=head1 SEE ALSO

R
Rich Salz 已提交
182 183 184 185 186 187
L<EVP_PKEY_CTX_new(3)>,
L<EVP_PKEY_encrypt(3)>,
L<EVP_PKEY_decrypt(3)>,
L<EVP_PKEY_sign(3)>,
L<EVP_PKEY_verify(3)>,
L<EVP_PKEY_verify_recover(3)>,
R
Rich Salz 已提交
188
L<EVP_PKEY_derive(3)>
D
Dr. Stephen Henson 已提交
189 190 191

=head1 HISTORY

192
These functions were first added to OpenSSL 1.0.0.
D
Dr. Stephen Henson 已提交
193

194 195 196
EVP_PKEY_check(), EVP_PKEY_public_check() and EVP_PKEY_param_check() were added
in OpenSSL 1.1.1.

R
Rich Salz 已提交
197 198
=head1 COPYRIGHT

199
Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
R
Rich Salz 已提交
200 201 202 203 204 205 206

Licensed under the OpenSSL license (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