Snap for 6877830 from 3cb30e890f0945f9d0fd0e1c4fa456a67addeceb to sdk-release

Change-Id: Idb85e65f28faac35053825fb0452bc0f99e3a902
diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index 6e4b529..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,74 +0,0 @@
-cc_library_shared {
-    // FIXME: this should only be -impl for a passthrough hal.
-    // In most cases, to convert this to a binderized implementation, you should:
-    // - change '-impl' to '-service' here and make it a cc_binary instead of a
-    //   cc_library_shared.
-    // - add a *.rc file for this module.
-    // - delete HIDL_FETCH_I* functions.
-    // - call configureRpcThreadpool and registerAsService on the instance.
-    // You may also want to append '-impl/-service' with a specific identifier like
-    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
-    name: "android.hardware.secure_element@1.0-impl-gto",
-    //relative_install_path: "hw",
-    // FIXME: this should be 'vendor: true' for modules that will eventually be
-    // on AOSP.
-    vendor: true,
-    srcs: [
-        "esehal/src/checksum.c",
-        "esehal/src/iso7816_t1.c",
-        "esehal/src/libse-gto.c",
-        "esehal/src/spi.c",
-        "esehal/src/transport.c",
-        "esehal/src/log.c",
-        "SecureElement.cpp",
-        "SecureElementHalCallback.cpp",
-    ],
-
-    local_include_dirs: [
-        "esehal/src",
-    ],
-
-    cflags: [
-        "-DANDROID",
-        "-DENABLE_LOGGING=1",
-        "-DENABLE_DEBUG=1",
-        "-DBUILDCFG=1",
-        "-DNXP_EXTNS=TRUE",
-        "-Wno-unused-parameter",
-        "-Wno-unused-private-field",
-        "-Wno-error",
-    ],
-
-    shared_libs: [
-        "libbase",
-        "libcutils",
-        "libhardware",
-        "libhidlbase",
-        "liblog",
-        "libutils",
-        "android.hardware.secure_element@1.0",
-    ],
-
-}
-
-cc_binary {
-    name: "android.hardware.secure_element@1.0-service-gto",
-    relative_install_path: "hw",
-    init_rc: ["android.hardware.secure_element@1.0-service-gto.rc"],
-    vendor: true,
-    defaults: ["hidl_defaults"],
-    srcs: [
-        "GtoService.cpp",
-    ],
-
-    shared_libs: [
-        "android.hardware.secure_element@1.0",
-        "android.hardware.secure_element@1.0-impl-gto",
-        "libbase",
-        "libcutils",
-        "libhardware",
-        "libhidlbase",
-        "liblog",
-        "libutils",
-    ],
-}
diff --git a/README b/README
deleted file mode 100644
index 03fd8a6..0000000
--- a/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Thales_secure_element_hal Android Secure Element HAL for Thales Embedded Secure Element
-
-Copyright ©2017-2019 Gemalto – a Thales Company. All rights Reserved.
-
-This copy is licensed under the Apache License, Version 2.0 (the "License");
-You may not use this file except in compliance with the License.
-You may obtain a copy of the License at:
-    http://www.apache.org/licenses/LICENSE-2.0 or https://www.apache.org/licenses/LICENSE-2.0.html 
-
-Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and limitations under the License.
diff --git a/pax_global_header b/pax_global_header
deleted file mode 100644
index da6a5e8..0000000
--- a/pax_global_header
+++ /dev/null
@@ -1 +0,0 @@
-52 comment=0c4de3711ddb2e7ffbf45df90eb6fd4c73efcc7e
diff --git a/GtoService.cpp b/secure_element/1.0/GtoService.cpp
similarity index 94%
rename from GtoService.cpp
rename to secure_element/1.0/GtoService.cpp
index 819410c..623cb16 100644
--- a/GtoService.cpp
+++ b/secure_element/1.0/GtoService.cpp
@@ -26,7 +26,7 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.4 is starting. libse-gto v1.10");
+  ALOGD("Gemalto Secure Element HAL Service 1.0.1 is starting. libse-gto v1.12");
   sp<ISecureElement> se_service = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
diff --git a/SecureElement.cpp b/secure_element/1.0/SecureElement.cpp
similarity index 95%
rename from SecureElement.cpp
rename to secure_element/1.0/SecureElement.cpp
index f4d7fa5..8913e28 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.0/SecureElement.cpp
@@ -51,6 +51,7 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
+    ctx = NULL;
 }
 
 void SecureElement::resetSE(){
@@ -135,6 +136,7 @@
 
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -178,8 +180,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -234,8 +236,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -251,14 +253,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -326,8 +328,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -402,8 +404,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -450,8 +452,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -470,24 +472,30 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
+    msg = (char*) malloc ( (pf ? strlen(pf) : 0) + input_len * 3 + 1);
+    if(!msg) {
+        errno = ENOMEM;
+        return;
+    }
 
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
+
+    if(msg) free(msg);
 }
 
 int
