12397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales/* 22397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * Copyright (C) 2015 The Android Open Source Project 32397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * 42397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * Licensed under the Apache License, Version 2.0 (the "License"); 52397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * you may not use this file except in compliance with the License. 62397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * You may obtain a copy of the License at 72397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * 82397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * http://www.apache.org/licenses/LICENSE-2.0 92397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * 102397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * Unless required by applicable law or agreed to in writing, software 112397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * distributed under the License is distributed on an "AS IS" BASIS, 122397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * See the License for the specific language governing permissions and 142397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * limitations under the License. 152397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales */ 162397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 172397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralespackage com.android.internal.widget; 182397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 192397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralesimport android.os.Parcel; 202397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralesimport android.os.Parcelable; 217374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roosimport android.service.gatekeeper.GateKeeperResponse; 227374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roosimport android.util.Slog; 232397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 242397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales/** 252397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * Response object for a ILockSettings credential verification request. 262397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * @hide 272397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales */ 282397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralespublic final class VerifyCredentialResponse implements Parcelable { 292397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 302397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_ERROR = -1; 312397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_OK = 0; 322397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_RETRY = 1; 332397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 342397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final VerifyCredentialResponse OK = new VerifyCredentialResponse(); 352397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final VerifyCredentialResponse ERROR 362397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales = new VerifyCredentialResponse(RESPONSE_ERROR, 0, null); 377374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos private static final String TAG = "VerifyCredentialResponse"; 382397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 392397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private int mResponseCode; 402397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private byte[] mPayload; 412397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private int mTimeout; 422397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 432397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final Parcelable.Creator<VerifyCredentialResponse> CREATOR 442397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales = new Parcelable.Creator<VerifyCredentialResponse>() { 452397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 462397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public VerifyCredentialResponse createFromParcel(Parcel source) { 472397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int responseCode = source.readInt(); 482397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales VerifyCredentialResponse response = new VerifyCredentialResponse(responseCode, 0, null); 492397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (responseCode == RESPONSE_RETRY) { 502397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales response.setTimeout(source.readInt()); 512397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } else if (responseCode == RESPONSE_OK) { 522397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int size = source.readInt(); 532397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (size > 0) { 542397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales byte[] payload = new byte[size]; 552397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales source.readByteArray(payload); 562397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales response.setPayload(payload); 572397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 582397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 592397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return response; 602397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 612397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 622397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 632397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public VerifyCredentialResponse[] newArray(int size) { 642397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return new VerifyCredentialResponse[size]; 652397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 662397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 672397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales }; 682397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 692397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public VerifyCredentialResponse() { 702397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = RESPONSE_OK; 712397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = null; 722397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 732397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 742397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 752397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public VerifyCredentialResponse(byte[] payload) { 762397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = payload; 772397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = RESPONSE_OK; 782397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 792397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 802397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public VerifyCredentialResponse(int timeout) { 812397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mTimeout = timeout; 822397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = RESPONSE_RETRY; 832397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = null; 842397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 852397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 862397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private VerifyCredentialResponse(int responseCode, int timeout, byte[] payload) { 872397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = responseCode; 882397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mTimeout = timeout; 892397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = payload; 902397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 912397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 922397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 932397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public void writeToParcel(Parcel dest, int flags) { 942397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mResponseCode); 952397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (mResponseCode == RESPONSE_RETRY) { 962397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mTimeout); 972397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } else if (mResponseCode == RESPONSE_OK) { 982397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (mPayload != null) { 992397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mPayload.length); 1002397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeByteArray(mPayload); 10154813e988884f0d604d5358569f10feda8622f46Rubin Xu } else { 10254813e988884f0d604d5358569f10feda8622f46Rubin Xu dest.writeInt(0); 1032397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1042397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1052397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1062397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1072397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 1082397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int describeContents() { 1092397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return 0; 1102397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1112397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1122397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public byte[] getPayload() { 1132397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mPayload; 1142397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1152397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1162397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int getTimeout() { 1172397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mTimeout; 1182397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1192397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1202397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int getResponseCode() { 1212397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mResponseCode; 1222397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1232397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1242397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void setTimeout(int timeout) { 1252397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mTimeout = timeout; 1262397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1272397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1282397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void setPayload(byte[] payload) { 1292397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = payload; 1302397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1317374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos 1327374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos public VerifyCredentialResponse stripPayload() { 1337374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos return new VerifyCredentialResponse(mResponseCode, mTimeout, new byte[0]); 1347374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } 1357374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos 1367374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos public static VerifyCredentialResponse fromGateKeeperResponse( 1377374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos GateKeeperResponse gateKeeperResponse) { 1387374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos VerifyCredentialResponse response; 1397374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos int responseCode = gateKeeperResponse.getResponseCode(); 1407374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos if (responseCode == GateKeeperResponse.RESPONSE_RETRY) { 1417374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos response = new VerifyCredentialResponse(gateKeeperResponse.getTimeout()); 1427374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } else if (responseCode == GateKeeperResponse.RESPONSE_OK) { 1437374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos byte[] token = gateKeeperResponse.getPayload(); 1447374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos if (token == null) { 1457374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos // something's wrong if there's no payload with a challenge 1467374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos Slog.e(TAG, "verifyChallenge response had no associated payload"); 1477374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos response = VerifyCredentialResponse.ERROR; 1487374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } else { 1497374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos response = new VerifyCredentialResponse(token); 1507374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } 1517374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } else { 1527374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos response = VerifyCredentialResponse.ERROR; 1537374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } 1547374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos return response; 1557374d3a4bca6bfbf7da1ef5dbf0db9f35f0c8315Adrian Roos } 1562397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales} 157