vpnengine/dmadpki/src/dmadcertutil.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/dmadpki/src/dmadcertutil.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,90 @@
+/*
+* Copyright (c) 2002-2006 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: Implementation of TDmAdCertUtil.
+*
+*/
+
+
+
+#include <x509cert.h>
+#include <x509keys.h>
+#include <x500dn.h>
+
+#include "dmadcertutil.h"
+#include "pkcs10.h"
+#include "utlcrypto.h"
+
+
+void TDmAdCertUtil::ParseAvaL(const CX520AttributeTypeAndValue& aAva, TDes8& aOut)
+    {
+    TPtrC8 attr = CPkcs10Req::AttributeTypeOidToText(aAva.Type());
+    TBuf8<32> tempOidBuf;
+    HBufC* val = NULL;
+    TRAPD(ret, val = aAva.ValueL());
+    if(ret == KErrNone)
+        {
+        CleanupStack::PushL(val);
+        if(attr.Length() == 0)
+            {
+            // Dotted oid representation
+            tempOidBuf.Copy(aAva.Type());
+            aOut.Append(tempOidBuf);
+            }
+        else
+            {
+            aOut.Append(attr);
+            }
+        aOut.Append(_L("="));
+        aOut.Append(val->Des());
+        CleanupStack::PopAndDestroy(val);
+        }
+    }
+
+void TDmAdCertUtil::CertDnL(const CX500DistinguishedName& aName, TDes8& aOut)
+    {
+    TInt count = aName.Count();
+    for (TInt i = 0; i < count; i++)
+        {
+        if(i > 0)
+            aOut.Append(_L(","));
+        const CX520AttributeTypeAndValue& ava = aName.Element(i);
+        ParseAvaL(ava, aOut);
+        }
+    }
+
+HBufC8* TDmAdCertUtil::Sha1DigestL(const TDesC8& aData)
+    {
+    CUtlMessageDigest* digester = TUtlCrypto::MakeMessageDigesterL(TUtlCrypto::EUtlMessageDigestSha1);
+    CleanupStack::PushL(digester);
+
+    HBufC8* hashBuf = HBufC8::NewLC(digester->HashSize());
+    TPtr8 hashBufDesc(hashBuf->Des());
+    
+    hashBufDesc.Copy(digester->Final(aData));
+    CleanupStack::Pop(hashBuf);
+    CleanupStack::PopAndDestroy(digester);
+    return hashBuf;
+    }
+
+HBufC8* TDmAdCertUtil::RSAKeyIdentifierLC(const TDesC8& aKeyData)
+    {
+    TX509KeyFactory keyFactory;
+    CRSAPublicKey* rsaKey = keyFactory.RSAPublicKeyL(aKeyData);
+    CleanupStack::PushL(rsaKey);
+    HBufC8* modulusBuffer = rsaKey->N().BufferLC();
+    HBufC8* hash = TDmAdCertUtil::Sha1DigestL(*modulusBuffer);
+    CleanupStack::PopAndDestroy(2); // modulusBuffer, rsaKey
+    CleanupStack::PushL(hash);
+    return hash;
+    }