]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTests/clxutils/clAppUtils/BlobList.cpp
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / clxutils / clAppUtils / BlobList.cpp
diff --git a/SecurityTests/clxutils/clAppUtils/BlobList.cpp b/SecurityTests/clxutils/clAppUtils/BlobList.cpp
new file mode 100644 (file)
index 0000000..53bd05b
--- /dev/null
@@ -0,0 +1,92 @@
+/*** BlobList class for managing groups of raw certs and CRLs ***/
+
+#include "BlobList.h"
+#include <utilLib/fileIo.h>
+#include <utilLib/common.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <security_cdsa_utils/cuPem.h>
+
+BlobList::~BlobList()
+{
+       for(uint32 dex=0; dex<mNumBlobs; dex++) {
+               free(mBlobList[dex].Data);              // mallocd by readFile()
+       }
+       free(mBlobList);
+       mBlobList = NULL;
+       mNumBlobs = 0;
+}
+
+/* blob is mallocd & copied; its referent is not copied */
+void BlobList::addBlob(const CSSM_DATA &blob, CSSM_BOOL copyBlob /* = CSSM_FALSE */)
+{
+       ++mNumBlobs;
+       mBlobList = (CSSM_DATA_PTR)realloc(mBlobList, mNumBlobs * sizeof(CSSM_DATA));
+       CSSM_DATA_PTR dst = &mBlobList[mNumBlobs - 1];
+       if(copyBlob) {
+               /* can't use appCopyCssmData since we free with free(), not appFree() */
+               dst->Length = blob.Length;
+               dst->Data = (uint8 *)malloc(dst->Length);
+               memmove(dst->Data, blob.Data, dst->Length);
+       }
+       else {
+               *dst = blob;    
+       }
+}
+
+
+int BlobList::addFile(const char *fileName,
+       const char *dirName /* = NULL */)
+{
+       CSSM_DATA blob;
+       int rtn;
+       char *fullName;
+       unsigned blobDataLen;
+       unsigned char *blobData;
+       
+       if(dirName) {
+               int len = strlen(dirName) + strlen(fileName) + 2;
+               fullName = (char *)malloc(len);
+               sprintf(fullName, "%s/%s", dirName, fileName);
+       }
+       else {
+               fullName = (char *)fileName;
+       }
+       rtn = cspReadFile(fullName, &blobData, &blobDataLen);
+       if(rtn) {
+               printf("***Error reading file %s\n", fullName);
+               if(dirName) {
+                       free(fullName);
+               }
+               return rtn;
+       }
+       
+       /* convert from PEM to DER if appropriate */
+       if(isPem(blobData, blobDataLen)) {
+               unsigned derDataLen;
+               unsigned char *derData;
+               
+               if(pemDecode(blobData, blobDataLen, &derData, &derDataLen)) {
+                       printf("***Error PEM-decoding file %s; using as raw data\n", fileName);
+                       blob.Data = blobData;
+                       blob.Length = blobDataLen;
+               }
+               else {
+                       blob.Data = derData;
+                       blob.Length = derDataLen;
+                       free(blobData);
+               }
+       }
+       else {
+               /* raw file data is the stuff we'll use */
+               blob.Data = blobData;
+               blob.Length = blobDataLen;
+       }
+       addBlob(blob);
+       if(dirName) {
+               free(fullName);
+       }
+       return 0;
+}
+