// 
// 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 java.security.Key;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jcajce.util.JcaJceHelper;
import java.security.SecureRandom;
import org.bouncycastle.its.operator.ETSIDataEncryptor;

public class JceETSIDataEncryptor implements ETSIDataEncryptor
{
    private final SecureRandom random;
    private final JcaJceHelper helper;
    private byte[] nonce;
    private byte[] key;
    
    private JceETSIDataEncryptor(final SecureRandom random, final JcaJceHelper helper) {
        this.random = random;
        this.helper = helper;
    }
    
    @Override
    public byte[] encrypt(final byte[] input) {
        this.key = new byte[16];
        this.random.nextBytes(this.key);
        this.nonce = new byte[12];
        this.random.nextBytes(this.nonce);
        try {
            final SecretKeySpec key = new SecretKeySpec(this.key, "AES");
            final Cipher cipher = this.helper.createCipher("CCM");
            cipher.init(1, key, ClassUtil.getGCMSpec(this.nonce, 128));
            return cipher.doFinal(input);
        }
        catch (final Exception cause) {
            throw new RuntimeException(cause.getMessage(), cause);
        }
    }
    
    @Override
    public byte[] getKey() {
        return this.key;
    }
    
    @Override
    public byte[] getNonce() {
        return this.nonce;
    }
    
    public static class Builder
    {
        private SecureRandom random;
        private JcaJceHelper helper;
        
        public Builder() {
            this.helper = new DefaultJcaJceHelper();
        }
        
        public Builder setRandom(final SecureRandom random) {
            this.random = random;
            return this;
        }
        
        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 JceETSIDataEncryptor build() {
            if (this.random == null) {
                this.random = new SecureRandom();
            }
            return new JceETSIDataEncryptor(this.random, this.helper, null);
        }
    }
}
