]>
git.ipfire.org Git - thirdparty/openssl.git/blob - demos/pkcs12/pkread.c
2 * Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
12 #include <openssl/pem.h>
13 #include <openssl/err.h>
14 #include <openssl/pkcs12.h>
16 /* Simple PKCS#12 file reader */
18 static char *find_friendly_name(PKCS12
*p12
)
20 STACK_OF(PKCS7
) *safes
;
24 STACK_OF(PKCS12_SAFEBAG
) *bags
;
27 if ((safes
= PKCS12_unpack_authsafes(p12
)) == NULL
)
30 for (n
= 0; n
< sk_PKCS7_num(safes
) && name
== NULL
; n
++) {
31 safe
= sk_PKCS7_value(safes
, n
);
32 if (OBJ_obj2nid(safe
->type
) != NID_pkcs7_data
33 || (bags
= PKCS12_unpack_p7data(safe
)) == NULL
)
36 for (m
= 0; m
< sk_PKCS12_SAFEBAG_num(bags
) && name
== NULL
; m
++) {
37 bag
= sk_PKCS12_SAFEBAG_value(bags
, m
);
38 name
= PKCS12_get_friendlyname(bag
);
40 sk_PKCS12_SAFEBAG_pop_free(bags
, PKCS12_SAFEBAG_free
);
43 sk_PKCS7_pop_free(safes
, PKCS7_free
);
48 int main(int argc
, char **argv
)
51 EVP_PKEY
*pkey
= NULL
;
53 STACK_OF(X509
) *ca
= NULL
;
56 int i
, ret
= EXIT_FAILURE
;
59 fprintf(stderr
, "Usage: pkread p12file password opfile\n");
63 if ((fp
= fopen(argv
[1], "rb")) == NULL
) {
64 fprintf(stderr
, "Error opening file %s\n", argv
[1]);
67 p12
= d2i_PKCS12_fp(fp
, NULL
);
70 fprintf(stderr
, "Error reading PKCS#12 file\n");
71 ERR_print_errors_fp(stderr
);
74 if (!PKCS12_parse(p12
, argv
[2], &pkey
, &cert
, &ca
)) {
75 fprintf(stderr
, "Error parsing PKCS#12 file\n");
76 ERR_print_errors_fp(stderr
);
79 name
= find_friendly_name(p12
);
81 if ((fp
= fopen(argv
[3], "w")) == NULL
) {
82 fprintf(stderr
, "Error opening file %s\n", argv
[3]);
86 fprintf(fp
, "***Friendly Name***\n%s\n", name
);
88 fprintf(fp
, "***Private Key***\n");
89 PEM_write_PrivateKey(fp
, pkey
, NULL
, NULL
, 0, NULL
, NULL
);
92 fprintf(fp
, "***User Certificate***\n");
93 PEM_write_X509_AUX(fp
, cert
);
95 if (ca
!= NULL
&& sk_X509_num(ca
) > 0) {
96 fprintf(fp
, "***Other Certificates***\n");
97 for (i
= 0; i
< sk_X509_num(ca
); i
++)
98 PEM_write_X509_AUX(fp
, sk_X509_value(ca
, i
));
108 OSSL_STACK_OF_X509_free(ca
);