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

package org.bouncycastle.asn1.cms;

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

public class KEMRecipientInfo extends ASN1Object
{
    private final ASN1Integer cmsVersion;
    private final RecipientIdentifier rid;
    private final AlgorithmIdentifier kem;
    private final ASN1OctetString kemct;
    private final AlgorithmIdentifier kdf;
    private final ASN1Integer kekLength;
    private final ASN1OctetString ukm;
    private final AlgorithmIdentifier wrap;
    private final ASN1OctetString encryptedKey;
    
    public KEMRecipientInfo(final RecipientIdentifier rid, final AlgorithmIdentifier kem, final ASN1OctetString kemct, final AlgorithmIdentifier kdf, final ASN1Integer kekLength, final ASN1OctetString ukm, final AlgorithmIdentifier wrap, final ASN1OctetString encryptedKey) {
        if (kem == null) {
            throw new NullPointerException("kem cannot be null");
        }
        if (wrap == null) {
            throw new NullPointerException("wrap cannot be null");
        }
        if (kekLength.intValueExact() > 65535) {
            throw new IllegalArgumentException("kekLength must be <= 65535");
        }
        this.cmsVersion = new ASN1Integer(0L);
        this.rid = rid;
        this.kem = kem;
        this.kemct = kemct;
        this.kdf = kdf;
        this.kekLength = kekLength;
        this.ukm = ukm;
        this.wrap = wrap;
        this.encryptedKey = encryptedKey;
    }
    
    public static KEMRecipientInfo getInstance(final Object o) {
        if (o instanceof KEMRecipientInfo) {
            return (KEMRecipientInfo)o;
        }
        if (o != null) {
            return new KEMRecipientInfo(ASN1Sequence.getInstance(o));
        }
        return null;
    }
    
    private KEMRecipientInfo(final ASN1Sequence asn1Sequence) {
        if (asn1Sequence.size() < 8 || asn1Sequence.size() > 9) {
            throw new IllegalArgumentException("bad sequence size: " + asn1Sequence.size());
        }
        this.cmsVersion = ASN1Integer.getInstance(asn1Sequence.getObjectAt(0));
        this.rid = RecipientIdentifier.getInstance(asn1Sequence.getObjectAt(1));
        this.kem = AlgorithmIdentifier.getInstance(asn1Sequence.getObjectAt(2));
        this.kemct = ASN1OctetString.getInstance(asn1Sequence.getObjectAt(3));
        this.kdf = AlgorithmIdentifier.getInstance(asn1Sequence.getObjectAt(4));
        this.kekLength = ASN1Integer.getInstance(asn1Sequence.getObjectAt(5));
        if (this.kekLength.intValueExact() > 65535) {
            throw new IllegalArgumentException("kekLength must be <= 65535");
        }
        int n = 6;
        if (asn1Sequence.getObjectAt(6) instanceof ASN1TaggedObject) {
            this.ukm = ASN1OctetString.getInstance(ASN1TaggedObject.getInstance(asn1Sequence.getObjectAt(n++)), true);
        }
        else {
            this.ukm = null;
        }
        this.wrap = AlgorithmIdentifier.getInstance(asn1Sequence.getObjectAt(n++));
        this.encryptedKey = ASN1OctetString.getInstance(asn1Sequence.getObjectAt(n++));
    }
    
    public RecipientIdentifier getRecipientIdentifier() {
        return this.rid;
    }
    
    public AlgorithmIdentifier getKem() {
        return this.kem;
    }
    
    public ASN1OctetString getKemct() {
        return this.kemct;
    }
    
    public AlgorithmIdentifier getKdf() {
        return this.kdf;
    }
    
    public AlgorithmIdentifier getWrap() {
        return this.wrap;
    }
    
    public byte[] getUkm() {
        if (this.ukm == null) {
            return null;
        }
        return this.ukm.getOctets();
    }
    
    public ASN1OctetString getEncryptedKey() {
        return this.encryptedKey;
    }
    
    @Override
    public ASN1Primitive toASN1Primitive() {
        final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector();
        asn1EncodableVector.add(this.cmsVersion);
        asn1EncodableVector.add(this.rid);
        asn1EncodableVector.add(this.kem);
        asn1EncodableVector.add(this.kemct);
        asn1EncodableVector.add(this.kdf);
        asn1EncodableVector.add(this.kekLength);
        if (this.ukm != null) {
            asn1EncodableVector.add(new DERTaggedObject(true, 0, this.ukm));
        }
        asn1EncodableVector.add(this.wrap);
        asn1EncodableVector.add(this.encryptedKey);
        return new DERSequence(asn1EncodableVector);
    }
}
