Add PKCS12 support.
[platform/core/security/key-manager.git] / src / manager / common / protocols.cpp
1 /*
2  *  Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Bumjin Im <bj.im@samsung.com>
5  *
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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
17  *
18  * @file        protocols.cpp
19  * @author      Bartlomiej Grzelewski (b.grzelewski@samsung.com)
20  * @author      Zofia Abramowska (z.abramowska@samsung.com)
21  * @version     1.0
22  * @brief       List of all protocols supported by Central Key Manager.
23  */
24
25 #include <protocols.h>
26
27 #include <dpl/serialization.h>
28
29 namespace CKM {
30
31 char const * const SERVICE_SOCKET_ECHO = "/tmp/.central-key-manager-echo.sock";
32 char const * const SERVICE_SOCKET_CKM_CONTROL = "/tmp/.central-key-manager-api-control.sock";
33 char const * const SERVICE_SOCKET_CKM_STORAGE = "/tmp/.central-key-manager-api-storage.sock";
34 char const * const SERVICE_SOCKET_OCSP = "/tmp/.central-key-manager-api-ocsp.sock";
35 char const * const LABEL_NAME_SEPARATOR = " ";
36
37 namespace {
38 const char* const DB_PERM_READ        = "R";
39 const char* const DB_PERM_READ_REMOVE = "RD";
40 }
41
42 const char* toDBPermission(Permission access_right_type) {
43     switch(access_right_type) {
44     case Permission::READ:          return DB_PERM_READ;
45     case Permission::READ_REMOVE:   return DB_PERM_READ_REMOVE;
46     default:
47         // TODO
48         throw 1;
49     }
50 }
51
52 Permission toPermission(const std::string &input_DB_data) {
53     if(input_DB_data == DB_PERM_READ_REMOVE)
54         return Permission::READ_REMOVE;
55     else if(input_DB_data == DB_PERM_READ)
56         return Permission::READ;
57     else
58         return Permission::NONE;
59 }
60
61
62 PKCS12Serializable::PKCS12Serializable() {}
63 PKCS12Serializable::PKCS12Serializable(const PKCS12 &pkcs)
64     : PKCS12Impl(pkcs)
65 {}
66
67 PKCS12Serializable::PKCS12Serializable(IStream &stream)
68 {
69     // key
70     size_t numKeys;
71     Deserialization::Deserialize(stream, numKeys);
72     if(numKeys > 0) {
73         int keyType;
74         RawBuffer keyData;
75         Deserialization::Deserialize(stream, keyType);
76         Deserialization::Deserialize(stream, keyData);
77         m_pkey = CKM::Key::create(keyData);
78     }
79
80     // cert
81     size_t numCerts;
82     Deserialization::Deserialize(stream, numCerts);
83     if(numCerts > 0) {
84         RawBuffer certData;
85         Deserialization::Deserialize(stream, certData);
86         m_cert = CKM::Certificate::create(certData, DataFormat::FORM_DER);
87     }
88
89     // CA chain
90     size_t num_CA;
91     Deserialization::Deserialize(stream, num_CA);
92     for(size_t i=0; i<num_CA; i++)
93     {
94         RawBuffer CAcertData;
95         Deserialization::Deserialize(stream, CAcertData);
96         m_ca.push_back(CKM::Certificate::create(CAcertData, DataFormat::FORM_DER));
97     }
98 }
99 PKCS12Serializable::PKCS12Serializable(const KeyShPtr &privKey, const CertificateShPtr &cert, const CertificateShPtrVector &chainCerts)
100 {
101     m_pkey = privKey;
102     m_cert = cert;
103     m_ca = chainCerts;
104 }
105
106 void PKCS12Serializable::Serialize(IStream &stream) const
107 {
108     // key
109     Key *keyPtr = getKey().get();
110     bool isAnyKeyPresent = (getKey().get()!=NULL);
111
112     // logics if PKCS is correct or not is on the service side.
113     // sending number of keys and certificates to allow proper parsing on the service side.
114     // (what if no key or cert present? attempt to deserialize a not present key/cert would
115     // throw an error and close the connection).
116     Serialization::Serialize(stream, static_cast<size_t>(isAnyKeyPresent?1:0));
117     if(keyPtr) {
118         Serialization::Serialize(stream, DBDataType(keyPtr->getType()));
119         Serialization::Serialize(stream, keyPtr->getDER());
120     }
121
122     bool isAnyCertPresent = (getCertificate().get()!=NULL);
123     Serialization::Serialize(stream, static_cast<size_t>(isAnyCertPresent?1:0));
124     if(isAnyCertPresent) {
125         Serialization::Serialize(stream, getCertificate().get()->getDER());
126     }
127
128     // CA chain
129     Serialization::Serialize(stream, getCaCertificateShPtrVector().size());
130     for(auto it : getCaCertificateShPtrVector())
131         Serialization::Serialize(stream, it->getDER());
132 };
133
134 } // namespace CKM
135