18d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden/* 28d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * Copyright (C) 2016 The Android Open Source Project 38d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * 48d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 58d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * you may not use this file except in compliance with the License. 68d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * You may obtain a copy of the License at 78d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * 88d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * http://www.apache.org/licenses/LICENSE-2.0 98d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * 108d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * Unless required by applicable law or agreed to in writing, software 118d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 128d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * See the License for the specific language governing permissions and 148d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * limitations under the License. 158d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden */ 168d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 178d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenpackage android.security.keymaster; 188d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 198d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenimport android.os.Parcel; 208d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenimport android.os.Parcelable; 218d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 228d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenimport java.util.ArrayList; 238d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenimport java.util.List; 248d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 258d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden/** 268d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * Utility class for the Java side of keystore-generated certificate chains. 278d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * 288d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * Serialization code for this must be kept in sync with system/security/keystore 298d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden * @hide 308d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden */ 318d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willdenpublic class KeymasterCertificateChain implements Parcelable { 328d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 338d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden private List<byte[]> mCertificates; 348d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 358d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public static final Parcelable.Creator<KeymasterCertificateChain> CREATOR = new 368d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden Parcelable.Creator<KeymasterCertificateChain>() { 378d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public KeymasterCertificateChain createFromParcel(Parcel in) { 388d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden return new KeymasterCertificateChain(in); 398d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 408d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public KeymasterCertificateChain[] newArray(int size) { 418d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden return new KeymasterCertificateChain[size]; 428d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 438d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden }; 448d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 458d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public KeymasterCertificateChain() { 468d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden mCertificates = null; 478d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 488d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 498d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public KeymasterCertificateChain(List<byte[]> mCertificates) { 508d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden this.mCertificates = mCertificates; 518d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 528d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 538d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden private KeymasterCertificateChain(Parcel in) { 548d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden readFromParcel(in); 558d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 568d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 578d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public List<byte[]> getCertificates() { 588d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden return mCertificates; 598d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 608d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 618d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden @Override 628d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public void writeToParcel(Parcel out, int flags) { 638d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden if (mCertificates == null) { 648d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden out.writeInt(0); 658d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } else { 668d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden out.writeInt(mCertificates.size()); 678d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden for (byte[] arg : mCertificates) { 688d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden out.writeByteArray(arg); 698d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 708d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 718d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 728d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 738d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public void readFromParcel(Parcel in) { 748d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden int length = in.readInt(); 758d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden mCertificates = new ArrayList<byte[]>(length); 768d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden for (int i = 0; i < length; i++) { 778d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden mCertificates.add(in.createByteArray()); 788d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 798d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 808d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden 818d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden @Override 828d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden public int describeContents() { 838d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden return 0; 848d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden } 858d8c7477746c357d54f586fc92e8d422a4fc6441Shawn Willden} 86