@@ -577,12 +585,14 @@
     f = fopen(filename, "r");
     if (f) {
         r = parseConfigFile(f, verbose);
-        if (r == -1)
+        if (r == -1) {
             perror(filename);
             ALOGE("SecureElement:%s Error parse %s Failed", __func__, filename);
-        if (fclose(f) != 0)
+        }
+        if (fclose(f) != 0) {
             r = -1;
             ALOGE("SecureElement:%s Error close %s Failed", __func__, filename);
+        }
     } else {
         r = -1;
         ALOGE("SecureElement:%s Error open %s Failed", __func__, filename);
@@ -611,11 +621,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/SecureElement.h b/secure_element/1.0/SecureElement.h
similarity index 95%
rename from SecureElement.h
rename to secure_element/1.0/SecureElement.h
index ca55916..e63c3a8 100644
--- a/SecureElement.h
+++ b/secure_element/1.0/SecureElement.h
@@ -35,7 +35,7 @@
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
     // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
diff --git a/SecureElementHalCallback.cpp b/secure_element/1.0/SecureElementHalCallback.cpp
similarity index 100%
rename from SecureElementHalCallback.cpp
rename to secure_element/1.0/SecureElementHalCallback.cpp
diff --git a/SecureElementHalCallback.h b/secure_element/1.0/SecureElementHalCallback.h
similarity index 100%
rename from SecureElementHalCallback.h
rename to secure_element/1.0/SecureElementHalCallback.h
diff --git a/android.hardware.secure_element@1.0-service-gto.rc b/secure_element/1.0/android.hardware.secure_element@1.0-service-gto.rc
similarity index 68%
rename from android.hardware.secure_element@1.0-service-gto.rc
rename to secure_element/1.0/android.hardware.secure_element@1.0-service-gto.rc
index 756ec48..091a6d2 100644
--- a/android.hardware.secure_element@1.0-service-gto.rc
+++ b/secure_element/1.0/android.hardware.secure_element@1.0-service-gto.rc
@@ -1,5 +1,4 @@
 service gto_secure_element_hal_service /vendor/bin/hw/android.hardware.secure_element@1.0-service-gto
     class hal
-    user root
-    group root
-    seclabel u:r:su:s0
+    user secure_element
+    group secure_element
diff --git a/esehal/src/.gitignore b/secure_element/1.0/esehal/src/.gitignore
similarity index 100%
rename from esehal/src/.gitignore
rename to secure_element/1.0/esehal/src/.gitignore
diff --git a/esehal/src/Makefile.am b/secure_element/1.0/esehal/src/Makefile.am
similarity index 100%
rename from esehal/src/Makefile.am
rename to secure_element/1.0/esehal/src/Makefile.am
diff --git a/esehal/src/checksum.c b/secure_element/1.0/esehal/src/checksum.c
similarity index 100%
rename from esehal/src/checksum.c
rename to secure_element/1.0/esehal/src/checksum.c
diff --git a/esehal/src/checksum.h b/secure_element/1.0/esehal/src/checksum.h
similarity index 100%
rename from esehal/src/checksum.h
rename to secure_element/1.0/esehal/src/checksum.h
diff --git a/esehal/src/compiler.h b/secure_element/1.0/esehal/src/compiler.h
similarity index 100%
rename from esehal/src/compiler.h
rename to secure_element/1.0/esehal/src/compiler.h
diff --git a/esehal/src/iso7816_t1.c b/secure_element/1.0/esehal/src/iso7816_t1.c
similarity index 99%
rename from esehal/src/iso7816_t1.c
rename to secure_element/1.0/esehal/src/iso7816_t1.c
index 7407acf..77baa2a 100644
--- a/esehal/src/iso7816_t1.c
+++ b/secure_element/1.0/esehal/src/iso7816_t1.c
@@ -716,7 +716,7 @@
         {
             /*Request Soft RESET to the secure element*/
             r = t1_reset(t1);
-            if (r < 0) n = 0xDEAD; /*Fatal error meaning eSE is not responding to reset*/
+            if (r < 0) n = -0xDEAD; /*Fatal error meaning eSE is not responding to reset*/
         }
     }
     return n;
