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