/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.pbe; import org.cryptacular.spec.KeyedBlockCipherSpec; /** * Describes block ciphers allowed with the OpenSSL password-based encryption scheme. * * @author Middleware Services */ public enum OpenSSLAlgorithm { /** AES-128 in CBC mode. */ AES_128_CBC("aes-128-cbc", new KeyedBlockCipherSpec("AES", "CBC", "PKCS5", 128)), /** AES-192 in CBC mode. */ AES_192_CBC("aes-192-cbc", new KeyedBlockCipherSpec("AES", "CBC", "PKCS5", 192)), /** AES-256 in CBC mode. */ AES_256_CBC("aes-256-cbc", new KeyedBlockCipherSpec("AES", "CBC", "PKCS5", 256)), /** DES in CBC mode. */ DES_CBC("des-cbc", new KeyedBlockCipherSpec("DES", "CBC", "PKCS5", 64)), /** Triple DES in CBC mode. */ DES_EDE3_CBC("des-ede3-cbc", new KeyedBlockCipherSpec("DESede", "CBC", "PKCS5", 192)), /** 128-bit RC2 in CBC mode. */ RC2_CBC("rc2-cbc", new KeyedBlockCipherSpec("RC2", "CBC", "PKCS5", 128)), /** 40-bit RC2 in CBC mode. */ RC2_40_CBC("rc2-40-cbc", new KeyedBlockCipherSpec("RC2", "CBC", "PKCS5", 40)), /** 64-bit RC2 in CBC mode. */ RC2_64_CBC("rc2-64-cbc", new KeyedBlockCipherSpec("RC2", "CBC", "PKCS5", 64)); /** Algorithm identifier, e.g. aes-128-cbc. */ private final String algorithmId; /** Cipher algorithm specification. */ private final KeyedBlockCipherSpec cipherSpec; /** * Creates a new instance with given parameters. * * @param algId Algorithm identifier, e.g. aes-128-cbc. * @param cipherSpec Block cipher specification that corresponds to algorithm ID. */ OpenSSLAlgorithm(final String algId, final KeyedBlockCipherSpec cipherSpec) { this.algorithmId = algId; this.cipherSpec = cipherSpec; } /** @return OpenSSL algorithm identifier, e.g. aes-128-cbc. */ public String getAlgorithmId() { return algorithmId; } /** @return Cipher algorithm specification. */ public KeyedBlockCipherSpec getCipherSpec() { return cipherSpec; } /** * Converts an OID to the corresponding algorithm specification. * * @param algorithmId Algorithm OID. * * @return Algorithm spec. */ public static OpenSSLAlgorithm fromAlgorithmId(final String algorithmId) { for (OpenSSLAlgorithm alg : values()) { if (alg.getAlgorithmId().equalsIgnoreCase(algorithmId)) { return alg; } } throw new IllegalArgumentException("Unsupported algorithm " + algorithmId); } }