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