From efcfa2f0144c39eb7682dab8aa141d0dd2759c4c Mon Sep 17 00:00:00 2001 From: kaleb-himes Date: Fri, 25 Nov 2016 14:20:08 -0700 Subject: [PATCH] Pem to Der implemented, test case added --- wolfCLU/clu_include/clu_error_codes.h | 2 + wolfCLU/clu_src/x509/clu_parse.c | 77 +++++++++++++++++++++---- wolfCLU/tests/x509/x509-process-test.sh | 9 ++- 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/wolfCLU/clu_include/clu_error_codes.h b/wolfCLU/clu_include/clu_error_codes.h index cbd3b56d..15c67d0c 100644 --- a/wolfCLU/clu_include/clu_error_codes.h +++ b/wolfCLU/clu_include/clu_error_codes.h @@ -2,5 +2,7 @@ enum { USER_INPUT_ERROR = -1001, INPUT_FILE_ERROR = -1002, + PEM_TO_DER_ERROR = -1003, /* converting pem to der failed */ DER_TO_PEM_ERROR = -1004, /* converting der to pem failed */ + }; diff --git a/wolfCLU/clu_src/x509/clu_parse.c b/wolfCLU/clu_src/x509/clu_parse.c index 122e9017..d4c2b205 100644 --- a/wolfCLU/clu_src/x509/clu_parse.c +++ b/wolfCLU/clu_src/x509/clu_parse.c @@ -21,6 +21,7 @@ #include #include +#include /* wolfSSL_CertPemToDer */ #include "clu_include/clu_header_main.h" #include "clu_include/clu_error_codes.h" #include "clu_include/x509/clu_parse.h" @@ -68,8 +69,18 @@ int wolfCLU_parse_file(char* infile, int inform, char* outfile, int outform) byte* inBuf = NULL; byte* outBuf = NULL; + if (infile == NULL || outfile == NULL) + return BAD_FUNC_ARG; + + /* MALLOC buffer for the certificate to be processed */ + inBuf = (byte*) XMALLOC(MAX_CERT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (inBuf == NULL) return MEMORY_E; + XMEMSET(inBuf, 0, MAX_CERT_SIZE); + instream = fopen(infile, "rb"); outstream = fopen(outfile, "wb"); + /*----------------------------------------------------------------------------*/ /* read in der, output der */ /*----------------------------------------------------------------------------*/ @@ -80,22 +91,20 @@ int wolfCLU_parse_file(char* infile, int inform, char* outfile, int outform) /* read in der, output pem */ /*----------------------------------------------------------------------------*/ else if ( (inform && !outform) ) { - /* MALLOC buffer for the certificate to be processed */ - inBuf = (byte*) XMALLOC(MAX_CERT_SIZE, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER); - if (inBuf == NULL) return MEMORY_E; - XMEMSET(inBuf, 0, MAX_CERT_SIZE); - /* read in the certificate to be processed */ inBufSz = fread(inBuf, 1, MAX_CERT_SIZE, instream); - if (inBufSz <= 0) return FREAD_ERROR; + if (inBufSz <= 0) { + ret = FREAD_ERROR; + goto clu_parse_cleanup; + } /* MALLOC buffer for the result of conversion from der to pem */ outBuf = (byte*) XMALLOC(MAX_CERT_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (outBuf == NULL) { XFREE(inBuf, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - return MEMORY_E; + ret = MEMORY_E; + goto clu_parse_cleanup; } XMEMSET(outBuf, 0, MAX_CERT_SIZE); @@ -104,17 +113,61 @@ int wolfCLU_parse_file(char* infile, int inform, char* outfile, int outform) CERT_TYPE); if (outBufSz < 0) { wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); - return DER_TO_PEM_ERROR; + ret = DER_TO_PEM_ERROR; + goto clu_parse_cleanup; } /* write the result of conversion to the outfile specified */ ret = fwrite(outBuf, 1, outBufSz, outstream); - } + if (ret <= 0) { + wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); + ret = FWRITE_ERROR; + goto clu_parse_cleanup; + } + + /* success cleanup */ + wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); + } /*----------------------------------------------------------------------------*/ /* read in pem, output der */ /*----------------------------------------------------------------------------*/ else if ( (!inform && outform) ) { printf("in parse: in = pem, out = der\n"); + inBufSz = fread(inBuf, 1, MAX_CERT_SIZE, instream); + if (inBufSz <= 0) { + ret = FREAD_ERROR; + goto clu_parse_cleanup; + } + + /* MALLOC buffer for the result of converstion from pem to der */ + outBuf = (byte*) XMALLOC(MAX_CERT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (outBuf == NULL) { + XFREE(inBuf, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ret = MEMORY_E; + goto clu_parse_cleanup; + } + XMEMSET(outBuf, 0, MAX_CERT_SIZE); + + /* convert inBuf from pem to der, store result in outBuf */ + outBufSz = wolfSSL_CertPemToDer(inBuf, inBufSz, outBuf, MAX_CERT_SIZE, + CERT_TYPE); + if (outBufSz < 0) { + wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); + ret = PEM_TO_DER_ERROR; + goto clu_parse_cleanup; + } + + /* write the result of conversion to the outfile specified */ + ret = fwrite(outBuf, 1, outBufSz, outstream); + if (ret <= 0) { + wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); + ret = FWRITE_ERROR; + goto clu_parse_cleanup; + } + + /* success cleanup */ + wolfsslFreeBins(inBuf, outBuf, NULL, NULL, NULL); } /*----------------------------------------------------------------------------*/ /* read in pem, output pem */ @@ -123,9 +176,11 @@ int wolfCLU_parse_file(char* infile, int inform, char* outfile, int outform) printf("in parse: in = pem, out = pem\n"); } + ret = 0; +clu_parse_cleanup: + fclose(outstream); fclose(instream); - ret = 0; return ret; } diff --git a/wolfCLU/tests/x509/x509-process-test.sh b/wolfCLU/tests/x509/x509-process-test.sh index 592d1edf..5fddb527 100755 --- a/wolfCLU/tests/x509/x509-process-test.sh +++ b/wolfCLU/tests/x509/x509-process-test.sh @@ -92,16 +92,19 @@ function run3() { cert_test_case "-inform der -in testing-certs/ca-cert.der -outform pem -out tmp.pem" \ testing-certs/ca-cert.pem tmp.pem echo "TEST 3.b" - test_case "-inform pem -in ca-cert.pem -outform der -out out.txt" + cert_test_case "-inform pem -outform der -in testing-certs/ca-cert.pem -out tmp.der" \ + testing-certs/ca-cert.der tmp.der +# test_case "-inform pem -in ca-cert.pem -outform der -out out.txt" echo "TEST 3.c" test_case "-inform der -in ca-cert.pem -outform der -out out.txt" echo "TEST 3.d" test_case "-inform pem -in ca-cert.pem -outform pem -out out.txt" } -run1 -run2 +#run1 +#run2 run3 rm out.txt rm tmp.pem +rm tmp.der