Update contrib.
2 * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
21 #include <x509certext.h>
23 #include "x509bitstring.h"
25 void CX509ExtensionBase::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
27 TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos));
29 if (dec.Tag() != EASN1OctetString)
31 User::Leave(KErrArgument);
33 TInt end = aPos + dec.LengthDER();
34 aPos += dec.LengthDERHeader();//add on header for octet string here
35 //pass in binary data with aPos set to start of contents octets of octet string
36 //we cheat a little here; since we know an octet string is just the contents octets,
37 //we just pass in a reference to the contents octets, and save alloc'ing the whole thang
38 DoConstructL(aBinaryData, aPos);
41 User::Leave(KErrArgument);
45 //1) basic constraints...
46 EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewL(const TDesC8& aBinaryData)
49 return CX509BasicConstraintsExt::NewL(aBinaryData, pos);
52 EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewLC(const TDesC8& aBinaryData)
55 return CX509BasicConstraintsExt::NewLC(aBinaryData, pos);
58 EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
60 CX509BasicConstraintsExt* self = CX509BasicConstraintsExt::NewLC(aBinaryData, aPos);
65 EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
67 CX509BasicConstraintsExt* self = new(ELeave) CX509BasicConstraintsExt;
68 CleanupStack::PushL(self);
69 self->ConstructL(aBinaryData, aPos);
73 void CX509BasicConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
75 //sequence of 2 optional components, a bool and an int
76 TASN1DecSequence encSeq;
77 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
78 TInt count = seq->Count();
82 TBool doneInt = EFalse;
83 TASN1DecGeneric* curr = seq->At(pos);
85 if (curr->Tag() == EASN1Boolean)
87 TASN1DecBoolean encBool;
88 iIsCA = encBool.DecodeDERL(*curr);
92 TASN1DecInteger encInt;
93 iMaxChainLen = encInt.DecodeDERShortL(*curr);
100 User::Leave(KErrArgument);
104 TASN1DecInteger encInt;
105 iMaxChainLen = encInt.DecodeDERShortL(*curr);
106 if (iMaxChainLen < 0)
108 User::Leave(KErrArgument);
114 User::Leave(KErrArgument);
116 CleanupStack::PopAndDestroy();//seq
119 CX509BasicConstraintsExt::CX509BasicConstraintsExt()
120 :iIsCA(EFalse), iMaxChainLen(KMaxTInt)
124 CX509BasicConstraintsExt::~CX509BasicConstraintsExt()
128 EXPORT_C TBool CX509BasicConstraintsExt::IsCA() const
133 EXPORT_C TInt CX509BasicConstraintsExt::MaxChainLength() const
139 //#pragma message ("creating empty CX509AltNameExt and destroying it kills process")
140 EXPORT_C CX509AltNameExt* CX509AltNameExt::NewL(const TDesC8& aBinaryData)
143 return CX509AltNameExt::NewL(aBinaryData, pos);
146 EXPORT_C CX509AltNameExt* CX509AltNameExt::NewLC(const TDesC8& aBinaryData)
149 return CX509AltNameExt::NewLC(aBinaryData, pos);
152 EXPORT_C CX509AltNameExt* CX509AltNameExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
154 CX509AltNameExt* self = CX509AltNameExt::NewLC(aBinaryData, aPos);
159 EXPORT_C CX509AltNameExt* CX509AltNameExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
161 CX509AltNameExt* self = new(ELeave) CX509AltNameExt;
162 CleanupStack::PushL(self);
163 self->ConstructL(aBinaryData, aPos);
167 void CX509AltNameExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
169 // The sequence should have at least 1 name here, previously this was checked
170 // but now zero lengths sequences are tolerated.
172 // RFC 3280 requires that CAs ensure that the SubjectAltName is not empty if it exists. The
173 // behaviour of the client is undefined if this condition occurs. Since this code will
174 // normally be used as a client (i.e. not the CA) and there should be no need to validate
175 // the SubjectAltName we do not enfore a minimum sequence length.
176 // This avoids TLS connections being dropped unecessarily.
178 TASN1DecSequence encSeq;
179 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 0, KMaxTInt);
180 TInt count = seq->Count();
181 iAuthorityName = new(ELeave) CArrayPtrFlat<CX509GeneralName> (1);
182 TASN1DecGeneric* gen;
183 for (TInt i = 0; i < count; i++)
186 CX509GeneralName* gn = CX509GeneralName::NewLC(gen->Encoding());
187 iAuthorityName->AppendL(gn);
188 CleanupStack::Pop();//gn
190 CleanupStack::PopAndDestroy();
193 CX509AltNameExt::~CX509AltNameExt()
195 if (iAuthorityName != NULL)
197 iAuthorityName->ResetAndDestroy();
198 delete iAuthorityName;
202 EXPORT_C const CArrayPtrFlat<CX509GeneralName>& CX509AltNameExt::AltName() const
204 return *iAuthorityName;
207 EXPORT_C TBool CX509AltNameExt::Match(const CX509AltNameExt& aExt) const
210 const CArrayPtrFlat<CX509GeneralName>& otherGNs = aExt.AltName();
211 TInt otherGNCount = otherGNs.Count();
212 TInt thisGNCount = iAuthorityName->Count();
213 if (otherGNCount != thisGNCount)
219 for (TInt j = 0; j < otherGNCount; j++)
221 const CX509GeneralName* otherGN = otherGNs.At(j);
222 const CX509GeneralName* thisGN = iAuthorityName->At(j);
223 if (!thisGN->ExactMatch(*otherGN))
232 CX509AltNameExt::CX509AltNameExt()
237 CX509BitString::~CX509BitString()
242 TBool CX509BitString::IsSet(TInt aBit) const
244 if (aBit < iLength)//offset from zero
246 TPtrC8 d(iData->Des());
247 TUint8 oct = d[(aBit/8)];
248 TUint mask = (1 << (7-(aBit % 8)));
254 CX509BitString::CX509BitString(HBufC8* aData, TInt aLength)
255 :iData(aData), iLength(aLength)
259 EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewL(const TDesC8& aBinaryData)
262 return CX509KeyUsageExt::NewL(aBinaryData, pos);
265 EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewLC(const TDesC8& aBinaryData)
268 return CX509KeyUsageExt::NewLC(aBinaryData, pos);
271 EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
273 CX509KeyUsageExt* self = CX509KeyUsageExt::NewLC(aBinaryData, aPos);
278 EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
280 CX509KeyUsageExt* self = new(ELeave) CX509KeyUsageExt;
281 CleanupStack::PushL(self);
282 self->ConstructL(aBinaryData, aPos);
286 void CX509KeyUsageExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
288 TASN1DecGeneric gen(aBinaryData.Right(aBinaryData.Length() - aPos));
290 if (gen.Tag() != EASN1BitString)
292 User::Leave(KErrArgument);
294 TPtrC8 p(gen.GetContentDER());
297 User::Leave(KErrArgument);
299 TPtrC8 pData(p.Right(p.Length() - 1));
300 TInt paddingLength = p[0];
301 TInt bitStringLength = (pData.Length() * 8) - paddingLength;
302 HBufC8* bitString = pData.AllocL();
303 CleanupStack::PushL(bitString);
304 iData = new(ELeave) CX509BitString(bitString, bitStringLength);
305 CleanupStack::Pop();//bitstring
306 aPos += gen.LengthDER();
309 CX509KeyUsageExt::CX509KeyUsageExt()
313 CX509KeyUsageExt::~CX509KeyUsageExt()
318 EXPORT_C TBool CX509KeyUsageExt::IsSet(TX509KeyUsage aUsage) const
320 return iData->IsSet(aUsage);
323 //4) name constraints
324 CX509GeneralSubtree* CX509GeneralSubtree::NewL(const TDesC8& aBinaryData)
327 return CX509GeneralSubtree::NewL(aBinaryData, pos);
330 CX509GeneralSubtree* CX509GeneralSubtree::NewLC(const TDesC8& aBinaryData)
333 return CX509GeneralSubtree::NewLC(aBinaryData, pos);
336 CX509GeneralSubtree* CX509GeneralSubtree::NewL(const TDesC8& aBinaryData, TInt& aPos)
338 CX509GeneralSubtree* self = CX509GeneralSubtree::NewLC(aBinaryData, aPos);
343 CX509GeneralSubtree* CX509GeneralSubtree::NewLC(const TDesC8& aBinaryData, TInt& aPos)
345 CX509GeneralSubtree* self = new(ELeave) CX509GeneralSubtree;
346 CleanupStack::PushL(self);
347 self->ConstructL(aBinaryData, aPos);
351 void CX509GeneralSubtree::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
353 TASN1DecSequence encSeq;
354 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);//(seq here must have at least 1 name)
355 TInt count = seq->Count();
357 TASN1DecGeneric* curr = seq->At(pos);
359 iName = CX509GeneralName::NewL(curr->Encoding());
362 TBool doneMax = EFalse;
365 if (curr->Class() != EContextSpecific)
367 User::Leave(KErrArgument);
373 TASN1DecInteger encInt;
374 iMinDist = encInt.DecodeDERShortL(*curr);
379 TASN1DecInteger encInt;
380 iMaxDist = encInt.DecodeDERShortL(*curr);
388 if ((doneMax) || (curr->Class() != EContextSpecific) || (curr->Tag() != 1))
390 User::Leave(KErrArgument);
392 TASN1DecInteger encInt;
393 iMaxDist = encInt.DecodeDERShortL(*curr);
398 User::Leave(KErrArgument);
400 CleanupStack::PopAndDestroy();
403 CX509GeneralSubtree::~CX509GeneralSubtree()
408 EXPORT_C const CX509GeneralName& CX509GeneralSubtree::Name() const
413 EXPORT_C TInt CX509GeneralSubtree::MinDistance() const
418 EXPORT_C TInt CX509GeneralSubtree::MaxDistance() const
423 CX509GeneralSubtree::CX509GeneralSubtree()
424 :iMaxDist(KMaxTInt), iMinDist(0)
429 EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewL(const TDesC8& aBinaryData)
432 return CX509NameConstraintsExt::NewL(aBinaryData, pos);
435 EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewLC(const TDesC8& aBinaryData)
438 return CX509NameConstraintsExt::NewLC(aBinaryData, pos);
441 EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
443 CX509NameConstraintsExt* self = CX509NameConstraintsExt::NewLC(aBinaryData, aPos);
448 EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
450 CX509NameConstraintsExt* self = new(ELeave) CX509NameConstraintsExt;
451 CleanupStack::PushL(self);
452 self->ConstructL(aBinaryData, aPos);
456 void CX509NameConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
458 TASN1DecSequence encSeq;
459 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
460 TInt count = seq->Count();
463 iExcludedSubtrees = new(ELeave) CArrayPtrFlat<CX509GeneralSubtree> (1);
464 iPermittedSubtrees = new(ELeave) CArrayPtrFlat<CX509GeneralSubtree> (1);
465 TBool doneExcluded = EFalse;
469 TASN1DecGeneric* curr = seq->At(pos);
471 if (curr->Class() != EContextSpecific)
473 User::Leave(KErrArgument);
479 AddSubtreesL(*iPermittedSubtrees, curr->Encoding());
484 AddSubtreesL(*iExcludedSubtrees, curr->Encoding());
485 doneExcluded = ETrue;
490 User::Leave(KErrArgument);
497 if ((curr->Class() != EContextSpecific) || (curr->Tag() != 1) || (doneExcluded))
499 User::Leave(KErrArgument);
501 AddSubtreesL(*iExcludedSubtrees, curr->Encoding());
504 CleanupStack::PopAndDestroy();//seq
507 void CX509NameConstraintsExt::AddSubtreesL( CArrayPtrFlat<CX509GeneralSubtree>& aSubtrees,
508 const TDesC8& aBinaryData)
510 TASN1DecSequence encSeq;
512 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, pos, 1, KMaxTInt);
513 TInt count = seq->Count();
514 TASN1DecGeneric* gen;
515 for(TInt i = 0; i < count; i++)
518 CX509GeneralSubtree* subtree = CX509GeneralSubtree::NewLC(gen->Encoding());
519 aSubtrees.AppendL(subtree);
522 CleanupStack::PopAndDestroy();
525 EXPORT_C CX509NameConstraintsExt::~CX509NameConstraintsExt()
527 if (iExcludedSubtrees != NULL)
529 iExcludedSubtrees->ResetAndDestroy();
530 delete iExcludedSubtrees;
532 if (iPermittedSubtrees != NULL)
534 iPermittedSubtrees->ResetAndDestroy();
535 delete iPermittedSubtrees;
539 EXPORT_C const CArrayPtrFlat<CX509GeneralSubtree>& CX509NameConstraintsExt::ExcludedSubtrees() const
541 return *iExcludedSubtrees;
544 EXPORT_C const CArrayPtrFlat<CX509GeneralSubtree>& CX509NameConstraintsExt::PermittedSubtrees() const
546 return *iPermittedSubtrees;
549 CX509NameConstraintsExt::CX509NameConstraintsExt()
553 //5) policy constraints
554 TX509PolicyConstraint::TX509PolicyConstraint(TBool aRequired, TInt aCountdown)
555 :iRequired(aRequired), iCountdown(aCountdown)
559 TX509PolicyConstraint::TX509PolicyConstraint()
560 :iRequired(EFalse), iCountdown(0)
565 EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewL(const TDesC8& aBinaryData)
568 return CX509PolicyConstraintsExt::NewL(aBinaryData, pos);
571 EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewLC(const TDesC8& aBinaryData)
574 return CX509PolicyConstraintsExt::NewLC(aBinaryData, pos);
577 EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
579 CX509PolicyConstraintsExt* self = CX509PolicyConstraintsExt::NewLC(aBinaryData, aPos);
584 EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
586 CX509PolicyConstraintsExt* self = new(ELeave) CX509PolicyConstraintsExt;
587 CleanupStack::PushL(self);
588 self->ConstructL(aBinaryData, aPos);
592 void CX509PolicyConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
594 TASN1DecSequence encSeq;
595 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
596 TInt count = seq->Count();
598 TASN1DecGeneric* curr;
603 if (curr->Class() != EContextSpecific)
605 User::Leave(KErrArgument);
611 iRequirePolicy.iRequired = ETrue;
612 TASN1DecInteger encInt;
613 iRequirePolicy.iCountdown = encInt.DecodeDERShortL(*curr);
618 iInhibitPolicyMapping.iRequired = ETrue;
619 TASN1DecInteger encInt;
620 iInhibitPolicyMapping.iCountdown = encInt.DecodeDERShortL(*curr);
625 User::Leave(KErrArgument);
632 if ((iInhibitPolicyMapping.iRequired) || (curr->Class() != EContextSpecific) || (curr->Tag() != 1))
634 User::Leave(KErrArgument);
636 iInhibitPolicyMapping.iRequired = ETrue;
637 TASN1DecInteger encInt;
638 iInhibitPolicyMapping.iCountdown = encInt.DecodeDERShortL(*curr);
643 User::Leave(KErrArgument);
645 CleanupStack::PopAndDestroy();
648 CX509PolicyConstraintsExt::CX509PolicyConstraintsExt()
652 EXPORT_C CX509PolicyConstraintsExt::~CX509PolicyConstraintsExt()
656 EXPORT_C TX509PolicyConstraint CX509PolicyConstraintsExt::ExplicitPolicyRequired() const
658 return iRequirePolicy;
661 EXPORT_C TX509PolicyConstraint CX509PolicyConstraintsExt::InhibitPolicyMapping() const
663 return iInhibitPolicyMapping;
667 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const TDesC8& aBinaryData)
670 return CX509PolicyQualifierInfo::NewL(aBinaryData, pos);
673 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const TDesC8& aBinaryData)
676 return CX509PolicyQualifierInfo::NewLC(aBinaryData, pos);
679 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const TDesC8& aBinaryData, TInt& aPos)
681 CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aBinaryData, aPos);
686 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const TDesC8& aBinaryData, TInt& aPos)
688 CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo;
689 CleanupStack::PushL(self);
690 self->ConstructL(aBinaryData, aPos);
694 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const CX509PolicyQualifierInfo& aQualifier)
696 CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aQualifier);
697 CleanupStack::Pop();//self
701 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const CX509PolicyQualifierInfo& aQualifier)
703 CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo;
704 CleanupStack::PushL(self);
705 self->ConstructL(aQualifier);
709 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(RReadStream& aStream)
711 CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aStream);
716 CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(RReadStream& aStream)
718 CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo();
719 CleanupStack::PushL(self);
720 self->ConstructL(aStream);
724 void CX509PolicyQualifierInfo::ConstructL(RReadStream& aStream)
726 InternalizeL(aStream);
729 void CX509PolicyQualifierInfo::ConstructL(const CX509PolicyQualifierInfo& aQualifier)
731 iPolicyQualifierId = aQualifier.iPolicyQualifierId->Des().AllocL();//must be a better way to do this!!
732 iData = aQualifier.iData->Des().AllocL();//must be a better way to do this!!
735 void CX509PolicyQualifierInfo::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
737 TASN1DecSequence encSeq;
738 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
739 TInt count = seq->Count();
741 TASN1DecGeneric* curr = seq->At(pos);
743 TASN1DecObjectIdentifier encOID;
744 iPolicyQualifierId = encOID.DecodeDERL(*curr);
747 iData = curr->Encoding().AllocL();
752 iData = HBufC8::NewL(1);
757 User::Leave(KErrArgument);
759 CleanupStack::PopAndDestroy();
762 CX509PolicyQualifierInfo::CX509PolicyQualifierInfo()
766 CX509PolicyQualifierInfo::~CX509PolicyQualifierInfo()
768 delete iPolicyQualifierId;
772 EXPORT_C TPtrC CX509PolicyQualifierInfo::Id() const
774 return iPolicyQualifierId->Des();
777 EXPORT_C TPtrC8 CX509PolicyQualifierInfo::Data() const
782 void CX509PolicyQualifierInfo::ExternalizeL(RWriteStream& aStream) const
785 aStream << *iPolicyQualifierId;
791 void CX509PolicyQualifierInfo::InternalizeL(RReadStream& aStream)
794 delete iPolicyQualifierId;
795 iPolicyQualifierId=0;
796 iPolicyQualifierId=HBufC::NewL(aStream, KMaxTInt);
801 iData=HBufC8::NewL(aStream, KMaxTInt);
805 CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const TDesC8& aBinaryData)
808 return CX509CertPolicyInfo::NewL(aBinaryData, pos);
811 CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const TDesC8& aBinaryData)
814 return CX509CertPolicyInfo::NewLC(aBinaryData, pos);
817 CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const TDesC8& aBinaryData, TInt& aPos)
819 CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aBinaryData, aPos);
824 CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const TDesC8& aBinaryData, TInt& aPos)
826 CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo;
827 CleanupStack::PushL(self);
828 self->ConstructL(aBinaryData, aPos);
833 EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(RReadStream& aStream)
835 CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aStream);
840 EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(RReadStream& aStream)
842 CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo();
843 CleanupStack::PushL(self);
844 self->ConstructL(aStream);
848 EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const CX509CertPolicyInfo& aInfo)
850 CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aInfo);
851 CleanupStack::Pop();//self
855 EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const CX509CertPolicyInfo& aInfo)
857 CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo;
858 CleanupStack::PushL(self);
859 self->ConstructL(aInfo);
863 void CX509CertPolicyInfo::ConstructL(RReadStream& aStream)
865 InternalizeL(aStream);
868 void CX509CertPolicyInfo::ConstructL(const CX509CertPolicyInfo& aInfo)
870 iCertPolicyId = aInfo.iCertPolicyId->Des().AllocL();//must be a better way to do this!!
871 iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
872 TInt count = aInfo.iQualifiers->Count();
873 for (TInt i = 0; i < count; i++)
875 CX509PolicyQualifierInfo* q = CX509PolicyQualifierInfo::NewLC(*(aInfo.iQualifiers->At(i)));
876 iQualifiers->AppendL(q);
877 CleanupStack::Pop();//q
881 void CX509CertPolicyInfo::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
883 TASN1DecSequence encSeq;
884 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
885 TInt count = seq->Count();
887 TASN1DecGeneric* curr = seq->At(pos);
890 TASN1DecObjectIdentifier encOID;
891 iCertPolicyId = encOID.DecodeDERL(*curr);
892 iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
897 TASN1DecSequence encSeqQualifier;
898 CArrayPtrFlat<TASN1DecGeneric>* seqQualifier = encSeqQualifier.DecodeDERLC(*curr);
899 TInt qCount = seqQualifier->Count();
900 for(TInt i = 0; i < qCount; i++)
902 TASN1DecGeneric* qGen = seqQualifier->At(i);
903 CX509PolicyQualifierInfo* qualifier = CX509PolicyQualifierInfo::NewLC(qGen->Encoding());
904 iQualifiers->AppendL(qualifier);
905 CleanupStack::Pop();//qualifier
907 CleanupStack::PopAndDestroy();
911 User::Leave(KErrArgument);
913 CleanupStack::PopAndDestroy();
916 CX509CertPolicyInfo::~CX509CertPolicyInfo()
918 if (iQualifiers != NULL)
920 iQualifiers->ResetAndDestroy();
923 delete iCertPolicyId;
926 EXPORT_C const CArrayPtrFlat<CX509PolicyQualifierInfo>& CX509CertPolicyInfo::Qualifiers() const
931 EXPORT_C TPtrC CX509CertPolicyInfo::Id() const
933 return iCertPolicyId->Des();
936 CX509CertPolicyInfo::CX509CertPolicyInfo()
940 EXPORT_C void CX509CertPolicyInfo::ExternalizeL(RWriteStream& aStream) const
943 aStream << *iCertPolicyId;
946 aStream.WriteInt32L(iQualifiers->Count());
947 for (TInt32 i=0;i < iQualifiers->Count(); ++i)
949 (*iQualifiers)[i]->ExternalizeL(aStream);
953 EXPORT_C void CX509CertPolicyInfo::InternalizeL(RReadStream& aStream)
956 delete iCertPolicyId;
958 iCertPolicyId=HBufC::NewL(aStream, KMaxTInt);
961 if (iQualifiers != NULL)
963 iQualifiers->ResetAndDestroy();
967 iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
970 TInt32 count=aStream.ReadInt32L();
971 for (TInt32 i=0;i < count; ++i)
973 CX509PolicyQualifierInfo* policyQualifierInfo=CX509PolicyQualifierInfo::NewLC(aStream);
974 iQualifiers->AppendL(policyQualifierInfo);
975 CleanupStack::Pop(policyQualifierInfo);
979 EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewL(const TDesC8& aBinaryData)
982 return CX509CertPoliciesExt::NewL(aBinaryData, pos);
985 EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewLC(const TDesC8& aBinaryData)
988 return CX509CertPoliciesExt::NewLC(aBinaryData, pos);
991 EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
993 CX509CertPoliciesExt* self = CX509CertPoliciesExt::NewLC(aBinaryData, aPos);
998 EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1000 CX509CertPoliciesExt* self = new(ELeave) CX509CertPoliciesExt;
1001 CleanupStack::PushL(self);
1002 self->ConstructL(aBinaryData, aPos);
1006 void CX509CertPoliciesExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1008 TASN1DecSequence encSeq;
1009 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
1010 TInt count = seq->Count();
1011 iPolicies = new(ELeave) CArrayPtrFlat<CX509CertPolicyInfo> (1);
1012 TASN1DecGeneric* gen;
1013 for (TInt i = 0; i < count; i++)
1016 CX509CertPolicyInfo* policy = CX509CertPolicyInfo::NewLC(gen->Encoding());
1017 iPolicies->AppendL(policy);
1018 CleanupStack::Pop();//policy
1020 CleanupStack::PopAndDestroy();
1023 CX509CertPoliciesExt::~CX509CertPoliciesExt()
1025 if (iPolicies != NULL)
1027 iPolicies->ResetAndDestroy();
1032 EXPORT_C const CArrayPtrFlat<CX509CertPolicyInfo>& CX509CertPoliciesExt::Policies() const
1037 CX509CertPoliciesExt::CX509CertPoliciesExt()
1042 CX509PolicyMapping* CX509PolicyMapping::NewL(const TDesC8& aBinaryData)
1045 return CX509PolicyMapping::NewL(aBinaryData, pos);
1048 CX509PolicyMapping* CX509PolicyMapping::NewLC(const TDesC8& aBinaryData)
1051 return CX509PolicyMapping::NewLC(aBinaryData, pos);
1054 CX509PolicyMapping* CX509PolicyMapping::NewL(const TDesC8& aBinaryData, TInt& aPos)
1056 CX509PolicyMapping* self = CX509PolicyMapping::NewLC(aBinaryData, aPos);
1057 CleanupStack::Pop();
1061 CX509PolicyMapping* CX509PolicyMapping::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1063 CX509PolicyMapping* self = new(ELeave) CX509PolicyMapping;
1064 CleanupStack::PushL(self);
1065 self->ConstructL(aBinaryData, aPos);
1069 EXPORT_C CX509PolicyMapping* CX509PolicyMapping::NewL(const CX509PolicyMapping& aMapping)
1071 CX509PolicyMapping* self = CX509PolicyMapping::NewLC(aMapping);
1072 CleanupStack::Pop();
1076 EXPORT_C CX509PolicyMapping* CX509PolicyMapping::NewLC(const CX509PolicyMapping& aMapping)
1078 CX509PolicyMapping* self = new(ELeave) CX509PolicyMapping;
1079 CleanupStack::PushL(self);
1080 self->ConstructL(aMapping);
1084 void CX509PolicyMapping::ConstructL(const CX509PolicyMapping& aMapping)
1086 iIssuerPolicy = aMapping.iIssuerPolicy->AllocL();
1087 iSubjectPolicy = aMapping.iSubjectPolicy->AllocL();
1090 void CX509PolicyMapping::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
1092 TASN1DecSequence encSeq;
1093 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
1094 if (seq->Count() < 2)
1096 User::Leave(KErrArgument);
1098 TASN1DecObjectIdentifier encOID;
1099 iIssuerPolicy = encOID.DecodeDERL(*(seq->At(0)));
1100 iSubjectPolicy = encOID.DecodeDERL(*(seq->At(1)));
1101 CleanupStack::PopAndDestroy();
1104 CX509PolicyMapping::~CX509PolicyMapping()
1106 delete iIssuerPolicy;
1107 delete iSubjectPolicy;
1110 EXPORT_C TPtrC CX509PolicyMapping::IssuerPolicy() const
1112 return iIssuerPolicy->Des();
1115 EXPORT_C TPtrC CX509PolicyMapping::SubjectPolicy() const
1117 return iSubjectPolicy->Des();
1120 CX509PolicyMapping::CX509PolicyMapping()
1124 EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewL(const TDesC8& aBinaryData)
1127 return CX509PolicyMappingExt::NewL(aBinaryData, pos);
1130 EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewLC(const TDesC8& aBinaryData)
1133 return CX509PolicyMappingExt::NewLC(aBinaryData, pos);
1136 EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
1138 CX509PolicyMappingExt* self = CX509PolicyMappingExt::NewLC(aBinaryData, aPos);
1139 CleanupStack::Pop();
1143 EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1145 CX509PolicyMappingExt* self = new(ELeave) CX509PolicyMappingExt;
1146 CleanupStack::PushL(self);
1147 self->ConstructL(aBinaryData, aPos);
1151 void CX509PolicyMappingExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1153 TASN1DecSequence encSeq;
1154 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
1155 TInt count = seq->Count();
1157 iPolicies = new(ELeave) CArrayPtrFlat<CX509PolicyMapping> (1);
1158 TASN1DecGeneric* gen;
1159 for (TInt i = 0; i < count; i++)
1162 CX509PolicyMapping* policy = CX509PolicyMapping::NewLC(gen->Encoding());
1163 iPolicies->AppendL(policy);
1164 CleanupStack::Pop();//policy
1166 CleanupStack::PopAndDestroy();
1169 CX509PolicyMappingExt::~CX509PolicyMappingExt()
1171 if (iPolicies != NULL)
1173 iPolicies->ResetAndDestroy();
1178 EXPORT_C const CArrayPtrFlat<CX509PolicyMapping>& CX509PolicyMappingExt::Mappings() const
1183 CX509PolicyMappingExt::CX509PolicyMappingExt()
1187 //8) authority key ID
1188 EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewL(const TDesC8& aBinaryData)
1191 return CX509AuthorityKeyIdExt::NewL(aBinaryData, pos);
1194 EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewLC(const TDesC8& aBinaryData)
1197 return CX509AuthorityKeyIdExt::NewLC(aBinaryData, pos);
1200 EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
1202 CX509AuthorityKeyIdExt* self = CX509AuthorityKeyIdExt::NewLC(aBinaryData, aPos);
1203 CleanupStack::Pop();
1207 EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1209 CX509AuthorityKeyIdExt* self = new(ELeave) CX509AuthorityKeyIdExt;
1210 CleanupStack::PushL(self);
1211 self->ConstructL(aBinaryData, aPos);
1215 void CX509AuthorityKeyIdExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1217 TASN1DecSequence encSeq;
1218 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
1219 TInt count = seq->Count();
1222 iAuthorityName = new(ELeave) CArrayPtrFlat<CX509GeneralName> (1);
1223 TASN1DecGeneric* curr;
1226 curr = seq->At(pos);
1228 if (curr->Class() != EContextSpecific)
1230 User::Leave(KErrArgument);
1236 DecodeKeyIdL(curr->Encoding());
1241 DecodeNameL(curr->Encoding());
1246 DecodeSerialNoL(curr->Encoding());
1251 User::Leave(KErrArgument);
1256 curr = seq->At(pos);
1258 if (curr->Class() != EContextSpecific)
1260 User::Leave(KErrArgument);
1266 DecodeNameL(curr->Encoding());
1271 DecodeSerialNoL(curr->Encoding());
1276 User::Leave(KErrArgument);
1281 curr = seq->At(pos);
1283 if ((curr->Class() != EContextSpecific) || (curr->Tag() != 2))
1285 User::Leave(KErrArgument);
1287 DecodeSerialNoL(curr->Encoding());
1291 if (!iKeyIdentifier)
1293 iKeyIdentifier = HBufC8::NewL(1);
1294 *iKeyIdentifier = KNullDesC8;
1296 if (!iAuthorityCertSerialNumber)
1298 iAuthorityCertSerialNumber = HBufC8::NewL(1);
1299 *iAuthorityCertSerialNumber = KNullDesC8;
1301 CleanupStack::PopAndDestroy();
1304 void CX509AuthorityKeyIdExt::DecodeNameL(const TDesC8& aBinaryData)
1306 TASN1DecSequence encSeq;
1308 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, pos, 1, KMaxTInt);
1309 TInt count = seq->Count();
1310 TASN1DecGeneric* gen;
1311 for (TInt i = 0; i < count; i++)
1314 CX509GeneralName* gn = CX509GeneralName::NewLC(gen->Encoding());
1315 iAuthorityName->AppendL(gn);
1316 CleanupStack::Pop();//gn
1318 CleanupStack::PopAndDestroy();
1321 void CX509AuthorityKeyIdExt::DecodeKeyIdL(const TDesC8& aBinaryData)
1323 TASN1DecGeneric gen(aBinaryData);
1325 if (iKeyIdentifier != NULL)
1327 User::Leave(KErrArgument);
1329 iKeyIdentifier = gen.GetContentDER().AllocL();
1332 void CX509AuthorityKeyIdExt::DecodeSerialNoL(const TDesC8& aBinaryData)
1334 TASN1DecGeneric gen(aBinaryData);
1336 if (iAuthorityCertSerialNumber != NULL)
1338 User::Leave(KErrArgument);
1340 iAuthorityCertSerialNumber = gen.GetContentDER().AllocL();
1343 CX509AuthorityKeyIdExt::~CX509AuthorityKeyIdExt()
1345 if (iAuthorityName != NULL)
1347 iAuthorityName->ResetAndDestroy();
1349 delete iAuthorityName;
1350 delete iAuthorityCertSerialNumber;
1351 delete iKeyIdentifier;
1354 EXPORT_C const CArrayPtrFlat<CX509GeneralName>& CX509AuthorityKeyIdExt::AuthorityName() const
1356 return *iAuthorityName;
1359 EXPORT_C TPtrC8 CX509AuthorityKeyIdExt::AuthorityCertSerialNumber() const
1361 return iAuthorityCertSerialNumber->Des();
1364 EXPORT_C TPtrC8 CX509AuthorityKeyIdExt::KeyId() const
1366 return iKeyIdentifier->Des();
1369 CX509AuthorityKeyIdExt::CX509AuthorityKeyIdExt()
1374 EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewL(const TDesC8& aBinaryData)
1377 return CX509SubjectKeyIdExt::NewL(aBinaryData, pos);
1380 EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewLC(const TDesC8& aBinaryData)
1383 return CX509SubjectKeyIdExt::NewLC(aBinaryData, pos);
1386 EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
1388 CX509SubjectKeyIdExt* self = CX509SubjectKeyIdExt::NewLC(aBinaryData, aPos);
1389 CleanupStack::Pop();
1393 EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1395 CX509SubjectKeyIdExt* self = new(ELeave) CX509SubjectKeyIdExt;
1396 CleanupStack::PushL(self);
1397 self->ConstructL(aBinaryData, aPos);
1401 void CX509SubjectKeyIdExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1403 TASN1DecOctetString octetStr;
1404 iKeyIdentifier = octetStr.DecodeDERL(aBinaryData, aPos);
1407 EXPORT_C CX509SubjectKeyIdExt::~CX509SubjectKeyIdExt()
1409 delete iKeyIdentifier;
1412 EXPORT_C TPtrC8 CX509SubjectKeyIdExt::KeyId() const
1414 return iKeyIdentifier->Des();
1417 CX509SubjectKeyIdExt::CX509SubjectKeyIdExt()
1421 //10) extended key usage
1422 EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewL(const TDesC8& aBinaryData)
1425 return CX509ExtendedKeyUsageExt::NewL(aBinaryData, pos);
1428 EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewLC(const TDesC8& aBinaryData)
1431 return CX509ExtendedKeyUsageExt::NewLC(aBinaryData, pos);
1434 EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
1436 CX509ExtendedKeyUsageExt* self = CX509ExtendedKeyUsageExt::NewLC(aBinaryData, aPos);
1437 CleanupStack::Pop();
1441 EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1443 CX509ExtendedKeyUsageExt* self = new(ELeave) CX509ExtendedKeyUsageExt;
1444 CleanupStack::PushL(self);
1445 self->ConstructL(aBinaryData, aPos);
1449 void CX509ExtendedKeyUsageExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1451 TASN1DecSequence encSeq;
1452 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
1453 TInt count = seq->Count();
1455 iKeyUsages = new(ELeave) CArrayPtrFlat<HBufC> (1);
1456 TASN1DecGeneric* gen;
1457 for (TInt i = 0; i < count; i++)
1460 TASN1DecObjectIdentifier encOID;
1461 HBufC* usage = encOID.DecodeDERL(*gen);
1462 CleanupStack::PushL(usage);
1463 iKeyUsages->AppendL(usage);
1464 CleanupStack::Pop();
1466 CleanupStack::PopAndDestroy();
1469 EXPORT_C CX509ExtendedKeyUsageExt::~CX509ExtendedKeyUsageExt()
1471 if (iKeyUsages != NULL)
1473 iKeyUsages->ResetAndDestroy();
1478 EXPORT_C const CArrayPtrFlat<HBufC>& CX509ExtendedKeyUsageExt::KeyUsages() const
1483 CX509ExtendedKeyUsageExt::CX509ExtendedKeyUsageExt()
1487 //12) authority information access - CX509AccessDescription
1489 CX509AccessDescription* CX509AccessDescription::NewL(const TDesC8& aBinaryData)
1492 return NewL(aBinaryData, pos);
1495 CX509AccessDescription* CX509AccessDescription::NewLC(const TDesC8& aBinaryData)
1498 return NewLC(aBinaryData, pos);
1501 CX509AccessDescription* CX509AccessDescription::NewL(const TDesC8& aBinaryData, TInt& aPos)
1503 CX509AccessDescription* self = NewLC(aBinaryData, aPos);
1504 CleanupStack::Pop(self);
1508 CX509AccessDescription* CX509AccessDescription::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1510 CX509AccessDescription* self = new (ELeave) CX509AccessDescription;
1511 CleanupStack::PushL(self);
1512 self->ConstructL(aBinaryData, aPos);
1516 CX509AccessDescription::CX509AccessDescription()
1521 void CX509AccessDescription::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
1523 TASN1DecSequence encSeq;
1524 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 2, 2);
1526 TASN1DecGeneric* curr = seq->At(0);
1527 TASN1DecObjectIdentifier encOID;
1528 iMethodId = encOID.DecodeDERL(*curr);
1531 iLocation = CX509GeneralName::NewL(curr->Encoding());
1533 CleanupStack::PopAndDestroy(seq);
1536 CX509AccessDescription::~CX509AccessDescription()
1542 EXPORT_C TPtrC CX509AccessDescription::Method() const
1547 EXPORT_C const CX509GeneralName& CX509AccessDescription::Location() const
1552 //12) authority information access - CX509AuthInfoAccessExt
1554 EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewL(const TDesC8& aBinaryData)
1557 return NewL(aBinaryData, pos);
1560 EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewLC(const TDesC8& aBinaryData)
1563 return NewLC(aBinaryData, pos);
1566 EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
1568 CX509AuthInfoAccessExt* self = NewLC(aBinaryData, aPos);
1569 CleanupStack::Pop(self);
1573 EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
1575 CX509AuthInfoAccessExt* self = new (ELeave) CX509AuthInfoAccessExt;
1576 CleanupStack::PushL(self);
1577 self->ConstructL(aBinaryData, aPos);
1581 CX509AuthInfoAccessExt::CX509AuthInfoAccessExt()
1586 void CX509AuthInfoAccessExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
1588 TASN1DecSequence encSeq;
1589 CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
1590 TInt count = seq->Count();
1592 iAccessDescs = new (ELeave) CArrayPtrFlat<CX509AccessDescription>(1);
1594 for (TInt i = 0 ; i < count ; ++i)
1596 TASN1DecGeneric* curr = seq->At(i);
1597 CX509AccessDescription* desc = CX509AccessDescription::NewLC(curr->Encoding());
1598 iAccessDescs->AppendL(desc);
1599 CleanupStack::Pop(desc);
1602 CleanupStack::PopAndDestroy(seq);
1605 EXPORT_C CX509AuthInfoAccessExt::~CX509AuthInfoAccessExt()
1609 iAccessDescs->ResetAndDestroy();
1610 delete iAccessDescs;
1614 EXPORT_C const CArrayPtrFlat<CX509AccessDescription>& CX509AuthInfoAccessExt::AccessDescriptions() const
1616 return *iAccessDescs;