1package org.bouncycastle.jce.provider; 2 3import java.security.InvalidAlgorithmParameterException; 4import java.security.InvalidKeyException; 5import java.security.Key; 6import java.security.spec.AlgorithmParameterSpec; 7 8import javax.crypto.MacSpi; 9import javax.crypto.spec.IvParameterSpec; 10import javax.crypto.spec.PBEParameterSpec; 11 12import org.bouncycastle.crypto.CipherParameters; 13import org.bouncycastle.crypto.Mac; 14import org.bouncycastle.crypto.digests.*; 15import org.bouncycastle.crypto.engines.DESEngine; 16import org.bouncycastle.crypto.engines.DESedeEngine; 17// BEGIN android-removed 18// import org.bouncycastle.crypto.engines.IDEAEngine; 19// import org.bouncycastle.crypto.engines.RC2Engine; 20// import org.bouncycastle.crypto.engines.RC532Engine; 21// import org.bouncycastle.crypto.engines.SkipjackEngine; 22// END android-removed 23import org.bouncycastle.crypto.macs.CBCBlockCipherMac; 24import org.bouncycastle.crypto.macs.CFBBlockCipherMac; 25// BEGIN android-removed 26// import org.bouncycastle.crypto.macs.GOST28147Mac; 27// END android-removed 28import org.bouncycastle.crypto.macs.HMac; 29import org.bouncycastle.crypto.macs.ISO9797Alg3Mac; 30import org.bouncycastle.crypto.macs.OldHMac; 31import org.bouncycastle.crypto.params.KeyParameter; 32import org.bouncycastle.crypto.params.ParametersWithIV; 33 34public class JCEMac 35 extends MacSpi implements PBE 36{ 37 private Mac macEngine; 38 39 private int pbeType = PKCS12; 40 private int pbeHash = SHA1; 41 private int keySize = 160; 42 43 protected JCEMac( 44 Mac macEngine) 45 { 46 this.macEngine = macEngine; 47 } 48 49 protected JCEMac( 50 Mac macEngine, 51 int pbeType, 52 int pbeHash, 53 int keySize) 54 { 55 this.macEngine = macEngine; 56 this.pbeType = pbeType; 57 this.pbeHash = pbeHash; 58 this.keySize = keySize; 59 } 60 61 protected void engineInit( 62 Key key, 63 AlgorithmParameterSpec params) 64 throws InvalidKeyException, InvalidAlgorithmParameterException 65 { 66 CipherParameters param; 67 68 if (key == null) 69 { 70 throw new InvalidKeyException("key is null"); 71 } 72 73 if (key instanceof JCEPBEKey) 74 { 75 JCEPBEKey k = (JCEPBEKey)key; 76 77 if (k.getParam() != null) 78 { 79 param = k.getParam(); 80 } 81 else if (params instanceof PBEParameterSpec) 82 { 83 param = PBE.Util.makePBEMacParameters(k, params); 84 } 85 else 86 { 87 throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set."); 88 } 89 } 90 else if (params instanceof IvParameterSpec) 91 { 92 param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV()); 93 } 94 else if (params == null) 95 { 96 param = new KeyParameter(key.getEncoded()); 97 } 98 else 99 { 100 throw new InvalidAlgorithmParameterException("unknown parameter type."); 101 } 102 103 macEngine.init(param); 104 } 105 106 protected int engineGetMacLength() 107 { 108 return macEngine.getMacSize(); 109 } 110 111 protected void engineReset() 112 { 113 macEngine.reset(); 114 } 115 116 protected void engineUpdate( 117 byte input) 118 { 119 macEngine.update(input); 120 } 121 122 protected void engineUpdate( 123 byte[] input, 124 int offset, 125 int len) 126 { 127 macEngine.update(input, offset, len); 128 } 129 130 protected byte[] engineDoFinal() 131 { 132 byte[] out = new byte[engineGetMacLength()]; 133 134 macEngine.doFinal(out, 0); 135 136 return out; 137 } 138 139 /** 140 * the classes that extend directly off us. 141 */ 142 143 /** 144 * DES 145 */ 146 public static class DES 147 extends JCEMac 148 { 149 public DES() 150 { 151 super(new CBCBlockCipherMac(new DESEngine())); 152 } 153 } 154 155 /** 156 * DESede 157 */ 158 public static class DESede 159 extends JCEMac 160 { 161 public DESede() 162 { 163 super(new CBCBlockCipherMac(new DESedeEngine())); 164 } 165 } 166 167 /** 168 * SKIPJACK 169 */ 170 // BEGIN android-removed 171 // public static class Skipjack 172 // extends JCEMac 173 // { 174 // public Skipjack() 175 // { 176 // super(new CBCBlockCipherMac(new SkipjackEngine())); 177 // } 178 // } 179 // END android-removed 180 181 /** 182 * IDEA 183 */ 184 // BEGIN android-removed 185 // public static class IDEA 186 // extends JCEMac 187 // { 188 // public IDEA() 189 // { 190 // super(new CBCBlockCipherMac(new IDEAEngine())); 191 // } 192 // } 193 // END android-removed 194 195 /** 196 * RC2 197 */ 198 // BEGIN android-removed 199 // public static class RC2 200 // extends JCEMac 201 // { 202 // public RC2() 203 // { 204 // super(new CBCBlockCipherMac(new RC2Engine())); 205 // } 206 // } 207 // END android-removed 208 209 /** 210 * RC5 211 */ 212 // BEGIN android-removed 213 // public static class RC5 214 // extends JCEMac 215 // { 216 // public RC5() 217 // { 218 // super(new CBCBlockCipherMac(new RC532Engine())); 219 // } 220 // } 221 // END android-removed 222 223 /** 224 * GOST28147 225 */ 226 // BEGIN android-removed 227 // public static class GOST28147 228 // extends JCEMac 229 // { 230 // public GOST28147() 231 // { 232 // super(new GOST28147Mac()); 233 // } 234 // } 235 // END android-removed 236 237 /** 238 * DES 239 */ 240 public static class DESCFB8 241 extends JCEMac 242 { 243 public DESCFB8() 244 { 245 super(new CFBBlockCipherMac(new DESEngine())); 246 } 247 } 248 249 /** 250 * DESede 251 */ 252 public static class DESedeCFB8 253 extends JCEMac 254 { 255 public DESedeCFB8() 256 { 257 super(new CFBBlockCipherMac(new DESedeEngine())); 258 } 259 } 260 261 /** 262 * SKIPJACK 263 */ 264 // BEGIN android-removed 265 // public static class SkipjackCFB8 266 // extends JCEMac 267 // { 268 // public SkipjackCFB8() 269 // { 270 // super(new CFBBlockCipherMac(new SkipjackEngine())); 271 // } 272 // } 273 // END android-removed 274 275 /** 276 * IDEACFB8 277 */ 278 // BEGIN android-removed 279 // public static class IDEACFB8 280 // extends JCEMac 281 // { 282 // public IDEACFB8() 283 // { 284 // super(new CFBBlockCipherMac(new IDEAEngine())); 285 // } 286 // } 287 // END android-removed 288 289 /** 290 * RC2CFB8 291 */ 292 // BEGIN android-removed 293 // public static class RC2CFB8 294 // extends JCEMac 295 // { 296 // public RC2CFB8() 297 // { 298 // super(new CFBBlockCipherMac(new RC2Engine())); 299 // } 300 // } 301 // END android-removed 302 303 /** 304 * RC5CFB8 305 */ 306 // BEGIN android-removed 307 // public static class RC5CFB8 308 // extends JCEMac 309 // { 310 // public RC5CFB8() 311 // { 312 // super(new CFBBlockCipherMac(new RC532Engine())); 313 // } 314 // } 315 // END android-removed 316 317 318 /** 319 * DESede64 320 */ 321 public static class DESede64 322 extends JCEMac 323 { 324 public DESede64() 325 { 326 super(new CBCBlockCipherMac(new DESedeEngine(), 64)); 327 } 328 } 329 330 /** 331 * DES9797Alg3 332 */ 333 public static class DES9797Alg3 334 extends JCEMac 335 { 336 public DES9797Alg3() 337 { 338 super(new ISO9797Alg3Mac(new DESEngine())); 339 } 340 } 341 342 /** 343 * MD2 HMac 344 */ 345 // BEGIN android-removed 346 // public static class MD2 347 // extends JCEMac 348 // { 349 // public MD2() 350 // { 351 // super(new HMac(new MD2Digest())); 352 // } 353 // } 354 // END android-removed 355 356 /** 357 * MD4 HMac 358 */ 359 // BEGIN android-removed 360 // public static class MD4 361 // extends JCEMac 362 // { 363 // public MD4() 364 // { 365 // super(new HMac(new MD4Digest())); 366 // } 367 // } 368 // END android-removed 369 370 /** 371 * MD5 HMac 372 */ 373 public static class MD5 374 extends JCEMac 375 { 376 public MD5() 377 { 378 super(new HMac(new MD5Digest())); 379 } 380 } 381 382 /** 383 * SHA1 HMac 384 */ 385 public static class SHA1 386 extends JCEMac 387 { 388 public SHA1() 389 { 390 super(new HMac(new SHA1Digest())); 391 } 392 } 393 394 /** 395 * SHA-224 HMac 396 */ 397 public static class SHA224 398 extends JCEMac 399 { 400 public SHA224() 401 { 402 super(new HMac(new SHA224Digest())); 403 } 404 } 405 406 /** 407 * SHA-256 HMac 408 */ 409 public static class SHA256 410 extends JCEMac 411 { 412 public SHA256() 413 { 414 super(new HMac(new SHA256Digest())); 415 } 416 } 417 418 /** 419 * SHA-384 HMac 420 */ 421 public static class SHA384 422 extends JCEMac 423 { 424 public SHA384() 425 { 426 super(new HMac(new SHA384Digest())); 427 } 428 } 429 430 public static class OldSHA384 431 extends JCEMac 432 { 433 public OldSHA384() 434 { 435 super(new OldHMac(new SHA384Digest())); 436 } 437 } 438 439 /** 440 * SHA-512 HMac 441 */ 442 public static class SHA512 443 extends JCEMac 444 { 445 public SHA512() 446 { 447 super(new HMac(new SHA512Digest())); 448 } 449 } 450 451 /** 452 * SHA-512 HMac 453 */ 454 public static class OldSHA512 455 extends JCEMac 456 { 457 public OldSHA512() 458 { 459 super(new OldHMac(new SHA512Digest())); 460 } 461 } 462 463// BEGIN android-removed 464// /** 465// * RIPEMD128 HMac 466// */ 467// public static class RIPEMD128 468// extends JCEMac 469// { 470// public RIPEMD128() 471// { 472// super(new HMac(new RIPEMD128Digest())); 473// } 474// } 475// 476// /** 477// * RIPEMD160 HMac 478// */ 479// public static class RIPEMD160 480// extends JCEMac 481// { 482// public RIPEMD160() 483// { 484// super(new HMac(new RIPEMD160Digest())); 485// } 486// } 487// 488// /** 489// * Tiger HMac 490// */ 491// public static class Tiger 492// extends JCEMac 493// { 494// public Tiger() 495// { 496// super(new HMac(new TigerDigest())); 497// } 498// } 499// 500// // 501// // PKCS12 states that the same algorithm should be used 502// // for the key generation as is used in the HMAC, so that 503// // is what we do here. 504// // 505// 506// /** 507// * PBEWithHmacRIPEMD160 508// */ 509// public static class PBEWithRIPEMD160 510// extends JCEMac 511// { 512// public PBEWithRIPEMD160() 513// { 514// super(new HMac(new RIPEMD160Digest()), PKCS12, RIPEMD160, 160); 515// } 516// } 517// END android-removed 518 519 /** 520 * PBEWithHmacSHA 521 */ 522 public static class PBEWithSHA 523 extends JCEMac 524 { 525 public PBEWithSHA() 526 { 527 super(new HMac(new SHA1Digest()), PKCS12, SHA1, 160); 528 } 529 } 530 531 /** 532 * PBEWithHmacTiger 533 */ 534// BEGIN android-removed 535// public static class PBEWithTiger 536// extends JCEMac 537// { 538// public PBEWithTiger() 539// { 540// super(new HMac(new TigerDigest()), PKCS12, TIGER, 192); 541// } 542// } 543// END android-removed 544} 545