package org.bouncycastle.asn1.cmc;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.util.Arrays;

/**
 * <pre>
 *      id-cmc-identityProofV2 OBJECT IDENTIFIER ::= { id-cmc 34 }
 *      identityProofV2 ::= SEQUENCE {
 *          proofAlgID       AlgorithmIdentifier,
 *          macAlgId         AlgorithmIdentifier,
 *          witness          OCTET STRING
 *      }
 * </pre>
 */
public class IdentityProofV2
    extends ASN1Object
{
    private final AlgorithmIdentifier proofAlgID;
    private final AlgorithmIdentifier macAlgId;
    private final byte[] witness;
    
    public IdentityProofV2(AlgorithmIdentifier proofAlgID, AlgorithmIdentifier macAlgId, byte[] witness)
    {
        this.proofAlgID = proofAlgID;
        this.macAlgId = macAlgId;
        this.witness = Arrays.clone(witness);
    }
        
    private IdentityProofV2(ASN1Sequence seq)
    {
        if (seq.size() != 3)
        {
            throw new IllegalArgumentException("incorrect sequence size");
        }
        this.proofAlgID = AlgorithmIdentifier.getInstance(seq.getObjectAt(0));
        this.macAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
        this.witness = Arrays.clone(ASN1OctetString.getInstance(seq.getObjectAt(2)).getOctets());
    }

    public static IdentityProofV2 getInstance(Object o)
    {
        if (o instanceof IdentityProofV2)
        {
            return (IdentityProofV2)o;
        }

        if (o != null)
        {
            return new IdentityProofV2(ASN1Sequence.getInstance(o));
        }

        return null;
    }
    
    public AlgorithmIdentifier getProofAlgID()
    {
        return proofAlgID;
    }

    public AlgorithmIdentifier getMacAlgId()
    {
        return macAlgId;
    }

    public byte[] getWitness()
    {
        return Arrays.clone(witness);
    }
    
    public ASN1Primitive toASN1Primitive()
    {
        ASN1EncodableVector v = new ASN1EncodableVector();
        
        v.add(proofAlgID);
        v.add(macAlgId);
        v.add(new DEROctetString(getWitness()));
        
        return new DERSequence(v);
    }
}
