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