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

package com.nimbusds.jose.crypto;

import com.nimbusds.jose.crypto.utils.ConstantTimeUtils;
import com.nimbusds.jose.crypto.impl.HMAC;
import com.nimbusds.jose.Header;
import com.nimbusds.jose.util.Base64URL;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.jwk.OctetSequenceKey;
import java.util.Set;
import javax.crypto.SecretKey;
import com.nimbusds.jose.util.StandardCharset;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.crypto.impl.CriticalHeaderParamsDeferral;
import com.nimbusds.jose.shaded.jcip.ThreadSafe;
import com.nimbusds.jose.CriticalHeaderParamsAware;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.crypto.impl.MACProvider;

@ThreadSafe
public class MACVerifier extends MACProvider implements JWSVerifier, CriticalHeaderParamsAware
{
    private final CriticalHeaderParamsDeferral critPolicy;
    
    public MACVerifier(final byte[] secret) throws JOSEException {
        super(secret);
        this.critPolicy = new CriticalHeaderParamsDeferral();
    }
    
    public MACVerifier(final String secretString) throws JOSEException {
        this(secretString.getBytes(StandardCharset.UTF_8));
    }
    
    public MACVerifier(final SecretKey secretKey) throws JOSEException {
        this(secretKey, null);
    }
    
    public MACVerifier(final OctetSequenceKey jwk) throws JOSEException {
        this(jwk.toByteArray());
    }
    
    public MACVerifier(final byte[] secret, final Set<String> defCritHeaders) throws JOSEException {
        super(secret);
        (this.critPolicy = new CriticalHeaderParamsDeferral()).setDeferredCriticalHeaderParams(defCritHeaders);
    }
    
    public MACVerifier(final SecretKey secretKey, final Set<String> defCritHeaders) throws JOSEException {
        super(secretKey);
        (this.critPolicy = new CriticalHeaderParamsDeferral()).setDeferredCriticalHeaderParams(defCritHeaders);
    }
    
    public MACVerifier(final OctetSequenceKey jwk, final Set<String> defCritHeaders) throws JOSEException {
        this(jwk.toByteArray(), defCritHeaders);
    }
    
    @Override
    public Set<String> getProcessedCriticalHeaderParams() {
        return this.critPolicy.getProcessedCriticalHeaderParams();
    }
    
    @Override
    public Set<String> getDeferredCriticalHeaderParams() {
        return this.critPolicy.getProcessedCriticalHeaderParams();
    }
    
    @Override
    public boolean verify(final JWSHeader header, final byte[] signedContent, final Base64URL signature) throws JOSEException {
        this.ensureSecretLengthSatisfiesAlgorithm(header.getAlgorithm());
        if (!this.critPolicy.headerPasses(header)) {
            return false;
        }
        final String jcaAlg = MACProvider.getJCAAlgorithmName(header.getAlgorithm());
        final byte[] expectedHMAC = HMAC.compute(jcaAlg, this.getSecretKey(), signedContent, this.getJCAContext().getProvider());
        return ConstantTimeUtils.areEqual(expectedHMAC, signature.decode());
    }
}
