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

package com.google.crypto.tink.hybrid.internal;

import com.google.crypto.tink.subtle.EllipticCurves;
import com.google.crypto.tink.AccessesPartialKey;
import java.security.GeneralSecurityException;
import com.google.crypto.tink.hybrid.HpkeParameters;
import com.google.crypto.tink.hybrid.HpkePublicKey;

public final class HpkeHelperForAndroidKeystore
{
    private static final byte[] EMPTY_ASSOCIATED_DATA;
    private final HpkeKem kem;
    private final HpkeKdf kdf;
    private final HpkeAead aead;
    private final byte[] publicKeyByteArray;
    
    private HpkeHelperForAndroidKeystore(final HpkeKem kem, final HpkeKdf kdf, final HpkeAead aead, final byte[] publicKeyByteArray) {
        this.kem = kem;
        this.kdf = kdf;
        this.aead = aead;
        this.publicKeyByteArray = publicKeyByteArray;
    }
    
    @AccessesPartialKey
    public static HpkeHelperForAndroidKeystore create(final HpkePublicKey receiverPublicKey) throws GeneralSecurityException {
        final HpkeParameters parameters = receiverPublicKey.getParameters();
        validateParameters(parameters);
        final HpkeKem kem = HpkePrimitiveFactory.createKem(parameters.getKemId());
        final HpkeKdf kdf = HpkePrimitiveFactory.createKdf(parameters.getKdfId());
        final HpkeAead aead = HpkePrimitiveFactory.createAead(parameters.getAeadId());
        return new HpkeHelperForAndroidKeystore(kem, kdf, aead, receiverPublicKey.getPublicKeyBytes().toByteArray());
    }
    
    private static void validateParameters(final HpkeParameters parameters) throws GeneralSecurityException {
        if (!parameters.getKemId().equals(HpkeParameters.KemId.DHKEM_P256_HKDF_SHA256)) {
            throw new GeneralSecurityException("HpkeHelperForAndroidKeystore currently only supports DHKEM_P256_HKDF_SHA256.");
        }
        if (!parameters.getKdfId().equals(HpkeParameters.KdfId.HKDF_SHA256)) {
            throw new GeneralSecurityException("HpkeHelperForAndroidKeystore currently only supports HKDF_SHA256.");
        }
        if (!parameters.getAeadId().equals(HpkeParameters.AeadId.AES_128_GCM) && !parameters.getAeadId().equals(HpkeParameters.AeadId.AES_256_GCM)) {
            throw new GeneralSecurityException("HpkeHelperForAndroidKeystore currently only supports AES_128_GCM and AES_256_GCM.");
        }
        if (!parameters.getVariant().equals(HpkeParameters.Variant.NO_PREFIX)) {
            throw new GeneralSecurityException("HpkeHelperForAndroidKeystore currently only supports Variant.NO_PREFIX");
        }
    }
    
    public byte[] decryptUnauthenticatedWithEncapsulatedKeyAndP256SharedSecret(final byte[] encapsulatedKey, final byte[] dhSharedSecret, final byte[] ciphertext, final int ciphertextOffset, final byte[] contextInfo) throws GeneralSecurityException {
        byte[] info = contextInfo;
        if (info == null) {
            info = new byte[0];
        }
        final byte[] sharedSecret = NistCurvesHpkeKem.fromCurve(EllipticCurves.CurveType.NIST_P256).deriveKemSharedSecret(dhSharedSecret, encapsulatedKey, this.publicKeyByteArray);
        final HpkeContext context = HpkeContext.createContext(HpkeUtil.BASE_MODE, encapsulatedKey, sharedSecret, this.kem, this.kdf, this.aead, info);
        return context.open(ciphertext, ciphertextOffset, HpkeHelperForAndroidKeystore.EMPTY_ASSOCIATED_DATA);
    }
    
    static {
        EMPTY_ASSOCIATED_DATA = new byte[0];
    }
}
