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

package io.netty.handler.codec.quic;

import java.security.SecureRandom;
import java.util.Arrays;
import java.nio.ByteBuffer;
import java.security.GeneralSecurityException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Key;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import io.netty.util.concurrent.FastThreadLocal;

final class Hmac
{
    private static final FastThreadLocal<Mac> MACS;
    private static final String ALGORITM = "HmacSHA256";
    private static final byte[] randomKey;
    
    private static Mac newMac() {
        try {
            final SecretKeySpec keySpec = new SecretKeySpec(Hmac.randomKey, "HmacSHA256");
            final Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(keySpec);
            return mac;
        }
        catch (final NoSuchAlgorithmException | InvalidKeyException exception) {
            throw new IllegalStateException(exception);
        }
    }
    
    static ByteBuffer sign(final ByteBuffer input, final int outLength) {
        final Mac mac = Hmac.MACS.get();
        mac.reset();
        mac.update(input);
        byte[] signBytes = mac.doFinal();
        if (signBytes.length != outLength) {
            signBytes = Arrays.copyOf(signBytes, outLength);
        }
        return ByteBuffer.wrap(signBytes);
    }
    
    private Hmac() {
    }
    
    static {
        MACS = new FastThreadLocal<Mac>() {
            @Override
            protected Mac initialValue() {
                return newMac();
            }
        };
        randomKey = new byte[16];
        new SecureRandom().nextBytes(Hmac.randomKey);
    }
}
