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