=pod

=head1 NAME

RSA_generate_key_ex, RSA_generate_key - generate RSA key pair

=head1 SYNOPSIS

 #include <openssl/rsa.h>

 int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);

Deprecated:

 #if OPENSSL_API_COMPAT < 0x00908000L
 RSA *RSA_generate_key(int num, unsigned long e,
    void (*callback)(int, int, void *), void *cb_arg);
 #endif

=head1 DESCRIPTION

RSA_generate_key_ex() generates a key pair and stores it in the B<RSA>
structure provided in B<rsa>. The pseudo-random number generator must
be seeded prior to calling RSA_generate_key_ex().

The modulus size will be of length B<bits>, and the public exponent will be
B<e>. Key sizes with B<num> E<lt> 1024 should be considered insecure.
The exponent is an odd number, typically 3, 17 or 65537.

A callback function may be used to provide feedback about the
progress of the key generation. If B<cb> is not B<NULL>, it
will be called as follows using the BN_GENCB_call() function
described on the L<BN_generate_prime(3)> page.

=over 4

=item *

While a random prime number is generated, it is called as
described in L<BN_generate_prime(3)>.

=item *

When the n-th randomly generated prime is rejected as not
suitable for the key, B<BN_GENCB_call(cb, 2, n)> is called.

=item *

When a random p has been found with p-1 relatively prime to B<e>,
it is called as B<BN_GENCB_call(cb, 3, 0)>.

=back

The process is then repeated for prime q with B<BN_GENCB_call(cb, 3, 1)>.

RSA_generate_key() is deprecated (new applications should use
RSA_generate_key_ex() instead). RSA_generate_key() works in the same way as
RSA_generate_key_ex() except it uses "old style" call backs. See
L<BN_generate_prime(3)> for further details.

=head1 RETURN VALUE

RSA_generate_key_ex() returns 1 on success or 0 on error.
RSA_generate_key() returns the key on success or B<NULL> on error.

The error codes can be obtained by L<ERR_get_error(3)>.

=head1 BUGS

B<BN_GENCB_call(cb, 2, x)> is used with two different meanings.

RSA_generate_key() goes into an infinite loop for illegal input values.

=head1 SEE ALSO

L<ERR_get_error(3)>, L<RAND_bytes(3)>,
L<RSA_generate_key(3)>, L<BN_generate_prime(3)>

=head1 COPYRIGHT

Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.

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
