vpnengine/dmadpki/src/dmadddf.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/dmadpki/src/dmadddf.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,882 @@
+/*
+* Copyright (c) 2002-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:   ddf tree implementation of DmAdPKI
+*
+*/
+
+
+
+#include <utf.h>
+#include <certificateapps.h>
+
+#include "dmadddf.h"
+#include "dmadutil.h"
+#include "vpnlogger.h"
+#include "dmadcertxmldefs.h"
+#include "XwImpl.h"
+
+static const TInt KUserStore = 1;
+static const TInt KDeviceStore = 2;
+
+CDmAdDdf* CDmAdDdf::NewL(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore)
+    {
+    TRACE("CDmAdDdf::NewL");
+    
+    CDmAdDdf* self = NewLC(aDmAdCallBack, aStore);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CDmAdDdf* CDmAdDdf::NewLC(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore)
+    {       
+    CDmAdDdf* self = new (ELeave) CDmAdDdf(aDmAdCallBack, aStore);
+    CleanupStack::PushL(self);
+    return self;
+    }
+    
+CDmAdDdf::CDmAdDdf(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore) :
+   iCallBack(aDmAdCallBack), iStore(aStore)
+    {
+    TRACE("CDmAdDdf::CDmAdDdf");
+    }
+
+CDmAdDdf::~CDmAdDdf()
+    {
+    TRACE("CDmAdDdf::~CDmAdDdf");
+    }
+    
+//===================================================================================================
+    
+void CDmAdDdf::BuildDDFVersionL(CBufBase& aDDFVersion)
+    {
+    TRACE("CDmAdDdf::BuildDDFVersionL");    
+    aDDFVersion.InsertL(0, KDmAdDdfVersion);
+    }
+
+void CDmAdDdf::BuildDDFStructureL(MSmlDmDDFObject& aDDF)
+    {
+    TRACE("CDmAdDdf::BuildDDFStructureL");
+    
+    TSmlDmAccessTypes accessTypesExec;
+    accessTypesExec.SetReplace(); // accessTypesExec.SetExec();
+
+    TSmlDmAccessTypes accessTypesGet;
+    accessTypesGet.SetGet();
+
+    TSmlDmAccessTypes accessTypesAdd;
+    accessTypesAdd.SetAdd();
+    
+    TSmlDmAccessTypes accessTypesGetAdd;
+    accessTypesGetAdd.SetGet();
+    accessTypesGetAdd.SetAdd();
+    
+    TSmlDmAccessTypes accessTypesAll;
+    accessTypesAll.SetGet();
+    accessTypesAll.SetAdd();
+    accessTypesAll.SetDelete();
+    accessTypesAll.SetReplace();
+    
+    TSmlDmAccessTypes accessTypesNoDelete;
+    accessTypesNoDelete.SetGet();
+    accessTypesNoDelete.SetAdd();
+    accessTypesNoDelete.SetReplace();
+
+    MSmlDmDDFObject* obj;
+    MSmlDmDDFObject* objNokiaPki;
+    MSmlDmDDFObject* objPkiGeneral;
+    MSmlDmDDFObject* objCert;
+    MSmlDmDDFObject* objCertX;
+    MSmlDmDDFObject* objCertReq;
+    MSmlDmDDFObject* objCertReqX;
+    MSmlDmDDFObject* objPrivKey;
+    MSmlDmDDFObject* objPrivKeyX;
+    MSmlDmDDFObject* objPKCS12;
+    MSmlDmDDFObject* objPKCS12X;
+    
+
+//----------------------------------------------------------------
+    
+    objNokiaPki = &TDmAdUtil::AddChildObjectL(aDDF, KDmAdNodeNokiaPki);
+    TDmAdUtil::FillNodeInfoL(*objNokiaPki,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeNokiaPki,
+                             ETrue,
+                             KDmAdNokiaPkiRootTypeProperty);
+    
+//----------------------------------------------------------------
+    
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafLogon);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesExec,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENull,
+                             KDmAdDescLeafLogon,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafLogoff);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesExec,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENull,
+                             KDmAdDescLeafLogoff,
+                             EFalse);
+
+    obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafKeyStore);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesExec,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafKeyStore,
+                             EFalse);
+                             
+    obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafCertStore);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesExec,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafCertStore,
+                             EFalse);
+                                                          
+    objPkiGeneral = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeGeneral);
+    TDmAdUtil::FillNodeInfoL(*objPkiGeneral,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeGeneral,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPkiGeneral, KDmAdLeafCertApplications);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EXml,
+                             KDmAdDescLeafCertApplications,
+                             EFalse);
+    
+//----------------------------------------------------------------
+    
+    objCert = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeCert);
+    TDmAdUtil::FillNodeInfoL(*objCert,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeCert,
+                             EFalse,
+                             KNullDesC8);
+    
+    objCertX = &TDmAdUtil::AddChildObjectL(*objCert, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objCertX,
+                             accessTypesAll,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafType);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafType,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFormat);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafFormat,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSerialNumber);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafSerialNumber,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafIssuerName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafIssuerName,
+                             EFalse);    
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFingerprintAlg);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafFingerprintAlg,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFingerprintValue);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafFingerprintAlg,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafValidityBegin);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafValidityBegin,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafValidityEnd);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafValidityEnd,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSubjectName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafSubjectName,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSubjectAltName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafSubjectAltName,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyURI);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafKeyUri,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyId);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafKeyId,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyUsage);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafKeyUsage,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafDeletable);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBool,
+                             KDmAdDescLeafDeletable,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafTrusted);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBool,
+                             KDmAdDescLeafTrusted,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafApplicability);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EXml,
+                             KDmAdDescLeafApplicability,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafContent);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafContent,
+                             EFalse);
+    
+    
+//----------------------------------------------------------------
+    
+    objCertReq = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeCertReq);
+    TDmAdUtil::FillNodeInfoL(*objCertReq,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeCertReq,
+                             EFalse,
+                             KNullDesC8);
+
+    
+    objCertReqX = &TDmAdUtil::AddChildObjectL(*objCertReq, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objCertReqX,
+                             accessTypesAll,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);  
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafSubjectName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafSubjectName,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafRfc822Name);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafRfc822Name,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafKeyURI);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafKeyUri,
+                             EFalse);
+        
+    obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafKeyLength);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafKeyLength,
+                             EFalse);
+           
+    obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafContent);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafContent,
+                             EFalse);
+    
+//----------------------------------------------------------------
+    
+    objPrivKey = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodePrivKey);
+    TDmAdUtil::FillNodeInfoL(*objPrivKey,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodePrivKey,
+                             EFalse,
+                             KNullDesC8);
+
+    
+    objPrivKeyX = &TDmAdUtil::AddChildObjectL(*objPrivKey, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objPrivKeyX,
+                             accessTypesAll,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyType);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafKeyType,
+                             EFalse);
+        
+    obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyId);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafKeyId,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyLength);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EInt,
+                             KDmAdDescLeafKeyLength,
+                             EFalse);
+        
+    obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafContent);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafContent,
+                             EFalse);
+
+    //------- PKCS#12 Node definitions -----------------
+
+    DEBUG_LOG(_L("Adding PKCS#12 definitions"));
+
+    // PKCS12 root node
+    objPKCS12 = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodePKCS12);
+    TDmAdUtil::FillNodeInfoL(*objPKCS12,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodePKCS12,
+                             EFalse,
+                             KNullDesC8);
+
+    // PKCS#12/X node
+    objPKCS12X = &TDmAdUtil::AddChildObjectL(*objPKCS12, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objPKCS12X,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);
+
+    // PKCS#12/X/Password leaf node
+    obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafPKCS12Password);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafPKCS12Password,
+                             EFalse);
+
+    // PKCS#12/X/Deletable leaf node
+    obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafDeletable);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBool,
+                             KDmAdDescLeafDeletable,
+                             EFalse);
+
+    // PKCS#12/X/Applicability leaf node
+    obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafApplicability);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EXml,
+                             KDmAdDescLeafApplicability,
+                             EFalse);
+
+    // PKCS#12/X/Content leaf node
+    obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafContent);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafContent,
+                             EFalse);
+
+    DEBUG_LOG(_L("Adding PKCS#12 definitions - COMPLETE"));
+
+    }
+    
+//---------------------------------------------------------------------------------------
+    
+void CDmAdDdf::NotRtNodeAddNodeObjectL(const TDesC8& /*aUri*/, const TDesC8& /*aParentLuid*/, TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeAddNodeObjectL");
+    
+    iCallBack->SetStatusL(aStatusRef, KErrNone);
+    }
+
+void CDmAdDdf::NotRtNodeUpdateLeafObjectL(const TDesC8& aUri, const TDesC8& /*aLuid*/, const TDesC8& aObject, const TDesC8& /*aType*/, TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeUpdateLeafObjectL");
+    
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdLeafLogon) == 0)
+        {
+        iStore->PkiLogonL();
+        }
+    else if (lastSeg.Compare(KDmAdLeafLogoff) == 0)
+        {
+        iStore->PkiLogoffL();
+        }
+    else if (lastSeg.Compare(KDmAdLeafKeyStore) == 0)
+        {        
+        TInt storeFromDm = TDmAdUtil::DesToInt(aObject);
+        TPkiServiceStoreType pkiStoreType = EPkiStoreTypeAny;
+        switch(storeFromDm)
+            {
+            case KUserStore:
+                pkiStoreType = EPkiStoreTypeUser;
+                break;
+            case KDeviceStore:
+                pkiStoreType = EPkiStoreTypeDevice;
+                break;
+            default:
+                User::Leave(KPKIErrNotSupported);
+                break;                
+            }
+        iStore->SetStoreTypeL(STORE_KEYSTORE, pkiStoreType);
+        }
+    else if (lastSeg.Compare(KDmAdLeafCertStore) == 0)
+        {
+        TInt storeFromDm = TDmAdUtil::DesToInt(aObject);
+        TPkiServiceStoreType pkiStoreType = EPkiStoreTypeAny;
+        switch(storeFromDm)
+            {
+            case KUserStore:
+                pkiStoreType = EPkiStoreTypeUser;
+                break;
+            case KDeviceStore:
+                pkiStoreType = EPkiStoreTypeDevice;
+                break;
+            default:
+                User::Leave(KPKIErrNotSupported);
+                break;                
+            }
+        
+        iStore->SetStoreTypeL(STORE_CERTSTORE, pkiStoreType);
+        }
+       
+    iCallBack->SetStatusL(aStatusRef, KErrNone);
+    }
+
+TInt CDmAdDdf::NotRtNodeFetchLeafObjectLC(const TDesC8& aUri, const TDesC8& /*aLuid*/, const TDesC8& /*aType*/, CBufBase*& aObject)
+    {    
+    TInt status = KErrNotFound;
+    CBufBase* object = CBufFlat::NewL(32);
+    CleanupStack::PushL(object);
+    
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdLeafCertApplications) == 0)
+        {
+
+        CCertificateAppInfoManager* appsMan  = CCertificateAppInfoManager::NewLC();
+
+        const RArray<TCertificateAppInfo>& apps = appsMan->Applications();
+        TInt count = apps.Count();
+        CXmlWriter* writer = CXmlWriter::NewL();
+        CleanupStack::PushL(static_cast<CBase*>(writer));
+        
+        writer->AddStartTagL(KXmlElemCertApps);
+        for (TInt i=0; i<count; ++i)
+            {
+            const TUid& id = apps[i].Id();
+            const TName& name = apps[i].Name();
+
+            HBufC8* idInt = TDmAdUtil::IntToDes8LC((TInt)id.iUid);
+            HBufC8* name8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(name);
+            CleanupStack::PushL(name8);
+            
+            writer->OpenStartTagL(KXmlElemApp);
+            writer->AddAttributeL(KXmlAttrId, *idInt);
+            writer->AddAttributeL(KXmlAttrName, *name8);
+            writer->CloseStartTagL(ETrue);
+            CleanupStack::PopAndDestroy(2); //name8, idInt
+            }
+        writer->AddEndTagL(KXmlElemCertApps);
+        TPtrC8 docDataPtr(writer->DocPart(0, writer->Length()-1));
+        object->InsertL(object->Size(), docDataPtr);
+        
+        DEBUG_LOG(_L("popping writer"));
+        CleanupStack::PopAndDestroy(static_cast<CBase*>(writer));        
+        DEBUG_LOG(_L("writer popped"));
+        
+        CleanupStack::PopAndDestroy(appsMan); 
+        status = KErrNone;
+        }
+    aObject = object;
+    return status;
+    }
+
+void CDmAdDdf::NotRtNodeDeleteObjectL(const TDesC8& /*aUri*/, const TDesC8& /*aLuid*/, TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeDeleteObjectL");
+    
+    iCallBack->SetStatusL(aStatusRef, KErrNone);
+    }
+    
+//---------------------------------------------------------------------------------------
+    
+TBool CDmAdDdf::IsNodeRtNodeL(const TDesC8& aUri)
+    {
+    TRACE("CDmAdDdf::IsNodeRtNodeL");
+    
+    TBool ret = EFalse;
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdNodeNokiaPki) == 0 ||
+        lastSeg.Compare(KDmAdNodeGeneral) == 0 ||
+        lastSeg.Compare(KDmAdNodeCert) == 0 ||
+        lastSeg.Compare(KDmAdNodeCertReq) == 0 ||
+        lastSeg.Compare(KDmAdNodePrivKey) == 0 ||
+        lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+        {
+        if(lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+            {
+            DEBUG_LOG(_L("LastSeg == KDmAdNodePKCS12, ret = FALSE"));
+            }
+        ret = EFalse;
+        }
+    else
+        {
+        if (TDmAdUtil::NumOfURISegs(aUri) < 2)
+            {
+            DEBUG_LOG(_L("Number of URI segments is < 2"));            
+            User::Leave(KErrNotFound);
+            }
+        TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri));
+        if (prevSeg.Compare(KDmAdNodeCert) == 0 ||
+            prevSeg.Compare(KDmAdNodeCertReq) == 0 ||
+            prevSeg.Compare(KDmAdNodePrivKey) == 0 ||
+            prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+            {
+            if(prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+                {
+                DEBUG_LOG(_L("prevSeg == KDmAdNodePKCS12, ret = TRUE"));
+                }
+            ret = ETrue;
+            }
+        else
+            {
+            DEBUG_LOG(_L("URI segment not found"));            
+            User::Leave(KErrNotFound);
+            }
+        }
+    return ret;
+    }
+
+TBool CDmAdDdf::IsLeafUnderRtNodeL(const TDesC8& aUri)
+    {
+    TRACE("CDmAdDdf::IsLeafUnderRtNodeL");
+    
+    TBool ret = EFalse;
+    TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aUri));
+    ret = IsNodeRtNodeL(nodeUri);
+    return ret;
+    }
+
+
+TPtrC8 CDmAdDdf::RtNodeUriForLeafL(const TDesC8& aLeafUri)
+    {
+    TRACE("CDmAdDdf::RtNodeUriForLeafL");
+    
+    TPtrC8 ret;
+    TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aLeafUri));    
+    TPtrC8 prevNodeUri(TDmAdUtil::RemoveLastUriSeg(nodeUri));
+    TPtrC8 prevNodeUriSeg(TDmAdUtil::LastUriSeg(prevNodeUri));
+    
+    if (prevNodeUriSeg.Compare(KDmAdNodeCert) == 0 ||
+        prevNodeUriSeg.Compare(KDmAdNodeCertReq) == 0 ||
+        prevNodeUriSeg.Compare(KDmAdNodePrivKey) == 0 ||
+        prevNodeUriSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+        {
+        if (prevNodeUriSeg.Compare(KDmAdNodePKCS12) == 0) 
+            {
+            DEBUG_LOG(_L("prevNodeUriSeg == KDmAdNodePKCS12"));
+            }
+        ret.Set(nodeUri);
+        }
+    else
+        {
+        DEBUG_LOG(_L("Unknown URI"));        
+        User::Leave(KErrNotFound);
+        }
+    return ret;
+    }
+
+TBool CDmAdDdf::IsTopLevelRtNode(const TDesC8& /*aUri*/)
+    {
+    TRACE("CDmAdDdf::IsTopLevelRtNode");
+    return ETrue;
+    }
+
+HBufC8* CDmAdDdf::ParentRtNodeUriForRtNodeLC(const TDesC8& /*aUri*/)
+    {       
+    DEBUG_LOG(_L("Method CDmAdDdf::ParentRtNodeUriForRtNodeLC not implemented"));        
+    User::Leave(KErrGeneral);
+    return 0;
+    }
+
+//---------------------------------------------------------------------------------------
+    
+void CDmAdDdf::BuildChildUriListLC(const TDesC8& aUri, const TDesC8& aParentLuid, const CArrayFix<TSmlDmMappingInfo>& aPreviousUriSegmentList, CBufBase*& aCurrentList)
+    {  
+    CBufBase *currentList = CBufFlat::NewL(128);
+    CleanupStack::PushL(currentList);
+
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdNodeNokiaPki) == 0)
+        {
+        currentList->InsertL(0, KDmAdListOfNokiaPkiChildren);
+        }
+    else if (lastSeg.Compare(KDmAdNodeGeneral) == 0)
+        {
+        currentList->InsertL(0, KDmAdListOfPkiGeneralChildren);
+        }
+    else if (lastSeg.Compare(KDmAdNodeCert) == 0 ||
+             lastSeg.Compare(KDmAdNodeCertReq) == 0 ||
+             lastSeg.Compare(KDmAdNodePrivKey) == 0 ||
+             lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+        {
+        if (lastSeg.Compare(KDmAdNodePKCS12) == 0) 
+            {
+            // Special treatment for PKCS12 nodes
+            DEBUG_LOG(_L("lastSeg == KDmAdNodePKCS12"));
+            TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+            TInt slashcount = 0;
+            TInt urisegcount = aPreviousUriSegmentList.Count();
+
+            DEBUG_LOG1(_L(" URI segment count: %d:"), urisegcount);
+
+            for (TInt i=0; i < urisegcount; i++)
+                {
+                const TSmlDmMappingInfo& mappingInfo = aPreviousUriSegmentList.At(i);
+
+                DEBUG_LOG1(_L(" SetResult URI seg entry %d:"), i);            
+                DEBUG_LOG1(_L8(" Uri seg: '%S'"), &(mappingInfo.iURISeg));
+                DEBUG_LOG_HEX(mappingInfo.iURISegLUID);
+
+                // Add slash to separate between URIs (no slash after the last one or
+                // before the first one)
+                if ((slashcount > 0) && (slashcount <= urisegcount)) 
+                    {
+                    currentList->InsertL(currentList->Size(), KDmAdSeparator);
+                    }
+
+                currentList->InsertL(currentList->Size(), mappingInfo.iURISeg);
+                slashcount++;
+                }
+            }
+        else 
+            {
+            TDmAdUtil::BuildRtNodeChildUriListL(iCallBack, iStore, aUri, aParentLuid, aPreviousUriSegmentList, *currentList);
+            }
+            
+#if 0       
+        if (currentList->Size() > 0)
+            {
+            currentList->InsertL(currentList->Size(), KDmAdAppendChildSlashExt);
+            }
+        else
+            {
+            currentList->InsertL(currentList->Size(), KDmAdAppendChildExt);
+            }
+#endif
+        }
+    else
+        {
+        TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri));
+        if (prevSeg.Compare(KDmAdNodeCert) == 0 ||
+            prevSeg.Compare(KDmAdNodeCertReq) == 0 ||
+            prevSeg.Compare(KDmAdNodePrivKey) == 0 ||
+            prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added
+            {
+            if (prevSeg.Compare(KDmAdNodePKCS12) == 0) 
+                {
+                DEBUG_LOG(_L("prevSeg == KDmAdNodePKCS12"));
+                }
+            if (!iStore->FindRtNodeL(aParentLuid, aUri))
+                {
+                DEBUG_LOG(_L("Node not found"));
+                User::Leave(KErrNotFound);
+                }
+            
+            if (prevSeg.Compare(KDmAdNodeCert) == 0)
+                {
+                currentList->InsertL(0, KDmAdListOfCertXChildren);
+                }
+            else if (prevSeg.Compare(KDmAdNodeCertReq) == 0)
+                {
+                currentList->InsertL(0, KDmAdListOfCertReqXChildren);
+                }
+            else if (prevSeg.Compare(KDmAdNodePrivKey) == 0)
+                {
+                currentList->InsertL(0, KDmAdListOfPrivKeyXChildren);
+                }
+            else if (prevSeg.Compare(KDmAdNodePKCS12) == 0) 
+                {
+                DEBUG_LOG(_L("inserting KDmAdListOfPKCS12XChildren to currentList"));
+
+                // Added handler for pkcs#12
+                currentList->InsertL(0, KDmAdListOfPKCS12XChildren);
+                }
+            }
+        else
+            {
+            DEBUG_LOG(_L("Unknown URI"));            
+            User::Leave(KErrNotFound);
+            }
+        }
+
+    aCurrentList = currentList;
+    }