18effa36ca6440604cf10bbc34fba2b60ff304f54Alex Klyubin/* 28effa36ca6440604cf10bbc34fba2b60ff304f54Alex Klyubin * Copyright (C) 2015 The Android Open Source Project 345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * 445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * Licensed under the Apache License, Version 2.0 (the "License"); 545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * you may not use this file except in compliance with the License. 645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * You may obtain a copy of the License at 745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * 88effa36ca6440604cf10bbc34fba2b60ff304f54Alex Klyubin * http://www.apache.org/licenses/LICENSE-2.0 945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * 1045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * Unless required by applicable law or agreed to in writing, software 1145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * distributed under the License is distributed on an "AS IS" BASIS, 1245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * See the License for the specific language governing permissions and 1445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * limitations under the License. 1545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker */ 1645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 1745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerpackage android.security.keymaster; 1845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 1945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerimport android.os.Parcel; 2045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerimport android.os.Parcelable; 2145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerimport android.os.ParcelFormatException; 2245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 2345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker/** 2445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * Base class for the Java side of a Keymaster tagged argument. 2545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * <p> 2645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * Serialization code for this and subclasses must be kept in sync with system/security/keystore 2745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * and with hardware/libhardware/include/hardware/keymaster_defs.h 2845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * @hide 2945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker */ 3045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerabstract class KeymasterArgument implements Parcelable { 3145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public final int tag; 3245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 3345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public static final Parcelable.Creator<KeymasterArgument> CREATOR = new 3445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker Parcelable.Creator<KeymasterArgument>() { 35ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin @Override 3645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public KeymasterArgument createFromParcel(Parcel in) { 3745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker final int pos = in.dataPosition(); 3845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker final int tag = in.readInt(); 3945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker switch (KeymasterDefs.getTagType(tag)) { 4045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_ENUM: 4145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_ENUM_REP: 423e7a9e4ec611a1306f8aa5e593c95237030bb5baAlex Klyubin case KeymasterDefs.KM_UINT: 433e7a9e4ec611a1306f8aa5e593c95237030bb5baAlex Klyubin case KeymasterDefs.KM_UINT_REP: 4445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterIntArgument(tag, in); 453e7a9e4ec611a1306f8aa5e593c95237030bb5baAlex Klyubin case KeymasterDefs.KM_ULONG: 463e7a9e4ec611a1306f8aa5e593c95237030bb5baAlex Klyubin case KeymasterDefs.KM_ULONG_REP: 4745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterLongArgument(tag, in); 4845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_DATE: 4945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterDateArgument(tag, in); 5045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_BYTES: 5145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_BIGNUM: 5245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterBlobArgument(tag, in); 5345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker case KeymasterDefs.KM_BOOL: 5445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterBooleanArgument(tag, in); 5545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker default: 5645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker throw new ParcelFormatException("Bad tag: " + tag + " at " + pos); 5745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 5845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 59ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin 60ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin @Override 6145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public KeymasterArgument[] newArray(int size) { 6245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return new KeymasterArgument[size]; 6345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 6445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker }; 6545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 6645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker protected KeymasterArgument(int tag) { 6745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker this.tag = tag; 6845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 6945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 7045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker /** 7145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * Writes the value of this argument, if any, to the provided parcel. 7245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker */ 7345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public abstract void writeValue(Parcel out); 7445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 7545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker @Override 7645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public int describeContents() { 7745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker return 0; 7845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 7945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker 8045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker @Override 8145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker public void writeToParcel(Parcel out, int flags) { 8245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker out.writeInt(tag); 8345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker writeValue(out); 8445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker } 8545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker} 86