Apply coding rule
[platform/core/connectivity/smartcard-service.git] / common / PKCS15.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
19 /* SLP library header */
20
21 /* local header */
22 #include "Debug.h"
23 #include "APDUHelper.h"
24 #include "EFDIR.h"
25 #include "PKCS15.h"
26
27 namespace smartcard_service_api
28 {
29         static unsigned char aid[] = { 0xA0, 0x00, 0x00, 0x00, 0x63, 0x50,
30                 0x4B, 0x43, 0x53, 0x2D, 0x31, 0x35 };
31         const ByteArray PKCS15::PKCS15_AID(ARRAY_AND_SIZE(aid));
32
33         PKCS15::PKCS15(Channel *channel) :
34                 PKCS15Object(channel), odf(NULL)
35         {
36         }
37
38         PKCS15::PKCS15(Channel *channel, const ByteArray &selectResponse) :
39                 PKCS15Object(channel, selectResponse), odf(NULL)
40         {
41         }
42
43         PKCS15::~PKCS15()
44         {
45                 if (odf != NULL)
46                 {
47                         delete odf;
48                         odf = NULL;
49                 }
50         }
51
52         int PKCS15::select()
53         {
54                 int ret;
55
56                 ret = PKCS15Object::select(PKCS15_AID);
57                 if (ret >= SCARD_ERROR_OK) {
58                         _DBG("response : %s", selectResponse.toString().c_str());
59                 } else if (ret == ResponseHelper::ERROR_FILE_NOT_FOUND) {
60                         _ERR("PKCS15 AID not found, search in EF DIR");
61
62                         ret = selectFromEFDIR();
63                         if (ret >= SCARD_ERROR_OK) {
64                                 _DBG("response : %s", selectResponse.toString().c_str());
65                         } else {
66                                 _ERR("PKCS15 select failed, [%d]", ret);
67                         }
68                 } else {
69                         _ERR("PKCS15 select failed, [%d]", ret);
70                 }
71
72                 return ret;
73         }
74
75         int PKCS15::selectFromEFDIR()
76         {
77                 int ret;
78                 ByteArray path;
79                 EFDIR dir(channel);
80
81                 ret = dir.select();
82                 if (ret >= SCARD_ERROR_OK) {
83                         path = dir.getPathByAID(PKCS15_AID);
84                         if (path.size() > 0) {
85                                 ret = PKCS15Object::select(path, false);
86                                 if (ret < SCARD_ERROR_OK) {
87                                         _ERR("PKCS15 select failed, [%d]", ret);
88                                 }
89                         } else {
90                                 _ERR("PKCS15 path is not found");
91                                 ret = SCARD_ERROR_NOT_SUPPORTED;
92                         }
93                 } else {
94                         _ERR("select EFDIR failed, [%x]", -ret);
95                 }
96
97                 return ret;
98         }
99
100         PKCS15ODF *PKCS15::getODF()
101         {
102                 if (odf == NULL)
103                 {
104                         odf = new PKCS15ODF(channel);
105
106                         if (odf != NULL && odf->isClosed() == true)
107                         {
108                                 _ERR("failed to open ODF");
109
110                                 delete odf;
111                                 odf = NULL;
112                         }
113                 }
114
115                 _DBG("odf [%p]", odf);
116
117                 return odf;
118         }
119 } /* namespace smartcard_service_api */