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