cryptoservices/certificateandkeymgmt/pkcs12recog/pkcs12recog.h
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/pkcs12recog/pkcs12recog.h	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,158 @@
+/*
+* 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
+ @internalTechnology 
+*/
+
+#ifndef __PKCS12RECOG_H__
+
+#include <apmrec.h>
+
+/**
+ A recogniser that recognises the following MIME types:
+ application/x-pkcs12
+ */
+class CPkcs12Recognizer : public CApaDataRecognizerType
+	{
+	/** PKCS#12 recognizer panic codes */
+	enum TPkcs12RecogPanic 
+		{
+		/** Data type index does not correspond to a mime-type */
+		EPanicInvalidDataType
+		};
+		
+public:
+	/**
+	Constructor
+	*/
+	CPkcs12Recognizer();
+
+public: 
+	/**
+	Returns the preferred buffer size for PKCS#12 recognition
+	@return preferred buffer size in bytes
+	*/
+	TUint PreferredBufSize();
+	
+	/**
+	Allows a client to enumerate the supported mime-types.
+	@param aIndex index of the mimetype to return
+	@return mime-type corresponding to aIndex
+	*/
+	TDataType SupportedDataTypeL(TInt aIndex) const;
+	
+	static CApaDataRecognizerType* CreateRecognizerL();
+
+private:
+	// Implementation CApaDataRecognizerType::DoRecognizeL
+	void DoRecognizeL(const TDesC& aName, const TDesC8& aBuffer);
+	
+	/**
+	Checks whether the file name has a known PKCS#12 extension
+	@param aName the file name to examine
+	@return ETrue if the file extension looks is .pfx or .p12;
+		    otherwise, EFalse is returned.
+	*/
+	TBool HasPkcs12Extension(const TDesC& aName);
+		
+	/**	
+	Checks whether the buffer contains a valid PKCS#12 header.
+	aBuffer buffer to recognise
+
+	Expected ASN.1 sequence
+	SEQ
+		INTEGER  	// Version = 3
+		SEQ		 	// authSafe - PKCS#7 ContentInfo
+			OID		// ContentType (data or signed data)
+
+	It is not practical to check further than this because the content
+	field within the ContentInfo objects is optional and could be absent.
+	@param aBuffer the buffer to check
+	@return ETrue if the buffer contains a PKCS#12 header; 
+			otherwise, EFalse is returned.	
+	*/
+	TBool DoRecognizeBufferL(const TDesC8& aBuffer);
+	
+	// There is no need to validate the lengths because the recogniser
+	// checks the buffer size is at least as large as the minimum header
+	// size	
+	
+	/**
+	Checks that the data at the specified offset is a DER sequence tag
+	and advances past the tag and it's length.
+	
+	@param aBuffer the buffer containing the DER sequence to validate
+	@param aOffset the offset of the current byte within the buffer. This
+	               is undefined if an error occurs.
+	@return ETrue if a valid sequence tag & length is encountered;
+			otherwise, EFalse is returned.
+	*/
+	TBool ConsumeSequenceL(const TDesC8& aBuffer, TUint& aOffset) const;
+
+	/**
+	Decodes a DER encoded integer at the specified offset and advances
+	to the next element.
+	Signed integers greater than 32 bits in length are not supported.	
+	
+	@param aBuffer the buffer containing the DER intger to decode
+	@param aOffset the offset of the current byte within the buffer. This
+	               is undefined if an error occurs.
+	@param aIntVal the decoded integer value. This is undefined if an error occurs.
+	@return ETrue if a valid integer is encountered; 
+			otherwise, EFalse is returned.
+	*/	
+	TBool ConsumeIntegerL(const TDesC8& aBuffer, TUint& aOffset, TInt& aIntVal) const;
+	
+	/**
+	Decodes a DER encoded length at the specified offset and advances
+	to the start of the value.
+	Lengths greater than 32 bits in length are not supported.
+	
+	@param aBuffer the buffer containing the length to decode.
+	@param aOffset the offset of the current byte within the buffer. This
+	               is undefined if an error occurs.
+	@param aLength the decoded length value in octets. This is undefined if an error occurs.
+	@return ETrue if the length is valid; otherwise, EFalse is returned.
+	*/			
+	TBool ConsumeLengthL(const TDesC8& aBuffer, TUint& aOffset, TInt& aLengthOctets) const;
+	
+	/**
+	Decodes base256 encoded integer up to 4 bytes in length and advances
+	past the data.
+	Signed integers greater than 32 bits in length are not supported.
+	
+	@param aBuffer the buffer containing the octets to decode.
+	@param aOffset the offset of the current byte within the buffer. This
+	               is undefined if an error occurs.
+	@param aLength the number of octets to decode (must be <= 4)
+	@param aIntVal the decoded integer. This is undefined if an error occurs.
+	*/		
+	TBool ConsumeBase256L(const TDesC8& aBuffer, TUint& aOffset, TInt aLengthOctets, TInt& aIntVal) const;
+	
+	/**
+	Calls panic with PKCS#12 recognizer category with the supplied panic code.
+	@param aReason the panic code
+	*/
+	void Panic(TPkcs12RecogPanic aReason) const;
+	};
+
+#endif