]> git.saurik.com Git - apple/security.git/blobdiff - libsecurity_apple_x509_cl/lib/CLCrlExtensions.cpp
Security-55163.44.tar.gz
[apple/security.git] / libsecurity_apple_x509_cl / lib / CLCrlExtensions.cpp
diff --git a/libsecurity_apple_x509_cl/lib/CLCrlExtensions.cpp b/libsecurity_apple_x509_cl/lib/CLCrlExtensions.cpp
new file mode 100644 (file)
index 0000000..0519aea
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2000-2002 Apple Computer, 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.
+ */
+
+
+/*
+ * CLCrlExtensions.cpp - CRL extensions support.
+ */
+#include "DecodedCrl.h"
+#include "CLCrlExtensions.h"
+#include "CLCertExtensions.h"
+#include "clNssUtils.h"
+#include "clNameUtils.h"
+#include "CLFieldsCommon.h"
+#include <security_utilities/utilities.h>
+#include <Security/oidscert.h>
+#include <Security/cssmerr.h>
+#include <Security/x509defs.h>
+#include <Security/certextensions.h>
+
+#include <Security/SecAsn1Templates.h>
+
+/***
+ *** get/set/free functions called out from CrlFields.cpp
+ ***/
+/***
+ *** CrlNumber , DeltaCRL
+ *** CDSA format       CE_CrlNumber (a uint32)
+ *** NSS format        CSSM_DATA, length 4
+ *** OID                       CSSMOID_CrlNumber, CSSMOID_DeltaCrlIndicator
+ ***/
+/* set function for both */
+void setFieldCrlNumber(                
+       DecodedItem     &crl, 
+       const CssmData &fieldValue) 
+{
+       CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, 
+               false);
+       CE_CrlNumber *cdsaObj = (CE_CrlNumber *)cssmExt->value.parsedValue;
+       
+       /* CSSM_DATA and its contents in crl.coder's memory */
+       ArenaAllocator alloc(crl.coder());
+       CSSM_DATA_PTR nssVal = (CSSM_DATA_PTR)alloc.malloc(sizeof(CSSM_DATA));
+       clIntToData(*cdsaObj, *nssVal, alloc);
+       
+       /* add to mExtensions */
+       crl.addExtension(nssVal, cssmExt->extnId, cssmExt->critical, false,
+               kSecAsn1IntegerTemplate); 
+}
+
+
+bool getFieldCrlCommon(
+       DecodedItem                     &crl,
+       const CSSM_OID          &fieldId,               // identifies extension we seek
+       unsigned                        index,                  // which occurrence (0 = first)
+       uint32                          &numFields,             // RETURNED
+       CssmOwnedData           &fieldValue) 
+{
+       const DecodedExten *decodedExt;
+       CSSM_DATA *nssObj;
+       CE_CrlNumber *cdsaObj;
+       bool brtn;
+       
+       brtn = crl.GetExtenTop<CSSM_DATA, CE_CrlNumber>(
+               index,
+               numFields,
+               fieldValue.allocator,
+               fieldId,
+               nssObj,
+               cdsaObj,
+               decodedExt);
+       if(!brtn) {
+               return false;
+       }
+       *cdsaObj = clDataToInt(*nssObj, CSSMERR_CL_INVALID_CRL_POINTER);
+       
+       /* pass back to caller */
+       getFieldExtenCommon(cdsaObj, *decodedExt, fieldValue);
+       return true;
+}
+
+bool getFieldCrlNumber(
+       DecodedItem                     &crl,
+       unsigned                        index,                  // which occurrence (0 = first)
+       uint32                          &numFields,             // RETURNED
+       CssmOwnedData           &fieldValue) 
+{
+       return getFieldCrlCommon(crl, CSSMOID_CrlNumber, index, numFields, 
+               fieldValue);
+}
+
+bool getFieldDeltaCrl(
+       DecodedItem                     &crl,
+       unsigned                        index,                  // which occurrence (0 = first)
+       uint32                          &numFields,             // RETURNED
+       CssmOwnedData           &fieldValue) 
+{
+       return getFieldCrlCommon(crl, CSSMOID_DeltaCrlIndicator, index, 
+               numFields, fieldValue);
+}
+
+void freeFieldIssuingDistPoint (
+       CssmOwnedData           &fieldValue)
+{
+       CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false);
+       Allocator &alloc = fieldValue.allocator;
+       CE_IssuingDistributionPoint *cdsaObj = 
+                       (CE_IssuingDistributionPoint *)cssmExt->value.parsedValue;
+       CL_freeCssmIssuingDistPoint(cdsaObj, alloc);
+       freeFieldExtenCommon(cssmExt, alloc);           // frees extnId, parsedValue, BERvalue
+}
+
+void freeFieldCrlDistributionPoints (
+       CssmOwnedData           &fieldValue)
+{
+       CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false);
+       Allocator &alloc = fieldValue.allocator;
+       CE_CRLDistPointsSyntax *cdsaObj = 
+                       (CE_CRLDistPointsSyntax *)cssmExt->value.parsedValue;
+       CL_freeCssmDistPoints(cdsaObj, alloc);
+       freeFieldExtenCommon(cssmExt, alloc);           // frees extnId, parsedValue, BERvalue
+}
+
+/* HoldInstructionCode - CSSM_OID */
+/* InvalidityDate - CSSM_DATA */
+void freeFieldOidOrData (
+       CssmOwnedData           &fieldValue)
+{
+       CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false);
+       Allocator &alloc = fieldValue.allocator;
+       CSSM_DATA *cdsaObj = 
+                       (CSSM_DATA *)cssmExt->value.parsedValue;
+       if(cdsaObj) {
+               alloc.free(cdsaObj->Data);
+       }
+       freeFieldExtenCommon(cssmExt, alloc);           // frees extnId, parsedValue, BERvalue
+}
+