From d344dd50069a245fe2adc3bc5d16762d9717df45 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Fri, 19 Aug 2016 15:34:16 +0200 Subject: [PATCH] [SecureElement] Adjusted to new native api - part 3. [Verification] Code compiles. TCT pass rate 100%. Change-Id: Ica0528757ff9a724f6a05d8e6214d49ae226539f Signed-off-by: Tomasz Marciniak --- src/secureelement/secureelement_api.js | 2 +- src/secureelement/secureelement_instance.cc | 128 ++++++++++++++++++-- 2 files changed, 122 insertions(+), 8 deletions(-) diff --git a/src/secureelement/secureelement_api.js b/src/secureelement/secureelement_api.js index 9a55298a..4ff5bd2a 100644 --- a/src/secureelement/secureelement_api.js +++ b/src/secureelement/secureelement_api.js @@ -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); } } }, diff --git a/src/secureelement/secureelement_instance.cc b/src/secureelement/secureelement_instance.cc index 899d855e..ea01beeb 100644 --- a/src/secureelement/secureelement_instance.cc +++ b/src/secureelement/secureelement_instance.cc @@ -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(args.find(kHandle)->second.get()); + 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(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(atr[i]))); + } + + return TizenSuccess(response); } TizenResult SecureElementInstance::IsSessionClosed(picojson::object const& args) { ScopeLogger(); - return common::NotSupportedError(); + int session = static_cast(args.find(kHandle)->second.get()); + 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(args.find(kHandle)->second.get()); + + 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(args.find(kHandle)->second.get()); + + 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(args.find(kHandle)->second.get()); + + 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(args.find(kHandle)->second.get()); + const auto& v_cmd = args.find(kCommand)->second.get(); + + 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(v_cmd[i].get()); + } + + 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(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(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(args.find(kHandle)->second.get()); + 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(); + + for (int i = 0; i < length; i++) { + array.push_back(picojson::value(static_cast(select_response[i]))); + } + + return TizenSuccess(response); } } // namespace secureelement -- 2.34.1