os/security/cryptoservices/certificateandkeymgmt/pkcs7/cmscertchoice.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <cmscertchoice.h>
sl@0
    20
#include "pkcs7asn1.h"
sl@0
    21
#include <asn1dec.h>
sl@0
    22
#include <x509cert.h>
sl@0
    23
#include <asn1enc.h>
sl@0
    24
#include "cmsutils.h"
sl@0
    25
sl@0
    26
//Implementation of CMS Certificate Choice
sl@0
    27
sl@0
    28
CCmsCertificateChoice* CCmsCertificateChoice::NewL(const TDesC8& aRawData)
sl@0
    29
	{
sl@0
    30
	CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
sl@0
    31
	CleanupStack::PushL(self);
sl@0
    32
	self->ConstructL(aRawData);
sl@0
    33
	CleanupStack::Pop(self);
sl@0
    34
	return self;
sl@0
    35
	}
sl@0
    36
sl@0
    37
CCmsCertificateChoice::~CCmsCertificateChoice()
sl@0
    38
	{
sl@0
    39
	delete iCertificate;
sl@0
    40
	delete iEncodedAttributeCertificate;
sl@0
    41
	}
sl@0
    42
sl@0
    43
CCmsCertificateChoice::CCmsCertificateChoice()
sl@0
    44
	{
sl@0
    45
	}
sl@0
    46
sl@0
    47
void CCmsCertificateChoice::ConstructL(const TDesC8& aRawData)
sl@0
    48
	{
sl@0
    49
	TASN1DecGeneric decGen(aRawData);
sl@0
    50
	decGen.InitL();
sl@0
    51
		
sl@0
    52
	if (decGen.Tag()==EASN1Sequence && decGen.Class()==EUniversal)
sl@0
    53
		{
sl@0
    54
		// x509 certificates
sl@0
    55
		iCertificateType=ECertificateX509;
sl@0
    56
		iCertificate = CX509Certificate::NewL(aRawData);
sl@0
    57
		}
sl@0
    58
	else if (decGen.Tag()==1 && decGen.Class()==EContextSpecific)
sl@0
    59
			{
sl@0
    60
			// Attribute certificate
sl@0
    61
			iCertificateType=ECertificateAttribute;
sl@0
    62
			CASN1EncEncoding* enc=CASN1EncEncoding::NewLC(aRawData, EASN1Sequence, EUniversal);
sl@0
    63
			iEncodedAttributeCertificate=CmsUtils::CreateDEREncodingLC(*enc);
sl@0
    64
			CleanupStack::Pop(iEncodedAttributeCertificate);
sl@0
    65
			CleanupStack::PopAndDestroy(enc);
sl@0
    66
			}
sl@0
    67
		else if (decGen.Tag()==0 && decGen.Class()==EContextSpecific)
sl@0
    68
				{
sl@0
    69
				// extended certificates not supported
sl@0
    70
				iCertificateType=ECertificateExtendedCerificate;
sl@0
    71
				User::Leave(KErrNotSupported);
sl@0
    72
				}
sl@0
    73
			else
sl@0
    74
				{
sl@0
    75
				User::Leave(KErrArgument);	
sl@0
    76
				}		
sl@0
    77
	}
sl@0
    78
sl@0
    79
EXPORT_C const CX509Certificate& CCmsCertificateChoice::Certificate(void) const
sl@0
    80
	{
sl@0
    81
	return *iCertificate;
sl@0
    82
	}
sl@0
    83
sl@0
    84
CCmsCertificateChoice* CCmsCertificateChoice::NewLC(const CX509Certificate& aCertificate)
sl@0
    85
	{	
sl@0
    86
	CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
sl@0
    87
	CleanupStack::PushL(self);
sl@0
    88
	self->ConstructL(aCertificate);
sl@0
    89
	return self;
sl@0
    90
	}
sl@0
    91
sl@0
    92
CCmsCertificateChoice* CCmsCertificateChoice::NewL(const CX509Certificate& aCertificate)
sl@0
    93
	{
sl@0
    94
	CCmsCertificateChoice* self = CCmsCertificateChoice::NewLC(aCertificate);
sl@0
    95
	CleanupStack::Pop();
sl@0
    96
	return self;
sl@0
    97
	}
