|
|
|
@ -144,13 +144,14 @@ namespace openssl { |
|
|
|
|
X509(): _x509(X509_new()) { |
|
|
|
|
if (!_x509) throw allocation_failed(); |
|
|
|
|
} |
|
|
|
|
X509(const X509& o) _x509(0) { |
|
|
|
|
char* d(0); |
|
|
|
|
X509(const X509& o): _x509(0) { |
|
|
|
|
unsigned char* d(0); |
|
|
|
|
int len(i2d_X509(o._x509, &d)); |
|
|
|
|
if (!len) throw x509_copy_failed(); |
|
|
|
|
char* d1(d); |
|
|
|
|
const unsigned char* d2(d); |
|
|
|
|
_x509 = d2i_X509(0, &d2, len); |
|
|
|
|
if (d2!=d+len || !_x509) throw x509_copy_failed(); |
|
|
|
|
free(d); |
|
|
|
|
if (!_x509) throw x509_copy_failed(); |
|
|
|
|
} |
|
|
|
|
//! Take over OpenSSL allocated certificate.
|
|
|
|
|
X509(::X509 *x509): _x509(x509) { |
|
|
|
@ -162,12 +163,13 @@ namespace openssl { |
|
|
|
|
X509& operator=(const X509& o) { |
|
|
|
|
X509_free(_x509); |
|
|
|
|
_x509 = 0; |
|
|
|
|
char* d(0); |
|
|
|
|
unsigned char* d(0); |
|
|
|
|
int len(i2d_X509(o._x509, &d)); |
|
|
|
|
if (!len) throw x509_copy_failed(); |
|
|
|
|
char* d1(d); |
|
|
|
|
const unsigned char* d2(d); |
|
|
|
|
free(d); |
|
|
|
|
_x509 = d2i_X509(0, &d2, len); |
|
|
|
|
if (d2!=d+len || !_x509) throw x509_copy_failed(); |
|
|
|
|
if (!_x509) throw x509_copy_failed(); |
|
|
|
|
} |
|
|
|
|
private: |
|
|
|
|
::X509* _x509; |
|
|
|
@ -255,21 +257,22 @@ namespace openssl { |
|
|
|
|
BIO() {} |
|
|
|
|
~BIO() { |
|
|
|
|
try { |
|
|
|
|
close() |
|
|
|
|
close(); |
|
|
|
|
} catch (...) { |
|
|
|
|
if (!std::uncaught_exception()) throw; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
void connect(const std::string& hostPort) { |
|
|
|
|
close(); |
|
|
|
|
if (_bio = BIO_new_connect(hostPort.c_str())) |
|
|
|
|
if (_bio = BIO_new_connect(const_cast<char*>(hostPort.c_str()))) |
|
|
|
|
throw bio_connection_failed(hostPort); |
|
|
|
|
// ...
|
|
|
|
|
} |
|
|
|
|
void close() { |
|
|
|
|
//! @todo tbd
|
|
|
|
|
} |
|
|
|
|
private: |
|
|
|
|
BIO* _bio; |
|
|
|
|
::BIO* _bio; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|