epoc32/include/x520ava.h
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
child 4 837f303aceeb
--- a/epoc32/include/x520ava.h	Tue Nov 24 13:55:44 2009 +0000
+++ b/epoc32/include/x520ava.h	Tue Mar 16 16:12:26 2010 +0000
@@ -1,1 +1,327 @@
-x520ava.h
+/*
+* Copyright (c) 1998-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: 
+* Implementation of an attribute type and a value, as defined by the X.520 standard
+*
+*/
+
+
+
+
+/**
+ @file 
+ @internalTechnology 
+*/
+ 
+#if !defined(__X520AVA_H__)
+#define __X520AVA_H__
+
+#include <e32base.h>
+#include <e32std.h>
+#include <s32std.h>
+
+/** The attribute type. 
+* 
+* @publishedAll
+* @released
+* @since v6.0 */
+enum TAttributeType
+	{
+	/** A common name */
+	ECommonName,
+	/** A locality name */
+	ELocalityName,
+	/** A state or province name */
+	EStateOrProvinceName,
+	/** An organization name */
+	EOrganizationName,
+	/** An organizational unit name */
+	EOrganizationalUnitName,
+	/** A title */
+	ETitle,
+	/** A qualifier */
+	EDNQualifier,
+	/** The name of a country */
+	ECountryName,
+	/** A given name */
+	EGivenName,
+	/** A surname */
+	ESurname,
+	/** Initials */
+	EInitials,
+	/** A generation qualifier */
+	EGenerationQualifier,
+	/** An email address. This is deprecated. */
+	EPKCS9EmailAddress,
+	/** A postal code */
+	EPostalCode,
+	/** A serial number */
+	ESerialNumber,
+	/** An RFC 2247 domain component.
+	* 
+	* A domain name is made up of an ordered set of components.*/
+	ERFC2247DomainComponent,
+	/** RFC 2256 street component.
+	* 
+	* A street */
+	ERFC2256Street,
+	/** A name of the subject of a certificate as an unstructured ASCII string */
+	EPKCS9UnstructuredName
+	};
+
+//these are the only attribute types we handle at present
+_LIT(KX520CountryName,"2.5.4.6");
+_LIT(KX520OrganizationName,"2.5.4.10");
+_LIT(KX520OrganizationalUnitName,"2.5.4.11");
+_LIT(KX520LocalityName,"2.5.4.7");
+_LIT(KX520StateOrProvinceName,"2.5.4.8");
+_LIT(KX520Title,"2.5.4.12");
+_LIT(KX520CommonName,"2.5.4.3");
+_LIT(KX520GivenName,"2.5.4.42");
+_LIT(KX520Surname,"2.5.4.4");
+_LIT(KX520Initials,"2.5.4.43");
+_LIT(KX520GenerationQualifier,"2.5.4.44");
+_LIT(KX520DNQualifier,"2.5.4.46");
+_LIT(KX520SerialNumber,"2.5.4.5");
+_LIT(KX520PostalCode,"2.5.4.17");
+_LIT(KRFC2247DomainComponent, "0.9.2342.19200300.100.1.25");
+_LIT(KRFC2256Street,"2.5.4.9");
+_LIT(KPKCS9UnstructuredName, "1.2.840.113549.1.9.2");
+
+//email address is deprecated but we support it anyway...
+_LIT(KPKCS9EmailAddress, "1.2.840.113549.1.9.1");
+
+/** The maximum length allowed for a country name. */
+const TInt KX520MaxCLength = 2;
+/** The maximum length allowed for an organization name. */
+const TInt KX520MaxOLength = 64;
+/** The maximum length allowed for an organizational unit name. */
+const TInt KX520MaxOULength = 64;
+/** The maximum length allowed for a locality name. */
+const TInt KX520MaxLLength = 128;
+/** The maximum length allowed for a state or province name. */
+const TInt KX520MaxSOPLength = 128;
+/** The maximum length allowed for an title. */
+const TInt KX520MaxTLength = 64;
+/** The maximum length allowed for a common name. */
+const TInt KX520MaxCNLength = 256;
+/** The maximum length allowed for a given name. */
+const TInt KX520MaxGNLength = 16;
+/** The maximum length allowed for a surname. */
+const TInt KX520MaxSLength = 40;
+/** The maximum length allowed for initials. */
+const TInt KX520MaxILength = 5;
+/** The maximum length allowed for a generation qualifier. */
+const TInt KX520MaxGQLength = 3;
+/** The maximum length allowed for a serial number. */
+const TInt KX520MaxSNLength = 64;
+/** The maximum length allowed for a postal code. */
+const TInt KX520MaxPostalCodeLength = 40;
+/** The maximum length allowed for an email address. */
+const TInt KPKCS9MaxEmailAddressLength = 256;
+/** The maximum length allowed for an unstructured name. */
+const TInt KPKCS9MaxUnstructuredNameLength = 256;
+// No maximum was specified in the standard - 128 should be sufficient
+/** The maximum length allowed for an RFC 2247 domain component. 
+* 
+* Each component of the domain name is a short string. */
+const TInt KRFC2247MaxDomainComponentLength = 128;
+/** The maximum length allowed a for street. */
+const TInt KRFC2256StreetLength = 128;
+
+class CASN1EncSequence;
+
+class CX520AttributeTypeAndValue : public CBase
+/** Contains an attribute type and a value, as defined by the X.520 standard.
+* 
+* A Distinguished Name object, as defined by the X.500 standard, consists of 
+* a sequence of these objects. 
+* 
+* @publishedAll
+* @released
+* @since v6.0 
+*/
+// Attribute and value pair class. Attribute and value pairs 
+//	are used in distinguished names and certificate attributes. 
+//	Stores data in ASN.1 format internally.
+	{
+public:
+	// Constructs a new object from ASN.1-encoded DER binary data
+	/** Creates a new CX520AttributeTypeAndValue object from the specified buffer containing 
+	* the encoded binary representation.
+	* 
+	* Initialises the object from its encoded binary form into an internal representation.	
+	* 
+	* @param aBinaryData	The encoded binary representation.
+	* @return				The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewL(const TDesC8& aBinaryData);
+
+	// Constructs a new object from ASN.1-encoded DER binary data
+	/** Creates a new CX520AttributeTypeAndValue object from the specified buffer containing 
+	* the encoded binary representation, and puts a pointer to the new object onto 
+	* the cleanup stack.
+	* 
+	* Initialises the object from its encoded binary form into an internal representation.	
+	* 
+	* @param aBinaryData	The encoded binary representation.
+	* @return				The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewLC(const TDesC8& aBinaryData);
+
+	// Constructs a new object from ASN.1-encoded DER binary data
+	/** Creates a new CX520AttributeTypeAndValue object from the specified buffer containing 
+	* the encoded binary representation, starting at the specified offset.
+	* 
+	* Initialises the object from its encoded binary form into an internal representation.
+	* 
+	* @param aBinaryData	The encoded binary representation.
+	* @param aPos			The offset position from which to start decoding.
+	* @return				The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewL(const TDesC8& aBinaryData, TInt& aPos);
+
+	// Constructs a new object from ASN.1-encoded DER binary data
+	/** Creates a new CX520AttributeTypeAndValue object from the specified buffer containing 
+	* the encoded binary representation, starting at the specified offset, and puts 
+	* a pointer to the new object onto the cleanup stack.
+	* 
+	* Initialises the object from its encoded binary form into an internal representation.
+	* 
+	* @param aBinaryData	The encoded binary representation.
+	* @param aPos			The offset position from which to start decoding.
+	* @return				The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewLC(const TDesC8& aBinaryData, TInt& aPos);
+	
+	/** Creates a new CX520AttributeTypeAndValue object from an existing object.
+	* 
+	* This is equivalent to a copy constructor.
+	* 
+	* @param aPair	The CX520AttributeTypeAndValue object.
+	* @return		The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewL(const CX520AttributeTypeAndValue& aPair);
+	
+	/** Creates a new CX520AttributeTypeAndValue object from an existing object, and 
+	* puts a pointer to the new object onto the cleanup stack.
+	* 
+	* This is equivalent to a copy constructor.
+	* 
+	* @param aPair	The CX520AttributeTypeAndValue object.
+	* @return		The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewLC(const CX520AttributeTypeAndValue& aPair);
+	
+	/** Creates a new CX520AttributeTypeAndValue object from the specified read stream.
+	* 
+	* @param aStream	Stream from which the object is to be internalised.
+	* @return			The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewL(RReadStream& aStream);
+	
+	/** Creates a new CX520AttributeTypeAndValue object from the specified read stream, 
+	* and puts a pointer to the new object onto the cleanup stack.
+	* 
+	* @param aStream	Stream from which the object is to be internalised.
+	* @return			The new CX520AttributeTypeAndValue object. */
+	IMPORT_C static CX520AttributeTypeAndValue* NewLC(RReadStream& aStream);
+
+	/** Creates a new CX520AttributeTypeAndValue object from an attribute type and value.
+	* 
+	* @param aType	Attribute type
+	* @param aValue	Attribute value
+	* @return		New CX520AttributeTypeAndValue object */
+	IMPORT_C static CX520AttributeTypeAndValue* NewL(TAttributeType aType, const TDesC8& aValue);
+
+	/** Creates a new CX520AttributeTypeAndValue object from an attribute type and value.
+	* 
+	* @param aType	Attribute type
+	* @param aValue Attribute value
+	* @return		New CX520AttributeTypeAndValue object on the cleanup stack */
+	IMPORT_C static CX520AttributeTypeAndValue* NewLC(TAttributeType aType, const TDesC8& aValue);
+
+	/** Destructor.
+	* 
+	* Frees all resources owned by the object, prior to its destruction. */
+	IMPORT_C ~CX520AttributeTypeAndValue();
+
+	/** Gets the encoded attribute type of the object.
+	* 
+	* @return	A pointer descriptor representing the encoded attribute type. */
+	IMPORT_C const TPtrC Type() const;
+
+	/** Gets the encoded attribute value of the object.
+	* 
+	* @return	The pointer descriptor representing the encoded attribute value. */
+	IMPORT_C const TPtrC8 EncodedValue() const;
+
+	// Creates a copy of object's ASN.1 DER encoding.
+	// @return	New buffer containing object's ASN.1 DER encoding.
+	/** Gets the decoded value.
+	* 
+	* @return	A heap descriptor containing the decoded value. */
+	IMPORT_C virtual HBufC* ValueL() const;
+
+	/** Encodes the contents into an ASN.1 sequence object.
+	* 
+	* This is useful to insert attribute type/value pairs into other ASN.1 
+	* encoding trees.
+	* 
+	* @return	New ASN.1 sequence object containing attribute 
+	* 			type/value pair in for of an OID and an octet string; 
+	*			leaves the returned object on the cleanup stack. */
+	IMPORT_C CASN1EncSequence* EncodeASN1LC() const;
+
+	/** Encodes the contents into an ASN.1 sequence object.
+	* 
+	* Useful to insert attribute type/value pairs into other ASN.1 
+	* encoding trees.
+	* 
+	* @return 	New ASN.1 sequence object containing attribute 
+	* 			type/value pair in for of an OID and an octet string. */
+	IMPORT_C CASN1EncSequence* EncodeASN1L() const;
+
+	// This function compares the current element with aElement.
+	/** Compares the attribute type and decoded value of the specified object.
+	* 
+	* @param aElement	The CX520AttributeTypeAndValue object to be compared.
+	* @return 			ETrue, if the attribute types and the decoded values match; 
+	* 					EFalse, otherwise. */
+	IMPORT_C virtual TBool ExactMatchL(const CX520AttributeTypeAndValue& 
+		aElement) const;
+		
+	/** Externalises an object of this class to a write stream.
+	* 
+	* The presence of this function means that the standard templated operator<<() 
+	* can be used to externalise objects of this class.
+	* 
+	* @param aStream	Stream to which the object should be externalised. */
+	virtual void ExternalizeL(RWriteStream& aStream) const;
+private:
+	virtual void InternalizeL(RReadStream& aStream);
+	CX520AttributeTypeAndValue(const TAttributeType aType);
+	CX520AttributeTypeAndValue(); ///< Protected default constructor
+	void ConstructL(const CX520AttributeTypeAndValue& aPair);
+	void ConstructL(const TDesC8& aBinaryData, TInt& aPos);
+	void ConstructL(TAttributeType aType, const TDesC8& aValue);
+	/**
+	 * This method finds out if case-insensitive comparisons must be done or not.
+	 * Email Address is the exceptional case of 'IA5String' value type for which comparisons must be
+	 * done case-insensitivly.
+	 * 
+	 * @param aSource	contains the encoded value of the attribute type.
+	 * @return			ETrue, if case-insensitive comparisons are to be done. 
+	 * 						   This is only when value type is a Printable String OR if attribute type is an Email Address. 
+	 * 					EFalse, otherwise.
+	 */ 
+	TBool IsCaseInSensitive(const TDesC8& aSource) const;
+	HBufC* iType; ///< The encoded type
+	HBufC8* iValue; ///< The encoded value
+	};
+
+#endif