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 }