168651Skris/* pkread.c */
268651Skris
368651Skris#include <stdio.h>
468651Skris#include <stdlib.h>
568651Skris#include <openssl/pem.h>
668651Skris#include <openssl/err.h>
768651Skris#include <openssl/pkcs12.h>
868651Skris
968651Skris/* Simple PKCS#12 file reader */
1068651Skris
1168651Skrisint main(int argc, char **argv)
1268651Skris{
13296465Sdelphij    FILE *fp;
14296465Sdelphij    EVP_PKEY *pkey;
15296465Sdelphij    X509 *cert;
16296465Sdelphij    STACK_OF(X509) *ca = NULL;
17296465Sdelphij    PKCS12 *p12;
18296465Sdelphij    int i;
19296465Sdelphij    if (argc != 4) {
20296465Sdelphij        fprintf(stderr, "Usage: pkread p12file password opfile\n");
21296465Sdelphij        exit(1);
22296465Sdelphij    }
23296465Sdelphij    SSLeay_add_all_algorithms();
24296465Sdelphij    ERR_load_crypto_strings();
25296465Sdelphij    if (!(fp = fopen(argv[1], "rb"))) {
26296465Sdelphij        fprintf(stderr, "Error opening file %s\n", argv[1]);
27296465Sdelphij        exit(1);
28296465Sdelphij    }
29296465Sdelphij    p12 = d2i_PKCS12_fp(fp, NULL);
30296465Sdelphij    fclose(fp);
31296465Sdelphij    if (!p12) {
32296465Sdelphij        fprintf(stderr, "Error reading PKCS#12 file\n");
33296465Sdelphij        ERR_print_errors_fp(stderr);
34296465Sdelphij        exit(1);
35296465Sdelphij    }
36296465Sdelphij    if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
37296465Sdelphij        fprintf(stderr, "Error parsing PKCS#12 file\n");
38296465Sdelphij        ERR_print_errors_fp(stderr);
39296465Sdelphij        exit(1);
40296465Sdelphij    }
41296465Sdelphij    PKCS12_free(p12);
42296465Sdelphij    if (!(fp = fopen(argv[3], "w"))) {
43296465Sdelphij        fprintf(stderr, "Error opening file %s\n", argv[1]);
44296465Sdelphij        exit(1);
45296465Sdelphij    }
46296465Sdelphij    if (pkey) {
47296465Sdelphij        fprintf(fp, "***Private Key***\n");
48296465Sdelphij        PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
49296465Sdelphij    }
50296465Sdelphij    if (cert) {
51296465Sdelphij        fprintf(fp, "***User Certificate***\n");
52296465Sdelphij        PEM_write_X509_AUX(fp, cert);
53296465Sdelphij    }
54296465Sdelphij    if (ca && sk_num(ca)) {
55296465Sdelphij        fprintf(fp, "***Other Certificates***\n");
56296465Sdelphij        for (i = 0; i < sk_X509_num(ca); i++)
57296465Sdelphij            PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
58296465Sdelphij    }
59296465Sdelphij    fclose(fp);
60296465Sdelphij    return 0;
6168651Skris}
62