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

package org.bouncycastle.its.jcajce;

import org.bouncycastle.jcajce.util.NamedJcaJceHelper;
import org.bouncycastle.jcajce.util.ProviderJcaJceHelper;
import java.security.Provider;
import org.bouncycastle.jcajce.util.DefaultJcaJceHelper;
import javax.crypto.Cipher;
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.sec.SECObjectIdentifiers;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EccP256CurvePoint;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.EciesP256EncryptedKey;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import javax.crypto.spec.SecretKeySpec;
import java.security.spec.AlgorithmParameterSpec;
import java.security.Key;
import org.bouncycastle.jcajce.spec.IESKEMParameterSpec;
import org.bouncycastle.oer.its.ieee1609dot2.EncryptedDataEncryptionKey;
import org.bouncycastle.jcajce.util.JcaJceHelper;
import java.security.interfaces.ECPublicKey;
import org.bouncycastle.its.ETSIKeyWrapper;

public class JceETSIKeyWrapper implements ETSIKeyWrapper
{
    private final ECPublicKey recipientKey;
    private final byte[] recipientHash;
    private final JcaJceHelper helper;
    
    private JceETSIKeyWrapper(final ECPublicKey recipientKey, final byte[] recipientHash, final JcaJceHelper helper) {
        this.recipientKey = recipientKey;
        this.recipientHash = recipientHash;
        this.helper = helper;
    }
    
    @Override
    public EncryptedDataEncryptionKey wrap(final byte[] key) {
        try {
            final Cipher cipher = this.helper.createCipher("ETSIKEMwithSHA256");
            cipher.init(3, this.recipientKey, new IESKEMParameterSpec(this.recipientHash, true));
            final byte[] wrap = cipher.wrap(new SecretKeySpec(key, "AES"));
            final int n = (this.recipientKey.getParams().getCurve().getField().getFieldSize() + 7) / 8;
            int n2;
            if (wrap[0] == 4) {
                n2 = 2 * n + 1;
            }
            else {
                n2 = n + 1;
            }
            final ASN1ObjectIdentifier instance = ASN1ObjectIdentifier.getInstance(SubjectPublicKeyInfo.getInstance(this.recipientKey.getEncoded()).getAlgorithm().getParameters());
            final EciesP256EncryptedKey eciesP256EncryptedKey = EciesP256EncryptedKey.builder().setV(EccP256CurvePoint.createEncodedPoint(Arrays.copyOfRange(wrap, 0, n2))).setC(Arrays.copyOfRange(wrap, n2, n2 + key.length)).setT(Arrays.copyOfRange(wrap, n2 + key.length, wrap.length)).createEciesP256EncryptedKey();
            if (instance.equals(SECObjectIdentifiers.secp256r1)) {
                return EncryptedDataEncryptionKey.eciesNistP256(eciesP256EncryptedKey);
            }
            if (instance.equals(TeleTrusTObjectIdentifiers.brainpoolP256r1)) {
                return EncryptedDataEncryptionKey.eciesBrainpoolP256r1(eciesP256EncryptedKey);
            }
            throw new IllegalStateException("recipient key curve is not P-256 or Brainpool P256r1");
        }
        catch (final Exception cause) {
            throw new RuntimeException(cause.getMessage(), cause);
        }
    }
    
    public static class Builder
    {
        private final ECPublicKey recipientKey;
        private final byte[] recipientHash;
        private JcaJceHelper helper;
        
        public Builder(final ECPublicKey recipientKey, final byte[] recipientHash) {
            this.helper = new DefaultJcaJceHelper();
            this.recipientKey = recipientKey;
            this.recipientHash = recipientHash;
        }
        
        public Builder setProvider(final Provider provider) {
            this.helper = new ProviderJcaJceHelper(provider);
            return this;
        }
        
        public Builder setProvider(final String s) {
            this.helper = new NamedJcaJceHelper(s);
            return this;
        }
        
        public JceETSIKeyWrapper build() {
            return new JceETSIKeyWrapper(this.recipientKey, this.recipientHash, this.helper, null);
        }
    }
}
