cryptoservices/certificateandkeymgmt/inc/cmssignedobject.h
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/inc/cmssignedobject.h	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/inc/cmssignedobject.h	Thu Sep 10 14:01:51 2009 +0300
@@ -1,612 +1,610 @@
-/*
-* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-
-
-
-/**
- @file
- @publishedPartner
- @released
-*/
-
-#ifndef CMSSIGNEDOBJECT_H
-#define CMSSIGNEDOBJECT_H
-
-#include <cmsdefs.h>
-#include <signed.h>
-#include <cmscertchoice.h>
-
-class CCmsSignerInfo;
-class CDSAPrivateKey;
-class CRSAPrivateKey;
-class CCmsSignerIdentifier;
-class CCmsContentInfo;
-class CEncapsulatedContentInfo;
-class CX509Certificate;
-class CX509AlgorithmIdentifier;
-class CCmsCertificateChoice;
-class CASN1EncSequence;
-class CASN1EncBase;
-
-const TInt KCmsMaxSignedDataElements = 6;
-/**
- A representation of a RFC2630 (signed data) entity.
- */
-class CCmsSignedObject : public CSignedObject
-	{
-public:
-
-	/**
-	Index of CMS object fields.
-	*/
-	enum
-		{
-		/**
-		Index of version field
-		*/
-		EVersionNumber = 0,
-		
-		/**
-		Index of digest algorithm set field
-		*/		
-		EDigestAlgorithms = 1,
-
-		/**
-		Index of encapsulated content info field
-		*/				
-		EEncapsulatedContentInfo = 2,
-		
-		/**
-		Index of certificate set field
-		*/						
-		ECertificates = 3,
-		
-		/**
-		Index of revocation list field
-		*/						
-		ERevocationLists = 4,
-		
-		/**
-		Index of signer info set field
-		*/						
-		ESignedInfo = 5
-		};
-
-	/**
-	Creates a CMS signed data object as defined in RFC2630. The CMS signed data created by 
-		this API contains no signer info. SignL() method can be called to add more signer info.
-	@param aType The type of the encapsulated content.
-	@param aIsDetached A boolean indicating whether the encapsulated data is detached.
-	@param aContentData The encapsulated data. 
-		If aIsDetached is EFalse, aContentData must not be KNullDesC8. Otherwise this API leave 
-		with KErrArgument.
-		If aIsDetached is ETrue, aContentData can be KNullDesC8. But user must provide hash 
-		value when later calling SignL(). Otherwise SignL() leaves with KErrArguement.	
-	@return The fully constructed object.
-	*/
-	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
-											TBool aIsDetached,
-											const TDesC8& aContentData);
-
-	/**
-	Creates a CMS signed data object as defined in RFC2630, and leaves the object on the cleanup stack.
-		this API contains no signer info. SignL() method can be called to add more signer info.
-	@param aType The type of the encapsulated content.
-	@param aIsDetached A boolean indicating whether the encapsulated data is detached.
-	@param aContentData The encapsulated data.
-		If aIsDetached is EFalse, aContentData must not be KNullDesC8. Otherwise this API leave 
-		with KErrArgument.
-		If aIsDetached is ETrue, aContentData can be KNullDesC8. But user must provide hash 
-		value when later calling SignL(). Otherwise SignL() leaves with KErrArguement.	
-	@return The fully constructed object.
-	*/
-	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
-											TBool aIsDetached,
-											const TDesC8& aContentData);
-	
-	/**
-	Creates a CMS signed data object as defined in RFC2630. This API only creates detached signed data 
-		as no data content is provided. The CMS signed data created by this API contains one signer info. 
-		SignL() method can be called to add more signer info.
-	@param aType Encapsulated Content data type.
-	@param aHashValue The hash value of the data content to be signed.
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey The DSA private key used to sign.
-	@param aCert The signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@return	The fully constructed object.
-	*/	
-	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
-										const TDesC8& aHashValue,
-										TAlgorithmId aDigestAlgorithm,
-										const CDSAPrivateKey& aKey,
-										const CX509Certificate& aCert,
-										TBool aAddCertificate);
-											
-	/**
-	Creates a CMS signed data object as defined in RFC2630 and leaves the object on the cleanup stack.
-        This API only creates detached signed data as no data content is provided. The CMS signed data 
-        created by this API contains one signer info. SignL() method can be called to add more signer info.
-	@param aType Encapsulated Content data type.
-	@param aHashValue The hash value of the data content to be signed.
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey The DSA private key used to sign.
-	@param aCert The signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@return	The fully constructed object.
-	*/			
-	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
-										const TDesC8& aHashValue,
-										TAlgorithmId aDigestAlgorithm,
-										const CDSAPrivateKey& aKey,
-										const CX509Certificate& aCert,
-										TBool aAddCertificate);
-
-	/**
-	Creates a CMS signed data object as defined in RFC2630. This API only creates detached signed data 
-		as no data content is provided. The CMS signed data created by this API contains one signer info. 
-		SignL() method can be called to add more signer info.
-	@param aType Encapsulated Content data type.
-	@param aHashValue The hash value of the data content to be signed.
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey The RSA private key used to sign.
-	@param aCert aCert The signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@return	The fully constructed object.
-	*/	
-	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
-										const TDesC8& aHashValue,
-										TAlgorithmId aDigestAlgorithm,
-										const CRSAPrivateKey& aKey,
-										const CX509Certificate& aCert,
-										TBool aAddCertificate);
-											
-	/**
-	Creates a CMS signed data object as defined in RFC2630 and leaves the object on the cleanup stack.
-        This API only creates detached signed data as no data content is provided. The CMS signed data 
-        created by this API contains one signer info. SignL() method can be called to add more signer info.
-	@param aType Encapsulated Content data type.
-	@param aHashValue The hash value of the data content to be signed.
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey The RSA private key used to sign.
-	@param aCert The signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@return	The fully constructed object.
-	*/			
-	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
-										const TDesC8& aHashValue,
-										TAlgorithmId aDigestAlgorithm,
-										const CRSAPrivateKey& aKey,
-										const CX509Certificate& aCert,
-										TBool aAddCertificate);
-
-	/**
-	Creates a CMS signed data object as defined in RFC2630.
-	@param aContentInfo	The CMS content info that contains the encoded signed object.
-	@return			The fully constructed object.
-	*/
-	IMPORT_C static CCmsSignedObject* NewL(const CCmsContentInfo& aContentInfo);
-	
-	/**
-	Creates a CMS signed data object as defined in RFC2630 and leaves it on the cleanup stack.
-	@param aContentInfo	The CMS content info that contains the encoded signed object.
-	@return			The fully constructed object.
-	*/	
-	IMPORT_C static CCmsSignedObject* NewLC(const CCmsContentInfo& aContentInfo);
-
-
-	/**
-	Creates one signature and adds it to the Signer info list. The signing certificate
-	is added to the certificate list if the last boolean parameter aAddCertificate is true and 
-	it does not exist in the list. The digest algorithm is added to the digest algorithm list if it 
-	does not exist in the list. Calling this API multiple times will create multiple signatures.
-	@param aHashValue The hash value to be signed. If this is an empty string,
-					  the content data to be signed must have been passed in via 
-					  NewL method and hash value will be calculated by the implementation
-					  of this method. 
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey the DSA private key used to sign.
-	@param aCert the signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@leave KErrArgument if no hash nor data content is provided.
-	*/
-	IMPORT_C void SignL(const TDesC8& aHashValue,
-						TAlgorithmId aDigestAlgorithm,
-						const CDSAPrivateKey& aKey,
-						const CX509Certificate& aCert,
-						TBool aAddCertificate);
-						
-
-	/**
-	Creates one signature and adds it to the Signer info list. The signing certificate
-	is added to the certificate list if the last boolean parameter aAddCertificate is true and 
-	it does not exist in the list. The digest algorithm is added to the digest algorithm list if it 
-	does not exist in the list. Calling this API multiple times will create multiple signatures.
-	@param aHashValue The hash value to be signed. If this is an empty string,
-					  the content data to be signed must have been passed in via 
-					  NewL method and hash value will be calculated by the implementation
-					  of this method. 
-	@param aDigestAlgorithm The digest algorithm used to create the hash.
-	@param aKey the RSA private key used to sign.
-	@param aCert the signer's certificate.
-	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
-	@leave KErrArgument if no hash nor data content is provided.
-	*/
-	IMPORT_C void SignL(const TDesC8& aHashValue,
-						TAlgorithmId aDigestAlgorithm,
-						const CRSAPrivateKey& aKey,
-						const CX509Certificate& aCert,
-						TBool aAddCertificate);
-
-	/**
-	Destructor
-	*/
-	IMPORT_C ~CCmsSignedObject();
-
-	/*
-	virtual from signedobject class
-	*/
-	IMPORT_C virtual const TPtrC8* DataElementEncoding(const TUint aIndex) const;
-	IMPORT_C virtual void InternalizeL(RReadStream& aStream) ;
-	IMPORT_C virtual const TPtrC8 SignedDataL() const;
-		
-	/**
-	Returns whether the certificate list exists.
-	@return	Boolean indicating whether the certificate list exists.
-	*/
-	IMPORT_C TBool IsCertificateSetPresent() const;
-
-	/**
-	Returns whether the certificate revocation list exists.
-	@return	Boolean indicating whether the certificate Revocation list exists.
-	*/
-	IMPORT_C TBool IsCertificateRevocationListsPresent() const;
-
-	/**
-	Returns the version of this CMS signed object.
-	@return The version of this CMS signed object.
-	*/
-	IMPORT_C TInt Version() const;
-
-	/**
-	Returns the employed algorithm list.
-	@return	The employed algorithm list reference.
-	*/
-	IMPORT_C const RPointerArray<CX509AlgorithmIdentifier>& DigestAlgorithms() const;
-	
-	/**
-	Returns the certificates list.
-	@return	The certificates list reference.
-	*/
-	IMPORT_C const RPointerArray<CCmsCertificateChoice>& Certificates() const;
-	
-	/**
-	Returns the encapsulated content info of this signed object.
-	@return The encapsulated content info reference.
-	*/
-	IMPORT_C const CEncapsulatedContentInfo& ContentInfo() const;
-
-	
-	/**
-	Retrieves the list of SignerInfo objects.
-	@return The signer info list reference.
-	*/
-	IMPORT_C const RPointerArray<CCmsSignerInfo>& SignerInfo() const;
-
-
-	/**
-	Creates the ASN1 sequence of this CMS signed object and leaves it on the cleanup stack.
-	@return  ASN1 sequence of this object.
-	*/
-	IMPORT_C CASN1EncSequence* EncodeASN1DERLC() const;
-	
-	/**
-	Appends the X509 certificate to the certificate list.
-	@param aCert The X509 certificate to be appended.
-	*/
-	IMPORT_C void AddCertificateL(const CX509Certificate& aCert);
-
-
-	/**
-	Appends an encoded attribute certificate to the certificate list. 
-	@param aCert The encoded certificate to be appended.
-	@param aType The type of the encoded certificate..
-	*/
-	IMPORT_C void AddCertificateL(const TDesC8& aCert, CCmsCertificateChoice::TCertificateType aType);	
-	
-	/**
-	Validates the signer and creates the certificate chain for that signer. This API is used to validate attached signature.
-	@param aSignerInfo The signer to be validated.
-	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
-	@leave KErrNotFound There is no matching certificate.
-	@return Boolean that identifies whether the signer can be validated.
-    */
-	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, HBufC8*& aCertChainEncoding);
-
-	/**
-	Validates the signer and creates the certificate chain for that signer. This API is used to validate attached signature.
-	@param aSignerInfo The signer to be validated.
-	@param aCertificates The certificate list provided by the user to validate the signature.
-	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
-	@return Boolean that identifies whether the signer can be validated.
-	@leave KErrNotFound There is no matching certificate.
-	*/
-	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, const RPointerArray<CX509Certificate>& aCertificates, HBufC8*& aCertChainEncoding);
-
-
-
-	/**
-	Validates the signer and creates the certificate chain for that signer. This API is used to validate detached signature.
-	@param aSignerInfo The signer to be validated.
-	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
-	@param aIsHash The flag represent if the next parameter is the hash of the data content.
-	@param aContentDataOrHash the descriptor that contains the data content or its hash
-	@leave KErrNotFound There is no matching certificate.
-	@return Boolean that identifies whether the signer can be validated.
-    */
-	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, HBufC8*& aCertChainEncoding, TBool aIsHash, const TDesC8& aContentDataOrHash);
-
-	/**
-	Validates the signer and creates the certificate chain for that signer. This API is used to validate detached signature.
-	@param aSignerInfo The signer to be validated.
-	@param aCertificates The certificate list provided by the user to validate the signature.
-	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
-	@param aIsHash The flag represent if the next parameter is the hash of the data content.
-	@param aContentDataOrHash the descriptor that contains the data content or its hash	
-	@return Boolean that identifies whether the signer can be validated.
-	@leave KErrNotFound There is no matching certificate.
-	*/
-	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, const RPointerArray<CX509Certificate>& aCertificates, HBufC8*& aCertChainEncoding, TBool aIsHash, const TDesC8& aContentDataOrHash);
-
-	
-private:
-	/**
-	Constructor
-	*/
-	CCmsSignedObject();
-	
-	
-private:
-	/**
-	Second phase constructor for decoding a CMS signed data object
-	@param aContentInfo the content info which contains the CMS signed data.
-	*/		
-	void ConstructL(const CCmsContentInfo& aContentInfo);
-	
-	/**
-	Second phase constructor for constructing a CMS signed data object from data content.
-	@param aType the encapsulated content info type.
-	@param aIsDetached if the CMS signed data does not contains the data content being signed.
-	@param aContentData the content data descriptor.
-	*/			
-	void ConstructL(TCmsContentInfoType aType, TBool aIsDetached, const TDesC8& aContentData);
-	
-	/**
-	Second phase constructor for constructing a CMS signed data object from data content hash
-	@param aType the encapsulated content info type.
-	@param aHashValue the hash of the data content to create the signature.
-	@param aDigestAlgorithm the digest algorithm.
-	@param aKey the DSA private to create signature.
-	@param aCert the signer's certficate
-	@param aAddCertificate a flag to represent if the signer's certificate is added to certificate set.
-	*/				
-	void ConstructL(TCmsContentInfoType aType,
-					const TDesC8& aHashValue,
-					TAlgorithmId aDigestAlgorithm,
-					const CDSAPrivateKey& aKey,
-					const CX509Certificate& aCert,
-					TBool aAddCertificate);
-	/**
-	Second phase constructor for constructing a CMS signed data object from data content hash
-	@param aType the encapsulated content info type.
-	@param aHashValue the hash of the data content to create the signature.
-	@param aDigestAlgorithm the digest algorithm.
-	@param aKey the RSA private to create signature.
-	@param aCert the signer's certficate
-	@param aAddCertificate a flag to represent if the signer's certificate is added to certificate set.
-	*/								
-	void ConstructL(TCmsContentInfoType aType,
-					const TDesC8& aHashValue,
-					TAlgorithmId aDigestAlgorithm,
-					const CRSAPrivateKey& aKey,
-					const CX509Certificate& aCert,
-					TBool aAddCertificate);
-	/**
-	Append the algorithm to the algoritm list
-	@param aDigestAlgorithm the algorithm ID.
-	*/
-	void AddDigestAlgorithmL(TAlgorithmId aDigestAlgorithm);
-					
-	/**
-	Build the signer's identifier from the signer's certificate. If the signer's certificate
-	contains the subject identifier extension, the signer identifier is subject id extension.
-	otherwise, the signer identifier is isuuer name and serial number.
-	@param aCert the signer's certificate.
-	@return a CMS signer identifier instance pointer
-	*/
-	CCmsSignerIdentifier* BuildSignerIdentifierLC(const CX509Certificate& aCert);
-	
-	/**
-	Build the signer list, algorithm list and certificate list in the CMS signer data.
-	@param aDigestAlgorithm the digest algorithm identifier.
-	@param aIsHash A flag the represent if the next descriptor is the hash value rather that original data
-	@param aValue the data content or its hash.
-	@param aKey the DSA private used to sign.
-	@param aCert the signer's certificate
-	@param aAddCertificate the flag to represent if the certificate is added to the certificate set
-	*/	
-	void BuildSignerInfoCertListAndAlgoritmListL(TAlgorithmId aDigestAlgorithm,
-												TBool aIsHash,
-												const TDesC8& aValue,
-												const CDSAPrivateKey& aKey,
-												const CX509Certificate& aCert,
-												TBool aAddCertificate);
-
-	/**
-	Build the signer list, algorithm list and certificate list in the CMS signer data.
-	@param aDigestAlgorithm the digest algorithm identifier.
-	@param aIsHash A flag the represent if the next descriptor is the hash value rather that original data
-	@param aValue the data content or its hash.
-	@param aKey the RSA private used to sign.
-	@param aCert the signer's certificate
-	@param aAddCertificate the flag to represent if the certificate is added to the certificate set
-	*/		
-	void BuildSignerInfoCertListAndAlgoritmListL(TAlgorithmId aDigestAlgorithm,
-												TBool aIsHash,
-												const TDesC8& aValue,
-												const CRSAPrivateKey& aKey,
-												const CX509Certificate& aCert,
-												TBool aAddCertificate);
-	/**
-	Initialise the signed data base class members for the validation process.
-	@param aRawData the raw data of the CMS signed data.
-	*/
-	void InitSignedObjectL(const TDesC8& aRawData);
-	
-	
-	/**
-	Decode the CMS Signer data.
-	@param aRawData the raw data of the CMS signed data.
-	*/
-	void DecodeSignedDataL(const TDesC8& aRawData);	
-
-	/**
-	Decode the digest algorithm set.
-	@param the raw data of the algorithm list.
-	*/
-	void DecodeDigestAlgorithmsL(const TDesC8& aRawData);
-
-	/**
-	Decode the encapsulated content info
-	@param the raw data of the encapsulated content info.
-	*/
-	void DecodeEncapsulatedContentInfoL(const TDesC8& aRawData);
-	
-	/**
-	Decode the certificate set.
-	@param the raw data of the certificate list
-	*/	
-	void DecodeCertificatesL(const TDesC8& aRawData);
-	
-	/**
-	Decode the certificate revocation set. Not implemented now!
-	@param the raw data of the certificate revocation list.
-	*/		
-	void DecodeRevocationListsL(const TDesC8& aRawData);
-
-	/**
-	Decode the signer info set.
-	@param the raw data of the certificate revocation list.
-	*/			
-	void DecodeSignerInfoL(const TDesC8& aRawData);
-
-	/**
-	Encode the certificate set
-	@return the encoding of the certificate set
-	*/													
-	CASN1EncBase* EncodeCertificatesLC() const;
-	
-	/**
-	Encode the algorithm set
-	@return the encoding of the digest algorithm set
-	*/
-	CASN1EncBase* EncodeAlgorithmsLC() const;
-	
-	/**
-	Encode the signer info set
-	@return the encoding of the certificate set
-	*/
-	CASN1EncBase* EncodeSignerInfoLC() const;
-	
-	/**
-	Validate the signature by the given certificate.
-	@param aSignerInfo the signer info reference contains the signature
-	@param aEndEntityCert the certificate used to create the signature.
-	@return if the signature can be validated
-	*/
-	TBool ValidateSignatureL(const CCmsSignerInfo& aSignerInfo, const CX509Certificate& aEndEntityCert);
-	
-	/**
-	This function is called when validating a detached CMS signed object.
-	It sets the data content being signed so that the signed data can be validated.
-	@param aContentData The data content being signed.
-	*/
-	void SetContentData(const TDesC8& aContentData);
-
-	/**
-	This function is called when validating a detached CMS signed object.
-	It sets the hash being signed so that the signed data can be validated.
-	@param aHash The hash being signed.
-	*/
-	void SetHash(const TDesC8& aHash);
-	
-	
-private:
-	/**
-	Reprents if the certificate set is present
-	*/
-	TBool iIsCertificateSetPresent;
-	
-	/**
-	Reprents if the certificate revocationlisy is present
-	*/	
-	TBool iIsCertificateRevocationListsPresent;
-	
-	/**
-	Version of the Signed object
-	*/
-	TInt iVersion;
-	
-	/**
-	Algorithm Set
-	*/
-	RPointerArray<CX509AlgorithmIdentifier> iDigestAlgorithms;
-	
-	/**
-	Encapsulated Content List
-	*/
-	CEncapsulatedContentInfo* iContentInfo;
-	
-	/**
-	Certificate Set
-	*/
-	RPointerArray<CCmsCertificateChoice> iCertificates;
-	
-	/**
-	Signer Info Set
-	*/
-	RPointerArray<CCmsSignerInfo> iSignerInfo;
-	
-	/**
-	Array of Encoded fields
-	*/	
-	TFixedArray<TPtrC8*, KCmsMaxSignedDataElements> iDataElements;
-	
-	/**
-	The data content being signed
-	*/
-	TPtrC8 iContentData;
-	
-	/**
-	The Hash being signed
-	*/
-	TPtrC8 iHash;
-	};
-
-
-#endif //CMSSIGNEDOBJECT_H
+/*
+* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef CMSSIGNEDOBJECT_H
+#define CMSSIGNEDOBJECT_H
+
+#include <cmsdefs.h>
+#include <signed.h>
+#include <cmscertchoice.h>
+
+class CCmsSignerInfo;
+class CDSAPrivateKey;
+class CRSAPrivateKey;
+class CCmsSignerIdentifier;
+class CCmsContentInfo;
+class CEncapsulatedContentInfo;
+class CX509Certificate;
+class CX509AlgorithmIdentifier;
+class CCmsCertificateChoice;
+class CASN1EncSequence;
+class CASN1EncBase;
+
+const TInt KCmsMaxSignedDataElements = 6;
+/**
+ A representation of a RFC2630 (signed data) entity.
+ */
+class CCmsSignedObject : public CSignedObject
+	{
+public:
+
+	/**
+	Index of CMS object fields.
+	*/
+	enum
+		{
+		/**
+		Index of version field
+		*/
+		EVersionNumber = 0,
+		
+		/**
+		Index of digest algorithm set field
+		*/		
+		EDigestAlgorithms = 1,
+
+		/**
+		Index of encapsulated content info field
+		*/				
+		EEncapsulatedContentInfo = 2,
+		
+		/**
+		Index of certificate set field
+		*/						
+		ECertificates = 3,
+		
+		/**
+		Index of revocation list field
+		*/						
+		ERevocationLists = 4,
+		
+		/**
+		Index of signer info set field
+		*/						
+		ESignedInfo = 5
+		};
+
+	/**
+	Creates a CMS signed data object as defined in RFC2630. The CMS signed data created by 
+		this API contains no signer info. SignL() method can be called to add more signer info.
+	@param aType The type of the encapsulated content.
+	@param aIsDetached A boolean indicating whether the encapsulated data is detached.
+	@param aContentData The encapsulated data. 
+		If aIsDetached is EFalse, aContentData must not be KNullDesC8. Otherwise this API leave 
+		with KErrArgument.
+		If aIsDetached is ETrue, aContentData can be KNullDesC8. But user must provide hash 
+		value when later calling SignL(). Otherwise SignL() leaves with KErrArguement.	
+	@return The fully constructed object.
+	*/
+	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
+											TBool aIsDetached,
+											const TDesC8& aContentData);
+
+	/**
+	Creates a CMS signed data object as defined in RFC2630, and leaves the object on the cleanup stack.
+		this API contains no signer info. SignL() method can be called to add more signer info.
+	@param aType The type of the encapsulated content.
+	@param aIsDetached A boolean indicating whether the encapsulated data is detached.
+	@param aContentData The encapsulated data.
+		If aIsDetached is EFalse, aContentData must not be KNullDesC8. Otherwise this API leave 
+		with KErrArgument.
+		If aIsDetached is ETrue, aContentData can be KNullDesC8. But user must provide hash 
+		value when later calling SignL(). Otherwise SignL() leaves with KErrArguement.	
+	@return The fully constructed object.
+	*/
+	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
+											TBool aIsDetached,
+											const TDesC8& aContentData);
+	
+	/**
+	Creates a CMS signed data object as defined in RFC2630. This API only creates detached signed data 
+		as no data content is provided. The CMS signed data created by this API contains one signer info. 
+		SignL() method can be called to add more signer info.
+	@param aType Encapsulated Content data type.
+	@param aHashValue The hash value of the data content to be signed.
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey The DSA private key used to sign.
+	@param aCert The signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@return	The fully constructed object.
+	*/	
+	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
+										const TDesC8& aHashValue,
+										TAlgorithmId aDigestAlgorithm,
+										const CDSAPrivateKey& aKey,
+										const CX509Certificate& aCert,
+										TBool aAddCertificate);
+											
+	/**
+	Creates a CMS signed data object as defined in RFC2630 and leaves the object on the cleanup stack.
+        This API only creates detached signed data as no data content is provided. The CMS signed data 
+        created by this API contains one signer info. SignL() method can be called to add more signer info.
+	@param aType Encapsulated Content data type.
+	@param aHashValue The hash value of the data content to be signed.
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey The DSA private key used to sign.
+	@param aCert The signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@return	The fully constructed object.
+	*/			
+	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
+										const TDesC8& aHashValue,
+										TAlgorithmId aDigestAlgorithm,
+										const CDSAPrivateKey& aKey,
+										const CX509Certificate& aCert,
+										TBool aAddCertificate);
+
+	/**
+	Creates a CMS signed data object as defined in RFC2630. This API only creates detached signed data 
+		as no data content is provided. The CMS signed data created by this API contains one signer info. 
+		SignL() method can be called to add more signer info.
+	@param aType Encapsulated Content data type.
+	@param aHashValue The hash value of the data content to be signed.
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey The RSA private key used to sign.
+	@param aCert aCert The signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@return	The fully constructed object.
+	*/	
+	IMPORT_C static CCmsSignedObject* NewL(TCmsContentInfoType aType,
+										const TDesC8& aHashValue,
+										TAlgorithmId aDigestAlgorithm,
+										const CRSAPrivateKey& aKey,
+										const CX509Certificate& aCert,
+										TBool aAddCertificate);
+											
+	/**
+	Creates a CMS signed data object as defined in RFC2630 and leaves the object on the cleanup stack.
+        This API only creates detached signed data as no data content is provided. The CMS signed data 
+        created by this API contains one signer info. SignL() method can be called to add more signer info.
+	@param aType Encapsulated Content data type.
+	@param aHashValue The hash value of the data content to be signed.
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey The RSA private key used to sign.
+	@param aCert The signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@return	The fully constructed object.
+	*/			
+	IMPORT_C static CCmsSignedObject* NewLC(TCmsContentInfoType aType,
+										const TDesC8& aHashValue,
+										TAlgorithmId aDigestAlgorithm,
+										const CRSAPrivateKey& aKey,
+										const CX509Certificate& aCert,
+										TBool aAddCertificate);
+
+	/**
+	Creates a CMS signed data object as defined in RFC2630.
+	@param aContentInfo	The CMS content info that contains the encoded signed object.
+	@return			The fully constructed object.
+	*/
+	IMPORT_C static CCmsSignedObject* NewL(const CCmsContentInfo& aContentInfo);
+	
+	/**
+	Creates a CMS signed data object as defined in RFC2630 and leaves it on the cleanup stack.
+	@param aContentInfo	The CMS content info that contains the encoded signed object.
+	@return			The fully constructed object.
+	*/	
+	IMPORT_C static CCmsSignedObject* NewLC(const CCmsContentInfo& aContentInfo);
+
+
+	/**
+	Creates one signature and adds it to the Signer info list. The signing certificate
+	is added to the certificate list if the last boolean parameter aAddCertificate is true and 
+	it does not exist in the list. The digest algorithm is added to the digest algorithm list if it 
+	does not exist in the list. Calling this API multiple times will create multiple signatures.
+	@param aHashValue The hash value to be signed. If this is an empty string,
+					  the content data to be signed must have been passed in via 
+					  NewL method and hash value will be calculated by the implementation
+					  of this method. 
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey the DSA private key used to sign.
+	@param aCert the signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@leave KErrArgument if no hash nor data content is provided.
+	*/
+	IMPORT_C void SignL(const TDesC8& aHashValue,
+						TAlgorithmId aDigestAlgorithm,
+						const CDSAPrivateKey& aKey,
+						const CX509Certificate& aCert,
+						TBool aAddCertificate);
+						
+
+	/**
+	Creates one signature and adds it to the Signer info list. The signing certificate
+	is added to the certificate list if the last boolean parameter aAddCertificate is true and 
+	it does not exist in the list. The digest algorithm is added to the digest algorithm list if it 
+	does not exist in the list. Calling this API multiple times will create multiple signatures.
+	@param aHashValue The hash value to be signed. If this is an empty string,
+					  the content data to be signed must have been passed in via 
+					  NewL method and hash value will be calculated by the implementation
+					  of this method. 
+	@param aDigestAlgorithm The digest algorithm used to create the hash.
+	@param aKey the RSA private key used to sign.
+	@param aCert the signer's certificate.
+	@param aAddCertificate A boolean indicating whether the signer's certificate is added to the signed data object.
+	@leave KErrArgument if no hash nor data content is provided.
+	*/
+	IMPORT_C void SignL(const TDesC8& aHashValue,
+						TAlgorithmId aDigestAlgorithm,
+						const CRSAPrivateKey& aKey,
+						const CX509Certificate& aCert,
+						TBool aAddCertificate);
+
+	/**
+	Destructor
+	*/
+	IMPORT_C ~CCmsSignedObject();
+
+	/*
+	virtual from signedobject class
+	*/
+	IMPORT_C virtual const TPtrC8* DataElementEncoding(const TUint aIndex) const;
+	IMPORT_C virtual void InternalizeL(RReadStream& aStream) ;
+	IMPORT_C virtual const TPtrC8 SignedDataL() const;
+		
+	/**
+	Returns whether the certificate list exists.
+	@return	Boolean indicating whether the certificate list exists.
+	*/
+	IMPORT_C TBool IsCertificateSetPresent() const;
+
+	/**
+	Returns whether the certificate revocation list exists.
+	@return	Boolean indicating whether the certificate Revocation list exists.
+	*/
+	IMPORT_C TBool IsCertificateRevocationListsPresent() const;
+
+	/**
+	Returns the version of this CMS signed object.
+	@return The version of this CMS signed object.
+	*/
+	IMPORT_C TInt Version() const;
+
+	/**
+	Returns the employed algorithm list.
+	@return	The employed algorithm list reference.
+	*/
+	IMPORT_C const RPointerArray<CX509AlgorithmIdentifier>& DigestAlgorithms() const;
+	
+	/**
+	Returns the certificates list.
+	@return	The certificates list reference.
+	*/
+	IMPORT_C const RPointerArray<CCmsCertificateChoice>& Certificates() const;
+	
+	/**
+	Returns the encapsulated content info of this signed object.
+	@return The encapsulated content info reference.
+	*/
+	IMPORT_C const CEncapsulatedContentInfo& ContentInfo() const;
+
+	
+	/**
+	Retrieves the list of SignerInfo objects.
+	@return The signer info list reference.
+	*/
+	IMPORT_C const RPointerArray<CCmsSignerInfo>& SignerInfo() const;
+
+
+	/**
+	Creates the ASN1 sequence of this CMS signed object and leaves it on the cleanup stack.
+	@return  ASN1 sequence of this object.
+	*/
+	IMPORT_C CASN1EncSequence* EncodeASN1DERLC() const;
+	
+	/**
+	Appends the X509 certificate to the certificate list.
+	@param aCert The X509 certificate to be appended.
+	*/
+	IMPORT_C void AddCertificateL(const CX509Certificate& aCert);
+
+
+	/**
+	Appends an encoded attribute certificate to the certificate list. 
+	@param aCert The encoded certificate to be appended.
+	@param aType The type of the encoded certificate..
+	*/
+	IMPORT_C void AddCertificateL(const TDesC8& aCert, CCmsCertificateChoice::TCertificateType aType);	
+	
+	/**
+	Validates the signer and creates the certificate chain for that signer. This API is used to validate attached signature.
+	@param aSignerInfo The signer to be validated.
+	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
+	@leave KErrNotFound There is no matching certificate.
+	@return Boolean that identifies whether the signer can be validated.
+    */
+	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, HBufC8*& aCertChainEncoding);
+
+	/**
+	Validates the signer and creates the certificate chain for that signer. This API is used to validate attached signature.
+	@param aSignerInfo The signer to be validated.
+	@param aCertificates The certificate list provided by the user to validate the signature.
+	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
+	@return Boolean that identifies whether the signer can be validated.
+	@leave KErrNotFound There is no matching certificate.
+	*/
+	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, const RPointerArray<CX509Certificate>& aCertificates, HBufC8*& aCertChainEncoding);
+
+
+
+	/**
+	Validates the signer and creates the certificate chain for that signer. This API is used to validate detached signature.
+	@param aSignerInfo The signer to be validated.
+	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
+	@param aIsHash The flag represent if the next parameter is the hash of the data content.
+	@param aContentDataOrHash the descriptor that contains the data content or its hash
+	@leave KErrNotFound There is no matching certificate.
+	@return Boolean that identifies whether the signer can be validated.
+    */
+	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, HBufC8*& aCertChainEncoding, TBool aIsHash, const TDesC8& aContentDataOrHash);
+
+	/**
+	Validates the signer and creates the certificate chain for that signer. This API is used to validate detached signature.
+	@param aSignerInfo The signer to be validated.
+	@param aCertificates The certificate list provided by the user to validate the signature.
+	@param aCertChainEncoding The certificate chain. This is created and pushed onto the cleanup stack by the function.
+	@param aIsHash The flag represent if the next parameter is the hash of the data content.
+	@param aContentDataOrHash the descriptor that contains the data content or its hash	
+	@return Boolean that identifies whether the signer can be validated.
+	@leave KErrNotFound There is no matching certificate.
+	*/
+	IMPORT_C TBool ValidateSignerLC(const CCmsSignerInfo& aSignerInfo, const RPointerArray<CX509Certificate>& aCertificates, HBufC8*& aCertChainEncoding, TBool aIsHash, const TDesC8& aContentDataOrHash);
+
+	
+private:
+	/**
+	Constructor
+	*/
+	CCmsSignedObject();
+	
+	
+private:
+	/**
+	Second phase constructor for decoding a CMS signed data object
+	@param aContentInfo the content info which contains the CMS signed data.
+	*/		
+	void ConstructL(const CCmsContentInfo& aContentInfo);
+	
+	/**
+	Second phase constructor for constructing a CMS signed data object from data content.
+	@param aType the encapsulated content info type.
+	@param aIsDetached if the CMS signed data does not contains the data content being signed.
+	@param aContentData the content data descriptor.
+	*/			
+	void ConstructL(TCmsContentInfoType aType, TBool aIsDetached, const TDesC8& aContentData);
+	
+	/**
+	Second phase constructor for constructing a CMS signed data object from data content hash
+	@param aType the encapsulated content info type.
+	@param aHashValue the hash of the data content to create the signature.
+	@param aDigestAlgorithm the digest algorithm.
+	@param aKey the DSA private to create signature.
+	@param aCert the signer's certficate
+	@param aAddCertificate a flag to represent if the signer's certificate is added to certificate set.
+	*/				
+	void ConstructL(TCmsContentInfoType aType,
+					const TDesC8& aHashValue,
+					TAlgorithmId aDigestAlgorithm,
+					const CDSAPrivateKey& aKey,
+					const CX509Certificate& aCert,
+					TBool aAddCertificate);
+	/**
+	Second phase constructor for constructing a CMS signed data object from data content hash
+	@param aType the encapsulated content info type.
+	@param aHashValue the hash of the data content to create the signature.
+	@param aDigestAlgorithm the digest algorithm.
+	@param aKey the RSA private to create signature.
+	@param aCert the signer's certficate
+	@param aAddCertificate a flag to represent if the signer's certificate is added to certificate set.
+	*/								
+	void ConstructL(TCmsContentInfoType aType,
+					const TDesC8& aHashValue,
+					TAlgorithmId aDigestAlgorithm,
+					const CRSAPrivateKey& aKey,
+					const CX509Certificate& aCert,
+					TBool aAddCertificate);
+	/**
+	Append the algorithm to the algoritm list
+	@param aDigestAlgorithm the algorithm ID.
+	*/
+	void AddDigestAlgorithmL(TAlgorithmId aDigestAlgorithm);
+					
+	/**
+	Build the signer's identifier from the signer's certificate. If the signer's certificate
+	contains the subject identifier extension, the signer identifier is subject id extension.
+	otherwise, the signer identifier is isuuer name and serial number.
+	@param aCert the signer's certificate.
+	@return a CMS signer identifier instance pointer
+	*/
+	CCmsSignerIdentifier* BuildSignerIdentifierLC(const CX509Certificate& aCert);
+	
+	/**
+	Build the signer list, algorithm list and certificate list in the CMS signer data.
+	@param aDigestAlgorithm the digest algorithm identifier.
+	@param aIsHash A flag the represent if the next descriptor is the hash value rather that original data
+	@param aValue the data content or its hash.
+	@param aKey the DSA private used to sign.
+	@param aCert the signer's certificate
+	@param aAddCertificate the flag to represent if the certificate is added to the certificate set
+	*/	
+	void BuildSignerInfoCertListAndAlgoritmListL(TAlgorithmId aDigestAlgorithm,
+												TBool aIsHash,
+												const TDesC8& aValue,
+												const CDSAPrivateKey& aKey,
+												const CX509Certificate& aCert,
+												TBool aAddCertificate);
+
+	/**
+	Build the signer list, algorithm list and certificate list in the CMS signer data.
+	@param aDigestAlgorithm the digest algorithm identifier.
+	@param aIsHash A flag the represent if the next descriptor is the hash value rather that original data
+	@param aValue the data content or its hash.
+	@param aKey the RSA private used to sign.
+	@param aCert the signer's certificate
+	@param aAddCertificate the flag to represent if the certificate is added to the certificate set
+	*/		
+	void BuildSignerInfoCertListAndAlgoritmListL(TAlgorithmId aDigestAlgorithm,
+												TBool aIsHash,
+												const TDesC8& aValue,
+												const CRSAPrivateKey& aKey,
+												const CX509Certificate& aCert,
+												TBool aAddCertificate);
+	/**
+	Initialise the signed data base class members for the validation process.
+	@param aRawData the raw data of the CMS signed data.
+	*/
+	void InitSignedObjectL(const TDesC8& aRawData);
+	
+	
+	/**
+	Decode the CMS Signer data.
+	@param aRawData the raw data of the CMS signed data.
+	*/
+	void DecodeSignedDataL(const TDesC8& aRawData);	
+
+	/**
+	Decode the digest algorithm set.
+	@param the raw data of the algorithm list.
+	*/
+	void DecodeDigestAlgorithmsL(const TDesC8& aRawData);
+
+	/**
+	Decode the encapsulated content info
+	@param the raw data of the encapsulated content info.
+	*/
+	void DecodeEncapsulatedContentInfoL(const TDesC8& aRawData);
+	
+	/**
+	Decode the certificate set.
+	@param the raw data of the certificate list
+	*/	
+	void DecodeCertificatesL(const TDesC8& aRawData);
+	
+	/**
+	Decode the certificate revocation set. Not implemented now!
+	@param the raw data of the certificate revocation list.
+	*/		
+	void DecodeRevocationListsL(const TDesC8& aRawData);
+
+	/**
+	Decode the signer info set.
+	@param the raw data of the certificate revocation list.
+	*/			
+	void DecodeSignerInfoL(const TDesC8& aRawData);
+
+	/**
+	Encode the certificate set
+	@return the encoding of the certificate set
+	*/													
+	CASN1EncBase* EncodeCertificatesLC() const;
+	
+	/**
+	Encode the algorithm set
+	@return the encoding of the digest algorithm set
+	*/
+	CASN1EncBase* EncodeAlgorithmsLC() const;
+	
+	/**
+	Encode the signer info set
+	@return the encoding of the certificate set
+	*/
+	CASN1EncBase* EncodeSignerInfoLC() const;
+	
+	/**
+	Validate the signature by the given certificate.
+	@param aSignerInfo the signer info reference contains the signature
+	@param aEndEntityCert the certificate used to create the signature.
+	@return if the signature can be validated
+	*/
+	TBool ValidateSignatureL(const CCmsSignerInfo& aSignerInfo, const CX509Certificate& aEndEntityCert);
+	
+	/**
+	This function is called when validating a detached CMS signed object.
+	It sets the data content being signed so that the signed data can be validated.
+	@param aContentData The data content being signed.
+	*/
+	void SetContentData(const TDesC8& aContentData);
+
+	/**
+	This function is called when validating a detached CMS signed object.
+	It sets the hash being signed so that the signed data can be validated.
+	@param aHash The hash being signed.
+	*/
+	void SetHash(const TDesC8& aHash);
+	
+	
+private:
+	/**
+	Reprents if the certificate set is present
+	*/
+	TBool iIsCertificateSetPresent;
+	
+	/**
+	Reprents if the certificate revocationlisy is present
+	*/	
+	TBool iIsCertificateRevocationListsPresent;
+	
+	/**
+	Version of the Signed object
+	*/
+	TInt iVersion;
+	
+	/**
+	Algorithm Set
+	*/
+	RPointerArray<CX509AlgorithmIdentifier> iDigestAlgorithms;
+	
+	/**
+	Encapsulated Content List
+	*/
+	CEncapsulatedContentInfo* iContentInfo;
+	
+	/**
+	Certificate Set
+	*/
+	RPointerArray<CCmsCertificateChoice> iCertificates;
+	
+	/**
+	Signer Info Set
+	*/
+	RPointerArray<CCmsSignerInfo> iSignerInfo;
+	
+	/**
+	Array of Encoded fields
+	*/	
+	TFixedArray<TPtrC8*, KCmsMaxSignedDataElements> iDataElements;
+	
+	/**
+	The data content being signed
+	*/
+	TPtrC8 iContentData;
+	
+	/**
+	The Hash being signed
+	*/
+	TPtrC8 iHash;
+	};
+
+
+#endif //CMSSIGNEDOBJECT_H