1bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root/*
2bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * Copyright 2013 The Android Open Source Project
3bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root *
4bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * you may not use this file except in compliance with the License.
6bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * You may obtain a copy of the License at
7bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root *
8bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root *
10bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * Unless required by applicable law or agreed to in writing, software
11bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * See the License for the specific language governing permissions and
14bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * limitations under the License.
15bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root */
16bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
17bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Rootpackage org.conscrypt;
18bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
19bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Rootimport java.security.PublicKey;
20bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Rootimport java.util.Arrays;
21bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
22bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root/**
23bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * A simple but useless key class that holds X.509 public key information when
24bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root * the appropriate KeyFactory for the key algorithm is not available.
25bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root */
26bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Rootpublic class X509PublicKey implements PublicKey {
27bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    private static final long serialVersionUID = -8610156854731664298L;
28bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
29bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    private final String algorithm;
30bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
31bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    private final byte[] encoded;
32bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
33bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public X509PublicKey(String algorithm, byte[] encoded) {
34bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        this.algorithm = algorithm;
35bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        this.encoded = encoded;
36bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
37bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
38bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
39bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public String getAlgorithm() {
40bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return algorithm;
41bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
42bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
43bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
44bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public String getFormat() {
45bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return "X.509";
46bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
47bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
48bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
49bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public byte[] getEncoded() {
50bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return encoded;
51bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
52bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
53bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
54bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public String toString() {
55bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return "X509PublicKey [algorithm=" + algorithm + ", encoded=" + Arrays.toString(encoded)
56bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root                + "]";
57bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
58bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
59bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
60bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public int hashCode() {
61bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        final int prime = 31;
62bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        int result = 1;
63bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        result = prime * result + ((algorithm == null) ? 0 : algorithm.hashCode());
64bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        result = prime * result + Arrays.hashCode(encoded);
65bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return result;
66bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
67bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root
68bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    @Override
69bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    public boolean equals(Object obj) {
70bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        if (this == obj)
71bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            return true;
72bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        if (obj == null)
73bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            return false;
74bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        if (getClass() != obj.getClass())
75bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            return false;
76bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        X509PublicKey other = (X509PublicKey) obj;
77bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        if (algorithm == null) {
78bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            if (other.algorithm != null)
79bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root                return false;
80bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        } else if (!algorithm.equals(other.algorithm))
81bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            return false;
82bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        if (!Arrays.equals(encoded, other.encoded))
83bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root            return false;
84bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root        return true;
85bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root    }
86bd788522b36f03dc12750c69fd8b3733ef3801bdKenny Root}
87