1e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root/*
2e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * Copyright (C) 2012 The Android Open Source Project
3e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root *
4e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * you may not use this file except in compliance with the License.
6e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * You may obtain a copy of the License at
7e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root *
8e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root *
10e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * Unless required by applicable law or agreed to in writing, software
11e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * See the License for the specific language governing permissions and
14e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root * limitations under the License.
15e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root */
16e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootpackage android.security;
18e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
19802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
20802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
21f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport com.android.org.conscrypt.NativeCrypto;
2212e752225aa96888358294be0d725d499a1c9f03Kenny Rootimport com.android.org.conscrypt.OpenSSLEngine;
23f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport com.android.org.conscrypt.OpenSSLKeyHolder;
24802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
25e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport android.test.AndroidTestCase;
26e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
27e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.io.ByteArrayInputStream;
28e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.io.ByteArrayOutputStream;
29e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.io.OutputStream;
30802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport java.math.BigInteger;
31802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport java.security.InvalidKeyException;
32e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.Key;
33e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.KeyFactory;
34e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.KeyStore.Entry;
35e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.KeyStore.PrivateKeyEntry;
36e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.KeyStore.TrustedCertificateEntry;
37e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.KeyStoreException;
38e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.NoSuchAlgorithmException;
39e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.PrivateKey;
40802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport java.security.PublicKey;
41e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.cert.Certificate;
42e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.cert.CertificateFactory;
43802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport java.security.cert.X509Certificate;
44f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport java.security.interfaces.DSAPrivateKey;
45f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport java.security.interfaces.DSAPublicKey;
46f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport java.security.interfaces.ECPrivateKey;
47f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Rootimport java.security.interfaces.ECPublicKey;
48e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.interfaces.RSAPrivateKey;
49e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.spec.InvalidKeySpecException;
50e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.security.spec.PKCS8EncodedKeySpec;
51802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport java.security.spec.X509EncodedKeySpec;
52e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Arrays;
53e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Collection;
54e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Date;
55e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Enumeration;
56e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.HashSet;
57e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Iterator;
58e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootimport java.util.Set;
59e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
60656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Rootimport javax.crypto.Cipher;
61656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Rootimport javax.crypto.SecretKey;
62656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Rootimport javax.crypto.spec.SecretKeySpec;
63802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Rootimport javax.security.auth.x500.X500Principal;
64802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
65e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Rootpublic class AndroidKeyStoreTest extends AndroidTestCase {
66e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private android.security.KeyStore mAndroidKeyStore;
67e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
68e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private java.security.KeyStore mKeyStore;
69e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
70e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private static final String TEST_ALIAS_1 = "test1";
71e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
72e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private static final String TEST_ALIAS_2 = "test2";
73e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
74e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private static final String TEST_ALIAS_3 = "test3";
75e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
76802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
77802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
78802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
79802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
80802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
81802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
82802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
83802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
84802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final long NOW_MILLIS = System.currentTimeMillis();
85802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
86802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    /* We have to round this off because X509v3 doesn't store milliseconds. */
87802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
88802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
89802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    @SuppressWarnings("deprecation")
90802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
91802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
92e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    /*
93e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * The keys and certificates below are generated with:
94e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     *
95e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
96e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl req -newkey rsa:1024 -keyout userkey.pem -nodes -days 3650 -out userkey.req
97e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * mkdir -p demoCA/newcerts
98e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * touch demoCA/index.txt
99e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * echo "01" > demoCA/serial
100e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
101e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     */
102e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
103e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    /**
104e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * Generated from above and converted with:
105e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     *
106e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
107e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     */
108f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_RSA_CA_1 = {
109e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
110e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
111e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
112e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa2, (byte) 0xf4, (byte) 0x2e, (byte) 0x55, (byte) 0x48, (byte) 0x0a,
113e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
114e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
115e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31,
116e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
117e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53,
118e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
119e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43,
120e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x41, (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06,
121e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d,
122e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x4d, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61,
123e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x69, (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65,
124e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x77, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
125e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12,
126e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x41, (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69,
127e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x64, (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74,
128e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x20, (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73,
129e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32,
130e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x34, (byte) 0x31, (byte) 0x36,
131e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x35, (byte) 0x35, (byte) 0x34, (byte) 0x34, (byte) 0x5a, (byte) 0x17,
132e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0d, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31,
133e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x32, (byte) 0x31, (byte) 0x36, (byte) 0x35, (byte) 0x35, (byte) 0x34,
134e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x34, (byte) 0x5a, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b,
135e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
136e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31,
137e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
138e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41,
139e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03,
140e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d,
141e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69,
142e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77,
143e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03,
144e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41,
145e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64,
146e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20,
147e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30,
148e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
149e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
150e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
151e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
152e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa3, (byte) 0x72,
153e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xab, (byte) 0xd0, (byte) 0xe4, (byte) 0xad, (byte) 0x2f, (byte) 0xe7,
154e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe2, (byte) 0x79, (byte) 0x07, (byte) 0x36, (byte) 0x3d, (byte) 0x0c,
155e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8d, (byte) 0x42, (byte) 0x9a, (byte) 0x0a, (byte) 0x33, (byte) 0x64,
156e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xb3, (byte) 0xcd, (byte) 0xb2, (byte) 0xd7, (byte) 0x3a, (byte) 0x42,
157e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x77, (byte) 0x45, (byte) 0x29, (byte) 0xe9, (byte) 0xcb,
158e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xb7, (byte) 0x4a, (byte) 0xd6, (byte) 0xee, (byte) 0xad, (byte) 0x01,
159e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x91, (byte) 0x9b, (byte) 0x0c, (byte) 0x59, (byte) 0xa1, (byte) 0x03,
160e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xfa, (byte) 0xf0, (byte) 0x5a, (byte) 0x7c, (byte) 0x4f, (byte) 0xf7,
161e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8d, (byte) 0x36, (byte) 0x0f, (byte) 0x1f, (byte) 0x45, (byte) 0x7d,
162e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1b, (byte) 0x31, (byte) 0xa1, (byte) 0x35, (byte) 0x0b, (byte) 0x00,
163e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xed, (byte) 0x7a, (byte) 0xb6, (byte) 0xc8, (byte) 0x4e, (byte) 0xa9,
164e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x86, (byte) 0x4c, (byte) 0x7b, (byte) 0x99, (byte) 0x57, (byte) 0x41,
165e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x12, (byte) 0xef, (byte) 0x6b, (byte) 0xbc, (byte) 0x3d, (byte) 0x60,
166e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf2, (byte) 0x99, (byte) 0x1a, (byte) 0xcd, (byte) 0xed, (byte) 0x56,
167e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa4, (byte) 0xe5, (byte) 0x36, (byte) 0x9f, (byte) 0x24, (byte) 0x1f,
168e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xdc, (byte) 0x89, (byte) 0x40, (byte) 0xc8, (byte) 0x99, (byte) 0x92,
169e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xab, (byte) 0x4a, (byte) 0xb5, (byte) 0x61, (byte) 0x45, (byte) 0x62,
170e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xff, (byte) 0xa3, (byte) 0x45, (byte) 0x65, (byte) 0xaf, (byte) 0xf6,
171e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x27, (byte) 0x30, (byte) 0x51, (byte) 0x0e, (byte) 0x0e, (byte) 0xeb,
172e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x79, (byte) 0x0c, (byte) 0xbe, (byte) 0xb3, (byte) 0x0a, (byte) 0x6f,
173e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x29, (byte) 0x06, (byte) 0xdc, (byte) 0x2f, (byte) 0x6b, (byte) 0x51,
174e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
175e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x81, (byte) 0xb1, (byte) 0x30, (byte) 0x81, (byte) 0xae, (byte) 0x30,
176e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e,
177e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x33, (byte) 0x05,
178e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60, (byte) 0xc7, (byte) 0xf9,
179e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c, (byte) 0x8f, (byte) 0x6d,
180e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e, (byte) 0x5d, (byte) 0x51,
181e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x7f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,
182e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x23, (byte) 0x04, (byte) 0x78, (byte) 0x30, (byte) 0x76, (byte) 0x80,
183e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x14, (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f,
184e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x60, (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73,
185e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5c, (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97,
186e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8e, (byte) 0x5d, (byte) 0x51, (byte) 0xa1, (byte) 0x53, (byte) 0xa4,
187e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x51, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
188e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
189e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
190e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
191e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
192e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
193e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
194e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
195e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
196e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
197e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
198e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
199e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
200e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x82, (byte) 0x09,
201e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0xe1, (byte) 0x6a, (byte) 0xa2, (byte) 0xf4, (byte) 0x2e,
202e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x55, (byte) 0x48, (byte) 0x0a, (byte) 0x30, (byte) 0x0c, (byte) 0x06,
203e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05,
204e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30,
205e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
206e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
207e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
208e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8c, (byte) 0x30, (byte) 0x42, (byte) 0xfa, (byte) 0xeb, (byte) 0x1a,
209e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x26, (byte) 0xeb, (byte) 0xda, (byte) 0x56, (byte) 0x32, (byte) 0xf2,
210e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9d, (byte) 0xa5, (byte) 0x24, (byte) 0xd8, (byte) 0x3a, (byte) 0xda,
211e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0xa6, (byte) 0x8b, (byte) 0x46, (byte) 0xfe, (byte) 0xfe,
212e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xdb, (byte) 0xf1, (byte) 0xe6, (byte) 0xe1, (byte) 0x7c, (byte) 0x1b,
213e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe7, (byte) 0x77, (byte) 0x00, (byte) 0xa1, (byte) 0x1c, (byte) 0x19,
214e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x17, (byte) 0x73, (byte) 0xb0, (byte) 0xf0, (byte) 0x9d, (byte) 0xf3,
215e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x4f, (byte) 0xb6, (byte) 0xbc, (byte) 0xc7, (byte) 0x47, (byte) 0x85,
216e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2a, (byte) 0x4a, (byte) 0xa1, (byte) 0xa5, (byte) 0x58, (byte) 0xf5,
217e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc5, (byte) 0x1a, (byte) 0x51, (byte) 0xb1, (byte) 0x04, (byte) 0x80,
218e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xee, (byte) 0x3a, (byte) 0xec, (byte) 0x2f, (byte) 0xe1, (byte) 0xfd,
219e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x58, (byte) 0xeb, (byte) 0xed, (byte) 0x82, (byte) 0x9e, (byte) 0x38,
220e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa3, (byte) 0x24, (byte) 0x75, (byte) 0xf7, (byte) 0x3e, (byte) 0xc2,
221e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc5, (byte) 0x27, (byte) 0xeb, (byte) 0x6f, (byte) 0x7b, (byte) 0x50,
222e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xda, (byte) 0x43, (byte) 0xdc, (byte) 0x3b, (byte) 0x0b, (byte) 0x6f,
223e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x78, (byte) 0x8f, (byte) 0xb0, (byte) 0x66, (byte) 0xe1, (byte) 0x12,
224e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x87, (byte) 0x5f, (byte) 0x97, (byte) 0x7b, (byte) 0xca, (byte) 0x14,
225e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x79, (byte) 0xf7, (byte) 0xe8, (byte) 0x6c, (byte) 0x72, (byte) 0xdb,
226e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x91, (byte) 0x65, (byte) 0x17, (byte) 0x54, (byte) 0xe0, (byte) 0x74,
227e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1d, (byte) 0xac, (byte) 0x47, (byte) 0x04, (byte) 0x12, (byte) 0xe0,
228e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc3, (byte) 0x66, (byte) 0x19, (byte) 0x05, (byte) 0x2e, (byte) 0x7e,
229e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf1, (byte) 0x61
230e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    };
231e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
232e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    /**
233e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * Generated from above and converted with:
234e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     *
235e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
236e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     */
237f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
238e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
239e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
240e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
241e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
242e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
243e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
244e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
245e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
246e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
247e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
248e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
249e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
250e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
251e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
252e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
253e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
254e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
255e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
256e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
257e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
258e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
259e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
260e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
261e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
262e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
263e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
264e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
265e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
266e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
267e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
268e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
269e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
270e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
271e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
272e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
273e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
274e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
275e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
276e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
277e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
278e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
279e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
280e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
281e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
282e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
283e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
284e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
285e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
286e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
287e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
288e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
289e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
290e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
291e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
292e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
293e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
294e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
295e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
296e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
297e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
298e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
299e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
300e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
301e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
302e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
303e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
304e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
305e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
306e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
307e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
308e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
309e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
310e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
311e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
312e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
313e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
314e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
315e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
316e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
317e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
318e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
319e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
320e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
321e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
322e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
323e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
324e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
325e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
326e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
327e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
328e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
329e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
330e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
331e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
332e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
333e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
334e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
335e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
336e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
337e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
338e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
339e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
340e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
341e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
342e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
343e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
344e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    };
345e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
346e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    /**
347e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * Generated from above and converted with:
348e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     *
349e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
350e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     */
351f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_RSA_USER_1 = new byte[] {
352e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
353e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
354e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
355e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
356e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
357e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
358e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
359e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
360e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
361e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
362e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
363e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
364e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
365e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
366e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
367e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
368e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
369e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
370e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30, (byte) 0x1e,
371e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32, (byte) 0x30, (byte) 0x38,
372e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x31, (byte) 0x34, (byte) 0x32, (byte) 0x33, (byte) 0x32, (byte) 0x35,
373e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x34, (byte) 0x38, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32,
374e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x32, (byte) 0x32,
375e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x33, (byte) 0x32, (byte) 0x35, (byte) 0x34, (byte) 0x38, (byte) 0x5a,
376e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x55, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,
377e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13,
378e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
379e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08,
380e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31, (byte) 0x1b,
381e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
382e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e, (byte) 0x64,
383e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20, (byte) 0x54,
384e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43, (byte) 0x61,
385e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x31, (byte) 0x1c, (byte) 0x30,
386e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1a, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03,
387e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x13, (byte) 0x13, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76,
388e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
389e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
390e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
391e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
392e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
393e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
394e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
395e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x81, (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6,
396e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5b, (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c,
397e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x66, (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86,
398e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8a, (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3,
399e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x02, (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08,
400e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf3, (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04,
401e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6d, (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f,
402e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x67, (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c,
403e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xcb, (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30,
404e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe2, (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5,
405e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x79, (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b,
406e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xce, (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb,
407e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x08, (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff,
408e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x3b, (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9,
409e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc4, (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29,
410e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0d, (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b,
411e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x23, (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78,
412e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x08, (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5,
413e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf1, (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19,
414e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xb4, (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03,
415e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce,
416e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9e, (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03,
417e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x7b, (byte) 0x30,
418e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x79, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
419e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00,
420e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86,
421e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x48, (byte) 0x01, (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01,
422e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0d, (byte) 0x04, (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f,
423e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x70, (byte) 0x65, (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c,
424e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72,
425e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43,
426e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69,
427e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d,
428e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04,
429e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x32, (byte) 0xa1, (byte) 0x1e,
430e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x6b, (byte) 0x69, (byte) 0x04, (byte) 0xfe, (byte) 0xb3, (byte) 0xcd,
431e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xf8, (byte) 0xbb, (byte) 0x14, (byte) 0xcd, (byte) 0xff, (byte) 0xd4,
432e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0xc3, (byte) 0xab, (byte) 0x44, (byte) 0x2f, (byte) 0x30,
433e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23,
434e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14,
435e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60,
436e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c,
437e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e,
438e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5d, (byte) 0x51, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
439e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
440e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03,
441e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x46, (byte) 0x42, (byte) 0xef,
442e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x56, (byte) 0x89, (byte) 0x78, (byte) 0x90, (byte) 0x38, (byte) 0x24,
443e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x9f, (byte) 0x8c, (byte) 0x7a, (byte) 0xce, (byte) 0x7a, (byte) 0xa5,
444e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xb5, (byte) 0x1e, (byte) 0x74, (byte) 0x96, (byte) 0x34, (byte) 0x49,
445e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8b, (byte) 0xed, (byte) 0x44, (byte) 0xb3, (byte) 0xc9, (byte) 0x05,
446e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xd7, (byte) 0x48, (byte) 0x55, (byte) 0x52, (byte) 0x59, (byte) 0x15,
447e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0b, (byte) 0xaa, (byte) 0x16, (byte) 0x86, (byte) 0xd2, (byte) 0x8e,
448e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x16, (byte) 0x99, (byte) 0xe8, (byte) 0x5f, (byte) 0x11, (byte) 0x71,
449e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x42, (byte) 0x55, (byte) 0xd1, (byte) 0xc4, (byte) 0x6f, (byte) 0x2e,
450e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xa9, (byte) 0x64, (byte) 0x6f, (byte) 0xd8, (byte) 0xfd, (byte) 0x43,
451e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x13, (byte) 0x24, (byte) 0xaa, (byte) 0x67, (byte) 0xe6, (byte) 0xf5,
452e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xca, (byte) 0x80, (byte) 0x5e, (byte) 0x3a, (byte) 0x3e, (byte) 0xcc,
453e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x4f, (byte) 0xba, (byte) 0x87, (byte) 0xe6, (byte) 0xae, (byte) 0xbf,
454e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x8f, (byte) 0xd5, (byte) 0x28, (byte) 0x38, (byte) 0x58, (byte) 0x30,
455e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x24, (byte) 0xf6, (byte) 0x53, (byte) 0x5b, (byte) 0x41, (byte) 0x53,
456e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xe6, (byte) 0x45, (byte) 0xbc, (byte) 0xbe, (byte) 0xe6, (byte) 0xbb,
457e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x5d, (byte) 0xd8, (byte) 0xa7, (byte) 0xf9, (byte) 0x64, (byte) 0x99,
458e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x04, (byte) 0x43, (byte) 0x75, (byte) 0xd7, (byte) 0x2d, (byte) 0x32,
459e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x0a, (byte) 0x94, (byte) 0xaf, (byte) 0x06, (byte) 0x34, (byte) 0xae,
460e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x46, (byte) 0xbd, (byte) 0xda, (byte) 0x00, (byte) 0x0e, (byte) 0x25,
461e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0xc2, (byte) 0xf7, (byte) 0xc9, (byte) 0xc3, (byte) 0x65, (byte) 0xd2,
462e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
463e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    };
464e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
465f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /*
466f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * The keys and certificates below are generated with:
467f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
468f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
469f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl ecparam -name prime256v1 -out ecparam.pem
470f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
471f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * mkdir -p demoCA/newcerts
472f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * touch demoCA/index.txt
473f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * echo "01" > demoCA/serial
474f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
475f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
476f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
477f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
478f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with:
479f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
480f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
481f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
482f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_EC_CA_1 = {
483f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
484f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
485f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
486f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
487f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
488f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
489f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
490f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
491f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
492f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
493f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
494f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
495f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
496f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
497f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
498f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
499f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
500f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
501f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
502f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
503f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
504f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
505f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
506f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
507f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
508f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
509f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
510f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
511f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
512f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
513f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
514f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
515f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
516f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
517f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
518f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
519f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
520f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
521f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
522f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
523f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
524f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
525f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
526f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
527f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
528f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
529f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
530f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
531f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
532f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
533f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
534f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
535f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
536f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
537f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
538f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
539f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
540f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
541f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
542f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
543f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
544f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
545f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
546f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
547f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
548f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
549f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
550f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
551f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
552f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
553f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
554f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
555f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
556f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
557f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
558f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
559f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
560f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
561f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
562f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
563f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
564f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
565f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
566f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
567f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
568f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
569f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
570f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
571f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
572f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
573f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
574f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
575f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
576f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
577f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
578f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
579f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
580f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
581f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
582f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
583f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
584f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
585f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
586f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
587f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with:
588f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
589f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
590f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
591f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_EC_KEY_1 = new byte[] {
592f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
593f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
594f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
595f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
596f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
597f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
598f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
599f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
600f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
601f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
602f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
603f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
604f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
605f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
606f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
607f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
608f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
609f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
610f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
611f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
612f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
613f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
614f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
615f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
616f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
617f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
618f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with:
619f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
620f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
621f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
622f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_EC_USER_1 = new byte[] {
623f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
624f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
625f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
626f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
627f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
628f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
629f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
630f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
631f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
632f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
633f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
634f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
635f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
636f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
637f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
638f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
639f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
640f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
641f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
642f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
643f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
644f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
645f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
646f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
647f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
648f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
649f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
650f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
651f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
652f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
653f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
654f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
655f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
656f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
657f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
658f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
659f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
660f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
661f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
662f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
663f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
664f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
665f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
666f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
667f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
668f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
669f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
670f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
671f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
672f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
673f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
674f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
675f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
676f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
677f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
678f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
679f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
680f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
681f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
682f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
683f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
684f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
685f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
686f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
687f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
688f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
689f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
690f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
691f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
692f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
693f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
694f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
695f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
696f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
697f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
698f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
699f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
700f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
701f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
702f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
703f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
704f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
705f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
706f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
707f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
708f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
709f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
710f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
711f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
712f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
713f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
714f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
715f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
716f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
717f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
718f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
719f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
720f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
721f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
722f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7e, (byte) 0xde, (byte) 0xb2
723f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
724f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
725f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /*
726f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * The keys and certificates below are generated with:
727f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
728f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
729f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl dsaparam -out dsaparam.pem 1024
730f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl req -newkey dsa:dsaparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
731f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * mkdir -p demoCA/newcerts
732f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * touch demoCA/index.txt
733f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * echo "01" > demoCA/serial
734f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
735f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
736f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
737f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
738f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with:
739f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     *
740f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
741f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
742f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_DSA_CA_1 = new byte[] {
743f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x8a, (byte) 0x30, (byte) 0x82,
744f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0xf3, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
745f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0x87, (byte) 0xc0,
746f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x68, (byte) 0x7f, (byte) 0x42, (byte) 0x92, (byte) 0x0b, (byte) 0x7a,
747f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
748f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
749f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31,
750f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
751f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
752f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
753f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
754f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
755f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
756f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
757f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
758f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
759f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
760f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
761f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15,
762f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
763f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
764f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
765f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
766f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0d, (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
767f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x37, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x31, (byte) 0x32,
768f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x39, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33,
769f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33,
770f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x33, (byte) 0x31, (byte) 0x32, (byte) 0x39, (byte) 0x5a, (byte) 0x30,
771f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,
772f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02,
773f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11,
774f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c,
775f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
776f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31,
777f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
778f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e,
779f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74,
780f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69,
781f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79,
782f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17,
783f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
784f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e,
785f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c,
786f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
787f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
788f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
789f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
790f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
791f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa4, (byte) 0xc7,
792f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0xba, (byte) 0xdf, (byte) 0x2b, (byte) 0xee, (byte) 0xd2,
793f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb9, (byte) 0xe4, (byte) 0x52, (byte) 0x21, (byte) 0x68, (byte) 0x2b,
794f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x83, (byte) 0xdf, (byte) 0xe3, (byte) 0x9c, (byte) 0x08, (byte) 0x73,
795f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xdd, (byte) 0x90, (byte) 0xea, (byte) 0x97, (byte) 0x0c, (byte) 0x96,
796f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0xb1, (byte) 0xee, (byte) 0x11, (byte) 0xd5, (byte) 0xd4,
797f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7c, (byte) 0x44, (byte) 0x96, (byte) 0x2e, (byte) 0x6e, (byte) 0xa2,
798f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb2, (byte) 0xa3, (byte) 0x4b, (byte) 0x0f, (byte) 0x32, (byte) 0x90,
799f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xaf, (byte) 0x5c, (byte) 0x6f, (byte) 0x00, (byte) 0x88, (byte) 0x45,
800f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4e, (byte) 0x9b, (byte) 0x26, (byte) 0xc1, (byte) 0x94, (byte) 0x3c,
801f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfe, (byte) 0x10, (byte) 0xbd, (byte) 0xda, (byte) 0xf2, (byte) 0x8d,
802f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x52, (byte) 0x32, (byte) 0x11, (byte) 0xff, (byte) 0xf6,
803f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf9, (byte) 0x6e, (byte) 0x8f, (byte) 0x0f, (byte) 0xc8, (byte) 0x0a,
804f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x39, (byte) 0x33, (byte) 0xb9, (byte) 0x0c, (byte) 0xb3,
805f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2b, (byte) 0xab, (byte) 0x7d, (byte) 0x79, (byte) 0x6f, (byte) 0x57,
806f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5b, (byte) 0xb8, (byte) 0x84, (byte) 0xb6, (byte) 0xcc, (byte) 0xe8,
807f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x78, (byte) 0xff, (byte) 0x92, (byte) 0xe5, (byte) 0x43,
808f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2e, (byte) 0xef, (byte) 0x66, (byte) 0x98, (byte) 0xb4, (byte) 0xfe,
809f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa2, (byte) 0x40, (byte) 0xf2, (byte) 0x1f, (byte) 0xd0, (byte) 0x86,
810f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x16, (byte) 0xc8, (byte) 0x45, (byte) 0xc4, (byte) 0x52, (byte) 0xcb,
811f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x5c, (byte) 0x9f, (byte) 0x32, (byte) 0x3b, (byte) 0xf7,
812f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x19, (byte) 0x08, (byte) 0xc7, (byte) 0x00, (byte) 0x21, (byte) 0x7d,
813f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
814f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
815f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
816f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3, (byte) 0xf1,
817f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f, (byte) 0x30,
818f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15, (byte) 0x32,
819f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30, (byte) 0x1f,
820f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
821f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47,
822f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x82, (byte) 0xa3, (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a,
823f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xde, (byte) 0x4f, (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72,
824f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x15, (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58,
825f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x18, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
826f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
827f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
828f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
829f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00,
830f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x7f,
831f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6a, (byte) 0x48, (byte) 0x90, (byte) 0x7b, (byte) 0x9b, (byte) 0x72,
832f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0xa7, (byte) 0xef, (byte) 0x6b, (byte) 0x0b, (byte) 0x59,
833f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe5, (byte) 0x49, (byte) 0x72, (byte) 0x3a, (byte) 0xc8, (byte) 0x84,
834f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcc, (byte) 0x23, (byte) 0x18, (byte) 0x4c, (byte) 0xec, (byte) 0xc7,
835f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xef, (byte) 0xcb, (byte) 0xa7, (byte) 0xbe, (byte) 0xe4, (byte) 0xef,
836f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8f, (byte) 0xc6, (byte) 0x06, (byte) 0x8c, (byte) 0xc0, (byte) 0xe4,
837f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2f, (byte) 0x2a, (byte) 0xc0, (byte) 0x35, (byte) 0x7d, (byte) 0x5e,
838f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x19, (byte) 0x29, (byte) 0x8c, (byte) 0xb9, (byte) 0xf1, (byte) 0x1e,
839f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xaf, (byte) 0x82, (byte) 0xd8, (byte) 0xe3, (byte) 0x88, (byte) 0xe1,
840f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0xc8, (byte) 0x82, (byte) 0x1f, (byte) 0x83, (byte) 0xa9,
841f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xde, (byte) 0xfe, (byte) 0x4b, (byte) 0xe2, (byte) 0x78, (byte) 0x64,
842f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xed, (byte) 0xa4, (byte) 0x7b, (byte) 0xee, (byte) 0x8d, (byte) 0x71,
843f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1b, (byte) 0x44, (byte) 0xe6, (byte) 0xb7, (byte) 0xe8, (byte) 0xc5,
844f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9a, (byte) 0x93, (byte) 0x92, (byte) 0x6f, (byte) 0x6f, (byte) 0xdb,
845f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbd, (byte) 0xd7, (byte) 0x03, (byte) 0x85, (byte) 0xa9, (byte) 0x5f,
846f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x53, (byte) 0x5f, (byte) 0x5d, (byte) 0x30, (byte) 0xc6, (byte) 0xd9,
847f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xce, (byte) 0x34, (byte) 0xa8, (byte) 0xbe, (byte) 0x31, (byte) 0x47,
848f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1c, (byte) 0xa4, (byte) 0x7f, (byte) 0xc0, (byte) 0x2c, (byte) 0xbc,
849f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfe, (byte) 0x1a, (byte) 0x31, (byte) 0xd8, (byte) 0x77, (byte) 0x4d,
850f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfc, (byte) 0x45, (byte) 0x84, (byte) 0xfc, (byte) 0x45, (byte) 0x12,
851f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xab, (byte) 0x50, (byte) 0xe4, (byte) 0x45, (byte) 0xe5, (byte) 0x11
852f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
853f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
854f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
855f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with: openssl pkcs8 -topk8 -outform d
856f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
857f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
858f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_DSA_KEY_1 = new byte[] {
859f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x4c, (byte) 0x02, (byte) 0x01,
860f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06,
861f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38,
862f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x01, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f,
863f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23,
864f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0x86, (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc,
865f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc3, (byte) 0x91, (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02,
866f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x47, (byte) 0x35, (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98,
867f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0x56, (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20,
868f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa8, (byte) 0x60, (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77,
869f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc1, (byte) 0x69, (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92,
870f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf2, (byte) 0x6a, (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c,
871f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x91, (byte) 0x20, (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2,
872f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x87, (byte) 0xa6, (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45,
873f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x46, (byte) 0xf9, (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38,
874f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8d, (byte) 0xff, (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f,
875f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x66, (byte) 0x15, (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb,
876f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x57, (byte) 0x39, (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd,
877f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe2, (byte) 0xb4, (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32,
878f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3b, (byte) 0x9d, (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d,
879f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x75, (byte) 0xb9, (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba,
880f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb7, (byte) 0xc8, (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71,
881f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x91, (byte) 0xd3, (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e,
882f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7c, (byte) 0x15, (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52,
883f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x4d, (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35,
884f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xce, (byte) 0x0b, (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1,
885f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f,
886f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7a, (byte) 0x31, (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2,
887f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0xaf, (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92,
888f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf3, (byte) 0x6c, (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02,
889f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36,
890f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0xdb, (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce,
891f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6d, (byte) 0xbc, (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50,
892f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x91, (byte) 0x10, (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50,
893f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xda, (byte) 0x4f, (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb,
894f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4d, (byte) 0xb0, (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3,
895f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6c, (byte) 0xc9, (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0,
896f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x54, (byte) 0x7e, (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e,
897f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5f, (byte) 0xc0, (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3,
898f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd3, (byte) 0xdf, (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb,
899f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe6, (byte) 0x20, (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca,
900f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xdb, (byte) 0xc0, (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16,
901f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0xb3, (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89,
902f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x17, (byte) 0x73, (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60,
903f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb7, (byte) 0xaa, (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03,
904f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4e, (byte) 0x36, (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa,
905f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf3, (byte) 0xd6, (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4,
906f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x41, (byte) 0xd6, (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b,
907f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2d, (byte) 0x23, (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39,
908f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa8, (byte) 0x6a, (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2,
909f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x77, (byte) 0x91, (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48,
910f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x78, (byte) 0xcd, (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x04,
911f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x17, (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xc7, (byte) 0xe7,
912f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe2, (byte) 0x6b, (byte) 0x14, (byte) 0xe6, (byte) 0x31, (byte) 0x12,
913f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb2, (byte) 0x1e, (byte) 0xd4, (byte) 0xf2, (byte) 0x9b, (byte) 0x2c,
914f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf6, (byte) 0x54, (byte) 0x4c, (byte) 0x12, (byte) 0xe8, (byte) 0x22
915f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
916f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
917f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    /**
918f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * Generated from above and converted with: openssl x509 -outform d -in
919f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     * usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
920f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root     */
921f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private static final byte[] FAKE_DSA_USER_1 = new byte[] {
922f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xca, (byte) 0x30, (byte) 0x82,
923f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x33, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
924f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
925f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
926f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
927f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
928f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
929f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
930f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
931f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
932f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
933f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
934f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
935f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
936f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
937f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
938f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
939f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03,
940f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63,
941f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
942f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
943f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
944f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x32,
945f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x33, (byte) 0x33, (byte) 0x34, (byte) 0x32, (byte) 0x32, (byte) 0x5a,
946f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38,
947f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x34,
948f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31,
949f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
950f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
951f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
952f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
953f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
954f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
955f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
956f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
957f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
958f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
959f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
960f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
961f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
962f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x12, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65,
963f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
964f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
965f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xb7, (byte) 0x30,
966f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
967f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38, (byte) 0x04, (byte) 0x01,
968f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f, (byte) 0x02, (byte) 0x81,
969f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23, (byte) 0xf7, (byte) 0x86,
970f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc, (byte) 0xc3, (byte) 0x91,
971f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02, (byte) 0x47, (byte) 0x35,
972f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98, (byte) 0x13, (byte) 0x56,
973f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20, (byte) 0xa8, (byte) 0x60,
974f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77, (byte) 0xc1, (byte) 0x69,
975f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92, (byte) 0xf2, (byte) 0x6a,
976f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c, (byte) 0x91, (byte) 0x20,
977f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2, (byte) 0x87, (byte) 0xa6,
978f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45, (byte) 0x46, (byte) 0xf9,
979f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38, (byte) 0x8d, (byte) 0xff,
980f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f, (byte) 0x66, (byte) 0x15,
981f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb, (byte) 0x57, (byte) 0x39,
982f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd, (byte) 0xe2, (byte) 0xb4,
983f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32, (byte) 0x3b, (byte) 0x9d,
984f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d, (byte) 0x75, (byte) 0xb9,
985f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba, (byte) 0xb7, (byte) 0xc8,
986f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71, (byte) 0x91, (byte) 0xd3,
987f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e, (byte) 0x7c, (byte) 0x15,
988f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52, (byte) 0x65, (byte) 0x4d,
989f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35, (byte) 0xce, (byte) 0x0b,
990f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1, (byte) 0x02, (byte) 0x15,
991f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f, (byte) 0x7a, (byte) 0x31,
992f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2, (byte) 0xf7, (byte) 0xaf,
993f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92, (byte) 0xf3, (byte) 0x6c,
994f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02, (byte) 0x81, (byte) 0x81,
995f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36, (byte) 0x48, (byte) 0xdb,
996f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce, (byte) 0x6d, (byte) 0xbc,
997f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50, (byte) 0x91, (byte) 0x10,
998f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50, (byte) 0xda, (byte) 0x4f,
999f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb, (byte) 0x4d, (byte) 0xb0,
1000f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3, (byte) 0x6c, (byte) 0xc9,
1001f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0, (byte) 0x54, (byte) 0x7e,
1002f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e, (byte) 0x5f, (byte) 0xc0,
1003f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3, (byte) 0xd3, (byte) 0xdf,
1004f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb, (byte) 0xe6, (byte) 0x20,
1005f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca, (byte) 0xdb, (byte) 0xc0,
1006f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16, (byte) 0x1d, (byte) 0xb3,
1007f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89, (byte) 0x17, (byte) 0x73,
1008f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60, (byte) 0xb7, (byte) 0xaa,
1009f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03, (byte) 0x4e, (byte) 0x36,
1010f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa, (byte) 0xf3, (byte) 0xd6,
1011f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4, (byte) 0x41, (byte) 0xd6,
1012f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b, (byte) 0x2d, (byte) 0x23,
1013f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39, (byte) 0xa8, (byte) 0x6a,
1014f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2, (byte) 0x77, (byte) 0x91,
1015f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48, (byte) 0x78, (byte) 0xcd,
1016f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x03, (byte) 0x81, (byte) 0x84,
1017f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x1a, (byte) 0x50,
1018f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9d, (byte) 0x3e, (byte) 0xa1, (byte) 0x6c, (byte) 0x99, (byte) 0x35,
1019f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x36, (byte) 0x26, (byte) 0x22, (byte) 0x6b, (byte) 0x47, (byte) 0x45,
1020f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x80, (byte) 0x5b, (byte) 0xd5, (byte) 0xc1, (byte) 0xc5, (byte) 0x70,
1021f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x75, (byte) 0x55, (byte) 0x66, (byte) 0x33, (byte) 0x1d, (byte) 0xae,
1022f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd0, (byte) 0x01, (byte) 0x64, (byte) 0x8b, (byte) 0xae, (byte) 0x9d,
1023f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x66, (byte) 0x58, (byte) 0xf9, (byte) 0x42, (byte) 0x74, (byte) 0x3a,
1024f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0xc7, (byte) 0x7f, (byte) 0x25, (byte) 0x64, (byte) 0x7d,
1025f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x08, (byte) 0x26, (byte) 0xbf, (byte) 0x21, (byte) 0x3a, (byte) 0x84,
1026f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xcc, (byte) 0x2c, (byte) 0x66, (byte) 0x7d, (byte) 0xc7, (byte) 0xd6,
1027f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb1, (byte) 0x69, (byte) 0x57, (byte) 0x67, (byte) 0x52, (byte) 0x73,
1028f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3f, (byte) 0x79, (byte) 0x60, (byte) 0xaa, (byte) 0xf4, (byte) 0x8a,
1029f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x48, (byte) 0x42, (byte) 0x46, (byte) 0x41, (byte) 0xd0, (byte) 0x50,
1030f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9b, (byte) 0xa2, (byte) 0x4e, (byte) 0xa5, (byte) 0x88, (byte) 0x10,
1031f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf7, (byte) 0x61, (byte) 0xa2, (byte) 0xfa, (byte) 0x8d, (byte) 0xa6,
1032f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x13, (byte) 0x9e, (byte) 0x36, (byte) 0x86, (byte) 0x62, (byte) 0xf0,
1033f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x97, (byte) 0xef, (byte) 0x11, (byte) 0xc6, (byte) 0x35, (byte) 0xd3,
1034f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x79, (byte) 0x30, (byte) 0xde, (byte) 0xf2, (byte) 0x7f, (byte) 0x7a,
1035f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3c, (byte) 0x03, (byte) 0xa3, (byte) 0xc5, (byte) 0xbc, (byte) 0xb1,
1036f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbc, (byte) 0x2f, (byte) 0x10, (byte) 0xf4, (byte) 0x51, (byte) 0x89,
1037f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xe2, (byte) 0xaf, (byte) 0xf7, (byte) 0x61, (byte) 0x1a, (byte) 0xf0,
1038f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x87, (byte) 0x5e, (byte) 0xa5, (byte) 0x02, (byte) 0xd2, (byte) 0xe4,
1039f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30, (byte) 0x09,
1040f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,
1041f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c, (byte) 0x06,
1042f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, (byte) 0x86,
1043f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04, (byte) 0x1f,
1044f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65, (byte) 0x6e,
1045f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47, (byte) 0x65,
1046f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74, (byte) 0x65,
1047f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,
1048f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,
1049f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
1050f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
1051f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xd1, (byte) 0x6c, (byte) 0x36, (byte) 0x36, (byte) 0x61, (byte) 0x6c,
1052f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf6, (byte) 0x90, (byte) 0x82, (byte) 0x82, (byte) 0x87, (byte) 0x93,
1053f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xbe, (byte) 0x99, (byte) 0x60, (byte) 0x1b, (byte) 0x03, (byte) 0x58,
1054f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x36, (byte) 0x63, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
1055f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
1056f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3,
1057f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f,
1058f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15,
1059f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30,
1060f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
1061f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
1062f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
1063f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x81, (byte) 0xde, (byte) 0x20, (byte) 0xa1, (byte) 0xb2, (byte) 0x50,
1064f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x03, (byte) 0xcd, (byte) 0x90, (byte) 0x4f, (byte) 0x2b, (byte) 0x47,
1065f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0xac, (byte) 0x6e, (byte) 0xb4, (byte) 0xc7, (byte) 0x14,
1066f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xc6, (byte) 0x4f, (byte) 0x45, (byte) 0xaf, (byte) 0x81, (byte) 0x5d,
1067f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x5a, (byte) 0x31, (byte) 0xff, (byte) 0x9c, (byte) 0x4d, (byte) 0xdc,
1068f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x9e, (byte) 0x36, (byte) 0x9f, (byte) 0x9b, (byte) 0xb1, (byte) 0xc9,
1069f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x50, (byte) 0xa3, (byte) 0xf6, (byte) 0x9c, (byte) 0x68, (byte) 0x6f,
1070f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x68, (byte) 0xd9, (byte) 0x56, (byte) 0x1b, (byte) 0xe5, (byte) 0x1b,
1071f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x41, (byte) 0xd4, (byte) 0xcc, (byte) 0xb6, (byte) 0x37, (byte) 0xd5,
1072f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x69, (byte) 0x6b, (byte) 0x39, (byte) 0xaf, (byte) 0xc6, (byte) 0xb8,
1073f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x39, (byte) 0x76, (byte) 0xe3, (byte) 0xf7, (byte) 0x97, (byte) 0x74,
1074f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x31, (byte) 0xc4, (byte) 0x2d, (byte) 0xb7, (byte) 0x9a, (byte) 0xa4,
1075f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xfa, (byte) 0x9f, (byte) 0xa8, (byte) 0xe3, (byte) 0x41, (byte) 0xda,
1076f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x2f, (byte) 0x0c, (byte) 0x9d, (byte) 0x83, (byte) 0xdc, (byte) 0x86,
1077f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1f, (byte) 0x5c, (byte) 0x0f, (byte) 0x87, (byte) 0x05, (byte) 0xc9,
1078f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb0, (byte) 0x63, (byte) 0xca, (byte) 0x9b, (byte) 0xdb, (byte) 0xe6,
1079f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x3c, (byte) 0xe9, (byte) 0x23, (byte) 0x9e, (byte) 0x23, (byte) 0x44,
1080f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x1d, (byte) 0x5b, (byte) 0x60, (byte) 0x66, (byte) 0xb6, (byte) 0x72,
1081f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x8c, (byte) 0x87, (byte) 0x86, (byte) 0xe8, (byte) 0xdb, (byte) 0x29,
1082f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0x67, (byte) 0x9c, (byte) 0x33, (byte) 0x5c, (byte) 0x39, (byte) 0xf1,
1083f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xb5, (byte) 0x9b, (byte) 0xb8, (byte) 0xe1, (byte) 0x42, (byte) 0x51,
1084f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            (byte) 0xed, (byte) 0x2c
1085f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    };
1086f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1087e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    /**
1088e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * The amount of time to allow before and after expected time for variance
1089e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     * in timing tests.
1090e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root     */
1091e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private static final long SLOP_TIME_MILLIS = 15000L;
1092e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1093e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    @Override
1094e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    protected void setUp() throws Exception {
1095e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mAndroidKeyStore = android.security.KeyStore.getInstance();
1096e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1097e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.reset());
1098b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root        assertFalse(mAndroidKeyStore.isUnlocked());
1099e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11002eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
11012eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
11022eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
11032eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    private void setupPassword() {
1104e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.password("1111"));
1105b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root        assertTrue(mAndroidKeyStore.isUnlocked());
1106e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1107e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals(0, mAndroidKeyStore.saw("").length);
1108e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1109e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1110e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    private void assertAliases(final String[] expectedAliases) throws KeyStoreException {
1111e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final Enumeration<String> aliases = mKeyStore.aliases();
1112e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        int count = 0;
1113e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1114e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final Set<String> expectedSet = new HashSet<String>();
1115e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        expectedSet.addAll(Arrays.asList(expectedAliases));
1116e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1117e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        while (aliases.hasMoreElements()) {
1118e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            count++;
1119e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final String alias = aliases.nextElement();
1120e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("The alias should be in the expected set", expectedSet.contains(alias));
1121e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            expectedSet.remove(alias);
1122e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
1123e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("The expected set and actual set should be exactly equal", expectedSet.isEmpty());
1124e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("There should be the correct number of keystore entries",
1125e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                expectedAliases.length, count);
1126e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1127e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11282eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Aliases_Encrypted_Success() throws Exception {
11292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
11302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1131e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1132e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1133e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] {});
1134e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1135b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root        assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1136f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
1137f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                null));
1138e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1139e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1140e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1141f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
1142b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1143e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1144e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
1145e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1146e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Aliases_NotInitialized_Encrypted_Failure() throws Exception {
11482eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
11492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1150e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
1151e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.aliases();
1152e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("KeyStore should throw exception when not initialized");
1153e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (KeyStoreException success) {
1154e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
1155e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1156e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_ContainsAliases_PrivateAndCA_Encrypted_Success() throws Exception {
11582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
11592eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1160e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1161e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1162e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] {});
1163e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1164b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root        assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1165f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
1166f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                null));
1167e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1168e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
1169e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1170f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
1171b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1172e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1173e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
1174e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1175e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should not contain unadded certificate alias",
1176e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.containsAlias(TEST_ALIAS_3));
1177e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1178e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11792eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_ContainsAliases_CAOnly_Encrypted_Success() throws Exception {
11802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
11812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1182e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1183e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1184f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
1185b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1186e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1187e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
1188e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1189e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11902eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_ContainsAliases_NonExistent_Encrypted_Failure() throws Exception {
11912eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
11922eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1193e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1194e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1195e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_1));
1196e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1197e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
11982eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_DeleteEntry_Encrypted_Success() throws Exception {
11992eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12002eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1201e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1202e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1203e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TEST_ALIAS_1
1204e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1205f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1206f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1207b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1208f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1209b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1210e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1211e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TEST_ALIAS_2
1212f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
1213b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1214e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1215e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TEST_ALIAS_3
1216f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_RSA_CA_1,
1217b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1218e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1219e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
1220e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1221e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.deleteEntry(TEST_ALIAS_1);
1222e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1223e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
1224e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1225e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.deleteEntry(TEST_ALIAS_3);
1226e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1227e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_2 });
1228e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1229e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.deleteEntry(TEST_ALIAS_2);
1230e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1231e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { });
1232e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1233e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_DeleteEntry_EmptyStore_Encrypted_Success() throws Exception {
12352eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12362eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1237e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1238e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12398b58c52bf4cc276165b1857eb4087eabde7b6477Kenny Root        // Should not throw when a non-existent entry is requested for delete.
12408b58c52bf4cc276165b1857eb4087eabde7b6477Kenny Root        mKeyStore.deleteEntry(TEST_ALIAS_1);
1241e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1242e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_DeleteEntry_NonExistent_Encrypted_Success() throws Exception {
12442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1246e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1247e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1248e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TEST_ALIAS_1
1249e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1250f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1251f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1252b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1253f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1254b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1255e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12568b58c52bf4cc276165b1857eb4087eabde7b6477Kenny Root        // Should not throw when a non-existent entry is requested for delete.
12578b58c52bf4cc276165b1857eb4087eabde7b6477Kenny Root        mKeyStore.deleteEntry(TEST_ALIAS_2);
1258e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1259e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12602eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificate_Single_Encrypted_Success() throws Exception {
12612eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1263e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1264e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1265f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1266b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1267e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1268e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1269e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1270e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Certificate should not exist in keystore",
1271e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificate(TEST_ALIAS_2));
1272e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1273e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
1274e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1275e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Retrieved certificate should not be null", retrieved);
1276e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1277e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1278f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1279e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1280e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
1281e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1282e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12832eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificate_NonExist_Encrypted_Failure() throws Exception {
12842eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12852eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1286e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1287e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1288e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Certificate should not exist in keystore",
1289e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificate(TEST_ALIAS_1));
1290e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1291e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
12922eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateAlias_CAEntry_Encrypted_Success() throws Exception {
12932eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
12942eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1295e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1296e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1297f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1298b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1299e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1300e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1301f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1302e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1303e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
1304e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateAlias(actual));
1305e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1306e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
13072eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateAlias_PrivateKeyEntry_Encrypted_Success()
13082eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
13092eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
13102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1311e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1312e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1313e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1314f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1315f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1316b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1317f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1318b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1319e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1320e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1321f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1322e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1323e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
1324e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateAlias(actual));
1325e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1326e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
13272eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateAlias_CAEntry_WithPrivateKeyUsingCA_Encrypted_Success()
1328e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            throws Exception {
13292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
13302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1331e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1332e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1333e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Insert TrustedCertificateEntry with CA name
1334f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
1335b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1336e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1337e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Insert PrivateKeyEntry that uses the same CA
1338e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1339f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1340f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1341b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1342f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1343b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1344e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1345e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1346f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1347e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1348e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
1349e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateAlias(actual));
1350e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1351e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
13522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateAlias_NonExist_Empty_Encrypted_Failure()
13532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
13542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
13552eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1356e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1357e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1358e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1359f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1360e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1361e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Stored certificate alias should not be found",
1362e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateAlias(actual));
1363e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1364e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
13652eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateAlias_NonExist_Encrypted_Failure() throws Exception {
13662eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
13672eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1368e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1369e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1370f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1371b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1372e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1373e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory f = CertificateFactory.getInstance("X.509");
1374f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1375e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1376e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Stored certificate alias should be found",
1377e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateAlias(userCert));
1378e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1379e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
13802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateChain_SingleLength_Encrypted_Success() throws Exception {
13812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
13822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1383e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1384e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1385e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1386f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1387f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1388b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1389f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1390b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1391e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1392e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory cf = CertificateFactory.getInstance("X.509");
1393e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate[] expected = new Certificate[2];
1394f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1395f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1396e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1397e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
1398e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1399e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Returned certificate chain should not be null", actual);
1400e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Returned certificate chain should be correct size", expected.length,
1401e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                actual.length);
1402e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("First certificate should be user certificate", expected[0], actual[0]);
1403e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Second certificate should be CA certificate", expected[1], actual[1]);
1404e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1405e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Negative test when keystore is populated.
1406e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Stored certificate alias should not be found",
1407e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateChain(TEST_ALIAS_2));
1408e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1409e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
14102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCertificateChain_NonExist_Encrypted_Failure() throws Exception {
14112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
14122eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1413e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1414e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1415e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Stored certificate alias should not be found",
1416e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getCertificateChain(TEST_ALIAS_1));
1417e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1418e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
14192eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCreationDate_PrivateKeyEntry_Encrypted_Success() throws Exception {
14202eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
14212eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1422e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1423e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1424e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1425f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1426f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1427b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1428f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1429b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1430e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1431e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date now = new Date();
1432e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
1433e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1434e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
1435e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
1436e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1437e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Time should be close to current time", actual.before(expectedBefore));
1438e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Time should be close to current time", actual.after(expectedAfter));
1439e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1440e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
14412eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCreationDate_PrivateKeyEntry_Unencrypted_Success() throws Exception {
14422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
14432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
14442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1445f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1446f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
14472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1448f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
14492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
14502eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
14512eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Date now = new Date();
14522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
14532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
14542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
14552eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
14562eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
14572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue("Time should be close to current time", actual.before(expectedBefore));
14582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue("Time should be close to current time", actual.after(expectedAfter));
14592eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
14602eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
14612eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetCreationDate_CAEntry_Encrypted_Success() throws Exception {
14622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
14632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1464e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1465e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1466f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1467b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1468e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1469e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date now = new Date();
1470e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
1471e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Certificate should be found", actual);
1472e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1473e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
1474e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
1475e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1476e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Time should be close to current time", actual.before(expectedBefore));
1477e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Time should be close to current time", actual.after(expectedAfter));
1478e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1479e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
14802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetEntry_NullParams_Encrypted_Success() throws Exception {
14812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
14822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1483e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1484e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1485e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1486f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1487f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1488b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1489f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1490b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1491e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1492e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1493e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Entry should exist", entry);
1494e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1495e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
1496e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1497e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
1498e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1499f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
1500f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_CA_1);
1501f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    }
1502f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1503f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_GetEntry_DSA_NullParams_Unencrypted_Success() throws Exception {
1504f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.load(null, null);
1505f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1506f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1507f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_DSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1508f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
1509f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_DSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1510f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_DSA_CA_1,
1511f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1512f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1513f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1514f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertNotNull("Entry should exist", entry);
1515f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1516f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
1517f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1518f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
1519f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1520f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
1521e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1522e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1523f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
15242eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
15252eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
15262eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1527f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_EC_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1528f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
1529f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_EC_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1530f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_EC_CA_1,
15312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1532f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1533f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1534f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertNotNull("Entry should exist", entry);
1535f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1536f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
1537f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1538f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
1539f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1540f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
1541f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    }
1542f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1543f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
1544f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.load(null, null);
1545f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1546f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1547f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1548f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
1549f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1550f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
15512eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
15522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
15532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
15542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNotNull("Entry should exist", entry);
15552eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
15562eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
15572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
15582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
15592eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1560f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
1561f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_CA_1);
15622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
15632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1564802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    @SuppressWarnings("unchecked")
1565f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
1566f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            byte[] cert, byte[] ca) throws Exception {
1567f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        KeyFactory keyFact = KeyFactory.getInstance(keyType);
1568e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
1569e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1570e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        CertificateFactory certFact = CertificateFactory.getInstance("X.509");
1571e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate expectedCert = certFact.generateCertificate(new ByteArrayInputStream(cert));
1572e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1573802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final Collection<Certificate> expectedChain;
1574802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        if (ca != null) {
1575802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            expectedChain = (Collection<Certificate>) certFact
1576802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    .generateCertificates(new ByteArrayInputStream(ca));
1577802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        } else {
1578802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            expectedChain = null;
1579802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
1580802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
1581802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, expectedChain);
1582802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    }
1583802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
1584802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
1585802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
1586f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        if (expectedKey instanceof DSAPrivateKey) {
1587f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertEquals("Returned PrivateKey should be what we inserted",
1588f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((DSAPrivateKey) expectedKey).getParams(),
1589f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((DSAPublicKey) keyEntry.getCertificate().getPublicKey()).getParams());
1590f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        } else if (expectedKey instanceof ECPrivateKey) {
1591f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertEquals("Returned PrivateKey should be what we inserted",
1592f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((ECPrivateKey) expectedKey).getParams().getCurve(),
1593f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((ECPublicKey) keyEntry.getCertificate().getPublicKey()).getParams().getCurve());
1594f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        } else if (expectedKey instanceof RSAPrivateKey) {
1595f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertEquals("Returned PrivateKey should be what we inserted",
1596f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((RSAPrivateKey) expectedKey).getModulus(),
1597f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
1598f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        }
1599802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
1600e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Returned Certificate should be what we inserted", expectedCert,
1601e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                keyEntry.getCertificate());
1602e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1603e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate[] actualChain = keyEntry.getCertificateChain();
1604e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1605e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("First certificate in chain should be user cert", expectedCert, actualChain[0]);
1606e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1607802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        if (expectedChain == null) {
1608e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertEquals("Certificate chain should not include CAs", 1, actualChain.length);
1609e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } else {
1610e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            int i = 1;
1611e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Iterator<Certificate> it = expectedChain.iterator();
1612e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            while (it.hasNext()) {
1613e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                assertEquals("CA chain certificate should equal what we put in", it.next(),
1614e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                        actualChain[i++]);
1615e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            }
1616e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
1617e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1618e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
16192eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetEntry_Nonexistent_NullParams_Encrypted_Failure() throws Exception {
16202eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
16212eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1622e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1623e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1624e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("A non-existent entry should return null",
1625e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.getEntry(TEST_ALIAS_1, null));
1626e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1627e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
16282eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetEntry_Nonexistent_NullParams_Unencrypted_Failure() throws Exception {
16292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
16302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNull("A non-existent entry should return null",
16322eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                mKeyStore.getEntry(TEST_ALIAS_1, null));
16332eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
16342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16352eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetKey_NoPassword_Encrypted_Success() throws Exception {
16362eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
16372eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1638e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1639e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1640e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1641f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1642f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1643b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1644f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1645b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1646e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1647e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
1648e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Key should exist", key);
1649e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1650e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should be a RSAPrivateKey", key instanceof RSAPrivateKey);
1651e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1652e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        RSAPrivateKey actualKey = (RSAPrivateKey) key;
1653e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1654e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
1655f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
1656e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
16572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals("Inserted key should be same as retrieved key",
16582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
1659e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1660e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
16612eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetKey_NoPassword_Unencrypted_Success() throws Exception {
16622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
16632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16642eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1665f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1666f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
16672eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
1668f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
16692eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_NONE));
16702eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16712eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
16722eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNotNull("Key should exist", key);
16732eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16742eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue("Should be a RSAPrivateKey", key instanceof RSAPrivateKey);
16752eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16762eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        RSAPrivateKey actualKey = (RSAPrivateKey) key;
16772eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16782eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
1679f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
16802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals("Inserted key should be same as retrieved key",
16822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
16832eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
16842eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
16852eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetKey_Certificate_Encrypted_Failure() throws Exception {
16862eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
16872eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1688e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1689e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1690f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1691b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1692e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1693e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
1694e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1695e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
16962eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetKey_NonExistent_Encrypted_Failure() throws Exception {
16972eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
16982eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1699e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1700e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1701e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNull("A non-existent entry should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
1702e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1703e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17042eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetProvider_Encrypted_Success() throws Exception {
17052eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
17062eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1707e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
1708e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1709e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_GetType_Encrypted_Success() throws Exception {
17112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertEquals(AndroidKeyStore.NAME, mKeyStore.getType());
17122eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1713e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals(AndroidKeyStore.NAME, mKeyStore.getType());
1714e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1715e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17162eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsCertificateEntry_CA_Encrypted_Success() throws Exception {
17172eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1718e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1719e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1720f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1721b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1722e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1723e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should return true for CA certificate",
1724e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.isCertificateEntry(TEST_ALIAS_1));
1725e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1726e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17272eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsCertificateEntry_PrivateKey_Encrypted_Failure() throws Exception {
17282eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1729e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1730e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1731e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1732f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1733f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1734b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1735f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1736b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1737e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1738e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should return false for PrivateKeyEntry",
1739e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.isCertificateEntry(TEST_ALIAS_1));
1740e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1741e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsCertificateEntry_NonExist_Encrypted_Failure() throws Exception {
17432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
17442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
17452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
17462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertFalse("Should return false for non-existent entry",
17472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                mKeyStore.isCertificateEntry(TEST_ALIAS_1));
17482eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
17492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
17502eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsCertificateEntry_NonExist_Unencrypted_Failure() throws Exception {
1751e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1752e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1753e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should return false for non-existent entry",
1754e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.isCertificateEntry(TEST_ALIAS_1));
1755e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1756e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsKeyEntry_PrivateKey_Encrypted_Success() throws Exception {
17582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1759e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1760e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1761e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1762f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1763f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1764b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1765f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1766b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1767e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1768e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
1769e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1770e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17712eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsKeyEntry_CA_Encrypted_Failure() throws Exception {
17722eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1773e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1774e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1775f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1776b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1777e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1778e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
1779e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1780e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_IsKeyEntry_NonExist_Encrypted_Failure() throws Exception {
17822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1783e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1784e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1785e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertFalse("Should return false for non-existent entry",
1786e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                mKeyStore.isKeyEntry(TEST_ALIAS_1));
1787e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1788e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17892eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetCertificate_CA_Encrypted_Success() throws Exception {
1790e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1791f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1792e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
17932eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1794e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1795e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1796e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.setCertificateEntry(TEST_ALIAS_1, actual);
1797e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1798e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1799e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
1800e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1801e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("Retrieved certificate should be the same as the one inserted", actual,
1802e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                retrieved);
1803e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1804e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
18052eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetCertificate_CAExists_Overwrite_Encrypted_Success() throws Exception {
18062eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1807e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1808e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1809f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1810b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1811e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1812e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1813e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1814e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1815f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1816e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1817e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TODO have separate FAKE_CA for second test
1818e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
1819e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1820e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1821e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1822e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
18232eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetCertificate_PrivateKeyExists_Encrypted_Failure() throws Exception {
18242eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1825e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1826e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1827e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
1828f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1829f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
1830b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1831f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
1832b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
1833e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1834e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
1835e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1836e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1837f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1838e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1839e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
1840e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
1841e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw when trying to overwrite a PrivateKey entry with a Certificate");
1842e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (KeyStoreException success) {
1843e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
1844e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1845e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
18462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_Encrypted_Success() throws Exception {
18472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1848e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1849e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1850e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
1851f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
1852e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1853e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1854e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1855e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final Certificate[] expectedChain = new Certificate[2];
1856f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1857f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1858e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1859e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
1860e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1861e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
1862e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1863e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1864e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Retrieved entry should exist", actualEntry);
1865e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1866e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
1867e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                actualEntry instanceof PrivateKeyEntry);
1868e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1869e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
1870e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1871f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
1872e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
1873e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1874f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_DSA_Unencrypted_Success() throws Exception {
1875f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.load(null, null);
1876f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1877f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        KeyFactory keyFact = KeyFactory.getInstance("DSA");
1878f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_DSA_KEY_1));
1879f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1880f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1881f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1882f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate[] expectedChain = new Certificate[2];
1883f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_USER_1));
1884f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_CA_1));
1885f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1886f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
1887f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1888f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
1889f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1890f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1891f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertNotNull("Retrieved entry should exist", actualEntry);
1892f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1893f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
1894f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                actualEntry instanceof PrivateKeyEntry);
1895f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1896f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
1897f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1898f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(actual, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
1899f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    }
1900f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1901f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_EC_Unencrypted_Success() throws Exception {
1902f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.load(null, null);
1903f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1904f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        KeyFactory keyFact = KeyFactory.getInstance("EC");
1905f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_EC_KEY_1));
1906f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1907f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1908f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1909f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate[] expectedChain = new Certificate[2];
1910f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_USER_1));
1911f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_CA_1));
1912f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1913f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
1914f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1915f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
1916f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1917f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
1918f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertNotNull("Retrieved entry should exist", actualEntry);
1919f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1920f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
1921f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                actualEntry instanceof PrivateKeyEntry);
1922f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1923f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
1924f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1925f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(actual, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
1926f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    }
1927f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root
1928f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_RSA_Unencrypted_Success() throws Exception {
19292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
19302eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
1932f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
19332eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
19352eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19362eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        final Certificate[] expectedChain = new Certificate[2];
1937f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1938f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
19392eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19402eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
19412eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
19432eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19442eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
19452eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNotNull("Retrieved entry should exist", actualEntry);
19462eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19472eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
19482eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                actualEntry instanceof PrivateKeyEntry);
19492eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19502eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
19512eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
1952f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
19532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
19542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19552eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
19562eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
19572eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19582eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
1959f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
19602eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19612eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
19622eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        final Certificate[] expectedChain = new Certificate[2];
1964f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1965f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
19662eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19672eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
19682eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19692eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        try {
19702eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            mKeyStore.setEntry(TEST_ALIAS_1, entry,
19711c219f619291ba818bc2542390a2988539d94ed0Kenny Root                    new KeyStoreParameter.Builder(getContext())
19721c219f619291ba818bc2542390a2988539d94ed0Kenny Root                    .setEncryptionRequired(true)
19732eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    .build());
19742eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            fail("Shouldn't be able to insert encrypted entry when KeyStore uninitialized");
19752eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        } catch (KeyStoreException expected) {
19762eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        }
19772eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19782eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        assertNull(mKeyStore.getEntry(TEST_ALIAS_1, null));
19792eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
19802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
19812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void
19822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
1983e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            throws Exception {
19842eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
1985e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
1986e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1987e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final KeyFactory keyFact = KeyFactory.getInstance("RSA");
1988e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
1989e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1990e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Start with PrivateKeyEntry
1991e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
1992f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
1993e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1994e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[2];
1995f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
1996f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
1997e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
1998e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
1999e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2000e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
2001e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2002e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2003e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2004e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2005e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2006e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2007e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2008e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
2009e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2010f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2011f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2012e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2013e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2014e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TODO make entirely new test vector for the overwrite
2015e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace with PrivateKeyEntry
2016e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2017f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2018e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2019e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[2];
2020f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2021f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2022e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2023e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
2024e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2025e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
2026e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2027e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2028e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2029e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2030e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2031e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2032e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2033e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
2034e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2035f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2036f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2037e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2038e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2039e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
20402eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetEntry_CAEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
20412eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
20422eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2043e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2044e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2045e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2046e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2047e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Start with TrustedCertificateEntry
2048e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2049f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2050e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2051e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
2052e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
2053e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2054e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2055e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2056e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
2057e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof TrustedCertificateEntry);
2058e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
2059e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertEquals("Stored and retrieved certificates should be the same",
2060e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    expectedCertEntry.getTrustedCertificate(),
2061e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualCertEntry.getTrustedCertificate());
2062e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2063e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2064e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace with PrivateKeyEntry
2065e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2066e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2067f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2068e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[2];
2069f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2070f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2071e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2072e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
2073e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2074e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
2075e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2076e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2077e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2078e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2079e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2080e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2081e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
2082f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2083f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2084e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2085e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2086e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
20872eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_CAEntry_Encrypted_Success()
20882eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
20892eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2090e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2091e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2092e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2093e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2094f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2095e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2096e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Start with PrivateKeyEntry
2097e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2098e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2099f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2100e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[2];
2101f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2102e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            expectedChain[1] = caCert;
2103e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2104e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
2105e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2106e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
2107e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2108e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2109e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2110e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2111e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2112e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2113e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
2114f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2115f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2116e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2117e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2118e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace with TrustedCertificateEntry
2119e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2120e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
2121e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
2122e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2123e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2124e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2125e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
2126e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof TrustedCertificateEntry);
2127e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
2128e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertEquals("Stored and retrieved certificates should be the same",
2129e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    expectedCertEntry.getTrustedCertificate(),
2130e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualCertEntry.getTrustedCertificate());
2131e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2132e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2133e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
21342eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public
21352eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            void
21362eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_ShortPrivateKeyEntry_Encrypted_Success()
2137e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            throws Exception {
21382eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2139e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2140e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2141e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2142e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2143f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2144e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2145e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Start with PrivateKeyEntry
2146e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2147e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2148f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2149e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[2];
2150f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2151e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            expectedChain[1] = caCert;
2152e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2153e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
2154e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2155e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
2156e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2157e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2158e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2159e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2160e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2161e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2162e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
2163f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2164f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2165e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2166e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2167e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace with PrivateKeyEntry that has no chain
2168e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2169e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2170f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2171e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] expectedChain = new Certificate[1];
2172f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2173e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2174e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
2175e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2176e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
2177e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2178e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2179e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2180e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2181e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2182e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2183e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
2184f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2185f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    null);
2186e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2187e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2188e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
21892eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetEntry_CAEntry_Overwrites_CAEntry_Encrypted_Success()
21902eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
21912eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2192e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2193e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2194e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2195e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2196e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Insert TrustedCertificateEntry
2197e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2198f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2199e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2200e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
2201e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
2202e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2203e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2204e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2205e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
2206e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof TrustedCertificateEntry);
2207e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
2208e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertEquals("Stored and retrieved certificates should be the same",
2209e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    expectedCertEntry.getTrustedCertificate(),
2210e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualCertEntry.getTrustedCertificate());
2211e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2212e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2213e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace with TrustedCertificateEntry of USER
2214e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2215e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate userCert = f
2216f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    .generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2217e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2218e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
2219e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
2220e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2221e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2222e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2223e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
2224e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof TrustedCertificateEntry);
2225e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            TrustedCertificateEntry actualUserEntry = (TrustedCertificateEntry) actualEntry;
2226e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertEquals("Stored and retrieved certificates should be the same",
2227e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    expectedUserEntry.getTrustedCertificate(),
2228e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualUserEntry.getTrustedCertificate());
2229e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2230e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2231e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
22322eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_ProtectedKey_Encrypted_Failure() throws Exception {
22332eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2234e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2235e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2236e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2237e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2238f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2239e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2240e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
2241f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2242e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final Certificate[] chain = new Certificate[2];
2243f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2244e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        chain[1] = caCert;
2245e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2246e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2247e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, "foo".toCharArray(), chain);
2248e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should fail when a password is specified");
2249e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (KeyStoreException success) {
2250e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2251e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2252e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
22532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_Encrypted_Success() throws Exception {
22542eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2255e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2256e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2257e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2258e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2259f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2260e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2261e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        KeyFactory keyFact = KeyFactory.getInstance("RSA");
2262f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2263e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final Certificate[] chain = new Certificate[2];
2264f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2265e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        chain[1] = caCert;
2266e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2267e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
2268e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2269e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2270e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertNotNull("Retrieved entry should exist", actualEntry);
2271e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2272e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2273e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                actualEntry instanceof PrivateKeyEntry);
2274e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2275e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
2276e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2277f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
2278e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2279e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
22802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_Replaced_Encrypted_Success() throws Exception {
22812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2282e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2283e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2284e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        final CertificateFactory f = CertificateFactory.getInstance("X.509");
2285e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2286f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
2287e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2288e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Insert initial key
2289e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2290e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2291f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2292e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] chain = new Certificate[2];
2293f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2294e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            chain[1] = caCert;
2295e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2296e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
2297e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2298e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2299e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2300e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2301e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2302e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2303e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2304e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
2305e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2306f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2307f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2308e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2309e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2310e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // TODO make a separate key
2311e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        // Replace key
2312e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        {
2313e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            KeyFactory keyFact = KeyFactory.getInstance("RSA");
2314f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
2315e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            final Certificate[] chain = new Certificate[2];
2316f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
2317e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            chain[1] = caCert;
2318e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2319e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
2320e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2321e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2322e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertNotNull("Retrieved entry should exist", actualEntry);
2323e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2324e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            assertTrue("Retrieved entry should be of type PrivateKeyEntry",
2325e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root                    actualEntry instanceof PrivateKeyEntry);
2326e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2327e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
2328e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2329f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
2330f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    FAKE_RSA_CA_1);
2331e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2332e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2333e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2334802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    @SuppressWarnings("deprecation")
2335802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    private static X509Certificate generateCertificate(android.security.KeyStore keyStore,
2336802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            String alias, BigInteger serialNumber, X500Principal subjectDN, Date notBefore,
2337802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Date notAfter) throws Exception {
2338802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
2339802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2340802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final PrivateKey privKey;
2341802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final OpenSSLEngine engine = OpenSSLEngine.getInstance("keystore");
2342802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        try {
2343802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            privKey = engine.getPrivateKeyById(privateKeyAlias);
2344802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        } catch (InvalidKeyException e) {
2345802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            throw new RuntimeException("Can't get key", e);
2346802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2347802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2348802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final byte[] pubKeyBytes = keyStore.getPubkey(privateKeyAlias);
2349802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2350802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final PublicKey pubKey;
2351802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        try {
2352802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            final KeyFactory keyFact = KeyFactory.getInstance("RSA");
2353802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            pubKey = keyFact.generatePublic(new X509EncodedKeySpec(pubKeyBytes));
2354802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        } catch (NoSuchAlgorithmException e) {
2355802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            throw new IllegalStateException("Can't instantiate RSA key generator", e);
2356802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        } catch (InvalidKeySpecException e) {
2357802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            throw new IllegalStateException("keystore returned invalid key encoding", e);
2358802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2359802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2360802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
2361802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setPublicKey(pubKey);
2362802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setSerialNumber(serialNumber);
2363802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setSubjectDN(subjectDN);
2364802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setIssuerDN(subjectDN);
2365802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setNotBefore(notBefore);
2366802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setNotAfter(notAfter);
2367802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        certGen.setSignatureAlgorithm("sha1WithRSA");
2368802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2369802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        final X509Certificate cert = certGen.generate(privKey);
2370802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2371802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        return cert;
2372802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    }
2373802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
23742eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_ReplacedChain_Encrypted_Success() throws Exception {
23752eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2376802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        mKeyStore.load(null, null);
2377802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2378802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        // Create key #1
2379802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        {
2380802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
2381b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root            assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
2382f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
2383802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2384802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
2385802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2386802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(key instanceof PrivateKey);
2387802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2388802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            PrivateKey expectedKey = (PrivateKey) key;
2389802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2390802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
2391802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
2392802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2393802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
2394b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                    expectedCert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2395802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2396802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2397802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2398802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(entry instanceof PrivateKeyEntry);
2399802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2400802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
2401802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2402802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
2403802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2404802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2405802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        // Replace key #1 with new chain
2406802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        {
2407802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
2408802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2409802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(key instanceof PrivateKey);
2410802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2411802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            PrivateKey expectedKey = (PrivateKey) key;
2412802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2413802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
2414802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
2415802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2416802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            mKeyStore.setKeyEntry(TEST_ALIAS_1, expectedKey, null,
2417802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    new Certificate[] { expectedCert });
2418802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2419802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
2420802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2421802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(entry instanceof PrivateKeyEntry);
2422802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2423802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
2424802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2425802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
2426802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2427802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    }
2428802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
24292eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_ReplacedChain_DifferentPrivateKey_Encrypted_Failure()
2430802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            throws Exception {
24312eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2432802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        mKeyStore.load(null, null);
2433802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2434802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        // Create key #1
2435802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        {
2436802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
2437b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root            assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
2438f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
2439802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2440802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
2441802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
2442802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2443802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
2444b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                    cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2445802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2446802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2447802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        // Create key #2
2448802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        {
2449802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_2;
2450b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root            assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
2451f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
2452802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2453802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
2454802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
2455802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2456802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_2,
2457b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                    cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2458802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2459802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2460802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        // Replace key #1 with key #2
2461802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        {
2462802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            Key key1 = mKeyStore.getKey(TEST_ALIAS_2, null);
2463802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2464802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
2465802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                    TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
2466802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
2467802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            try {
2468802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                mKeyStore.setKeyEntry(TEST_ALIAS_1, key1, null, new Certificate[] { cert });
2469802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root                fail("Should not allow setting of KeyEntry with wrong PrivaetKey");
2470802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            } catch (KeyStoreException success) {
2471802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root            }
2472802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root        }
2473802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root    }
2474802768dd86c4e8a933dbfbac2e9f1a1daa5f93faKenny Root
24752eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_SetKeyEntry_ReplacedChain_UnencryptedToEncrypted_Failure()
24762eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            throws Exception {
24772eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        mKeyStore.load(null, null);
24782eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
24792eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        // Create key #1
24802eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        {
24812eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
24822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.generate(privateKeyAlias,
2483f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    android.security.KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
2484f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                    android.security.KeyStore.FLAG_NONE, null));
24852eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
24862eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            X509Certificate cert =
24872eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1, TEST_DN_1,
24882eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                            NOW, NOW_PLUS_10_YEARS);
24892eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
24902eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
24912eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    cert.getEncoded(), android.security.KeyStore.UID_SELF,
24922eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                    android.security.KeyStore.FLAG_NONE));
24932eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        }
24942eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
24952eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        // Replace with one that requires encryption
24962eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        {
24972eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
24982eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
24992eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            try {
25001c219f619291ba818bc2542390a2988539d94ed0Kenny Root                mKeyStore.setEntry(TEST_ALIAS_1, entry,
25011c219f619291ba818bc2542390a2988539d94ed0Kenny Root                        new KeyStoreParameter.Builder(getContext())
25021c219f619291ba818bc2542390a2988539d94ed0Kenny Root                                .setEncryptionRequired(true)
25031c219f619291ba818bc2542390a2988539d94ed0Kenny Root                                .build());
25042eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                fail("Should not allow setting of Entry without unlocked keystore");
25052eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            } catch (KeyStoreException success) {
25062eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            }
25072eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
25082eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.password("1111"));
25092eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            assertTrue(mAndroidKeyStore.isUnlocked());
25102eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
25112eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root            mKeyStore.setEntry(TEST_ALIAS_1, entry,
25121c219f619291ba818bc2542390a2988539d94ed0Kenny Root                    new KeyStoreParameter.Builder(getContext())
25131c219f619291ba818bc2542390a2988539d94ed0Kenny Root                            .setEncryptionRequired(true)
25142eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root                            .build());
25152eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        }
25162eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    }
25172eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root
25182eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Size_Encrypted_Success() throws Exception {
25192eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2520e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2521e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2522f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
2523b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2524e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2525e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("The keystore size should match expected", 1, mKeyStore.size());
2526e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1 });
2527e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2528f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root        assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
2529b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2530e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2531e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("The keystore size should match expected", 2, mKeyStore.size());
2532e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
2533e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2534b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root        assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3,
2535f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
2536f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                null));
2537e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2538e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("The keystore size should match expected", 3, mKeyStore.size());
2539e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
2540e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2541e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.delete(Credentials.CA_CERTIFICATE + TEST_ALIAS_1));
2542e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2543e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("The keystore size should match expected", 2, mKeyStore.size());
2544e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
2545e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2546e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertTrue(mAndroidKeyStore.delKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3));
2547e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2548e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertEquals("The keystore size should match expected", 1, mKeyStore.size());
2549e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        assertAliases(new String[] { TEST_ALIAS_2 });
2550e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2551e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
25522eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Store_LoadStoreParam_Encrypted_Failure() throws Exception {
25532eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2554e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2555e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2556e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2557e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.store(null);
2558e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw UnsupportedOperationException when trying to store");
2559e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (UnsupportedOperationException success) {
2560e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2561e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2562e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
25632eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Load_InputStreamSupplied_Encrypted_Failure() throws Exception {
2564e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        byte[] buf = "FAKE KEYSTORE".getBytes();
2565e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        ByteArrayInputStream is = new ByteArrayInputStream(buf);
2566e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2567e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2568e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.load(is, null);
2569e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw IllegalArgumentException when InputStream is supplied");
2570e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (IllegalArgumentException success) {
2571e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2572e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2573e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
25742eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Load_PasswordSupplied_Encrypted_Failure() throws Exception {
2575e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2576e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.load(null, "password".toCharArray());
2577e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw IllegalArgumentException when password is supplied");
2578e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (IllegalArgumentException success) {
2579e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2580e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2581e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
25822eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_Store_OutputStream_Encrypted_Failure() throws Exception {
25832eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2584e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        mKeyStore.load(null, null);
2585e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2586e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        OutputStream sink = new ByteArrayOutputStream();
2587e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2588e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.store(sink, null);
2589e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw UnsupportedOperationException when trying to store");
2590e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (UnsupportedOperationException success) {
2591e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2592e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root
2593e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        try {
2594e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            mKeyStore.store(sink, "blah".toCharArray());
2595e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root            fail("Should throw UnsupportedOperationException when trying to store");
2596e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        } catch (UnsupportedOperationException success) {
2597e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root        }
2598e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root    }
2599656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2600656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root    private void setupKey() throws Exception {
2601656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
2602b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root        assertTrue(mAndroidKeyStore
2603f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                .generate(privateKeyAlias, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
2604f64386fc26efeb245fd90fabaa47b8c8bf9b4613Kenny Root                        KeyStore.FLAG_ENCRYPTED, null));
2605656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2606656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1,
2607656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root                TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
2608656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2609656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
2610b2c0ff64d8ff92dab53e969a44fa12427d145952Kenny Root                cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
2611656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root    }
2612656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
26132eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root    public void testKeyStore_KeyOperations_Wrap_Encrypted_Success() throws Exception {
26142eeda7286f3c7cb79f7eb71ae6464cad213d12a3Kenny Root        setupPassword();
2615656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        mKeyStore.load(null, null);
2616656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2617656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        setupKey();
2618656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2619656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        // Test key usage
2620656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        Entry e = mKeyStore.getEntry(TEST_ALIAS_1, null);
2621656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        assertNotNull(e);
2622656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        assertTrue(e instanceof PrivateKeyEntry);
2623656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2624656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        PrivateKeyEntry privEntry = (PrivateKeyEntry) e;
2625656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        PrivateKey privKey = privEntry.getPrivateKey();
2626656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        assertNotNull(privKey);
2627656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2628656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        PublicKey pubKey = privEntry.getCertificate().getPublicKey();
2629656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2630656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
2631656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        c.init(Cipher.WRAP_MODE, pubKey);
2632656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2633656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        byte[] expectedKey = new byte[] {
2634656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root                0x00, 0x05, (byte) 0xAA, (byte) 0x0A5, (byte) 0xFF, 0x55, 0x0A
2635656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        };
2636656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2637656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        SecretKey expectedSecret = new SecretKeySpec(expectedKey, "AES");
2638656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2639656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        byte[] wrappedExpected = c.wrap(expectedSecret);
2640656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2641656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        c.init(Cipher.UNWRAP_MODE, privKey);
2642656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        SecretKey actualSecret = (SecretKey) c.unwrap(wrappedExpected, "AES", Cipher.SECRET_KEY);
2643656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root
2644656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root        assertEquals(Arrays.toString(expectedSecret.getEncoded()),
2645656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root                Arrays.toString(actualSecret.getEncoded()));
2646656f92f2c6fec008dd3131f6ec30a121b5b2a92eKenny Root    }
2647e29df16cb57b69995df597e8a6d95d986c1c43fcKenny Root}
2648