diff -r 63339781d179 -r 09b1ac925e3f pkiutilities/untrustedcertificatedialog/src/untrustedcertificateinfo_symbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkiutilities/untrustedcertificatedialog/src/untrustedcertificateinfo_symbian.cpp Tue Aug 31 16:04:40 2010 +0300 @@ -0,0 +1,227 @@ +/* +* 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 // X509CertNameParser +#include // CMD5 + + +// ======== 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() +// ---------------------------------------------------------------------------- +// +void convertDateTime(const TTime& aFromTime, QDateTime& aToDateTime) +{ + const TDateTime &symbianDateTime = aFromTime.DateTime(); + + QDate date(symbianDateTime.Year(), symbianDateTime.Month()+1, symbianDateTime.Day()+1); + QTime time(symbianDateTime.Hour(), symbianDateTime.Minute(), symbianDateTime.Second()); + aToDateTime.setDate(date); + aToDateTime.setTime(time); +} + + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::UntrustedCertificateInfoSymbian() +// ---------------------------------------------------------------------------- +// +UntrustedCertificateInfoSymbian::UntrustedCertificateInfoSymbian( + const QByteArray &aEncodedCert) : UntrustedCertificateInfoBase(), + mCert(0), mMd5Fingerprint() +{ + QT_TRAP_THROWING(ConstructL(aEncodedCert)); +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::~UntrustedCertificateInfoSymbian() +// ---------------------------------------------------------------------------- +// +UntrustedCertificateInfoSymbian::~UntrustedCertificateInfoSymbian() +{ + delete mCert; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::commonNameMatches() +// ---------------------------------------------------------------------------- +// +bool UntrustedCertificateInfoSymbian::commonNameMatches(const QString &siteName) const +{ + bool matches = false; + QT_TRAP_THROWING(matches = CommonNameMatchesL(siteName)); + return matches; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::certificateDetails() +// ---------------------------------------------------------------------------- +// +QString UntrustedCertificateInfoSymbian::certificateDetails(const QString &siteName) const +{ + // TODO: localized UI string needed + QString details = tr("Service:\n%1\n\nIssuer:\n%2\n\nSubject:\n%3\n\n" + "Valid from:\n%4\n\nValid until:\n%5\n\nCertificate format:\n%6\n\n" + "Algorithm:\n%7\n\nSerial number:\n%8\n\n" + "Fingerprint (SHA1):\n%9\n\nFingerprint (MD5):\n%10") + .arg(siteName) // %1 + .arg(issuerName()) // %2 + .arg(subjectName()) // %3 + .arg(validFrom().toString()) // %4 + .arg(validTo().toString()) // %5 + .arg(format()) // %6 + .arg(combinedAlgorithmName()) // %7 + .arg(formattedSerialNumber(serialNumber())) // %8 + .arg(formattedFingerprint(fingerprint())) // %9 + .arg(formattedFingerprint(mMd5Fingerprint)); // %10 + return details; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::ConstructL() +// ---------------------------------------------------------------------------- +// +void UntrustedCertificateInfoSymbian::ConstructL(const QByteArray &aEncodedCert) +{ + TPtrC8 encodedCert( reinterpret_cast( aEncodedCert.constData() ), + aEncodedCert.length() ); + + ASSERT( mCert == 0 ); + mCert = CX509Certificate::NewL( encodedCert ); + + HBufC16* subjectBuf = NULL; + X509CertNameParser::SubjectFullNameL( *mCert, subjectBuf ); + CleanupStack::PushL( subjectBuf ); + QT_TRYCATCH_LEAVING( mSubjectName = + QString::fromUtf16(subjectBuf->Ptr(), subjectBuf->Length()) ); + CleanupStack::PopAndDestroy( subjectBuf ); + + HBufC16* issuerBuf = NULL; + X509CertNameParser::IssuerFullNameL( *mCert, issuerBuf ); + CleanupStack::PushL( issuerBuf ); + QT_TRYCATCH_LEAVING( mIssuerName = + QString::fromUtf16(issuerBuf->Ptr(), issuerBuf->Length())); + CleanupStack::PopAndDestroy( issuerBuf ); + + TPtrC8 fingerprint = mCert->Fingerprint(); + QT_TRYCATCH_LEAVING( mFingerprint = QByteArray::fromRawData( + reinterpret_cast(fingerprint.Ptr()), fingerprint.Length()) ); + + mMd5Fingerprint = Md5FingerprintL( mCert->Encoding() ); + + TPtrC8 serialNumber = mCert->SerialNumber(); + QT_TRYCATCH_LEAVING( mSerialNumber = QByteArray::fromRawData( + reinterpret_cast(serialNumber.Ptr()), serialNumber.Length()) ); + + const CValidityPeriod& validityPeriod = mCert->ValidityPeriod(); + convertDateTime(validityPeriod.Start(), mValidFrom); + convertDateTime(validityPeriod.Finish(), mValidTo); + + mFormat = X509Certificate; + + const CSigningAlgorithmIdentifier& alg = mCert->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 = mCert->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; +} + +// ---------------------------------------------------------------------------- +// UntrustedCertificateInfoSymbian::Md5FingerprintL() +// ---------------------------------------------------------------------------- +// +QByteArray UntrustedCertificateInfoSymbian::Md5FingerprintL( const TDesC8& aEncodedCert ) const +{ + CMD5* md5 = CMD5::NewL(); + CleanupStack::PushL( md5 ); + + const TPtrC8 fingerprintSymbian = md5->Hash( aEncodedCert ); + QByteArray fingerprint( reinterpret_cast( fingerprintSymbian.Ptr() ), + fingerprintSymbian.Length() ); + + CleanupStack::PopAndDestroy( md5 ); + return fingerprint; +} +