Select PKCS #15 using EF DIR
authorWonkyu Kwon <wonkyu.kwon@samsung.com>
Tue, 26 Feb 2013 07:51:24 +0000 (16:51 +0900)
committerWonkyu Kwon <wonkyu.kwon@samsung.com>
Wed, 6 Mar 2013 07:34:30 +0000 (16:34 +0900)
 - implement additional selecting sequence
 - fix minor bug

Change-Id: I9cea5234ec0722424a4f6f247b6b040683fbf5dc

common/FileObject.cpp
common/include/FileObject.h
packaging/smartcard-service.spec
server/ServerResource.cpp

index f4b5b18..e93e459 100644 (file)
@@ -41,6 +41,13 @@ namespace smartcard_service_api
 
        FileObject::~FileObject()
        {
+               close();
+       }
+
+       void FileObject::close()
+       {
+               opened = false;
+               selectResponse.releaseBuffer();
        }
 
        bool FileObject::setSelectResponse(ByteArray &response)
@@ -89,7 +96,7 @@ namespace smartcard_service_api
                        return ret;
                }
 
-               opened = false;
+               close();
 
                ret = channel->transmitSync(command, result);
                if (ret == 0)
@@ -100,6 +107,7 @@ namespace smartcard_service_api
                        {
                                if (setSelectResponse(result) == true)
                                {
+                                       opened = true;
                                        ret = SUCCESS;
                                }
                                else
@@ -311,5 +319,4 @@ namespace smartcard_service_api
 
                return ret;
        }
-
 } /* namespace smartcard_service_api */
index a4d1270..ec9e90b 100644 (file)
@@ -61,6 +61,7 @@ namespace smartcard_service_api
                FileObject(Channel *channel, ByteArray selectResponse);
                ~FileObject();
 
+               void close();
                inline bool isClosed() { return (opened == false); }
                int select(ByteArray aid);
                int select(ByteArray path, bool fromCurrentDF);
index 85690af..841932a 100644 (file)
@@ -1,6 +1,6 @@
 Name:       smartcard-service
 Summary:    Smartcard Service FW
-Version:    0.1.13
+Version:    0.1.14
 Release:    0
 Group:      libs
 License:    Apache License, Version 2.0
index ab38f11..abcc162 100644 (file)
@@ -606,29 +606,42 @@ namespace smartcard_service_api
                                aid, service->getParent()->getCertificationHashes()) == true)
                {
                        int rv = 0;
-                       ByteArray command;
-                       ByteArray response;
 
                        /* select aid */
-                       command = APDUHelper::generateAPDU(APDUHelper::COMMAND_SELECT_BY_DF_NAME, channelNum, aid);
-                       rv = channel->transmitSync(command, response);
-                       if (rv == 0 && response.getLength() >= 2)
+                       if (aid == PKCS15::PKCS15_AID)
                        {
-                               ResponseHelper resp(response);
+                               PKCS15 pkcs15(channel);
 
-                               if (resp.getStatus() == 0)
+                               if (pkcs15.isClosed() == false)
                                {
                                        /* remove privilege mode */
                                        channel->unsetPrivilegeMode();
                                }
                                else
                                {
-                                       SCARD_DEBUG_ERR("status word [%d][ %02X %02X ]", resp.getStatus(), resp.getSW1(), resp.getSW2());
+                                       SCARD_DEBUG_ERR("select failed");
+
+                                       service->closeChannel(result);
+                                       result = IntegerHandle::INVALID_HANDLE;
                                }
                        }
                        else
                        {
-                               SCARD_DEBUG_ERR("select apdu is failed, rv [%d], length [%d]", rv, response.getLength());
+                               FileObject file(channel);
+
+                               rv = file.select(aid);
+                               if (rv == FileObject::SUCCESS)
+                               {
+                                       /* remove privilege mode */
+                                       channel->unsetPrivilegeMode();
+                               }
+                               else
+                               {
+                                       SCARD_DEBUG_ERR("select failed [%d]", rv);
+
+                                       service->closeChannel(result);
+                                       result = IntegerHandle::INVALID_HANDLE;
+                               }
                        }
                }
                else