diff -r 000000000000 -r 2c201484c85f securityanddataprivacytools/securitytools/certapp/encdec/certinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/securityanddataprivacytools/securitytools/certapp/encdec/certinfo.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,277 @@ +/* +* Copyright (c) 2008-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: +* +*/ + + +#include "certinfo.h" +#include "stringconv.h" +#define KReadOnlyFlagMask 128 + +static const EnumEntry enumDetailsForTBool[] = +{ + { "false", false}, + { "true", true}, + { "EFalse", false}, + { "ETrue", true}, + { 0,0 } +}; + + +// Enum values for TCertificateFormat +static const EnumEntry enumDetailsForTCertificateFormat[] = +{ + { "EX509Certificate", EX509Certificate}, + { "EWTLSCertificate", EWTLSCertificate}, + { "EX968Certificate", EX968Certificate}, + { "EUnknownCertificate", EUnknownCertificate}, + { "EX509CertificateUrl", EX509CertificateUrl}, + { "EWTLSCertificateUrl", EWTLSCertificateUrl}, + { "EX968CertificateUrl", EX968CertificateUrl}, + { 0,0 } +}; + + +static const EnumEntry enumDetailsForTCertificateOwnerType[] = +{ + { "ECACertificate", ECACertificate}, + { "EUserCertificate", EUserCertificate}, + { "EPeerCertificate", EPeerCertificate}, + { 0,0 } +}; + + +CertInfo::CertInfo(bool aSwiMode) + : iTmpCombinedDeletableAndFormat("Deletable/Format"), + iDeletable("Deletable", enumDetailsForTBool, aSwiMode), + iFormat("Format", enumDetailsForTCertificateFormat), + iSize("Size", true), // Only supported as a comment in human mode + iLabel("Label"), + iReadCertificateId("CertId(read)", true), + iWriteCertificateId("CertId(write)", false), + iCertificateOwnerType("CertOwnerType", enumDetailsForTCertificateOwnerType), + iSubjectKeyId("SubjectKeyId"), iIssuerKeyId("IssuerKeyId"), + iSwiMode(aSwiMode) + +{ + // We only need to initialise EncDecObject members which wrap non-class types + iTmpCombinedDeletableAndFormat.Value() = 0; + iSize.Value() = 0; + iReadCertificateId.Value() = 0; + iWriteCertificateId.Value() = 0; + iCertificateOwnerType.Value() = 0; +} + + +void CertInfo::Encode(REncodeWriteStream &aWriteStream) +{ + if(aWriteStream.HumanReadable()) + { + aWriteStream << iDeletable; + aWriteStream << iFormat; + } + else + { + // Write the binary field containing both format and deletable + // flag. + // + // iDeletable flag is the significant digit in order to store + // the flag without changing the externalized record + // format. The value is OPPOSITE for backward compatibility + iTmpCombinedDeletableAndFormat.Value() = static_cast (iFormat.Value() | (iDeletable.Value() ? 0 : KReadOnlyFlagMask)); + aWriteStream << iTmpCombinedDeletableAndFormat; + } + + + aWriteStream << iSize; + if(aWriteStream.HumanReadable()) + { + // In human readable form the label has already been written as part of the item header + // Write out certificate ID we read in + aWriteStream << iReadCertificateId; + } + else + { + aWriteStream << iLabel; + aWriteStream << iWriteCertificateId; + } + + + aWriteStream << iCertificateOwnerType; + aWriteStream << iSubjectKeyId; + aWriteStream << iIssuerKeyId; +} + + +void CertInfo::Decode(RDecodeReadStream &aReadStream) +{ + if(aReadStream.HumanReadable()) + { + // Read the Deletable and Format fields + aReadStream >> iDeletable; + aReadStream >> iFormat; + } + else + { + // Read the binary field containing both format and deletable + // flag. + // + // iDeletable flag is the significant digit in order to store + // the flag without changing the externalized record + // format. The value is OPPOSITE for backward compatibility + aReadStream >> iTmpCombinedDeletableAndFormat; + + iDeletable.SetValue((iTmpCombinedDeletableAndFormat.Value() & KReadOnlyFlagMask) == 0); + iFormat.SetValue((iTmpCombinedDeletableAndFormat.Value() & ~KReadOnlyFlagMask)); + } + + aReadStream >> iSize; + if(!aReadStream.HumanReadable()) + { + aReadStream >> iLabel; + } + aReadStream >> iReadCertificateId; + aReadStream >> iCertificateOwnerType; + + + if(!aReadStream.HumanReadable() || (aReadStream.PeakToken() == iSubjectKeyId.Name())) + { + // Either in binary mode, or the next token is SubjectKeyId, so read the field + aReadStream >> iSubjectKeyId; + } + else + { + // In human mode and field not present, so set it to auto + iSubjectKeyId.Value().iAutoKey = true; + iSubjectKeyId.Value().iHash.SetLength(0); + } + + if(!aReadStream.HumanReadable() || (aReadStream.PeakToken() == iIssuerKeyId.Name())) + { + // Either in binary mode, or the next token is IssuerKeyId, so read the field + aReadStream >> iIssuerKeyId; + } + else + { + // In human mode and field not present, so set it to auto + iIssuerKeyId.Value().iAutoKey = true; + iIssuerKeyId.Value().iHash.SetLength(0); + } +} + + +TUint32 CertInfo::CertSize() const +{ + return iSize.Value(); +} + +void CertInfo::SetCertSize(TUint32 aSize) +{ + iSize.Value() = aSize; +} + +const TCertLabel &CertInfo::Label() const +{ + return iLabel.Value(); +} + +TCertLabel &CertInfo::Label() +{ + return iLabel.Value(); +} + +TCertificateFormat CertInfo::CertificateFormat() const +{ + return (TCertificateFormat)iFormat.Value(); +} + + +KeyIdentifierObject &CertInfo::SubjectKeyId() +{ + return iSubjectKeyId.Value(); +} + +const KeyIdentifierObject &CertInfo::SubjectKeyId() const +{ + return iSubjectKeyId.Value(); +} + +KeyIdentifierObject &CertInfo::IssuerKeyId() +{ + return iIssuerKeyId.Value(); +} + +#ifdef _BullseyeCoverage +#pragma BullseyeCoverage off +#endif +const KeyIdentifierObject &CertInfo::IssuerKeyId() const +{ + return iIssuerKeyId.Value(); +} +#ifdef _BullseyeCoverage +#pragma BullseyeCoverage restore +#endif + +TUint32 CertInfo::OutputCertificateId() const +{ + return iWriteCertificateId.Value(); +} + + +void CertInfo::SetOutputCertificateId(TUint32 aId) +{ + iWriteCertificateId.Value() = aId; +} + + + + +// +// TCertLabel +// +void EncodeHuman(REncodeWriteStream& aStream,const TCertLabel &aLabel) +{ + // Compress the internal UTF-16 to human readable UTF-8 + TInt outputBytes = 0; + TUint8 *outBuf = cstrFromUtf16(aLabel.Ptr(), aLabel.Length(), outputBytes); + + aStream.WriteByte('"'); + aStream.WriteQuotedUtf8(outBuf, outputBytes); + aStream.WriteByte('"'); + + delete [] outBuf; +} +void DecodeHuman(RDecodeReadStream& aStream,TCertLabel &aLabel) +{ + aStream.ReadNextToken(); + + // Expand UTF-8 into internal UTF-16LE representation + TInt outputWords = 0; + TText *outputBuf = utf16FromUtf8((const TUint8 *)aStream.Token().data(), aStream.Token().size(), outputWords); + if(outputWords > aLabel.MaxLength()) + { + dbg << Log::Indent() << "String too long" << Log::Endl(); + FatalError(); + } + + memcpy((void *)aLabel.Ptr(), outputBuf, outputWords*2); + aLabel.SetLength(outputWords); + delete [] outputBuf; +} + + + + +// End of file