16bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker/* 26bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Copyright (C) 2015 The Android Open Source Project 36bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 46bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Licensed under the Apache License, Version 2.0 (the "License"); 56bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * you may not use this file except in compliance with the License. 66bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * You may obtain a copy of the License at 76bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 86bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * http://www.apache.org/licenses/LICENSE-2.0 96bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * 106bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * Unless required by applicable law or agreed to in writing, software 116bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * distributed under the License is distributed on an "AS IS" BASIS, 126bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * See the License for the specific language governing permissions and 146bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker * limitations under the License. 156bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker */ 166bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 176bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerpackage android.security.net.config; 186bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 196bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerimport java.util.Arrays; 206bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 216bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker/** @hide */ 226bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubakerpublic final class Pin { 236bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker public final String digestAlgorithm; 246bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker public final byte[] digest; 256bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 266bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker private final int mHashCode; 276bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 286bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker public Pin(String digestAlgorithm, byte[] digest) { 296bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker this.digestAlgorithm = digestAlgorithm; 306bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker this.digest = digest; 316bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker mHashCode = Arrays.hashCode(digest) ^ digestAlgorithm.hashCode(); 326bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 335f96702f582050c1598136ed2a748f76b981c94eChad Brubaker 345f96702f582050c1598136ed2a748f76b981c94eChad Brubaker /** 355f96702f582050c1598136ed2a748f76b981c94eChad Brubaker * @hide 365f96702f582050c1598136ed2a748f76b981c94eChad Brubaker */ 375f96702f582050c1598136ed2a748f76b981c94eChad Brubaker public static boolean isSupportedDigestAlgorithm(String algorithm) { 385f96702f582050c1598136ed2a748f76b981c94eChad Brubaker // Currently only SHA-256 is supported. SHA-512 if/once Chromium networking stack 395f96702f582050c1598136ed2a748f76b981c94eChad Brubaker // supports it. 405f96702f582050c1598136ed2a748f76b981c94eChad Brubaker return "SHA-256".equalsIgnoreCase(algorithm); 415f96702f582050c1598136ed2a748f76b981c94eChad Brubaker } 425f96702f582050c1598136ed2a748f76b981c94eChad Brubaker 435f96702f582050c1598136ed2a748f76b981c94eChad Brubaker /** 445f96702f582050c1598136ed2a748f76b981c94eChad Brubaker * @hide 455f96702f582050c1598136ed2a748f76b981c94eChad Brubaker */ 465f96702f582050c1598136ed2a748f76b981c94eChad Brubaker public static int getDigestLength(String algorithm) { 475f96702f582050c1598136ed2a748f76b981c94eChad Brubaker if ("SHA-256".equalsIgnoreCase(algorithm)) { 485f96702f582050c1598136ed2a748f76b981c94eChad Brubaker return 32; 495f96702f582050c1598136ed2a748f76b981c94eChad Brubaker } 505f96702f582050c1598136ed2a748f76b981c94eChad Brubaker throw new IllegalArgumentException("Unsupported digest algorithm: " + algorithm); 515f96702f582050c1598136ed2a748f76b981c94eChad Brubaker } 525f96702f582050c1598136ed2a748f76b981c94eChad Brubaker 536bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker @Override 546bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker public int hashCode() { 556bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return mHashCode; 566bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 576bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker 586bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker @Override 596bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker public boolean equals(Object obj) { 606bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker if (this == obj) { 616bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return true; 626bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 636bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker if (!(obj instanceof Pin)) { 646bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return false; 656bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 666bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker Pin other = (Pin) obj; 676bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker if (other.hashCode() != mHashCode) { 686bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return false; 696bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 706bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker if (!Arrays.equals(digest, other.digest)) { 716bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return false; 726bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 736bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker if (!digestAlgorithm.equals(other.digestAlgorithm)) { 746bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return false; 756bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 766bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker return true; 776bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker } 786bc1e3966c4890ee3d47b5e527b800f2700ed627Chad Brubaker} 79