1ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin/*
2ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * Copyright (C) 2015 The Android Open Source Project
3ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin *
4ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * Licensed under the Apache License, Version 2.0 (the "License");
5ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * you may not use this file except in compliance with the License.
6ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * You may obtain a copy of the License at
7ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin *
8ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin *      http://www.apache.org/licenses/LICENSE-2.0
9ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin *
10ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * Unless required by applicable law or agreed to in writing, software
11ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * distributed under the License is distributed on an "AS IS" BASIS,
12ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * See the License for the specific language governing permissions and
14ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * limitations under the License.
15ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin */
16ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
17ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubinpackage android.security.keystore;
18ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
19ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubinimport java.security.interfaces.ECPublicKey;
20ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubinimport java.security.spec.ECParameterSpec;
21ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubinimport java.security.spec.ECPoint;
22ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
23ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin/**
24ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * {@link ECPublicKey} backed by keystore.
25ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin *
26ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin * @hide
27ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin */
28ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubinpublic class AndroidKeyStoreECPublicKey extends AndroidKeyStorePublicKey implements ECPublicKey {
29ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
30ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    private final ECParameterSpec mParams;
31ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    private final ECPoint mW;
32ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
333876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin    public AndroidKeyStoreECPublicKey(String alias, int uid, byte[] x509EncodedForm, ECParameterSpec params,
34ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin            ECPoint w) {
353876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin        super(alias, uid, KeyProperties.KEY_ALGORITHM_EC, x509EncodedForm);
36ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        mParams = params;
37ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        mW = w;
38ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    }
39ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
403876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin    public AndroidKeyStoreECPublicKey(String alias, int uid, ECPublicKey info) {
413876b1be27e3aefde9a72eb2e4f856e94fc5f946Alex Klyubin        this(alias, uid, info.getEncoded(), info.getParams(), info.getW());
42ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        if (!"X.509".equalsIgnoreCase(info.getFormat())) {
43ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin            throw new IllegalArgumentException(
44ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin                    "Unsupported key export format: " + info.getFormat());
45ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        }
46ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    }
47ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
48ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    @Override
49ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    public ECParameterSpec getParams() {
50ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        return mParams;
51ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    }
52ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin
53ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    @Override
54ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    public ECPoint getW() {
55ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin        return mW;
56ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin    }
57ccbe88a505848896e59ef8eb4e8405037ba94e88Alex Klyubin}