[SecureElement] Adjusted to new native api - part 3. 28/84828/2
authorTomasz Marciniak <t.marciniak@samsung.com>
Fri, 19 Aug 2016 13:34:16 +0000 (15:34 +0200)
committerTomasz Marciniak <t.marciniak@samsung.com>
Wed, 24 Aug 2016 07:26:55 +0000 (09:26 +0200)
[Verification] Code compiles. TCT pass rate 100%.

Change-Id: Ica0528757ff9a724f6a05d8e6214d49ae226539f
Signed-off-by: Tomasz Marciniak <t.marciniak@samsung.com>
src/secureelement/secureelement_api.js
src/secureelement/secureelement_instance.cc

index 9a55298..4ff5bd2 100644 (file)
@@ -306,7 +306,7 @@ function Session(session_handle) {
                           console.log('SESession_isClosed error: ' + native_.getErrorObject(result));
                           return true;
                         } else {
-                          return native_.getResultObject(result).isClosed;
+                          return native_.getResultObject(result);
                         }
                       }
                     },
index 899d855..ea01bee 100644 (file)
@@ -35,6 +35,7 @@ const std::string kHandle = "handle";
 const std::string kIsBasicChannel = "isBasicChannel";
 const std::string kAid = "aid";
 const std::string kAction = "action";
+const std::string kCommand = "command";
 const std::string kListenerId = "listenerId";
 const std::string kListener = "SecureElementChangeListener";
 const std::string kReady = "onSEReady";
@@ -438,13 +439,41 @@ TizenResult SecureElementInstance::GetATR(picojson::object const& args) {
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int session = static_cast<int>(args.find(kHandle)->second.get<double>());
+  int length = 0;
+  unsigned char* atr = nullptr;
+
+  int ret = smartcard_session_get_atr(session, &atr, &length);
+  SCOPE_EXIT {
+    free(atr);
+  };
+
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_get_atr() failed"));
+  }
+
+  picojson::value response{picojson::array{}};
+  auto& array = response.get<picojson::array>();
+
+  for (int i = 0; i < length; i++) {
+    array.push_back(picojson::value(static_cast<double>(atr[i])));
+  }
+
+  return TizenSuccess(response);
 }
 
 TizenResult SecureElementInstance::IsSessionClosed(picojson::object const& args) {
   ScopeLogger();
 
-  return common::NotSupportedError();
+  int session = static_cast<int>(args.find(kHandle)->second.get<double>());
+  bool is_closed = false;
+
+  int ret = smartcard_session_is_closed(session, &is_closed);
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_is_closed() failed"));
+  }
+
+  return TizenSuccess(picojson::value(is_closed));
 }
 
 TizenResult SecureElementInstance::CloseSession(picojson::object const& args) {
@@ -452,7 +481,14 @@ TizenResult SecureElementInstance::CloseSession(picojson::object const& args) {
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int session = static_cast<int>(args.find(kHandle)->second.get<double>());
+
+  int ret = smartcard_session_close(session);
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_close() failed"));
+  }
+
+  return TizenSuccess();
 }
 
 TizenResult SecureElementInstance::CloseChannels(picojson::object const& args) {
@@ -460,7 +496,14 @@ TizenResult SecureElementInstance::CloseChannels(picojson::object const& args) {
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int session = static_cast<int>(args.find(kHandle)->second.get<double>());
+
+  int ret = smartcard_session_close_channels(session);
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_session_close_channels() failed"));
+  }
+
+  return TizenSuccess();
 }
 
 // Channel methods
@@ -469,7 +512,14 @@ TizenResult SecureElementInstance::CloseChannel(picojson::object const& args) {
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int channel = static_cast<int>(args.find(kHandle)->second.get<double>());
+
+  int ret = smartcard_channel_close(channel);
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret), ("smartcard_channel_close() failed"));
+  }
+
+  return TizenSuccess();
 }
 
 TizenResult SecureElementInstance::Transmit(picojson::object const& args, const common::AsyncToken& token) {
@@ -477,7 +527,50 @@ TizenResult SecureElementInstance::Transmit(picojson::object const& args, const
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int channel = static_cast<int>(args.find(kHandle)->second.get<double>());
+  const auto& v_cmd = args.find(kCommand)->second.get<picojson::array>();
+
+  auto transmit = [this, channel, v_cmd](const common::AsyncToken& token) -> void {
+    TizenResult result = TizenSuccess();
+
+    size_t v_cmd_size = v_cmd.size();
+    unsigned char* cmd = new unsigned char[v_cmd_size];
+    SCOPE_EXIT {
+      delete [] cmd;
+    };
+
+    for (size_t i = 0; i < v_cmd_size; i++) {
+      cmd[i] = static_cast<unsigned char>(v_cmd[i].get<double>());
+    }
+
+    int length = 0;
+    unsigned char* response = nullptr;
+
+    int ret = smartcard_channel_transmit(channel, cmd, v_cmd_size, &response, &length);
+    SCOPE_EXIT {
+      free(response);
+    };
+
+    if (SMARTCARD_ERROR_NONE != ret) {
+      LoggerE("smartcard_channel_transmit() failed");
+      result = ConvertErrorCode(ret);
+    } else {
+      picojson::value response_v{picojson::array{}};
+      auto& array = response_v.get<picojson::array>();
+
+      for (int i = 0; i < length; i++) {
+        array.push_back(picojson::value(static_cast<double>(response[i])));
+      }
+
+      result = TizenSuccess(response_v);
+    }
+
+    this->Post(token, result);
+  };
+
+  std::thread(transmit, token).detach();
+
+  return TizenSuccess();
 }
 
 TizenResult SecureElementInstance::GetSelectResponse(picojson::object const& args) {
@@ -485,7 +578,28 @@ TizenResult SecureElementInstance::GetSelectResponse(picojson::object const& arg
 
   CHECK_PRIVILEGE(kPrivilegeSecureElement);
 
-  return common::NotSupportedError();
+  int channel = static_cast<int>(args.find(kHandle)->second.get<double>());
+  int length = 0;
+  unsigned char* select_response = nullptr;
+
+  int ret = smartcard_channel_get_select_response(channel, &select_response, &length);
+  SCOPE_EXIT {
+    free(select_response);
+  };
+
+  if (SMARTCARD_ERROR_NONE != ret) {
+    LogAndReturnTizenError(ConvertErrorCode(ret),
+                           ("smartcard_channel_get_select_response() failed"));
+  }
+
+  picojson::value response{picojson::array{}};
+  auto& array = response.get<picojson::array>();
+
+  for (int i = 0; i < length; i++) {
+    array.push_back(picojson::value(static_cast<double>(select_response[i])));
+  }
+
+  return TizenSuccess(response);
 }
 
 } // namespace secureelement