/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #include #include #include #include #include #include #include namespace suisseid { class Card { public: Card(mrw::Shared reader, mrw::Shared slot): _reader(reader), _slot(slot) { } virtual ~Card() {} const std::string& name() { return _reader->name; } private: mrw::Shared _reader; mrw::Shared _slot; }; class PostSuisseID: public Card { public: PostSuisseID(mrw::Shared reader, mrw::Shared slot): Card(reader, slot) { } }; class Manager { public: Manager(const std::string& lib="libcvP11.so"): _cryptoki(lib) { } Manager(const pcsc::Connection& pcsc, const std::string& lib="libcvP11.so"): _pcsc(pcsc), _cryptoki(lib) { } Manager(const cryptoki::Library& cryptoki): _cryptoki(cryptoki) { } Manager(const pcsc::Connection& pcsc, const cryptoki::Library& cryptoki): _pcsc(pcsc), _cryptoki(cryptoki) { } typedef std::vector > Cards; Cards scan() { Cards res; // By now, scan only for PostSuisseID; in future use factory pattern pcsc::Connection::Strings readers (_pcsc.getReadersWithAtr("4b53776973735369676e")); for (pcsc::Connection::Strings::iterator reader(readers.begin()); reader!=readers.end(); ++reader) { cryptoki::SlotList slots(_cryptoki.slotList(true, *reader)); if (slots.size()==1) res.push_back(dynamic_cast (new PostSuisseID(_pcsc.reader(*reader), slots[0]))); } return res; } private: pcsc::Connection _pcsc; cryptoki::Library _cryptoki; }; } int main(int argc, char** argv) try { std::string lib("libcvP11.so"); mrw::args::parse(argc, argv, "Sign a text (optionally several times for performance" " measurements).", mrw::args::list() <name()<