DistributionPointName.cpp

Go to the documentation of this file.
00001 
00009 #include "DistributionPointName.h"
00010 #include "GeneralName.h"
00011 #include "GeneralNamesCompare.h"
00012 #include "ASN1Helper.h"
00013 #include "PKIX1Implicit88.h"
00014 #include "PKIX1Explicit88.h"
00015 #include "Name.h"
00016 #include "ToolkitUtils.h"
00017 
00018 #include <algorithm>
00019 
00021 
00022 struct CPKIFDistributionPointNameImpl
00023 {
00024   CPKIFGeneralNameList m_fullName;
00025   CACX509V3RDNSequence* m_relativeName;
00026   bool m_bNameRelativeToIssuerPresent;
00027 };
00028 
00030 
00038 CPKIFDistributionPointName::CPKIFDistributionPointName()
00039   :m_impl (new CPKIFDistributionPointNameImpl)
00040 {
00041 }
00052 //CPKIFDistributionPointName::CPKIFDistributionPointName(
00053 //  //! [in] Internal representation of the extension to use to construct the object
00054 //  const CACX509V3DistributionPointName& name)
00055 //  :m_impl (new CPKIFDistributionPointNameImpl)
00056 //{
00057 //  if(2 == name.t)
00058 //  {
00059 //      m_impl->m_bNameRelativeToIssuerPresent = true;
00060 //      return;
00061 //  }
00062 //  else
00063 //      m_impl->m_bNameRelativeToIssuerPresent = false;
00064 //
00065 //  DListNode* cur = name.u.fullName->head;
00066 //  for(unsigned int ii = 0; ii < name.u.fullName->count; ++ii)
00067 //  {
00068 //      CPKIFGeneralNamePtr tmpGN(new CPKIFGeneralName(*(CACX509V3GeneralName*)cur->data));
00069 //      m_impl->m_fullName.push_back(tmpGN);
00070 //
00071 //      cur = cur->next;
00072 //  }
00073 //}
00074 CPKIFDistributionPointName::CPKIFDistributionPointName(
00076     const CPKIFBufferPtr& name)
00077   :m_impl (new CPKIFDistributionPointNameImpl)
00078 {
00079     
00080     CACASNWRAPPER_CREATE(CACX509V3DistributionPointName, objPDU);
00081     objPDU.Decode(name->GetBuffer(), name->GetLength());
00082 
00083     if(2 == objPDU->t)
00084     {
00085         m_impl->m_bNameRelativeToIssuerPresent = true;
00086 
00087         m_impl->m_relativeName = new CACX509V3RDNSequence;
00088         m_impl->m_relativeName->head = NULL; m_impl->m_relativeName->tail = NULL;
00089         m_impl->m_relativeName->count = 0;
00090 
00091         DListNode* cur = NULL, *cur2 = objPDU->u.nameRelativeToCRLIssuer->head;
00092         ASN1OpenType* tmp = NULL, *tmp2 = NULL;
00093         
00094         //iterate over all of the RDN elements in the name passed as a parameter
00095         for(unsigned int ii = 0; ii < objPDU->u.nameRelativeToCRLIssuer->count; ++ii)
00096         {
00097             if(NULL == cur)
00098             {
00099                 NEW_NODE(cur)
00100             }
00101             else
00102             {
00103                 NEW_NEXT_AND_ADVANCE(cur)
00104             }
00105 
00106             //create an ASN1OpenType to hold the data
00107             //use tmp2 as a temporary pointer to the actual value to copy
00108             tmp = new ASN1OpenType;
00109             CACX509V3AttributeTypeAndValue* tmpATV = (CACX509V3AttributeTypeAndValue*)cur2->data;
00110             //CACASNWRAPPER_CREATE(CACX509V3AttributeTypeAndValue, atvEncoder);
00111             //tmp2 = atvEncoder.Encode(tmpATV);
00112 
00113             DList rdnList;
00114             DListNode rdnNode;
00115             rdnList.count = 1;
00116             rdnNode.data = tmpATV;
00117             rdnNode.next = NULL;
00118             rdnNode.prev = NULL;
00119             rdnList.head = &rdnNode;
00120             rdnList.tail = &rdnNode;
00121             CACASNWRAPPER_CREATE(CACX509V3RelativeDistinguishedName, rdnEncoder);
00122             tmp2 = rdnEncoder.Encode(&rdnList);
00123 
00124             //save the length, allocate a buffer and copy the data
00125             //throw bad_alloc
00126             tmp->numocts = tmp2->numocts;
00127             tmp->data = new unsigned char[tmp->numocts];
00128             memcpy((void*)tmp->data, tmp2->data, tmp->numocts);
00129             delete tmp2;
00130 
00131             cur->data = tmp;
00132             cur2 = cur2->next;
00133 
00134             //if(0 == m_impl->m_name->u.rdnSequence->count)
00135             
00136             //CHANGED FROM ABOVE 4/28/2004
00137             if(0 == m_impl->m_relativeName->head)
00138             {
00139                 m_impl->m_relativeName->head = cur;
00140                 m_impl->m_relativeName->tail = cur;
00141             }
00142             else
00143                 m_impl->m_relativeName->tail = cur;
00144             ++m_impl->m_relativeName->count;
00145         }
00146 
00147         return;
00148     }
00149     else
00150     {
00151         m_impl->m_bNameRelativeToIssuerPresent = false;
00152 
00153         DListNode* cur = objPDU->u.fullName->head;
00154         for(unsigned int ii = 0; ii < objPDU->u.fullName->count; ++ii)
00155         {
00156             //CPKIFGeneralNamePtr tmpGN(new CPKIFGeneralName(*(CACX509V3GeneralName*)cur->data));
00157             //CPKIFBufferPtr tmpBuf(new CPKIFBuffer(((ASN1OpenType*)cur->data)->data, ((ASN1OpenType*)cur->data)->numocts));
00158             //CPKIFGeneralNamePtr tmpGN(new CPKIFGeneralName(tmpBuf));
00159             CACASNWRAPPER_CREATE(CACX509V3GeneralName, objPDU);
00160             ASN1OpenType* data1 = objPDU.Encode((CACX509V3GeneralName*)cur->data);
00161             CPKIFBufferPtr tmpBuf;
00162             if (data1 != NULL)
00163             {
00164                  tmpBuf = CPKIFBufferPtr(new CPKIFBuffer(data1->data, data1->numocts));
00165                 delete data1;
00166             }
00167             CPKIFGeneralNamePtr tmpGN(new CPKIFGeneralName(tmpBuf));
00168                 
00169             m_impl->m_fullName.push_back(tmpGN);
00170 
00171             cur = cur->next;
00172         }
00173     }
00174 }
00175 //commented out - 8/21/2004
00176 //CPKIFDistributionPointName::CPKIFDistributionPointName(const CPKIFDistributionPointName& name)
00177 //{
00178 //}
00179 
00187 CPKIFDistributionPointName::~CPKIFDistributionPointName()
00188 {
00189     if(m_impl)
00190     {
00191         delete m_impl;
00192         m_impl = 0;
00193     }
00194 }
00205 bool CPKIFDistributionPointName::operator == (const CPKIFDistributionPointName& name)
00206 {
00207     CPKIFGeneralNameList rhs;
00208     name.FullName(rhs);
00209     
00210     GeneralNamesCompare gnc;
00211     gnc.SetGeneralNames(&rhs);
00212 
00213     CPKIFGeneralNameList::iterator end = m_impl->m_fullName.end();
00214     if(end != std::find_if(m_impl->m_fullName.begin(), m_impl->m_fullName.end(), gnc))
00215         return true;
00216     else
00217         return false; //XXX-DEFER catch-all for failure to match relative to issuer
00218 }
00226 bool CPKIFDistributionPointName::NameRelativeToIssuerPresent() const 
00227 {
00228     return m_impl->m_bNameRelativeToIssuerPresent;
00229 }
00238 void CPKIFDistributionPointName::FullName(
00241     CPKIFGeneralNameList& genNames) const
00242 {
00243     genNames.clear();
00244 
00245     CPKIFGeneralNameList::const_iterator pos;
00246     CPKIFGeneralNameList::const_iterator end = m_impl->m_fullName.end();
00247     for(pos = m_impl->m_fullName.begin(); pos != end; ++pos)
00248     {
00249         genNames.push_back(*pos);
00250     }
00251 }
00252 
00254 
00255 struct CPKIFNameImpl
00256 {
00257     CACX509V3Name* m_name;
00258     CPKIFStringPtr m_string;
00259     CPKIFBufferPtr m_encodedName; //added 8/26/2004
00260 };
00261 
00263 
00271 CPKIFNamePtr CPKIFDistributionPointName::GetRelativeNameAsFullName(CPKIFNamePtr& issuerName)
00272 {
00273     CPKIFNamePtr newName(new CPKIFName(issuerName->Encoded()));
00274 
00275     DListNode* cur = newName->m_impl->m_name->u.rdnSequence->tail, *cur2 = m_impl->m_relativeName->head;
00276     ASN1OpenType* tmp = NULL, *tmp2 = NULL;
00277 
00278     for(unsigned int ii = 0; ii < m_impl->m_relativeName->count; ++ii)
00279     {
00280         if(NULL == cur)
00281         {
00282             NEW_NODE(cur)
00283         }
00284         else
00285         {
00286             NEW_NEXT_AND_ADVANCE(cur)
00287         }
00288 
00289         //create an ASN1OpenType to hold the data
00290         //use tmp2 as a temporary pointer to the actual value to copy
00291         tmp = new ASN1OpenType;
00292         tmp2 = (ASN1OpenType*)cur2->data;
00293         
00294         //save the length, allocate a buffer and copy the data
00295         //throw bad_alloc
00296         tmp->numocts = tmp2->numocts;
00297         tmp->data = new unsigned char[tmp->numocts];
00298         memcpy((void*)tmp->data, tmp2->data, tmp->numocts);
00299 
00300         cur->data = tmp;
00301         cur2 = cur2->next;
00302 
00303         //if(0 == m_impl->m_name->u.rdnSequence->count)
00304         
00305         //CHANGED FROM ABOVE 4/28/2004
00306         if(0 == newName->m_impl->m_name->u.rdnSequence->head)
00307         {
00308             newName->m_impl->m_name->u.rdnSequence->head = cur;
00309             newName->m_impl->m_name->u.rdnSequence->tail = cur;
00310         }
00311         else
00312             newName->m_impl->m_name->u.rdnSequence->tail = cur;
00313         ++newName->m_impl->m_name->u.rdnSequence->count;
00314     }
00315 
00316     return newName;
00317 }

Generated on Mon Nov 15 11:15:50 2010 for PublicKeyInfrastructureFramework(PKIF) by  doxygen 1.5.6