#include #include #include #include #include #include #include #include "CardObject.h" #include "SlotList.h" #include CardObject::CardObject(SlotList *sl) : m_search_type(0) , m_selected_token(NULL) , m_found_key(NULL) , m_slot_list(sl) { } CardObject::~CardObject() { // We keep ownership of the token object itself but we're expected to pawn off the resulting key // or certificate object we find. if(m_selected_token) m_selected_token->Destroy(); } bool CardObject::searchFor(int searchType, const char *s_key_id) { // Only one successful search operation allowed ACT_ASSERT(m_selected_token == NULL); if(m_selected_token != NULL) return false; std::string key_id_string(s_key_id); act::ISlot* selected_slot = NULL; act::ITokenKey* selected_key = NULL; size_t pos = 0; // Slot selection: Currently only "slot_" supported if(key_id_string.substr(pos,5) == "slot-") { pos += 5; size_t slot_num = 0; while(pos < key_id_string.length() && key_id_string[pos] >= '0' && key_id_string[pos] <= '9') slot_num = slot_num * 10 + (key_id_string[pos++] - '0'); m_selected_token = m_slot_list->getToken(slot_num); } else return false; // Bail out if the selected slot is a dud. if(!m_selected_token) return false; // Key (or cert) selection with "id_" if(key_id_string.substr(pos,4) == "-id-") { pos += 4; act::Blob id_blob; act::hex2blob(key_id_string.substr(pos).c_str()).swap(id_blob); if(searchType != act::CERTIFICATE) { for(int i=m_selected_token->GetKeyNumber();i--;) { act::ITokenKey* key = dynamic_cast(m_selected_token->GetKey(i)); if(key == NULL) continue; if(key->GetType() != act::KEY_RSA || key->GetID() != id_blob) continue; // Found it, deposit a copy for the caller's retrieval m_found_key = key->Clone(); return true; } return false; } else { for(int i=m_selected_token->GetCertificateNumber();i--;) { act::CertEntry ce(m_selected_token->GetCertificate(i)); std::auto_ptr cert(new act::Certificate("X509", ce.certblob)); if(cert.get() == NULL) continue; act::Blob serno; cert->GetParam(act::SERIALNR, serno); if(serno != id_blob) continue; // Else we found what we're looking for, deposit a pointer for the caller's retrieval m_found_certificate = ce.certblob; return true; } } } else if(key_id_string.substr(pos,6) == "-name-") // Key selection with "name-" { pos += 6; std::string name(key_id_string.substr(pos)); ACT_ASSERT(searchType != act::CERTIFICATE); for(int i=m_selected_token->GetKeyNumber();i--;) { act::ITokenKey* key = dynamic_cast(m_selected_token->GetKey(i)); if(key == NULL) continue; if(key->GetType() != act::KEY_RSA || name != key->GetName()) continue; // Found it, deposit a copy for the caller's retrieval m_found_key = key->Clone(); return true; } return false; } return false; }