transmit now sets up message
This commit is contained in:
@@ -12,11 +12,7 @@ int main(int, char const*const*const argv) try {
|
|||||||
std::cout<<"Reader: "<<*it<<std::endl;
|
std::cout<<"Reader: "<<*it<<std::endl;
|
||||||
pcsc::Connection::Reader::Status s(c.reader(*it).status());
|
pcsc::Connection::Reader::Status s(c.reader(*it).status());
|
||||||
std::cout<<"Status = "<<s.state<<std::endl;
|
std::cout<<"Status = "<<s.state<<std::endl;
|
||||||
std::cout<<"Attribute = ";
|
std::cout<<"ATR = "<<crypto::hex(s.atr)<<std::endl;
|
||||||
for (std::vector<unsigned char>::const_iterator it(s.attr.begin());
|
|
||||||
it!=s.attr.end(); ++it)
|
|
||||||
std::cout<<std::hex<<(int)*it<<" ";
|
|
||||||
std::cout<<std::endl;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} catch (std::exception& x) {
|
} catch (std::exception& x) {
|
||||||
|
79
src/pcsc.hxx
79
src/pcsc.hxx
@@ -21,10 +21,10 @@
|
|||||||
#endif
|
#endif
|
||||||
namespace pcsc {
|
namespace pcsc {
|
||||||
//! stupid windows needs std::wstring
|
//! stupid windows needs std::wstring
|
||||||
std::wstring strconv(std::string s) {
|
inline std::wstring strconv(std::string s) {
|
||||||
return std::wstring(s.begin(), s.end());
|
return std::wstring(s.begin(), s.end());
|
||||||
}
|
}
|
||||||
std::string strconv(std::wstring s) {
|
inline std::string strconv(std::wstring s) {
|
||||||
return std::string(s.begin(), s.end());
|
return std::string(s.begin(), s.end());
|
||||||
}
|
}
|
||||||
typedef wchar_t char_t;
|
typedef wchar_t char_t;
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
#include <PCSC/wintypes.h>
|
#include <PCSC/wintypes.h>
|
||||||
#include <PCSC/winscard.h>
|
#include <PCSC/winscard.h>
|
||||||
namespace pcsc {
|
namespace pcsc {
|
||||||
const std::string& strconv(const std::string& s) {
|
inline const std::string& strconv(const std::string& s) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
typedef char char_t;
|
typedef char char_t;
|
||||||
@@ -104,6 +104,12 @@ namespace pcsc {
|
|||||||
exception("smardcard access error:\n"+reason) {
|
exception("smardcard access error:\n"+reason) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
class runtime_error: public exception {
|
||||||
|
public:
|
||||||
|
runtime_error(const std::string& reason, const std::string& data) throw():
|
||||||
|
exception("runtime error,\n"+reason+":\n"+crypto::hex(data)) {}
|
||||||
|
};
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
//! @addtogroup pcsclib
|
//! @addtogroup pcsclib
|
||||||
@@ -175,22 +181,9 @@ namespace pcsc {
|
|||||||
//! State and attribute list of a reader.
|
//! State and attribute list of a reader.
|
||||||
class Status {
|
class Status {
|
||||||
public:
|
public:
|
||||||
Status(unsigned long s, const std::vector<unsigned char>& attrs):
|
Status(unsigned long s, const std::string& a): state(s), atr(a) {}
|
||||||
state(s), attr(attrs) {
|
|
||||||
}
|
|
||||||
Status(unsigned long s, const std::string& attrs):
|
|
||||||
state(s), attr(convert(attrs)) {
|
|
||||||
}
|
|
||||||
const unsigned long state;
|
const unsigned long state;
|
||||||
const std::vector<unsigned char> attr;
|
const std::string atr;
|
||||||
private:
|
|
||||||
static std::vector<unsigned char> convert(const std::string& a) {
|
|
||||||
std::vector<unsigned char> res;
|
|
||||||
for (std::string::const_iterator it(a.begin());
|
|
||||||
it!=a.end(); ++it)
|
|
||||||
res.push_back(*it);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//.............................................................methods
|
//.............................................................methods
|
||||||
@@ -215,6 +208,54 @@ namespace pcsc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//! Transmit data to reader.
|
//! Transmit data to reader.
|
||||||
|
/*! @note Take care: Stings may contain embedded @c 0. */
|
||||||
|
std::string transmit(char cla, char ins, char p1, char p2,
|
||||||
|
const std::string& lc = std::string(),
|
||||||
|
unsigned char le = 253) {
|
||||||
|
std::string claInsP1P2;
|
||||||
|
claInsP1P2.push_back(cla);
|
||||||
|
claInsP1P2.push_back(ins);
|
||||||
|
claInsP1P2.push_back(p1);
|
||||||
|
claInsP1P2.push_back(p2);
|
||||||
|
assert(claInsP1P2.size()==4);
|
||||||
|
return transmit(claInsP1P2, lc, le);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Transmit data to reader.
|
||||||
|
/*! @note Take care: Stings may contain embedded @c 0. */
|
||||||
|
std::string transmit(char cla, char ins, char p1, char p2,
|
||||||
|
const char* lc, int len,
|
||||||
|
unsigned char le = 253) {
|
||||||
|
std::string claInsP1P2;
|
||||||
|
claInsP1P2.push_back(cla);
|
||||||
|
claInsP1P2.push_back(ins);
|
||||||
|
claInsP1P2.push_back(p1);
|
||||||
|
claInsP1P2.push_back(p2);
|
||||||
|
assert(claInsP1P2.size()==4);
|
||||||
|
return transmit(claInsP1P2, std::string(lc, len), le);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Transmit data to reader.
|
||||||
|
/*! @note Take care: Stings may contain embedded @c 0.
|
||||||
|
@note Prefer the transmit methods that passes @c cla, @c
|
||||||
|
ins, @c p1 and @c p2 separate.*/
|
||||||
|
std::string transmit(const std::string& claInsP1P2,
|
||||||
|
const std::string& lc,
|
||||||
|
unsigned char le = 253) {
|
||||||
|
if (claInsP1P2.size()!=4)
|
||||||
|
throw runtime_error("transmit: claInsP1P2 must be 4 byte",
|
||||||
|
claInsP1P2);
|
||||||
|
if (lc.size()>255) throw runtime_error("transmit: lc too long", lc);
|
||||||
|
std::string msg(claInsP1P2);
|
||||||
|
if (lc.size()) (msg+=(char)lc.size())+=lc;
|
||||||
|
msg+=le;
|
||||||
|
return transmit(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Transmit data to reader.
|
||||||
|
/*! @note Take care: Stings may contain embedded @c 0.
|
||||||
|
@note Prefer the transmit methods that passes @c cla, @c
|
||||||
|
ins, @c p1 and @c p2 separate.*/
|
||||||
std::string transmit(std::string in) {
|
std::string transmit(std::string in) {
|
||||||
DWORD len(1024); // arbitrary
|
DWORD len(1024); // arbitrary
|
||||||
unsigned char buff[len];
|
unsigned char buff[len];
|
||||||
@@ -300,7 +341,7 @@ namespace pcsc {
|
|||||||
check(SCardConnect(_connection._id, strconv(name).c_str(),
|
check(SCardConnect(_connection._id, strconv(name).c_str(),
|
||||||
mode, protocol,
|
mode, protocol,
|
||||||
&_id, &_protocol),
|
&_id, &_protocol),
|
||||||
"connect smartcard \""+name+"\" ("+crypto::hex(name)+")");
|
"connect smartcard \""+name);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! forbidden
|
//! forbidden
|
||||||
|
Reference in New Issue
Block a user