Fix the Prevent problems
[platform/core/connectivity/smartcard-service.git] / common / AccessCondition.cpp
1 /*
2  * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /* standard library header */
18 #include <stdio.h>
19
20 /* SLP library header */
21
22 /* local header */
23 #include "Debug.h"
24 #include "SimpleTLV.h"
25 #include "AccessControlList.h"
26 #include "AccessCondition.h"
27
28 namespace smartcard_service_api
29 {
30         void AccessRule::addAPDUAccessRule(const ByteArray &apdu,
31                 const ByteArray &mask)
32         {
33                 pair<ByteArray, ByteArray> item(apdu, mask);
34
35                 listFilters.push_back(item);
36         }
37
38         bool AccessRule::isAuthorizedAPDUAccess(const ByteArray &command) const
39         {
40                 bool result = false;
41
42                 if (command.size() < 4) /* apdu header size */
43                         return false;
44
45                 if (listFilters.size() > 0)
46                 {
47                         unsigned int cmd, mask, rule;
48                         vector<pair<ByteArray, ByteArray> >::const_iterator item;
49
50                         cmd = *(unsigned int *)command.getBuffer();
51                         for (item = listFilters.begin(); item != listFilters.end(); item++)
52                         {
53                                 mask = *(unsigned int *)item->second.getBuffer();
54                                 rule = *(unsigned int *)item->first.getBuffer();
55
56                                 if ((cmd & mask) == rule)
57                                 {
58                                         result = true;
59                                         break;
60                                 }
61                         }
62                 }
63                 else
64                 {
65                         /* no filter entry. if permission is true, all access will be granted, if not, all access will be denied */
66                         result = apduRule;
67                 }
68
69                 return result;
70         }
71
72         void AccessRule::printAccessRules() const
73         {
74                 if (listFilters.size() > 0)
75                 {
76                         vector<pair<ByteArray, ByteArray> >::const_iterator item;
77
78                         _DBG("         +---- Granted APDUs");
79
80                         for (item = listFilters.begin(); item != listFilters.end(); item++)
81                         {
82                                 _DBG("         +----- APDU : %s, Mask : %s", item->first.toString().c_str(), item->second.toString().c_str());
83                         }
84                 }
85                 else
86                 {
87                         _DBG("         +---- APDU Access ALLOW : %s", apduRule ? "ALWAYS" : "NEVER");
88                 }
89
90                 _DBG("         +---- NFC  Access ALLOW : %s", nfcRule ? "ALWAYS" : "NEVER");
91         }
92
93         bool AccessRule::isAuthorizedNFCAccess(void) const
94         {
95                 return nfcRule;
96         }
97
98         AccessRule *AccessCondition::getAccessRule(const ByteArray &certHash)
99         {
100                 AccessRule *result = NULL;
101                 map<ByteArray, AccessRule>::iterator item;
102
103                 item = mapRules.find(certHash);
104                 if (item != mapRules.end()) {
105                         result = &item->second;
106                 }
107
108                 return result;
109         }
110
111         const AccessRule *AccessCondition::getAccessRule(const ByteArray &certHash) const
112         {
113                 const AccessRule *result = NULL;
114                 map<ByteArray, AccessRule>::const_iterator item;
115
116                 item = mapRules.find(certHash);
117                 if (item != mapRules.end()) {
118                         result = &item->second;
119                 }
120
121                 return result;
122         }
123
124         void AccessCondition::addAccessRule(const ByteArray &hash)
125         {
126                 AccessRule rule;
127
128                 pair<ByteArray, AccessRule> item(hash, rule);
129
130                 mapRules.insert(item);
131         }
132
133         bool AccessCondition::isAuthorizedAccess(const ByteArray &certHash) const
134         {
135                 bool result = permission;
136                 const AccessRule *rule = getAccessRule(certHash);
137
138                 if (rule != NULL) {
139                         result = true;
140                 }
141
142                 return result;
143         }
144
145         void AccessCondition::printAccessConditions() const
146         {
147                 _DBG("   +-- Access Condition");
148
149                 if (mapRules.size() > 0)
150                 {
151                         map<ByteArray, AccessRule>::const_iterator item;
152
153                         for (item = mapRules.begin(); item != mapRules.end(); item++)
154                         {
155                                 ByteArray temp = item->first;
156
157                                 _DBG("   +--- hash : %s", (temp == AccessControlList::ALL_DEVICE_APPS) ? "All device applications" : temp.toString().c_str());
158                                 item->second.printAccessRules();
159                         }
160                 }
161                 else
162                 {
163                         _DBG("   +--- permission : %s", permission ? "granted all" : "denied all");
164                 }
165         }
166
167         void AccessCondition::setAPDUAccessRule(const ByteArray &certHash,
168                 bool rule)
169         {
170                 AccessRule *access = getAccessRule(certHash);
171
172                 if (access != NULL) {
173                         access->setAPDUAccessRule(rule);
174                 }
175         }
176
177         void AccessCondition::addAPDUAccessRule(const ByteArray &certHash,
178                 const ByteArray &apdu, const ByteArray &mask)
179         {
180                 AccessRule *access = getAccessRule(certHash);
181
182                 if (access != NULL) {
183                         access->addAPDUAccessRule(apdu, mask);
184                 }
185         }
186
187         void AccessCondition::addAPDUAccessRule(const ByteArray &certHash,
188                 const ByteArray &rule)
189         {
190                 if (rule.size() != 8)
191                         return;
192
193                 addAPDUAccessRule(certHash, rule.sub(0, 4), rule.sub(4, 4));
194         }
195
196         void AccessCondition::setNFCAccessRule(const ByteArray &certHash,
197                         bool rule)
198         {
199                 AccessRule *access = getAccessRule(certHash);
200
201                 if (access != NULL) {
202                         access->setNFCAccessRule(rule);
203                 }
204         }
205
206         bool AccessCondition::isAuthorizedAPDUAccess(const ByteArray &certHash,
207                 const ByteArray &command) const
208         {
209                 bool result = false;
210                 const AccessRule *rule = getAccessRule(certHash);
211
212                 if (rule != NULL) {
213                         result = rule->isAuthorizedAPDUAccess(command);
214                 }
215
216                 return result;
217         }
218
219         bool AccessCondition::isAuthorizedNFCAccess(const ByteArray &certHash) const
220         {
221                 bool result = false;
222                 const AccessRule *rule = getAccessRule(certHash);
223
224                 if (rule != NULL) {
225                         result = rule->isAuthorizedNFCAccess();
226                 }
227
228                 return result;
229         }
230 } /* namespace smartcard_service_api */