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

package org.bouncycastle.pqc.crypto.mlkem;

import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.digests.SHAKEDigest;

abstract class Symmetric
{
    final int xofBlockBytes;
    
    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 xofAbsorb(final byte[] p0, final byte p1, final byte p2);
    
    abstract void xofSqueezeBlocks(final byte[] p0, final int p1, final int p2);
    
    abstract void prf(final byte[] p0, final byte[] p1, final byte p2);
    
    abstract void kdf(final byte[] p0, final byte[] p1);
    
    Symmetric(final int xofBlockBytes) {
        this.xofBlockBytes = xofBlockBytes;
    }
    
    static class ShakeSymmetric extends Symmetric
    {
        private final SHAKEDigest xof;
        private final SHA3Digest sha3Digest512;
        private final SHA3Digest sha3Digest256;
        private final SHAKEDigest shakeDigest;
        
        ShakeSymmetric() {
            super(168);
            this.xof = new SHAKEDigest(128);
            this.shakeDigest = new SHAKEDigest(256);
            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 xofAbsorb(final byte[] array, final byte b, final byte b2) {
            this.xof.reset();
            final byte[] array2 = new byte[array.length + 2];
            System.arraycopy(array, 0, array2, 0, array.length);
            array2[array.length] = b;
            array2[array.length + 1] = b2;
            this.xof.update(array2, 0, array.length + 2);
        }
        
        @Override
        void xofSqueezeBlocks(final byte[] array, final int n, final int n2) {
            this.xof.doOutput(array, n, n2);
        }
        
        @Override
        void prf(final byte[] array, final byte[] array2, final byte b) {
            final byte[] array3 = new byte[array2.length + 1];
            System.arraycopy(array2, 0, array3, 0, array2.length);
            array3[array2.length] = b;
            this.shakeDigest.update(array3, 0, array3.length);
            this.shakeDigest.doFinal(array, 0, array.length);
        }
        
        @Override
        void kdf(final byte[] array, final byte[] array2) {
            this.shakeDigest.update(array2, 0, array2.length);
            this.shakeDigest.doFinal(array, 0, array.length);
        }
    }
}
