KeymasterArgument.java revision 45ff13ea28005b5af0caa80dbdeb09d49bd73faf
145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker/**
245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * 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 *
845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker *     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>() {
3545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                public KeymasterArgument createFromParcel(Parcel in) {
3645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    final int pos = in.dataPosition();
3745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    final int tag = in.readInt();
3845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    switch (KeymasterDefs.getTagType(tag)) {
3945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_ENUM:
4045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_ENUM_REP:
4145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_INT:
4245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_INT_REP:
4345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            return new KeymasterIntArgument(tag, in);
4445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_LONG:
4545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            return new KeymasterLongArgument(tag, in);
4645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_DATE:
4745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            return new KeymasterDateArgument(tag, in);
4845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_BYTES:
4945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_BIGNUM:
5045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            return new KeymasterBlobArgument(tag, in);
5145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        case KeymasterDefs.KM_BOOL:
5245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            return new KeymasterBooleanArgument(tag, in);
5345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                        default:
5445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                            throw new ParcelFormatException("Bad tag: " + tag + " at " + pos);
5545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    }
5645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                }
5745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                public KeymasterArgument[] newArray(int size) {
5845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    return new KeymasterArgument[size];
5945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                }
6045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker            };
6145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
6245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    protected KeymasterArgument(int tag) {
6345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        this.tag = tag;
6445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
6545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
6645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    /**
6745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker     * Writes the value of this argument, if any, to the provided parcel.
6845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker     */
6945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public abstract void writeValue(Parcel out);
7045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
7145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    @Override
7245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public int describeContents() {
7345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        return 0;
7445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
7545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
7645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    @Override
7745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public void writeToParcel(Parcel out, int flags) {
7845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        out.writeInt(tag);
7945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        writeValue(out);
8045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
8145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker}
82