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

package org.bouncycastle.pqc.crypto.saber;

import org.bouncycastle.crypto.digests.SHAKEDigest;
import org.bouncycastle.crypto.Xof;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.modes.SICBlockCipher;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.StreamCipher;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;

abstract class Symmetric
{
    abstract void hash_h(final byte[] p0, final byte[] p1, final int p2);
    
    abstract void hash_g(final byte[] p0, final byte[] p1);
    
    abstract void prf(final byte[] p0, final byte[] p1, final int p2, final int p3);
    
    static class AesSymmetric extends Symmetric
    {
        private final SHA256Digest sha256Digest;
        private final SHA512Digest sha512Digest;
        private final StreamCipher cipher;
        
        AesSymmetric() {
            this.sha256Digest = new SHA256Digest();
            this.sha512Digest = new SHA512Digest();
            this.cipher = SICBlockCipher.newInstance(AESEngine.newInstance());
        }
        
        @Override
        void hash_h(final byte[] array, final byte[] array2, final int n) {
            this.sha256Digest.update(array2, 0, array2.length);
            this.sha256Digest.doFinal(array, n);
        }
        
        @Override
        void hash_g(final byte[] array, final byte[] array2) {
            this.sha512Digest.update(array2, 0, array2.length);
            this.sha512Digest.doFinal(array, 0);
        }
        
        @Override
        void prf(final byte[] array, final byte[] array2, final int n, final int n2) {
            this.cipher.init(true, new ParametersWithIV(new KeyParameter(array2, 0, n), new byte[16]));
            this.cipher.processBytes(new byte[n2], 0, n2, array, 0);
        }
    }
    
    static class ShakeSymmetric extends Symmetric
    {
        private final SHA3Digest sha3Digest256;
        private final SHA3Digest sha3Digest512;
        private final Xof shakeDigest;
        
        ShakeSymmetric() {
            this.shakeDigest = new SHAKEDigest(128);
            this.sha3Digest256 = new SHA3Digest(256);
            this.sha3Digest512 = new SHA3Digest(512);
        }
        
        @Override
        void hash_h(final byte[] array, final byte[] array2, final int n) {
            this.sha3Digest256.update(array2, 0, array2.length);
            this.sha3Digest256.doFinal(array, n);
        }
        
        @Override
        void hash_g(final byte[] array, final byte[] array2) {
            this.sha3Digest512.update(array2, 0, array2.length);
            this.sha3Digest512.doFinal(array, 0);
        }
        
        @Override
        void prf(final byte[] array, final byte[] array2, final int n, final int n2) {
            this.shakeDigest.reset();
            this.shakeDigest.update(array2, 0, n);
            this.shakeDigest.doFinal(array, 0, n2);
        }
    }
}
