001 // Copyright (C) 2002 IAIK 002 // https://jce.iaik.tugraz.at 003 // 004 // Copyright (C) 2003 - 2025 Stiftung Secure Information and 005 // Communication Technologies SIC 006 // https://sic.tech 007 // 008 // All rights reserved. 009 // 010 // Redistribution and use in source and binary forms, with or without 011 // modification, are permitted provided that the following conditions 012 // are met: 013 // 1. Redistributions of source code must retain the above copyright 014 // notice, this list of conditions and the following disclaimer. 015 // 2. Redistributions in binary form must reproduce the above copyright 016 // notice, this list of conditions and the following disclaimer in the 017 // documentation and/or other materials provided with the distribution. 018 // 019 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 020 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 021 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 023 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 024 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 025 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 027 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 028 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 029 // SUCH DAMAGE. 030 031 // Copyright (C) 2002 IAIK 032 // https://sic.tech/ 033 // 034 // Copyright (C) 2003 - 2025 Stiftung Secure Information and 035 // Communication Technologies SIC 036 // https://sic.tech/ 037 // 038 // All rights reserved. 039 // 040 // This source is provided for inspection purposes and recompilation only, 041 // unless specified differently in a contract with IAIK. This source has to 042 // be kept in strict confidence and must not be disclosed to any third party 043 // under any circumstances. Redistribution in source and binary forms, with 044 // or without modification, are <not> permitted in any case! 045 // 046 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 047 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 048 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 049 // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 050 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 051 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 052 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 053 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 054 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 055 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 056 // SUCH DAMAGE. 057 // 058 // $Header: /IAIK-CMS/current/src/demo/cms/ecc/keystore/CMSEccKeyStore.java 26 12.02.25 17:58 Dbratko $ 059 // $Revision: 26 $ 060 // 061 062 package demo.cms.ecc.keystore; 063 064 import java.io.File; 065 import java.io.FileInputStream; 066 import java.security.KeyStore; 067 import java.security.PrivateKey; 068 import java.util.HashMap; 069 070 import demo.keystore.CMSKeyStore; 071 import iaik.cms.SecurityProvider; 072 import iaik.utils.Util; 073 import iaik.x509.X509Certificate; 074 075 /** 076 * Keystore for the ECC demos of IAIK-CMS. 077 */ 078 public class CMSEccKeyStore implements CMSEccKeyStoreConstants { 079 080 /** 081 * Certificates. 082 */ 083 static Object[][] certificates = new Object[2][22]; 084 /** 085 * Keys. 086 */ 087 static PrivateKey[][] keys = new PrivateKey[2][22]; 088 /** 089 * Ca certificate. 090 */ 091 static X509Certificate ca_certificate; 092 /** 093 * Ca key. 094 */ 095 static PrivateKey ca_key; 096 097 /** 098 * Repository holding keys by their corresponding (certificate) ids. 099 */ 100 private static HashMap recipientKeys_ = new HashMap(); 101 102 /** 103 * Repository holding certs by their corresponding (certificate) ids. 104 */ 105 private static HashMap recipientCerts_ = new HashMap(); 106 107 public final static int ECDSA = 0; 108 public final static int ECDH = 1; 109 110 // signing keys 111 public final static int SZ_192_SIGN = 0; 112 public final static int SZ_224_SIGN = 1; 113 public final static int SZ_256_SIGN = 2; 114 public final static int SZ_384_SIGN = 3; 115 public final static int SZ_521_SIGN = 4; 116 public final static int SZ_ED25519 = 5; 117 public final static int SZ_ED448 = 6; 118 public final static int SZ_192_BRAINPOOL_SIGN = 7; 119 public final static int SZ_224_BRAINPOOL_SIGN = 8; 120 public final static int SZ_256_BRAINPOOL_SIGN = 9; 121 public final static int SZ_384_BRAINPOOL_SIGN = 10; 122 public final static int SZ_512_BRAINPOOL_SIGN = 11; 123 124 // encryption / key agreement keys 125 public final static int SZ_192_CRYPT_1 = 0; 126 public final static int SZ_192_CRYPT_2 = 1; 127 public final static int SZ_224_CRYPT_1 = 2; 128 public final static int SZ_224_CRYPT_2 = 3; 129 public final static int SZ_256_CRYPT_1 = 4; 130 public final static int SZ_256_CRYPT_2 = 5; 131 public final static int SZ_384_CRYPT_1 = 6; 132 public final static int SZ_384_CRYPT_2 = 7; 133 public final static int SZ_521_CRYPT_1 = 8; 134 public final static int SZ_521_CRYPT_2 = 9; 135 public final static int SZ_X25519 = 10; 136 public final static int SZ_X448 = 11; 137 public final static int SZ_192_BRAINPOOL_CRYPT_1 = 12; 138 public final static int SZ_192_BRAINPOOL_CRYPT_2 = 13; 139 public final static int SZ_224_BRAINPOOL_CRYPT_1 = 14; 140 public final static int SZ_224_BRAINPOOL_CRYPT_2 = 15; 141 public final static int SZ_256_BRAINPOOL_CRYPT_1 = 16; 142 public final static int SZ_256_BRAINPOOL_CRYPT_2 = 17; 143 public final static int SZ_384_BRAINPOOL_CRYPT_1 = 18; 144 public final static int SZ_384_BRAINPOOL_CRYPT_2 = 19; 145 public final static int SZ_512_BRAINPOOL_CRYPT_1 = 20; 146 public final static int SZ_512_BRAINPOOL_CRYPT_2 = 21; 147 148 /** 149 * Keystore. 150 */ 151 static KeyStore key_store; 152 153 /** 154 * Loads and inits keystore. 155 */ 156 static { 157 System.out.println("initializing KeyStore..."); 158 loadKeyStore(); 159 initKeyStore(); 160 } 161 162 /** 163 * Loads the keystore from the file ("cmsecc.keystore"). 164 */ 165 private static void loadKeyStore() { 166 boolean createKeyStore = false; 167 // try to locate the KeyStore 168 // first check the current working directory 169 File ks = new File(KS_DIRECTORY, KS_FILENAME); 170 if (!ks.exists()) { 171 createKeyStore = true; 172 // called from demo batch file (try parent directory) 173 File ksDir = new File(KS_DIRECTORY); 174 if (ksDir.exists()) { 175 String parentDir = ksDir.getParent(); 176 String pDir = parentDir.toLowerCase(); 177 if ((pDir.endsWith("cms")) || (pDir.endsWith("smime"))) { 178 File ksParent = new File(parentDir, KS_FILENAME); 179 if (ksParent.exists()) { 180 ks = ksParent; 181 createKeyStore = false; 182 } 183 } 184 } 185 if (createKeyStore) { 186 // keystore does not exist ==> create new one 187 System.out.println(); 188 System.out.println(); 189 System.out.println("Can not find the KeyStore " + KS_FILENAME + " in directory:"); 190 System.out.println(ks.getAbsolutePath()); 191 System.out.println("Generating key store!"); 192 try { 193 SetupCMSEccKeyStore.main(new String[] {}); 194 } catch (Exception ex) { 195 System.out.println("Unable to create KeyStore!"); 196 ex.printStackTrace(); 197 demo.DemoUtil.waitKey(); 198 System.exit(1); 199 } 200 } 201 } 202 203 FileInputStream fis = null; 204 // now try to create and load the KeyStore 205 try { 206 fis = new FileInputStream(ks); 207 key_store = SecurityProvider.getSecurityProvider().getKeyStore("IAIKKeyStore"); 208 key_store.load(fis, KS_PASSWORD); 209 fis.close(); 210 } catch (Exception ex) { 211 System.out.println("Unable to load KeyStore!"); 212 ex.printStackTrace(); 213 if (fis != null) { 214 try { 215 fis.close(); 216 } catch (Exception e) { 217 // ignore 218 } 219 } 220 demo.DemoUtil.waitKey(); 221 System.exit(1); 222 } 223 } 224 225 /** 226 * Initializes the keystore. 227 */ 228 private static void initKeyStore() { 229 try { 230 ca_certificate = Util.convertCertificateChain(key_store.getCertificateChain(CA_ECDSA))[0]; 231 ca_key = (PrivateKey)key_store.getKey(CA_ECDSA, KS_PASSWORD); 232 233 certificates[ECDSA][SZ_192_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_192)); 234 keys[ECDSA][SZ_192_SIGN] = (PrivateKey)key_store.getKey(ECDSA_192, KS_PASSWORD); 235 certificates[ECDSA][SZ_224_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_224)); 236 keys[ECDSA][SZ_224_SIGN] = (PrivateKey)key_store.getKey(ECDSA_224, KS_PASSWORD); 237 certificates[ECDSA][SZ_256_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_256)); 238 keys[ECDSA][SZ_256_SIGN] = (PrivateKey)key_store.getKey(ECDSA_256, KS_PASSWORD); 239 certificates[ECDSA][SZ_384_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_384)); 240 keys[ECDSA][SZ_384_SIGN] = (PrivateKey)key_store.getKey(ECDSA_384, KS_PASSWORD); 241 certificates[ECDSA][SZ_521_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_521)); 242 keys[ECDSA][SZ_521_SIGN] = (PrivateKey)key_store.getKey(ECDSA_521, KS_PASSWORD); 243 244 } catch (Exception ex) { 245 System.out.println("Unable to get ECDSA certificates from KeyStore."); 246 ex.printStackTrace(); 247 } 248 249 try { 250 certificates[ECDH][SZ_192_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_192_1)); 251 keys[ECDH][SZ_192_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_192_1, KS_PASSWORD); 252 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_192_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_192_CRYPT_1])); 253 certificates[ECDH][SZ_192_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_192_2)); 254 keys[ECDH][SZ_192_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_192_2, KS_PASSWORD); 255 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_192_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_192_CRYPT_2])); 256 certificates[ECDH][SZ_224_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_224_1)); 257 keys[ECDH][SZ_224_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_224_1, KS_PASSWORD); 258 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_224_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_224_CRYPT_1])); 259 certificates[ECDH][SZ_224_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_224_2)); 260 keys[ECDH][SZ_224_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_224_2, KS_PASSWORD); 261 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_224_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_224_CRYPT_2])); 262 certificates[ECDH][SZ_256_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_256_1)); 263 keys[ECDH][SZ_256_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_256_1, KS_PASSWORD); 264 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_256_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_256_CRYPT_1])); 265 certificates[ECDH][SZ_256_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_256_2)); 266 keys[ECDH][SZ_256_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_256_2, KS_PASSWORD); 267 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_256_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_256_CRYPT_2])); 268 certificates[ECDH][SZ_384_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_384_1)); 269 keys[ECDH][SZ_384_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_384_1, KS_PASSWORD); 270 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_384_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_384_CRYPT_1])); 271 certificates[ECDH][SZ_384_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_384_2)); 272 keys[ECDH][SZ_384_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_384_2, KS_PASSWORD); 273 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_384_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_384_CRYPT_2])); 274 certificates[ECDH][SZ_521_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_521_1)); 275 keys[ECDH][SZ_521_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_521_1, KS_PASSWORD); 276 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_521_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_521_CRYPT_1])); 277 certificates[ECDH][SZ_521_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_521_2)); 278 keys[ECDH][SZ_521_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_521_2, KS_PASSWORD); 279 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_521_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_521_CRYPT_2])); 280 } catch (Exception ex) { 281 System.out.println("Unable to get ECDH certificates from KeyStore."); 282 ex.printStackTrace(); 283 } 284 285 try { 286 certificates[ECDSA][SZ_ED25519] = Util.convertCertificateChain(key_store.getCertificateChain(EDDSA_ED25519)); 287 keys[ECDSA][SZ_ED25519] = (PrivateKey)key_store.getKey(EDDSA_ED25519, KS_PASSWORD); 288 certificates[ECDSA][SZ_ED448] = Util.convertCertificateChain(key_store.getCertificateChain(EDDSA_ED448)); 289 keys[ECDSA][SZ_ED448] = (PrivateKey)key_store.getKey(EDDSA_ED448, KS_PASSWORD); 290 } catch (Exception ex) { 291 System.out.println("Unable to get EdDSA certificate from KeyStore."); 292 ex.printStackTrace(); 293 } 294 295 try { 296 certificates[ECDH][SZ_X25519] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_X25519)); 297 keys[ECDH][SZ_X25519] = (PrivateKey)key_store.getKey(ECDH_X25519, KS_PASSWORD); 298 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_X25519], ((X509Certificate[])certificates[ECDH][SZ_X25519])); 299 certificates[ECDH][SZ_X448] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_X448)); 300 keys[ECDH][SZ_X448] = (PrivateKey)key_store.getKey(ECDH_X448, KS_PASSWORD); 301 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_X448], ((X509Certificate[])certificates[ECDH][SZ_X448])); 302 } catch (Exception ex) { 303 System.out.println("Unable to get ECDH x25519, x448 certificate from KeyStore."); 304 ex.printStackTrace(); 305 } 306 307 try { 308 certificates[ECDSA][SZ_192_BRAINPOOL_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_BRAINPOOL_192)); 309 keys[ECDSA][SZ_192_BRAINPOOL_SIGN] = (PrivateKey)key_store.getKey(ECDSA_BRAINPOOL_192, KS_PASSWORD); 310 certificates[ECDSA][SZ_224_BRAINPOOL_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_BRAINPOOL_224)); 311 keys[ECDSA][SZ_224_BRAINPOOL_SIGN] = (PrivateKey)key_store.getKey(ECDSA_BRAINPOOL_224, KS_PASSWORD); 312 certificates[ECDSA][SZ_256_BRAINPOOL_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_BRAINPOOL_256)); 313 keys[ECDSA][SZ_256_BRAINPOOL_SIGN] = (PrivateKey)key_store.getKey(ECDSA_BRAINPOOL_256, KS_PASSWORD); 314 certificates[ECDSA][SZ_384_BRAINPOOL_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_BRAINPOOL_384)); 315 keys[ECDSA][SZ_384_BRAINPOOL_SIGN] = (PrivateKey)key_store.getKey(ECDSA_BRAINPOOL_384, KS_PASSWORD); 316 certificates[ECDSA][SZ_512_BRAINPOOL_SIGN] = Util.convertCertificateChain(key_store.getCertificateChain(ECDSA_BRAINPOOL_512)); 317 keys[ECDSA][SZ_512_BRAINPOOL_SIGN] = (PrivateKey)key_store.getKey(ECDSA_BRAINPOOL_512, KS_PASSWORD); 318 319 } catch (Exception ex) { 320 System.out.println("Unable to get ECDSA Brainpool certificates from KeyStore."); 321 ex.printStackTrace(); 322 } 323 324 try { 325 certificates[ECDH][SZ_192_BRAINPOOL_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_192_1)); 326 keys[ECDH][SZ_192_BRAINPOOL_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_192_1, KS_PASSWORD); 327 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_192_BRAINPOOL_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_192_BRAINPOOL_CRYPT_1])); 328 certificates[ECDH][SZ_192_BRAINPOOL_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_192_2)); 329 keys[ECDH][SZ_192_BRAINPOOL_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_192_2, KS_PASSWORD); 330 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_192_BRAINPOOL_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_192_BRAINPOOL_CRYPT_2])); 331 certificates[ECDH][SZ_224_BRAINPOOL_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_224_1)); 332 keys[ECDH][SZ_224_BRAINPOOL_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_224_1, KS_PASSWORD); 333 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_224_BRAINPOOL_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_224_BRAINPOOL_CRYPT_1])); 334 certificates[ECDH][SZ_224_BRAINPOOL_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_224_2)); 335 keys[ECDH][SZ_224_BRAINPOOL_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_224_2, KS_PASSWORD); 336 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_224_BRAINPOOL_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_224_BRAINPOOL_CRYPT_2])); 337 certificates[ECDH][SZ_256_BRAINPOOL_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_256_1)); 338 keys[ECDH][SZ_256_BRAINPOOL_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_256_1, KS_PASSWORD); 339 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_256_BRAINPOOL_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_256_BRAINPOOL_CRYPT_1])); 340 certificates[ECDH][SZ_256_BRAINPOOL_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_256_2)); 341 keys[ECDH][SZ_256_BRAINPOOL_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_256_2, KS_PASSWORD); 342 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_256_BRAINPOOL_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_256_BRAINPOOL_CRYPT_2])); 343 certificates[ECDH][SZ_384_BRAINPOOL_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_384_1)); 344 keys[ECDH][SZ_384_BRAINPOOL_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_384_1, KS_PASSWORD); 345 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_384_BRAINPOOL_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_384_BRAINPOOL_CRYPT_1])); 346 certificates[ECDH][SZ_384_BRAINPOOL_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_384_2)); 347 keys[ECDH][SZ_384_BRAINPOOL_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_384_2, KS_PASSWORD); 348 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_384_BRAINPOOL_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_384_BRAINPOOL_CRYPT_2])); 349 certificates[ECDH][SZ_512_BRAINPOOL_CRYPT_1] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_512_1)); 350 keys[ECDH][SZ_512_BRAINPOOL_CRYPT_1] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_512_1, KS_PASSWORD); 351 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_512_BRAINPOOL_CRYPT_1], ((X509Certificate[])certificates[ECDH][SZ_512_BRAINPOOL_CRYPT_1])); 352 certificates[ECDH][SZ_512_BRAINPOOL_CRYPT_2] = Util.convertCertificateChain(key_store.getCertificateChain(ECDH_BRAINPOOL_512_2)); 353 keys[ECDH][SZ_512_BRAINPOOL_CRYPT_2] = (PrivateKey)key_store.getKey(ECDH_BRAINPOOL_512_2, KS_PASSWORD); 354 CMSKeyStore.addRecipientKey(keys[ECDH][SZ_512_BRAINPOOL_CRYPT_2], ((X509Certificate[])certificates[ECDH][SZ_512_BRAINPOOL_CRYPT_2])); 355 } catch (Exception ex) { 356 System.out.println("Unable to get ECDH Brainpool certificates from KeyStore."); 357 ex.printStackTrace(); 358 } 359 360 361 } 362 363 /** 364 * Returns the private key of a CA certificate. 365 * 366 * @param type {@link #ECDSA ECDSA} or {@link #ECDH ECDH} 367 * @param size the key size 368 * 369 * @return the key 370 */ 371 public static PrivateKey getPrivateKey(int type, int size) { 372 try { 373 return keys[type][size]; 374 } catch (ArrayIndexOutOfBoundsException ex) { 375 throw new RuntimeException("Wrong type or size!"); 376 } 377 } 378 379 /** 380 * Returns a demo user certificate. 381 * 382 * @param type {@link #ECDSA ECDSA} or {@link #ECDH ECDH} 383 * @param size the size of the corresponding key 384 * 385 * @return the certificate chain 386 */ 387 public static X509Certificate[] getCertificateChain(int type, int size) { 388 try { 389 return (X509Certificate[])certificates[type][size]; 390 } catch (ArrayIndexOutOfBoundsException ex) { 391 throw new RuntimeException("Wrong type or size!"); 392 } 393 } 394 395 /** 396 * Returns the private key of a CA certificate. 397 * 398 * @return the private key of the ca 399 */ 400 public static PrivateKey getCaPrivateKey() { 401 return ca_key; 402 } 403 404 /** 405 * Returns the demo CA certificate. 406 * 407 * @return the demo CA certificate 408 */ 409 public static X509Certificate getCaCertificate() { 410 return ca_certificate; 411 } 412 }