From 8a16e761699cb054513b0d86c407debef6bd5353 Mon Sep 17 00:00:00 2001 From: arunvoddu Date: Wed, 23 Mar 2022 14:56:17 +0000 Subject: Get and Set the TPMR value to EF_SMSS field in ISIM/USIM Bug: 226337641 Test: Atest verified Merged-In: I7fa09707595877f3edd6619ed875020e4e39f263 Change-Id: I7fa09707595877f3edd6619ed875020e4e39f263 --- .../internal/telephony/uicc/IccConstants.java | 1 + .../internal/telephony/uicc/IccRecords.java | 108 ++++++++++++++++++++- .../internal/telephony/uicc/IsimFileHandler.java | 1 + .../internal/telephony/uicc/IsimUiccRecords.java | 30 +++++- .../internal/telephony/uicc/SIMRecords.java | 31 +++++- .../internal/telephony/uicc/UsimFileHandler.java | 1 + 6 files changed, 163 insertions(+), 9 deletions(-) (limited to 'src/java/com/android/internal/telephony/uicc') diff --git a/src/java/com/android/internal/telephony/uicc/IccConstants.java b/src/java/com/android/internal/telephony/uicc/IccConstants.java index 5349f3999f..a9275bedd0 100644 --- a/src/java/com/android/internal/telephony/uicc/IccConstants.java +++ b/src/java/com/android/internal/telephony/uicc/IccConstants.java @@ -46,6 +46,7 @@ public interface IccConstants { static final int EF_CFIS = 0x6FCB; static final int EF_IMG = 0x4F20; static final int EF_PSISMSC = 0x6FE5; + static final int EF_SMSS = 0x6F43; // USIM SIM file ids from TS 131.102 public static final int EF_PBR = 0x4F30; diff --git a/src/java/com/android/internal/telephony/uicc/IccRecords.java b/src/java/com/android/internal/telephony/uicc/IccRecords.java index a35bb6bb1e..da112b166e 100644 --- a/src/java/com/android/internal/telephony/uicc/IccRecords.java +++ b/src/java/com/android/internal/telephony/uicc/IccRecords.java @@ -30,6 +30,7 @@ import android.telephony.CellIdentity; import android.telephony.SubscriptionInfo; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; @@ -40,6 +41,7 @@ import com.android.internal.telephony.util.ArrayUtils; import com.android.telephony.Rlog; import java.io.FileDescriptor; +import java.io.FileNotFoundException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.lang.annotation.Retention; @@ -55,8 +57,11 @@ import java.util.concurrent.atomic.AtomicInteger; * {@hide} */ public abstract class IccRecords extends Handler implements IccConstants { + private static final String LOG_TAG = "IccRecords"; protected static final boolean DBG = true; - protected static final boolean VDBG = false; // STOPSHIP if true + private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */ + protected static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING || + Rlog.isLoggable(LOG_TAG, Log.VERBOSE); public static final int PLMN_MIN_LENGTH = CellIdentity.MCC_LENGTH + CellIdentity.MNC_MIN_LENGTH; @@ -121,6 +126,10 @@ public abstract class IccRecords extends Handler implements IccConstants { protected boolean mRecordsRequested = false; // true if we've made requests for the sim records protected int mLockedRecordsReqReason = LOCKED_RECORDS_REQ_REASON_NONE; + // EF_SMSS fields tpmr invalid, min and max declarations + protected static final int SMSS_INVALID_TPMR = -1; + private static final int TPMR_MIN = 0x00; + private static final int TPMR_MAX = 0xFF; @VisibleForTesting(visibility = VisibleForTesting.Visibility.PROTECTED) public String mIccId; // Includes only decimals (no hex) @@ -179,6 +188,10 @@ public abstract class IccRecords extends Handler implements IccConstants { // Reference: TS 31.102 section 4.5.9 protected String mPsiSmsc; + // EF_SMSS value which is combination of TPMR and Memory exceed flag + // Reference: TS 31.102 section 4.2.9 + protected byte[] mSmssValues; + CarrierTestOverride mCarrierTestOverride; //Arbitrary offset for the Handler @@ -240,6 +253,10 @@ public abstract class IccRecords extends Handler implements IccConstants { // TAG value to retrieve EF_PSISMSC from parsed SimTlv object private static final int TAG_TLV_USIM_VALUE_80 = 0x80; + + // call back received on this upon EF_SMSS record update. + public static final int EVENT_SET_SMSS_RECORD_DONE = 201; + /** * There are two purposes for this class. First, each instance of AuthAsyncResponse acts as a * lock to for calling thead to wait in getIccSimChallengeResponse(). Second, pass the IMS @@ -962,6 +979,26 @@ public abstract class IccRecords extends Handler implements IccConstants { } break; + case EVENT_SET_SMSS_RECORD_DONE: + ar = (AsyncResult) msg.obj; + SmssRecord smssRecord = null; + if (ar.userObj != null) { + smssRecord = (SmssRecord) ar.userObj; + } + if (ar.exception == null && smssRecord.getSmssValue() != null) { + mSmssValues = smssRecord.getSmssValue().clone(); + } else { + loge("SIM EF_SMSS field updating error=" + ar.exception); + } + if (smssRecord != null && smssRecord.getMessage() != null) { + Message message = smssRecord.getMessage(); + AsyncResult.forMessage(message, ar.result, ar.exception); + message.sendToTarget(); + } else { + loge("smssRecord or smssRecord.getMessage() object is null"); + } + break; + default: super.handleMessage(msg); } @@ -1568,4 +1605,73 @@ public abstract class IccRecords extends Handler implements IccConstants { return "{fullName = " + fullName + ", shortName = " + shortName + "}"; } } + + /** + * Sets the elementary (EF_SMSS) field with latest last used TP-Message reference value. + * First byte of EF_SMSS represents the TPMR value as per the spec + * (Section 4.2.9 of 3GPP TS 31.102) + * + * @param tpmr: Last used TP-Message reference parameter of type int + * @param onComplete: android.os.Message to be notified upon completion + */ + public void setSmssTpmrValue(int tpmr, Message onComplete) { + if(VDBG) log("setSmssTpmrValue()"); + if (mSmssValues != null && mSmssValues.length > 0 && tpmr >= TPMR_MIN && tpmr <= TPMR_MAX) { + byte[] tempSmss = mSmssValues.clone(); + tempSmss[0] = (byte) (tpmr & 0xFF); + SmssRecord smssRecord = createSmssRecord(onComplete, tempSmss); + mFh.updateEFTransparent(IccConstants.EF_SMSS, tempSmss, + obtainMessage(EVENT_SET_SMSS_RECORD_DONE, smssRecord)); + } else if (onComplete != null) { + loge("Failed to set EF_SMSS [TPMR] field to SIM"); + if (mSmssValues == null || mSmssValues.length <= 0) { + AsyncResult.forMessage((onComplete)).exception = + new FileNotFoundException("EF_SMSS file not found"); + } else if (tpmr < TPMR_MIN || tpmr > TPMR_MAX) { + AsyncResult.forMessage((onComplete)).exception = + new IllegalArgumentException("TPMR value is not in allowed range"); + } + onComplete.sendToTarget(); + } + } + + /** + * Fetches the last used TPMR value from elementary (EF_SMSS) field. First byte of EF_SMSS + * represents the TPMR value as per the spec (Section 4.2.9 of 3GPP TS 31.102) + * + * @return TP-Message reference parameter of type int, -1 in case if it fails to read the + * EF_SMSS field from the sim. + */ + public int getSmssTpmrValue() { + if (mSmssValues != null && mSmssValues.length > 0) { + return (mSmssValues[0] & 0xFF); + } + loge("IccRecords - EF_SMSS is null"); + return SMSS_INVALID_TPMR; + } + + @VisibleForTesting + public SmssRecord createSmssRecord(Message msg, byte[] smss) { + return new SmssRecord(msg, smss); + } + + + static class SmssRecord { + + private Message mMsg; + private byte[] mSmss; + + SmssRecord (Message msg, byte[] smss) { + mMsg = msg; + mSmss = smss; + } + + private byte[] getSmssValue() { + return mSmss; + } + + private Message getMessage() { + return mMsg; + } + } } diff --git a/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java b/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java index fe900cb387..4d5f8d156f 100644 --- a/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java +++ b/src/java/com/android/internal/telephony/uicc/IsimFileHandler.java @@ -38,6 +38,7 @@ public final class IsimFileHandler extends IccFileHandler implements IccConstant case EF_DOMAIN: case EF_IST: case EF_PCSCF: + case EF_SMSS: return MF_SIM + DF_ADF; } String path = getCommonIccEFPath(efid); diff --git a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java index 06525349aa..f9b51cf819 100644 --- a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java +++ b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java @@ -23,6 +23,7 @@ import android.os.AsyncResult; import android.os.Build; import android.os.Message; import android.telephony.SubscriptionManager; +import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.CommandsInterface; @@ -42,7 +43,9 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { protected static final String LOG_TAG = "IsimUiccRecords"; private static final boolean DBG = true; - private static final boolean VDBG = false; // STOPSHIP if true + private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */ + private static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING || + Rlog.isLoggable(LOG_TAG, Log.VERBOSE); private static final boolean DUMP_RECORDS = false; // Note: PII is logged when this is true // STOPSHIP if true public static final String INTENT_ISIM_REFRESH = "com.android.intent.isim_refresh"; @@ -71,7 +74,8 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { + " mIsimImpu=" + Arrays.toString(mIsimImpu) + " mIsimIst=" + mIsimIst + " mIsimPcscf=" + Arrays.toString(mIsimPcscf) - + " mPsiSmsc=" + mPsiSmsc) : ""); + + " mPsiSmsc=" + mPsiSmsc + + " mSmss TPMR=" + getSmssTpmrValue()) : ""); } public IsimUiccRecords(UiccCardApplication app, Context c, CommandsInterface ci) { @@ -113,7 +117,6 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { broadcastRefresh(); super.handleMessage(msg); break; - default: super.handleMessage(msg); // IccRecords handles generic record load responses @@ -145,6 +148,9 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { mFh.loadEFLinearFixedAll(EF_PCSCF, obtainMessage( IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimPcscfLoaded())); mRecordsToLoad++; + mFh.loadEFTransparent(EF_SMSS, obtainMessage( + IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimSmssLoaded())); + mRecordsToLoad++; mFh.loadEFLinearFixed(EF_PSISMSC, 1, obtainMessage( IccRecords.EVENT_GET_ICC_RECORD_DONE, new EfIsimPsiSmscLoaded())); @@ -218,6 +224,23 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { if (DUMP_RECORDS) log("EF_IST=" + mIsimIst); } } + + private class EfIsimSmssLoaded implements IccRecords.IccRecordLoaded { + + @Override + public String getEfName() { + return "EF_ISIM_SMSS"; + } + + @Override + public void onRecordLoaded(AsyncResult ar) { + mSmssValues = (byte[]) ar.result; + if (VDBG) { + log("IsimUiccRecords - EF_SMSS TPMR value = " + getSmssTpmrValue()); + } + } + } + private class EfIsimPcscfLoaded implements IccRecords.IccRecordLoaded { public String getEfName() { return "EF_ISIM_PCSCF"; @@ -468,6 +491,7 @@ public class IsimUiccRecords extends IccRecords implements IsimRecords { pw.println(" mIsimIst" + mIsimIst); pw.println(" mIsimPcscf" + Arrays.toString(mIsimPcscf)); pw.println(" mPsismsc=" + mPsiSmsc); + pw.println(" mSmss TPMR=" + getSmssTpmrValue()); } pw.flush(); } diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java index 533e044766..04c64a2c38 100644 --- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java +++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java @@ -31,6 +31,7 @@ import android.telephony.PhoneNumberUtils; import android.telephony.SmsMessage; import android.telephony.SubscriptionInfo; import android.text.TextUtils; +import android.util.Log; import android.util.Pair; import com.android.internal.telephony.CommandsInterface; @@ -54,8 +55,9 @@ public class SIMRecords extends IccRecords { protected static final String LOG_TAG = "SIMRecords"; private static final boolean CRASH_RIL = false; - - private static final boolean VDBG = false; + private static final boolean FORCE_VERBOSE_STATE_LOGGING = false; /* stopship if true */ + private static final boolean VDBG = FORCE_VERBOSE_STATE_LOGGING || + Rlog.isLoggable(LOG_TAG, Log.VERBOSE); // ***** Instance Variables @@ -109,7 +111,8 @@ public class SIMRecords extends IccRecords { + " mEfCff=" + IccUtils.bytesToHexString(mEfCff) + " mEfCfis=" + IccUtils.bytesToHexString(mEfCfis) + " getOperatorNumeric=" + getOperatorNumeric() - + " mPsiSmsc=" + mPsiSmsc; + + " mPsiSmsc=" + mPsiSmsc + + " TPMR=" + getSmssTpmrValue(); } // ***** Constants @@ -185,7 +188,9 @@ public class SIMRecords extends IccRecords { private static final int EVENT_GET_FPLMN_DONE = 41 + SIM_RECORD_EVENT_BASE; private static final int EVENT_GET_FPLMN_SIZE_DONE = 42 + SIM_RECORD_EVENT_BASE; private static final int EVENT_SET_FPLMN_DONE = 43 + SIM_RECORD_EVENT_BASE; + protected static final int EVENT_GET_SMSS_RECORD_DONE = 46 + SIM_RECORD_EVENT_BASE; protected static final int EVENT_GET_PSISMSC_DONE = 47 + SIM_RECORD_EVENT_BASE; + // ***** Constructor public SIMRecords(UiccCardApplication app, Context c, CommandsInterface ci) { @@ -641,7 +646,6 @@ public class SIMRecords extends IccRecords { " while being destroyed. Ignoring."); return; } - try { switch (msg.what) { /* IO events */ @@ -1297,7 +1301,7 @@ public class SIMRecords extends IccRecords { isRecordLoadResponse = true; ar = (AsyncResult) msg.obj; if (ar.exception != null) { - loge("Failed to read USIM EF_SMSS field error=" + ar.exception); + loge("Failed to read USIM EF_PSISMSC field error=" + ar.exception); } else { data = (byte[]) ar.result; if (data != null && data.length > 0) { @@ -1309,6 +1313,19 @@ public class SIMRecords extends IccRecords { } break; + case EVENT_GET_SMSS_RECORD_DONE: + isRecordLoadResponse = true; + ar = (AsyncResult) msg.obj; + if (ar.exception != null) { + loge("Failed to read USIM EF_SMSS field error=" + ar.exception); + } else { + mSmssValues = (byte[]) ar.result; + if (VDBG) { + log("SIMRecords - EF_SMSS TPMR value = " + getSmssTpmrValue()); + } + } + break; + default: super.handleMessage(msg); // IccRecords handles generic record load responses } @@ -1707,6 +1724,9 @@ public class SIMRecords extends IccRecords { mRecordsToLoad++; } + mFh.loadEFTransparent(EF_SMSS, obtainMessage(EVENT_GET_SMSS_RECORD_DONE)); + mRecordsToLoad++; + if (CRASH_RIL) { String sms = "0107912160130310f20404d0110041007030208054832b0120" + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" @@ -2166,6 +2186,7 @@ public class SIMRecords extends IccRecords { pw.println(" mFplmns[]=" + Arrays.toString(mFplmns)); pw.println(" mEhplmns[]=" + Arrays.toString(mEhplmns)); pw.println(" mPsismsc=" + mPsiSmsc); + pw.println(" TPMR=" + getSmssTpmrValue()); pw.flush(); } } diff --git a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java index ff8d63d5c1..bc46f800a2 100755 --- a/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java +++ b/src/java/com/android/internal/telephony/uicc/UsimFileHandler.java @@ -68,6 +68,7 @@ public final class UsimFileHandler extends IccFileHandler implements IccConstant case EF_FPLMN: case EF_LRPLMNSI: case EF_HPPLMN: + case EF_SMSS: return MF_SIM + DF_ADF; case EF_PBR: -- cgit v1.2.3