14f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin/*
24f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * Copyright (C) 2015 The Android Open Source Project
34f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin *
44f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License");
54f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * you may not use this file except in compliance with the License.
64f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * You may obtain a copy of the License at
74f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin *
84f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin *      http://www.apache.org/licenses/LICENSE-2.0
94f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin *
104f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * Unless required by applicable law or agreed to in writing, software
114f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS,
124f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * See the License for the specific language governing permissions and
144f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * limitations under the License.
154f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin */
164f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
174f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubinpackage android.security.keystore;
184f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
194f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubinimport java.math.BigInteger;
204f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubinimport java.security.interfaces.RSAPublicKey;
214f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
224f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin/**
234f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * {@link RSAPublicKey} backed by Android Keystore.
244f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin *
254f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin * @hide
264f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin */
274f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubinpublic class AndroidKeyStoreRSAPublicKey extends AndroidKeyStorePublicKey implements RSAPublicKey {
284f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    private final BigInteger mModulus;
294f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    private final BigInteger mPublicExponent;
304f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
313876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin    public AndroidKeyStoreRSAPublicKey(String alias, int uid, byte[] x509EncodedForm, BigInteger modulus,
324f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin            BigInteger publicExponent) {
333876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin        super(alias, uid, KeyProperties.KEY_ALGORITHM_RSA, x509EncodedForm);
344f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        mModulus = modulus;
354f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        mPublicExponent = publicExponent;
364f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    }
374f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
383876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin    public AndroidKeyStoreRSAPublicKey(String alias, int uid, RSAPublicKey info) {
393876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin        this(alias, uid, info.getEncoded(), info.getModulus(), info.getPublicExponent());
404f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        if (!"X.509".equalsIgnoreCase(info.getFormat())) {
414f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin            throw new IllegalArgumentException(
424f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin                    "Unsupported key export format: " + info.getFormat());
434f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        }
444f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    }
454f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
464f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    @Override
474f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    public BigInteger getModulus() {
484f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        return mModulus;
494f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    }
504f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin
514f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    @Override
524f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    public BigInteger getPublicExponent() {
534f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin        return mPublicExponent;
544f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin    }
554f389fd200fee9e055d3f28b20bee3132329a056Alex Klyubin}
56