--- /dev/null
+/*
+ * 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
+}
+