summaryrefslogtreecommitdiff
path: root/src/com/android/se/Terminal.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/se/Terminal.java')
-rwxr-xr-xsrc/com/android/se/Terminal.java68
1 files changed, 57 insertions, 11 deletions
diff --git a/src/com/android/se/Terminal.java b/src/com/android/se/Terminal.java
index ba8b69e..92dcec3 100755
--- a/src/com/android/se/Terminal.java
+++ b/src/com/android/se/Terminal.java
@@ -43,7 +43,9 @@
package com.android.se;
import android.content.Context;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.hardware.secure_element.V1_0.ISecureElement;
import android.hardware.secure_element.V1_0.ISecureElementHalCallback;
import android.hardware.secure_element.V1_0.LogicalChannelResponse;
@@ -457,17 +459,19 @@ public class Terminal {
throw new IOException("Secure Element is not connected");
}
- Log.w(mTag, "Enable access control on basic channel for " + packageName);
- StatsLog.write(
- StatsLog.SE_OMAPI_REPORTED,
- StatsLog.SE_OMAPI_REPORTED__OPERATION__OPEN_CHANNEL,
- mName,
- packageName);
- ChannelAccess channelAccess;
- try {
- channelAccess = setUpChannelAccess(aid, packageName, pid);
- } catch (MissingResourceException e) {
- return null;
+ ChannelAccess channelAccess = null;
+ if (packageName != null) {
+ Log.w(mTag, "Enable access control on basic channel for " + packageName);
+ StatsLog.write(
+ StatsLog.SE_OMAPI_REPORTED,
+ StatsLog.SE_OMAPI_REPORTED__OPERATION__OPEN_CHANNEL,
+ mName,
+ packageName);
+ try {
+ channelAccess = setUpChannelAccess(aid, packageName, pid);
+ } catch (MissingResourceException e) {
+ return null;
+ }
}
synchronized (mLock) {
@@ -771,6 +775,9 @@ public class Terminal {
if (isPrivilegedApplication(packageName)) {
return ChannelAccess.getPrivilegeAccess(packageName, pid);
+ } else if (getName().startsWith(SecureElementService.UICC_TERMINAL)
+ && isCarrierPrivilegeApplication(packageName)) {
+ return ChannelAccess.getCarrierPrivilegeAccess(packageName, pid);
}
synchronized (mLock) {
@@ -830,6 +837,45 @@ public class Terminal {
return mContext;
}
+ /**
+ * Checks if Carrier Privilege exists for the given package
+ */
+ private boolean isCarrierPrivilegeApplication(String packageName) {
+ try {
+ PackageManager pm = mContext.getPackageManager();
+ if (pm != null) {
+ PackageInfo pkgInfo = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
+ return checkCarrierPrivilegeRules(pkgInfo);
+ }
+ } catch (NameNotFoundException ne) { }
+ return false;
+ }
+
+ /**
+ * Checks if Carrier Privilege exists for the given package
+ */
+ public boolean checkCarrierPrivilegeRules(PackageInfo pInfo) {
+ boolean checkRefreshTag = true;
+ if (mAccessControlEnforcer == null || mAccessControlEnforcer.isNoRuleFound()) {
+ try {
+ initializeAccessControl();
+ } catch (IOException e) {
+ return false;
+ }
+ checkRefreshTag = false;
+ }
+ mAccessControlEnforcer.setPackageManager(mContext.getPackageManager());
+
+ synchronized (mLock) {
+ try {
+ return mAccessControlEnforcer.checkCarrierPrivilege(pInfo, checkRefreshTag);
+ } catch (Exception e) {
+ Log.i(mTag, "checkCarrierPrivilege() Exception: " + e.getMessage());
+ return false;
+ }
+ }
+ }
+
/** Dump data for debug purpose . */
public void dump(PrintWriter writer) {
writer.println("SECURE ELEMENT SERVICE TERMINAL: " + mName);