diff --git a/esehal/src/iso7816_t1.h b/secure_element/1.0/esehal/src/iso7816_t1.h
similarity index 100%
rename from esehal/src/iso7816_t1.h
rename to secure_element/1.0/esehal/src/iso7816_t1.h
diff --git a/esehal/src/libse-gto-private.h b/secure_element/1.0/esehal/src/libse-gto-private.h
similarity index 100%
rename from esehal/src/libse-gto-private.h
rename to secure_element/1.0/esehal/src/libse-gto-private.h
diff --git a/esehal/src/libse-gto.c b/secure_element/1.0/esehal/src/libse-gto.c
similarity index 97%
rename from esehal/src/libse-gto.c
rename to secure_element/1.0/esehal/src/libse-gto.c
index 6002787..b87dc5c 100644
--- a/esehal/src/libse-gto.c
+++ b/secure_element/1.0/esehal/src/libse-gto.c
@@ -238,13 +238,13 @@
 {
     int status = 0;
 
-    dbg("se_gto_close check_alive = %d\n", ctx->check_alive);
+    if(ctx) dbg("se_gto_close check_alive = %d\n", ctx->check_alive);
     if (ctx->check_alive == 1)
         if (gtoSPI_checkAlive(ctx) != 0) status = 0xDEAD;
 
     (void)isot1_release(&ctx->t1);
     (void)spi_teardown(ctx);
     log_teardown(ctx);
-    free(ctx);
+    if(ctx) free(ctx);
     return status;
 }
diff --git a/esehal/src/libse-gto.pc.in b/secure_element/1.0/esehal/src/libse-gto.pc.in
similarity index 100%
rename from esehal/src/libse-gto.pc.in
rename to secure_element/1.0/esehal/src/libse-gto.pc.in
diff --git a/esehal/src/linux/se_gemalto.h b/secure_element/1.0/esehal/src/linux/se_gemalto.h
similarity index 100%
rename from esehal/src/linux/se_gemalto.h
rename to secure_element/1.0/esehal/src/linux/se_gemalto.h
diff --git a/esehal/src/log.c b/secure_element/1.0/esehal/src/log.c
similarity index 100%
rename from esehal/src/log.c
rename to secure_element/1.0/esehal/src/log.c
diff --git a/esehal/src/log.h b/secure_element/1.0/esehal/src/log.h
similarity index 100%
rename from esehal/src/log.h
rename to secure_element/1.0/esehal/src/log.h
diff --git a/esehal/src/se-gto/libse-gto.h b/secure_element/1.0/esehal/src/se-gto/libse-gto.h
similarity index 100%
rename from esehal/src/se-gto/libse-gto.h
rename to secure_element/1.0/esehal/src/se-gto/libse-gto.h
diff --git a/esehal/src/spi.c b/secure_element/1.0/esehal/src/spi.c
similarity index 100%
rename from esehal/src/spi.c
rename to secure_element/1.0/esehal/src/spi.c
diff --git a/esehal/src/spi.h b/secure_element/1.0/esehal/src/spi.h
similarity index 100%
rename from esehal/src/spi.h
rename to secure_element/1.0/esehal/src/spi.h
diff --git a/esehal/src/transport.c b/secure_element/1.0/esehal/src/transport.c
similarity index 100%
rename from esehal/src/transport.c
rename to secure_element/1.0/esehal/src/transport.c
diff --git a/esehal/src/transport.h b/secure_element/1.0/esehal/src/transport.h
similarity index 100%
rename from esehal/src/transport.h
rename to secure_element/1.0/esehal/src/transport.h
diff --git a/libse-gto-hal.conf b/secure_element/1.0/libse-gto-hal.conf
similarity index 100%
rename from libse-gto-hal.conf
rename to secure_element/1.0/libse-gto-hal.conf
diff --git a/GtoService.cpp b/secure_element/1.1/GtoService.cpp
similarity index 78%
copy from GtoService.cpp
copy to secure_element/1.1/GtoService.cpp
index 819410c..263d9e1 100644
--- a/GtoService.cpp
+++ b/secure_element/1.1/GtoService.cpp
@@ -10,15 +10,15 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.1/ISecureElement.h>
 #include <hidl/LegacySupport.h>
 #include <log/log.h>
 
 #include "SecureElement.h"
 
 // Generated HIDL files
-using android::hardware::secure_element::V1_0::ISecureElement;
-using android::hardware::secure_element::V1_0::implementation::SecureElement;
+using android::hardware::secure_element::V1_1::ISecureElement;
+using android::hardware::secure_element::V1_1::implementation::SecureElement;
 using android::hardware::configureRpcThreadpool;
 using android::hardware::joinRpcThreadpool;
 using android::OK;
