CK_FUNCTION_LIST* f() { return d_functions; }
pthread_mutex_t *m() { return &d_m; }
+
+ static std::shared_ptr<Pkcs11Slot> GetSlot(const std::string& module, const CK_SLOT_ID& slotId);
};
class Pkcs11Token {
std::string d_ecdsa_params;
std::string d_label;
-
+ bool d_loaded;
CK_RV d_err;
void logError(const std::string& operation) const {
~Pkcs11Token();
bool Login(const std::string& pin) {
- if (pin.empty()) return CKR_PIN_INVALID; // no empty pin.
+ if (pin.empty()) return false; // no empty pin.
Lock l(d_slot->m());
-
if (d_slot->Login(pin) == true) {
LoadAttributes();
}
return LoggedIn();
}
- bool LoggedIn() const { return d_slot->LoggedIn(); }
+ bool LoggedIn() {
+ if (d_loaded == false && d_slot->LoggedIn() == true) {
+ Lock l(d_slot->m());
+ LoadAttributes();
+ }
+ return d_slot->LoggedIn();
+ }
void LoadAttributes() {
std::vector<P11KitAttribute> attr;
} else {
throw PDNSException("Cannot load attributes for PCKS#11 public key " + d_label);
}
+
+ d_loaded = true;
}
int GenerateKeyPair(CK_MECHANISM_PTR mechanism, std::vector<P11KitAttribute>& pubAttributes, std::vector<P11KitAttribute>& privAttributes, CK_OBJECT_HANDLE_PTR pubKey, CK_OBJECT_HANDLE_PTR privKey) {
static std::map<std::string, std::shared_ptr<Pkcs11Slot> > pkcs11_slots;
static std::map<std::string, std::shared_ptr<Pkcs11Token> > pkcs11_tokens;
-std::shared_ptr<Pkcs11Token> Pkcs11Token::GetToken(const std::string& module, const CK_SLOT_ID& slotId, const std::string& label) {
+std::shared_ptr<Pkcs11Slot> Pkcs11Slot::GetSlot(const std::string& module, const CK_SLOT_ID& slotId) {
// see if we can find module
- std::string tidx = module;
- tidx.append("|");
- tidx.append(boost::lexical_cast<std::string>(slotId));
- std::string sidx = tidx;
- tidx.append("|");
- tidx.append(label);
- std::map<std::string, std::shared_ptr<Pkcs11Token> >::iterator tokenIter;
+ std::string sidx = module;
+ sidx.append("|");
+ sidx.append(boost::lexical_cast<std::string>(slotId));
std::map<std::string, std::shared_ptr<Pkcs11Slot> >::iterator slotIter;
CK_RV err;
CK_FUNCTION_LIST* functions;
- if ((tokenIter = pkcs11_tokens.find(tidx)) != pkcs11_tokens.end()) return tokenIter->second;
-
// see if we have slot
if ((slotIter = pkcs11_slots.find(sidx)) != pkcs11_slots.end()) {
- pkcs11_tokens[tidx] = std::make_shared<Pkcs11Token>(slotIter->second, label);
- return pkcs11_tokens[tidx];
+ return slotIter->second;
}
#ifdef HAVE_P11KIT1_V2
// store slot
pkcs11_slots[sidx] = std::make_shared<Pkcs11Slot>(functions, slotId);
- // looks ok to me.
- pkcs11_tokens[tidx] = std::make_shared<Pkcs11Token>(pkcs11_slots[sidx], label);
+ return pkcs11_slots[sidx];
+}
+std::shared_ptr<Pkcs11Token> Pkcs11Token::GetToken(const std::string& module, const CK_SLOT_ID& slotId, const std::string& label) {
+ // see if we can find module
+ std::string tidx = module;
+ tidx.append("|");
+ tidx.append(boost::lexical_cast<std::string>(slotId));
+ tidx.append("|");
+ tidx.append(label);
+ std::map<std::string, std::shared_ptr<Pkcs11Token> >::iterator tokenIter;
+ if ((tokenIter = pkcs11_tokens.find(tidx)) != pkcs11_tokens.end()) return tokenIter->second;
+
+ std::shared_ptr<Pkcs11Slot> slot = Pkcs11Slot::GetSlot(module, slotId);
+ pkcs11_tokens[tidx] = std::make_shared<Pkcs11Token>(slot, label);
return pkcs11_tokens[tidx];
}
this->d_slot = slot;
this->d_label = label;
this->d_err = 0;
+ this->d_loaded = false;
Lock l(d_slot->m());
if (this->d_slot->LoggedIn()) LoadAttributes();
}
Pkcs11Token::~Pkcs11Token() {
}
+bool PKCS11ModuleSlotLogin(const std::string& module, int slotId, const std::string& pin)
+{
+ std::shared_ptr<Pkcs11Slot> slot;
+ slot = Pkcs11Slot::GetSlot(module, slotId);
+ if (slot->LoggedIn()) return true; // no point failing
+ return slot->Login(pin);
+}
+
PKCS11DNSCryptoKeyEngine::PKCS11DNSCryptoKeyEngine(unsigned int algorithm): DNSCryptoKeyEngine(algorithm) {}
PKCS11DNSCryptoKeyEngine::~PKCS11DNSCryptoKeyEngine() {}
PKCS11DNSCryptoKeyEngine::PKCS11DNSCryptoKeyEngine(const PKCS11DNSCryptoKeyEngine& orig) : DNSCryptoKeyEngine(orig.d_algorithm) {}