--- /dev/null
+/*
+ * Copyright (c) 2003-2004,2011,2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The 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.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * pkcs12BagAttrs.h : internal representation of P12 SafeBag
+ * attribute, OTHER THAN friendlyName and localKeyId.
+ * This corresponds to a SecPkcs12AttrsRef at the
+ * public API layer.
+ */
+
+#ifndef _PKCS12_BAG_ATTRS_H_
+#define _PKCS12_BAG_ATTRS_H_
+
+#include <Security/keyTemplates.h> // for NSS_Attribute
+#include <security_asn1/SecNssCoder.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+class P12BagAttrs {
+public:
+ /*
+ * Empty constructor used by P12SafeBag during decoding.
+ * Indivudual attrs not understood by P12SafeBag get added
+ * via addAttr().
+ */
+ P12BagAttrs(
+ SecNssCoder &coder)
+ : mAttrs(NULL),
+ mCoder(coder) { }
+
+ /*
+ * Copying constructor used by P12SafeBag during encoding.
+ */
+ P12BagAttrs(
+ const P12BagAttrs *otherAttrs, // optional
+ SecNssCoder &coder);
+
+ ~P12BagAttrs() { }
+
+ /* Raw getter used just prior to encode. */
+ unsigned numAttrs() const;
+ NSS_Attribute *getAttr(
+ unsigned attrNum);
+
+ /*
+ * Add an attr during decoding. Only "generic" attrs, other
+ * than friendlyName and localKeyId, are added here.
+ */
+ void addAttr(
+ const NSS_Attribute &attr);
+
+ /*
+ * Add an attr pre-encode, from SecPkcs12Add*() or
+ * SecPkcs12AttrsAddAttr().
+ */
+ void addAttr(
+ const CFDataRef attrOid,
+ const CFArrayRef attrValues);
+
+ /*
+ * getter, public API version
+ */
+ void getAttr(
+ unsigned attrNum,
+ CFDataRef *attrOid, // RETURNED
+ CFArrayRef *attrValues); // RETURNED
+
+private:
+ NSS_Attribute *reallocAttrs(
+ size_t numNewAttrs);
+
+ void copyAttr(
+ const NSS_Attribute &src,
+ NSS_Attribute &dst);
+
+ /*
+ * Stored in NSS form for easy encode
+ */
+ NSS_Attribute **mAttrs;
+ SecNssCoder &mCoder;
+};
+
+/*
+ * In the most common usage, a P12BagAttrs's SecNssCoder is associated
+ * with the owning P12Coder's mCoder. In the case of a "standalone"
+ * P12BagAttrs's created by the app via SecPkcs12AttrsCreate(),
+ * this subclass is used, proving the P12BadAttr's SecNssCoder
+ * directly.
+ */
+class P12BagAttrsStandAlone : public P12BagAttrs
+{
+public:
+ P12BagAttrsStandAlone()
+ : P12BagAttrs(mPrivCoder)
+ { }
+
+ ~P12BagAttrsStandAlone() { }
+
+private:
+ SecNssCoder mPrivCoder;
+};
+
+#endif /* _PKCS12_BAG_ATTRS_H_ */
+