Home | History | Annotate | Download | only in provider
      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