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 android.service.gatekeeper; 182397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 192397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralesimport android.os.Parcel; 202397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralesimport android.os.Parcelable; 212397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 222397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales/** 232397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * Response object for a GateKeeper verification request. 242397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales * @hide 252397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales */ 262397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralespublic final class GateKeeperResponse implements Parcelable { 272397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 282397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_ERROR = -1; 292397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_OK = 0; 302397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final int RESPONSE_RETRY = 1; 312397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 322397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private final int mResponseCode; 332397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 342397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private int mTimeout; 352397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private byte[] mPayload; 362397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private boolean mShouldReEnroll; 372397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 382397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private GateKeeperResponse(int responseCode) { 392397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = responseCode; 402397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 412397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 422397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private GateKeeperResponse(int responseCode, int timeout) { 432397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mResponseCode = responseCode; 442397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 452397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 462397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 472397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int describeContents() { 482397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return 0; 492397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 502397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 512397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public static final Parcelable.Creator<GateKeeperResponse> CREATOR 522397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales = new Parcelable.Creator<GateKeeperResponse>() { 532397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 542397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public GateKeeperResponse createFromParcel(Parcel source) { 552397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int responseCode = source.readInt(); 562397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales GateKeeperResponse response = new GateKeeperResponse(responseCode); 572397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (responseCode == RESPONSE_RETRY) { 582397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales response.setTimeout(source.readInt()); 592397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } else if (responseCode == RESPONSE_OK) { 602397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales response.setShouldReEnroll(source.readInt() == 1); 612397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int size = source.readInt(); 622397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (size > 0) { 632397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales byte[] payload = new byte[size]; 642397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales source.readByteArray(payload); 652397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales response.setPayload(payload); 662397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 672397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 682397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return response; 692397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 702397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 712397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 722397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public GateKeeperResponse[] newArray(int size) { 732397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return new GateKeeperResponse[size]; 742397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 752397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 762397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales }; 772397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 782397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales @Override 792397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public void writeToParcel(Parcel dest, int flags) { 802397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mResponseCode); 812397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (mResponseCode == RESPONSE_RETRY) { 822397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mTimeout); 832397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } else if (mResponseCode == RESPONSE_OK) { 842397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mShouldReEnroll ? 1 : 0); 852397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (mPayload != null) { 862397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeInt(mPayload.length); 872397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales dest.writeByteArray(mPayload); 882397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 892397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 902397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 912397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 922397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public byte[] getPayload() { 932397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mPayload; 942397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 952397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 962397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int getTimeout() { 972397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mTimeout; 982397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 992397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1002397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public boolean getShouldReEnroll() { 1012397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mShouldReEnroll; 1022397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1032397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1042397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public int getResponseCode() { 1052397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return mResponseCode; 1062397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1072397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1082397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void setTimeout(int timeout) { 1092397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mTimeout = timeout; 1102397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1112397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1122397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void setShouldReEnroll(boolean shouldReEnroll) { 1132397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mShouldReEnroll = shouldReEnroll; 1142397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1152397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1162397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void setPayload(byte[] payload) { 1172397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mPayload = payload; 1182397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 1192397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 1202397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales} 121