14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.symmetric.util;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidAlgorithmParameterException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidKeyException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.Key;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
75db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport java.util.Hashtable;
85db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport java.util.Iterator;
95db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport java.util.Map;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.MacSpi;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.IvParameterSpec;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.PBEParameterSpec;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.CipherParameters;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.Mac;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.KeyParameter;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.ParametersWithIV;
195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root// BEGIN android-removed
205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root// import org.bouncycastle.crypto.params.SkeinParameters;
215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root// import org.bouncycastle.jcajce.spec.SkeinParameterSpec;
225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root// END android-removed
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class BaseMac
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends MacSpi implements PBE
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private Mac macEngine;
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int                     pbeType = PKCS12;
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int                     pbeHash = SHA1;
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int                     keySize = 160;
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BaseMac(
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Mac macEngine)
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.macEngine = macEngine;
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected BaseMac(
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Mac macEngine,
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int pbeType,
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int pbeHash,
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int keySize)
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.macEngine = macEngine;
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.pbeType = pbeType;
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.pbeHash = pbeHash;
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.keySize = keySize;
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Key                     key,
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameterSpec  params)
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeyException, InvalidAlgorithmParameterException
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        CipherParameters        param;
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (key == null)
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidKeyException("key is null");
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (key instanceof BCPBEKey)
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            BCPBEKey k = (BCPBEKey)key;
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (k.getParam() != null)
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                param = k.getParam();
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else if (params instanceof PBEParameterSpec)
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                param = PBE.Util.makePBEMacParameters(k, params);
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (params instanceof IvParameterSpec)
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV());
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
845db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        // BEGIN android-removed
855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        // else if (params instanceof SkeinParameterSpec)
865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        // {
875db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        //     param = new SkeinParameters.Builder(copyMap(((SkeinParameterSpec)params).getParameters())).setKey(key.getEncoded()).build();
885db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        // }
895db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        // END android-removed
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (params == null)
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            param = new KeyParameter(key.getEncoded());
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidAlgorithmParameterException("unknown parameter type.");
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        macEngine.init(param);
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected int engineGetMacLength()
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return macEngine.getMacSize();
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineReset()
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        macEngine.reset();
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineUpdate(
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte    input)
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        macEngine.update(input);
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineUpdate(
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[]  input,
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int     offset,
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int     len)
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        macEngine.update(input, offset, len);
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected byte[] engineDoFinal()
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[]  out = new byte[engineGetMacLength()];
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        macEngine.doFinal(out, 0);
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return out;
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1345db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1355db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static Hashtable copyMap(Map paramsMap)
1365db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
1375db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Hashtable newTable = new Hashtable();
1385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Iterator keys = paramsMap.keySet().iterator();
1405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (keys.hasNext())
1415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
1425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            Object key = keys.next();
1435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            newTable.put(key, paramsMap.get(key));
1445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
1455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
1465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return newTable;
1475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
149