From 8f1ac1a3791580cc0e5f8438c902017e033a6242 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 9 Jan 2017 14:35:12 -0700 Subject: [PATCH] simple pkcs12 example added --- crypto/pkcs12/Makefile | 11 +++ crypto/pkcs12/README | 12 +++ crypto/pkcs12/pkcs12-example.c | 122 ++++++++++++++++++++++++++++++ crypto/pkcs12/test-servercert.p12 | Bin 0 -> 5277 bytes 4 files changed, 145 insertions(+) create mode 100644 crypto/pkcs12/Makefile create mode 100644 crypto/pkcs12/README create mode 100644 crypto/pkcs12/pkcs12-example.c create mode 100644 crypto/pkcs12/test-servercert.p12 diff --git a/crypto/pkcs12/Makefile b/crypto/pkcs12/Makefile new file mode 100644 index 00000000..af716a09 --- /dev/null +++ b/crypto/pkcs12/Makefile @@ -0,0 +1,11 @@ +CC=gcc +CFLAGS=-Wall +LIBS= -lwolfssl + +pkcs12-example: pkcs12-example.o + $(CC) -o $@ $^ $(CFLAGS) $(LIBS) + +.PHONY: clean + +clean: + rm -f *.o pkcs12-example diff --git a/crypto/pkcs12/README b/crypto/pkcs12/README new file mode 100644 index 00000000..2aa5f7e6 --- /dev/null +++ b/crypto/pkcs12/README @@ -0,0 +1,12 @@ +How to use pkcs12-example.c + +1) a. Compile wolfSSL with ./configure --enable-pwdbased --enable-des3, run + 'make', and then install by typing 'sudo make install'. + b. In the crypto/pkcs12 directory run the Makefile by typing 'make'. +2) run the excecutable as follows: + + ./pkcs12-example + +3) Running 'make clean' will delete the excecutable as well as any created + files. Making sure that the only files left are 'pkcs12-example.c', + 'Makefile', 'test-servercert.p12'and 'README'. diff --git a/crypto/pkcs12/pkcs12-example.c b/crypto/pkcs12/pkcs12-example.c new file mode 100644 index 00000000..81dd8a72 --- /dev/null +++ b/crypto/pkcs12/pkcs12-example.c @@ -0,0 +1,122 @@ +/* pkcs12-example.c + * + * Copyright (C) 2006-2016 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * wolfSSL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#include +#include +#include + + + +/* This is an example with using wc_ function for PKCS12. To see an example of + * wolfSSL_PKCS12 functions look in tests/api.c */ +int main() +{ + WC_DerCertList* list; + WC_PKCS12* pkcs12; + byte* keyDer = NULL; + byte* certDer = NULL; + word32 keySz; + word32 certSz; + word32 i; + byte buffer[5300]; + char file[] = "./test-servercert.p12"; + FILE *f; + int bytes, ret; + + printf("extracting private key and certificate from PKCS12 (test-servercert.p12)\n"); + + pkcs12 = wc_PKCS12_new(); + if (pkcs12 == NULL) { + printf("issue creating pkcs12 object\n"); + return -1; + } + + /* open PKCS12 file */ + f = fopen(file, "rb"); + if (f == NULL) { + printf("error opening test-servercert.p12\n"); + wc_PKCS12_free(pkcs12); + return -1; + } + bytes = (int)fread(buffer, 1, sizeof(buffer), f); + fclose(f); + + /* convert the DER file into an internal structure */ + ret = wc_d2i_PKCS12(buffer, bytes, pkcs12); + printf("return value of d2i pkcs12 = %d %s\n", ret, (ret == 1)? "SUCCESS": "FAIL"); + if (ret != 1) { + printf("\t error converting pkcs12 to an internal structure\n"); + wc_PKCS12_free(pkcs12); + return -1; + } + + /* parse the internal structure into its parts */ + ret = wc_PKCS12_parse(pkcs12, "wolfSSL test", &keyDer, &keySz, + &certDer, &certSz, &list); + printf("return value of parsing pkcs12 = %d %s\n", ret, (ret == 1)? "SUCCESS": "FAIL"); + if (ret != 1 || keyDer == NULL || certDer == NULL) { + printf("\t error parsing pkcs12\n"); + wc_PKCS12_free(pkcs12); + return -1; + } + + /* print out key and cert found */ + printf("HEX of Private Key Read (DER format) :\n"); + for (i = 0; i < keySz; i++) { + if (i != 0 && !(i%16)) printf("\n"); + printf("%02X", keyDer[i]); + } + printf("\n"); + + printf("\nHEX of Certificate Read (DER format) :\n"); + for (i = 0; i < certSz; i++) { + if (i != 0 && !(i%16)) printf("\n"); + printf("%02X", certDer[i]); + } + printf("\n"); + + if (keyDer != NULL) { + XFREE(keyDer, NULL, DYNAMIC_TYPE_PKCS); + } + + if (certDer != NULL) { + XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS); + } + + /* itterate through list if was not passed as null and free each node */ + if (list != NULL) { + WC_DerCertList* current; + current = list; + while (current != NULL) { + WC_DerCertList* next = current->next; + if (current->buffer != NULL) { + XFREE(current->buffer, NULL, DYNAMIC_TYPE_PKCS); + } + XFREE(current, NULL, DYNAMIC_TYPE_PKCS); + current = next; + } + } + + wc_PKCS12_free(pkcs12); + + return 1; +} diff --git a/crypto/pkcs12/test-servercert.p12 b/crypto/pkcs12/test-servercert.p12 new file mode 100644 index 0000000000000000000000000000000000000000..9a1ffd7d57354dcd8f32d506bacbacac1d21fb48 GIT binary patch literal 5277 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