]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_pkcs12/lib/pkcs12BagAttrs.h
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_pkcs12 / lib / pkcs12BagAttrs.h
diff --git a/Security/libsecurity_pkcs12/lib/pkcs12BagAttrs.h b/Security/libsecurity_pkcs12/lib/pkcs12BagAttrs.h
new file mode 100644 (file)
index 0000000..4feb01a
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * 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_ */
+