1 package org.bouncycastle.pkcs.jcajce; 2 3 import java.io.OutputStream; 4 import java.security.Provider; 5 6 import javax.crypto.Mac; 7 import javax.crypto.SecretKey; 8 import javax.crypto.spec.PBEParameterSpec; 9 10 import org.bouncycastle.asn1.ASN1ObjectIdentifier; 11 import org.bouncycastle.asn1.DERNull; 12 import org.bouncycastle.asn1.pkcs.PKCS12PBEParams; 13 import org.bouncycastle.asn1.x509.AlgorithmIdentifier; 14 import org.bouncycastle.jcajce.PKCS12Key; 15 import org.bouncycastle.jcajce.io.MacOutputStream; 16 import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; 17 import org.bouncycastle.jcajce.util.JcaJceHelper; 18 import org.bouncycastle.jcajce.util.NamedJcaJceHelper; 19 import org.bouncycastle.jcajce.util.ProviderJcaJceHelper; 20 import org.bouncycastle.operator.GenericKey; 21 import org.bouncycastle.operator.MacCalculator; 22 import org.bouncycastle.operator.OperatorCreationException; 23 import org.bouncycastle.pkcs.PKCS12MacCalculatorBuilder; 24 import org.bouncycastle.pkcs.PKCS12MacCalculatorBuilderProvider; 25 26 public class JcePKCS12MacCalculatorBuilderProvider 27 implements PKCS12MacCalculatorBuilderProvider 28 { 29 private JcaJceHelper helper = new DefaultJcaJceHelper(); 30 JcePKCS12MacCalculatorBuilderProvider()31 public JcePKCS12MacCalculatorBuilderProvider() 32 { 33 } 34 setProvider(Provider provider)35 public JcePKCS12MacCalculatorBuilderProvider setProvider(Provider provider) 36 { 37 this.helper = new ProviderJcaJceHelper(provider); 38 39 return this; 40 } 41 setProvider(String providerName)42 public JcePKCS12MacCalculatorBuilderProvider setProvider(String providerName) 43 { 44 this.helper = new NamedJcaJceHelper(providerName); 45 46 return this; 47 } 48 get(final AlgorithmIdentifier algorithmIdentifier)49 public PKCS12MacCalculatorBuilder get(final AlgorithmIdentifier algorithmIdentifier) 50 { 51 return new PKCS12MacCalculatorBuilder() 52 { 53 public MacCalculator build(final char[] password) 54 throws OperatorCreationException 55 { 56 final PKCS12PBEParams pbeParams = PKCS12PBEParams.getInstance(algorithmIdentifier.getParameters()); 57 58 try 59 { 60 final ASN1ObjectIdentifier algorithm = algorithmIdentifier.getAlgorithm(); 61 62 final Mac mac = helper.createMac(algorithm.getId()); 63 64 PBEParameterSpec defParams = new PBEParameterSpec(pbeParams.getIV(), pbeParams.getIterations().intValue()); 65 66 final SecretKey key = new PKCS12Key(password); 67 68 mac.init(key, defParams); 69 70 return new MacCalculator() 71 { 72 public AlgorithmIdentifier getAlgorithmIdentifier() 73 { 74 return new AlgorithmIdentifier(algorithm, pbeParams); 75 } 76 77 public OutputStream getOutputStream() 78 { 79 return new MacOutputStream(mac); 80 } 81 82 public byte[] getMac() 83 { 84 return mac.doFinal(); 85 } 86 87 public GenericKey getKey() 88 { 89 return new GenericKey(getAlgorithmIdentifier(), key.getEncoded()); 90 } 91 }; 92 } 93 catch (Exception e) 94 { 95 throw new OperatorCreationException("unable to create MAC calculator: " + e.getMessage(), e); 96 } 97 } 98 99 public AlgorithmIdentifier getDigestAlgorithmIdentifier() 100 { 101 return new AlgorithmIdentifier(algorithmIdentifier.getAlgorithm(), DERNull.INSTANCE); 102 } 103 }; 104 } 105 } 106