1*4d7e907cSAndroid Build Coastguard Worker/* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Workerpackage [email protected]; 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Workerimport ISecureElementHalCallback; 20*4d7e907cSAndroid Build Coastguard Worker 21*4d7e907cSAndroid Build Coastguard Worker/** According to ISO/IEC 7816 */ 22*4d7e907cSAndroid Build Coastguard Workerinterface ISecureElement { 23*4d7e907cSAndroid Build Coastguard Worker /** 24*4d7e907cSAndroid Build Coastguard Worker * Initializes the Secure Element. This may include updating the applet 25*4d7e907cSAndroid Build Coastguard Worker * and/or vendor-specific initialization. 26*4d7e907cSAndroid Build Coastguard Worker * 27*4d7e907cSAndroid Build Coastguard Worker * HAL service must send onStateChange() with connected equal to true 28*4d7e907cSAndroid Build Coastguard Worker * after all the initialization has been successfully completed. 29*4d7e907cSAndroid Build Coastguard Worker * Clients must wait for a onStateChange(true) before opening channels. 30*4d7e907cSAndroid Build Coastguard Worker * 31*4d7e907cSAndroid Build Coastguard Worker * @param clientCallback callback used to sent status of the SE back to the 32*4d7e907cSAndroid Build Coastguard Worker * client 33*4d7e907cSAndroid Build Coastguard Worker */ 34*4d7e907cSAndroid Build Coastguard Worker init(ISecureElementHalCallback clientCallback); 35*4d7e907cSAndroid Build Coastguard Worker 36*4d7e907cSAndroid Build Coastguard Worker /** 37*4d7e907cSAndroid Build Coastguard Worker * Returns Answer to Reset as per ISO/IEC 7816 38*4d7e907cSAndroid Build Coastguard Worker * 39*4d7e907cSAndroid Build Coastguard Worker * @return response containing the response. Empty vector if Secure Element 40*4d7e907cSAndroid Build Coastguard Worker * doesn't support ATR. 41*4d7e907cSAndroid Build Coastguard Worker */ 42*4d7e907cSAndroid Build Coastguard Worker getAtr() generates (vec<uint8_t> response); 43*4d7e907cSAndroid Build Coastguard Worker 44*4d7e907cSAndroid Build Coastguard Worker /** 45*4d7e907cSAndroid Build Coastguard Worker * Returns the current state of the card. 46*4d7e907cSAndroid Build Coastguard Worker * 47*4d7e907cSAndroid Build Coastguard Worker * This is particularly useful for removable 48*4d7e907cSAndroid Build Coastguard Worker * Secure Elements like UICC, Secure Elements on SD cards etc. 49*4d7e907cSAndroid Build Coastguard Worker * 50*4d7e907cSAndroid Build Coastguard Worker * @return present true if present, false otherwise 51*4d7e907cSAndroid Build Coastguard Worker */ 52*4d7e907cSAndroid Build Coastguard Worker isCardPresent() generates (bool present); 53*4d7e907cSAndroid Build Coastguard Worker 54*4d7e907cSAndroid Build Coastguard Worker /** 55*4d7e907cSAndroid Build Coastguard Worker * Transmits an APDU command (as per ISO/IEC 7816) to the SE. 56*4d7e907cSAndroid Build Coastguard Worker * 57*4d7e907cSAndroid Build Coastguard Worker * @param data APDU command to be sent 58*4d7e907cSAndroid Build Coastguard Worker * @return response to the command. In case of error in communicating with 59*4d7e907cSAndroid Build Coastguard Worker * the secure element, an empty vector is returned. 60*4d7e907cSAndroid Build Coastguard Worker */ 61*4d7e907cSAndroid Build Coastguard Worker transmit(vec<uint8_t> data) generates (vec<uint8_t> response); 62*4d7e907cSAndroid Build Coastguard Worker 63*4d7e907cSAndroid Build Coastguard Worker /** 64*4d7e907cSAndroid Build Coastguard Worker * Opens a logical channel with the Secure Element, selecting the applet 65*4d7e907cSAndroid Build Coastguard Worker * represented by the Application ID (AID). 66*4d7e907cSAndroid Build Coastguard Worker * 67*4d7e907cSAndroid Build Coastguard Worker * @param aid AID to uniquely identify the applet on the Secure Element 68*4d7e907cSAndroid Build Coastguard Worker * @param p2 P2 paramter of SELECT APDU as per ISO 7816-4 69*4d7e907cSAndroid Build Coastguard Worker * @return status SecureElementStatus::SUCCESS on success, 70*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::CHANNEL_NOT_AVAILABLE if secure 71*4d7e907cSAndroid Build Coastguard Worker * element has reached the maximum limit on the number of 72*4d7e907cSAndroid Build Coastguard Worker * channels it can support, 73*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::NO_SUCH_ELEMENT_ERROR if AID provided 74*4d7e907cSAndroid Build Coastguard Worker * doesn't match any applet on the secure element and 75*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::UNSUPPORTED_OPERATION if operation 76*4d7e907cSAndroid Build Coastguard Worker * provided by the P2 parameter is not permitted by the 77*4d7e907cSAndroid Build Coastguard Worker * applet. 78*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::IOERROR if there was an error 79*4d7e907cSAndroid Build Coastguard Worker * communicating with the Secure Element. 80*4d7e907cSAndroid Build Coastguard Worker * @return response On success, response to SELECT command is returned 81*4d7e907cSAndroid Build Coastguard Worker * empty vector on failure. 82*4d7e907cSAndroid Build Coastguard Worker */ 83*4d7e907cSAndroid Build Coastguard Worker openLogicalChannel(vec<uint8_t> aid, uint8_t p2) 84*4d7e907cSAndroid Build Coastguard Worker generates (LogicalChannelResponse response, SecureElementStatus status); 85*4d7e907cSAndroid Build Coastguard Worker 86*4d7e907cSAndroid Build Coastguard Worker 87*4d7e907cSAndroid Build Coastguard Worker /** 88*4d7e907cSAndroid Build Coastguard Worker * Opens a basic channel with the Secure Element, selecting the applet 89*4d7e907cSAndroid Build Coastguard Worker * represented by the Application ID (AID). 90*4d7e907cSAndroid Build Coastguard Worker * 91*4d7e907cSAndroid Build Coastguard Worker * @param aid AID to uniquely identify the applet on the Secure Element 92*4d7e907cSAndroid Build Coastguard Worker * @param p2 P2 paramter of SELECT APDU as per ISO 7816-4 93*4d7e907cSAndroid Build Coastguard Worker * @return status SecureElementStatus::SUCCESS on success, 94*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::CHANNEL_NOT_AVAILABLE if secure 95*4d7e907cSAndroid Build Coastguard Worker * element has reached the maximum limit on the number of 96*4d7e907cSAndroid Build Coastguard Worker * channels it can support, 97*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::NO_SUCH_ELEMENT_ERROR if AID provided 98*4d7e907cSAndroid Build Coastguard Worker * doesn't match any applet on the secure element and 99*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::UNSUPPORTED_OPERATION if operation 100*4d7e907cSAndroid Build Coastguard Worker * provided by the P2 parameter is not permitted by the 101*4d7e907cSAndroid Build Coastguard Worker * applet. 102*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::IOERROR if there was an error 103*4d7e907cSAndroid Build Coastguard Worker * communicating with the Secure Element. 104*4d7e907cSAndroid Build Coastguard Worker * @return selectResponse On success, response to SELECT command is returned 105*4d7e907cSAndroid Build Coastguard Worker * empty vector on failure. 106*4d7e907cSAndroid Build Coastguard Worker */ 107*4d7e907cSAndroid Build Coastguard Worker openBasicChannel(vec<uint8_t> aid, uint8_t p2) 108*4d7e907cSAndroid Build Coastguard Worker generates (vec<uint8_t> selectResponse, SecureElementStatus status); 109*4d7e907cSAndroid Build Coastguard Worker 110*4d7e907cSAndroid Build Coastguard Worker /** 111*4d7e907cSAndroid Build Coastguard Worker * Closes the channel indicated by the channelNumber. 112*4d7e907cSAndroid Build Coastguard Worker * 113*4d7e907cSAndroid Build Coastguard Worker * Closing a basic channel, i.e with channelNumber 0 must return 114*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::FAILED. 115*4d7e907cSAndroid Build Coastguard Worker * 116*4d7e907cSAndroid Build Coastguard Worker * @param channelNumber to be closed 117*4d7e907cSAndroid Build Coastguard Worker * @return status SecureElementStatus::SUCCESS on success and 118*4d7e907cSAndroid Build Coastguard Worker * SecureElementStatus::FAILED on error. 119*4d7e907cSAndroid Build Coastguard Worker */ 120*4d7e907cSAndroid Build Coastguard Worker closeChannel(uint8_t channelNumber) generates (SecureElementStatus status); 121*4d7e907cSAndroid Build Coastguard Worker}; 122