001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs;
002
003import java.math.BigInteger;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.DigestInfo;
014
015public class MacData
016    extends ASN1Object
017{
018    private static final BigInteger ONE = BigInteger.valueOf(1);
019
020    DigestInfo                  digInfo;
021    byte[]                      salt;
022    BigInteger                  iterationCount;
023
024    public static MacData getInstance(
025        Object  obj)
026    {
027        if (obj instanceof MacData)
028        {
029            return (MacData)obj;
030        }
031        else if (obj != null)
032        {
033            return new MacData(ASN1Sequence.getInstance(obj));
034        }
035
036        return null;
037    }
038
039    private MacData(
040        ASN1Sequence seq)
041    {
042        this.digInfo = DigestInfo.getInstance(seq.getObjectAt(0));
043
044        this.salt = ((ASN1OctetString)seq.getObjectAt(1)).getOctets();
045
046        if (seq.size() == 3)
047        {
048            this.iterationCount = ((ASN1Integer)seq.getObjectAt(2)).getValue();
049        }
050        else
051        {
052            this.iterationCount = ONE;
053        }
054    }
055
056    public MacData(
057        DigestInfo  digInfo,
058        byte[]      salt,
059        int         iterationCount)
060    {
061        this.digInfo = digInfo;
062        this.salt = salt;
063        this.iterationCount = BigInteger.valueOf(iterationCount);
064    }
065
066    public DigestInfo getMac()
067    {
068        return digInfo;
069    }
070
071    public byte[] getSalt()
072    {
073        return salt;
074    }
075
076    public BigInteger getIterationCount()
077    {
078        return iterationCount;
079    }
080
081    /**
082     * <pre>
083     * MacData ::= SEQUENCE {
084     *     mac      DigestInfo,
085     *     macSalt  OCTET STRING,
086     *     iterations INTEGER DEFAULT 1
087     *     -- Note: The default is for historic reasons and its use is deprecated. A
088     *     -- higher value, like 1024 is recommended.
089     * </pre>
090     * @return the basic ASN1Primitive construction.
091     */
092    public ASN1Primitive toASN1Primitive()
093    {
094        ASN1EncodableVector  v = new ASN1EncodableVector();
095
096        v.add(digInfo);
097        v.add(new DEROctetString(salt));
098        
099        if (!iterationCount.equals(ONE))
100        {
101            v.add(new ASN1Integer(iterationCount));
102        }
103
104        return new DERSequence(v);
105    }
106}