os/security/cryptoservices/certificateandkeymgmt/pkcs7/cmssigneridentifier.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 <cmssigneridentifier.h> 
sl@0
    20
#include <asn1dec.h>
sl@0
    21
#include <asn1enc.h>
sl@0
    22
sl@0
    23
//
sl@0
    24
// Implementation of CCmsSignerIdentifier
sl@0
    25
//
sl@0
    26
sl@0
    27
CCmsSignerIdentifier* CCmsSignerIdentifier::NewL(CPKCS7IssuerAndSerialNumber* aIssuerAndSerialNumber)
sl@0
    28
	{
sl@0
    29
	CCmsSignerIdentifier* self = NewLC(aIssuerAndSerialNumber);
sl@0
    30
	CleanupStack::Pop(self);
sl@0
    31
	return self;		
sl@0
    32
	}
sl@0
    33
sl@0
    34
CCmsSignerIdentifier* CCmsSignerIdentifier::NewLC(CPKCS7IssuerAndSerialNumber* aIssuerAndSerialNumber)
sl@0
    35
	{
sl@0
    36
	if (!aIssuerAndSerialNumber)
sl@0
    37
		{
sl@0
    38
		User::Leave(KErrArgument);	
sl@0
    39
		}
sl@0
    40
	CCmsSignerIdentifier* self = new (ELeave) CCmsSignerIdentifier(aIssuerAndSerialNumber);
sl@0
    41
	CleanupStack::PushL(self);
sl@0
    42
	return self;		
sl@0
    43
	}
sl@0
    44
sl@0
    45
CCmsSignerIdentifier* CCmsSignerIdentifier::NewL(HBufC8* aSubjectKeyIdExt)
sl@0
    46
	{
sl@0
    47
	CCmsSignerIdentifier* self = NewLC(aSubjectKeyIdExt);
sl@0
    48
	CleanupStack::Pop(self);
sl@0
    49
	return self;
sl@0
    50
	}
sl@0
    51
	
sl@0
    52
CCmsSignerIdentifier* CCmsSignerIdentifier::NewLC(HBufC8* aSubjectKeyIdExt)
sl@0
    53
	{
sl@0
    54
	if (!aSubjectKeyIdExt)
sl@0
    55
		{
sl@0
    56
		User::Leave(KErrArgument);	
sl@0
    57
		}
sl@0
    58
	CCmsSignerIdentifier* self = new (ELeave) CCmsSignerIdentifier(aSubjectKeyIdExt);
sl@0
    59
	CleanupStack::PushL(self);
sl@0
    60
	return self;				
sl@0
    61
	}
sl@0
    62
	
sl@0
    63
CCmsSignerIdentifier* CCmsSignerIdentifier::NewL(const TDesC8& aRawData)
sl@0
    64
	{
sl@0
    65
	CCmsSignerIdentifier* self = NewLC(aRawData);
sl@0
    66
	CleanupStack::Pop(self);
sl@0
    67
	return self;					
sl@0
    68
	}
sl@0
    69
sl@0
    70
CCmsSignerIdentifier* CCmsSignerIdentifier::NewLC(const TDesC8& aRawData)
sl@0
    71
	{
sl@0
    72
	CCmsSignerIdentifier* self = new (ELeave) CCmsSignerIdentifier();
sl@0
    73
	CleanupStack::PushL(self);
sl@0
    74
	self->ConstructL(aRawData);
sl@0
    75
	return self;					
sl@0
    76
	}
sl@0
    77
sl@0
    78
CCmsSignerIdentifier::CCmsSignerIdentifier(CPKCS7IssuerAndSerialNumber* aIssuerAndSerialNumber) : iSignerIdentifierType(EIssuerAndSerialNumber)
sl@0
    79
	{
sl@0
    80
	iIssuerAndSerialNumber=aIssuerAndSerialNumber;
sl@0
    81
	}
sl@0
    82
sl@0
    83
