diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/inc/x520ava.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/inc/x520ava.h Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,327 @@ +/* +* 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 +#include +#include + +/** 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