/** 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