github.com/Venafi/vcert/v5@v5.10.2/pkg/certificate/ellipticCurve.go (about)

     1  package certificate
     2  
     3  import (
     4  	"strings"
     5  
     6  	"gopkg.in/yaml.v3"
     7  )
     8  
     9  // EllipticCurve represents the types of supported elliptic curves
    10  type EllipticCurve int
    11  
    12  const (
    13  	// EllipticCurveNotSet represents a value not set
    14  	EllipticCurveNotSet EllipticCurve = iota
    15  	// EllipticCurveP521 represents the P521 curve
    16  	EllipticCurveP521
    17  	// EllipticCurveP256 represents the P256 curve
    18  	EllipticCurveP256
    19  	// EllipticCurveP384 represents the P384 curve
    20  	EllipticCurveP384
    21  	// EllipticCurveED25519 represents the ED25519 curve
    22  	EllipticCurveED25519
    23  	// EllipticCurveDefault represents the default curve value
    24  	EllipticCurveDefault = EllipticCurveP256
    25  
    26  	// String representations of the EllipticCurve types
    27  	strEccP256    = "P256"
    28  	strEccP384    = "P384"
    29  	strEccP521    = "P521"
    30  	strEccED25519 = "ED25519"
    31  )
    32  
    33  func (ec *EllipticCurve) String() string {
    34  	switch *ec {
    35  	case EllipticCurveP521:
    36  		return strEccP521
    37  	case EllipticCurveP384:
    38  		return strEccP384
    39  	case EllipticCurveP256:
    40  		return strEccP256
    41  	case EllipticCurveED25519:
    42  		return strEccED25519
    43  	default:
    44  		return ""
    45  	}
    46  }
    47  
    48  // Set EllipticCurve value via a string
    49  func (ec *EllipticCurve) Set(value string) error {
    50  	switch strings.ToUpper(value) {
    51  	case strEccP521, "P-521":
    52  		*ec = EllipticCurveP521
    53  	case strEccP384, "P-384":
    54  		*ec = EllipticCurveP384
    55  	case strEccP256, "P-256":
    56  		*ec = EllipticCurveP256
    57  	case strEccED25519:
    58  		*ec = EllipticCurveED25519
    59  	default:
    60  		*ec = EllipticCurveDefault
    61  	}
    62  
    63  	return nil
    64  }
    65  
    66  func parseEllipticCurve(value string) EllipticCurve {
    67  	switch strings.ToUpper(value) {
    68  	case strEccP256, "P-256":
    69  		return EllipticCurveP256
    70  	case strEccP384, "P-384":
    71  		return EllipticCurveP384
    72  	case strEccP521, "P-521":
    73  		return EllipticCurveP521
    74  	case strEccED25519:
    75  		return EllipticCurveED25519
    76  	default:
    77  		return EllipticCurveDefault
    78  	}
    79  }
    80  
    81  // MarshalYAML customizes the behavior of ChainOption when being marshaled into a YAML document.
    82  // The returned value is marshaled in place of the original value implementing Marshaller
    83  func (ec EllipticCurve) MarshalYAML() (interface{}, error) {
    84  	return ec.String(), nil
    85  }
    86  
    87  // UnmarshalYAML customizes the behavior when being unmarshalled from a YAML document
    88  func (ec *EllipticCurve) UnmarshalYAML(value *yaml.Node) error {
    89  	var strValue string
    90  	err := value.Decode(&strValue)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	*ec = parseEllipticCurve(strValue)
    96  
    97  	return nil
    98  }
    99  
   100  func AllSupportedCurves() []EllipticCurve {
   101  	return []EllipticCurve{EllipticCurveP521, EllipticCurveP256, EllipticCurveP384, EllipticCurveED25519}
   102  }