better error messages
This commit is contained in:
@@ -2,20 +2,16 @@
|
|||||||
#include <cryptoki.hxx>
|
#include <cryptoki.hxx>
|
||||||
#include <iostream>
|
#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) {
|
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;
|
std::cout<<"Item: "<<*it<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char const*const*const argv) try {
|
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(toVector<4>((int[]){1,2,3,4}));
|
||||||
std::vector<int> v(VECTOR(((int[]){1,2,3,4})));
|
// std::vector<int> v(VECTOR(((int[]){1,2,3,4})));
|
||||||
print(v);
|
// print(v);
|
||||||
cryptoki::Init init(argc==2?argv[1]:"onepin-opensc-pkcs11.so");
|
cryptoki::Init init(argc==2?argv[1]:"onepin-opensc-pkcs11.so");
|
||||||
cryptoki::Info inf(init.info());
|
cryptoki::Info inf(init.info());
|
||||||
std::cout<<"##################### INFO #####################"<<std::endl
|
std::cout<<"##################### INFO #####################"<<std::endl
|
||||||
|
@@ -11,10 +11,12 @@
|
|||||||
#include <opencryptoki/apiclient.h>
|
#include <opencryptoki/apiclient.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
// for inline implementations only
|
// for inline implementations only
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <cstdlib> // malloc/free
|
||||||
|
|
||||||
//! C++ Wrapper around Cryptoki API
|
//! C++ Wrapper around Cryptoki API
|
||||||
namespace cryptoki {
|
namespace cryptoki {
|
||||||
@@ -30,6 +32,13 @@ namespace cryptoki {
|
|||||||
#define UNDEF_CRYPTOKI_FN_LOG
|
#define UNDEF_CRYPTOKI_FN_LOG
|
||||||
#endif
|
#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 {
|
class exception: public std::exception {
|
||||||
public:
|
public:
|
||||||
@@ -64,7 +73,17 @@ namespace cryptoki {
|
|||||||
typedef std::set<CK_MECHANISM_TYPE> MechanismList;
|
typedef std::set<CK_MECHANISM_TYPE> MechanismList;
|
||||||
|
|
||||||
typedef std::vector<CK_ATTRIBUTE_TYPE> AttributeTypeList;
|
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
|
// //! Map Attribute Class to type
|
||||||
// /*! @todo to be completed ... */
|
// /*! @todo to be completed ... */
|
||||||
@@ -1216,14 +1235,32 @@ namespace cryptoki {
|
|||||||
|
|
||||||
AttributeList getattributevalue(const AttributeTypeList& attributes) {
|
AttributeList getattributevalue(const AttributeTypeList& attributes) {
|
||||||
AttributeList res;
|
AttributeList res;
|
||||||
for (AttributeTypeList::const_iterator it(attributes.begin());
|
CK_ATTRIBUTE* attrs(new CK_ATTRIBUTE[attributes.size()]);
|
||||||
it!=attributes.end(); ++it)
|
AttributeTypeList::const_iterator it(attributes.begin());
|
||||||
res.push_back((CK_ATTRIBUTE){*it, 0, 0});
|
for (AttributeTypeList::size_type i(0); it!=attributes.end(); ++it, ++i)
|
||||||
//! calls @c C_GetAttributeValue
|
attrs[i] = (CK_ATTRIBUTE){*it, 0, 0};
|
||||||
// return check(_session._slot._init->_fn->C_GetAttributeValue(_session, _object,
|
try {
|
||||||
// CK_ATTRIBUTE_PTR, CK_ULONG),
|
//! calls @c C_GetAttributeValue
|
||||||
// CRYPTOKI_FN_LOG("C_GetAttributeValue"));
|
if (check(_session._slot._init->_fn->C_GetAttributeValue
|
||||||
return res;
|
(_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:
|
/*! @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
|
//! Get the describing text of the last error
|
||||||
std::string error() const {
|
std::string error() const {
|
||||||
#ifdef WIN32
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
switch (_state) {
|
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:
|
case SCARD_E_CANCELLED:
|
||||||
ss<<"The action was canceled by an SCardCancel request.";
|
ss<<"The action was canceled by an SCardCancel request.";
|
||||||
break;
|
break;
|
||||||
@@ -428,27 +417,9 @@ namespace pcsc {
|
|||||||
ss<<"The smart card does not meet minimal requirements for"
|
ss<<"The smart card does not meet minimal requirements for"
|
||||||
<<" support.";
|
<<" support.";
|
||||||
break;
|
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:
|
case SCARD_E_DUPLICATE_READER:
|
||||||
ss<<"The reader driver did not produce a unique reader name.";
|
ss<<"The reader driver did not produce a unique reader name.";
|
||||||
break;
|
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:
|
case SCARD_E_INSUFFICIENT_BUFFER:
|
||||||
ss<<"The data buffer for returned data is too small for the"
|
ss<<"The data buffer for returned data is too small for the"
|
||||||
<<" returned data.";
|
<<" returned data.";
|
||||||
@@ -457,9 +428,6 @@ namespace pcsc {
|
|||||||
ss<<"An ATR string obtained from the registry is not a valid"
|
ss<<"An ATR string obtained from the registry is not a valid"
|
||||||
<<" ATR string.";
|
<<" ATR string.";
|
||||||
break;
|
break;
|
||||||
case SCARD_E_INVALID_CHV:
|
|
||||||
ss<<"The supplied PIN is incorrect.";
|
|
||||||
break;
|
|
||||||
case SCARD_E_INVALID_HANDLE:
|
case SCARD_E_INVALID_HANDLE:
|
||||||
ss<<"The supplied handle was not valid.";
|
ss<<"The supplied handle was not valid.";
|
||||||
break;
|
break;
|
||||||
@@ -480,18 +448,6 @@ namespace pcsc {
|
|||||||
case SCARD_E_NOT_TRANSACTED:
|
case SCARD_E_NOT_TRANSACTED:
|
||||||
ss<<"An attempt was made to end a nonexistent transaction.";
|
ss<<"An attempt was made to end a nonexistent transaction.";
|
||||||
break;
|
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:
|
case SCARD_E_NO_MEMORY:
|
||||||
ss<<"Not enough memory available to complete this command.";
|
ss<<"Not enough memory available to complete this command.";
|
||||||
break;
|
break;
|
||||||
@@ -505,9 +461,6 @@ namespace pcsc {
|
|||||||
ss<<"The operation requires a smart card, but no smart card"
|
ss<<"The operation requires a smart card, but no smart card"
|
||||||
<<" is currently in the device.";
|
<<" is currently in the device.";
|
||||||
break;
|
break;
|
||||||
case SCARD_E_NO_SUCH_CERTIFICATE:
|
|
||||||
ss<<"The requested certificate does not exist.";
|
|
||||||
break;
|
|
||||||
case SCARD_E_PCI_TOO_SMALL:
|
case SCARD_E_PCI_TOO_SMALL:
|
||||||
ss<<"The PCI receive buffer was too small.";
|
ss<<"The PCI receive buffer was too small.";
|
||||||
break;
|
break;
|
||||||
@@ -522,10 +475,6 @@ namespace pcsc {
|
|||||||
ss<<"The reader driver does not meet minimal requirements for"
|
ss<<"The reader driver does not meet minimal requirements for"
|
||||||
<<" support.";
|
<<" support.";
|
||||||
break;
|
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:
|
case SCARD_E_SERVICE_STOPPED:
|
||||||
ss<<"The smart card resource manager has shut down.";
|
ss<<"The smart card resource manager has shut down.";
|
||||||
break;
|
break;
|
||||||
@@ -540,26 +489,15 @@ namespace pcsc {
|
|||||||
case SCARD_E_TIMEOUT:
|
case SCARD_E_TIMEOUT:
|
||||||
ss<<"The user-specified time-out value has expired.";
|
ss<<"The user-specified time-out value has expired.";
|
||||||
break;
|
break;
|
||||||
case SCARD_E_UNEXPECTED:
|
|
||||||
ss<<"An unexpected card error has occurred.";
|
|
||||||
break;
|
|
||||||
case SCARD_E_UNKNOWN_CARD:
|
case SCARD_E_UNKNOWN_CARD:
|
||||||
ss<<"The specified smart card name is not recognized.";
|
ss<<"The specified smart card name is not recognized.";
|
||||||
break;
|
break;
|
||||||
case SCARD_E_UNKNOWN_READER:
|
case SCARD_E_UNKNOWN_READER:
|
||||||
ss<<"The specified reader name is not recognized.";
|
ss<<"The specified reader name is not recognized.";
|
||||||
break;
|
break;
|
||||||
case SCARD_E_UNKNOWN_RES_MNG:
|
|
||||||
ss<<"An unrecognized error code was returned from a layered"
|
|
||||||
<<" component.";
|
|
||||||
break;
|
|
||||||
case SCARD_E_UNSUPPORTED_FEATURE:
|
case SCARD_E_UNSUPPORTED_FEATURE:
|
||||||
ss<<"This smart card does not support the requested feature.";
|
ss<<"This smart card does not support the requested feature.";
|
||||||
break;
|
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:
|
case SCARD_F_COMM_ERROR:
|
||||||
ss<<"An internal communications error has been detected.";
|
ss<<"An internal communications error has been detected.";
|
||||||
break;
|
break;
|
||||||
@@ -573,13 +511,93 @@ namespace pcsc {
|
|||||||
case SCARD_F_WAITED_TOO_LONG:
|
case SCARD_F_WAITED_TOO_LONG:
|
||||||
ss<<"An internal consistency timer has expired.";
|
ss<<"An internal consistency timer has expired.";
|
||||||
break;
|
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:
|
case SCARD_P_SHUTDOWN:
|
||||||
ss<<"The operation has been aborted to allow the server application"
|
ss<<"The operation has been aborted to allow the server application"
|
||||||
<<" to exit.";
|
<<" to exit.";
|
||||||
break;
|
break;
|
||||||
case SCARD_S_SUCCESS:
|
|
||||||
ss<<"No error was encountered.";
|
|
||||||
break;
|
|
||||||
case SCARD_W_CANCELLED_BY_USER:
|
case SCARD_W_CANCELLED_BY_USER:
|
||||||
ss<<"The action was cancelled by the user.";
|
ss<<"The action was cancelled by the user.";
|
||||||
break;
|
break;
|
||||||
@@ -593,31 +611,14 @@ namespace pcsc {
|
|||||||
case SCARD_W_EOF:
|
case SCARD_W_EOF:
|
||||||
ss<<"The end of the smart card file has been reached.";
|
ss<<"The end of the smart card file has been reached.";
|
||||||
break;
|
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:
|
case SCARD_W_SECURITY_VIOLATION:
|
||||||
ss<<"Access was denied because of a security violation.";
|
ss<<"Access was denied because of a security violation.";
|
||||||
break;
|
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:
|
case SCARD_W_WRONG_CHV:
|
||||||
ss<<"The card cannot be accessed because the wrong PIN was"
|
ss<<"The card cannot be accessed because the wrong PIN was"
|
||||||
<<" presented.";
|
<<" presented.";
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
ss<<"unknown PCSC state=0x"
|
ss<<"unknown PCSC state=0x"
|
||||||
<<std::hex<<std::setfill('0')<<std::setw(8)<<_state;
|
<<std::hex<<std::setfill('0')<<std::setw(8)<<_state;
|
||||||
@@ -636,9 +637,6 @@ namespace pcsc {
|
|||||||
<<(_state&0xffff);
|
<<(_state&0xffff);
|
||||||
}
|
}
|
||||||
return ss.str();
|
return ss.str();
|
||||||
#else
|
|
||||||
return pcsc_stringify_error(_state);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//................................................................methods
|
//................................................................methods
|
||||||
|
Reference in New Issue
Block a user