pkcs7
This commit is contained in:
		| @@ -9,6 +9,7 @@ | ||||
| #define __OPENSSL_HXX__ | ||||
|  | ||||
| #include <openssl/pkcs12.h> | ||||
| #include <openssl/pkcs7.h> | ||||
| #include <openssl/x509.h> | ||||
| #include "openssl/bio.h" | ||||
| #include "openssl/des.h" | ||||
| @@ -72,6 +73,13 @@ namespace openssl { | ||||
|       } | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class pkcs7_error: public openssl_error { | ||||
|     public: | ||||
|       pkcs7_error(const std::string& reason) throw(): | ||||
|           openssl_error("pkcs7: "+reason) { | ||||
|       } | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class x509_error: public openssl_error { | ||||
|     public: | ||||
|       x509_error(const std::string& reason) throw(): | ||||
| @@ -180,6 +188,33 @@ namespace openssl { | ||||
|       pkcs12_no_x509() throw(): pkcs12_error("no x509 certificate") {} | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class pkcs7_reading_failed: public pkcs7_error { | ||||
|     public: | ||||
|       pkcs7_reading_failed(const std::string& file) throw(): | ||||
|           pkcs7_error("reading DER encoded p7 file failed: "+file) { | ||||
|       } | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class pkcs7_parsing_failed: public pkcs7_error { | ||||
|     public: | ||||
|       pkcs7_parsing_failed() throw(): | ||||
|           pkcs7_error("parsing DER encoded p7 failed") { | ||||
|       } | ||||
|       pkcs7_parsing_failed(const std::string& file) throw(): | ||||
|           pkcs7_error("parsing DER encoded p7 file failed: "+file) { | ||||
|       } | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class pkcs7_unsupported_format: public pkcs7_error { | ||||
|     public: | ||||
|       pkcs7_unsupported_format() throw(): pkcs7_error("format not supported") {} | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class pkcs7_no_x509: public pkcs7_error { | ||||
|     public: | ||||
|       pkcs7_no_x509() throw(): pkcs7_error("no x509 certificate") {} | ||||
|   }; | ||||
|   //---------------------------------------------------------------------------- | ||||
|   class cannot_open_file: public exception { | ||||
|     public: | ||||
|       cannot_open_file(const std::string& file) throw(): | ||||
| @@ -774,6 +809,67 @@ namespace openssl { | ||||
|       X509List _ca; | ||||
|   }; | ||||
|  | ||||
|   //============================================================================ | ||||
|   class PKCS7 { | ||||
|        | ||||
|       //...............................................................typedefs | ||||
|     public: | ||||
|       typedef std::vector<X509*> X509List; | ||||
|        | ||||
|       //................................................................methods | ||||
|     public: | ||||
|  | ||||
|       /* | ||||
|       //! Read from a PKCS#7 (.p7) file. | ||||
|       PKCS7(std::string filename) { | ||||
|         FILE* file(fopen(filename.c_str(), "rb")); | ||||
|         if (!file) throw cannot_open_file(filename); | ||||
|         ::PKCS7 *p7(d2i_PKCS7_fp(file, 0)); | ||||
|         fclose(file); | ||||
|         if (!p7) throw pkcs7_reading_failed(filename); | ||||
|         try { | ||||
|           if (PKCS7_type_is_signed(p7)) while (p7->d.sign->cert->num>0) | ||||
|             _certs.push_back(new X509((::X509*)sk_pop(p7->d.sign->cert))); | ||||
|           else //! @todo to be implemented: check for other types | ||||
|             throw pkcs7_unsupported_format(); | ||||
|           PKCS7_free(p7); | ||||
|         } catch (...) { | ||||
|           PKCS7_free(p7); | ||||
|           throw; | ||||
|         } | ||||
|           }*/ | ||||
|        | ||||
|       //! Read PKCS#7 from memory. | ||||
|       PKCS7(const std::string& memory) { | ||||
|         BIO* mem(BIO_new_mem_buf((void*)memory.data(), memory.size())); | ||||
|         ::PKCS7 *p7(d2i_PKCS7_bio(mem, 0)); | ||||
|         BIO_free(mem); | ||||
|         if (!p7) throw pkcs7_parsing_failed(); | ||||
|         try { | ||||
|           if (PKCS7_type_is_signed(p7)) while (p7->d.sign->cert->num>0) | ||||
|             _certs.push_back(new X509((::X509*)sk_pop(p7->d.sign->cert))); | ||||
|           else //! @todo to be implemented: check for other types | ||||
|             throw pkcs7_unsupported_format(); | ||||
|           PKCS7_free(p7); | ||||
|         } catch (...) { | ||||
|           PKCS7_free(p7); | ||||
|           throw; | ||||
|         } | ||||
|       } | ||||
|        | ||||
|       ~PKCS7() { | ||||
|         for (X509List::iterator it(_certs.begin()); it!=_certs.end(); ++it) | ||||
|           delete *it; | ||||
|       } | ||||
|  | ||||
|       const X509List& certs() const { | ||||
|         return _certs; | ||||
|       } | ||||
|        | ||||
|     private: | ||||
|       X509List _certs; | ||||
|   }; | ||||
|  | ||||
|   //============================================================================ | ||||
|   class BIO { | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user