// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.asn1.cmp;

import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.ASN1Util;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Object;

public class KemOtherInfo extends ASN1Object
{
    private static final PKIFreeText DEFAULT_staticString;
    private final PKIFreeText staticString;
    private final ASN1OctetString transactionID;
    private final ASN1OctetString senderNonce;
    private final ASN1OctetString recipNonce;
    private final ASN1Integer len;
    private final AlgorithmIdentifier mac;
    private final ASN1OctetString ct;
    
    public KemOtherInfo(final ASN1OctetString transactionID, final ASN1OctetString senderNonce, final ASN1OctetString recipNonce, final ASN1Integer len, final AlgorithmIdentifier mac, final ASN1OctetString ct) {
        this.staticString = KemOtherInfo.DEFAULT_staticString;
        this.transactionID = transactionID;
        this.senderNonce = senderNonce;
        this.recipNonce = recipNonce;
        this.len = len;
        this.mac = mac;
        this.ct = ct;
    }
    
    public KemOtherInfo(final ASN1OctetString asn1OctetString, final ASN1OctetString asn1OctetString2, final ASN1OctetString asn1OctetString3, final long n, final AlgorithmIdentifier algorithmIdentifier, final ASN1OctetString asn1OctetString4) {
        this(asn1OctetString, asn1OctetString2, asn1OctetString3, new ASN1Integer(n), algorithmIdentifier, asn1OctetString4);
    }
    
    private KemOtherInfo(final ASN1Sequence asn1Sequence) {
        if (asn1Sequence.size() < 4 || asn1Sequence.size() > 7) {
            throw new IllegalArgumentException("sequence size should be between 4 and 7 inclusive");
        }
        int n = 0;
        this.staticString = PKIFreeText.getInstance(asn1Sequence.getObjectAt(n));
        if (!KemOtherInfo.DEFAULT_staticString.equals(this.staticString)) {
            throw new IllegalArgumentException("staticString field should be " + KemOtherInfo.DEFAULT_staticString);
        }
        ASN1OctetString transactionID = null;
        ASN1OctetString senderNonce = null;
        ASN1OctetString recipNonce = null;
        ASN1TaggedObject asn1TaggedObject = tryGetTagged(asn1Sequence, ++n);
        if (asn1TaggedObject != null) {
            final ASN1Primitive tryGetContextBaseUniversal = ASN1Util.tryGetContextBaseUniversal(asn1TaggedObject, 0, true, 4);
            if (tryGetContextBaseUniversal != null) {
                transactionID = (ASN1OctetString)tryGetContextBaseUniversal;
                asn1TaggedObject = tryGetTagged(asn1Sequence, ++n);
            }
        }
        if (asn1TaggedObject != null) {
            final ASN1Primitive tryGetContextBaseUniversal2 = ASN1Util.tryGetContextBaseUniversal(asn1TaggedObject, 1, true, 4);
            if (tryGetContextBaseUniversal2 != null) {
                senderNonce = (ASN1OctetString)tryGetContextBaseUniversal2;
                asn1TaggedObject = tryGetTagged(asn1Sequence, ++n);
            }
        }
        if (asn1TaggedObject != null) {
            final ASN1Primitive tryGetContextBaseUniversal3 = ASN1Util.tryGetContextBaseUniversal(asn1TaggedObject, 2, true, 4);
            if (tryGetContextBaseUniversal3 != null) {
                recipNonce = (ASN1OctetString)tryGetContextBaseUniversal3;
                asn1TaggedObject = tryGetTagged(asn1Sequence, ++n);
            }
        }
        if (asn1TaggedObject != null) {
            throw new IllegalArgumentException("unknown tag: " + ASN1Util.getTagText(asn1TaggedObject));
        }
        this.transactionID = transactionID;
        this.senderNonce = senderNonce;
        this.recipNonce = recipNonce;
        this.len = ASN1Integer.getInstance(asn1Sequence.getObjectAt(n));
        this.mac = AlgorithmIdentifier.getInstance(asn1Sequence.getObjectAt(++n));
        this.ct = ASN1OctetString.getInstance(asn1Sequence.getObjectAt(++n));
        if (++n != asn1Sequence.size()) {
            throw new IllegalArgumentException("unexpected data at end of sequence");
        }
    }
    
    public static KemOtherInfo getInstance(final Object o) {
        if (o instanceof KemOtherInfo) {
            return (KemOtherInfo)o;
        }
        if (o != null) {
            return new KemOtherInfo(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    public ASN1OctetString getTransactionID() {
        return this.transactionID;
    }
    
    public ASN1OctetString getSenderNonce() {
        return this.senderNonce;
    }
    
    public ASN1OctetString getRecipNonce() {
        return this.recipNonce;
    }
    
    public ASN1Integer getLen() {
        return this.len;
    }
    
    public AlgorithmIdentifier getMac() {
        return this.mac;
    }
    
    public ASN1OctetString getCt() {
        return this.ct;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector(7);
        asn1EncodableVector.add(this.staticString);
        addOptional(asn1EncodableVector, 0, this.transactionID);
        addOptional(asn1EncodableVector, 1, this.senderNonce);
        addOptional(asn1EncodableVector, 2, this.recipNonce);
        asn1EncodableVector.add(this.len);
        asn1EncodableVector.add(this.mac);
        asn1EncodableVector.add(this.ct);
        return new DERSequence(asn1EncodableVector);
    }
    
    private static void addOptional(final ASN1EncodableVector asn1EncodableVector, final int n, final ASN1Encodable asn1Encodable) {
        if (asn1Encodable != null) {
            asn1EncodableVector.add(new DERTaggedObject(true, n, asn1Encodable));
        }
    }
    
    private static ASN1TaggedObject tryGetTagged(final ASN1Sequence asn1Sequence, final int n) {
        final ASN1Encodable object = asn1Sequence.getObjectAt(n);
        return (object instanceof ASN1TaggedObject) ? ((ASN1TaggedObject)object) : null;
    }
    
    static {
        DEFAULT_staticString = new PKIFreeText("CMP-KEM");
    }
}
