package org.bouncycastle.jcajce; import org.bouncycastle.crypto.PBEParametersGenerator; /** * A password based key for use with PKCS#12. */ public class PKCS12Key implements PBKDFKey { private final char[] password; private final boolean useWrongZeroLengthConversion; /** * Basic constructor for a password based key - secret key generation parameters will be passed separately.. * * @param password password to use. */ public PKCS12Key(char[] password) { this(password, false); } /** * Unfortunately there seems to be some confusion about how to handle zero length * passwords. * * @param password password to use. * @param useWrongZeroLengthConversion use the incorrect encoding approach (add pad bytes) */ public PKCS12Key(char[] password, boolean useWrongZeroLengthConversion) { if (password == null) { password = new char[0]; } this.password = new char[password.length]; this.useWrongZeroLengthConversion = useWrongZeroLengthConversion; System.arraycopy(password, 0, this.password, 0, password.length); } /** * Return a reference to the char[] array holding the password. * * @return a reference to the password array. */ public char[] getPassword() { return password; } /** * Return the password based key derivation function this key is for, * * @return the string "PKCS12" */ public String getAlgorithm() { return "PKCS12"; } /** * Return the format encoding. * * @return the string "PKCS12", representing the char[] to byte[] conversion. */ public String getFormat() { return "PKCS12"; } /** * Return the password converted to bytes. * * @return the password converted to a byte array. */ public byte[] getEncoded() { if (useWrongZeroLengthConversion && password.length == 0) { return new byte[2]; } return PBEParametersGenerator.PKCS12PasswordToBytes(password); } }