better error messages
This commit is contained in:
@@ -2,20 +2,16 @@
|
||||
#include <cryptoki.hxx>
|
||||
#include <iostream>
|
||||
|
||||
template <int NUM, typename TYPE> std::vector<TYPE> toVector(TYPE in[NUM]) {
|
||||
return std::vector<TYPE>(in, in+NUM);
|
||||
}
|
||||
#define VECTOR(ARRAY) toVector<sizeof(ARRAY)/sizeof(ARRAY[0])>(ARRAY)
|
||||
|
||||
template <typename Array> void print(const std::vector<Array>& v) {
|
||||
for (typename std::vector<Array>::const_iterator it(v.begin()); it!=v.end(); ++it)
|
||||
for (typename std::vector<Array>::const_iterator it(v.begin());
|
||||
it!=v.end(); ++it)
|
||||
std::cout<<"Item: "<<*it<<std::endl;
|
||||
}
|
||||
|
||||
int main(int argc, char const*const*const argv) try {
|
||||
//std::vector<int> v(toVector<4>((int[]){1,2,3,4}));
|
||||
std::vector<int> v(VECTOR(((int[]){1,2,3,4})));
|
||||
print(v);
|
||||
// //std::vector<int> v(toVector<4>((int[]){1,2,3,4}));
|
||||
// std::vector<int> v(VECTOR(((int[]){1,2,3,4})));
|
||||
// print(v);
|
||||
cryptoki::Init init(argc==2?argv[1]:"onepin-opensc-pkcs11.so");
|
||||
cryptoki::Info inf(init.info());
|
||||
std::cout<<"##################### INFO #####################"<<std::endl
|
||||
|
@@ -11,10 +11,12 @@
|
||||
#include <opencryptoki/apiclient.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
||||
// for inline implementations only
|
||||
#include <sstream>
|
||||
#include <cstdlib> // malloc/free
|
||||
|
||||
//! C++ Wrapper around Cryptoki API
|
||||
namespace cryptoki {
|
||||
@@ -30,6 +32,13 @@ namespace cryptoki {
|
||||
#define UNDEF_CRYPTOKI_FN_LOG
|
||||
#endif
|
||||
|
||||
|
||||
template <int NUM, typename TYPE> std::vector<TYPE> toVector(TYPE in[NUM]) {
|
||||
return std::vector<TYPE>(in, in+NUM);
|
||||
}
|
||||
#define CRYPTOKI_TO_VECTOR(ARRAY) \
|
||||
toVector<sizeof(ARRAY)/sizeof(ARRAY[0])>(ARRAY)
|
||||
|
||||
//============================================================================
|
||||
class exception: public std::exception {
|
||||
public:
|
||||
@@ -64,7 +73,17 @@ namespace cryptoki {
|
||||
typedef std::set<CK_MECHANISM_TYPE> MechanismList;
|
||||
|
||||
typedef std::vector<CK_ATTRIBUTE_TYPE> AttributeTypeList;
|
||||
typedef std::vector<CK_ATTRIBUTE> AttributeList;
|
||||
|
||||
struct Attribute {
|
||||
Attribute(CK_ATTRIBUTE& attr):
|
||||
type(attr.type), value((char*)attr.pValue, attr.ulValueLen) {
|
||||
free(attr.pValue);
|
||||
attr.pValue = 0;
|
||||
}
|
||||
CK_ATTRIBUTE_TYPE type;
|
||||
std::string value;
|
||||
};
|
||||
typedef std::map<CK_ATTRIBUTE_TYPE, Attribute> AttributeList;
|
||||
|
||||
// //! Map Attribute Class to type
|
||||
// /*! @todo to be completed ... */
|
||||
@@ -1216,14 +1235,32 @@ namespace cryptoki {
|
||||
|
||||
AttributeList getattributevalue(const AttributeTypeList& attributes) {
|
||||
AttributeList res;
|
||||
for (AttributeTypeList::const_iterator it(attributes.begin());
|
||||
it!=attributes.end(); ++it)
|
||||
res.push_back((CK_ATTRIBUTE){*it, 0, 0});
|
||||
//! calls @c C_GetAttributeValue
|
||||
// return check(_session._slot._init->_fn->C_GetAttributeValue(_session, _object,
|
||||
// CK_ATTRIBUTE_PTR, CK_ULONG),
|
||||
// CRYPTOKI_FN_LOG("C_GetAttributeValue"));
|
||||
return res;
|
||||
CK_ATTRIBUTE* attrs(new CK_ATTRIBUTE[attributes.size()]);
|
||||
AttributeTypeList::const_iterator it(attributes.begin());
|
||||
for (AttributeTypeList::size_type i(0); it!=attributes.end(); ++it, ++i)
|
||||
attrs[i] = (CK_ATTRIBUTE){*it, 0, 0};
|
||||
try {
|
||||
//! calls @c C_GetAttributeValue
|
||||
if (check(_session._slot._init->_fn->C_GetAttributeValue
|
||||
(_session, _object, attrs, attributes.size()),
|
||||
CRYPTOKI_FN_LOG("C_GetAttributeValue"))) {
|
||||
for (AttributeTypeList::size_type i(0); i<attributes.size(); ++i)
|
||||
if (attrs[i].ulValueLen>0)
|
||||
attrs[i].pValue = malloc(attrs[i].ulValueLen);
|
||||
check(_session._slot._init->_fn->C_GetAttributeValue
|
||||
(_session, _object, attrs, attributes.size()),
|
||||
CRYPTOKI_FN_LOG("C_GetAttributeValue"));
|
||||
}
|
||||
for (AttributeTypeList::size_type i(0); i<attributes.size(); ++i)
|
||||
if (attrs[i].ulValueLen>0)
|
||||
res.insert(std::make_pair(attrs[i].type, Attribute(attrs[i])));
|
||||
return res;
|
||||
} catch (...) {
|
||||
for (AttributeTypeList::size_type i(0); i<attributes.size(); ++i)
|
||||
free(attrs[i].pValue);
|
||||
delete[] attrs;
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/*! @todo Not implemented:
|
||||
|
170
src/pcsc.hxx
170
src/pcsc.hxx
@@ -404,19 +404,8 @@ namespace pcsc {
|
||||
|
||||
//! Get the describing text of the last error
|
||||
std::string error() const {
|
||||
#ifdef WIN32
|
||||
std::stringstream ss;
|
||||
switch (_state) {
|
||||
case ERROR_BROKEN_PIPE:
|
||||
ss<<"The client attempted a smart card operation in a"
|
||||
<<" remote session, such as a client session running"
|
||||
<<" on a terminal server, and the operating system in"
|
||||
<<" use does not support smart card redirection.";
|
||||
break;
|
||||
case SCARD_E_BAD_SEEK:
|
||||
ss<<"There was an error trying to set the smart card file"
|
||||
<<" object pointer.";
|
||||
break;
|
||||
case SCARD_E_CANCELLED:
|
||||
ss<<"The action was canceled by an SCardCancel request.";
|
||||
break;
|
||||
@@ -428,27 +417,9 @@ namespace pcsc {
|
||||
ss<<"The smart card does not meet minimal requirements for"
|
||||
<<" support.";
|
||||
break;
|
||||
case SCARD_E_CERTIFICATE_UNAVAILABLE:
|
||||
ss<<"The requested certificate could not be obtained.";
|
||||
break;
|
||||
case SCARD_E_COMM_DATA_LOST:
|
||||
ss<<"A communications error with the smart card has been detected.";
|
||||
break;
|
||||
case SCARD_E_DIR_NOT_FOUND:
|
||||
ss<<"The specified directory does not exist in the smart card.";
|
||||
break;
|
||||
case SCARD_E_DUPLICATE_READER:
|
||||
ss<<"The reader driver did not produce a unique reader name.";
|
||||
break;
|
||||
case SCARD_E_FILE_NOT_FOUND:
|
||||
ss<<"The specified file does not exist in the smart card.";
|
||||
break;
|
||||
case SCARD_E_ICC_CREATEORDER:
|
||||
ss<<"The requested order of object creation is not supported.";
|
||||
break;
|
||||
case SCARD_E_ICC_INSTALLATION:
|
||||
ss<<"No primary provider can be found for the smart card.";
|
||||
break;
|
||||
case SCARD_E_INSUFFICIENT_BUFFER:
|
||||
ss<<"The data buffer for returned data is too small for the"
|
||||
<<" returned data.";
|
||||
@@ -457,9 +428,6 @@ namespace pcsc {
|
||||
ss<<"An ATR string obtained from the registry is not a valid"
|
||||
<<" ATR string.";
|
||||
break;
|
||||
case SCARD_E_INVALID_CHV:
|
||||
ss<<"The supplied PIN is incorrect.";
|
||||
break;
|
||||
case SCARD_E_INVALID_HANDLE:
|
||||
ss<<"The supplied handle was not valid.";
|
||||
break;
|
||||
@@ -480,18 +448,6 @@ namespace pcsc {
|
||||
case SCARD_E_NOT_TRANSACTED:
|
||||
ss<<"An attempt was made to end a nonexistent transaction.";
|
||||
break;
|
||||
case SCARD_E_NO_ACCESS:
|
||||
ss<<"Access is denied to this file.";
|
||||
break;
|
||||
case SCARD_E_NO_DIR:
|
||||
ss<<"The supplied path does not represent a smart card directory.";
|
||||
break;
|
||||
case SCARD_E_NO_FILE:
|
||||
ss<<"The supplied path does not represent a smart card file.";
|
||||
break;
|
||||
case SCARD_E_NO_KEY_CONTAINER:
|
||||
ss<<"The requested key container does not exist on the smart card.";
|
||||
break;
|
||||
case SCARD_E_NO_MEMORY:
|
||||
ss<<"Not enough memory available to complete this command.";
|
||||
break;
|
||||
@@ -505,9 +461,6 @@ namespace pcsc {
|
||||
ss<<"The operation requires a smart card, but no smart card"
|
||||
<<" is currently in the device.";
|
||||
break;
|
||||
case SCARD_E_NO_SUCH_CERTIFICATE:
|
||||
ss<<"The requested certificate does not exist.";
|
||||
break;
|
||||
case SCARD_E_PCI_TOO_SMALL:
|
||||
ss<<"The PCI receive buffer was too small.";
|
||||
break;
|
||||
@@ -522,10 +475,6 @@ namespace pcsc {
|
||||
ss<<"The reader driver does not meet minimal requirements for"
|
||||
<<" support.";
|
||||
break;
|
||||
case SCARD_E_SERVER_TOO_BUSY:
|
||||
ss<<"The Smart card resource manager is too busy to complete this"
|
||||
<<" operation.";
|
||||
break;
|
||||
case SCARD_E_SERVICE_STOPPED:
|
||||
ss<<"The smart card resource manager has shut down.";
|
||||
break;
|
||||
@@ -540,26 +489,15 @@ namespace pcsc {
|
||||
case SCARD_E_TIMEOUT:
|
||||
ss<<"The user-specified time-out value has expired.";
|
||||
break;
|
||||
case SCARD_E_UNEXPECTED:
|
||||
ss<<"An unexpected card error has occurred.";
|
||||
break;
|
||||
case SCARD_E_UNKNOWN_CARD:
|
||||
ss<<"The specified smart card name is not recognized.";
|
||||
break;
|
||||
case SCARD_E_UNKNOWN_READER:
|
||||
ss<<"The specified reader name is not recognized.";
|
||||
break;
|
||||
case SCARD_E_UNKNOWN_RES_MNG:
|
||||
ss<<"An unrecognized error code was returned from a layered"
|
||||
<<" component.";
|
||||
break;
|
||||
case SCARD_E_UNSUPPORTED_FEATURE:
|
||||
ss<<"This smart card does not support the requested feature.";
|
||||
break;
|
||||
case SCARD_E_WRITE_TOO_MANY:
|
||||
ss<<"The smartcard does not have enough memory to store the"
|
||||
<<" information.";
|
||||
break;
|
||||
case SCARD_F_COMM_ERROR:
|
||||
ss<<"An internal communications error has been detected.";
|
||||
break;
|
||||
@@ -573,13 +511,93 @@ namespace pcsc {
|
||||
case SCARD_F_WAITED_TOO_LONG:
|
||||
ss<<"An internal consistency timer has expired.";
|
||||
break;
|
||||
case SCARD_S_SUCCESS:
|
||||
ss<<"No error was encountered.";
|
||||
break;
|
||||
case SCARD_W_REMOVED_CARD:
|
||||
ss<<"The smart card has been removed, so that further communication"
|
||||
<<" is not possible.";
|
||||
break;
|
||||
case SCARD_W_RESET_CARD:
|
||||
ss<<"The smart card was reset.";
|
||||
break;
|
||||
case SCARD_W_UNPOWERED_CARD:
|
||||
ss<<"Power has been removed from the smart card, so that"
|
||||
<<" further communication is not possible.";
|
||||
break;
|
||||
case SCARD_W_UNRESPONSIVE_CARD:
|
||||
ss<<"The smart card is not responding to a reset.";
|
||||
break;
|
||||
case SCARD_W_UNSUPPORTED_CARD:
|
||||
ss<<"The reader cannot communicate with the smart card,"
|
||||
<<" due to ATR configuration conflicts.";
|
||||
break;
|
||||
#ifdef WIN32
|
||||
case ERROR_BROKEN_PIPE:
|
||||
ss<<"The client attempted a smart card operation in a"
|
||||
<<" remote session, such as a client session running"
|
||||
<<" on a terminal server, and the operating system in"
|
||||
<<" use does not support smart card redirection.";
|
||||
break;
|
||||
case SCARD_E_BAD_SEEK:
|
||||
ss<<"There was an error trying to set the smart card file"
|
||||
<<" object pointer.";
|
||||
break;
|
||||
case SCARD_E_CERTIFICATE_UNAVAILABLE:
|
||||
ss<<"The requested certificate could not be obtained.";
|
||||
break;
|
||||
case SCARD_E_COMM_DATA_LOST:
|
||||
ss<<"A communications error with the smart card has been detected.";
|
||||
break;
|
||||
case SCARD_E_DIR_NOT_FOUND:
|
||||
ss<<"The specified directory does not exist in the smart card.";
|
||||
break;
|
||||
case SCARD_E_FILE_NOT_FOUND:
|
||||
ss<<"The specified file does not exist in the smart card.";
|
||||
break;
|
||||
case SCARD_E_ICC_CREATEORDER:
|
||||
ss<<"The requested order of object creation is not supported.";
|
||||
break;
|
||||
case SCARD_E_ICC_INSTALLATION:
|
||||
ss<<"No primary provider can be found for the smart card.";
|
||||
break;
|
||||
case SCARD_E_INVALID_CHV:
|
||||
ss<<"The supplied PIN is incorrect.";
|
||||
break;
|
||||
case SCARD_E_NO_ACCESS:
|
||||
ss<<"Access is denied to this file.";
|
||||
break;
|
||||
case SCARD_E_NO_DIR:
|
||||
ss<<"The supplied path does not represent a smart card directory.";
|
||||
break;
|
||||
case SCARD_E_NO_FILE:
|
||||
ss<<"The supplied path does not represent a smart card file.";
|
||||
break;
|
||||
case SCARD_E_NO_KEY_CONTAINER:
|
||||
ss<<"The requested key container does not exist on the smart card.";
|
||||
break;
|
||||
case SCARD_E_NO_SUCH_CERTIFICATE:
|
||||
ss<<"The requested certificate does not exist.";
|
||||
break;
|
||||
case SCARD_E_SERVER_TOO_BUSY:
|
||||
ss<<"The Smart card resource manager is too busy to complete this"
|
||||
<<" operation.";
|
||||
break;
|
||||
case SCARD_E_UNEXPECTED:
|
||||
ss<<"An unexpected card error has occurred.";
|
||||
break;
|
||||
case SCARD_E_UNKNOWN_RES_MNG:
|
||||
ss<<"An unrecognized error code was returned from a layered"
|
||||
<<" component.";
|
||||
break;
|
||||
case SCARD_E_WRITE_TOO_MANY:
|
||||
ss<<"The smartcard does not have enough memory to store the"
|
||||
<<" information.";
|
||||
break;
|
||||
case SCARD_P_SHUTDOWN:
|
||||
ss<<"The operation has been aborted to allow the server application"
|
||||
<<" to exit.";
|
||||
break;
|
||||
case SCARD_S_SUCCESS:
|
||||
ss<<"No error was encountered.";
|
||||
break;
|
||||
case SCARD_W_CANCELLED_BY_USER:
|
||||
ss<<"The action was cancelled by the user.";
|
||||
break;
|
||||
@@ -593,31 +611,14 @@ namespace pcsc {
|
||||
case SCARD_W_EOF:
|
||||
ss<<"The end of the smart card file has been reached.";
|
||||
break;
|
||||
case SCARD_W_REMOVED_CARD:
|
||||
ss<<"The smart card has been removed, so that further communication"
|
||||
<<" is not possible.";
|
||||
break;
|
||||
case SCARD_W_RESET_CARD:
|
||||
ss<<"The smart card was reset.";
|
||||
break;
|
||||
case SCARD_W_SECURITY_VIOLATION:
|
||||
ss<<"Access was denied because of a security violation.";
|
||||
break;
|
||||
case SCARD_W_UNPOWERED_CARD:
|
||||
ss<<"Power has been removed from the smart card, so that"
|
||||
<<" further communication is not possible.";
|
||||
break;
|
||||
case SCARD_W_UNRESPONSIVE_CARD:
|
||||
ss<<"The smart card is not responding to a reset.";
|
||||
break;
|
||||
case SCARD_W_UNSUPPORTED_CARD:
|
||||
ss<<"The reader cannot communicate with the smart card,"
|
||||
<<" due to ATR configuration conflicts.";
|
||||
break;
|
||||
case SCARD_W_WRONG_CHV:
|
||||
ss<<"The card cannot be accessed because the wrong PIN was"
|
||||
<<" presented.";
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ss<<"unknown PCSC state=0x"
|
||||
<<std::hex<<std::setfill('0')<<std::setw(8)<<_state;
|
||||
@@ -636,9 +637,6 @@ namespace pcsc {
|
||||
<<(_state&0xffff);
|
||||
}
|
||||
return ss.str();
|
||||
#else
|
||||
return pcsc_stringify_error(_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
//................................................................methods
|
||||
|
Reference in New Issue
Block a user