1/* 2 * Copyright (c) 2000-2002 Apple Computer, Inc. All Rights Reserved. 3 * 4 * The contents of this file constitute Original Code as defined in and are 5 * subject to the Apple Public Source License Version 1.2 (the 'License'). 6 * You may not use this file except in compliance with the License. Please obtain 7 * a copy of the License at http://www.apple.com/publicsource and read it before 8 * using this file. 9 * 10 * This Original Code and all software distributed under the License are 11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS 12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT 13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the 15 * specific language governing rights and limitations under the License. 16 */ 17 18 19/* 20 * CLCrlExtensions.cpp - CRL extensions support. 21 */ 22 23#include "DecodedCrl.h" 24#include "CLCrlExtensions.h" 25#include "CLCertExtensions.h" 26#include "clNssUtils.h" 27#include "clNameUtils.h" 28#include "CLFieldsCommon.h" 29#include <security_utilities/utilities.h> 30#include <Security/oidscert.h> 31#include <Security/cssmerr.h> 32#include <Security/x509defs.h> 33#include <Security/certextensions.h> 34 35#include <Security/SecAsn1Templates.h> 36 37/*** 38 *** get/set/free functions called out from CrlFields.cpp 39 ***/ 40/*** 41 *** CrlNumber , DeltaCRL 42 *** CDSA format CE_CrlNumber (a uint32) 43 *** NSS format CSSM_DATA, length 4 44 *** OID CSSMOID_CrlNumber, CSSMOID_DeltaCrlIndicator 45 ***/ 46 47/* set function for both */ 48void setFieldCrlNumber( 49 DecodedItem &crl, 50 const CssmData &fieldValue) 51{ 52 CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, 53 false); 54 CE_CrlNumber *cdsaObj = (CE_CrlNumber *)cssmExt->value.parsedValue; 55 56 /* CSSM_DATA and its contents in crl.coder's memory */ 57 ArenaAllocator alloc(crl.coder()); 58 CSSM_DATA_PTR nssVal = (CSSM_DATA_PTR)alloc.malloc(sizeof(CSSM_DATA)); 59 clIntToData(*cdsaObj, *nssVal, alloc); 60 61 /* add to mExtensions */ 62 crl.addExtension(nssVal, cssmExt->extnId, cssmExt->critical, false, 63 kSecAsn1IntegerTemplate); 64} 65 66static 67bool getFieldCrlCommon( 68 DecodedItem &crl, 69 const CSSM_OID &fieldId, // identifies extension we seek 70 unsigned index, // which occurrence (0 = first) 71 uint32 &numFields, // RETURNED 72 CssmOwnedData &fieldValue) 73{ 74 const DecodedExten *decodedExt; 75 CSSM_DATA *nssObj; 76 CE_CrlNumber *cdsaObj; 77 bool brtn; 78 79 brtn = crl.GetExtenTop<CSSM_DATA, CE_CrlNumber>( 80 index, 81 numFields, 82 fieldValue.allocator, 83 fieldId, 84 nssObj, 85 cdsaObj, 86 decodedExt); 87 if(!brtn) { 88 return false; 89 } 90 *cdsaObj = clDataToInt(*nssObj, CSSMERR_CL_INVALID_CRL_POINTER); 91 92 /* pass back to caller */ 93 getFieldExtenCommon(cdsaObj, *decodedExt, fieldValue); 94 return true; 95} 96 97bool getFieldCrlNumber( 98 DecodedItem &crl, 99 unsigned index, // which occurrence (0 = first) 100 uint32 &numFields, // RETURNED 101 CssmOwnedData &fieldValue) 102{ 103 return getFieldCrlCommon(crl, CSSMOID_CrlNumber, index, numFields, 104 fieldValue); 105} 106 107bool getFieldDeltaCrl( 108 DecodedItem &crl, 109 unsigned index, // which occurrence (0 = first) 110 uint32 &numFields, // RETURNED 111 CssmOwnedData &fieldValue) 112{ 113 return getFieldCrlCommon(crl, CSSMOID_DeltaCrlIndicator, index, 114 numFields, fieldValue); 115} 116 117void freeFieldIssuingDistPoint ( 118 CssmOwnedData &fieldValue) 119{ 120 CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false); 121 Allocator &alloc = fieldValue.allocator; 122 CE_IssuingDistributionPoint *cdsaObj = 123 (CE_IssuingDistributionPoint *)cssmExt->value.parsedValue; 124 CL_freeCssmIssuingDistPoint(cdsaObj, alloc); 125 freeFieldExtenCommon(cssmExt, alloc); // frees extnId, parsedValue, BERvalue 126} 127 128void freeFieldCrlDistributionPoints ( 129 CssmOwnedData &fieldValue) 130{ 131 CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false); 132 Allocator &alloc = fieldValue.allocator; 133 CE_CRLDistPointsSyntax *cdsaObj = 134 (CE_CRLDistPointsSyntax *)cssmExt->value.parsedValue; 135 CL_freeCssmDistPoints(cdsaObj, alloc); 136 freeFieldExtenCommon(cssmExt, alloc); // frees extnId, parsedValue, BERvalue 137} 138 139/* HoldInstructionCode - CSSM_OID */ 140/* InvalidityDate - CSSM_DATA */ 141void freeFieldOidOrData ( 142 CssmOwnedData &fieldValue) 143{ 144 CSSM_X509_EXTENSION_PTR cssmExt = verifySetFreeExtension(fieldValue, false); 145 Allocator &alloc = fieldValue.allocator; 146 CSSM_DATA *cdsaObj = 147 (CSSM_DATA *)cssmExt->value.parsedValue; 148 if(cdsaObj) { 149 alloc.free(cdsaObj->Data); 150 } 151 freeFieldExtenCommon(cssmExt, alloc); // frees extnId, parsedValue, BERvalue 152} 153 154