diff -r 6b63ca65093a -r aad866c37519 pkiutilities/untrustedcertificatedialog/src/untrustedcertificateinfo_symbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkiutilities/untrustedcertificatedialog/src/untrustedcertificateinfo_symbian.cpp Fri Jun 11 14:28:40 2010 +0300 @@ -0,0 +1,213 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: Certificate info class for TLS untrusted certificate dialog. +* +*/ + +#include "untrustedcertificateinfo_symbian.h" +#include // TAlgorithmId +#include // CX509Certificate +#include + + +// ======== LOCAL FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// mapAlgorithm() +// ---------------------------------------------------------------------------- +// +UntrustedCertificateInfoBase::Algorithm mapAlgorithm(TAlgorithmId aAlgId) +{ + UntrustedCertificateInfoBase::Algorithm algorithm = + UntrustedCertificateInfoBase::Unknown; + switch(aAlgId) { + case ERSA: + algorithm = UntrustedCertificateInfoBase::RSA; + break; + case EDSA: + algorithm = UntrustedCertificateInfoBase::DSA; + break; + case EDH: + algorithm = UntrustedCertificateInfoBase::DH; + break; + case EMD2: + algorithm = UntrustedCertificateInfoBase::MD2; + break; + case EMD5: + algorithm = UntrustedCertificateInfoBase::MD5; + break; + case ESHA1: + algorithm = UntrustedCertificateInfoBase::SHA1; + break; + case ESHA224: + algorithm = UntrustedCertificateInfoBase::SHA224; + break; + case ESHA256: + algorithm = UntrustedCertificateInfoBase::SHA256; + break; + case ESHA384: + algorithm = UntrustedCertificateInfoBase::SHA384; + break; + case ESHA512: + algorithm = UntrustedCertificateInfoBase::SHA512; + break; + default: + break; + } + return algorithm; +} + +// ---------------------------------------------------------------------------- +// convertDateTime() +// ---------------------------------------------------------------------------- +// +QDateTime convertDateTime(const TTime& aTime) +{ + const TDateTime &symbianDateTime = aTime.DateTime(); + + QDateTime dateTime; + QDate date(symbianDateTime.Year(), symbianDateTime.Month()+1, symbianDateTime.Day()+1); + QTime time(symbianDateTime.Hour(), symbianDateTime.Minute(), symbianDateTime.Second()); + dateTime.setDate(date); + dateTime.setTime(time); + + return dateTime; +} + + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::UntrustedCertificateInfoSymbian() +// ---------------------------------------------------------------------------- +// +UntrustedCertificateInfoSymbian::UntrustedCertificateInfoSymbian( + const CX509Certificate& aCert) : UntrustedCertificateInfoBase(), iCert(0) +{ + QT_TRAP_THROWING(ConstructL(aCert)); +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::~UntrustedCertificateInfoSymbian() +// ---------------------------------------------------------------------------- +// +UntrustedCertificateInfoSymbian::~UntrustedCertificateInfoSymbian() +{ + delete iCert; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::commonNameMatches() +// ---------------------------------------------------------------------------- +// +bool UntrustedCertificateInfoSymbian::commonNameMatches(const QString &siteName) const +{ + bool matches = false; + QT_TRAP_THROWING(matches = CommonNameMatchesL(siteName)); + return matches; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::isPermanentAcceptAllowed() +// ---------------------------------------------------------------------------- +// +bool UntrustedCertificateInfoSymbian::isPermanentAcceptAllowed() const +{ + return isDateValid(); +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::certificateDetails() +// ---------------------------------------------------------------------------- +// +QString UntrustedCertificateInfoSymbian::certificateDetails() const +{ + QString details; + QTextStream stream(&details); + // TODO: localised UI strings needed + stream << tr("Issuer:\n%1\n").arg(issuerName()); + stream << endl; + stream << tr("Subject:\n%1\n").arg(subjectName()); + stream << endl; + stream << tr("Valid from:\n%1\n").arg(validFrom().toString()); + stream << endl; + stream << tr("Valid until:\n%1\n").arg(validTo().toString()); + stream << endl; + stream << tr("Certificate format:\n%1\n").arg(format()); + stream << endl; + stream << tr("Algorithm:\n%1\n").arg(combinedAlgorithmName()); + stream << endl; + stream << tr("Serial number:\n%1\n").arg(formattedSerialNumber()); + stream << endl; + stream << tr("Fingerprint (SHA1):\n%1\n").arg(formattedFingerprint()); + // TODO: MD5 fingerprint missing + return details; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::ConstructL() +// ---------------------------------------------------------------------------- +// +void UntrustedCertificateInfoSymbian::ConstructL(const CX509Certificate& aCert) +{ + ASSERT( iCert == 0 ); + iCert = CX509Certificate::NewL( aCert ); + + HBufC16* subjectBuf = iCert->SubjectL(); + mSubjectName = QString::fromUtf16(subjectBuf->Ptr(), subjectBuf->Length()); + delete subjectBuf; + + HBufC16* issuerBuf = iCert->IssuerL(); + mIssuerName = QString::fromUtf16(issuerBuf->Ptr(), issuerBuf->Length()); + delete issuerBuf; + + TPtrC8 fingerprint = iCert->Fingerprint(); + mFingerprint = QByteArray::fromRawData( + reinterpret_cast(fingerprint.Ptr()), fingerprint.Length()); + + TPtrC8 serialNumber = iCert->SerialNumber(); + mSerialNumber = QByteArray::fromRawData( + reinterpret_cast(serialNumber.Ptr()), serialNumber.Length()); + + const CValidityPeriod& validityPeriod = iCert->ValidityPeriod(); + mValidFrom = convertDateTime(validityPeriod.Start()); + mValidTo = convertDateTime(validityPeriod.Finish()); + + mFormat = X509Certificate; + + const CSigningAlgorithmIdentifier& alg = iCert->SigningAlgorithm(); + mDigestAlgorithm = mapAlgorithm(alg.DigestAlgorithm().Algorithm()); + mAsymmetricAlgorithm = mapAlgorithm(alg.AsymmetricAlgorithm().Algorithm()); +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::CommonNameMatchesL() +// ---------------------------------------------------------------------------- +// +bool UntrustedCertificateInfoSymbian::CommonNameMatchesL(const QString &siteName) const +{ + bool matches = false; + const CX500DistinguishedName& distinguishedName = iCert->SubjectName(); + HBufC* commonNameSymbian = distinguishedName.ExtractFieldL( KX520CommonName ); + if (commonNameSymbian) { + CleanupStack::PushL(commonNameSymbian); + QString commonName = QString::fromRawData( + reinterpret_cast(commonNameSymbian->Ptr()), + commonNameSymbian->Length()); + matches = ( commonName == siteName ); // TODO: accept '*' chars in commonName? + CleanupStack::PopAndDestroy(commonNameSymbian); + } + return matches; +} +