windows-nt/Source/XPSP1/NT/ds/security/csps/cryptoflex/slbcci/acont.cpp
2020-09-26 16:20:57 +08:00

172 lines
4.3 KiB
C++

// ACont.cpp -- CAbstractContainer implementation
// (c) Copyright Schlumberger Technology Corp., unpublished work, created
// 1999. This computer program includes Confidential, Proprietary
// Information and is a Trade Secret of Schlumberger Technology Corp. All
// use, disclosure, and/or reproduction is prohibited unless authorized
// in writing. All Rights Reserved.
#include "cciCont.h"
#include "TransactionWrap.h"
#include "cciCert.h"
#include "cciKeyPair.h"
#include "cciPriKey.h"
#include "cciPubKey.h"
using namespace std;
using namespace cci;
/////////////////////////// LOCAL/HELPER /////////////////////////////////
namespace
{
void
Clear(CKeyPair const &rkp)
{
CPublicKey pubKey(rkp->PublicKey());
if (pubKey)
pubKey->Delete();
CPrivateKey priKey(rkp->PrivateKey());
if (priKey)
priKey->Delete();
CCertificate cert(rkp->Certificate());
if (cert)
cert->Delete();
}
} // namespace
/////////////////////////// PUBLIC /////////////////////////////////
// Types
// C'tors/D'tors
CAbstractContainer::~CAbstractContainer()
{}
// Operators
bool
CAbstractContainer::operator==(CAbstractContainer const &rhs) const
{
CTransactionWrap wrap(m_hcard);
CTransactionWrap rhswrap(rhs.m_hcard);
return CCryptObject::operator==(rhs) &&
DoEquals(rhs);
}
bool
CAbstractContainer::operator!=(CAbstractContainer const &rhs) const
{
return !(*this == rhs);
}
// Operations
void
CAbstractContainer::Delete()
{
CTransactionWrap wrap(m_hcard);
// Delete all objects in this container
Clear(ExchangeKeyPair());
Clear(SignatureKeyPair());
// If this container is the default container, re-set the default container
if(m_hcard->DefaultContainer())
{
if (CContainer(this) == m_hcard->DefaultContainer())
m_hcard->DefaultContainer(CContainer());
}
DoDelete();
}
// Access
CKeyPair
CAbstractContainer::ExchangeKeyPair()
{
CTransactionWrap wrap(m_hcard);
CContainer cont(this);
return CKeyPair(m_hcard, cont, ksExchange);
}
CKeyPair
CAbstractContainer::GetKeyPair(KeySpec ks)
{
CKeyPair kp;
CTransactionWrap wrap(m_hcard);
CContainer cont(this);
switch (ks)
{
case ksExchange:
kp = CKeyPair(m_hcard, cont, ksExchange);
break;
case ksSignature:
kp = CKeyPair(m_hcard, cont, ksSignature);
break;
default:
throw Exception(ccBadKeySpec);
}
return kp;
}
CKeyPair
CAbstractContainer::SignatureKeyPair()
{
CTransactionWrap wrap(m_hcard);
CContainer cont(this);
return CKeyPair(m_hcard, cont, ksSignature);
}
// Predicates
bool
CAbstractContainer::KeyPairExists(KeySpec ks)
{
bool fResult = true;
CTransactionWrap wrap(m_hcard);
CKeyPair kp(GetKeyPair(ks));
if (!kp->PublicKey() && !kp->PrivateKey() && !kp->Certificate())
fResult = false;
return fResult;
}
// Static Variables
/////////////////////////// PROTECTED /////////////////////////////////
// C'tors/D'tors
CAbstractContainer::CAbstractContainer(CAbstractCard const &racard)
: slbRefCnt::RCObject(),
CCryptObject(racard)
{}
// Operators
// Operations
// Access
// Predicates
// Static Variables
/////////////////////////// PRIVATE /////////////////////////////////
// C'tors/D'tors
// Operators
// Operations
// Access
// Predicates
// Static Variables