BaseMac.java revision 5db505e1f6a68c8d5dfdb0fed0b8607dea7bed96
1package org.bouncycastle.jcajce.provider.symmetric.util; 2 3import java.security.InvalidAlgorithmParameterException; 4import java.security.InvalidKeyException; 5import java.security.Key; 6import java.security.spec.AlgorithmParameterSpec; 7import java.util.Hashtable; 8import java.util.Iterator; 9import java.util.Map; 10 11import javax.crypto.MacSpi; 12import javax.crypto.spec.IvParameterSpec; 13import javax.crypto.spec.PBEParameterSpec; 14 15import org.bouncycastle.crypto.CipherParameters; 16import org.bouncycastle.crypto.Mac; 17import org.bouncycastle.crypto.params.KeyParameter; 18import org.bouncycastle.crypto.params.ParametersWithIV; 19// BEGIN android-removed 20// import org.bouncycastle.crypto.params.SkeinParameters; 21// import org.bouncycastle.jcajce.spec.SkeinParameterSpec; 22// END android-removed 23 24public class BaseMac 25 extends MacSpi implements PBE 26{ 27 private Mac macEngine; 28 29 private int pbeType = PKCS12; 30 private int pbeHash = SHA1; 31 private int keySize = 160; 32 33 protected BaseMac( 34 Mac macEngine) 35 { 36 this.macEngine = macEngine; 37 } 38 39 protected BaseMac( 40 Mac macEngine, 41 int pbeType, 42 int pbeHash, 43 int keySize) 44 { 45 this.macEngine = macEngine; 46 this.pbeType = pbeType; 47 this.pbeHash = pbeHash; 48 this.keySize = keySize; 49 } 50 51 protected void engineInit( 52 Key key, 53 AlgorithmParameterSpec params) 54 throws InvalidKeyException, InvalidAlgorithmParameterException 55 { 56 CipherParameters param; 57 58 if (key == null) 59 { 60 throw new InvalidKeyException("key is null"); 61 } 62 63 if (key instanceof BCPBEKey) 64 { 65 BCPBEKey k = (BCPBEKey)key; 66 67 if (k.getParam() != null) 68 { 69 param = k.getParam(); 70 } 71 else if (params instanceof PBEParameterSpec) 72 { 73 param = PBE.Util.makePBEMacParameters(k, params); 74 } 75 else 76 { 77 throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set."); 78 } 79 } 80 else if (params instanceof IvParameterSpec) 81 { 82 param = new ParametersWithIV(new KeyParameter(key.getEncoded()), ((IvParameterSpec)params).getIV()); 83 } 84 // BEGIN android-removed 85 // else if (params instanceof SkeinParameterSpec) 86 // { 87 // param = new SkeinParameters.Builder(copyMap(((SkeinParameterSpec)params).getParameters())).setKey(key.getEncoded()).build(); 88 // } 89 // END android-removed 90 else if (params == null) 91 { 92 param = new KeyParameter(key.getEncoded()); 93 } 94 else 95 { 96 throw new InvalidAlgorithmParameterException("unknown parameter type."); 97 } 98 99 macEngine.init(param); 100 } 101 102 protected int engineGetMacLength() 103 { 104 return macEngine.getMacSize(); 105 } 106 107 protected void engineReset() 108 { 109 macEngine.reset(); 110 } 111 112 protected void engineUpdate( 113 byte input) 114 { 115 macEngine.update(input); 116 } 117 118 protected void engineUpdate( 119 byte[] input, 120 int offset, 121 int len) 122 { 123 macEngine.update(input, offset, len); 124 } 125 126 protected byte[] engineDoFinal() 127 { 128 byte[] out = new byte[engineGetMacLength()]; 129 130 macEngine.doFinal(out, 0); 131 132 return out; 133 } 134 135 private static Hashtable copyMap(Map paramsMap) 136 { 137 Hashtable newTable = new Hashtable(); 138 139 Iterator keys = paramsMap.keySet().iterator(); 140 while (keys.hasNext()) 141 { 142 Object key = keys.next(); 143 newTable.put(key, paramsMap.get(key)); 144 } 145 146 return newTable; 147 } 148} 149