blob: 3fb8a724a024b1760ff4c2d8dfef79b7318528b2 [file] [log] [blame]
/******************************************************************************
*
* Copyright 2020-2021 NXP
*
* 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
*
* 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.
*
******************************************************************************/
#pragma once
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
#include <hardware/hardware.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <string.h>
#include "phNxpEse_Api.h"
using ::android::hardware::hidl_vec;
#define OSU_PROP_CLA 0x80
#define OSU_PROP_INS 0xDF
#define OSU_PROP_RST_P1 0xEF
#define ISO7816_BASIC_CHANNEL 0x00
#define ISO7816_CLA_OFFSET 0
#define ISO7816_INS_OFFSET 1
#define ISO7816_P1_OFFSET 2
#define ISO7816_P2_OFFSET 3
#define ISO7816_LC_OFFSET 4
#define ISO7816_EXTENDED_LC_VALUE 0
#define ISO7816_SHORT_APDU_HEADER 5
#define ISO7816_EXTENDED_APDU_HEADER 7
#define ISO7816_CLA_CHN_MASK 0x03
#define IS_OSU_MODE(...) (OsuHalExtn::getInstance().isOsuMode(__VA_ARGS__))
class OsuHalExtn {
public:
typedef enum {
NON_OSU_MODE, // Normal Mode : All HAL APIs allowed
OSU_PROP_MODE, // OSU mode : Only OSU JAR command allowed
OSU_GP_MODE, // OSU Mode : GP command in the OSU mode
OSU_RST_MODE, // OSU mode : Proprietary HARD reset
OSU_BLOCKED_MODE, // OSU mode : Command not allowed return error
} OsuApduMode;
typedef enum {
INIT,
OPENBASIC,
OPENLOGICAL,
GETATR,
TRANSMIT,
CLOSE,
} SecureElementAPI;
static OsuHalExtn& getInstance();
OsuApduMode isOsuMode(const hidl_vec<uint8_t>& evt, uint8_t type,
phNxpEse_data* pCmdData = nullptr);
bool isOsuMode(uint8_t type, uint8_t channel = 0xFF);
virtual ~OsuHalExtn();
OsuHalExtn() noexcept;
void checkAndUpdateOsuMode();
unsigned long int getOSUMaxWtxCount();
private:
bool isAppOSUMode;
bool isJcopOSUMode;
static const hidl_vec<uint8_t> osu_aid[10];
OsuApduMode checkTransmit(uint8_t* input, uint32_t* outLength,
const hidl_vec<uint8_t>& data);
bool isOsuMode();
};