@@ -26,7 +26,8 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.4 is starting. libse-gto v1.10");
+  ALOGD("android::hardware::secure_element::V1_1 is starting.");
+  ALOGD("Thales Secure Element HAL Service Release 1.1.1 ==> libse-gto v1.12");
   sp<ISecureElement> se_service = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
@@ -37,7 +38,7 @@
     return -1;
   }
   
-  ALOGD("Gemalto Secure Element Service is ready");
+  ALOGD("Thales Secure Element Service is ready");
   joinRpcThreadpool();
   return 1;
 }
diff --git a/SecureElement.cpp b/secure_element/1.1/SecureElement.cpp
similarity index 89%
copy from SecureElement.cpp
copy to secure_element/1.1/SecureElement.cpp
index f4d7fa5..727b5d8 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.1/SecureElement.cpp
@@ -32,7 +32,7 @@
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_1 {
 namespace implementation {
 
 #ifndef MAX_CHANNELS
@@ -51,6 +51,7 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
+    ctx = NULL;
 }
 
 void SecureElement::resetSE(){
@@ -71,6 +72,7 @@
 }
 
 sp<V1_0::ISecureElementHalCallback> SecureElement::internalClientCallback = nullptr;
+sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
     //struct settings *settings;
@@ -98,14 +100,16 @@
     checkSeUp = true;
     turnOffSE = false;
 
-    internalClientCallback->onStateChange(true);
+
+    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+    else internalClientCallback->onStateChange(true);
+
     turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
 }
 
-// Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
 Return<void> SecureElement::init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) {
 
     ALOGD("SecureElement:%s start", __func__);
@@ -114,6 +118,7 @@
         return Void();
     } else {
         internalClientCallback = clientCallback;
+        internalClientCallback_v1_1 = nullptr;
         if (!internalClientCallback->linkToDeath(this, 0)) {
             ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
         }
@@ -133,8 +138,37 @@
     return Void();
 }
 
+Return<void> SecureElement::init_1_1(const sp<::android::hardware::secure_element::V1_1::ISecureElementHalCallback>& clientCallback) {
+
+    ALOGD("SecureElement:%s start", __func__);
+    if (clientCallback == nullptr) {
+        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        return Void();
+    } else {
+        internalClientCallback = nullptr;
+        internalClientCallback_v1_1 = clientCallback;
+        if (!internalClientCallback_v1_1->linkToDeath(this, 0)) {
+            ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
+        }
+    }
+
+    if (initializeSE() != EXIT_SUCCESS) {
+        ALOGE("SecureElement:%s initializeSE Failed", __func__);
+        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        return Void();
+    }
+
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    ALOGD("SecureElement:%s end", __func__);
+
+    return Void();
+}
+
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -178,8 +212,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -234,8 +268,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -251,14 +285,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -326,8 +360,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -402,8 +436,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -450,8 +484,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -470,24 +504,30 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
+    msg = (char*) malloc ( (pf ? strlen(pf) : 0) + input_len * 3 + 1);
+    if(!msg) {
+        errno = ENOMEM;
+        return;
+    }
 
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
+
+    if(msg) free(msg);
 }
 
 int
@@ -577,12 +617,14 @@
     f = fopen(filename, "r");
     if (f) {
         r = parseConfigFile(f, verbose);
-        if (r == -1)
+        if (r == -1) {
             perror(filename);
             ALOGE("SecureElement:%s Error parse %s Failed", __func__, filename);
-        if (fclose(f) != 0)
+        }
+        if (fclose(f) != 0) {
             r = -1;
             ALOGE("SecureElement:%s Error close %s Failed", __func__, filename);
+        }
     } else {
         r = -1;
         ALOGE("SecureElement:%s Error open %s Failed", __func__, filename);
@@ -598,6 +640,11 @@
   }
   if (internalClientCallback != nullptr) {
     internalClientCallback->unlinkToDeath(this);
+    internalClientCallback = nullptr;
+  }
+  if (internalClientCallback_v1_1 != nullptr) {
+    internalClientCallback_v1_1->unlinkToDeath(this);
+    internalClientCallback_v1_1 = nullptr;
   }
 }
 
