1ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex 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 Brubaker
22ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubinimport java.math.BigInteger;
235927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubinimport java.util.ArrayList;
245927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubinimport java.util.Date;
2545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerimport java.util.List;
2645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
2745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker/**
2845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker * @hide
2945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker */
3045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubakerpublic class KeyCharacteristics implements Parcelable {
3145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public KeymasterArguments swEnforced;
3245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public KeymasterArguments hwEnforced;
3345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
34ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    public static final Parcelable.Creator<KeyCharacteristics> CREATOR =
35ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            new Parcelable.Creator<KeyCharacteristics>() {
365927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin                @Override
3745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                public KeyCharacteristics createFromParcel(Parcel in) {
3845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    return new KeyCharacteristics(in);
3945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                }
4045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
415927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin                @Override
4245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                public KeyCharacteristics[] newArray(int length) {
4345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                    return new KeyCharacteristics[length];
4445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker                }
4545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker            };
4645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
4745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public KeyCharacteristics() {}
4845ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
4945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    protected KeyCharacteristics(Parcel in) {
5045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        readFromParcel(in);
5145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
5245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
5345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    @Override
5445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public int describeContents() {
5545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        return 0;
5645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
5745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
585927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    @Override
5945ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public void writeToParcel(Parcel out, int flags) {
6045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        swEnforced.writeToParcel(out, flags);
6145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        hwEnforced.writeToParcel(out, flags);
6245ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
6345ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
6445ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    public void readFromParcel(Parcel in) {
6545ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        swEnforced = KeymasterArguments.CREATOR.createFromParcel(in);
6645ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker        hwEnforced = KeymasterArguments.CREATOR.createFromParcel(in);
6745ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker    }
685927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin
69ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
70ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns the value of the specified enum tag or {@code defaultValue} if the tag is not
71ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * present.
72ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
73ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * @throws IllegalArgumentException if {@code tag} is not an enum tag.
74ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
75ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    public Integer getEnum(int tag) {
765927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        if (hwEnforced.containsTag(tag)) {
77ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return hwEnforced.getEnum(tag, -1);
785927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        } else if (swEnforced.containsTag(tag)) {
79ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return swEnforced.getEnum(tag, -1);
805927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        } else {
815927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin            return null;
825927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        }
835927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    }
845927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin
85ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
86ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns all values of the specified repeating enum tag.
87ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
88ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * throws IllegalArgumentException if {@code tag} is not a repeating enum tag.
89ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
90ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    public List<Integer> getEnums(int tag) {
915927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        List<Integer> result = new ArrayList<Integer>();
92ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        result.addAll(hwEnforced.getEnums(tag));
93ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        result.addAll(swEnforced.getEnums(tag));
945927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        return result;
955927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    }
965927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin
97ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
98ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns the value of the specified unsigned 32-bit int tag or {@code defaultValue} if the tag
99ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * is not present.
100ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
101ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * @throws IllegalArgumentException if {@code tag} is not an unsigned 32-bit int tag.
102ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
103ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    public long getUnsignedInt(int tag, long defaultValue) {
104708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin        if (hwEnforced.containsTag(tag)) {
105ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return hwEnforced.getUnsignedInt(tag, defaultValue);
106708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin        } else {
107ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return swEnforced.getUnsignedInt(tag, defaultValue);
108708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin        }
109708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin    }
110708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin
111ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
112ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns all values of the specified repeating unsigned 64-bit long tag.
113ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
114ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * @throws IllegalArgumentException if {@code tag} is not a repeating unsigned 64-bit long tag.
115ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
116ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    public List<BigInteger> getUnsignedLongs(int tag) {
117ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        List<BigInteger> result = new ArrayList<BigInteger>();
118ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        result.addAll(hwEnforced.getUnsignedLongs(tag));
119ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        result.addAll(swEnforced.getUnsignedLongs(tag));
120708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin        return result;
121708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin    }
122708fc9404501ac42b6cac925fe3e10801b5f633bAlex Klyubin
123ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
124ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns the value of the specified date tag or {@code null} if the tag is not present.
125ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
126ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * @throws IllegalArgumentException if {@code tag} is not a date tag or if the tag's value
127ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *         represents a time instant which is after {@code 2^63 - 1} milliseconds since Unix
128ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *         epoch.
129ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
1305927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    public Date getDate(int tag) {
131ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        Date result = swEnforced.getDate(tag, null);
132ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        if (result != null) {
133ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return result;
1345927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        }
135ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin        return hwEnforced.getDate(tag, null);
1365927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    }
1375927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin
138ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin    /**
139ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * Returns {@code true} if the provided boolean tag is present, {@code false} if absent.
140ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     *
141ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     * @throws IllegalArgumentException if {@code tag} is not a boolean tag.
142ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin     */
1431eda77ae2122e2b85084eb429fbeecec0b9962e5Alex Klyubin    public boolean getBoolean(int tag) {
1441eda77ae2122e2b85084eb429fbeecec0b9962e5Alex Klyubin        if (hwEnforced.containsTag(tag)) {
145ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return hwEnforced.getBoolean(tag);
1465927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        } else {
147ae6cb7aad56bb006769cd8a69b92af7236644fc1Alex Klyubin            return swEnforced.getBoolean(tag);
1485927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin        }
1495927c9f1b12f597839a664c1c6593114175cbcd8Alex Klyubin    }
15045ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker}
15145ff13ea28005b5af0caa80dbdeb09d49bd73fafChad Brubaker
152