1ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue/* 2ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Copyright (C) 2017 The Android Open Source Project 3ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 4ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Licensed under the Apache License, Version 2.0 (the "License"); 5ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * you may not use this file except in compliance with the License. 6ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * You may obtain a copy of the License at 7ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 8ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * http://www.apache.org/licenses/LICENSE-2.0 9ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 10ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Unless required by applicable law or agreed to in writing, software 11ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * distributed under the License is distributed on an "AS IS" BASIS, 12ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * See the License for the specific language governing permissions and 14ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * limitations under the License. 15ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue */ 16ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue/* 17ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Copyright (c) 2017, The Linux Foundation. 18ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue */ 19ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 20ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue/* 21ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Copyright 2012 Giesecke & Devrient GmbH. 22ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 23ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Licensed under the Apache License, Version 2.0 (the "License"); 24ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * you may not use this file except in compliance with the License. 25ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * You may obtain a copy of the License at 26ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 27ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * http://www.apache.org/licenses/LICENSE-2.0 28ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * 29ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * Unless required by applicable law or agreed to in writing, software 30ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * distributed under the License is distributed on an "AS IS" BASIS, 31ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 32ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * See the License for the specific language governing permissions and 33ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue * limitations under the License. 34ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue */ 35ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 36ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghuepackage com.android.se.security; 37ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 38ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue/** Class for Storing the APDU and NFC Access for a particular Channel */ 39ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghuepublic class ChannelAccess { 40ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 41ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private final String mTag = "SecureElement-ChannelAccess"; 42ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private String mPackageName = ""; 43ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private ACCESS mAccess = ACCESS.UNDEFINED; 44ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private ACCESS mApduAccess = ACCESS.UNDEFINED; 45ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private boolean mUseApduFilter = false; 46ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private int mCallingPid = 0; 47ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private String mReason = "no access by default"; 48ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private ACCESS mNFCEventAccess = ACCESS.UNDEFINED; 49ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue private ApduFilter[] mApduFilter = null; 50ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 51ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue /** Clones the ChannelAccess */ 52ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public ChannelAccess clone() { 53ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ChannelAccess ca = new ChannelAccess(); 54ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setAccess(mAccess, mReason); 55ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setPackageName(mPackageName); 56ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setApduAccess(mApduAccess); 57ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setCallingPid(mCallingPid); 58ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setNFCEventAccess(mNFCEventAccess); 59ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setUseApduFilter(mUseApduFilter); 60ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue if (mApduFilter != null) { 61ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ApduFilter[] apduFilter = new ApduFilter[mApduFilter.length]; 62ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue int i = 0; 63ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue for (ApduFilter filter : mApduFilter) { 64ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue apduFilter[i++] = filter.clone(); 65ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 66ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setApduFilter(apduFilter); 67ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } else { 68ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ca.setApduFilter(null); 69ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 70ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return ca; 71ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 72ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 73ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public String getPackageName() { 74ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mPackageName; 75ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 76ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 77ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setPackageName(String name) { 78ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mPackageName = name; 79ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 80ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 81ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public ACCESS getApduAccess() { 82ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mApduAccess; 83ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 84ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 85ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setApduAccess(ACCESS apduAccess) { 86ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mApduAccess = apduAccess; 87ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 88ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 89ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public ACCESS getAccess() { 90ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mAccess; 91ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 92ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 93ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue /** Sets the Access for the ChannelAccess */ 94ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setAccess(ACCESS access, String reason) { 95ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mAccess = access; 96ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mReason = reason; 97ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 98ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 99ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public boolean isUseApduFilter() { 100ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mUseApduFilter; 101ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 102ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 103ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setUseApduFilter(boolean useApduFilter) { 104ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mUseApduFilter = useApduFilter; 105ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 106ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 107ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public int getCallingPid() { 108ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mCallingPid; 109ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 110ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 111ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setCallingPid(int callingPid) { 112ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mCallingPid = callingPid; 113ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 114ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 115ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public String getReason() { 116ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mReason; 117ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 118ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 119ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public ApduFilter[] getApduFilter() { 120ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mApduFilter; 121ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 122ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 123ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setApduFilter(ApduFilter[] accessConditions) { 124ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mApduFilter = accessConditions; 125ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 126ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 127ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public ACCESS getNFCEventAccess() { 128ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return mNFCEventAccess; 129ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 130ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 131ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public void setNFCEventAccess(ACCESS access) { 132ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue mNFCEventAccess = access; 133ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 134ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 135ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue @Override 136ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public String toString() { 137ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue StringBuilder sb = new StringBuilder(); 138ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(this.getClass().getName()); 139ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append("\n [mPackageName="); 140ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mPackageName); 141ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mAccess="); 142ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mAccess); 143ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mApduAccess="); 144ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mApduAccess); 145ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mUseApduFilter="); 146ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mUseApduFilter); 147ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mApduFilter="); 148ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue if (mApduFilter != null) { 149ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue for (ApduFilter f : mApduFilter) { 150ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(f.toString()); 151ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(" "); 152ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 153ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } else { 154ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append("null"); 155ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 156ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mCallingPid="); 157ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mCallingPid); 158ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mReason="); 159ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mReason); 160ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(", mNFCEventAllowed="); 161ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append(mNFCEventAccess); 162ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue sb.append("]\n"); 163ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 164ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue return sb.toString(); 165ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 166ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue 167ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue public enum ACCESS { 168ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue ALLOWED, 169ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue DENIED, 170ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue UNDEFINED; 171ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue } 172ab336de91e0468a1352d1a9f5d92f219140e0bd1Jeremy O'Donoghue} 173