GordianDSAElliptic.java

/*
 * GordianKnot: Security Suite
 * Copyright 2012-2026. Tony Washer
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.  You may obtain a copy
 * of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package io.github.tonywasher.joceanus.gordianknot.api.keypair;

/**
 * Named Elliptic Curves.
 */
public enum GordianDSAElliptic implements GordianElliptic {
    /**
     * sect571k1.
     */
    SECT571K1("sect571k1", 571),

    /**
     * sect571r1.
     */
    SECT571R1("sect571r1", 571),

    /**
     * secp521r1.
     */
    SECP521R1("secp521r1", 521),

    /**
     * sect409k1.
     */
    SECT409K1("sect409k1", 409),

    /**
     * sect409r1.
     */
    SECT409R1("sect409r1", 409),

    /**
     * secp384r1.
     */
    SECP384R1("secp384r1", 384),

    /**
     * sect283k1.
     */
    SECT283K1("sect283k1", 283),

    /**
     * sect283r1.
     */
    SECT283R1("sect283r1", 283),

    /**
     * secp256k1.
     */
    SECP256K1("secp256k1", 256),

    /**
     * secp256r1.
     */
    SECP256R1("secp256r1", 256),

    /**
     * sect239k1.
     */
    SECT239K1("sect239k1", 239),

    /**
     * sect233k1.
     */
    SECT233K1("sect233k1", 233),

    /**
     * sect233r1.
     */
    SECT233R1("sect233r1", 233),

    /**
     * secp224k1.
     */
    SECP224K1("secp224k1", 224),

    /**
     * secp224r1.
     */
    SECP224R1("secp224r1", 224),

    /**
     * sect193r1.
     */
    SECT193R1("sect193r1", 193),

    /**
     * sect193r2.
     */
    SECT193R2("sect193r2", 193),

    /**
     * secp192k1.
     */
    SECP192K1("secp192k1", 192),

    /**
     * secp192r1.
     */
    SECP192R1("secp192r1", 192),

    /**
     * sect163k1.
     */
    SECT163K1("sect163k1", 163),

    /**
     * secp160r1.
     */
    SECT163R1("sect163r1", 163),

    /**
     * sect163r2.
     */
    SECT163R2("sect163r2", 163),

    /**
     * secp160k1.
     */
    SECP160K1("secp160k1", 160),

    /**
     * secp160r1.
     */
    SECP160R1("secp160r1", 160),

    /**
     * secp160r2.
     */
    SECP160R2("secp160r2", 160),

    /**
     * secp131r1.
     */
    SECT131R1("sect131r1", 131),

    /**
     * sect131r2.
     */
    SECT131R2("sect131r2", 131),

    /**
     * secp128r1.
     */
    SECP128R1("secp128r1", 128),

    /**
     * secp128r2.
     */
    SECP128R2("secp128r2", 127),

    /**
     * sect113r1.
     */
    SECT113R1("sect113r1", 113),

    /**
     * sect113r2.
     */
    SECT113R2("sect113r2", 113),

    /**
     * secp112r1.
     */
    SECP112R1("secp112r1", 112),

    /**
     * secp112r2.
     */
    SECP112R2("secp112r2", 112),

    /*
     * prime256v1 (same curve as secp256r1).
     */

    /**
     * prime239v1.
     */
    PRIME239V1("prime239v1", 239),

    /**
     * prime239v2.
     */
    PRIME239V2("prime239v2", 239),

    /**
     * prime239v3.
     */
    PRIME239V3("prime239v3", 239),

    /*
     * prime192v1 (same curve as secp192r1)
     */

    /**
     * prime192v2.
     */
    PRIME192V2("prime192v2", 192),

    /**
     * prime192v3.
     */
    PRIME192V3("prime192v3", 192),

    /**
     * c2tnb431r1.
     */
    C2TNB431R1("c2tnb431r1", 431),

    /**
     * c2pnb368w1.
     */
    C2PNB368W1("c2pnb368w1", 368),

    /**
     * c2tnb359v1.
     */
    C2TNB359V1("c2tnb359v1", 359),

    /**
     * c2pnb304w1.
     */
    C2PNB304W1("c2pnb304w1", 304),

    /**
     * c2pnb272w1.
     */
    C2PNB272W1("c2pnb272w1", 272),

    /**
     * c2tnb239v1.
     */
    C2TNB239V1("c2tnb239v1", 239),

    /**
     * c2tnb239v2.
     */
    C2TNB239V2("c2tnb239v2", 239),

    /**
     * c2tnb239v3.
     */
    C2TNB239V3("c2tnb239v3", 239),