@@ -611,11 +658,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/SecureElement.h b/secure_element/1.1/SecureElement.h
similarity index 77%
copy from SecureElement.h
copy to secure_element/1.1/SecureElement.h
index ca55916..90596e0 100644
--- a/SecureElement.h
+++ b/secure_element/1.1/SecureElement.h
@@ -10,17 +10,18 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
-#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
+#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
 
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.0/types.h>
+#include <android/hardware/secure_element/1.1/ISecureElement.h>
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_1 {
 namespace implementation {
 
 using ::android::hardware::hidl_array;
@@ -30,12 +31,15 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::sp;
+using ::android::hardware::secure_element::V1_0::LogicalChannelResponse;
+using ::android::hardware::secure_element::V1_0::SecureElementStatus;
+using ::android::hardware::secure_element::V1_1::ISecureElement;
 
 
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
-    // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init_1_1(const sp<V1_1::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
@@ -44,7 +48,6 @@
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> closeChannel(uint8_t channelNumber) override;
 
 
-    // Methods from ::android::hidl::base::V1_0::IBase follow.
     private:
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
@@ -53,6 +56,7 @@
     uint8_t atr[32];
     uint8_t atr_size;
     static sp<V1_0::ISecureElementHalCallback> internalClientCallback;
+    static sp<V1_1::ISecureElementHalCallback> internalClientCallback_v1_1;
     int initializeSE();
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> deinitializeSE();
     void serviceDied(uint64_t, const wp<IBase>&) override;
@@ -66,13 +70,11 @@
 
 };
 
-// FIXME: most likely delete, this is only for passthrough implementations
-// extern "C" ISecureElement* HIDL_FETCH_ISecureElement(const char* name);
 
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_1
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
 
-#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
diff --git a/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc b/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc
new file mode 100644
index 0000000..7beb656
--- /dev/null
+++ b/secure_element/1.1/android.hardware.secure_element@1.1-service-gto.rc
@@ -0,0 +1,4 @@
+service gto_secure_element_hal_service_1_1 /vendor/bin/hw/android.hardware.secure_element@1.1-service-gto
+    class hal
+    user secure_element
+    group secure_element
diff --git a/GtoService.cpp b/secure_element/1.2/GtoService.cpp
similarity index 69%
copy from GtoService.cpp
copy to secure_element/1.2/GtoService.cpp
index 819410c..72f6542 100644
--- a/GtoService.cpp
+++ b/secure_element/1.2/GtoService.cpp
@@ -10,15 +10,15 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.2/ISecureElement.h>
 #include <hidl/LegacySupport.h>
 #include <log/log.h>
 
 #include "SecureElement.h"
 
 // Generated HIDL files
-using android::hardware::secure_element::V1_0::ISecureElement;
-using android::hardware::secure_element::V1_0::implementation::SecureElement;
+using android::hardware::secure_element::V1_2::ISecureElement;
+using android::hardware::secure_element::V1_2::implementation::SecureElement;
 using android::hardware::configureRpcThreadpool;
 using android::hardware::joinRpcThreadpool;
 using android::OK;
@@ -26,8 +26,10 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Gemalto Secure Element HAL Service 1.0.4 is starting. libse-gto v1.10");
+  ALOGD("android::hardware::secure_element::V1_2 is starting.");
+  ALOGD("Thales Secure Element HAL Service Release 1.2.2 ==> libse-gto v1.12");
   sp<ISecureElement> se_service = new SecureElement();
+  //sp<ISecureElement> se_service2 = new SecureElement();
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
   if (status != OK) {
@@ -36,8 +38,16 @@
         status);
     return -1;
   }
+
+  /*status_t status = se_service2->registerAsService("eSE2");
+  if (status != OK) {
+    LOG_ALWAYS_FATAL(
+        "registerAsService2 (%d).",
+        status);
+    return -1;
+  }*/
   
-  ALOGD("Gemalto Secure Element Service is ready");
+  ALOGD("Thales Secure Element Service is ready");
   joinRpcThreadpool();
   return 1;
 }
diff --git a/SecureElement.cpp b/secure_element/1.2/SecureElement.cpp
similarity index 86%
copy from SecureElement.cpp
copy to secure_element/1.2/SecureElement.cpp
index f4d7fa5..71613a8 100644
--- a/SecureElement.cpp
+++ b/secure_element/1.2/SecureElement.cpp
@@ -32,7 +32,7 @@
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_2 {
 namespace implementation {
 
 #ifndef MAX_CHANNELS
@@ -51,9 +51,10 @@
 
 SecureElement::SecureElement(){
     nbrOpenChannel = 0;
+    ctx = NULL;
 }
 
-void SecureElement::resetSE(){
+int SecureElement::resetSE(){
     int n;
 
     isBasicChannelOpen = false;
@@ -68,9 +69,12 @@
     } else {
         ALOGE("SecureElement:%s Failed to reset and get ATR: %s\n", __func__, strerror(errno));
     }
+
+    return n;
 }
 
 sp<V1_0::ISecureElementHalCallback> SecureElement::internalClientCallback = nullptr;
+sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
     //struct settings *settings;
@@ -93,19 +97,21 @@
         return EXIT_FAILURE;
     }
 
-    resetSE();
+    if( resetSE() < 0) return EXIT_FAILURE;
 
     checkSeUp = true;
     turnOffSE = false;
 
-    internalClientCallback->onStateChange(true);
+
+    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+    else internalClientCallback->onStateChange(true);
+
     turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
 }
 
-// Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
 Return<void> SecureElement::init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) {
 
     ALOGD("SecureElement:%s start", __func__);
@@ -114,6 +120,7 @@
         return Void();
     } else {
         internalClientCallback = clientCallback;
+        internalClientCallback_v1_1 = nullptr;
         if (!internalClientCallback->linkToDeath(this, 0)) {
             ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
         }
@@ -133,8 +140,37 @@
     return Void();
 }
 
+Return<void> SecureElement::init_1_1(const sp<::android::hardware::secure_element::V1_1::ISecureElementHalCallback>& clientCallback) {
+
+    ALOGD("SecureElement:%s start", __func__);
+    if (clientCallback == nullptr) {
+        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        return Void();
+    } else {
+        internalClientCallback = nullptr;
+        internalClientCallback_v1_1 = clientCallback;
+        if (!internalClientCallback_v1_1->linkToDeath(this, 0)) {
+            ALOGE("SecureElement:%s: linkToDeath Failed", __func__);
+        }
+    }
+
+    if (initializeSE() != EXIT_SUCCESS) {
+        ALOGE("SecureElement:%s initializeSE Failed", __func__);
+        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        return Void();
+    }
+
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    ALOGD("SecureElement:%s end", __func__);
+
+    return Void();
+}
+
 Return<void> SecureElement::getAtr(getAtr_cb _hidl_cb) {
     hidl_vec<uint8_t> response;
+    response.resize(atr_size);
     memcpy(&response[0], atr, atr_size);
     _hidl_cb(response);
     return Void();
@@ -178,8 +214,8 @@
         ALOGE("SecureElement:%s: transmit failed! No channel is open", __func__);
     }
     _hidl_cb(result);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -234,8 +270,8 @@
         }
         mSecureElementStatus = SecureElementStatus::IOERROR;
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     } else if (resp[resp_len - 2] == 0x90 && resp[resp_len - 1] == 0x00) {
@@ -251,14 +287,14 @@
             mSecureElementStatus = SecureElementStatus::IOERROR;
         }
         ALOGD("SecureElement:%s Free memory after manage channel after ERROR", __func__);
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
         _hidl_cb(resApduBuff, mSecureElementStatus);
         return Void();
     }
 
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     ALOGD("SecureElement:%s Free memory after manage channel", __func__);
     ALOGD("SecureElement:%s mSecureElementStatus = %d", __func__, (int)mSecureElementStatus);
 
@@ -326,8 +362,8 @@
     _hidl_cb(resApduBuff, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after selectApdu", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -402,8 +438,8 @@
     _hidl_cb(result, mSecureElementStatus);
 
     ALOGD("SecureElement:%s Free memory after openBasicChannel", __func__);
-    free(apdu);
-    free(resp);
+    if(apdu) free(apdu);
+    if(resp) free(resp);
     return Void();
 }
 
@@ -450,8 +486,8 @@
         } else {
             mSecureElementStatus = SecureElementStatus::FAILED;
         }
-        free(apdu);
-        free(resp);
+        if(apdu) free(apdu);
+        if(resp) free(resp);
     }
 
     if (nbrOpenChannel == 0 && isBasicChannelOpen == false) {
@@ -470,24 +506,30 @@
     const uint8_t *s = p;
     char *msg;
     int len = 0;
-	int input_len = n;
+    int input_len = n;
 
-    msg = (char*) malloc ( 100000 * sizeof(char));
+    msg = (char*) malloc ( (pf ? strlen(pf) : 0) + input_len * 3 + 1);
+    if(!msg) {
+        errno = ENOMEM;
+        return;
+    }
 
     if (pf) {
         len += sprintf(msg , "%s" , pf);
         //len = len + 8;
     }
-    while (n--) {
+    while (input_len--) {
         len += sprintf(msg + len, "%02X" , *s++);
         //len = len + 2;
-        if (n && sep) {
+        if (input_len && sep) {
             len += sprintf(msg + len, ":");
             //len++;
         }
     }
     sprintf(msg + len, "\n");
-    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, input_len, msg);
+    ALOGD("SecureElement:%s ==> size = %d data = %s", __func__, n, msg);
+
+    if(msg) free(msg);
 }
 
 int
@@ -577,12 +619,14 @@
     f = fopen(filename, "r");
     if (f) {
         r = parseConfigFile(f, verbose);
-        if (r == -1)
+        if (r == -1) {
             perror(filename);
             ALOGE("SecureElement:%s Error parse %s Failed", __func__, filename);
-        if (fclose(f) != 0)
+        }
+        if (fclose(f) != 0) {
             r = -1;
             ALOGE("SecureElement:%s Error close %s Failed", __func__, filename);
+        }
     } else {
         r = -1;
         ALOGE("SecureElement:%s Error open %s Failed", __func__, filename);
@@ -598,6 +642,11 @@
   }
   if (internalClientCallback != nullptr) {
     internalClientCallback->unlinkToDeath(this);
+    internalClientCallback = nullptr;
+  }
+  if (internalClientCallback_v1_1 != nullptr) {
+    internalClientCallback_v1_1->unlinkToDeath(this);
+    internalClientCallback_v1_1 = nullptr;
   }
 }
 
