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 { | ||||
| @@ -29,7 +31,14 @@ namespace cryptoki { | ||||
|     #endif | ||||
|     #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