001 /* 002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org 003 * Copyright (C) 2011 NightLabs Consulting GmbH 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 package org.cumulus4j.crypto.internal.mac; 019 020 import org.bouncycastle.crypto.BlockCipher; 021 import org.bouncycastle.crypto.Digest; 022 import org.bouncycastle.crypto.digests.MD2Digest; 023 import org.bouncycastle.crypto.digests.MD4Digest; 024 import org.bouncycastle.crypto.digests.MD5Digest; 025 import org.bouncycastle.crypto.digests.RIPEMD128Digest; 026 import org.bouncycastle.crypto.digests.RIPEMD160Digest; 027 import org.bouncycastle.crypto.digests.SHA1Digest; 028 import org.bouncycastle.crypto.digests.SHA224Digest; 029 import org.bouncycastle.crypto.digests.SHA256Digest; 030 import org.bouncycastle.crypto.digests.SHA384Digest; 031 import org.bouncycastle.crypto.digests.SHA512Digest; 032 import org.bouncycastle.crypto.digests.TigerDigest; 033 import org.bouncycastle.crypto.engines.DESEngine; 034 import org.bouncycastle.crypto.engines.RC2Engine; 035 import org.bouncycastle.crypto.macs.CBCBlockCipherMac; 036 import org.bouncycastle.crypto.macs.CFBBlockCipherMac; 037 import org.bouncycastle.crypto.macs.GOST28147Mac; 038 import org.bouncycastle.crypto.macs.HMac; 039 import org.bouncycastle.crypto.macs.ISO9797Alg3Mac; 040 import org.bouncycastle.crypto.macs.OldHMac; 041 import org.bouncycastle.crypto.paddings.ISO7816d4Padding; 042 import org.cumulus4j.crypto.AbstractMACCalculatorFactory; 043 import org.cumulus4j.crypto.MACCalculator; 044 045 /** 046 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 047 */ 048 public abstract class MACCalculatorFactoryImpl 049 extends AbstractMACCalculatorFactory 050 { 051 public static class DES 052 extends MACCalculatorFactoryImpl 053 { 054 @Override 055 public MACCalculator _createMACCalculator() { 056 BlockCipher cipher = new DESEngine(); 057 return new MACCalculatorImpl(new CBCBlockCipherMac(cipher), cipher.getBlockSize(), cipher.getBlockSize()); 058 } 059 } 060 061 public static class DES64 062 extends MACCalculatorFactoryImpl 063 { 064 @Override 065 public MACCalculator _createMACCalculator() { 066 BlockCipher cipher = new DESEngine(); 067 return new MACCalculatorImpl(new CBCBlockCipherMac(cipher, 64), cipher.getBlockSize(), cipher.getBlockSize()); 068 } 069 } 070 071 public static class RC2 072 extends MACCalculatorFactoryImpl 073 { 074 @Override 075 public MACCalculator _createMACCalculator() { 076 BlockCipher cipher = new RC2Engine(); 077 return new MACCalculatorImpl(new CBCBlockCipherMac(cipher), cipher.getBlockSize(), cipher.getBlockSize()); 078 } 079 } 080 081 public static class GOST28147 082 extends MACCalculatorFactoryImpl 083 { 084 @Override 085 public MACCalculator _createMACCalculator() { 086 return new MACCalculatorImpl(new GOST28147Mac(), 32, 0); // IV not supported - throws exception when passing ParameterWithIV 087 } 088 } 089 090 public static class DESCFB8 091 extends MACCalculatorFactoryImpl 092 { 093 @Override 094 public MACCalculator _createMACCalculator() { 095 BlockCipher cipher = new DESEngine(); 096 return new MACCalculatorImpl(new CFBBlockCipherMac(cipher), cipher.getBlockSize(), cipher.getBlockSize()); 097 } 098 } 099 100 public static class RC2CFB8 101 extends MACCalculatorFactoryImpl 102 { 103 @Override 104 public MACCalculator _createMACCalculator() { 105 BlockCipher cipher = new RC2Engine(); 106 return new MACCalculatorImpl(new CFBBlockCipherMac(cipher), cipher.getBlockSize(), cipher.getBlockSize()); 107 } 108 } 109 110 public static class DES9797Alg3with7816d4 111 extends MACCalculatorFactoryImpl 112 { 113 @Override 114 public MACCalculator _createMACCalculator() { 115 BlockCipher cipher = new DESEngine(); 116 return new MACCalculatorImpl(new ISO9797Alg3Mac(cipher, new ISO7816d4Padding()), 24, cipher.getBlockSize()); 117 } 118 } 119 120 public static class DES9797Alg3 121 extends MACCalculatorFactoryImpl 122 { 123 @Override 124 public MACCalculator _createMACCalculator() { 125 BlockCipher cipher = new DESEngine(); 126 return new MACCalculatorImpl(new ISO9797Alg3Mac(cipher), 24, cipher.getBlockSize()); 127 } 128 } 129 130 public static class MD2 131 extends MACCalculatorFactoryImpl 132 { 133 @Override 134 public MACCalculator _createMACCalculator() { 135 Digest digest = new MD2Digest(); 136 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 137 } 138 } 139 140 public static class MD4 141 extends MACCalculatorFactoryImpl 142 { 143 @Override 144 public MACCalculator _createMACCalculator() { 145 Digest digest = new MD4Digest(); 146 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 147 } 148 } 149 150 public static class MD5 151 extends MACCalculatorFactoryImpl 152 { 153 @Override 154 public MACCalculator _createMACCalculator() { 155 MD5Digest digest = new MD5Digest(); 156 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 157 } 158 } 159 160 public static class SHA1 161 extends MACCalculatorFactoryImpl 162 { 163 @Override 164 public MACCalculator _createMACCalculator() { 165 SHA1Digest digest = new SHA1Digest(); 166 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 167 } 168 } 169 170 public static class SHA224 171 extends MACCalculatorFactoryImpl 172 { 173 @Override 174 public MACCalculator _createMACCalculator() { 175 SHA224Digest digest = new SHA224Digest(); 176 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 177 } 178 } 179 180 public static class SHA256 181 extends MACCalculatorFactoryImpl 182 { 183 @Override 184 public MACCalculator _createMACCalculator() { 185 SHA256Digest digest = new SHA256Digest(); 186 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 187 } 188 } 189 190 public static class SHA384 191 extends MACCalculatorFactoryImpl 192 { 193 @Override 194 public MACCalculator _createMACCalculator() { 195 SHA384Digest digest = new SHA384Digest(); 196 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 197 } 198 } 199 200 /** 201 * @deprecated See {@link OldHMac}. 202 */ 203 @Deprecated 204 public static class OldSHA384 205 extends MACCalculatorFactoryImpl 206 { 207 @Override 208 public MACCalculator _createMACCalculator() { 209 SHA384Digest digest = new SHA384Digest(); 210 return new MACCalculatorImpl(new OldHMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 211 } 212 } 213 214 public static class SHA512 215 extends MACCalculatorFactoryImpl 216 { 217 @Override 218 public MACCalculator _createMACCalculator() { 219 SHA512Digest digest = new SHA512Digest(); 220 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 221 } 222 } 223 224 /** 225 * @deprecated See {@link OldHMac}. 226 */ 227 @Deprecated 228 public static class OldSHA512 229 extends MACCalculatorFactoryImpl 230 { 231 @Override 232 public MACCalculator _createMACCalculator() { 233 SHA512Digest digest = new SHA512Digest(); 234 return new MACCalculatorImpl(new OldHMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 235 } 236 } 237 238 public static class RIPEMD128 239 extends MACCalculatorFactoryImpl 240 { 241 @Override 242 public MACCalculator _createMACCalculator() { 243 RIPEMD128Digest digest = new RIPEMD128Digest(); 244 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 245 } 246 } 247 248 public static class RIPEMD160 249 extends MACCalculatorFactoryImpl 250 { 251 @Override 252 public MACCalculator _createMACCalculator() { 253 RIPEMD160Digest digest = new RIPEMD160Digest(); 254 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 255 } 256 } 257 258 public static class Tiger 259 extends MACCalculatorFactoryImpl 260 { 261 @Override 262 public MACCalculator _createMACCalculator() { 263 TigerDigest digest = new TigerDigest(); 264 return new MACCalculatorImpl(new HMac(digest), digest.getDigestSize(), 0); // IV not supported - throws exception when passing ParameterWithIV 265 } 266 } 267 268 // TODO implement the following 3 later. 269 // // 270 // // PKCS12 states that the same algorithm should be used 271 // // for the key generation as is used in the HMAC, so that 272 // // is what we do here. 273 // // 274 // 275 // public static class PBEWithRIPEMD160 276 // extends MACCalculatorFactoryImpl 277 // { 278 // public PBEWithRIPEMD160() 279 // { 280 // super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160); 281 // } 282 // } 283 // 284 // public static class PBEWithSHA 285 // extends MACCalculatorFactoryImpl 286 // { 287 // public PBEWithSHA() 288 // { 289 // super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160); 290 // } 291 // } 292 // 293 // public static class PBEWithTiger 294 // extends MACCalculatorFactoryImpl 295 // { 296 // public PBEWithTiger() 297 // { 298 // super(new HMac(new TigerDigest()), PKCS12, TIGER, 192); 299 // } 300 // } 301 }