=pod

=head1 NAME

PKCS12_parse - parse a PKCS#12 structure

=head1 SYNOPSIS

 #include <openssl/pkcs12.h>

int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);

=head1 DESCRIPTION

PKCS12_parse() parses a PKCS12 structure.

B<p12> is the B<PKCS12> structure to parse. B<pass> is the passphrase to use.
If successful the private key will be written to B<*pkey>, the corresponding
certificate to B<*cert> and any additional certificates to B<*ca>.

=head1 NOTES

The parameters B<pkey> and B<cert> cannot be B<NULL>. B<ca> can be <NULL> in
which case additional certificates will be discarded. B<*ca> can also be a
valid STACK in which case additional certificates are appended to B<*ca>. If
B<*ca> is B<NULL> a new STACK will be allocated.

The B<friendlyName> and B<localKeyID> attributes (if present) on each
certificate will be stored in the B<alias> and B<keyid> attributes of the
B<X509> structure.

=head1 RETURN VALUES

PKCS12_parse() returns 1 for success and zero if an error occurred.

The error can be obtained from L<ERR_get_error(3)>

=head1 BUGS

Only a single private key and corresponding certificate is returned by this
function. More complex PKCS#12 files with multiple private keys will only
return the first match.

Only B<friendlyName> and B<localKeyID> attributes are currently stored in
certificates. Other attributes are discarded.

Attributes currently cannot be stored in the private key B<EVP_PKEY> structure.

=head1 SEE ALSO

L<d2i_PKCS12(3)>

=head1 COPYRIGHT

Copyright 2002-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
