javacommons/gcfprotocols/http/src.s60/chttpscertinfo.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javacommons/gcfprotocols/http/src.s60/chttpscertinfo.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,224 @@
+/*
+* Copyright (c) 2008 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:  CHttpsCertInfo
+*
+*/
+
+
+#include <x500dn.h>
+#include <ssl.h>
+#include "gcf_constants.h"
+#include "chttpscertinfo.h"
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <x520ava.h>
+#endif
+
+_LIT(KX509certificateTypeDescriptor, "X.509");
+
+_LIT(KMD5RSAAlgId,  "md5WithRSAEncryption");
+_LIT(KMD2RSAAlgId,  "md2WithRSAEncryption");
+_LIT(KSHA1RSAAlgId, "sha-1WithRSAEncryption");
+_LIT(KSHA1DSAAlgId, "id-dsa-with-sha1");
+
+_LIT(KEqualsSign,"=");
+_LIT(KSeparator,";");
+
+_LIT(KJavaX520CountryName,"C");
+_LIT(KJavaX520OrganizationName,"O");
+_LIT(KJavaX520OrganizationalUnitName,"OU");
+_LIT(KJavaX520LocalityName,"L");
+_LIT(KJavaX520CommonName,"CN");
+_LIT(KJavaX520StateOrProvinceName,"ST");
+_LIT(KJavaX520Surname,"SN");
+_LIT(KJavaPKCS9EmailAddress, "EmailAddress");
+
+// 5 * KEqualsSign + 4 * KSeparator + length of each KJavaX520 constants
+// + max length of their content (see <x520ava.h>) + 1 padding
+
+#define MAX_DN_LENGTH   (5 * KEqualsSign().Length() + 4 * KSeparator().Length() + KJavaX520CountryName().Length() + KX520MaxCLength + KJavaX520OrganizationName().Length() + KX520MaxOLength + KJavaX520OrganizationalUnitName().Length() + KX520MaxOULength + KJavaX520LocalityName().Length() + KX520MaxLLength + KJavaX520CommonName().Length() + KX520MaxCNLength + 1)
+
+/**
+ * KHexaTable translate a number into ascii code for corresponding hexadecimal symbol
+ * {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
+*/
+const TUint16 KHexaTable[] = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70};
+
+
+const TUint16 KColonAsciiCode = 58;
+
+EXPORT_C CHttpsCertInfo* CHttpsCertInfo::NewL(const CX509Certificate& acertInfo, HBufC* aCipherSuite)
+{
+    CHttpsCertInfo* me = new(ELeave) CHttpsCertInfo(acertInfo,aCipherSuite);
+    CleanupStack::PushL(me);
+    me->ConstructL();
+    CleanupStack::Pop(me);
+    return me;
+}
+
+
+
+CHttpsCertInfo::CHttpsCertInfo(const CX509Certificate& acertInfo, HBufC* aCipherSuite)
+        :iCertInfo(acertInfo), iCipherSuite(*aCipherSuite)
+{}
+
+EXPORT_C CHttpsCertInfo::~CHttpsCertInfo()
+{
+    delete iSubject;
+    delete iIssuer;
+}
+
+void CHttpsCertInfo::ConstructL()
+{}
+
+
+HBufC* CHttpsCertInfo::SerializeDistinguishedNameLC(const CX500DistinguishedName& aDN)
+{
+    HBufC* result = HBufC::NewLC(MAX_DN_LENGTH);
+    TPtr   ptr = result->Des();
+    TInt   count = aDN.Count();
+
+    for (TInt index = count -1 ; index >= 0 ; --index)
+    {
+        const CX520AttributeTypeAndValue& element = aDN.Element(index);
+        // get the element type
+        const TPtrC type = element.Type();
+
+        // map the type to a string rep
+        if (type == KX520CountryName)
+        {
+            ptr += KJavaX520CountryName;
+        }
+        else if (type == KX520OrganizationName)
+        {
+            ptr += KJavaX520OrganizationName;
+        }
+        else if (type == KX520OrganizationalUnitName)
+        {
+            ptr += KJavaX520OrganizationalUnitName;
+        }
+        else if (type == KX520LocalityName)
+        {
+            ptr += KJavaX520LocalityName;
+        }
+        else if (type == KX520StateOrProvinceName)
+        {
+            ptr += KJavaX520StateOrProvinceName;
+        }
+        else if (type == KX520CommonName)
+        {
+            ptr += KJavaX520CommonName;
+        }
+        else if (type == KX520Surname)
+        {
+            ptr += KJavaX520Surname;
+        }
+        else if (type == KPKCS9EmailAddress)
+        {
+            ptr += KJavaPKCS9EmailAddress;
+        }
+        else
+        {
+            // unsupported type
+            continue;
+        }
+        ptr += KEqualsSign;
+
+        HBufC* valbuf = element.ValueL();
+
+        ptr += *valbuf;
+        delete valbuf;
+
+        if (index > 0)
+        {
+            ptr += KSeparator;
+        }
+    }
+    return result;
+}
+
+
+void CHttpsCertInfo::GetSecurityInfoL(CDesCArray& aStringResult, TTime& aStartTime, TTime& aEndTime)
+{
+    aStartTime = iCertInfo.ValidityPeriod().Start();
+    aEndTime = iCertInfo.ValidityPeriod().Finish();
+    aStringResult.AppendL(iCipherSuite);
+    aStringResult.AppendL(KMIDSecureProtocolName());
+    aStringResult.AppendL(KMIDSecureProtocolVersion());
+    HBufC* buffer = SerializeDistinguishedNameLC(iCertInfo.SubjectName());
+    aStringResult.AppendL(*buffer);
+    CleanupStack::PopAndDestroy(buffer);
+    buffer = SerializeDistinguishedNameLC(iCertInfo.IssuerName());
+    aStringResult.AppendL(*buffer);
+    CleanupStack::PopAndDestroy(buffer);
+    aStringResult.AppendL(KX509certificateTypeDescriptor());
+    TBuf<10> versionText;
+    versionText.AppendNum(iCertInfo.Version());
+    aStringResult.AppendL(versionText);
+    switch (iCertInfo.SigningAlgorithm().DigestAlgorithm().Algorithm())
+    {
+    case EMD2:
+        if (iCertInfo.SigningAlgorithm().AsymmetricAlgorithm().Algorithm() == ERSA)
+        {
+            aStringResult.AppendL(KMD2RSAAlgId());
+            break;
+        }
+        else
+        {
+            User::Leave(KErrNotSupported);
+        }
+    case EMD5:
+        if (iCertInfo.SigningAlgorithm().AsymmetricAlgorithm().Algorithm() == ERSA)
+        {
+            aStringResult.AppendL(KMD5RSAAlgId());
+            break;
+        }
+        else
+        {
+            User::Leave(KErrNotSupported);
+        }
+    case ESHA1:
+        if (iCertInfo.SigningAlgorithm().AsymmetricAlgorithm().Algorithm() == ERSA)
+        {
+            aStringResult.AppendL(KSHA1RSAAlgId());
+            break;
+        }
+        else if (iCertInfo.SigningAlgorithm().AsymmetricAlgorithm().Algorithm() == EDSA)
+        {
+            aStringResult.AppendL(KSHA1DSAAlgId());
+            break;
+        }
+        //else fall through and Leave
+    default:
+        User::Leave(KErrNotSupported);
+    }
+    TPtrC8 number = iCertInfo.SerialNumber();
+    buffer = HBufC::NewLC(number.Length() * 3);
+
+    TPtr serialPtr = buffer->Des();
+    for (TInt i = 0; i < number.Length() ; ++i)
+    {
+        TUint8 quotient = TUint8(number[i]/16);
+
+        serialPtr.Append(KHexaTable[quotient]);
+        serialPtr.Append(KHexaTable[number[i] - quotient*16]);
+        if (i != number.Length() -1)
+        {
+            serialPtr.Append(KColonAsciiCode);
+        }
+    }
+    aStringResult.AppendL(*buffer);
+    CleanupStack::PopAndDestroy(buffer);
+}
+