Home | History | Annotate | Download | only in security
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.security;
     18 
     19 import com.android.org.bouncycastle.x509.X509V3CertificateGenerator;
     20 
     21 import com.android.org.conscrypt.NativeCrypto;
     22 import com.android.org.conscrypt.OpenSSLEngine;
     23 import com.android.org.conscrypt.OpenSSLKeyHolder;
     24 
     25 import android.test.AndroidTestCase;
     26 
     27 import java.io.ByteArrayInputStream;
     28 import java.io.ByteArrayOutputStream;
     29 import java.io.OutputStream;
     30 import java.math.BigInteger;
     31 import java.security.InvalidKeyException;
     32 import java.security.Key;
     33 import java.security.KeyFactory;
     34 import java.security.KeyStore.Entry;
     35 import java.security.KeyStore.PrivateKeyEntry;
     36 import java.security.KeyStore.TrustedCertificateEntry;
     37 import java.security.KeyStoreException;
     38 import java.security.NoSuchAlgorithmException;
     39 import java.security.PrivateKey;
     40 import java.security.PublicKey;
     41 import java.security.cert.Certificate;
     42 import java.security.cert.CertificateFactory;
     43 import java.security.cert.X509Certificate;
     44 import java.security.interfaces.DSAPrivateKey;
     45 import java.security.interfaces.DSAPublicKey;
     46 import java.security.interfaces.ECPrivateKey;
     47 import java.security.interfaces.ECPublicKey;
     48 import java.security.interfaces.RSAPrivateKey;
     49 import java.security.spec.InvalidKeySpecException;
     50 import java.security.spec.PKCS8EncodedKeySpec;
     51 import java.security.spec.X509EncodedKeySpec;
     52 import java.util.Arrays;
     53 import java.util.Collection;
     54 import java.util.Date;
     55 import java.util.Enumeration;
     56 import java.util.HashSet;
     57 import java.util.Iterator;
     58 import java.util.Set;
     59 
     60 import javax.crypto.Cipher;
     61 import javax.crypto.SecretKey;
     62 import javax.crypto.spec.SecretKeySpec;
     63 import javax.security.auth.x500.X500Principal;
     64 
     65 public class AndroidKeyStoreTest extends AndroidTestCase {
     66     private android.security.KeyStore mAndroidKeyStore;
     67 
     68     private java.security.KeyStore mKeyStore;
     69 
     70     private static final String TEST_ALIAS_1 = "test1";
     71 
     72     private static final String TEST_ALIAS_2 = "test2";
     73 
     74     private static final String TEST_ALIAS_3 = "test3";
     75 
     76     private static final X500Principal TEST_DN_1 = new X500Principal("CN=test1");
     77 
     78     private static final X500Principal TEST_DN_2 = new X500Principal("CN=test2");
     79 
     80     private static final BigInteger TEST_SERIAL_1 = BigInteger.ONE;
     81 
     82     private static final BigInteger TEST_SERIAL_2 = BigInteger.valueOf(2L);
     83 
     84     private static final long NOW_MILLIS = System.currentTimeMillis();
     85 
     86     /* We have to round this off because X509v3 doesn't store milliseconds. */
     87     private static final Date NOW = new Date(NOW_MILLIS - (NOW_MILLIS % 1000L));
     88 
     89     @SuppressWarnings("deprecation")
     90     private static final Date NOW_PLUS_10_YEARS = new Date(NOW.getYear() + 10, 0, 1);
     91 
     92     /*
     93      * The keys and certificates below are generated with:
     94      *
     95      * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
     96      * openssl req -newkey rsa:1024 -keyout userkey.pem -nodes -days 3650 -out userkey.req
     97      * mkdir -p demoCA/newcerts
     98      * touch demoCA/index.txt
     99      * echo "01" > demoCA/serial
    100      * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
    101      */
    102 
    103     /**
    104      * Generated from above and converted with:
    105      *
    106      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    107      */
    108     private static final byte[] FAKE_RSA_CA_1 = {
    109             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
    110             (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    111             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
    112             (byte) 0xa2, (byte) 0xf4, (byte) 0x2e, (byte) 0x55, (byte) 0x48, (byte) 0x0a,
    113             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    114             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    115             (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31,
    116             (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    117             (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53,
    118             (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
    119             (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43,
    120             (byte) 0x41, (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06,
    121             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d,
    122             (byte) 0x4d, (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61,
    123             (byte) 0x69, (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65,
    124             (byte) 0x77, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
    125             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12,
    126             (byte) 0x41, (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69,
    127             (byte) 0x64, (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74,
    128             (byte) 0x20, (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73,
    129             (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32,
    130             (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x34, (byte) 0x31, (byte) 0x36,
    131             (byte) 0x35, (byte) 0x35, (byte) 0x34, (byte) 0x34, (byte) 0x5a, (byte) 0x17,
    132             (byte) 0x0d, (byte) 0x32, (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31,
    133             (byte) 0x32, (byte) 0x31, (byte) 0x36, (byte) 0x35, (byte) 0x35, (byte) 0x34,
    134             (byte) 0x34, (byte) 0x5a, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b,
    135             (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    136             (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31,
    137             (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    138             (byte) 0x04, (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41,
    139             (byte) 0x31, (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03,
    140             (byte) 0x55, (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d,
    141             (byte) 0x6f, (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69,
    142             (byte) 0x6e, (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77,
    143             (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03,
    144             (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41,
    145             (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64,
    146             (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20,
    147             (byte) 0x43, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30,
    148             (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
    149             (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
    150             (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
    151             (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
    152             (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa3, (byte) 0x72,
    153             (byte) 0xab, (byte) 0xd0, (byte) 0xe4, (byte) 0xad, (byte) 0x2f, (byte) 0xe7,
    154             (byte) 0xe2, (byte) 0x79, (byte) 0x07, (byte) 0x36, (byte) 0x3d, (byte) 0x0c,
    155             (byte) 0x8d, (byte) 0x42, (byte) 0x9a, (byte) 0x0a, (byte) 0x33, (byte) 0x64,
    156             (byte) 0xb3, (byte) 0xcd, (byte) 0xb2, (byte) 0xd7, (byte) 0x3a, (byte) 0x42,
    157             (byte) 0x06, (byte) 0x77, (byte) 0x45, (byte) 0x29, (byte) 0xe9, (byte) 0xcb,
    158             (byte) 0xb7, (byte) 0x4a, (byte) 0xd6, (byte) 0xee, (byte) 0xad, (byte) 0x01,
    159             (byte) 0x91, (byte) 0x9b, (byte) 0x0c, (byte) 0x59, (byte) 0xa1, (byte) 0x03,
    160             (byte) 0xfa, (byte) 0xf0, (byte) 0x5a, (byte) 0x7c, (byte) 0x4f, (byte) 0xf7,
    161             (byte) 0x8d, (byte) 0x36, (byte) 0x0f, (byte) 0x1f, (byte) 0x45, (byte) 0x7d,
    162             (byte) 0x1b, (byte) 0x31, (byte) 0xa1, (byte) 0x35, (byte) 0x0b, (byte) 0x00,
    163             (byte) 0xed, (byte) 0x7a, (byte) 0xb6, (byte) 0xc8, (byte) 0x4e, (byte) 0xa9,
    164             (byte) 0x86, (byte) 0x4c, (byte) 0x7b, (byte) 0x99, (byte) 0x57, (byte) 0x41,
    165             (byte) 0x12, (byte) 0xef, (byte) 0x6b, (byte) 0xbc, (byte) 0x3d, (byte) 0x60,
    166             (byte) 0xf2, (byte) 0x99, (byte) 0x1a, (byte) 0xcd, (byte) 0xed, (byte) 0x56,
    167             (byte) 0xa4, (byte) 0xe5, (byte) 0x36, (byte) 0x9f, (byte) 0x24, (byte) 0x1f,
    168             (byte) 0xdc, (byte) 0x89, (byte) 0x40, (byte) 0xc8, (byte) 0x99, (byte) 0x92,
    169             (byte) 0xab, (byte) 0x4a, (byte) 0xb5, (byte) 0x61, (byte) 0x45, (byte) 0x62,
    170             (byte) 0xff, (byte) 0xa3, (byte) 0x45, (byte) 0x65, (byte) 0xaf, (byte) 0xf6,
    171             (byte) 0x27, (byte) 0x30, (byte) 0x51, (byte) 0x0e, (byte) 0x0e, (byte) 0xeb,
    172             (byte) 0x79, (byte) 0x0c, (byte) 0xbe, (byte) 0xb3, (byte) 0x0a, (byte) 0x6f,
    173             (byte) 0x29, (byte) 0x06, (byte) 0xdc, (byte) 0x2f, (byte) 0x6b, (byte) 0x51,
    174             (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
    175             (byte) 0x81, (byte) 0xb1, (byte) 0x30, (byte) 0x81, (byte) 0xae, (byte) 0x30,
    176             (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e,
    177             (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x33, (byte) 0x05,
    178             (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60, (byte) 0xc7, (byte) 0xf9,
    179             (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c, (byte) 0x8f, (byte) 0x6d,
    180             (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e, (byte) 0x5d, (byte) 0x51,
    181             (byte) 0x30, (byte) 0x7f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,
    182             (byte) 0x23, (byte) 0x04, (byte) 0x78, (byte) 0x30, (byte) 0x76, (byte) 0x80,
    183             (byte) 0x14, (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f,
    184             (byte) 0x60, (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73,
    185             (byte) 0x5c, (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97,
    186             (byte) 0x8e, (byte) 0x5d, (byte) 0x51, (byte) 0xa1, (byte) 0x53, (byte) 0xa4,
    187             (byte) 0x51, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
    188             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
    189             (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
    190             (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    191             (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
    192             (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    193             (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
    194             (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
    195             (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
    196             (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    197             (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
    198             (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
    199             (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
    200             (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x82, (byte) 0x09,
    201             (byte) 0x00, (byte) 0xe1, (byte) 0x6a, (byte) 0xa2, (byte) 0xf4, (byte) 0x2e,
    202             (byte) 0x55, (byte) 0x48, (byte) 0x0a, (byte) 0x30, (byte) 0x0c, (byte) 0x06,
    203             (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05,
    204             (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30,
    205             (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
    206             (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
    207             (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
    208             (byte) 0x8c, (byte) 0x30, (byte) 0x42, (byte) 0xfa, (byte) 0xeb, (byte) 0x1a,
    209             (byte) 0x26, (byte) 0xeb, (byte) 0xda, (byte) 0x56, (byte) 0x32, (byte) 0xf2,
    210             (byte) 0x9d, (byte) 0xa5, (byte) 0x24, (byte) 0xd8, (byte) 0x3a, (byte) 0xda,
    211             (byte) 0x30, (byte) 0xa6, (byte) 0x8b, (byte) 0x46, (byte) 0xfe, (byte) 0xfe,
    212             (byte) 0xdb, (byte) 0xf1, (byte) 0xe6, (byte) 0xe1, (byte) 0x7c, (byte) 0x1b,
    213             (byte) 0xe7, (byte) 0x77, (byte) 0x00, (byte) 0xa1, (byte) 0x1c, (byte) 0x19,
    214             (byte) 0x17, (byte) 0x73, (byte) 0xb0, (byte) 0xf0, (byte) 0x9d, (byte) 0xf3,
    215             (byte) 0x4f, (byte) 0xb6, (byte) 0xbc, (byte) 0xc7, (byte) 0x47, (byte) 0x85,
    216             (byte) 0x2a, (byte) 0x4a, (byte) 0xa1, (byte) 0xa5, (byte) 0x58, (byte) 0xf5,
    217             (byte) 0xc5, (byte) 0x1a, (byte) 0x51, (byte) 0xb1, (byte) 0x04, (byte) 0x80,
    218             (byte) 0xee, (byte) 0x3a, (byte) 0xec, (byte) 0x2f, (byte) 0xe1, (byte) 0xfd,
    219             (byte) 0x58, (byte) 0xeb, (byte) 0xed, (byte) 0x82, (byte) 0x9e, (byte) 0x38,
    220             (byte) 0xa3, (byte) 0x24, (byte) 0x75, (byte) 0xf7, (byte) 0x3e, (byte) 0xc2,
    221             (byte) 0xc5, (byte) 0x27, (byte) 0xeb, (byte) 0x6f, (byte) 0x7b, (byte) 0x50,
    222             (byte) 0xda, (byte) 0x43, (byte) 0xdc, (byte) 0x3b, (byte) 0x0b, (byte) 0x6f,
    223             (byte) 0x78, (byte) 0x8f, (byte) 0xb0, (byte) 0x66, (byte) 0xe1, (byte) 0x12,
    224             (byte) 0x87, (byte) 0x5f, (byte) 0x97, (byte) 0x7b, (byte) 0xca, (byte) 0x14,
    225             (byte) 0x79, (byte) 0xf7, (byte) 0xe8, (byte) 0x6c, (byte) 0x72, (byte) 0xdb,
    226             (byte) 0x91, (byte) 0x65, (byte) 0x17, (byte) 0x54, (byte) 0xe0, (byte) 0x74,
    227             (byte) 0x1d, (byte) 0xac, (byte) 0x47, (byte) 0x04, (byte) 0x12, (byte) 0xe0,
    228             (byte) 0xc3, (byte) 0x66, (byte) 0x19, (byte) 0x05, (byte) 0x2e, (byte) 0x7e,
    229             (byte) 0xf1, (byte) 0x61
    230     };
    231 
    232     /**
    233      * Generated from above and converted with:
    234      *
    235      * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
    236      */
    237     private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
    238             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
    239             (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
    240             (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
    241             (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
    242             (byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
    243             (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
    244             (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
    245             (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
    246             (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
    247             (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
    248             (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
    249             (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
    250             (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
    251             (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
    252             (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
    253             (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
    254             (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
    255             (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
    256             (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
    257             (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
    258             (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
    259             (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
    260             (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
    261             (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
    262             (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
    263             (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
    264             (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
    265             (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
    266             (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
    267             (byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
    268             (byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
    269             (byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
    270             (byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
    271             (byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
    272             (byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
    273             (byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
    274             (byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
    275             (byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
    276             (byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
    277             (byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
    278             (byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
    279             (byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
    280             (byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
    281             (byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
    282             (byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
    283             (byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
    284             (byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
    285             (byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
    286             (byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
    287             (byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
    288             (byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
    289             (byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
    290             (byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
    291             (byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
    292             (byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
    293             (byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
    294             (byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
    295             (byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
    296             (byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
    297             (byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
    298             (byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
    299             (byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
    300             (byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
    301             (byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
    302             (byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
    303             (byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
    304             (byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
    305             (byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
    306             (byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
    307             (byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
    308             (byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
    309             (byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
    310             (byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
    311             (byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
    312             (byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
    313             (byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
    314             (byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
    315             (byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
    316             (byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
    317             (byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
    318             (byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
    319             (byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
    320             (byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
    321             (byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
    322             (byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
    323             (byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
    324             (byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
    325             (byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
    326             (byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
    327             (byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
    328             (byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
    329             (byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
    330             (byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
    331             (byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
    332             (byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
    333             (byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
    334             (byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
    335             (byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
    336             (byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
    337             (byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
    338             (byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
    339             (byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
    340             (byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
    341             (byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
    342             (byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
    343             (byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
    344     };
    345 
    346     /**
    347      * Generated from above and converted with:
    348      *
    349      * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    350      */
    351     private static final byte[] FAKE_RSA_USER_1 = new byte[] {
    352             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
    353             (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    354             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
    355             (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
    356             (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
    357             (byte) 0x00, (byte) 0x30, (byte) 0x4f, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
    358             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
    359             (byte) 0x13, (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b,
    360             (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    361             (byte) 0x08, (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31,
    362             (byte) 0x16, (byte) 0x30, (byte) 0x14, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    363             (byte) 0x04, (byte) 0x07, (byte) 0x13, (byte) 0x0d, (byte) 0x4d, (byte) 0x6f,
    364             (byte) 0x75, (byte) 0x6e, (byte) 0x74, (byte) 0x61, (byte) 0x69, (byte) 0x6e,
    365             (byte) 0x20, (byte) 0x56, (byte) 0x69, (byte) 0x65, (byte) 0x77, (byte) 0x31,
    366             (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    367             (byte) 0x04, (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e,
    368             (byte) 0x64, (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20,
    369             (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43,
    370             (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x30, (byte) 0x1e,
    371             (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32, (byte) 0x30, (byte) 0x38,
    372             (byte) 0x31, (byte) 0x34, (byte) 0x32, (byte) 0x33, (byte) 0x32, (byte) 0x35,
    373             (byte) 0x34, (byte) 0x38, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32,
    374             (byte) 0x32, (byte) 0x30, (byte) 0x38, (byte) 0x31, (byte) 0x32, (byte) 0x32,
    375             (byte) 0x33, (byte) 0x32, (byte) 0x35, (byte) 0x34, (byte) 0x38, (byte) 0x5a,
    376             (byte) 0x30, (byte) 0x55, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,
    377             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13,
    378             (byte) 0x02, (byte) 0x55, (byte) 0x53, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
    379             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08,
    380             (byte) 0x13, (byte) 0x02, (byte) 0x43, (byte) 0x41, (byte) 0x31, (byte) 0x1b,
    381             (byte) 0x30, (byte) 0x19, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    382             (byte) 0x0a, (byte) 0x13, (byte) 0x12, (byte) 0x41, (byte) 0x6e, (byte) 0x64,
    383             (byte) 0x72, (byte) 0x6f, (byte) 0x69, (byte) 0x64, (byte) 0x20, (byte) 0x54,
    384             (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x43, (byte) 0x61,
    385             (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x31, (byte) 0x1c, (byte) 0x30,
    386             (byte) 0x1a, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03,
    387             (byte) 0x13, (byte) 0x13, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76,
    388             (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
    389             (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
    390             (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
    391             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    392             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    393             (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
    394             (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
    395             (byte) 0x81, (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6,
    396             (byte) 0x5b, (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c,
    397             (byte) 0x66, (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86,
    398             (byte) 0x8a, (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3,
    399             (byte) 0x02, (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08,
    400             (byte) 0xf3, (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04,
    401             (byte) 0x6d, (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f,
    402             (byte) 0x67, (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c,
    403             (byte) 0xcb, (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30,
    404             (byte) 0xe2, (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5,
    405             (byte) 0x79, (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b,
    406             (byte) 0xce, (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb,
    407             (byte) 0x08, (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff,
    408             (byte) 0x3b, (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9,
    409             (byte) 0xc4, (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29,
    410             (byte) 0x0d, (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b,
    411             (byte) 0x23, (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78,
    412             (byte) 0x08, (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5,
    413             (byte) 0xf1, (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19,
    414             (byte) 0xb4, (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03,
    415             (byte) 0x16, (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce,
    416             (byte) 0x9e, (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03,
    417             (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x7b, (byte) 0x30,
    418             (byte) 0x79, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    419             (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00,
    420             (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86,
    421             (byte) 0x48, (byte) 0x01, (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01,
    422             (byte) 0x0d, (byte) 0x04, (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f,
    423             (byte) 0x70, (byte) 0x65, (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c,
    424             (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72,
    425             (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43,
    426             (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69,
    427             (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d,
    428             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04,
    429             (byte) 0x16, (byte) 0x04, (byte) 0x14, (byte) 0x32, (byte) 0xa1, (byte) 0x1e,
    430             (byte) 0x6b, (byte) 0x69, (byte) 0x04, (byte) 0xfe, (byte) 0xb3, (byte) 0xcd,
    431             (byte) 0xf8, (byte) 0xbb, (byte) 0x14, (byte) 0xcd, (byte) 0xff, (byte) 0xd4,
    432             (byte) 0x16, (byte) 0xc3, (byte) 0xab, (byte) 0x44, (byte) 0x2f, (byte) 0x30,
    433             (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23,
    434             (byte) 0x04, (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14,
    435             (byte) 0x33, (byte) 0x05, (byte) 0xee, (byte) 0xfe, (byte) 0x6f, (byte) 0x60,
    436             (byte) 0xc7, (byte) 0xf9, (byte) 0xa9, (byte) 0xd2, (byte) 0x73, (byte) 0x5c,
    437             (byte) 0x8f, (byte) 0x6d, (byte) 0xa2, (byte) 0x2f, (byte) 0x97, (byte) 0x8e,
    438             (byte) 0x5d, (byte) 0x51, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
    439             (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
    440             (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03,
    441             (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x46, (byte) 0x42, (byte) 0xef,
    442             (byte) 0x56, (byte) 0x89, (byte) 0x78, (byte) 0x90, (byte) 0x38, (byte) 0x24,
    443             (byte) 0x9f, (byte) 0x8c, (byte) 0x7a, (byte) 0xce, (byte) 0x7a, (byte) 0xa5,
    444             (byte) 0xb5, (byte) 0x1e, (byte) 0x74, (byte) 0x96, (byte) 0x34, (byte) 0x49,
    445             (byte) 0x8b, (byte) 0xed, (byte) 0x44, (byte) 0xb3, (byte) 0xc9, (byte) 0x05,
    446             (byte) 0xd7, (byte) 0x48, (byte) 0x55, (byte) 0x52, (byte) 0x59, (byte) 0x15,
    447             (byte) 0x0b, (byte) 0xaa, (byte) 0x16, (byte) 0x86, (byte) 0xd2, (byte) 0x8e,
    448             (byte) 0x16, (byte) 0x99, (byte) 0xe8, (byte) 0x5f, (byte) 0x11, (byte) 0x71,
    449             (byte) 0x42, (byte) 0x55, (byte) 0xd1, (byte) 0xc4, (byte) 0x6f, (byte) 0x2e,
    450             (byte) 0xa9, (byte) 0x64, (byte) 0x6f, (byte) 0xd8, (byte) 0xfd, (byte) 0x43,
    451             (byte) 0x13, (byte) 0x24, (byte) 0xaa, (byte) 0x67, (byte) 0xe6, (byte) 0xf5,
    452             (byte) 0xca, (byte) 0x80, (byte) 0x5e, (byte) 0x3a, (byte) 0x3e, (byte) 0xcc,
    453             (byte) 0x4f, (byte) 0xba, (byte) 0x87, (byte) 0xe6, (byte) 0xae, (byte) 0xbf,
    454             (byte) 0x8f, (byte) 0xd5, (byte) 0x28, (byte) 0x38, (byte) 0x58, (byte) 0x30,
    455             (byte) 0x24, (byte) 0xf6, (byte) 0x53, (byte) 0x5b, (byte) 0x41, (byte) 0x53,
    456             (byte) 0xe6, (byte) 0x45, (byte) 0xbc, (byte) 0xbe, (byte) 0xe6, (byte) 0xbb,
    457             (byte) 0x5d, (byte) 0xd8, (byte) 0xa7, (byte) 0xf9, (byte) 0x64, (byte) 0x99,
    458             (byte) 0x04, (byte) 0x43, (byte) 0x75, (byte) 0xd7, (byte) 0x2d, (byte) 0x32,
    459             (byte) 0x0a, (byte) 0x94, (byte) 0xaf, (byte) 0x06, (byte) 0x34, (byte) 0xae,
    460             (byte) 0x46, (byte) 0xbd, (byte) 0xda, (byte) 0x00, (byte) 0x0e, (byte) 0x25,
    461             (byte) 0xc2, (byte) 0xf7, (byte) 0xc9, (byte) 0xc3, (byte) 0x65, (byte) 0xd2,
    462             (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
    463     };
    464 
    465     /*
    466      * The keys and certificates below are generated with:
    467      *
    468      * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
    469      * openssl ecparam -name prime256v1 -out ecparam.pem
    470      * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
    471      * mkdir -p demoCA/newcerts
    472      * touch demoCA/index.txt
    473      * echo "01" > demoCA/serial
    474      * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
    475      */
    476 
    477     /**
    478      * Generated from above and converted with:
    479      *
    480      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    481      */
    482     private static final byte[] FAKE_EC_CA_1 = {
    483             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
    484             (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    485             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
    486             (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
    487             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    488             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    489             (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
    490             (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    491             (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
    492             (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
    493             (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
    494             (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
    495             (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
    496             (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
    497             (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
    498             (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
    499             (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
    500             (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
    501             (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
    502             (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
    503             (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
    504             (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
    505             (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
    506             (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
    507             (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
    508             (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
    509             (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
    510             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
    511             (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
    512             (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
    513             (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    514             (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
    515             (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
    516             (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
    517             (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
    518             (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
    519             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    520             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    521             (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
    522             (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
    523             (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
    524             (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
    525             (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
    526             (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
    527             (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
    528             (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
    529             (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
    530             (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
    531             (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
    532             (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
    533             (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
    534             (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
    535             (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
    536             (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
    537             (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
    538             (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
    539             (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
    540             (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
    541             (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
    542             (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
    543             (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
    544             (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
    545             (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
    546             (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    547             (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
    548             (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
    549             (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
    550             (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
    551             (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
    552             (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
    553             (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
    554             (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
    555             (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
    556             (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
    557             (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
    558             (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
    559             (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
    560             (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
    561             (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
    562             (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
    563             (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
    564             (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
    565             (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
    566             (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
    567             (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
    568             (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
    569             (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
    570             (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
    571             (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
    572             (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
    573             (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
    574             (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
    575             (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
    576             (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
    577             (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
    578             (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
    579             (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
    580             (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
    581             (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
    582             (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
    583             (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
    584     };
    585 
    586     /**
    587      * Generated from above and converted with:
    588      *
    589      * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
    590      */
    591     private static final byte[] FAKE_EC_KEY_1 = new byte[] {
    592             (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
    593             (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
    594             (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
    595             (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
    596             (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
    597             (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
    598             (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
    599             (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
    600             (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
    601             (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
    602             (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
    603             (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
    604             (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
    605             (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
    606             (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
    607             (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
    608             (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
    609             (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
    610             (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
    611             (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
    612             (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
    613             (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
    614             (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
    615     };
    616 
    617     /**
    618      * Generated from above and converted with:
    619      *
    620      * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    621      */
    622     private static final byte[] FAKE_EC_USER_1 = new byte[] {
    623             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
    624             (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    625             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
    626             (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
    627             (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
    628             (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
    629             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
    630             (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
    631             (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    632             (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
    633             (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
    634             (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
    635             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
    636             (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
    637             (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
    638             (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
    639             (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
    640             (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
    641             (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
    642             (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
    643             (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
    644             (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
    645             (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
    646             (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    647             (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
    648             (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    649             (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
    650             (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
    651             (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
    652             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
    653             (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
    654             (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
    655             (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
    656             (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
    657             (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
    658             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
    659             (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
    660             (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
    661             (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
    662             (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
    663             (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
    664             (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
    665             (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
    666             (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
    667             (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
    668             (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
    669             (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
    670             (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
    671             (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
    672             (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
    673             (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
    674             (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
    675             (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
    676             (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
    677             (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
    678             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
    679             (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
    680             (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
    681             (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
    682             (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
    683             (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
    684             (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
    685             (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
    686             (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
    687             (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
    688             (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
    689             (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
    690             (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
    691             (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
    692             (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
    693             (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
    694             (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
    695             (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
    696             (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
    697             (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
    698             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    699             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    700             (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
    701             (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
    702             (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
    703             (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
    704             (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
    705             (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
    706             (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
    707             (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
    708             (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
    709             (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
    710             (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
    711             (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
    712             (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
    713             (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
    714             (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
    715             (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
    716             (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
    717             (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
    718             (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
    719             (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
    720             (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
    721             (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
    722             (byte) 0x7e, (byte) 0xde, (byte) 0xb2
    723     };
    724 
    725     /*
    726      * The keys and certificates below are generated with:
    727      *
    728      * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
    729      * openssl dsaparam -out dsaparam.pem 1024
    730      * openssl req -newkey dsa:dsaparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
    731      * mkdir -p demoCA/newcerts
    732      * touch demoCA/index.txt
    733      * echo "01" > demoCA/serial
    734      * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
    735      */
    736 
    737     /**
    738      * Generated from above and converted with:
    739      *
    740      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    741      */
    742     private static final byte[] FAKE_DSA_CA_1 = new byte[] {
    743             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x8a, (byte) 0x30, (byte) 0x82,
    744             (byte) 0x01, (byte) 0xf3, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    745             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0x87, (byte) 0xc0,
    746             (byte) 0x68, (byte) 0x7f, (byte) 0x42, (byte) 0x92, (byte) 0x0b, (byte) 0x7a,
    747             (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
    748             (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
    749             (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31,
    750             (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    751             (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
    752             (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
    753             (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
    754             (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
    755             (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
    756             (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
    757             (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
    758             (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
    759             (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
    760             (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
    761             (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15,
    762             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
    763             (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
    764             (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
    765             (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
    766             (byte) 0x0d, (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
    767             (byte) 0x37, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x31, (byte) 0x32,
    768             (byte) 0x39, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33,
    769             (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33,
    770             (byte) 0x33, (byte) 0x31, (byte) 0x32, (byte) 0x39, (byte) 0x5a, (byte) 0x30,
    771             (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,
    772             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02,
    773             (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11,
    774             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c,
    775             (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
    776             (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31,
    777             (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    778             (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e,
    779             (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74,
    780             (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69,
    781             (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79,
    782             (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17,
    783             (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    784             (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e,
    785             (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c,
    786             (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
    787             (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
    788             (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
    789             (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
    790             (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
    791             (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa4, (byte) 0xc7,
    792             (byte) 0x06, (byte) 0xba, (byte) 0xdf, (byte) 0x2b, (byte) 0xee, (byte) 0xd2,
    793             (byte) 0xb9, (byte) 0xe4, (byte) 0x52, (byte) 0x21, (byte) 0x68, (byte) 0x2b,
    794             (byte) 0x83, (byte) 0xdf, (byte) 0xe3, (byte) 0x9c, (byte) 0x08, (byte) 0x73,
    795             (byte) 0xdd, (byte) 0x90, (byte) 0xea, (byte) 0x97, (byte) 0x0c, (byte) 0x96,
    796             (byte) 0x20, (byte) 0xb1, (byte) 0xee, (byte) 0x11, (byte) 0xd5, (byte) 0xd4,
    797             (byte) 0x7c, (byte) 0x44, (byte) 0x96, (byte) 0x2e, (byte) 0x6e, (byte) 0xa2,
    798             (byte) 0xb2, (byte) 0xa3, (byte) 0x4b, (byte) 0x0f, (byte) 0x32, (byte) 0x90,
    799             (byte) 0xaf, (byte) 0x5c, (byte) 0x6f, (byte) 0x00, (byte) 0x88, (byte) 0x45,
    800             (byte) 0x4e, (byte) 0x9b, (byte) 0x26, (byte) 0xc1, (byte) 0x94, (byte) 0x3c,
    801             (byte) 0xfe, (byte) 0x10, (byte) 0xbd, (byte) 0xda, (byte) 0xf2, (byte) 0x8d,
    802             (byte) 0x03, (byte) 0x52, (byte) 0x32, (byte) 0x11, (byte) 0xff, (byte) 0xf6,
    803             (byte) 0xf9, (byte) 0x6e, (byte) 0x8f, (byte) 0x0f, (byte) 0xc8, (byte) 0x0a,
    804             (byte) 0x48, (byte) 0x39, (byte) 0x33, (byte) 0xb9, (byte) 0x0c, (byte) 0xb3,
    805             (byte) 0x2b, (byte) 0xab, (byte) 0x7d, (byte) 0x79, (byte) 0x6f, (byte) 0x57,
    806             (byte) 0x5b, (byte) 0xb8, (byte) 0x84, (byte) 0xb6, (byte) 0xcc, (byte) 0xe8,
    807             (byte) 0x30, (byte) 0x78, (byte) 0xff, (byte) 0x92, (byte) 0xe5, (byte) 0x43,
    808             (byte) 0x2e, (byte) 0xef, (byte) 0x66, (byte) 0x98, (byte) 0xb4, (byte) 0xfe,
    809             (byte) 0xa2, (byte) 0x40, (byte) 0xf2, (byte) 0x1f, (byte) 0xd0, (byte) 0x86,
    810             (byte) 0x16, (byte) 0xc8, (byte) 0x45, (byte) 0xc4, (byte) 0x52, (byte) 0xcb,
    811             (byte) 0x31, (byte) 0x5c, (byte) 0x9f, (byte) 0x32, (byte) 0x3b, (byte) 0xf7,
    812             (byte) 0x19, (byte) 0x08, (byte) 0xc7, (byte) 0x00, (byte) 0x21, (byte) 0x7d,
    813             (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
    814             (byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
    815             (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
    816             (byte) 0x04, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3, (byte) 0xf1,
    817             (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f, (byte) 0x30,
    818             (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15, (byte) 0x32,
    819             (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30, (byte) 0x1f,
    820             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
    821             (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47,
    822             (byte) 0x82, (byte) 0xa3, (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a,
    823             (byte) 0xde, (byte) 0x4f, (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72,
    824             (byte) 0x81, (byte) 0x15, (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58,
    825             (byte) 0x18, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    826             (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
    827             (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
    828             (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
    829             (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00,
    830             (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x7f,
    831             (byte) 0x6a, (byte) 0x48, (byte) 0x90, (byte) 0x7b, (byte) 0x9b, (byte) 0x72,
    832             (byte) 0x13, (byte) 0xa7, (byte) 0xef, (byte) 0x6b, (byte) 0x0b, (byte) 0x59,
    833             (byte) 0xe5, (byte) 0x49, (byte) 0x72, (byte) 0x3a, (byte) 0xc8, (byte) 0x84,
    834             (byte) 0xcc, (byte) 0x23, (byte) 0x18, (byte) 0x4c, (byte) 0xec, (byte) 0xc7,
    835             (byte) 0xef, (byte) 0xcb, (byte) 0xa7, (byte) 0xbe, (byte) 0xe4, (byte) 0xef,
    836             (byte) 0x8f, (byte) 0xc6, (byte) 0x06, (byte) 0x8c, (byte) 0xc0, (byte) 0xe4,
    837             (byte) 0x2f, (byte) 0x2a, (byte) 0xc0, (byte) 0x35, (byte) 0x7d, (byte) 0x5e,
    838             (byte) 0x19, (byte) 0x29, (byte) 0x8c, (byte) 0xb9, (byte) 0xf1, (byte) 0x1e,
    839             (byte) 0xaf, (byte) 0x82, (byte) 0xd8, (byte) 0xe3, (byte) 0x88, (byte) 0xe1,
    840             (byte) 0x31, (byte) 0xc8, (byte) 0x82, (byte) 0x1f, (byte) 0x83, (byte) 0xa9,
    841             (byte) 0xde, (byte) 0xfe, (byte) 0x4b, (byte) 0xe2, (byte) 0x78, (byte) 0x64,
    842             (byte) 0xed, (byte) 0xa4, (byte) 0x7b, (byte) 0xee, (byte) 0x8d, (byte) 0x71,
    843             (byte) 0x1b, (byte) 0x44, (byte) 0xe6, (byte) 0xb7, (byte) 0xe8, (byte) 0xc5,
    844             (byte) 0x9a, (byte) 0x93, (byte) 0x92, (byte) 0x6f, (byte) 0x6f, (byte) 0xdb,
    845             (byte) 0xbd, (byte) 0xd7, (byte) 0x03, (byte) 0x85, (byte) 0xa9, (byte) 0x5f,
    846             (byte) 0x53, (byte) 0x5f, (byte) 0x5d, (byte) 0x30, (byte) 0xc6, (byte) 0xd9,
    847             (byte) 0xce, (byte) 0x34, (byte) 0xa8, (byte) 0xbe, (byte) 0x31, (byte) 0x47,
    848             (byte) 0x1c, (byte) 0xa4, (byte) 0x7f, (byte) 0xc0, (byte) 0x2c, (byte) 0xbc,
    849             (byte) 0xfe, (byte) 0x1a, (byte) 0x31, (byte) 0xd8, (byte) 0x77, (byte) 0x4d,
    850             (byte) 0xfc, (byte) 0x45, (byte) 0x84, (byte) 0xfc, (byte) 0x45, (byte) 0x12,
    851             (byte) 0xab, (byte) 0x50, (byte) 0xe4, (byte) 0x45, (byte) 0xe5, (byte) 0x11
    852     };
    853 
    854     /**
    855      * Generated from above and converted with: openssl pkcs8 -topk8 -outform d
    856      * -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
    857      */
    858     private static final byte[] FAKE_DSA_KEY_1 = new byte[] {
    859             (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x4c, (byte) 0x02, (byte) 0x01,
    860             (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06,
    861             (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38,
    862             (byte) 0x04, (byte) 0x01, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f,
    863             (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23,
    864             (byte) 0xf7, (byte) 0x86, (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc,
    865             (byte) 0xc3, (byte) 0x91, (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02,
    866             (byte) 0x47, (byte) 0x35, (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98,
    867             (byte) 0x13, (byte) 0x56, (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20,
    868             (byte) 0xa8, (byte) 0x60, (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77,
    869             (byte) 0xc1, (byte) 0x69, (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92,
    870             (byte) 0xf2, (byte) 0x6a, (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c,
    871             (byte) 0x91, (byte) 0x20, (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2,
    872             (byte) 0x87, (byte) 0xa6, (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45,
    873             (byte) 0x46, (byte) 0xf9, (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38,
    874             (byte) 0x8d, (byte) 0xff, (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f,
    875             (byte) 0x66, (byte) 0x15, (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb,
    876             (byte) 0x57, (byte) 0x39, (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd,
    877             (byte) 0xe2, (byte) 0xb4, (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32,
    878             (byte) 0x3b, (byte) 0x9d, (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d,
    879             (byte) 0x75, (byte) 0xb9, (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba,
    880             (byte) 0xb7, (byte) 0xc8, (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71,
    881             (byte) 0x91, (byte) 0xd3, (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e,
    882             (byte) 0x7c, (byte) 0x15, (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52,
    883             (byte) 0x65, (byte) 0x4d, (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35,
    884             (byte) 0xce, (byte) 0x0b, (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1,
    885             (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f,
    886             (byte) 0x7a, (byte) 0x31, (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2,
    887             (byte) 0xf7, (byte) 0xaf, (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92,
    888             (byte) 0xf3, (byte) 0x6c, (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02,
    889             (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36,
    890             (byte) 0x48, (byte) 0xdb, (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce,
    891             (byte) 0x6d, (byte) 0xbc, (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50,
    892             (byte) 0x91, (byte) 0x10, (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50,
    893             (byte) 0xda, (byte) 0x4f, (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb,
    894             (byte) 0x4d, (byte) 0xb0, (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3,
    895             (byte) 0x6c, (byte) 0xc9, (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0,
    896             (byte) 0x54, (byte) 0x7e, (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e,
    897             (byte) 0x5f, (byte) 0xc0, (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3,
    898             (byte) 0xd3, (byte) 0xdf, (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb,
    899             (byte) 0xe6, (byte) 0x20, (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca,
    900             (byte) 0xdb, (byte) 0xc0, (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16,
    901             (byte) 0x1d, (byte) 0xb3, (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89,
    902             (byte) 0x17, (byte) 0x73, (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60,
    903             (byte) 0xb7, (byte) 0xaa, (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03,
    904             (byte) 0x4e, (byte) 0x36, (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa,
    905             (byte) 0xf3, (byte) 0xd6, (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4,
    906             (byte) 0x41, (byte) 0xd6, (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b,
    907             (byte) 0x2d, (byte) 0x23, (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39,
    908             (byte) 0xa8, (byte) 0x6a, (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2,
    909             (byte) 0x77, (byte) 0x91, (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48,
    910             (byte) 0x78, (byte) 0xcd, (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x04,
    911             (byte) 0x17, (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xc7, (byte) 0xe7,
    912             (byte) 0xe2, (byte) 0x6b, (byte) 0x14, (byte) 0xe6, (byte) 0x31, (byte) 0x12,
    913             (byte) 0xb2, (byte) 0x1e, (byte) 0xd4, (byte) 0xf2, (byte) 0x9b, (byte) 0x2c,
    914             (byte) 0xf6, (byte) 0x54, (byte) 0x4c, (byte) 0x12, (byte) 0xe8, (byte) 0x22
    915     };
    916 
    917     /**
    918      * Generated from above and converted with: openssl x509 -outform d -in
    919      * usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
    920      */
    921     private static final byte[] FAKE_DSA_USER_1 = new byte[] {
    922             (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xca, (byte) 0x30, (byte) 0x82,
    923             (byte) 0x03, (byte) 0x33, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
    924             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
    925             (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
    926             (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
    927             (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
    928             (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
    929             (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
    930             (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
    931             (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
    932             (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
    933             (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
    934             (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
    935             (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
    936             (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
    937             (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
    938             (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
    939             (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03,
    940             (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63,
    941             (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
    942             (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
    943             (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
    944             (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x32,
    945             (byte) 0x33, (byte) 0x33, (byte) 0x34, (byte) 0x32, (byte) 0x32, (byte) 0x5a,
    946             (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38,
    947             (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x34,
    948             (byte) 0x32, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31,
    949             (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
    950             (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
    951             (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
    952             (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
    953             (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
    954             (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
    955             (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
    956             (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
    957             (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
    958             (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
    959             (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
    960             (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
    961             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
    962             (byte) 0x12, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65,
    963             (byte) 0x72, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
    964             (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
    965             (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xb7, (byte) 0x30,
    966             (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
    967             (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38, (byte) 0x04, (byte) 0x01,
    968             (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f, (byte) 0x02, (byte) 0x81,
    969             (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23, (byte) 0xf7, (byte) 0x86,
    970             (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc, (byte) 0xc3, (byte) 0x91,
    971             (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02, (byte) 0x47, (byte) 0x35,
    972             (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98, (byte) 0x13, (byte) 0x56,
    973             (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20, (byte) 0xa8, (byte) 0x60,
    974             (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77, (byte) 0xc1, (byte) 0x69,
    975             (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92, (byte) 0xf2, (byte) 0x6a,
    976             (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c, (byte) 0x91, (byte) 0x20,
    977             (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2, (byte) 0x87, (byte) 0xa6,
    978             (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45, (byte) 0x46, (byte) 0xf9,
    979             (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38, (byte) 0x8d, (byte) 0xff,
    980             (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f, (byte) 0x66, (byte) 0x15,
    981             (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb, (byte) 0x57, (byte) 0x39,
    982             (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd, (byte) 0xe2, (byte) 0xb4,
    983             (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32, (byte) 0x3b, (byte) 0x9d,
    984             (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d, (byte) 0x75, (byte) 0xb9,
    985             (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba, (byte) 0xb7, (byte) 0xc8,
    986             (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71, (byte) 0x91, (byte) 0xd3,
    987             (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e, (byte) 0x7c, (byte) 0x15,
    988             (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52, (byte) 0x65, (byte) 0x4d,
    989             (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35, (byte) 0xce, (byte) 0x0b,
    990             (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1, (byte) 0x02, (byte) 0x15,
    991             (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f, (byte) 0x7a, (byte) 0x31,
    992             (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2, (byte) 0xf7, (byte) 0xaf,
    993             (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92, (byte) 0xf3, (byte) 0x6c,
    994             (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02, (byte) 0x81, (byte) 0x81,
    995             (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36, (byte) 0x48, (byte) 0xdb,
    996             (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce, (byte) 0x6d, (byte) 0xbc,
    997             (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50, (byte) 0x91, (byte) 0x10,
    998             (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50, (byte) 0xda, (byte) 0x4f,
    999             (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb, (byte) 0x4d, (byte) 0xb0,
   1000             (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3, (byte) 0x6c, (byte) 0xc9,
   1001             (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0, (byte) 0x54, (byte) 0x7e,
   1002             (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e, (byte) 0x5f, (byte) 0xc0,
   1003             (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3, (byte) 0xd3, (byte) 0xdf,
   1004             (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb, (byte) 0xe6, (byte) 0x20,
   1005             (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca, (byte) 0xdb, (byte) 0xc0,
   1006             (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16, (byte) 0x1d, (byte) 0xb3,
   1007             (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89, (byte) 0x17, (byte) 0x73,
   1008             (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60, (byte) 0xb7, (byte) 0xaa,
   1009             (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03, (byte) 0x4e, (byte) 0x36,
   1010             (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa, (byte) 0xf3, (byte) 0xd6,
   1011             (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4, (byte) 0x41, (byte) 0xd6,
   1012             (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b, (byte) 0x2d, (byte) 0x23,
   1013             (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39, (byte) 0xa8, (byte) 0x6a,
   1014             (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2, (byte) 0x77, (byte) 0x91,
   1015             (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48, (byte) 0x78, (byte) 0xcd,
   1016             (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x03, (byte) 0x81, (byte) 0x84,
   1017             (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x1a, (byte) 0x50,
   1018             (byte) 0x9d, (byte) 0x3e, (byte) 0xa1, (byte) 0x6c, (byte) 0x99, (byte) 0x35,
   1019             (byte) 0x36, (byte) 0x26, (byte) 0x22, (byte) 0x6b, (byte) 0x47, (byte) 0x45,
   1020             (byte) 0x80, (byte) 0x5b, (byte) 0xd5, (byte) 0xc1, (byte) 0xc5, (byte) 0x70,
   1021             (byte) 0x75, (byte) 0x55, (byte) 0x66, (byte) 0x33, (byte) 0x1d, (byte) 0xae,
   1022             (byte) 0xd0, (byte) 0x01, (byte) 0x64, (byte) 0x8b, (byte) 0xae, (byte) 0x9d,
   1023             (byte) 0x66, (byte) 0x58, (byte) 0xf9, (byte) 0x42, (byte) 0x74, (byte) 0x3a,
   1024             (byte) 0x32, (byte) 0xc7, (byte) 0x7f, (byte) 0x25, (byte) 0x64, (byte) 0x7d,
   1025             (byte) 0x08, (byte) 0x26, (byte) 0xbf, (byte) 0x21, (byte) 0x3a, (byte) 0x84,
   1026             (byte) 0xcc, (byte) 0x2c, (byte) 0x66, (byte) 0x7d, (byte) 0xc7, (byte) 0xd6,
   1027             (byte) 0xb1, (byte) 0x69, (byte) 0x57, (byte) 0x67, (byte) 0x52, (byte) 0x73,
   1028             (byte) 0x3f, (byte) 0x79, (byte) 0x60, (byte) 0xaa, (byte) 0xf4, (byte) 0x8a,
   1029             (byte) 0x48, (byte) 0x42, (byte) 0x46, (byte) 0x41, (byte) 0xd0, (byte) 0x50,
   1030             (byte) 0x9b, (byte) 0xa2, (byte) 0x4e, (byte) 0xa5, (byte) 0x88, (byte) 0x10,
   1031             (byte) 0xf7, (byte) 0x61, (byte) 0xa2, (byte) 0xfa, (byte) 0x8d, (byte) 0xa6,
   1032             (byte) 0x13, (byte) 0x9e, (byte) 0x36, (byte) 0x86, (byte) 0x62, (byte) 0xf0,
   1033             (byte) 0x97, (byte) 0xef, (byte) 0x11, (byte) 0xc6, (byte) 0x35, (byte) 0xd3,
   1034             (byte) 0x79, (byte) 0x30, (byte) 0xde, (byte) 0xf2, (byte) 0x7f, (byte) 0x7a,
   1035             (byte) 0x3c, (byte) 0x03, (byte) 0xa3, (byte) 0xc5, (byte) 0xbc, (byte) 0xb1,
   1036             (byte) 0xbc, (byte) 0x2f, (byte) 0x10, (byte) 0xf4, (byte) 0x51, (byte) 0x89,
   1037             (byte) 0xe2, (byte) 0xaf, (byte) 0xf7, (byte) 0x61, (byte) 0x1a, (byte) 0xf0,
   1038             (byte) 0x87, (byte) 0x5e, (byte) 0xa5, (byte) 0x02, (byte) 0xd2, (byte) 0xe4,
   1039             (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30, (byte) 0x09,
   1040             (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,
   1041             (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c, (byte) 0x06,
   1042             (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, (byte) 0x86,
   1043             (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04, (byte) 0x1f,
   1044             (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65, (byte) 0x6e,
   1045             (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47, (byte) 0x65,
   1046             (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74, (byte) 0x65,
   1047             (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,
   1048             (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,
   1049             (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
   1050             (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
   1051             (byte) 0xd1, (byte) 0x6c, (byte) 0x36, (byte) 0x36, (byte) 0x61, (byte) 0x6c,
   1052             (byte) 0xf6, (byte) 0x90, (byte) 0x82, (byte) 0x82, (byte) 0x87, (byte) 0x93,
   1053             (byte) 0xbe, (byte) 0x99, (byte) 0x60, (byte) 0x1b, (byte) 0x03, (byte) 0x58,
   1054             (byte) 0x36, (byte) 0x63, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
   1055             (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
   1056             (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3,
   1057             (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f,
   1058             (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15,
   1059             (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30,
   1060             (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
   1061             (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
   1062             (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
   1063             (byte) 0x81, (byte) 0xde, (byte) 0x20, (byte) 0xa1, (byte) 0xb2, (byte) 0x50,
   1064             (byte) 0x03, (byte) 0xcd, (byte) 0x90, (byte) 0x4f, (byte) 0x2b, (byte) 0x47,
   1065             (byte) 0x1d, (byte) 0xac, (byte) 0x6e, (byte) 0xb4, (byte) 0xc7, (byte) 0x14,
   1066             (byte) 0xc6, (byte) 0x4f, (byte) 0x45, (byte) 0xaf, (byte) 0x81, (byte) 0x5d,
   1067             (byte) 0x5a, (byte) 0x31, (byte) 0xff, (byte) 0x9c, (byte) 0x4d, (byte) 0xdc,
   1068             (byte) 0x9e, (byte) 0x36, (byte) 0x9f, (byte) 0x9b, (byte) 0xb1, (byte) 0xc9,
   1069             (byte) 0x50, (byte) 0xa3, (byte) 0xf6, (byte) 0x9c, (byte) 0x68, (byte) 0x6f,
   1070             (byte) 0x68, (byte) 0xd9, (byte) 0x56, (byte) 0x1b, (byte) 0xe5, (byte) 0x1b,
   1071             (byte) 0x41, (byte) 0xd4, (byte) 0xcc, (byte) 0xb6, (byte) 0x37, (byte) 0xd5,
   1072             (byte) 0x69, (byte) 0x6b, (byte) 0x39, (byte) 0xaf, (byte) 0xc6, (byte) 0xb8,
   1073             (byte) 0x39, (byte) 0x76, (byte) 0xe3, (byte) 0xf7, (byte) 0x97, (byte) 0x74,
   1074             (byte) 0x31, (byte) 0xc4, (byte) 0x2d, (byte) 0xb7, (byte) 0x9a, (byte) 0xa4,
   1075             (byte) 0xfa, (byte) 0x9f, (byte) 0xa8, (byte) 0xe3, (byte) 0x41, (byte) 0xda,
   1076             (byte) 0x2f, (byte) 0x0c, (byte) 0x9d, (byte) 0x83, (byte) 0xdc, (byte) 0x86,
   1077             (byte) 0x1f, (byte) 0x5c, (byte) 0x0f, (byte) 0x87, (byte) 0x05, (byte) 0xc9,
   1078             (byte) 0xb0, (byte) 0x63, (byte) 0xca, (byte) 0x9b, (byte) 0xdb, (byte) 0xe6,
   1079             (byte) 0x3c, (byte) 0xe9, (byte) 0x23, (byte) 0x9e, (byte) 0x23, (byte) 0x44,
   1080             (byte) 0x1d, (byte) 0x5b, (byte) 0x60, (byte) 0x66, (byte) 0xb6, (byte) 0x72,
   1081             (byte) 0x8c, (byte) 0x87, (byte) 0x86, (byte) 0xe8, (byte) 0xdb, (byte) 0x29,
   1082             (byte) 0x67, (byte) 0x9c, (byte) 0x33, (byte) 0x5c, (byte) 0x39, (byte) 0xf1,
   1083             (byte) 0xb5, (byte) 0x9b, (byte) 0xb8, (byte) 0xe1, (byte) 0x42, (byte) 0x51,
   1084             (byte) 0xed, (byte) 0x2c
   1085     };
   1086 
   1087     /**
   1088      * The amount of time to allow before and after expected time for variance
   1089      * in timing tests.
   1090      */
   1091     private static final long SLOP_TIME_MILLIS = 15000L;
   1092 
   1093     @Override
   1094     protected void setUp() throws Exception {
   1095         mAndroidKeyStore = android.security.KeyStore.getInstance();
   1096 
   1097         assertTrue(mAndroidKeyStore.reset());
   1098         assertFalse(mAndroidKeyStore.isUnlocked());
   1099 
   1100         mKeyStore = java.security.KeyStore.getInstance("AndroidKeyStore");
   1101     }
   1102 
   1103     private void setupPassword() {
   1104         assertTrue(mAndroidKeyStore.password("1111"));
   1105         assertTrue(mAndroidKeyStore.isUnlocked());
   1106 
   1107         assertEquals(0, mAndroidKeyStore.saw("").length);
   1108     }
   1109 
   1110     private void assertAliases(final String[] expectedAliases) throws KeyStoreException {
   1111         final Enumeration<String> aliases = mKeyStore.aliases();
   1112         int count = 0;
   1113 
   1114         final Set<String> expectedSet = new HashSet<String>();
   1115         expectedSet.addAll(Arrays.asList(expectedAliases));
   1116 
   1117         while (aliases.hasMoreElements()) {
   1118             count++;
   1119             final String alias = aliases.nextElement();
   1120             assertTrue("The alias should be in the expected set", expectedSet.contains(alias));
   1121             expectedSet.remove(alias);
   1122         }
   1123         assertTrue("The expected set and actual set should be exactly equal", expectedSet.isEmpty());
   1124         assertEquals("There should be the correct number of keystore entries",
   1125                 expectedAliases.length, count);
   1126     }
   1127 
   1128     public void testKeyStore_Aliases_Encrypted_Success() throws Exception {
   1129         setupPassword();
   1130 
   1131         mKeyStore.load(null, null);
   1132 
   1133         assertAliases(new String[] {});
   1134 
   1135         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1136                 KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
   1137                 null));
   1138 
   1139         assertAliases(new String[] { TEST_ALIAS_1 });
   1140 
   1141         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   1142                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1143 
   1144         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
   1145     }
   1146 
   1147     public void testKeyStore_Aliases_NotInitialized_Encrypted_Failure() throws Exception {
   1148         setupPassword();
   1149 
   1150         try {
   1151             mKeyStore.aliases();
   1152             fail("KeyStore should throw exception when not initialized");
   1153         } catch (KeyStoreException success) {
   1154         }
   1155     }
   1156 
   1157     public void testKeyStore_ContainsAliases_PrivateAndCA_Encrypted_Success() throws Exception {
   1158         setupPassword();
   1159 
   1160         mKeyStore.load(null, null);
   1161 
   1162         assertAliases(new String[] {});
   1163 
   1164         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1165                 KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
   1166                 null));
   1167 
   1168         assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
   1169 
   1170         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   1171                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1172 
   1173         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
   1174 
   1175         assertFalse("Should not contain unadded certificate alias",
   1176                 mKeyStore.containsAlias(TEST_ALIAS_3));
   1177     }
   1178 
   1179     public void testKeyStore_ContainsAliases_CAOnly_Encrypted_Success() throws Exception {
   1180         setupPassword();
   1181 
   1182         mKeyStore.load(null, null);
   1183 
   1184         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   1185                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1186 
   1187         assertTrue("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_2));
   1188     }
   1189 
   1190     public void testKeyStore_ContainsAliases_NonExistent_Encrypted_Failure() throws Exception {
   1191         setupPassword();
   1192 
   1193         mKeyStore.load(null, null);
   1194 
   1195         assertFalse("Should contain added CA certificate", mKeyStore.containsAlias(TEST_ALIAS_1));
   1196     }
   1197 
   1198     public void testKeyStore_DeleteEntry_Encrypted_Success() throws Exception {
   1199         setupPassword();
   1200 
   1201         mKeyStore.load(null, null);
   1202 
   1203         // TEST_ALIAS_1
   1204         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1205                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1206         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1207                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1208         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1209                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1210 
   1211         // TEST_ALIAS_2
   1212         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   1213                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1214 
   1215         // TEST_ALIAS_3
   1216         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_3, FAKE_RSA_CA_1,
   1217                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1218 
   1219         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
   1220 
   1221         mKeyStore.deleteEntry(TEST_ALIAS_1);
   1222 
   1223         assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
   1224 
   1225         mKeyStore.deleteEntry(TEST_ALIAS_3);
   1226 
   1227         assertAliases(new String[] { TEST_ALIAS_2 });
   1228 
   1229         mKeyStore.deleteEntry(TEST_ALIAS_2);
   1230 
   1231         assertAliases(new String[] { });
   1232     }
   1233 
   1234     public void testKeyStore_DeleteEntry_EmptyStore_Encrypted_Success() throws Exception {
   1235         setupPassword();
   1236 
   1237         mKeyStore.load(null, null);
   1238 
   1239         // Should not throw when a non-existent entry is requested for delete.
   1240         mKeyStore.deleteEntry(TEST_ALIAS_1);
   1241     }
   1242 
   1243     public void testKeyStore_DeleteEntry_NonExistent_Encrypted_Success() throws Exception {
   1244         setupPassword();
   1245 
   1246         mKeyStore.load(null, null);
   1247 
   1248         // TEST_ALIAS_1
   1249         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1250                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1251         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1252                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1253         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1254                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1255 
   1256         // Should not throw when a non-existent entry is requested for delete.
   1257         mKeyStore.deleteEntry(TEST_ALIAS_2);
   1258     }
   1259 
   1260     public void testKeyStore_GetCertificate_Single_Encrypted_Success() throws Exception {
   1261         setupPassword();
   1262 
   1263         mKeyStore.load(null, null);
   1264 
   1265         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1266                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1267 
   1268         assertAliases(new String[] { TEST_ALIAS_1 });
   1269 
   1270         assertNull("Certificate should not exist in keystore",
   1271                 mKeyStore.getCertificate(TEST_ALIAS_2));
   1272 
   1273         Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
   1274 
   1275         assertNotNull("Retrieved certificate should not be null", retrieved);
   1276 
   1277         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1278         Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1279 
   1280         assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
   1281     }
   1282 
   1283     public void testKeyStore_GetCertificate_NonExist_Encrypted_Failure() throws Exception {
   1284         setupPassword();
   1285 
   1286         mKeyStore.load(null, null);
   1287 
   1288         assertNull("Certificate should not exist in keystore",
   1289                 mKeyStore.getCertificate(TEST_ALIAS_1));
   1290     }
   1291 
   1292     public void testKeyStore_GetCertificateAlias_CAEntry_Encrypted_Success() throws Exception {
   1293         setupPassword();
   1294 
   1295         mKeyStore.load(null, null);
   1296 
   1297         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1298                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1299 
   1300         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1301         Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1302 
   1303         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
   1304                 mKeyStore.getCertificateAlias(actual));
   1305     }
   1306 
   1307     public void testKeyStore_GetCertificateAlias_PrivateKeyEntry_Encrypted_Success()
   1308             throws Exception {
   1309         setupPassword();
   1310 
   1311         mKeyStore.load(null, null);
   1312 
   1313         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1314                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1315         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1316                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1317         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1318                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1319 
   1320         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1321         Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1322 
   1323         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
   1324                 mKeyStore.getCertificateAlias(actual));
   1325     }
   1326 
   1327     public void testKeyStore_GetCertificateAlias_CAEntry_WithPrivateKeyUsingCA_Encrypted_Success()
   1328             throws Exception {
   1329         setupPassword();
   1330 
   1331         mKeyStore.load(null, null);
   1332 
   1333         // Insert TrustedCertificateEntry with CA name
   1334         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   1335                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1336 
   1337         // Insert PrivateKeyEntry that uses the same CA
   1338         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1339                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1340         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1341                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1342         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1343                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1344 
   1345         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1346         Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1347 
   1348         assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
   1349                 mKeyStore.getCertificateAlias(actual));
   1350     }
   1351 
   1352     public void testKeyStore_GetCertificateAlias_NonExist_Empty_Encrypted_Failure()
   1353             throws Exception {
   1354         setupPassword();
   1355 
   1356         mKeyStore.load(null, null);
   1357 
   1358         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1359         Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1360 
   1361         assertNull("Stored certificate alias should not be found",
   1362                 mKeyStore.getCertificateAlias(actual));
   1363     }
   1364 
   1365     public void testKeyStore_GetCertificateAlias_NonExist_Encrypted_Failure() throws Exception {
   1366         setupPassword();
   1367 
   1368         mKeyStore.load(null, null);
   1369 
   1370         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1371                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1372 
   1373         CertificateFactory f = CertificateFactory.getInstance("X.509");
   1374         Certificate userCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1375 
   1376         assertNull("Stored certificate alias should be found",
   1377                 mKeyStore.getCertificateAlias(userCert));
   1378     }
   1379 
   1380     public void testKeyStore_GetCertificateChain_SingleLength_Encrypted_Success() throws Exception {
   1381         setupPassword();
   1382 
   1383         mKeyStore.load(null, null);
   1384 
   1385         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1386                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1387         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1388                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1389         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1390                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1391 
   1392         CertificateFactory cf = CertificateFactory.getInstance("X.509");
   1393         Certificate[] expected = new Certificate[2];
   1394         expected[0] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1395         expected[1] = cf.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1396 
   1397         Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
   1398 
   1399         assertNotNull("Returned certificate chain should not be null", actual);
   1400         assertEquals("Returned certificate chain should be correct size", expected.length,
   1401                 actual.length);
   1402         assertEquals("First certificate should be user certificate", expected[0], actual[0]);
   1403         assertEquals("Second certificate should be CA certificate", expected[1], actual[1]);
   1404 
   1405         // Negative test when keystore is populated.
   1406         assertNull("Stored certificate alias should not be found",
   1407                 mKeyStore.getCertificateChain(TEST_ALIAS_2));
   1408     }
   1409 
   1410     public void testKeyStore_GetCertificateChain_NonExist_Encrypted_Failure() throws Exception {
   1411         setupPassword();
   1412 
   1413         mKeyStore.load(null, null);
   1414 
   1415         assertNull("Stored certificate alias should not be found",
   1416                 mKeyStore.getCertificateChain(TEST_ALIAS_1));
   1417     }
   1418 
   1419     public void testKeyStore_GetCreationDate_PrivateKeyEntry_Encrypted_Success() throws Exception {
   1420         setupPassword();
   1421 
   1422         mKeyStore.load(null, null);
   1423 
   1424         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1425                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1426         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1427                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1428         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1429                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1430 
   1431         Date now = new Date();
   1432         Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
   1433 
   1434         Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
   1435         Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
   1436 
   1437         assertTrue("Time should be close to current time", actual.before(expectedBefore));
   1438         assertTrue("Time should be close to current time", actual.after(expectedAfter));
   1439     }
   1440 
   1441     public void testKeyStore_GetCreationDate_PrivateKeyEntry_Unencrypted_Success() throws Exception {
   1442         mKeyStore.load(null, null);
   1443 
   1444         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1445                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1446         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1447                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1448         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1449                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1450 
   1451         Date now = new Date();
   1452         Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
   1453 
   1454         Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
   1455         Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
   1456 
   1457         assertTrue("Time should be close to current time", actual.before(expectedBefore));
   1458         assertTrue("Time should be close to current time", actual.after(expectedAfter));
   1459     }
   1460 
   1461     public void testKeyStore_GetCreationDate_CAEntry_Encrypted_Success() throws Exception {
   1462         setupPassword();
   1463 
   1464         mKeyStore.load(null, null);
   1465 
   1466         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1467                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1468 
   1469         Date now = new Date();
   1470         Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
   1471         assertNotNull("Certificate should be found", actual);
   1472 
   1473         Date expectedAfter = new Date(now.getTime() - SLOP_TIME_MILLIS);
   1474         Date expectedBefore = new Date(now.getTime() + SLOP_TIME_MILLIS);
   1475 
   1476         assertTrue("Time should be close to current time", actual.before(expectedBefore));
   1477         assertTrue("Time should be close to current time", actual.after(expectedAfter));
   1478     }
   1479 
   1480     public void testKeyStore_GetEntry_NullParams_Encrypted_Success() throws Exception {
   1481         setupPassword();
   1482 
   1483         mKeyStore.load(null, null);
   1484 
   1485         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1486                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1487         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1488                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1489         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1490                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1491 
   1492         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1493         assertNotNull("Entry should exist", entry);
   1494 
   1495         assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
   1496 
   1497         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   1498 
   1499         assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   1500                 FAKE_RSA_CA_1);
   1501     }
   1502 
   1503     public void testKeyStore_GetEntry_DSA_NullParams_Unencrypted_Success() throws Exception {
   1504         mKeyStore.load(null, null);
   1505 
   1506         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1507                 FAKE_DSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1508         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   1509                 FAKE_DSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1510         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_DSA_CA_1,
   1511                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1512 
   1513         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1514         assertNotNull("Entry should exist", entry);
   1515 
   1516         assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
   1517 
   1518         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   1519 
   1520         assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
   1521     }
   1522 
   1523     public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
   1524         mKeyStore.load(null, null);
   1525 
   1526         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1527                 FAKE_EC_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1528         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   1529                 FAKE_EC_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1530         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_EC_CA_1,
   1531                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1532 
   1533         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1534         assertNotNull("Entry should exist", entry);
   1535 
   1536         assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
   1537 
   1538         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   1539 
   1540         assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
   1541     }
   1542 
   1543     public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
   1544         mKeyStore.load(null, null);
   1545 
   1546         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1547                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1548         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   1549                 FAKE_RSA_USER_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1550         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1551                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1552 
   1553         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1554         assertNotNull("Entry should exist", entry);
   1555 
   1556         assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
   1557 
   1558         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   1559 
   1560         assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   1561                 FAKE_RSA_CA_1);
   1562     }
   1563 
   1564     @SuppressWarnings("unchecked")
   1565     private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
   1566             byte[] cert, byte[] ca) throws Exception {
   1567         KeyFactory keyFact = KeyFactory.getInstance(keyType);
   1568         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
   1569 
   1570         CertificateFactory certFact = CertificateFactory.getInstance("X.509");
   1571         Certificate expectedCert = certFact.generateCertificate(new ByteArrayInputStream(cert));
   1572 
   1573         final Collection<Certificate> expectedChain;
   1574         if (ca != null) {
   1575             expectedChain = (Collection<Certificate>) certFact
   1576                     .generateCertificates(new ByteArrayInputStream(ca));
   1577         } else {
   1578             expectedChain = null;
   1579         }
   1580 
   1581         assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, expectedChain);
   1582     }
   1583 
   1584     private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
   1585             Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
   1586         if (expectedKey instanceof DSAPrivateKey) {
   1587             assertEquals("Returned PrivateKey should be what we inserted",
   1588                     ((DSAPrivateKey) expectedKey).getParams(),
   1589                     ((DSAPublicKey) keyEntry.getCertificate().getPublicKey()).getParams());
   1590         } else if (expectedKey instanceof ECPrivateKey) {
   1591             assertEquals("Returned PrivateKey should be what we inserted",
   1592                     ((ECPrivateKey) expectedKey).getParams().getCurve(),
   1593                     ((ECPublicKey) keyEntry.getCertificate().getPublicKey()).getParams().getCurve());
   1594         } else if (expectedKey instanceof RSAPrivateKey) {
   1595             assertEquals("Returned PrivateKey should be what we inserted",
   1596                     ((RSAPrivateKey) expectedKey).getModulus(),
   1597                     ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
   1598         }
   1599 
   1600         assertEquals("Returned Certificate should be what we inserted", expectedCert,
   1601                 keyEntry.getCertificate());
   1602 
   1603         Certificate[] actualChain = keyEntry.getCertificateChain();
   1604 
   1605         assertEquals("First certificate in chain should be user cert", expectedCert, actualChain[0]);
   1606 
   1607         if (expectedChain == null) {
   1608             assertEquals("Certificate chain should not include CAs", 1, actualChain.length);
   1609         } else {
   1610             int i = 1;
   1611             final Iterator<Certificate> it = expectedChain.iterator();
   1612             while (it.hasNext()) {
   1613                 assertEquals("CA chain certificate should equal what we put in", it.next(),
   1614                         actualChain[i++]);
   1615             }
   1616         }
   1617     }
   1618 
   1619     public void testKeyStore_GetEntry_Nonexistent_NullParams_Encrypted_Failure() throws Exception {
   1620         setupPassword();
   1621 
   1622         mKeyStore.load(null, null);
   1623 
   1624         assertNull("A non-existent entry should return null",
   1625                 mKeyStore.getEntry(TEST_ALIAS_1, null));
   1626     }
   1627 
   1628     public void testKeyStore_GetEntry_Nonexistent_NullParams_Unencrypted_Failure() throws Exception {
   1629         mKeyStore.load(null, null);
   1630 
   1631         assertNull("A non-existent entry should return null",
   1632                 mKeyStore.getEntry(TEST_ALIAS_1, null));
   1633     }
   1634 
   1635     public void testKeyStore_GetKey_NoPassword_Encrypted_Success() throws Exception {
   1636         setupPassword();
   1637 
   1638         mKeyStore.load(null, null);
   1639 
   1640         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1641                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1642         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1643                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1644         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1645                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1646 
   1647         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
   1648         assertNotNull("Key should exist", key);
   1649 
   1650         assertTrue("Should be a RSAPrivateKey", key instanceof RSAPrivateKey);
   1651 
   1652         RSAPrivateKey actualKey = (RSAPrivateKey) key;
   1653 
   1654         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1655         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1656 
   1657         assertEquals("Inserted key should be same as retrieved key",
   1658                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
   1659     }
   1660 
   1661     public void testKeyStore_GetKey_NoPassword_Unencrypted_Success() throws Exception {
   1662         mKeyStore.load(null, null);
   1663 
   1664         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1665                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1666         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1667                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1668         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1669                 KeyStore.UID_SELF, KeyStore.FLAG_NONE));
   1670 
   1671         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
   1672         assertNotNull("Key should exist", key);
   1673 
   1674         assertTrue("Should be a RSAPrivateKey", key instanceof RSAPrivateKey);
   1675 
   1676         RSAPrivateKey actualKey = (RSAPrivateKey) key;
   1677 
   1678         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1679         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1680 
   1681         assertEquals("Inserted key should be same as retrieved key",
   1682                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
   1683     }
   1684 
   1685     public void testKeyStore_GetKey_Certificate_Encrypted_Failure() throws Exception {
   1686         setupPassword();
   1687 
   1688         mKeyStore.load(null, null);
   1689 
   1690         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1691                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1692 
   1693         assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
   1694     }
   1695 
   1696     public void testKeyStore_GetKey_NonExistent_Encrypted_Failure() throws Exception {
   1697         setupPassword();
   1698 
   1699         mKeyStore.load(null, null);
   1700 
   1701         assertNull("A non-existent entry should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
   1702     }
   1703 
   1704     public void testKeyStore_GetProvider_Encrypted_Success() throws Exception {
   1705         assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
   1706         setupPassword();
   1707         assertEquals(AndroidKeyStoreProvider.PROVIDER_NAME, mKeyStore.getProvider().getName());
   1708     }
   1709 
   1710     public void testKeyStore_GetType_Encrypted_Success() throws Exception {
   1711         assertEquals(AndroidKeyStore.NAME, mKeyStore.getType());
   1712         setupPassword();
   1713         assertEquals(AndroidKeyStore.NAME, mKeyStore.getType());
   1714     }
   1715 
   1716     public void testKeyStore_IsCertificateEntry_CA_Encrypted_Success() throws Exception {
   1717         setupPassword();
   1718         mKeyStore.load(null, null);
   1719 
   1720         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1721                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1722 
   1723         assertTrue("Should return true for CA certificate",
   1724                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
   1725     }
   1726 
   1727     public void testKeyStore_IsCertificateEntry_PrivateKey_Encrypted_Failure() throws Exception {
   1728         setupPassword();
   1729         mKeyStore.load(null, null);
   1730 
   1731         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1732                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1733         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1734                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1735         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1736                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1737 
   1738         assertFalse("Should return false for PrivateKeyEntry",
   1739                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
   1740     }
   1741 
   1742     public void testKeyStore_IsCertificateEntry_NonExist_Encrypted_Failure() throws Exception {
   1743         setupPassword();
   1744         mKeyStore.load(null, null);
   1745 
   1746         assertFalse("Should return false for non-existent entry",
   1747                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
   1748     }
   1749 
   1750     public void testKeyStore_IsCertificateEntry_NonExist_Unencrypted_Failure() throws Exception {
   1751         mKeyStore.load(null, null);
   1752 
   1753         assertFalse("Should return false for non-existent entry",
   1754                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
   1755     }
   1756 
   1757     public void testKeyStore_IsKeyEntry_PrivateKey_Encrypted_Success() throws Exception {
   1758         setupPassword();
   1759         mKeyStore.load(null, null);
   1760 
   1761         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1762                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1763         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1764                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1765         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1766                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1767 
   1768         assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
   1769     }
   1770 
   1771     public void testKeyStore_IsKeyEntry_CA_Encrypted_Failure() throws Exception {
   1772         setupPassword();
   1773         mKeyStore.load(null, null);
   1774 
   1775         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1776                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1777 
   1778         assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
   1779     }
   1780 
   1781     public void testKeyStore_IsKeyEntry_NonExist_Encrypted_Failure() throws Exception {
   1782         setupPassword();
   1783         mKeyStore.load(null, null);
   1784 
   1785         assertFalse("Should return false for non-existent entry",
   1786                 mKeyStore.isKeyEntry(TEST_ALIAS_1));
   1787     }
   1788 
   1789     public void testKeyStore_SetCertificate_CA_Encrypted_Success() throws Exception {
   1790         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1791         final Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1792 
   1793         setupPassword();
   1794         mKeyStore.load(null, null);
   1795 
   1796         mKeyStore.setCertificateEntry(TEST_ALIAS_1, actual);
   1797         assertAliases(new String[] { TEST_ALIAS_1 });
   1798 
   1799         Certificate retrieved = mKeyStore.getCertificate(TEST_ALIAS_1);
   1800 
   1801         assertEquals("Retrieved certificate should be the same as the one inserted", actual,
   1802                 retrieved);
   1803     }
   1804 
   1805     public void testKeyStore_SetCertificate_CAExists_Overwrite_Encrypted_Success() throws Exception {
   1806         setupPassword();
   1807         mKeyStore.load(null, null);
   1808 
   1809         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1810                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1811 
   1812         assertAliases(new String[] { TEST_ALIAS_1 });
   1813 
   1814         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1815         final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1816 
   1817         // TODO have separate FAKE_CA for second test
   1818         mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
   1819 
   1820         assertAliases(new String[] { TEST_ALIAS_1 });
   1821     }
   1822 
   1823     public void testKeyStore_SetCertificate_PrivateKeyExists_Encrypted_Failure() throws Exception {
   1824         setupPassword();
   1825         mKeyStore.load(null, null);
   1826 
   1827         assertTrue(mAndroidKeyStore.importKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1,
   1828                 FAKE_RSA_KEY_1, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1829         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_USER_1,
   1830                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1831         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   1832                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   1833 
   1834         assertAliases(new String[] { TEST_ALIAS_1 });
   1835 
   1836         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1837         final Certificate cert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1838 
   1839         try {
   1840             mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
   1841             fail("Should throw when trying to overwrite a PrivateKey entry with a Certificate");
   1842         } catch (KeyStoreException success) {
   1843         }
   1844     }
   1845 
   1846     public void testKeyStore_SetEntry_PrivateKeyEntry_Encrypted_Success() throws Exception {
   1847         setupPassword();
   1848         mKeyStore.load(null, null);
   1849 
   1850         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1851         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1852 
   1853         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1854 
   1855         final Certificate[] expectedChain = new Certificate[2];
   1856         expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1857         expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1858 
   1859         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   1860 
   1861         mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   1862 
   1863         Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1864         assertNotNull("Retrieved entry should exist", actualEntry);
   1865 
   1866         assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   1867                 actualEntry instanceof PrivateKeyEntry);
   1868 
   1869         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   1870 
   1871         assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
   1872     }
   1873 
   1874     public void testKeyStore_SetEntry_PrivateKeyEntry_DSA_Unencrypted_Success() throws Exception {
   1875         mKeyStore.load(null, null);
   1876 
   1877         KeyFactory keyFact = KeyFactory.getInstance("DSA");
   1878         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_DSA_KEY_1));
   1879 
   1880         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1881 
   1882         final Certificate[] expectedChain = new Certificate[2];
   1883         expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_USER_1));
   1884         expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_DSA_CA_1));
   1885 
   1886         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   1887 
   1888         mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   1889 
   1890         Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1891         assertNotNull("Retrieved entry should exist", actualEntry);
   1892 
   1893         assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   1894                 actualEntry instanceof PrivateKeyEntry);
   1895 
   1896         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   1897 
   1898         assertPrivateKeyEntryEquals(actual, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
   1899     }
   1900 
   1901     public void testKeyStore_SetEntry_PrivateKeyEntry_EC_Unencrypted_Success() throws Exception {
   1902         mKeyStore.load(null, null);
   1903 
   1904         KeyFactory keyFact = KeyFactory.getInstance("EC");
   1905         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_EC_KEY_1));
   1906 
   1907         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1908 
   1909         final Certificate[] expectedChain = new Certificate[2];
   1910         expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_USER_1));
   1911         expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_EC_CA_1));
   1912 
   1913         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   1914 
   1915         mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   1916 
   1917         Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1918         assertNotNull("Retrieved entry should exist", actualEntry);
   1919 
   1920         assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   1921                 actualEntry instanceof PrivateKeyEntry);
   1922 
   1923         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   1924 
   1925         assertPrivateKeyEntryEquals(actual, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
   1926     }
   1927 
   1928     public void testKeyStore_SetEntry_PrivateKeyEntry_RSA_Unencrypted_Success() throws Exception {
   1929         mKeyStore.load(null, null);
   1930 
   1931         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1932         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1933 
   1934         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1935 
   1936         final Certificate[] expectedChain = new Certificate[2];
   1937         expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1938         expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1939 
   1940         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   1941 
   1942         mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   1943 
   1944         Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   1945         assertNotNull("Retrieved entry should exist", actualEntry);
   1946 
   1947         assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   1948                 actualEntry instanceof PrivateKeyEntry);
   1949 
   1950         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   1951 
   1952         assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
   1953     }
   1954 
   1955     public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
   1956         mKeyStore.load(null, null);
   1957 
   1958         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1959         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1960 
   1961         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1962 
   1963         final Certificate[] expectedChain = new Certificate[2];
   1964         expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1965         expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1966 
   1967         PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
   1968 
   1969         try {
   1970             mKeyStore.setEntry(TEST_ALIAS_1, entry,
   1971                     new KeyStoreParameter.Builder(getContext())
   1972                     .setEncryptionRequired(true)
   1973                     .build());
   1974             fail("Shouldn't be able to insert encrypted entry when KeyStore uninitialized");
   1975         } catch (KeyStoreException expected) {
   1976         }
   1977 
   1978         assertNull(mKeyStore.getEntry(TEST_ALIAS_1, null));
   1979     }
   1980 
   1981     public void
   1982             testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
   1983             throws Exception {
   1984         setupPassword();
   1985         mKeyStore.load(null, null);
   1986 
   1987         final KeyFactory keyFact = KeyFactory.getInstance("RSA");
   1988         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   1989 
   1990         // Start with PrivateKeyEntry
   1991         {
   1992             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   1993 
   1994             final Certificate[] expectedChain = new Certificate[2];
   1995             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   1996             expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   1997 
   1998             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   1999 
   2000             mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   2001 
   2002             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2003             assertNotNull("Retrieved entry should exist", actualEntry);
   2004 
   2005             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2006                     actualEntry instanceof PrivateKeyEntry);
   2007 
   2008             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   2009 
   2010             assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2011                     FAKE_RSA_CA_1);
   2012         }
   2013 
   2014         // TODO make entirely new test vector for the overwrite
   2015         // Replace with PrivateKeyEntry
   2016         {
   2017             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2018 
   2019             final Certificate[] expectedChain = new Certificate[2];
   2020             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2021             expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2022 
   2023             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
   2024 
   2025             mKeyStore.setEntry(TEST_ALIAS_1, expected, null);
   2026 
   2027             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2028             assertNotNull("Retrieved entry should exist", actualEntry);
   2029 
   2030             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2031                     actualEntry instanceof PrivateKeyEntry);
   2032 
   2033             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   2034 
   2035             assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2036                     FAKE_RSA_CA_1);
   2037         }
   2038     }
   2039 
   2040     public void testKeyStore_SetEntry_CAEntry_Overwrites_PrivateKeyEntry_Encrypted_Success()
   2041             throws Exception {
   2042         setupPassword();
   2043         mKeyStore.load(null, null);
   2044 
   2045         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2046 
   2047         // Start with TrustedCertificateEntry
   2048         {
   2049             final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2050 
   2051             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
   2052             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
   2053 
   2054             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2055             assertNotNull("Retrieved entry should exist", actualEntry);
   2056             assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
   2057                     actualEntry instanceof TrustedCertificateEntry);
   2058             TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
   2059             assertEquals("Stored and retrieved certificates should be the same",
   2060                     expectedCertEntry.getTrustedCertificate(),
   2061                     actualCertEntry.getTrustedCertificate());
   2062         }
   2063 
   2064         // Replace with PrivateKeyEntry
   2065         {
   2066             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2067             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2068             final Certificate[] expectedChain = new Certificate[2];
   2069             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2070             expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2071 
   2072             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
   2073 
   2074             mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
   2075 
   2076             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2077             assertNotNull("Retrieved entry should exist", actualEntry);
   2078             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2079                     actualEntry instanceof PrivateKeyEntry);
   2080 
   2081             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
   2082             assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2083                     FAKE_RSA_CA_1);
   2084         }
   2085     }
   2086 
   2087     public void testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_CAEntry_Encrypted_Success()
   2088             throws Exception {
   2089         setupPassword();
   2090         mKeyStore.load(null, null);
   2091 
   2092         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2093 
   2094         final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2095 
   2096         // Start with PrivateKeyEntry
   2097         {
   2098             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2099             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2100             final Certificate[] expectedChain = new Certificate[2];
   2101             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2102             expectedChain[1] = caCert;
   2103 
   2104             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
   2105 
   2106             mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
   2107 
   2108             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2109             assertNotNull("Retrieved entry should exist", actualEntry);
   2110             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2111                     actualEntry instanceof PrivateKeyEntry);
   2112 
   2113             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
   2114             assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2115                     FAKE_RSA_CA_1);
   2116         }
   2117 
   2118         // Replace with TrustedCertificateEntry
   2119         {
   2120             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
   2121             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
   2122 
   2123             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2124             assertNotNull("Retrieved entry should exist", actualEntry);
   2125             assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
   2126                     actualEntry instanceof TrustedCertificateEntry);
   2127             TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
   2128             assertEquals("Stored and retrieved certificates should be the same",
   2129                     expectedCertEntry.getTrustedCertificate(),
   2130                     actualCertEntry.getTrustedCertificate());
   2131         }
   2132     }
   2133 
   2134     public
   2135             void
   2136             testKeyStore_SetEntry_PrivateKeyEntry_Overwrites_ShortPrivateKeyEntry_Encrypted_Success()
   2137             throws Exception {
   2138         setupPassword();
   2139         mKeyStore.load(null, null);
   2140 
   2141         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2142 
   2143         final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2144 
   2145         // Start with PrivateKeyEntry
   2146         {
   2147             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2148             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2149             final Certificate[] expectedChain = new Certificate[2];
   2150             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2151             expectedChain[1] = caCert;
   2152 
   2153             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
   2154 
   2155             mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
   2156 
   2157             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2158             assertNotNull("Retrieved entry should exist", actualEntry);
   2159             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2160                     actualEntry instanceof PrivateKeyEntry);
   2161 
   2162             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
   2163             assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2164                     FAKE_RSA_CA_1);
   2165         }
   2166 
   2167         // Replace with PrivateKeyEntry that has no chain
   2168         {
   2169             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2170             PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2171             final Certificate[] expectedChain = new Certificate[1];
   2172             expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2173 
   2174             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
   2175 
   2176             mKeyStore.setEntry(TEST_ALIAS_1, expectedPrivEntry, null);
   2177 
   2178             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2179             assertNotNull("Retrieved entry should exist", actualEntry);
   2180             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2181                     actualEntry instanceof PrivateKeyEntry);
   2182 
   2183             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
   2184             assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2185                     null);
   2186         }
   2187     }
   2188 
   2189     public void testKeyStore_SetEntry_CAEntry_Overwrites_CAEntry_Encrypted_Success()
   2190             throws Exception {
   2191         setupPassword();
   2192         mKeyStore.load(null, null);
   2193 
   2194         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2195 
   2196         // Insert TrustedCertificateEntry
   2197         {
   2198             final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2199 
   2200             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
   2201             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
   2202 
   2203             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2204             assertNotNull("Retrieved entry should exist", actualEntry);
   2205             assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
   2206                     actualEntry instanceof TrustedCertificateEntry);
   2207             TrustedCertificateEntry actualCertEntry = (TrustedCertificateEntry) actualEntry;
   2208             assertEquals("Stored and retrieved certificates should be the same",
   2209                     expectedCertEntry.getTrustedCertificate(),
   2210                     actualCertEntry.getTrustedCertificate());
   2211         }
   2212 
   2213         // Replace with TrustedCertificateEntry of USER
   2214         {
   2215             final Certificate userCert = f
   2216                     .generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2217 
   2218             TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
   2219             mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
   2220 
   2221             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2222             assertNotNull("Retrieved entry should exist", actualEntry);
   2223             assertTrue("Retrieved entry should be of type TrustedCertificateEntry",
   2224                     actualEntry instanceof TrustedCertificateEntry);
   2225             TrustedCertificateEntry actualUserEntry = (TrustedCertificateEntry) actualEntry;
   2226             assertEquals("Stored and retrieved certificates should be the same",
   2227                     expectedUserEntry.getTrustedCertificate(),
   2228                     actualUserEntry.getTrustedCertificate());
   2229         }
   2230     }
   2231 
   2232     public void testKeyStore_SetKeyEntry_ProtectedKey_Encrypted_Failure() throws Exception {
   2233         setupPassword();
   2234         mKeyStore.load(null, null);
   2235 
   2236         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2237 
   2238         final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2239 
   2240         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2241         PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2242         final Certificate[] chain = new Certificate[2];
   2243         chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2244         chain[1] = caCert;
   2245 
   2246         try {
   2247             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, "foo".toCharArray(), chain);
   2248             fail("Should fail when a password is specified");
   2249         } catch (KeyStoreException success) {
   2250         }
   2251     }
   2252 
   2253     public void testKeyStore_SetKeyEntry_Encrypted_Success() throws Exception {
   2254         setupPassword();
   2255         mKeyStore.load(null, null);
   2256 
   2257         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2258 
   2259         final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2260 
   2261         KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2262         PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2263         final Certificate[] chain = new Certificate[2];
   2264         chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2265         chain[1] = caCert;
   2266 
   2267         mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
   2268 
   2269         Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2270         assertNotNull("Retrieved entry should exist", actualEntry);
   2271 
   2272         assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2273                 actualEntry instanceof PrivateKeyEntry);
   2274 
   2275         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   2276 
   2277         assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
   2278     }
   2279 
   2280     public void testKeyStore_SetKeyEntry_Replaced_Encrypted_Success() throws Exception {
   2281         setupPassword();
   2282         mKeyStore.load(null, null);
   2283 
   2284         final CertificateFactory f = CertificateFactory.getInstance("X.509");
   2285 
   2286         final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
   2287 
   2288         // Insert initial key
   2289         {
   2290             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2291             PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2292             final Certificate[] chain = new Certificate[2];
   2293             chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2294             chain[1] = caCert;
   2295 
   2296             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
   2297 
   2298             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2299             assertNotNull("Retrieved entry should exist", actualEntry);
   2300 
   2301             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2302                     actualEntry instanceof PrivateKeyEntry);
   2303 
   2304             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   2305 
   2306             assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2307                     FAKE_RSA_CA_1);
   2308         }
   2309 
   2310         // TODO make a separate key
   2311         // Replace key
   2312         {
   2313             KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2314             PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
   2315             final Certificate[] chain = new Certificate[2];
   2316             chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
   2317             chain[1] = caCert;
   2318 
   2319             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
   2320 
   2321             Entry actualEntry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2322             assertNotNull("Retrieved entry should exist", actualEntry);
   2323 
   2324             assertTrue("Retrieved entry should be of type PrivateKeyEntry",
   2325                     actualEntry instanceof PrivateKeyEntry);
   2326 
   2327             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
   2328 
   2329             assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
   2330                     FAKE_RSA_CA_1);
   2331         }
   2332     }
   2333 
   2334     @SuppressWarnings("deprecation")
   2335     private static X509Certificate generateCertificate(android.security.KeyStore keyStore,
   2336             String alias, BigInteger serialNumber, X500Principal subjectDN, Date notBefore,
   2337             Date notAfter) throws Exception {
   2338         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + alias;
   2339 
   2340         final PrivateKey privKey;
   2341         final OpenSSLEngine engine = OpenSSLEngine.getInstance("keystore");
   2342         try {
   2343             privKey = engine.getPrivateKeyById(privateKeyAlias);
   2344         } catch (InvalidKeyException e) {
   2345             throw new RuntimeException("Can't get key", e);
   2346         }
   2347 
   2348         final byte[] pubKeyBytes = keyStore.getPubkey(privateKeyAlias);
   2349 
   2350         final PublicKey pubKey;
   2351         try {
   2352             final KeyFactory keyFact = KeyFactory.getInstance("RSA");
   2353             pubKey = keyFact.generatePublic(new X509EncodedKeySpec(pubKeyBytes));
   2354         } catch (NoSuchAlgorithmException e) {
   2355             throw new IllegalStateException("Can't instantiate RSA key generator", e);
   2356         } catch (InvalidKeySpecException e) {
   2357             throw new IllegalStateException("keystore returned invalid key encoding", e);
   2358         }
   2359 
   2360         final X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
   2361         certGen.setPublicKey(pubKey);
   2362         certGen.setSerialNumber(serialNumber);
   2363         certGen.setSubjectDN(subjectDN);
   2364         certGen.setIssuerDN(subjectDN);
   2365         certGen.setNotBefore(notBefore);
   2366         certGen.setNotAfter(notAfter);
   2367         certGen.setSignatureAlgorithm("sha1WithRSA");
   2368 
   2369         final X509Certificate cert = certGen.generate(privKey);
   2370 
   2371         return cert;
   2372     }
   2373 
   2374     public void testKeyStore_SetKeyEntry_ReplacedChain_Encrypted_Success() throws Exception {
   2375         setupPassword();
   2376         mKeyStore.load(null, null);
   2377 
   2378         // Create key #1
   2379         {
   2380             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
   2381             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
   2382                     NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
   2383 
   2384             Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
   2385 
   2386             assertTrue(key instanceof PrivateKey);
   2387 
   2388             PrivateKey expectedKey = (PrivateKey) key;
   2389 
   2390             X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
   2391                     TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
   2392 
   2393             assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   2394                     expectedCert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2395 
   2396             Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2397 
   2398             assertTrue(entry instanceof PrivateKeyEntry);
   2399 
   2400             PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   2401 
   2402             assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
   2403         }
   2404 
   2405         // Replace key #1 with new chain
   2406         {
   2407             Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
   2408 
   2409             assertTrue(key instanceof PrivateKey);
   2410 
   2411             PrivateKey expectedKey = (PrivateKey) key;
   2412 
   2413             X509Certificate expectedCert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
   2414                     TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
   2415 
   2416             mKeyStore.setKeyEntry(TEST_ALIAS_1, expectedKey, null,
   2417                     new Certificate[] { expectedCert });
   2418 
   2419             Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2420 
   2421             assertTrue(entry instanceof PrivateKeyEntry);
   2422 
   2423             PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
   2424 
   2425             assertPrivateKeyEntryEquals(keyEntry, expectedKey, expectedCert, null);
   2426         }
   2427     }
   2428 
   2429     public void testKeyStore_SetKeyEntry_ReplacedChain_DifferentPrivateKey_Encrypted_Failure()
   2430             throws Exception {
   2431         setupPassword();
   2432         mKeyStore.load(null, null);
   2433 
   2434         // Create key #1
   2435         {
   2436             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
   2437             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
   2438                     NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
   2439 
   2440             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1,
   2441                     TEST_SERIAL_1, TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
   2442 
   2443             assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   2444                     cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2445         }
   2446 
   2447         // Create key #2
   2448         {
   2449             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_2;
   2450             assertTrue(mAndroidKeyStore.generate(privateKeyAlias, KeyStore.UID_SELF,
   2451                     NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED, null));
   2452 
   2453             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
   2454                     TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
   2455 
   2456             assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_2,
   2457                     cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2458         }
   2459 
   2460         // Replace key #1 with key #2
   2461         {
   2462             Key key1 = mKeyStore.getKey(TEST_ALIAS_2, null);
   2463 
   2464             X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_2,
   2465                     TEST_SERIAL_2, TEST_DN_2, NOW, NOW_PLUS_10_YEARS);
   2466 
   2467             try {
   2468                 mKeyStore.setKeyEntry(TEST_ALIAS_1, key1, null, new Certificate[] { cert });
   2469                 fail("Should not allow setting of KeyEntry with wrong PrivaetKey");
   2470             } catch (KeyStoreException success) {
   2471             }
   2472         }
   2473     }
   2474 
   2475     public void testKeyStore_SetKeyEntry_ReplacedChain_UnencryptedToEncrypted_Failure()
   2476             throws Exception {
   2477         mKeyStore.load(null, null);
   2478 
   2479         // Create key #1
   2480         {
   2481             final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
   2482             assertTrue(mAndroidKeyStore.generate(privateKeyAlias,
   2483                     android.security.KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
   2484                     android.security.KeyStore.FLAG_NONE, null));
   2485 
   2486             X509Certificate cert =
   2487                     generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1, TEST_DN_1,
   2488                             NOW, NOW_PLUS_10_YEARS);
   2489 
   2490             assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   2491                     cert.getEncoded(), android.security.KeyStore.UID_SELF,
   2492                     android.security.KeyStore.FLAG_NONE));
   2493         }
   2494 
   2495         // Replace with one that requires encryption
   2496         {
   2497             Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2498 
   2499             try {
   2500                 mKeyStore.setEntry(TEST_ALIAS_1, entry,
   2501                         new KeyStoreParameter.Builder(getContext())
   2502                                 .setEncryptionRequired(true)
   2503                                 .build());
   2504                 fail("Should not allow setting of Entry without unlocked keystore");
   2505             } catch (KeyStoreException success) {
   2506             }
   2507 
   2508             assertTrue(mAndroidKeyStore.password("1111"));
   2509             assertTrue(mAndroidKeyStore.isUnlocked());
   2510 
   2511             mKeyStore.setEntry(TEST_ALIAS_1, entry,
   2512                     new KeyStoreParameter.Builder(getContext())
   2513                             .setEncryptionRequired(true)
   2514                             .build());
   2515         }
   2516     }
   2517 
   2518     public void testKeyStore_Size_Encrypted_Success() throws Exception {
   2519         setupPassword();
   2520         mKeyStore.load(null, null);
   2521 
   2522         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_1, FAKE_RSA_CA_1,
   2523                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2524 
   2525         assertEquals("The keystore size should match expected", 1, mKeyStore.size());
   2526         assertAliases(new String[] { TEST_ALIAS_1 });
   2527 
   2528         assertTrue(mAndroidKeyStore.put(Credentials.CA_CERTIFICATE + TEST_ALIAS_2, FAKE_RSA_CA_1,
   2529                 KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2530 
   2531         assertEquals("The keystore size should match expected", 2, mKeyStore.size());
   2532         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
   2533 
   2534         assertTrue(mAndroidKeyStore.generate(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3,
   2535                 KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024, KeyStore.FLAG_ENCRYPTED,
   2536                 null));
   2537 
   2538         assertEquals("The keystore size should match expected", 3, mKeyStore.size());
   2539         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
   2540 
   2541         assertTrue(mAndroidKeyStore.delete(Credentials.CA_CERTIFICATE + TEST_ALIAS_1));
   2542 
   2543         assertEquals("The keystore size should match expected", 2, mKeyStore.size());
   2544         assertAliases(new String[] { TEST_ALIAS_2, TEST_ALIAS_3 });
   2545 
   2546         assertTrue(mAndroidKeyStore.delKey(Credentials.USER_PRIVATE_KEY + TEST_ALIAS_3));
   2547 
   2548         assertEquals("The keystore size should match expected", 1, mKeyStore.size());
   2549         assertAliases(new String[] { TEST_ALIAS_2 });
   2550     }
   2551 
   2552     public void testKeyStore_Store_LoadStoreParam_Encrypted_Failure() throws Exception {
   2553         setupPassword();
   2554         mKeyStore.load(null, null);
   2555 
   2556         try {
   2557             mKeyStore.store(null);
   2558             fail("Should throw UnsupportedOperationException when trying to store");
   2559         } catch (UnsupportedOperationException success) {
   2560         }
   2561     }
   2562 
   2563     public void testKeyStore_Load_InputStreamSupplied_Encrypted_Failure() throws Exception {
   2564         byte[] buf = "FAKE KEYSTORE".getBytes();
   2565         ByteArrayInputStream is = new ByteArrayInputStream(buf);
   2566 
   2567         try {
   2568             mKeyStore.load(is, null);
   2569             fail("Should throw IllegalArgumentException when InputStream is supplied");
   2570         } catch (IllegalArgumentException success) {
   2571         }
   2572     }
   2573 
   2574     public void testKeyStore_Load_PasswordSupplied_Encrypted_Failure() throws Exception {
   2575         try {
   2576             mKeyStore.load(null, "password".toCharArray());
   2577             fail("Should throw IllegalArgumentException when password is supplied");
   2578         } catch (IllegalArgumentException success) {
   2579         }
   2580     }
   2581 
   2582     public void testKeyStore_Store_OutputStream_Encrypted_Failure() throws Exception {
   2583         setupPassword();
   2584         mKeyStore.load(null, null);
   2585 
   2586         OutputStream sink = new ByteArrayOutputStream();
   2587         try {
   2588             mKeyStore.store(sink, null);
   2589             fail("Should throw UnsupportedOperationException when trying to store");
   2590         } catch (UnsupportedOperationException success) {
   2591         }
   2592 
   2593         try {
   2594             mKeyStore.store(sink, "blah".toCharArray());
   2595             fail("Should throw UnsupportedOperationException when trying to store");
   2596         } catch (UnsupportedOperationException success) {
   2597         }
   2598     }
   2599 
   2600     private void setupKey() throws Exception {
   2601         final String privateKeyAlias = Credentials.USER_PRIVATE_KEY + TEST_ALIAS_1;
   2602         assertTrue(mAndroidKeyStore
   2603                 .generate(privateKeyAlias, KeyStore.UID_SELF, NativeCrypto.EVP_PKEY_RSA, 1024,
   2604                         KeyStore.FLAG_ENCRYPTED, null));
   2605 
   2606         X509Certificate cert = generateCertificate(mAndroidKeyStore, TEST_ALIAS_1, TEST_SERIAL_1,
   2607                 TEST_DN_1, NOW, NOW_PLUS_10_YEARS);
   2608 
   2609         assertTrue(mAndroidKeyStore.put(Credentials.USER_CERTIFICATE + TEST_ALIAS_1,
   2610                 cert.getEncoded(), KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED));
   2611     }
   2612 
   2613     public void testKeyStore_KeyOperations_Wrap_Encrypted_Success() throws Exception {
   2614         setupPassword();
   2615         mKeyStore.load(null, null);
   2616 
   2617         setupKey();
   2618 
   2619         // Test key usage
   2620         Entry e = mKeyStore.getEntry(TEST_ALIAS_1, null);
   2621         assertNotNull(e);
   2622         assertTrue(e instanceof PrivateKeyEntry);
   2623 
   2624         PrivateKeyEntry privEntry = (PrivateKeyEntry) e;
   2625         PrivateKey privKey = privEntry.getPrivateKey();
   2626         assertNotNull(privKey);
   2627 
   2628         PublicKey pubKey = privEntry.getCertificate().getPublicKey();
   2629 
   2630         Cipher c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
   2631         c.init(Cipher.WRAP_MODE, pubKey);
   2632 
   2633         byte[] expectedKey = new byte[] {
   2634                 0x00, 0x05, (byte) 0xAA, (byte) 0x0A5, (byte) 0xFF, 0x55, 0x0A
   2635         };
   2636 
   2637         SecretKey expectedSecret = new SecretKeySpec(expectedKey, "AES");
   2638 
   2639         byte[] wrappedExpected = c.wrap(expectedSecret);
   2640 
   2641         c.init(Cipher.UNWRAP_MODE, privKey);
   2642         SecretKey actualSecret = (SecretKey) c.unwrap(wrappedExpected, "AES", Cipher.SECRET_KEY);
   2643 
   2644         assertEquals(Arrays.toString(expectedSecret.getEncoded()),
   2645                 Arrays.toString(actualSecret.getEncoded()));
   2646     }
   2647 }
   2648