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

package com.nimbusds.jose.crypto.impl;

import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Key;
import com.nimbusds.jose.JOSEException;
import javax.crypto.Mac;
import java.security.Provider;
import javax.crypto.SecretKey;
import com.nimbusds.jose.shaded.jcip.ThreadSafe;

@ThreadSafe
public class HMAC
{
    public static Mac getInitMac(final SecretKey secretKey, final Provider provider) throws JOSEException {
        return getInitMac(secretKey.getAlgorithm(), secretKey, provider);
    }
    
    public static Mac getInitMac(final String alg, final SecretKey secretKey, final Provider provider) throws JOSEException {
        Mac mac;
        try {
            if (provider != null) {
                mac = Mac.getInstance(alg, provider);
            }
            else {
                mac = Mac.getInstance(alg);
            }
            mac.init(secretKey);
        }
        catch (final NoSuchAlgorithmException e) {
            throw new JOSEException("Unsupported HMAC algorithm: " + e.getMessage(), e);
        }
        catch (final InvalidKeyException e2) {
            throw new JOSEException("Invalid HMAC key: " + e2.getMessage(), e2);
        }
        return mac;
    }
    
    @Deprecated
    public static byte[] compute(final String alg, final byte[] secret, final byte[] message, final Provider provider) throws JOSEException {
        return compute(alg, new SecretKeySpec(secret, alg), message, provider);
    }
    
    public static byte[] compute(final String alg, final SecretKey secretKey, final byte[] message, final Provider provider) throws JOSEException {
        final Mac mac = getInitMac(alg, secretKey, provider);
        mac.update(message);
        return mac.doFinal();
    }
    
    public static byte[] compute(final SecretKey secretKey, final byte[] message, final Provider provider) throws JOSEException {
        return compute(secretKey.getAlgorithm(), secretKey, message, provider);
    }
}