sl@0
    98
sl@0
    99
	
sl@0
   100
CCmsCertificateChoice* CCmsCertificateChoice::NewLC(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
sl@0
   101
	{		
sl@0
   102
	CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
sl@0
   103
	CleanupStack::PushL(self);
sl@0
   104
	self->ConstructL(aCertType, aEncodedCertificate);
sl@0
   105
	return self;
sl@0
   106
	}
sl@0
   107
sl@0
   108
CCmsCertificateChoice* CCmsCertificateChoice::NewL(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
sl@0
   109
	{
sl@0
   110
	CCmsCertificateChoice* self = CCmsCertificateChoice::NewLC(aCertType, aEncodedCertificate);
sl@0
   111
	CleanupStack::Pop();
sl@0
   112
	return self;
sl@0
   113
	}
sl@0
   114
sl@0
   115
void CCmsCertificateChoice::ConstructL(const CX509Certificate& aCertificate)
sl@0
   116
	{
sl@0
   117
	iCertificateType=ECertificateX509;
sl@0
   118
	iCertificate=CX509Certificate::NewL(aCertificate);
sl@0
   119
	}
sl@0
   120
sl@0
   121
void CCmsCertificateChoice::ConstructL(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
sl@0
   122
	{
sl@0
   123
	iCertificateType=aCertType;
sl@0
   124
	if (aCertType==ECertificateAttribute)
sl@0
   125
		{
sl@0
   126
		iEncodedAttributeCertificate=aEncodedCertificate.AllocL();	
sl@0
   127
		}
sl@0
   128
	else if (aCertType==ECertificateX509)
sl@0
   129
			{
sl@0
   130
			iCertificate=CX509Certificate::NewL(aEncodedCertificate);	
sl@0
   131
			}
sl@0
   132
		 else
sl@0
   133
			 {
sl@0
   134
			 User::Leave(KErrNotSupported);	
sl@0
   135
			 }
sl@0
   136
	}
sl@0
   137
	
sl@0
   138
sl@0
   139
EXPORT_C const HBufC8* CCmsCertificateChoice::AttributeCertificate() const
sl@0
   140
	{
sl@0
   141
	return iEncodedAttributeCertificate;
sl@0
   142
	}
sl@0
   143
sl@0
   144
CASN1EncEncoding* CCmsCertificateChoice::EncodeASN1DERLC() const
sl@0
   145
	{
sl@0
   146
	CASN1EncEncoding* enc(NULL);
sl@0
   147
	if (iCertificateType==ECertificateX509)
sl@0
   148
		{
sl@0
   149
		enc=CASN1EncEncoding::NewLC(iCertificate->Encoding());
sl@0
   150
		}
sl@0
   151
	else if (iCertificateType==ECertificateAttribute)
sl@0
   152
			{
sl@0
   153
			TASN1DecGeneric decGen(*iEncodedAttributeCertificate);
sl@0
   154
			decGen.InitL();
sl@0
   155
			if (decGen.Tag()!=EASN1Sequence)
sl@0
   156
				{
sl@0
   157
				User::Leave(KErrArgument);	
sl@0
   158
				}
sl@0
   159
			enc=CASN1EncEncoding::NewLC(*iEncodedAttributeCertificate, 1, EContextSpecific);
sl@0
   160
			}
sl@0
   161
		else
sl@0
   162
			{
sl@0
   163
			//Extended Certificate
sl@0
   164
			User::Leave(KErrNotSupported);
sl@0
   165
			}
sl@0
   166
	return enc;
sl@0
   167
	}
sl@0
   168
sl@0
   169
EXPORT_C CCmsCertificateChoice::TCertificateType CCmsCertificateChoice::CertificateType()
sl@0
   170
	{
sl@0
   171
	return iCertificateType;
sl@0
   172
	}
sl@0
   173
sl@0
   174
sl@0
   175
sl@0
   176
sl@0
   177
sl@0
   178
sl@0
   179
sl@0
   180
sl@0
   181
sl@0
   182
sl@0
   183
sl@0
   184
sl@0
   185
sl@0
   186