001 package org.apache.fulcrum.pbe; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import java.io.IOException; 023 import java.io.InputStream; 024 import java.io.OutputStream; 025 import java.security.GeneralSecurityException; 026 027 import org.apache.avalon.framework.configuration.Configurable; 028 import org.apache.avalon.framework.configuration.Configuration; 029 import org.apache.avalon.framework.configuration.ConfigurationException; 030 import org.apache.avalon.framework.logger.AbstractLogEnabled; 031 import org.apache.fulcrum.jce.crypto.CryptoParameters; 032 import org.apache.fulcrum.jce.crypto.CryptoStreamFactory; 033 import org.apache.fulcrum.jce.crypto.CryptoStreamFactoryImpl; 034 import org.apache.fulcrum.jce.crypto.CryptoUtil; 035 import org.apache.fulcrum.jce.crypto.HexConverter; 036 import org.apache.fulcrum.jce.crypto.PasswordFactory; 037 import org.apache.fulcrum.jce.crypto.PasswordParameters; 038 039 /** 040 * Encapsulates an PBE (Password Based Encryption) functionality 041 * from the JCE (Java Crypto Extension). 042 * 043 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a> 044 */ 045 046 public class PBEServiceImpl 047 extends AbstractLogEnabled 048 implements PBEService, Configurable 049 { 050 /** the internally used factory to create cipher streams */ 051 private CryptoStreamFactory cryptoStreamFactory; 052 053 /** the salt for generating the password */ 054 private byte[] passwordSalt; 055 056 /** the invocations of MessageDigest */ 057 private int passwordCount; 058 059 /** the default password */ 060 private char[] defaultPassword; 061 062 /** 063 * Constructor 064 */ 065 public PBEServiceImpl() 066 { 067 // nothing to do 068 } 069 070 ///////////////////////////////////////////////////////////////////////// 071 // Avalon Service Lifecycle Implementation 072 ///////////////////////////////////////////////////////////////////////// 073 074 /** 075 * @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration) 076 */ 077 public void configure(Configuration configuration) 078 throws ConfigurationException 079 { 080 // read the parameters for CryptoStreamFactory 081 082 byte[] cryptoSalt = CryptoParameters.SALT; 083 int cryptoCount = configuration.getChild("cyrptoCount").getValueAsInteger(CryptoParameters.COUNT); 084 String tempCryptoSalt = configuration.getChild("cryptoSalt").getValue(""); 085 086 if( tempCryptoSalt.length() > 0 ) 087 { 088 cryptoSalt = HexConverter.toBytes( tempCryptoSalt ); 089 } 090 091 // create the CryptoStreamFactory to be used 092 093 this.cryptoStreamFactory = new CryptoStreamFactoryImpl( 094 cryptoSalt, 095 cryptoCount 096 ); 097 098 // read the parameters for PasswordFactory 099 100 this.passwordSalt = PasswordParameters.SALT; 101 this.passwordCount = configuration.getChild("passwordCount").getValueAsInteger(PasswordParameters.COUNT); 102 this.defaultPassword = PasswordParameters.DEFAULTPASSWORD; 103 } 104 105 106 ///////////////////////////////////////////////////////////////////////// 107 // PBE Service Implementation 108 ///////////////////////////////////////////////////////////////////////// 109 110 /** 111 * @see org.apache.fulcrum.pbe.PBEService#createPassword() 112 */ 113 public char[] createPassword() throws Exception 114 { 115 return PasswordFactory.create( 116 this.defaultPassword, 117 this.passwordSalt, 118 this.passwordCount 119 ); 120 } 121 122 /** 123 * @see org.apache.fulcrum.pbe.PBEService#createPassword(char[]) 124 */ 125 public char [] createPassword(char [] seed) throws Exception 126 { 127 return PasswordFactory.create( 128 seed, 129 this.passwordSalt, 130 this.passwordCount 131 ); 132 } 133 134 /** 135 * @see org.apache.fulcrum.pbe.PBEService#decryptString(java.lang.String, char[]) 136 */ 137 public String decryptString(String cipherText, char [] password) 138 throws GeneralSecurityException, IOException 139 { 140 return CryptoUtil.decryptString( 141 this.getCryptoStreamFactory(), 142 cipherText, 143 password 144 ); 145 } 146 147 /** 148 * @see org.apache.fulcrum.pbe.PBEService#encryptString(java.lang.String, char[]) 149 */ 150 public String encryptString(String plainText, char [] password) 151 throws GeneralSecurityException, IOException 152 { 153 return CryptoUtil.encryptString( 154 this.getCryptoStreamFactory(), 155 plainText, 156 password 157 ); 158 } 159 160 /** 161 * @see org.apache.fulcrum.pbe.PBEService#getInputStream(java.io.InputStream, char[]) 162 */ 163 public InputStream getInputStream(InputStream is, char [] password) 164 throws GeneralSecurityException, IOException 165 { 166 return this.getCryptoStreamFactory().getInputStream( 167 is, 168 password 169 ); 170 } 171 172 /** 173 * @see org.apache.fulcrum.pbe.PBEService#getSmartInputStream(java.io.InputStream, char[]) 174 */ 175 public InputStream getSmartInputStream(InputStream is, char [] password) 176 throws GeneralSecurityException, IOException 177 { 178 return this.getCryptoStreamFactory().getSmartInputStream( 179 is, 180 password 181 ); 182 } 183 184 /** 185 * @see org.apache.fulcrum.pbe.PBEService#getOutputStream(java.io.OutputStream, char[]) 186 */ 187 public OutputStream getOutputStream(OutputStream os, char [] password) 188 throws GeneralSecurityException, IOException 189 { 190 return this.getCryptoStreamFactory().getOutputStream( 191 os, 192 password 193 ); 194 } 195 196 /** 197 * @see org.apache.fulcrum.pbe.PBEService#decrypt(java.lang.Object, java.lang.Object, char[]) 198 */ 199 public void decrypt(Object source, Object target, char [] password) 200 throws GeneralSecurityException, IOException 201 { 202 CryptoUtil.decrypt( 203 this.getCryptoStreamFactory(), 204 source, 205 target, 206 password 207 ); 208 } 209 210 /** 211 * @see org.apache.fulcrum.pbe.PBEService#encrypt(java.lang.Object, java.lang.Object, char[]) 212 */ 213 public void encrypt(Object source, Object target, char [] password) 214 throws GeneralSecurityException, IOException 215 { 216 CryptoUtil.encrypt( 217 this.getCryptoStreamFactory(), 218 source, 219 target, 220 password 221 ); 222 } 223 224 ///////////////////////////////////////////////////////////////////////// 225 // Service Implementation 226 ///////////////////////////////////////////////////////////////////////// 227 228 /** 229 * @return Returns the cryptoStreamFactory. 230 */ 231 private CryptoStreamFactory getCryptoStreamFactory() 232 { 233 return cryptoStreamFactory; 234 } 235 }