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