524 lines
11 KiB
C++
524 lines
11 KiB
C++
|
// V2PriKey.cpp: implementation of the CV2PriKey class.
|
||
|
//
|
||
|
// (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 <scuCast.h>
|
||
|
|
||
|
#include <iopPubBlob.h>
|
||
|
|
||
|
#include "cciCard.h"
|
||
|
#include "TransactionWrap.h"
|
||
|
|
||
|
#include "V2PriKey.h"
|
||
|
#include "PriKeyInfoRecord.h"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace cci;
|
||
|
|
||
|
/////////////////////////// LOCAL/HELPER /////////////////////////////////
|
||
|
|
||
|
/////////////////////////// PUBLIC /////////////////////////////////
|
||
|
|
||
|
// Types
|
||
|
// C'tors/D'tors
|
||
|
CV2PrivateKey::CV2PrivateKey(CV2Card const &rv2card,
|
||
|
ObjectAccess oa)
|
||
|
: CAbstractPrivateKey(rv2card, oa),
|
||
|
m_sidHandle(0),
|
||
|
m_apcir()
|
||
|
{
|
||
|
Setup(rv2card);
|
||
|
|
||
|
// write new private key object into info file
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
|
||
|
CV2PrivateKey::CV2PrivateKey(CV2Card const &rv2card,
|
||
|
SymbolID sidHandle,
|
||
|
ObjectAccess oa)
|
||
|
: CAbstractPrivateKey(rv2card, oa),
|
||
|
m_sidHandle(0),
|
||
|
m_apcir()
|
||
|
{
|
||
|
Setup(rv2card, sidHandle);
|
||
|
}
|
||
|
|
||
|
CV2PrivateKey::CV2PrivateKey(CV2Card const &rv2card,
|
||
|
BYTE bKeyType,
|
||
|
BYTE bKeyNumber,
|
||
|
ObjectAccess oa)
|
||
|
: CAbstractPrivateKey(rv2card, oa),
|
||
|
m_sidHandle(0),
|
||
|
m_apcir()
|
||
|
{
|
||
|
Setup(rv2card);
|
||
|
|
||
|
m_apcir->m_bKeyType = bKeyType;
|
||
|
m_apcir->m_bKeyNum = bKeyNumber;
|
||
|
|
||
|
// write new private key object into info file
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
|
||
|
CV2PrivateKey::~CV2PrivateKey()
|
||
|
{}
|
||
|
|
||
|
// Operators
|
||
|
// Operations
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::CredentialID(string const &rstrID)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bCredentialID, rstrID);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Decrypt(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivDecryptFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Derive(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivDeriveFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::EndDate(Date const &rEndDate)
|
||
|
{
|
||
|
CTransactionWrap wrap(m_hcard);
|
||
|
|
||
|
m_apcir->Read();
|
||
|
m_apcir->m_dtEnd = rEndDate;
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Exportable(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivExportableFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::ID(string const &rstrID)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bID, rstrID);
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::InternalAuth(string const &rstrOld)
|
||
|
{
|
||
|
CTransactionWrap wrap(m_hcard);
|
||
|
|
||
|
m_apcir->Read();
|
||
|
|
||
|
string strRetVal;
|
||
|
if (rstrOld.size() > 0x80)
|
||
|
throw Exception(ccBadLength);
|
||
|
|
||
|
if(m_apcir->m_bKeyType == CardKeyTypeNone)
|
||
|
throw Exception(ccKeyNotFound);
|
||
|
|
||
|
BYTE bKeyNum = m_apcir->m_bKeyNum;
|
||
|
|
||
|
BYTE bData[128];
|
||
|
m_hcard->SmartCard().Select("/3f00/3f11/3f03");
|
||
|
|
||
|
// TODO: Handling of keys with length != 1024 is incomplete
|
||
|
|
||
|
m_hcard->SmartCard().InternalAuth(ktRSA1024, bKeyNum,
|
||
|
static_cast<BYTE>(rstrOld.length()),
|
||
|
reinterpret_cast<BYTE const *>(rstrOld.data()),
|
||
|
bData);
|
||
|
|
||
|
strRetVal = string(reinterpret_cast<char *>(bData), rstrOld.length());
|
||
|
|
||
|
m_hcard->SmartCard().Select("/3f00/3f11");
|
||
|
|
||
|
return strRetVal;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Label(string const &rstrLabel)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bLabel, rstrLabel);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Local(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivLocalFlag, flag);
|
||
|
}
|
||
|
|
||
|
CV2PrivateKey *
|
||
|
CV2PrivateKey::Make(CV2Card const &rv2card,
|
||
|
SymbolID sidHandle,
|
||
|
ObjectAccess oa)
|
||
|
{
|
||
|
return new CV2PrivateKey(rv2card, sidHandle, oa);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Modifiable(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivModifiableFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Modulus(string const &rstrModulus)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bModulus, rstrModulus);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::NeverExportable(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivNeverExportableFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::NeverRead(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivNeverReadFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::PublicExponent(string const &rstrExponent)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bPublExponent, rstrExponent);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Read(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivReadFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Sign(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivSignFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::SignRecover(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivSignRecoverFlag, flag);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::StartDate(Date &rdtStart)
|
||
|
{
|
||
|
CTransactionWrap wrap(m_hcard);
|
||
|
|
||
|
m_apcir->Read();
|
||
|
m_apcir->m_dtStart = rdtStart;
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Subject(string const &rstrSubject)
|
||
|
{
|
||
|
m_apcir->Symbol(&m_apcir->m_bSubject, rstrSubject);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Unwrap(bool flag)
|
||
|
{
|
||
|
m_apcir->Flag(PrivUnwrapFlag, flag);
|
||
|
}
|
||
|
|
||
|
// Access
|
||
|
string
|
||
|
CV2PrivateKey::CredentialID()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bCredentialID);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Decrypt()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivDecryptFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Derive()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivDeriveFlag);
|
||
|
}
|
||
|
|
||
|
Date
|
||
|
CV2PrivateKey::EndDate()
|
||
|
{
|
||
|
CTransactionWrap wrap(m_hcard);
|
||
|
|
||
|
m_apcir->Read();
|
||
|
return m_apcir->m_dtEnd;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Exportable()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivExportableFlag);
|
||
|
}
|
||
|
|
||
|
SymbolID
|
||
|
CV2PrivateKey::Handle() const
|
||
|
{
|
||
|
return m_sidHandle;
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::ID()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bID);
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::Label()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bLabel);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Local()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivLocalFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Modifiable()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivModifiableFlag);
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::Modulus()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bModulus);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::NeverExportable()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivNeverExportableFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::NeverRead()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivNeverReadFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Private()
|
||
|
{
|
||
|
return m_apcir->Private();
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::PublicExponent()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bPublExponent);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Read()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivReadFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Sign()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivSignFlag);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::SignRecover()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivSignRecoverFlag);
|
||
|
}
|
||
|
|
||
|
Date
|
||
|
CV2PrivateKey::StartDate()
|
||
|
{
|
||
|
CTransactionWrap wrap(m_hcard);
|
||
|
|
||
|
m_apcir->Read();
|
||
|
return m_apcir->m_dtStart;
|
||
|
|
||
|
}
|
||
|
|
||
|
string
|
||
|
CV2PrivateKey::Subject()
|
||
|
{
|
||
|
return m_apcir->Symbol(&m_apcir->m_bSubject);
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
CV2PrivateKey::Unwrap()
|
||
|
{
|
||
|
return m_apcir->Flag(PrivUnwrapFlag);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Predicates
|
||
|
// Static Variables
|
||
|
|
||
|
/////////////////////////// PROTECTED /////////////////////////////////
|
||
|
|
||
|
// C'tors/D'tors
|
||
|
// Operators
|
||
|
bool
|
||
|
CV2PrivateKey::DoEquals(CAbstractPrivateKey const &rhs) const
|
||
|
{
|
||
|
CV2PrivateKey const &rv2rhs =
|
||
|
scu::DownCast<CV2PrivateKey const &, CAbstractPrivateKey const &>(rhs);
|
||
|
|
||
|
return (rv2rhs.m_sidHandle == m_sidHandle);
|
||
|
}
|
||
|
|
||
|
// Operations
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::DoDelete()
|
||
|
{
|
||
|
m_apcir->Read();
|
||
|
|
||
|
CV2Card &rv2card = scu::DownCast<CV2Card &, CAbstractCard &>(*m_hcard);
|
||
|
|
||
|
CObjectInfoFile &roif = rv2card.ObjectInfoFile(m_oa);
|
||
|
|
||
|
// Remove allocation of entry in private key file
|
||
|
if (m_apcir->m_bKeyType!=CardKeyTypeNone)
|
||
|
{
|
||
|
CCardInfo &rci = rv2card.CardInfo();
|
||
|
rci.FreePrivateKey(m_apcir->m_bKeyType, m_apcir->m_bKeyNum);
|
||
|
}
|
||
|
|
||
|
// Release symbols
|
||
|
|
||
|
if (m_apcir->m_bLabel)
|
||
|
roif.RemoveSymbol(m_apcir->m_bLabel);
|
||
|
if (m_apcir->m_bID)
|
||
|
roif.RemoveSymbol(m_apcir->m_bID);
|
||
|
if (m_apcir->m_bCredentialID)
|
||
|
roif.RemoveSymbol(m_apcir->m_bCredentialID);
|
||
|
if (m_apcir->m_bSubject)
|
||
|
roif.RemoveSymbol(m_apcir->m_bSubject);
|
||
|
if (m_apcir->m_bModulus)
|
||
|
roif.RemoveSymbol(m_apcir->m_bModulus);
|
||
|
if (m_apcir->m_bPublExponent)
|
||
|
roif.RemoveSymbol(m_apcir->m_bPublExponent);
|
||
|
|
||
|
// Delete info record
|
||
|
|
||
|
roif.RemoveObject(otPrivateKeyObject, m_sidHandle);
|
||
|
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::DoWriteKey(CPrivateKeyBlob const &rblob)
|
||
|
{
|
||
|
m_apcir->Read();
|
||
|
|
||
|
BYTE bKeyType;
|
||
|
KeyType kt;
|
||
|
switch(rblob.bPLen)
|
||
|
{
|
||
|
case 0x20:
|
||
|
bKeyType = CardKeyTypeRSA512;
|
||
|
kt = ktRSA512;
|
||
|
break;
|
||
|
|
||
|
case 0x30:
|
||
|
bKeyType = CardKeyTypeRSA768;
|
||
|
kt = ktRSA768;
|
||
|
break;
|
||
|
|
||
|
case 0x40:
|
||
|
bKeyType = CardKeyTypeRSA1024;
|
||
|
kt = ktRSA1024;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
throw Exception(ccBadKeySpec);
|
||
|
}
|
||
|
|
||
|
// Allocated a slot in the key file, unless a correct one is
|
||
|
// already allocated?
|
||
|
CV2Card &rv2card = scu::DownCast<CV2Card &, CAbstractCard &>(*m_hcard);
|
||
|
CCardInfo &rci = rv2card.CardInfo();
|
||
|
|
||
|
BYTE bKeyNum;
|
||
|
if (CardKeyTypeNone != m_apcir->m_bKeyType)
|
||
|
{
|
||
|
if (m_apcir->m_bKeyType != bKeyType)
|
||
|
{
|
||
|
rci.FreePrivateKey(m_apcir->m_bKeyType, m_apcir->m_bKeyNum);
|
||
|
m_apcir->m_bKeyType = CardKeyTypeNone;
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
else
|
||
|
bKeyNum = m_apcir->m_bKeyNum;
|
||
|
}
|
||
|
|
||
|
if (CardKeyTypeNone == m_apcir->m_bKeyType)
|
||
|
bKeyNum = rci.AllocatePrivateKey(bKeyType);
|
||
|
|
||
|
// Store private key blob
|
||
|
rv2card.SmartCard().Select(rv2card.PrivateKeyPath(kt).c_str());
|
||
|
rv2card.SmartCard().WritePrivateKey(rblob, bKeyNum);
|
||
|
|
||
|
m_apcir->m_bKeyType = bKeyType;
|
||
|
m_apcir->m_bKeyNum = bKeyNum;
|
||
|
|
||
|
rv2card.SmartCard().Select(rv2card.RootPath().c_str());
|
||
|
m_apcir->Write();
|
||
|
}
|
||
|
|
||
|
// Access
|
||
|
// Predicates
|
||
|
// Static Variables
|
||
|
|
||
|
|
||
|
/////////////////////////// PRIVATE /////////////////////////////////
|
||
|
|
||
|
// C'tors/D'tors
|
||
|
// Operators
|
||
|
// Operations
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Setup(CV2Card const &rv2card)
|
||
|
{
|
||
|
Setup(rv2card,
|
||
|
rv2card.ObjectInfoFile(m_oa).AddObject(otPrivateKeyObject,
|
||
|
PrivInfoRecordSize));
|
||
|
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CV2PrivateKey::Setup(CV2Card const &rv2card,
|
||
|
SymbolID sidHandle)
|
||
|
{
|
||
|
m_sidHandle = sidHandle;
|
||
|
|
||
|
m_apcir =
|
||
|
auto_ptr<CPriKeyInfoRecord>(new CPriKeyInfoRecord(rv2card,
|
||
|
m_sidHandle,
|
||
|
m_oa));
|
||
|
}
|
||
|
|
||
|
|
||
|
// Access
|
||
|
// Predicates
|
||
|
// Static Variables
|