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";
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) {
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) {
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
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) {
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) {
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