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