diff options
author | Bartlomiej Grzelewski <b.grzelewski@samsung.com> | 2014-07-17 14:27:47 +0200 |
---|---|---|
committer | Bartlomiej Grzelewski <b.grzelewski@samsung.com> | 2014-09-12 14:59:06 +0200 |
commit | 57c81d6e3ba59a4efbce2cf048236c8bf772f6bf (patch) | |
tree | f13d3ba7484c305e2e59d065157a0feff354d0b2 /src/manager/common/certificate-impl.cpp | |
parent | cdd6801a81959754bc06546462b50aac2fe7cdc7 (diff) | |
download | key-manager-57c81d6e3ba59a4efbce2cf048236c8bf772f6bf.tar.gz key-manager-57c81d6e3ba59a4efbce2cf048236c8bf772f6bf.tar.bz2 key-manager-57c81d6e3ba59a4efbce2cf048236c8bf772f6bf.zip |
Change RawBuffer into SafeBuffer.
Change-Id: Iccf37f75713c7b573dcd6858fed3b9e530c2c936
Diffstat (limited to 'src/manager/common/certificate-impl.cpp')
-rw-r--r-- | src/manager/common/certificate-impl.cpp | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/manager/common/certificate-impl.cpp b/src/manager/common/certificate-impl.cpp index 10d818ab..ef20d4f5 100644 --- a/src/manager/common/certificate-impl.cpp +++ b/src/manager/common/certificate-impl.cpp @@ -24,6 +24,7 @@ #include <dpl/log/log.h> +#include <buffer-conversion.h> #include <generic-key.h> #include <certificate-impl.h> #include <base64.h> @@ -35,7 +36,47 @@ CertificateImpl::CertificateImpl(const RawBuffer &der, DataFormat format) { int size; const unsigned char *ptr; - RawBuffer tmp; + SafeBuffer tmp; + + LogDebug("Certificate to parse. Size: " << der.size()); + + if (DataFormat::FORM_DER_BASE64 == format) { + Base64Decoder base64; + base64.reset(); + base64.append(toSafeBuffer(der)); + base64.finalize(); + tmp = base64.get(); + ptr = reinterpret_cast<const unsigned char*>(tmp.data()); + size = static_cast<int>(tmp.size()); + m_x509 = d2i_X509(NULL, &ptr, size); + } else if (DataFormat::FORM_DER == format) { + ptr = reinterpret_cast<const unsigned char*>(der.data()); + size = static_cast<int>(der.size()); + m_x509 = d2i_X509(NULL, &ptr, size); + } else if (DataFormat::FORM_PEM == format) { + BIO *buff = BIO_new(BIO_s_mem()); + BIO_write(buff, der.data(), der.size()); + m_x509 = PEM_read_bio_X509(buff, NULL, NULL, NULL); + BIO_free_all(buff); + } else { + // TODO + LogError("Unknown certificate format"); + } + + if (!m_x509) { + // TODO + LogError("Certificate could not be parsed."); +// ThrowMsg(Exception::OpensslInternalError, +// "Internal Openssl error in d2i_X509 function."); + } +} + +CertificateImpl::CertificateImpl(const SafeBuffer &der, DataFormat format) + : m_x509(NULL) +{ + int size; + const unsigned char *ptr; + SafeBuffer tmp; LogDebug("Certificate to parse. Size: " << der.size()); @@ -121,6 +162,21 @@ RawBuffer CertificateImpl::getDER(void) const { return output; } +SafeBuffer CertificateImpl::getDERSB(void) const { + unsigned char *rawDer = NULL; + int size = i2d_X509(m_x509, &rawDer); + if (!rawDer || size <= 0) { + LogError("i2d_X509 failed"); + return SafeBuffer(); + } + + SafeBuffer output( + reinterpret_cast<char*>(rawDer), + reinterpret_cast<char*>(rawDer) + size); + OPENSSL_free(rawDer); + return output; +} + bool CertificateImpl::empty() const { return m_x509 == NULL; } |