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