001package org.apache.commons.ssl.org.bouncycastle.asn1.crmf;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.cmp.CMPObjectIdentifiers;
011import org.apache.commons.ssl.org.bouncycastle.asn1.cmp.PBMParameter;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier;
013
014/**
015 * Password-based MAC value for use with POPOSigningKeyInput.
016 */
017public class PKMACValue
018    extends ASN1Object
019{
020    private AlgorithmIdentifier  algId;
021    private DERBitString        value;
022
023    private PKMACValue(ASN1Sequence seq)
024    {
025        algId = AlgorithmIdentifier.getInstance(seq.getObjectAt(0));
026        value = DERBitString.getInstance(seq.getObjectAt(1));
027    }
028
029    public static PKMACValue getInstance(Object o)
030    {
031        if (o instanceof PKMACValue)
032        {
033            return (PKMACValue)o;
034        }
035
036        if (o != null)
037        {
038            return new PKMACValue(ASN1Sequence.getInstance(o));
039        }
040
041        return null;
042    }
043
044    public static PKMACValue getInstance(ASN1TaggedObject obj, boolean isExplicit)
045    {
046        return getInstance(ASN1Sequence.getInstance(obj, isExplicit));
047    }
048
049    /**
050     * Creates a new PKMACValue.
051     * @param params parameters for password-based MAC
052     * @param value MAC of the DER-encoded SubjectPublicKeyInfo
053     */
054    public PKMACValue(
055        PBMParameter params,
056        DERBitString value)
057    {
058        this(new AlgorithmIdentifier(
059                    CMPObjectIdentifiers.passwordBasedMac, params), value);
060    }
061
062    /**
063     * Creates a new PKMACValue.
064     * @param aid CMPObjectIdentifiers.passwordBasedMAC, with PBMParameter
065     * @param value MAC of the DER-encoded SubjectPublicKeyInfo
066     */
067    public PKMACValue(
068        AlgorithmIdentifier aid,
069        DERBitString value)
070    {
071        this.algId = aid;
072        this.value = value;
073    }
074
075    public AlgorithmIdentifier getAlgId()
076    {
077        return algId;
078    }
079
080    public DERBitString getValue()
081    {
082        return value;
083    }
084
085    /**
086     * <pre>
087     * PKMACValue ::= SEQUENCE {
088     *      algId  AlgorithmIdentifier,
089     *      -- algorithm value shall be PasswordBasedMac 1.2.840.113533.7.66.13
090     *      -- parameter value is PBMParameter
091     *      value  BIT STRING }
092     * </pre>
093     * @return a basic ASN.1 object representation.
094     */
095    public ASN1Primitive toASN1Primitive()
096    {
097        ASN1EncodableVector v = new ASN1EncodableVector();
098
099        v.add(algId);
100        v.add(value);
101
102        return new DERSequence(v);
103    }
104}