@@ -611,11 +660,13 @@
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
         } else {
+            ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
             isBasicChannelOpen = false;
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
+        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -625,6 +676,24 @@
     return mSecureElementStatus;
 }
 
+Return<::android::hardware::secure_element::V1_0::SecureElementStatus>
+SecureElement::reset() {
+
+    SecureElementStatus status = SecureElementStatus::FAILED;
+
+    ALOGD("SecureElement:%s start", __func__);
+    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
+        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+    }
+    if(initializeSE() == EXIT_SUCCESS) {
+        status = SecureElementStatus::SUCCESS;
+    }
+	
+    ALOGD("SecureElement:%s end", __func__);
+
+    return status;
+}
+
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
 //ISecureElement* HIDL_FETCH_ISecureElement(const char* /* name */) {
@@ -632,7 +701,7 @@
 //}
 //
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_2
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
diff --git a/SecureElement.h b/secure_element/1.2/SecureElement.h
similarity index 74%
copy from SecureElement.h
copy to secure_element/1.2/SecureElement.h
index ca55916..9f03d39 100644
--- a/SecureElement.h
+++ b/secure_element/1.2/SecureElement.h
@@ -10,17 +10,18 @@
  * See the License for the specific language governing permissions and limitations under the License.
 
  ****************************************************************************/
-#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
-#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#ifndef ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
+#define ANDROID_HARDWARE_SECURE_ELEMENT_V1_1_SECUREELEMENT_H
 
-#include <android/hardware/secure_element/1.0/ISecureElement.h>
+#include <android/hardware/secure_element/1.0/types.h>
+#include <android/hardware/secure_element/1.2/ISecureElement.h>
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
 namespace android {
 namespace hardware {
 namespace secure_element {
-namespace V1_0 {
+namespace V1_2 {
 namespace implementation {
 
 using ::android::hardware::hidl_array;
@@ -30,21 +31,24 @@
 using ::android::hardware::Return;
 using ::android::hardware::Void;
 using ::android::sp;
+using ::android::hardware::secure_element::V1_0::LogicalChannelResponse;
+using ::android::hardware::secure_element::V1_0::SecureElementStatus;
+using ::android::hardware::secure_element::V1_2::ISecureElement;
 
 
 struct SecureElement : public ISecureElement , public hidl_death_recipient {
-    // Methods from ::android::hardware::secure_element::V1_0::ISecureElement follow.
     SecureElement();
-    Return<void> init(const sp<::android::hardware::secure_element::V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init(const sp<V1_0::ISecureElementHalCallback>& clientCallback) override;
+    Return<void> init_1_1(const sp<V1_1::ISecureElementHalCallback>& clientCallback) override;
     Return<void> openLogicalChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openLogicalChannel_cb _hidl_cb) override;
     Return<void> openBasicChannel(const hidl_vec<uint8_t>& aid, uint8_t p2, openBasicChannel_cb _hidl_cb) override;
     Return<void> getAtr(getAtr_cb _hidl_cb) override;
     Return<void> transmit(const hidl_vec<uint8_t>& data, transmit_cb _hidl_cb) override;
     Return<bool> isCardPresent() override;
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> closeChannel(uint8_t channelNumber) override;
+    Return<::android::hardware::secure_element::V1_0::SecureElementStatus> reset() override;
 
 
-    // Methods from ::android::hidl::base::V1_0::IBase follow.
     private:
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
@@ -53,26 +57,25 @@
     uint8_t atr[32];
     uint8_t atr_size;
     static sp<V1_0::ISecureElementHalCallback> internalClientCallback;
+    static sp<V1_1::ISecureElementHalCallback> internalClientCallback_v1_1;
     int initializeSE();
     Return<::android::hardware::secure_element::V1_0::SecureElementStatus> deinitializeSE();
     void serviceDied(uint64_t, const wp<IBase>&) override;
     static int run_apdu(struct se_gto_ctx *ctx, const uint8_t *apdu, uint8_t *resp, int n, int verbose);
     static int toint(char c);
     static void dump_bytes(const char *pf, char sep, const uint8_t *p, int n, FILE *out);
-    void resetSE();
+    int resetSE();
     int openConfigFile(int verbose);
     int parseConfigFile(FILE *f, int verbose);
     
 
 };
 
-// FIXME: most likely delete, this is only for passthrough implementations
-// extern "C" ISecureElement* HIDL_FETCH_ISecureElement(const char* name);
 
 }  // namespace implementation
-}  // namespace V1_0
+}  // namespace V1_2
 }  // namespace secure_element
 }  // namespace hardware
 }  // namespace android
 
