williamr@2: /* williamr@2: * Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: * All rights reserved. williamr@2: * This component and the accompanying materials are made available williamr@2: * under the terms of the License "Eclipse Public License v1.0" williamr@2: * which accompanies this distribution, and is available williamr@2: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: * williamr@2: * Initial Contributors: williamr@2: * Nokia Corporation - initial contribution. williamr@2: * williamr@2: * Contributors: williamr@2: * williamr@2: * Description: williamr@2: * Declares all classes used to decode ASN.1 data, including the williamr@2: * base interface. williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: williamr@2: #ifndef __ASN1ENC_H__ williamr@2: #define __ASN1ENC_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: class CASN1EncBase; williamr@2: class TASN1EncBase128DER; williamr@2: williamr@2: class TInteger; williamr@2: williamr@2: typedef void (CASN1EncBase::* WriteFunc)(TDes8& aBuf) const; williamr@2: williamr@2: /** williamr@2: * Base class for all ASN.1 types that we can encode. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncBase : public CBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Gives total number of octets in the DER encoding of this williamr@2: * object. williamr@2: * @return Number of octets in DER encoding of this object. williamr@2: */ williamr@2: IMPORT_C TUint LengthDER() const; williamr@2: williamr@2: /** williamr@2: * Writes entire DER encoding of this object into the given williamr@2: * buffer. williamr@2: * @param aBuf Buffer receiving the encoding. williamr@2: * @param aPos Position to start writing at. williamr@2: */ williamr@2: IMPORT_C void WriteDERL(TDes8& aBuf, TUint& aPos) const; williamr@2: williamr@2: /** williamr@2: * Sets tag type/class of the encoding object williamr@2: * @param aType Tag type to set williamr@2: * @param aClass Tag class to set. williamr@2: */ williamr@2: IMPORT_C void SetTag(const TTagType aType, williamr@2: const TASN1Class aClass = EContextSpecific); williamr@2: williamr@2: IMPORT_C ~CASN1EncBase(); williamr@2: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * Sets parent for the object williamr@2: * @param aParent Pointer to an ASN.1 object that becomes this williamr@2: * object's parent. williamr@2: */ williamr@2: void SetParent(CASN1EncBase* aParent); williamr@2: williamr@2: protected: williamr@2: /** williamr@2: * Protected constructor williamr@2: * @param aType Tag type of the new object williamr@2: * @param aClass Tag class of the new object. williamr@2: */ williamr@2: IMPORT_C CASN1EncBase(const TTagType aType, const TASN1Class aClass); williamr@2: williamr@2: /** williamr@2: * Must call this version from derived classes in their williamr@2: * ConstructL, but only once they're ready to have williamr@2: * CalculateContentsLengthDER called on them. williamr@2: */ williamr@2: IMPORT_C virtual void ConstructL(); williamr@2: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * Derived classes must call this if the length of their williamr@2: * contents changes after construction. williamr@2: */ williamr@2: void ContentsLengthChanged(); williamr@2: williamr@2: protected: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * Calculates number of octets in DER length encoding. Must set williamr@2: * value of the appropriate data member. Made protected because it is williamr@2: * needed by CASN1EncEncoding class. williamr@2: */ williamr@2: void CalculateLengthLengthDER(); williamr@2: williamr@2: private: williamr@2: /** williamr@2: * Calculates number of octets in DER tag encoding. Must set williamr@2: * value of the appropriate data member. williamr@2: */ williamr@2: void CalculateTagLengthDER(); williamr@2: williamr@2: /** williamr@2: * Calculates number of octets in DER content encoding. Must set williamr@2: * value of the appropriate data member. williamr@2: */ williamr@2: virtual void CalculateContentsLengthDER() = 0; williamr@2: williamr@2: virtual TBool IsConstructed() const = 0; williamr@2: williamr@2: // Write the octet data in each section williamr@2: // Note that buffer *will* be big enough: these are called only williamr@2: // after checking. williamr@2: williamr@2: /** williamr@2: * Writes DER tag encoding into supplied buffer, which is williamr@2: * already verified to be big enough. williamr@2: * @param aBuf Buffer to write to. williamr@2: */ williamr@2: void WriteTagDERL(TDes8& aBuf) const; williamr@2: williamr@2: /** williamr@2: * Writes DER length encoding into supplied buffer, which is williamr@2: * already verified to be big enough. williamr@2: * @param aBuf Buffer to write to. williamr@2: */ williamr@2: virtual void WriteLengthDER(TDes8& aBuf) const; williamr@2: williamr@2: /** williamr@2: * Writes DER content encoding into supplied buffer, which is williamr@2: * already verified to be big enough. Must be implemented by williamr@2: * derived classes. williamr@2: * @param aBuf Buffer to write to. williamr@2: */ williamr@2: virtual void WriteContentsDERL(TDes8& aBuf) const = 0; williamr@2: williamr@2: /** williamr@2: * Helper function, used for efficiency williamr@2: * @param aBuf Buffer to write to williamr@2: * @param aPos Position in the buffer to start writing at williamr@2: * (updated on exit) williamr@2: * @param aLength Length of data to write williamr@2: * @param aWriteFunc Points to the function used to perform williamr@2: * the actual write operation. williamr@2: */ williamr@2: void WriteHelperL(TDes8& aBuf, TUint& aPos, const TUint aLength, williamr@2: WriteFunc aWriteFunc) const; williamr@2: williamr@2: protected: williamr@2: // Cached length data - data set from the CalculateXxxx methods above williamr@2: TUint iTagLengthDER; ///< Length of DER encoded tag williamr@2: TUint iLengthLengthDER; ///< Length of DER encoded length williamr@2: TUint iContentsLengthDER; ///< Length of DER encoded content williamr@2: williamr@2: private: williamr@2: /** williamr@2: * The object owning this one (if we're held in a sequence, williamr@2: * for example). williamr@2: */ williamr@2: CASN1EncBase* iParent; williamr@2: williamr@2: // Tag data williamr@2: TTagType iType; ///< Tag type of this object williamr@2: TASN1Class iClass; ///< Tag class of this object williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Base class for all ASN1 constructed-type objects. Most of these williamr@2: * are container classes, but another type is the explicit-tagging williamr@2: * wrapper object. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncConstructed : public CASN1EncBase williamr@2: { williamr@2: protected: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * Protected constructor williamr@2: * @param aType Tag type for the new object williamr@2: * @param aClass Tag class for the new object. williamr@2: */ williamr@2: CASN1EncConstructed(const TTagType aType, const TASN1Class aClass); williamr@2: williamr@2: private: williamr@2: virtual const CASN1EncBase& Child(const TUint aIndex) const = 0; williamr@2: virtual TUint NumChildren() const = 0; williamr@2: williamr@2: private: williamr@2: // From CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: TBool IsConstructed() const; williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class used to wrap other encoding objects in order to give williamr@2: * them an explicit tag. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncExplicitTag : public CASN1EncConstructed williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Takes ownership of the encoder, *including* the case when williamr@2: * this method leaves. williamr@2: * @param aEncoder ASN.1 encoding object to wrap williamr@2: * @param aType Tag type to assign williamr@2: * @param aClass Tag class to assign williamr@2: * @return Wrapped encoding object pushed on the cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncExplicitTag* NewLC(CASN1EncBase* aEncoder, williamr@2: const TTagType aType, const TASN1Class aClass = EContextSpecific); williamr@2: williamr@2: /** williamr@2: * Takes ownership of the encoder, *including* the case when williamr@2: * this method leaves. williamr@2: * @param aEncoder ASN.1 encoding object to wrap williamr@2: * @param aType Tag type to assign williamr@2: * @param aClass Tag class to assign williamr@2: * @return Wrapped encoding object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncExplicitTag* NewL(CASN1EncBase* aEncoder, williamr@2: const TTagType aType, const TASN1Class aClass = EContextSpecific); williamr@2: williamr@2: IMPORT_C ~CASN1EncExplicitTag(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncExplicitTag(CASN1EncBase* aEncoder, const TTagType aType, williamr@2: const TASN1Class aClass); williamr@2: williamr@2: // From CASN1EncConstructed williamr@2: TUint NumChildren() const; williamr@2: const CASN1EncBase& Child(const TUint aIndex) const; williamr@2: williamr@2: private: williamr@2: CASN1EncBase* iEncoder; // Inner encoding object williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Base class for all ASN1 container types - sequences, williamr@2: * sets, etc. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncContainer : public CASN1EncConstructed williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Call this to add a child object to the container. williamr@2: * Takes ownership if and only if it doesn't Leave. williamr@2: * Checks for null input, calls AddChildInt, calls williamr@2: * ContentsLengthChanged(). williamr@2: * @param aChild Child ASN1 encoding object to add. williamr@2: */ williamr@2: IMPORT_C void AddChildL(CASN1EncBase* aChild); williamr@2: williamr@2: /** williamr@2: * Call this to add a child object to the container. williamr@2: * Takes ownership if and only if it doesn't Leave. williamr@2: * Checks for null input, calls AddChildInt, calls williamr@2: * ContentsLengthChanged(). Pops added child object williamr@2: * off the cleanup stack. williamr@2: * @param aChild Child ASN1 encoding object to add. williamr@2: */ williamr@2: IMPORT_C void AddAndPopChildL(CASN1EncBase* aChild); williamr@2: williamr@2: protected: williamr@2: /** @internalComponent */ williamr@2: CASN1EncContainer(const TTagType aType); williamr@2: williamr@2: private: williamr@2: /** williamr@2: * Internal method, derived classes implement to add a child. williamr@2: * No need to check for null input or call williamr@2: * ContentsLengthChanged(). Takes ownership, but only if you williamr@2: * don't leave. williamr@2: * @param aChild Child encoding object to add. williamr@2: */ williamr@2: virtual void AddChildIntL(const CASN1EncBase* aChild) = 0; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Class for encoding SEQUENCE and SEQUENCE-OF data types. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncSequence : public CASN1EncContainer williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CASN1EncSequence* NewL(); williamr@2: IMPORT_C static CASN1EncSequence* NewLC(); williamr@2: williamr@2: IMPORT_C ~CASN1EncSequence(); // virtual from base williamr@2: williamr@2: protected: williamr@2: /** @internalComponent */ williamr@2: CASN1EncSequence(); williamr@2: williamr@2: private: williamr@2: // From CASN1EncContainer williamr@2: const CASN1EncBase& Child(const TUint aIndex) const; williamr@2: void AddChildIntL(const CASN1EncBase* aChild); williamr@2: TUint NumChildren() const; williamr@2: williamr@2: private: williamr@2: RPointerArray iChildren; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Class for encoding SET and SET-OF data types. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncSet : public CASN1EncContainer williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Creates an ASN.1 Set encoder. williamr@2: @return The fully constructed object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncSet* NewL(); williamr@2: williamr@2: /** williamr@2: Creates an ASN.1 Set encoder, and puts it onto the cleanup stack. williamr@2: @return The fully constructed object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncSet* NewLC(); williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: */ williamr@2: IMPORT_C ~CASN1EncSet(); // virtual from base williamr@2: williamr@2: protected: williamr@2: /** williamr@2: * @internalComponent williamr@2: * williamr@2: * Constructor williamr@2: */ williamr@2: CASN1EncSet(); williamr@2: williamr@2: private: williamr@2: // From CASN1EncContainer williamr@2: const CASN1EncBase& Child(const TUint aIndex) const; williamr@2: void AddChildIntL(const CASN1EncBase* aChild); williamr@2: TUint NumChildren() const; williamr@2: williamr@2: private: williamr@2: RPointerArray iChildren; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: * All ASN1 primitive type encoding classes derive from here. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncPrimitive : public CASN1EncBase williamr@2: { williamr@2: protected: williamr@2: IMPORT_C CASN1EncPrimitive(const TTagType aType); williamr@2: williamr@2: private: williamr@2: TBool IsConstructed() const; ///< Inherited from CASN1EncBase williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding NULLs. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncNull : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CASN1EncNull* NewL(); williamr@2: IMPORT_C static CASN1EncNull* NewLC(); williamr@2: williamr@2: private: williamr@2: CASN1EncNull(); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER() ; williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding Boolean values. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncBoolean : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CASN1EncBoolean* NewLC(const TBool aBool); williamr@2: IMPORT_C static CASN1EncBoolean* NewL(const TBool aBool); williamr@2: williamr@2: private: williamr@2: CASN1EncBoolean(const TBool aBool); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER() ; williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: const TBool iBool; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding TInts only. Use CASN1EncBigInt for encoding williamr@2: * Big Integer objects. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncInt : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CASN1EncInt* NewLC(const TInt aInt); williamr@2: IMPORT_C static CASN1EncInt* NewL(const TInt aInt); williamr@2: williamr@2: private: williamr@2: CASN1EncInt(const TInt aInt); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER() ; williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: const TInt iInt; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding Big Integer objects only - use CASN1EncInt williamr@2: * for TInts. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncBigInt : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: // Takes a deep copy williamr@2: IMPORT_C static CASN1EncBigInt* NewLC(const TInteger& aInteger); williamr@2: IMPORT_C static CASN1EncBigInt* NewL(const TInteger& aInteger); williamr@2: williamr@2: IMPORT_C ~CASN1EncBigInt(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncBigInt(); williamr@2: void ConstructL(const TInteger& aInteger); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: HBufC8* iContents; williamr@2: TPtrC8 iWriteContents; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding octet strings. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncOctetString : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: // Takes a deep copy williamr@2: IMPORT_C static CASN1EncOctetString* NewLC(const TDesC8& aStr); williamr@2: IMPORT_C static CASN1EncOctetString* NewL(const TDesC8& aStr); williamr@2: williamr@2: IMPORT_C ~CASN1EncOctetString(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncOctetString(); williamr@2: void ConstructL(const TDesC8& aStr); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: HBufC8* iContents; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding printable strings. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncPrintableString : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Creates an ASN.1 Printable String encoder, and puts it onto the cleanup stack. williamr@2: @return The fully constructed object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncPrintableString* NewLC(const TDesC8& aStr); williamr@2: williamr@2: /** williamr@2: Creates an ASN.1 Printable String encoder. williamr@2: @return The fully constructed object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncPrintableString* NewL(const TDesC8& aStr); williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: */ williamr@2: IMPORT_C ~CASN1EncPrintableString(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncPrintableString(); williamr@2: void ConstructL(const TDesC8& aStr); williamr@2: TInt CheckValid(const TDesC8& aStr); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: HBufC8* iContents; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding bit strings (keys, for example). williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncBitString : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Constructs a new DER bit string encoder from a bit string that williamr@2: * does not have unused bits at the end, i.e. is octet-aligned. williamr@2: * The passed string must be in big-endian format. williamr@2: * @param aBitStr Octet-aligned bit string. williamr@2: * @return A new DER bit string encoder object, williamr@2: * which is left on the cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewLC(const TDesC8& aBitStr); williamr@2: williamr@2: /** williamr@2: * Constructs a new DER bit string encoder from a bit string that williamr@2: * does not have unused bits at the end, i.e. is octet-aligned. williamr@2: * The passed string must be in big-endian format. williamr@2: * @param aBitStr Octet-aligned bit string. williamr@2: * @return A new DER bit string encoder object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewL(const TDesC8& aBitStr); williamr@2: williamr@2: /** williamr@2: * Constructs a new DER bit string encoder from a bit string that williamr@2: * is not octet-aligned, which means it has unused bits in its last williamr@2: * octet. The passed string must be in big-endian format. williamr@2: * @param aBitStr Bit string. williamr@2: * @param aLengthBits Length in bits of the passed bit string. williamr@2: * The function will panic if aLengthBits is greater than williamr@2: * the actual bit length of aBitString, or the difference williamr@2: * is more that 7 bits. williamr@2: * @return A new DER bit string encoder object which is left on the williamr@2: * cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewLC(const TDesC8& aBitStr, TUint aLengthBits); williamr@2: williamr@2: /** williamr@2: * Constructs a new DER bit string encoder from a bit string that williamr@2: * is not octet-aligned, which means it has unused bits in its last williamr@2: * octet. The passed string must be in big-endian format. williamr@2: * @param aBitStr Bit string. williamr@2: * @param aLengthBits Length in bits of the passed bit string. williamr@2: * The function will panic if aLengthBits is greater than williamr@2: * the actual bit length of aBitString, or the difference williamr@2: * is more that 7 bits. williamr@2: * @return A new DER bit string encoder object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewL(const TDesC8& aBitStr, TUint aLengthBits); williamr@2: williamr@2: /** williamr@2: * Wraps the passed encoding object into a bit string. williamr@2: * @param aAsnObj Encoding object to wrap. williamr@2: * @return A new bit string containing the passed encoding object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewL(const CASN1EncBase& aAsnObj); williamr@2: williamr@2: /** williamr@2: * Wraps the passed encoding object into a bit string. williamr@2: * @param aAsnObj Encoding object to wrap. williamr@2: * @return A new bit string containing the passed encoding object williamr@2: * on the cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncBitString* NewLC(const CASN1EncBase& aAsnObj); williamr@2: williamr@2: IMPORT_C ~CASN1EncBitString(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncBitString(); williamr@2: void ConstructL(const TDesC8& aBitStr); williamr@2: void ConstructL(const TDesC8& aBitStr, TUint aLengthBits); williamr@2: void ConstructL(const CASN1EncBase& aAsnObj); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: HBufC8* iContents; williamr@2: TUint8 iPadding; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Class for encoding object identifiers. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncObjectIdentifier : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Takes ints in a string, delimited by '.' characters in williamr@2: * between (not at ends). Takes a deep copy of the info. williamr@2: * @param aStr OID string. williamr@2: * @return New ASN.1 OID object on the cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncObjectIdentifier* NewLC(const TDesC& aStr); williamr@2: williamr@2: /** williamr@2: * Takes ints in a string, delimited by '.' characters in williamr@2: * between (not at ends). Takes a deep copy of the info. williamr@2: * @param aStr OID string. williamr@2: * @return New ASN.1 OID object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncObjectIdentifier* NewL(const TDesC& aStr); williamr@2: williamr@2: /** Destructor */ williamr@2: IMPORT_C ~CASN1EncObjectIdentifier(); // virtual from base williamr@2: williamr@2: private: williamr@2: CASN1EncObjectIdentifier(); williamr@2: void ConstructL(const TDesC& aStr); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: // Data to encode williamr@2: RArray iData; williamr@2: TUint8 iFirstOctet; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: * Class for encoding GeneralisedTime objects. williamr@2: * williamr@2: * Doesn't support fractions of seconds or regional time zone offsets. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncGeneralizedTime : public CASN1EncPrimitive williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CASN1EncGeneralizedTime* NewLC(const TTime& aTime); williamr@2: IMPORT_C static CASN1EncGeneralizedTime* NewL(const TTime& aTime); williamr@2: williamr@2: private: williamr@2: CASN1EncGeneralizedTime(const TTime& aTime); williamr@2: williamr@2: // Methods from CASN1EncBase williamr@2: void CalculateContentsLengthDER(); williamr@2: void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: private: williamr@2: TDateTime iDateTime; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * Class for encapsulation of already encoded data. williamr@2: * williamr@2: * Wraps it so that the data could be used in the ASN.1 hierarchy. williamr@2: * It reverse-engineers and stores the encoded data, providing whatever williamr@2: * information is needed to override pure virtual methods of the base williamr@2: * class and write out the DER encoding in its initial form. williamr@2: * williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: class CASN1EncEncoding : public CASN1EncBase williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * Creates a new object from raw DER encoding and places it on the williamr@2: * cleanup stack. williamr@2: * @param aEncoding Raw DER encoding. williamr@2: * @return New wrapper object placed on the cleanup stack. williamr@2: */ williamr@2: IMPORT_C static CASN1EncEncoding* NewLC(const TDesC8& aEncoding); williamr@2: williamr@2: /** williamr@2: * Creates a new object from raw DER encoding. williamr@2: * @param aEncoding Raw DER encoding. williamr@2: * @return New wrapper object. williamr@2: */ williamr@2: IMPORT_C static CASN1EncEncoding* NewL(const TDesC8& aEncoding); williamr@2: williamr@2: IMPORT_C static CASN1EncEncoding* NewLC(const TDesC8& aEncoding, TTagType aType, TASN1Class aClass); williamr@2: williamr@2: IMPORT_C ~CASN1EncEncoding(); williamr@2: williamr@2: protected: williamr@2: /** williamr@2: * Protected constructor. williamr@2: * williamr@2: */ williamr@2: IMPORT_C CASN1EncEncoding(); williamr@2: williamr@2: private: williamr@2: /** williamr@2: * Constructs the wrapper around the passed raw DER encoding. williamr@2: * Calculates element sizes. Decodes it to get type and length. williamr@2: * @param aEncoding Raw DER encoding. williamr@2: */ williamr@2: void ConstructL(const TDesC8& aEncoding); williamr@2: williamr@2: void ConstructL(const TDesC8& aEncoding, TTagType aType, TASN1Class aClass); williamr@2: williamr@2: virtual TBool IsConstructed() const; williamr@2: williamr@2: /** williamr@2: * Writes DER content encoding into supplied buffer, which is williamr@2: * already verified to be big enough. williamr@2: * @param aBuf Buffer to write to. williamr@2: */ williamr@2: virtual void WriteContentsDERL(TDes8& aBuf) const; williamr@2: williamr@2: /** williamr@2: * Calculates number of octets in DER content encoding. Sets williamr@2: * value of the appropriate data member. williamr@2: */ williamr@2: virtual void CalculateContentsLengthDER(); williamr@2: williamr@2: private: williamr@2: HBufC8* iContents; ///< Copy of the supplied DER encoded data (contents only). williamr@2: TASN1Class iClass; ///< ASN.1 class of the encoded object. williamr@2: TTagType iTag; ///< ASN.1 tag of the encoding. williamr@2: }; williamr@2: williamr@2: #endif // __ASN1ENC_H__