CCmsSignerIdentifier::CCmsSignerIdentifier(HBufC8* aSubjectKeyIdExt) : iSignerIdentifierType(ESubjectKeyIdentifier)
sl@0
    84
	{
sl@0
    85
	iSubjectKeyIdExt=aSubjectKeyIdExt;
sl@0
    86
	}
sl@0
    87
sl@0
    88
EXPORT_C CCmsSignerIdentifier::~CCmsSignerIdentifier()
sl@0
    89
	{
sl@0
    90
	delete iIssuerAndSerialNumber;
sl@0
    91
	delete iSubjectKeyIdExt;
sl@0
    92
	}
sl@0
    93
sl@0
    94
CASN1EncBase* CCmsSignerIdentifier::EncodeASN1DERLC() const
sl@0
    95
	{
sl@0
    96
	switch (iSignerIdentifierType)
sl@0
    97
		{
sl@0
    98
	case EIssuerAndSerialNumber:
sl@0
    99
		{
sl@0
   100
		return iIssuerAndSerialNumber->EncodeASN1DERLC();
sl@0
   101
		}
sl@0
   102
		
sl@0
   103
	case ESubjectKeyIdentifier:
sl@0
   104
		{
sl@0
   105
		CASN1EncBase* subKey = CASN1EncOctetString::NewLC(*iSubjectKeyIdExt);
sl@0
   106
		subKey->SetTag(0);
sl@0
   107
		return subKey;
sl@0
   108
		}
sl@0
   109
		
sl@0
   110
	default:
sl@0
   111
		User::Leave(KErrNotSupported);
sl@0
   112
		}
sl@0
   113
	
sl@0
   114
	//Should not arrive here
sl@0
   115
	return NULL;	
sl@0
   116
	}
sl@0
   117
	
sl@0
   118
EXPORT_C const CPKCS7IssuerAndSerialNumber* CCmsSignerIdentifier::IssuerAndSerialNumber() const
sl@0
   119
	{
sl@0
   120
	return iIssuerAndSerialNumber;
sl@0
   121
	}
sl@0
   122
sl@0
   123
EXPORT_C TInt CCmsSignerIdentifier::SignerIdentifierType() const
sl@0
   124
	{
sl@0
   125
	return iSignerIdentifierType;
sl@0
   126
	}
sl@0
   127
sl@0
   128
CCmsSignerIdentifier::CCmsSignerIdentifier()
sl@0
   129
	{
sl@0
   130
	}
sl@0
   131
sl@0
   132
void CCmsSignerIdentifier::ConstructL(const TDesC8& aRawData)
sl@0
   133
	{
sl@0
   134
	TASN1DecGeneric decGen(aRawData);
sl@0
   135
	decGen.InitL();
sl@0
   136
	
sl@0
   137
	if(decGen.Tag() == EASN1Sequence && decGen.Class()==EUniversal)
sl@0
   138
		{
sl@0
   139
		iSignerIdentifierType=EIssuerAndSerialNumber;
sl@0
   140
		iIssuerAndSerialNumber=CPKCS7IssuerAndSerialNumber::NewL(aRawData);			
sl@0
   141
		}
sl@0
   142
	else if(decGen.Tag() == 0 && decGen.Class()==EContextSpecific)
sl@0
   143
			{
sl@0
   144
			iSignerIdentifierType=ESubjectKeyIdentifier;
sl@0
   145
			iSubjectKeyIdExt=decGen.GetContentDER().AllocL();				
sl@0
   146
			}
sl@0
   147
		 else
sl@0
   148
			 {
sl@0
   149
			 User::Leave(KErrArgument);	
sl@0
   150
			 }	
sl@0
   151
	}
sl@0
   152
sl@0
   153
EXPORT_C const TDesC8& CCmsSignerIdentifier::SubjectKeyIdentifier() const
sl@0
   154
	{
sl@0
   155
	return *iSubjectKeyIdExt;
sl@0
   156
	}
sl@0
   157
sl@0
   158
sl@0
   159
sl@0
   160