    /**
     * c2pnb208w1.
     */
    C2PNB208W1("c2pnb208w1", 208),

    /**
     * c2tnb191v1.
     */
    C2TNB191V1("c2tnb191v1", 191),

    /**
     * c2tnb191r2.
     */
    C2TNB191V2("c2tnb191v2", 191),

    /**
     * c2tnb191v3.
     */
    C2TNB191V3("c2tnb191v3", 191),

    /**
     * c2pnb176w1.
     */
    C2PNB176W1("c2pnb176w1", 176),

    /**
     * c2pnb163v1.
     */
    C2PNB163V1("c2pnb163v1", 163),

    /**
     * c2pnb163v2.
     */
    C2PNB163V2("c2pnb163v2", 163),

    /**
     * c2pnb163v3.
     */
    C2PNB163V3("c2pnb163v3", 163),

    /**
     * brainpoolp512r1.
     */
    BRAINPOOLP512R1("brainpoolP512r1", 512),

    /**
     * brainpoolp512t1.
     */
    BRAINPOOLP512T1("brainpoolP512t1", 512),

    /**
     * brainpoolp384r1.
     */
    BRAINPOOLP384R1("brainpoolP384r1", 384),

    /**
     * brainpoolt384t1.
     */
    BRAINPOOLP384T1("brainpoolP384t1", 384),

    /**
     * brainpoolp320r1.
     */
    BRAINPOOLP320R1("brainpoolP320r1", 320),

    /**
     * brainpoolp320t1.
     */
    BRAINPOOLP320T1("brainpoolP320t1", 320),

    /**
     * brainpoolp256r1.
     */
    BRAINPOOLP256R1("brainpoolP256r1", 256),

    /**
     * brainpoolp256t1.
     */
    BRAINPOOLP256T1("brainpoolP256t1", 256),

    /**
     * brainpoolp224r1.
     */
    BRAINPOOLP224R1("brainpoolP224r1", 224),

    /**
     * brainpoolp224t1.
     */
    BRAINPOOLP224T1("brainpoolP224t1", 224),

    /**
     * brainpoolp192r1.
     */
    BRAINPOOLP192R1("brainpoolP192r1", 192),

    /**
     * brainpoolp192t1.
     */
    BRAINPOOLP192T1("brainpoolP192t1", 192),

    /**
     * brainpoolp160r1.
     */
    BRAINPOOLP160R1("brainpoolP160r1", 160),

    /**
     * brainpoolp160t1.
     */
    BRAINPOOLP160T1("brainpoolP160t1", 160);

    /**
     * The curve name.
     */
    private final String theName;

    /**
     * The key size.
     */
    private final int theSize;

    /**
     * Constructor.
     *
     * @param pName the name of the curve
     * @param pSize the bitSize of the curve
     */
    GordianDSAElliptic(final String pName,
                       final int pSize) {
        theName = pName;
        theSize = pSize;
    }

    @Override
    public String getCurveName() {
        return theName;
    }

    @Override
    public int getKeySize() {
        return theSize;
    }

    /**
     * Obtain the curve for a Name.
     *
     * @param pName the name
     * @return the curve
     */
    public static GordianDSAElliptic getCurveForName(final String pName) {
        /* Loop through the curves */
        for (GordianDSAElliptic myCurve : values()) {
            if (pName.equals(myCurve.getCurveName())) {
                return myCurve;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return theName;
    }

    @Override
    public boolean canEncrypt() {
        switch (this) {
            case C2PNB176W1:
            case C2PNB208W1:
            case C2PNB272W1:
            case C2PNB304W1:
            case C2TNB359V1:
            case C2PNB368W1:
            case C2TNB431R1:
                return false;
            default:
                return true;
        }
    }

    @Override
    public boolean hasCustomCurve() {
        switch (this) {
            case SECP112R1:
            case SECP128R1:
            case SECP160K1:
            case SECP160R1:
            case SECP160R2:
            case SECP192K1:
            case SECP192R1:
            case SECP224K1:
            case SECP224R1:
            case SECP256K1:
            case SECP256R1:
            case SECP384R1:
            case SECP521R1:
            case SECT113R1:
            case SECT113R2:
            case SECT131R1:
            case SECT131R2:
            case SECT163K1:
            case SECT163R1:
            case SECT163R2:
            case SECT193R1:
            case SECT193R2:
            case SECT233K1:
            case SECT233R1:
            case SECT239K1:
            case SECT283K1:
            case SECT283R1:
            case SECT409K1:
            case SECT409R1:
            case SECT571K1:
            case SECT571R1:
                return true;
            default:
                return false;
        }
    }
}