diff options
Diffstat (limited to 'src/manager/common/protocols.cpp')
-rw-r--r-- | src/manager/common/protocols.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/manager/common/protocols.cpp b/src/manager/common/protocols.cpp index 67cb36c7..6e800111 100644 --- a/src/manager/common/protocols.cpp +++ b/src/manager/common/protocols.cpp @@ -58,5 +58,78 @@ Permission toPermission(const std::string &input_DB_data) { return Permission::NONE; } + +PKCS12Serializable::PKCS12Serializable() {} +PKCS12Serializable::PKCS12Serializable(const PKCS12 &pkcs) + : PKCS12Impl(pkcs) +{} + +PKCS12Serializable::PKCS12Serializable(IStream &stream) +{ + // key + size_t numKeys; + Deserialization::Deserialize(stream, numKeys); + if(numKeys > 0) { + int keyType; + RawBuffer keyData; + Deserialization::Deserialize(stream, keyType); + Deserialization::Deserialize(stream, keyData); + m_pkey = CKM::Key::create(keyData); + } + + // cert + size_t numCerts; + Deserialization::Deserialize(stream, numCerts); + if(numCerts > 0) { + RawBuffer certData; + Deserialization::Deserialize(stream, certData); + m_cert = CKM::Certificate::create(certData, DataFormat::FORM_DER); + } + + // CA chain + size_t num_CA; + Deserialization::Deserialize(stream, num_CA); + for(size_t i=0; i<num_CA; i++) + { + RawBuffer CAcertData; + Deserialization::Deserialize(stream, CAcertData); + m_ca.push_back(CKM::Certificate::create(CAcertData, DataFormat::FORM_DER)); + } +} +PKCS12Serializable::PKCS12Serializable(const KeyShPtr &privKey, const CertificateShPtr &cert, const CertificateShPtrVector &chainCerts) +{ + m_pkey = privKey; + m_cert = cert; + m_ca = chainCerts; +} + +void PKCS12Serializable::Serialize(IStream &stream) const +{ + // key + Key *keyPtr = getKey().get(); + bool isAnyKeyPresent = (getKey().get()!=NULL); + + // logics if PKCS is correct or not is on the service side. + // sending number of keys and certificates to allow proper parsing on the service side. + // (what if no key or cert present? attempt to deserialize a not present key/cert would + // throw an error and close the connection). + Serialization::Serialize(stream, static_cast<size_t>(isAnyKeyPresent?1:0)); + if(keyPtr) { + Serialization::Serialize(stream, DBDataType(keyPtr->getType())); + Serialization::Serialize(stream, keyPtr->getDER()); + } + + bool isAnyCertPresent = (getCertificate().get()!=NULL); + Serialization::Serialize(stream, static_cast<size_t>(isAnyCertPresent?1:0)); + if(isAnyCertPresent) { + Serialization::Serialize(stream, getCertificate().get()->getDER()); + } + + // CA chain + Serialization::Serialize(stream, getCaCertificateShPtrVector().size()); + for(auto it : getCaCertificateShPtrVector()) + Serialization::Serialize(stream, it->getDER()); +}; + } // namespace CKM |