]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_mds/lib/MDSAttrUtils.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_mds / lib / MDSAttrUtils.h
diff --git a/Security/libsecurity_mds/lib/MDSAttrUtils.h b/Security/libsecurity_mds/lib/MDSAttrUtils.h
new file mode 100644 (file)
index 0000000..8ad06a4
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
+ * 
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please obtain
+ * a copy of the License at http://www.apple.com/publicsource and read it before
+ * using this file.
+ * 
+ * This Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
+ * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
+ * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
+ * specific language governing rights and limitations under the License.
+ */
+
+
+/*
+   File:      MDSAttrUtils.h
+
+   Contains:  Stateless functions used by MDSAttrParser.  
+
+   Copyright (c) 2001,2011,2014 Apple Inc. All Rights Reserved.
+*/
+
+#ifndef _MDS_ATTR_UTILS_H_
+#define _MDS_ATTR_UTILS_H_  1
+
+#include <Security/cssmtype.h>
+#include <security_utilities/debugging.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include "MDSAttrStrings.h"
+#include "MDSSession.h"
+
+/* log parsing events */
+#define MPDebug(args...)       secdebug("MDS_Parse", ## args)
+
+/* log scanning events */
+#define MSDebug(args...)       secdebug("MDS_Scan", ## args)
+
+/*
+ * I can't believe that CFRelease does not do this...
+ */
+#define CF_RELEASE(c)  if(c != NULL) { CFRelease(c); c = NULL; }
+
+namespace Security
+{
+
+/*
+ * Fill in one CSSM_DB_ATTRIBUTE_DATA with specified data, type and attribute name.
+ * CSSM_DB_ATTRIBUTE_DATA.Value and its referent are new[]'d and copied.
+ * Assumes:
+ *   -- AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING
+ */
+extern void MDSRawValueToDbAttr(
+       const void *value,
+       size_t len,
+       CSSM_DB_ATTRIBUTE_FORMAT attrFormat,    // CSSM_DB_ATTRIBUTE_FORMAT_STRING, etc.
+       const char *attrName,
+       CSSM_DB_ATTRIBUTE_DATA &attr,
+       uint32 numValues = 1);
+
+/*
+ * Free data new[]'d in the above function.
+ */
+extern void MDSFreeDbRecordAttrs(
+       CSSM_DB_ATTRIBUTE_DATA  *attrs,
+       unsigned                                numAttrs);
+
+
+/* safely get a new[]'d C string from a CFString */
+char *MDSCFStringToCString(
+       CFStringRef cfStr);
+
+/* copy a new[]'d C string from a C string */
+char *MDSCopyCstring(
+       const char *inStr);
+
+/* 
+ * Given a CFTypeRef which is either a CFString or a CFNumber, do our best to 
+ * convert it to a uint32. If it's a CFString, we'll use a MDSNameValuePair
+ * to convert it. CFStrings expressed as decimal numbers are also converted
+ * properly. (MAYBE we'll convert hex strings too...TBD...)
+ * Returns true if conversion was successful.
+ */
+bool MDSCfTypeToUInt32(
+       CFTypeRef cfValue,
+       const MDSNameValuePair *nameValues,     // optional for converting strings to numbers
+       const char *key,                                        // for debug logging only 
+       uint32 &value,                                          // RETURNED
+    size_t &valueLen);                                 // RETURNED
+
+/*
+ * Insert a record, defined by a CSSM_DB_ATTRIBUTE_DATA array, into specified
+ * DL and DB. Returns true on success.
+ */
+bool MDSInsertRecord(
+       const CSSM_DB_ATTRIBUTE_DATA    *inAttr,
+       unsigned                                                numAttrs,
+       CSSM_DB_RECORDTYPE                              recordType,
+       MDSSession                                              &dl,
+       CSSM_DB_HANDLE                                  dbHand);
+
+/*
+ * Convert a number expressed as a CFString to a uint32 using the specified
+ * name/value conversion table. The string may have multiple fields from that
+ * table, ORd together in normal C syntax. Like
+ *
+ *      CSSM_SERVICE_CSP | CSSM_SERVICE_DL
+ */
+CSSM_RETURN MDSStringToUint32(
+       CFStringRef str, 
+       const MDSNameValuePair *table,
+       uint32 &value);                                 // RETURNED
+
+
+} // end namespace Security
+
+#endif /* _MDS_ATTR_UTILS_H_ */