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

package com.google.crypto.tink.subtle;

import com.google.crypto.tink.util.Bytes;
import java.security.GeneralSecurityException;
import java.security.KeyPair;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;

public final class EciesHkdfSenderKem
{
    private final ECPublicKey recipientPublicKey;
    
    public EciesHkdfSenderKem(final ECPublicKey recipientPublicKey) {
        this.recipientPublicKey = recipientPublicKey;
    }
    
    public KemKey generateKey(final String hmacAlgo, final byte[] hkdfSalt, final byte[] hkdfInfo, final int keySizeInBytes, final EllipticCurves.PointFormatType pointFormat) throws GeneralSecurityException {
        final KeyPair ephemeralKeyPair = EllipticCurves.generateKeyPair(this.recipientPublicKey.getParams());
        final ECPublicKey ephemeralPublicKey = (ECPublicKey)ephemeralKeyPair.getPublic();
        final ECPrivateKey ephemeralPrivateKey = (ECPrivateKey)ephemeralKeyPair.getPrivate();
        final byte[] sharedSecret = EllipticCurves.computeSharedSecret(ephemeralPrivateKey, this.recipientPublicKey);
        final byte[] kemBytes = EllipticCurves.pointEncode(ephemeralPublicKey.getParams().getCurve(), pointFormat, ephemeralPublicKey.getW());
        final byte[] symmetricKey = Hkdf.computeEciesHkdfSymmetricKey(kemBytes, sharedSecret, hmacAlgo, hkdfSalt, hkdfInfo, keySizeInBytes);
        return new KemKey(kemBytes, symmetricKey);
    }
    
    public static final class KemKey
    {
        private final Bytes kemBytes;
        private final Bytes symmetricKey;
        
        public KemKey(final byte[] kemBytes, final byte[] symmetricKey) {
            if (kemBytes == null) {
                throw new NullPointerException("KemBytes must be non-null");
            }
            if (symmetricKey == null) {
                throw new NullPointerException("symmetricKey must be non-null");
            }
            this.kemBytes = Bytes.copyFrom(kemBytes);
            this.symmetricKey = Bytes.copyFrom(symmetricKey);
        }
        
        public byte[] getKemBytes() {
            return this.kemBytes.toByteArray();
        }
        
        public byte[] getSymmetricKey() {
            return this.symmetricKey.toByteArray();
        }
    }
}
