Home | History | Annotate | Download | only in adaptation
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  * Construct a buffer that contains multiple Type-Length-Value contents
     21  * that is used by the HAL in a CORE_SET_CONFIG NCI command.
     22  ******************************************************************************/
     23 
     24 #define LOG_TAG "NfcNciHal"
     25 #include "StartupConfig.h"
     26 #include "_OverrideLog.h"
     27 
     28 const uint8_t StartupConfig::mMaxLength = 255;
     29 
     30 /*******************************************************************************
     31 **
     32 ** Function:        initialize
     33 **
     34 ** Description:     Initialize all member variables.
     35 **
     36 ** Returns:         None
     37 **
     38 *******************************************************************************/
     39 StartupConfig::StartupConfig() {
     40   // set first byte to 0, which is length of payload
     41   mBuffer.append((uint8_string::size_type)1, (uint8_string::value_type)0);
     42 }
     43 
     44 /*******************************************************************************
     45 **
     46 ** Function:        initialize
     47 **
     48 ** Description:     Reset all member variables.
     49 **
     50 ** Returns:         None
     51 **
     52 *******************************************************************************/
     53 void StartupConfig::initialize() {
     54   mBuffer.clear();
     55   // set first byte to 0, which is length of payload
     56   mBuffer.append((uint8_string::size_type)1, (uint8_string::value_type)0);
     57 }
     58 
     59 /*******************************************************************************
     60 **
     61 ** Function:        getInternalBuffer
     62 **
     63 ** Description:     Get the pointer to buffer that contains multiple
     64 **                  Type-Length-Value contents.
     65 **
     66 ** Returns:         Pointer to buffer.
     67 **
     68 *******************************************************************************/
     69 const uint8_t* StartupConfig::getInternalBuffer() { return mBuffer.data(); }
     70 
     71 /*******************************************************************************
     72 **
     73 ** Function:        append
     74 **
     75 ** Description:     Append new config data to internal buffer.
     76 **                  newContent: buffer containing new content; newContent[0] is
     77 **                          payload length; newContent[1..end] is payload.
     78 **                  newContentLen: total length of newContent.
     79 **
     80 ** Returns:         True if ok.
     81 **
     82 *******************************************************************************/
     83 bool StartupConfig::append(const uint8_t* newContent, uint8_t newContentLen) {
     84   static const char fn[] = "StartupConfig::append";
     85   if ((newContentLen + mBuffer.size()) > mMaxLength) {
     86     ALOGE("%s: exceed max length", fn);
     87     return false;
     88   }
     89 
     90   ALOGD("%s: try append %zu bytes", fn,
     91         (uint8_string::size_type)(newContentLen));
     92   // append new payload into private buffer
     93   mBuffer.append(newContent + 1, (uint8_string::size_type)(newContentLen - 1));
     94   // increase size counter of payload in private buffer
     95   mBuffer[0] = mBuffer[0] + newContentLen - 1;
     96   ALOGD("%s: new size %u bytes", fn, mBuffer[0]);
     97   return true;
     98 };
     99 
    100 /*******************************************************************************
    101 **
    102 ** Function:        disableSecureElement
    103 **
    104 ** Description:     Adjust a TLV to disable secure element(s).  The TLV's type
    105 *is 0xC2.
    106 **                  bitmask: 0xC0 = do not detect any secure element.
    107 **                           0x40 = do not detect secure element in slot 0.
    108 **                           0x80 = do not detect secure element in slot 1.
    109 **
    110 ** Returns:         True if ok.
    111 **
    112 *******************************************************************************/
    113 bool StartupConfig::disableSecureElement(uint8_t bitmask) {
    114   const uint8_t maxLen = mBuffer[0];
    115   uint8_t index = 1, tlvType = 0, tlvLen = 0;
    116   bool found0xC2 = false;
    117 
    118   while (true) {
    119     if (index > maxLen) break;
    120     tlvType = mBuffer[index];
    121     index++;
    122     tlvLen = mBuffer[index];
    123     index++;
    124     if (tlvType == 0xC2)  // this TLV controls secure elements
    125     {
    126       index++;  // index of second byte in TLV's value
    127       mBuffer[index] = mBuffer[index] | bitmask;  // turn on certain bits
    128       found0xC2 = true;
    129     } else
    130       index += tlvLen;
    131   }
    132 
    133   if (found0xC2 == false) {
    134     uint8_t tlv[] = {0x04, 0xC2, 0x02, 0x61, 0x00};
    135     tlv[4] = tlv[4] | bitmask;
    136     found0xC2 = append(tlv, 5);
    137   }
    138   return found0xC2;
    139 }
    140