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

package com.google.crypto.tink.signature;

import com.google.crypto.tink.InsecureSecretKeyAccess;
import com.google.crypto.tink.internal.EllipticCurvesUtil;
import java.security.GeneralSecurityException;
import java.security.spec.ECPoint;
import java.math.BigInteger;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.crypto.tink.Parameters;
import com.google.crypto.tink.Key;
import com.google.crypto.tink.AccessesPartialKey;
import com.google.errorprone.annotations.RestrictedApi;
import com.google.crypto.tink.util.SecretBigInteger;
import com.google.errorprone.annotations.Immutable;

@Immutable
public final class EcdsaPrivateKey extends SignaturePrivateKey
{
    private final EcdsaPublicKey publicKey;
    private final SecretBigInteger privateValue;
    
    private EcdsaPrivateKey(final EcdsaPublicKey publicKey, final SecretBigInteger privateValue) {
        this.publicKey = publicKey;
        this.privateValue = privateValue;
    }
    
    @RestrictedApi(explanation = "Accessing parts of keys can produce unexpected incompatibilities, annotate the function with @AccessesPartialKey", link = "https://developers.google.com/tink/design/access_control#accessing_partial_keys", allowedOnPath = ".*Test\\.java", allowlistAnnotations = { AccessesPartialKey.class })
    public static Builder builder() {
        return new Builder();
    }
    
    @Override
    public EcdsaParameters getParameters() {
        return this.publicKey.getParameters();
    }
    
    @Override
    public EcdsaPublicKey getPublicKey() {
        return this.publicKey;
    }
    
    @RestrictedApi(explanation = "Accessing parts of keys can produce unexpected incompatibilities, annotate the function with @AccessesPartialKey", link = "https://developers.google.com/tink/design/access_control#accessing_partial_keys", allowedOnPath = ".*Test\\.java", allowlistAnnotations = { AccessesPartialKey.class })
    public SecretBigInteger getPrivateValue() {
        return this.privateValue;
    }
    
    @Override
    public boolean equalsKey(final Key o) {
        if (!(o instanceof EcdsaPrivateKey)) {
            return false;
        }
        final EcdsaPrivateKey that = (EcdsaPrivateKey)o;
        return that.publicKey.equalsKey(this.publicKey) && this.privateValue.equalsSecretBigInteger(that.privateValue);
    }
    
    public static class Builder
    {
        private EcdsaPublicKey publicKey;
        private SecretBigInteger privateValue;
        
        private Builder() {
            this.publicKey = null;
            this.privateValue = null;
        }
        
        @CanIgnoreReturnValue
        public Builder setPublicKey(final EcdsaPublicKey publicKey) {
            this.publicKey = publicKey;
            return this;
        }
        
        @CanIgnoreReturnValue
        public Builder setPrivateValue(final SecretBigInteger privateValue) {
            this.privateValue = privateValue;
            return this;
        }
        
        private static void validatePrivateValue(final BigInteger privateValue, final ECPoint publicPoint, final EcdsaParameters.CurveType curveType) throws GeneralSecurityException {
            final BigInteger order = curveType.toParameterSpec().getOrder();
            if (privateValue.signum() <= 0 || privateValue.compareTo(order) >= 0) {
                throw new GeneralSecurityException("Invalid private value");
            }
            final ECPoint p = EllipticCurvesUtil.multiplyByGenerator(privateValue, curveType.toParameterSpec());
            if (!p.equals(publicPoint)) {
                throw new GeneralSecurityException("Invalid private value");
            }
        }
        
        @AccessesPartialKey
        public EcdsaPrivateKey build() throws GeneralSecurityException {
            if (this.publicKey == null) {
                throw new GeneralSecurityException("Cannot build without a ecdsa public key");
            }
            if (this.privateValue == null) {
                throw new GeneralSecurityException("Cannot build without a private value");
            }
            validatePrivateValue(this.privateValue.getBigInteger(InsecureSecretKeyAccess.get()), this.publicKey.getPublicPoint(), this.publicKey.getParameters().getCurveType());
            return new EcdsaPrivateKey(this.publicKey, this.privateValue, null);
        }
    }
}
