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