-#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_0_SECUREELEMENT_H
+#endif  // ANDROID_HARDWARE_SECURE_ELEMENT_V1_2_SECUREELEMENT_H
diff --git a/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc b/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc
new file mode 100644
index 0000000..4a39a6a
--- /dev/null
+++ b/secure_element/1.2/android.hardware.secure_element@1.2-service-gto.rc
@@ -0,0 +1,4 @@
+service gto_secure_element_hal_service_1_2 /vendor/bin/hw/android.hardware.secure_element@1.2-service-gto
+    class hal
+    user secure_element
+    group secure_element
diff --git a/secure_element/Android.bp b/secure_element/Android.bp
new file mode 100644
index 0000000..3270488
--- /dev/null
+++ b/secure_element/Android.bp
@@ -0,0 +1,233 @@
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.0-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.0/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.0-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.0/android.hardware.secure_element@1.0-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.0/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+    ],
+}
+
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.1-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.1/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+	"android.hardware.secure_element@1.1",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.1-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.1/android.hardware.secure_element@1.1-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.1/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+	"android.hardware.secure_element@1.1",
+        "android.hardware.secure_element@1.1-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+    ],
+}
+
+cc_library_shared {
+    // FIXME: this should only be -impl for a passthrough hal.
+    // In most cases, to convert this to a binderized implementation, you should:
+    // - change '-impl' to '-service' here and make it a cc_binary instead of a
+    //   cc_library_shared.
+    // - add a *.rc file for this module.
+    // - delete HIDL_FETCH_I* functions.
+    // - call configureRpcThreadpool and registerAsService on the instance.
+    // You may also want to append '-impl/-service' with a specific identifier like
+    // '-vendor' or '-<hardware identifier>' etc to distinguish it.
+    name: "android.hardware.secure_element@1.2-impl-gto",
+    //relative_install_path: "hw",
+    // FIXME: this should be 'vendor: true' for modules that will eventually be
+    // on AOSP.
+    vendor: true,
+    srcs: [
+        "1.0/esehal/src/checksum.c",
+        "1.0/esehal/src/iso7816_t1.c",
+        "1.0/esehal/src/libse-gto.c",
+        "1.0/esehal/src/spi.c",
+        "1.0/esehal/src/transport.c",
+        "1.0/esehal/src/log.c",
+        "1.2/SecureElement.cpp",
+    ],
+
+    local_include_dirs: [
+        "1.0/esehal/src",
+    ],
+
+    cflags: [
+        "-DANDROID",
+        "-DENABLE_LOGGING=1",
+        "-DENABLE_DEBUG=1",
+        "-DBUILDCFG=1",
+        "-DNXP_EXTNS=TRUE",
+        "-Wno-unused-parameter",
+        "-Wno-unused-private-field",
+        "-Wno-error",
+        "-Wreturn-type",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+        "android.hardware.secure_element@1.0",
+	"android.hardware.secure_element@1.1",
+	"android.hardware.secure_element@1.2",
+    ],
+
+}
+
+cc_binary {
+    name: "android.hardware.secure_element@1.2-service-gto",
+    relative_install_path: "hw",
+    init_rc: ["1.2/android.hardware.secure_element@1.2-service-gto.rc"],
+    vendor: true,
+    defaults: ["hidl_defaults"],
+    srcs: [
+        "1.2/GtoService.cpp",
+    ],
+
+    shared_libs: [
+        "android.hardware.secure_element@1.0",
+        "android.hardware.secure_element@1.0-impl-gto",
+	"android.hardware.secure_element@1.1",
+        "android.hardware.secure_element@1.1-impl-gto",
+        "android.hardware.secure_element@1.2",
+        "android.hardware.secure_element@1.2-impl-gto",
+        "libbase",
+        "libcutils",
+        "libhardware",
+        "libhidlbase",
+        "liblog",
+        "libutils",
+    ],
+}