github.com/xmidt-org/webpa-common@v1.11.9/secure/key/purpose.go (about)

     1  package key
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  )
     7  
     8  // Purpose is an enumerated type describing the reason a given
     9  // key is being used.  This type implements Parser.
    10  //
    11  // All Purpose values assume PEM-encoded keys.  For other formats,
    12  // a custom Parser decorator can be used.  Purpose.RequiresPrivateKey()
    13  // determines whether to parse the key as a private key.
    14  type Purpose int
    15  
    16  const (
    17  	// PurposeVerify refers to a key used to verify a signature.  This is the zero-value
    18  	// for Purpose.  These keys must be public keys encoded as PEM blocks.
    19  	PurposeVerify Purpose = Purpose(iota)
    20  
    21  	// PurposeSign refers to a key used to create a signature.  These keys must be private,
    22  	// PEM-encoded keys.
    23  	PurposeSign
    24  
    25  	// PurposeEncrypt refers to a key used to encrypt data.  These keys must be private,
    26  	// PEM-encoded keys.
    27  	PurposeEncrypt
    28  
    29  	// PurposeDecrypt refers to a key used to decrypt data.  These keys must be public,
    30  	// PEM-encoded keys.
    31  	PurposeDecrypt
    32  )
    33  
    34  var (
    35  	purposeMarshal = map[Purpose]string{
    36  		PurposeSign:    "sign",
    37  		PurposeVerify:  "verify",
    38  		PurposeEncrypt: "encrypt",
    39  		PurposeDecrypt: "decrypt",
    40  	}
    41  
    42  	purposeUnmarshal = map[string]Purpose{
    43  		"sign":    PurposeSign,
    44  		"verify":  PurposeVerify,
    45  		"encrypt": PurposeEncrypt,
    46  		"decrypt": PurposeDecrypt,
    47  	}
    48  )
    49  
    50  // String returns a human-readable, string representation for a Purpose.
    51  // Unrecognized purpose values are assumed to be PurposeVerify.
    52  func (p Purpose) String() string {
    53  	if value, ok := purposeMarshal[p]; ok {
    54  		return value
    55  	}
    56  
    57  	return purposeMarshal[PurposeVerify]
    58  }
    59  
    60  func (p *Purpose) UnmarshalJSON(data []byte) error {
    61  	if data[0] == '"' {
    62  		if unmarshalValue, ok := purposeUnmarshal[string(data[1:len(data)-1])]; ok {
    63  			*p = unmarshalValue
    64  			return nil
    65  		}
    66  	}
    67  
    68  	return fmt.Errorf("Invalid key purpose: %s", data)
    69  }
    70  
    71  func (p Purpose) MarshalJSON() ([]byte, error) {
    72  	var buffer bytes.Buffer
    73  	buffer.WriteString("\"")
    74  	buffer.WriteString(p.String())
    75  	buffer.WriteString("\"")
    76  
    77  	return buffer.Bytes(), nil
    78  }
    79  
    80  // RequiresPrivateKey returns true if this purpose requires a private key,
    81  // false if it requires a public key.
    82  func (p Purpose) RequiresPrivateKey() bool {
    83  	return p == PurposeSign || p == PurposeEncrypt
    84  }