2 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Bumjin Im <bj.im@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
19 * @author Bartlomiej Grzelewski (b.grzelewski@samsung.com)
20 * @author Zofia Abramowska (z.abramowska@samsung.com)
22 * @brief List of all protocols supported by Central Key Manager.
25 #include <protocols.h>
27 #include <dpl/serialization.h>
28 #include <ckm/ckm-type.h>
32 char const * const SERVICE_SOCKET_ECHO = "/tmp/.central-key-manager-echo.sock";
33 char const * const SERVICE_SOCKET_CKM_CONTROL = "/tmp/.central-key-manager-api-control.sock";
34 char const * const SERVICE_SOCKET_CKM_STORAGE = "/tmp/.central-key-manager-api-storage.sock";
35 char const * const SERVICE_SOCKET_OCSP = "/tmp/.central-key-manager-api-ocsp.sock";
36 char const * const LABEL_NAME_SEPARATOR = " ";
39 PKCS12Serializable::PKCS12Serializable() {}
40 PKCS12Serializable::PKCS12Serializable(const PKCS12 &pkcs)
44 PKCS12Serializable::PKCS12Serializable(IStream &stream)
48 Deserialization::Deserialize(stream, numKeys);
52 Deserialization::Deserialize(stream, keyType);
53 Deserialization::Deserialize(stream, keyData);
54 m_pkey = CKM::Key::create(keyData);
59 Deserialization::Deserialize(stream, numCerts);
62 Deserialization::Deserialize(stream, certData);
63 m_cert = CKM::Certificate::create(certData, DataFormat::FORM_DER);
68 Deserialization::Deserialize(stream, num_CA);
69 for(size_t i=0; i<num_CA; i++)
72 Deserialization::Deserialize(stream, CAcertData);
73 m_ca.push_back(CKM::Certificate::create(CAcertData, DataFormat::FORM_DER));
76 PKCS12Serializable::PKCS12Serializable(const KeyShPtr &privKey, const CertificateShPtr &cert, const CertificateShPtrVector &chainCerts)
83 void PKCS12Serializable::Serialize(IStream &stream) const
86 Key *keyPtr = getKey().get();
87 bool isAnyKeyPresent = (getKey().get()!=NULL);
89 // logics if PKCS is correct or not is on the service side.
90 // sending number of keys and certificates to allow proper parsing on the service side.
91 // (what if no key or cert present? attempt to deserialize a not present key/cert would
92 // throw an error and close the connection).
93 Serialization::Serialize(stream, static_cast<size_t>(isAnyKeyPresent?1:0));
95 Serialization::Serialize(stream, DataType(keyPtr->getType()));
96 Serialization::Serialize(stream, keyPtr->getDER());
99 bool isAnyCertPresent = (getCertificate().get()!=NULL);
100 Serialization::Serialize(stream, static_cast<size_t>(isAnyCertPresent?1:0));
101 if(isAnyCertPresent) {
102 Serialization::Serialize(stream, getCertificate().get()->getDER());
106 Serialization::Serialize(stream, getCaCertificateShPtrVector().size());
107 for(auto it : getCaCertificateShPtrVector())
108 Serialization::Serialize(stream, it->getDER());
112 CryptoAlgorithmSerializable::CryptoAlgorithmSerializable() {}
113 CryptoAlgorithmSerializable::CryptoAlgorithmSerializable(CryptoAlgorithm &&algo) :
114 CryptoAlgorithm(std::move(algo))
118 CryptoAlgorithmSerializable::CryptoAlgorithmSerializable(IStream &stream)
122 Deserializer<int,size_t>::Deserialize(stream, type, plen);
123 m_type = static_cast<AlgoType>(type);
129 Deserializer<int>::Deserialize(stream, tmpName);
130 name = static_cast<ParamName>(tmpName);
132 case ParamName::ED_IV:
133 case ParamName::ED_CTR:
134 case ParamName::ED_AAD:
135 case ParamName::ED_LABEL:
136 Deserializer<RawBuffer>::Deserialize(stream, buffer);
137 m_params.emplace(name, BufferParam::create(buffer));
140 case ParamName::ED_CTR_LEN:
141 case ParamName::ED_TAG_LEN:
142 case ParamName::GEN_KEY_LEN:
143 case ParamName::GEN_EC:
144 case ParamName::SV_HASH_ALGO:
145 case ParamName::SV_RSA_PADDING:
146 Deserializer<uint64_t>::Deserialize(stream, integer);
147 m_params.emplace(name, IntParam::create(integer));
151 ThrowMsg(UnsupportedParam, "Unsupported param name");
157 void CryptoAlgorithmSerializable::Serialize(IStream &stream) const
159 Serializer<int,size_t>::Serialize(stream, static_cast<int>(m_type), m_params.size());
160 for(const auto& it : m_params) {
161 Serializer<int>::Serialize(stream, static_cast<int>(it.first));
164 if (CKM_API_SUCCESS == it.second->getInt(integer))
165 Serializer<uint64_t>::Serialize(stream, integer);
166 else if (CKM_API_SUCCESS == it.second->getBuffer(buffer))
167 Serializer<RawBuffer>::Serialize(stream, buffer);
169 ThrowMsg(UnsupportedParam, "Unsupported param type");