1 package org.bouncycastle.crypto; 2 3 import org.bouncycastle.util.Strings; 4 5 /** 6 * super class for all Password Based Encryption (PBE) parameter generator classes. 7 */ 8 public abstract class PBEParametersGenerator 9 { 10 protected byte[] password; 11 protected byte[] salt; 12 protected int iterationCount; 13 14 /** 15 * base constructor. 16 */ PBEParametersGenerator()17 protected PBEParametersGenerator() 18 { 19 } 20 21 /** 22 * initialise the PBE generator. 23 * 24 * @param password the password converted into bytes (see below). 25 * @param salt the salt to be mixed with the password. 26 * @param iterationCount the number of iterations the "mixing" function 27 * is to be applied for. 28 */ init( byte[] password, byte[] salt, int iterationCount)29 public void init( 30 byte[] password, 31 byte[] salt, 32 int iterationCount) 33 { 34 this.password = password; 35 this.salt = salt; 36 this.iterationCount = iterationCount; 37 } 38 39 /** 40 * return the password byte array. 41 * 42 * @return the password byte array. 43 */ getPassword()44 public byte[] getPassword() 45 { 46 return password; 47 } 48 49 /** 50 * return the salt byte array. 51 * 52 * @return the salt byte array. 53 */ getSalt()54 public byte[] getSalt() 55 { 56 return salt; 57 } 58 59 /** 60 * return the iteration count. 61 * 62 * @return the iteration count. 63 */ getIterationCount()64 public int getIterationCount() 65 { 66 return iterationCount; 67 } 68 69 /** 70 * generate derived parameters for a key of length keySize. 71 * 72 * @param keySize the length, in bits, of the key required. 73 * @return a parameters object representing a key. 74 */ generateDerivedParameters(int keySize)75 public abstract CipherParameters generateDerivedParameters(int keySize); 76 77 /** 78 * generate derived parameters for a key of length keySize, and 79 * an initialisation vector (IV) of length ivSize. 80 * 81 * @param keySize the length, in bits, of the key required. 82 * @param ivSize the length, in bits, of the iv required. 83 * @return a parameters object representing a key and an IV. 84 */ generateDerivedParameters(int keySize, int ivSize)85 public abstract CipherParameters generateDerivedParameters(int keySize, int ivSize); 86 87 /** 88 * generate derived parameters for a key of length keySize, specifically 89 * for use with a MAC. 90 * 91 * @param keySize the length, in bits, of the key required. 92 * @return a parameters object representing a key. 93 */ generateDerivedMacParameters(int keySize)94 public abstract CipherParameters generateDerivedMacParameters(int keySize); 95 96 /** 97 * converts a password to a byte array according to the scheme in 98 * PKCS5 (ascii, no padding) 99 * 100 * @param password a character array representing the password. 101 * @return a byte array representing the password. 102 */ PKCS5PasswordToBytes( char[] password)103 public static byte[] PKCS5PasswordToBytes( 104 char[] password) 105 { 106 if (password != null) 107 { 108 byte[] bytes = new byte[password.length]; 109 110 for (int i = 0; i != bytes.length; i++) 111 { 112 bytes[i] = (byte)password[i]; 113 } 114 115 return bytes; 116 } 117 else 118 { 119 return new byte[0]; 120 } 121 } 122 123 /** 124 * converts a password to a byte array according to the scheme in 125 * PKCS5 (UTF-8, no padding) 126 * 127 * @param password a character array representing the password. 128 * @return a byte array representing the password. 129 */ PKCS5PasswordToUTF8Bytes( char[] password)130 public static byte[] PKCS5PasswordToUTF8Bytes( 131 char[] password) 132 { 133 if (password != null) 134 { 135 return Strings.toUTF8ByteArray(password); 136 } 137 else 138 { 139 return new byte[0]; 140 } 141 } 142 143 /** 144 * converts a password to a byte array according to the scheme in 145 * PKCS12 (unicode, big endian, 2 zero pad bytes at the end). 146 * 147 * @param password a character array representing the password. 148 * @return a byte array representing the password. 149 */ PKCS12PasswordToBytes( char[] password)150 public static byte[] PKCS12PasswordToBytes( 151 char[] password) 152 { 153 if (password != null && password.length > 0) 154 { 155 // +1 for extra 2 pad bytes. 156 byte[] bytes = new byte[(password.length + 1) * 2]; 157 158 for (int i = 0; i != password.length; i ++) 159 { 160 bytes[i * 2] = (byte)(password[i] >>> 8); 161 bytes[i * 2 + 1] = (byte)password[i]; 162 } 163 164 return bytes; 165 } 166 else 167 { 168 return new byte[0]; 169 } 170 } 171 } 172