|  | =pod | 
|  |  | 
|  | =head1 NAME | 
|  |  | 
|  | PKCS12_key_gen_asc, PKCS12_key_gen_asc_ex, | 
|  | PKCS12_key_gen_uni, PKCS12_key_gen_uni_ex, | 
|  | PKCS12_key_gen_utf8, PKCS12_key_gen_utf8_ex - PKCS#12 Password based key derivation | 
|  |  | 
|  | =head1 SYNOPSIS | 
|  |  | 
|  | #include <openssl/pkcs12.h> | 
|  |  | 
|  | int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type); | 
|  | int PKCS12_key_gen_asc_ex(const char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type, | 
|  | OSSL_LIB_CTX *ctx, const char *propq); | 
|  | int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type); | 
|  | int PKCS12_key_gen_uni_ex(unsigned char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type, | 
|  | OSSL_LIB_CTX *ctx, const char *propq); | 
|  | int PKCS12_key_gen_utf8(const char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type); | 
|  | int PKCS12_key_gen_utf8_ex(const char *pass, int passlen, unsigned char *salt, | 
|  | int saltlen, int id, int iter, int n, | 
|  | unsigned char *out, const EVP_MD *md_type, | 
|  | OSSL_LIB_CTX *ctx, const char *propq); | 
|  |  | 
|  | =head1 DESCRIPTION | 
|  |  | 
|  | These methods perform a key derivation according to PKCS#12 (RFC7292) | 
|  | with an input password I<pass> of length I<passlen>, a salt I<salt> of length | 
|  | I<saltlen>, an iteration count I<iter> and a digest algorithm I<md_type>. | 
|  | The ID byte I<id> determines how the resulting key is intended to be used: | 
|  |  | 
|  | =over 4 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If ID=1, then the pseudorandom bits being produced are to be used | 
|  | as key material for performing encryption or decryption. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If ID=2, then the pseudorandom bits being produced are to be used | 
|  | as an IV (Initial Value) for encryption or decryption. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | If ID=3, then the pseudorandom bits being produced are to be used | 
|  | as an integrity key for MACing. | 
|  |  | 
|  | =back | 
|  |  | 
|  | The intended format of the supplied password is determined by the method chosen: | 
|  |  | 
|  | =over 4 | 
|  |  | 
|  | =item * | 
|  |  | 
|  | PKCS12_key_gen_asc() and PKCS12_key_gen_asc_ex() expect an ASCII-formatted password. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | PKCS12_key_gen_uni() and PKCS12_key_gen_uni_ex() expect a Unicode-formatted password. | 
|  |  | 
|  | =item * | 
|  |  | 
|  | PKCS12_key_gen_utf8() and PKCS12_key_gen_utf8_ex() expect a UTF-8 encoded password. | 
|  |  | 
|  | =back | 
|  |  | 
|  | I<pass> is the password used in the derivation of length I<passlen>. I<pass> | 
|  | is an optional parameter and can be NULL. If I<passlen> is -1, then the | 
|  | function will calculate the length of I<pass> using strlen(). | 
|  |  | 
|  | I<salt> is the salt used in the derivation of length I<saltlen>. If the | 
|  | I<salt> is NULL, then I<saltlen> must be 0. The function will not | 
|  | attempt to calculate the length of the I<salt> because it is not assumed to | 
|  | be NULL terminated. | 
|  |  | 
|  | I<iter> is the iteration count and its value should be greater than or | 
|  | equal to 1. RFC 2898 suggests an iteration count of at least 1000. Any | 
|  | I<iter> less than 1 is treated as a single iteration. | 
|  |  | 
|  | I<digest> is the message digest function used in the derivation. | 
|  |  | 
|  | The derived key will be written to I<out>. The size of the I<out> buffer | 
|  | is specified via I<n>. | 
|  |  | 
|  | Functions ending in _ex() allow for a library context I<ctx> and property query | 
|  | I<propq> to be used to select algorithm implementations. | 
|  |  | 
|  | =head1 NOTES | 
|  |  | 
|  | A typical application of this function is to derive keying material for an | 
|  | encryption algorithm from a password in the I<pass>, a salt in I<salt>, | 
|  | and an iteration count. | 
|  |  | 
|  | Increasing the I<iter> parameter slows down the algorithm which makes it | 
|  | harder for an attacker to perform a brute force attack using a large number | 
|  | of candidate passwords. | 
|  |  | 
|  | =head1 RETURN VALUES | 
|  |  | 
|  | Returns 1 on success or 0 on error. | 
|  |  | 
|  | =head1 CONFORMING TO | 
|  |  | 
|  | IETF RFC 7292 (L<https://tools.ietf.org/html/rfc7292>) | 
|  |  | 
|  | =head1 SEE ALSO | 
|  |  | 
|  | L<PKCS12_create_ex(3)>, | 
|  | L<PKCS12_pbe_crypt_ex(3)>, | 
|  | L<passphrase-encoding(7)> | 
|  |  | 
|  | =head1 HISTORY | 
|  |  | 
|  | PKCS12_key_gen_asc_ex(), PKCS12_key_gen_uni_ex() and PKCS12_key_gen_utf8_ex() | 
|  | were added in OpenSSL 3.0. | 
|  |  | 
|  | =head1 COPYRIGHT | 
|  |  | 
|  | Copyright 2021 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 |