// 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 #include #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(rstrOld.length()), reinterpret_cast(rstrOld.data()), bData); strRetVal = string(reinterpret_cast(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(rhs); return (rv2rhs.m_sidHandle == m_sidHandle); } // Operations void CV2PrivateKey::DoDelete() { m_apcir->Read(); CV2Card &rv2card = scu::DownCast(*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(*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(new CPriKeyInfoRecord(rv2card, m_sidHandle, m_oa)); } // Access // Predicates // Static Variables