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