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

package com.nimbusds.jose.jwk;

import java.util.Collection;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import com.nimbusds.jose.JWSAlgorithm;
import java.security.spec.ECParameterSpec;
import java.util.Objects;
import com.nimbusds.jose.shaded.jcip.Immutable;
import java.io.Serializable;

@Immutable
public final class Curve implements Serializable
{
    private static final long serialVersionUID = 1L;
    public static final Curve P_256;
    public static final Curve SECP256K1;
    @Deprecated
    public static final Curve P_256K;
    public static final Curve P_384;
    public static final Curve P_521;
    public static final Curve Ed25519;
    public static final Curve Ed448;
    public static final Curve X25519;
    public static final Curve X448;
    private final String name;
    private final String stdName;
    private final String oid;
    
    public Curve(final String name) {
        this(name, null, null);
    }
    
    public Curve(final String name, final String stdName, final String oid) {
        this.name = Objects.requireNonNull(name);
        this.stdName = stdName;
        this.oid = oid;
    }
    
    public String getName() {
        return this.name;
    }
    
    public String getStdName() {
        return this.stdName;
    }
    
    public String getOID() {
        return this.oid;
    }
    
    public ECParameterSpec toECParameterSpec() {
        return ECParameterTable.get(this);
    }
    
    @Override
    public String toString() {
        return this.getName();
    }
    
    @Override
    public boolean equals(final Object object) {
        return object instanceof Curve && this.toString().equals(object.toString());
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(this.getName());
    }
    
    public static Curve parse(final String s) {
        if (s == null || s.trim().isEmpty()) {
            throw new IllegalArgumentException("The cryptographic curve string must not be null or empty");
        }
        if (s.equals(Curve.P_256.getName())) {
            return Curve.P_256;
        }
        if (s.equals(Curve.P_256K.getName())) {
            return Curve.P_256K;
        }
        if (s.equals(Curve.SECP256K1.getName())) {
            return Curve.SECP256K1;
        }
        if (s.equals(Curve.P_384.getName())) {
            return Curve.P_384;
        }
        if (s.equals(Curve.P_521.getName())) {
            return Curve.P_521;
        }
        if (s.equals(Curve.Ed25519.getName())) {
            return Curve.Ed25519;
        }
        if (s.equals(Curve.Ed448.getName())) {
            return Curve.Ed448;
        }
        if (s.equals(Curve.X25519.getName())) {
            return Curve.X25519;
        }
        if (s.equals(Curve.X448.getName())) {
            return Curve.X448;
        }
        return new Curve(s);
    }
    
    public static Curve forStdName(final String stdName) {
        if ("secp256r1".equals(stdName) || "prime256v1".equals(stdName)) {
            return Curve.P_256;
        }
        if ("secp256k1".equals(stdName)) {
            return Curve.SECP256K1;
        }
        if ("secp384r1".equals(stdName)) {
            return Curve.P_384;
        }
        if ("secp521r1".equals(stdName)) {
            return Curve.P_521;
        }
        if (Curve.Ed25519.getStdName().equals(stdName)) {
            return Curve.Ed25519;
        }
        if (Curve.Ed448.getStdName().equals(stdName)) {
            return Curve.Ed448;
        }
        if (Curve.X25519.getStdName().equals(stdName)) {
            return Curve.X25519;
        }
        if (Curve.X448.getStdName().equals(stdName)) {
            return Curve.X448;
        }
        return null;
    }
    
    public static Curve forOID(final String oid) {
        if (Curve.P_256.getOID().equals(oid)) {
            return Curve.P_256;
        }
        if (Curve.SECP256K1.getOID().equals(oid)) {
            return Curve.SECP256K1;
        }
        if (Curve.P_384.getOID().equals(oid)) {
            return Curve.P_384;
        }
        if (Curve.P_521.getOID().equals(oid)) {
            return Curve.P_521;
        }
        return null;
    }
    
    public static Set<Curve> forJWSAlgorithm(final JWSAlgorithm alg) {
        if (JWSAlgorithm.ES256.equals(alg)) {
            return Collections.singleton(Curve.P_256);
        }
        if (JWSAlgorithm.ES256K.equals(alg)) {
            return Collections.singleton(Curve.SECP256K1);
        }
        if (JWSAlgorithm.ES384.equals(alg)) {
            return Collections.singleton(Curve.P_384);
        }
        if (JWSAlgorithm.ES512.equals(alg)) {
            return Collections.singleton(Curve.P_521);
        }
        if (JWSAlgorithm.EdDSA.equals(alg)) {
            return Collections.unmodifiableSet((Set<? extends Curve>)new HashSet<Curve>(Arrays.asList(Curve.Ed25519, Curve.Ed448)));
        }
        return null;
    }
    
    public static Curve forECParameterSpec(final ECParameterSpec spec) {
        return ECParameterTable.get(spec);
    }
    
    static {
        P_256 = new Curve("P-256", "secp256r1", "1.2.840.10045.3.1.7");
        SECP256K1 = new Curve("secp256k1", "secp256k1", "1.3.132.0.10");
        P_256K = new Curve("P-256K", "secp256k1", "1.3.132.0.10");
        P_384 = new Curve("P-384", "secp384r1", "1.3.132.0.34");
        P_521 = new Curve("P-521", "secp521r1", "1.3.132.0.35");
        Ed25519 = new Curve("Ed25519", "Ed25519", null);
        Ed448 = new Curve("Ed448", "Ed448", null);
        X25519 = new Curve("X25519", "X25519", null);
        X448 = new Curve("X448", "X448", null);
    }
}
