| package crypto |
| |
| import ( |
| "crypto/ecdsa" |
| "crypto/x509" |
| "encoding/pem" |
| "errors" |
| ) |
| |
| // ECDSA parsing errors. |
| var ( |
| ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") |
| ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") |
| ) |
| |
| // ParseECPrivateKeyFromPEM will parse a PEM encoded EC Private |
| // Key Structure. |
| func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { |
| block, _ := pem.Decode(key) |
| if block == nil { |
| return nil, ErrKeyMustBePEMEncoded |
| } |
| return x509.ParseECPrivateKey(block.Bytes) |
| } |
| |
| // ParseECPublicKeyFromPEM will parse a PEM encoded PKCS1 or PKCS8 public key |
| func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { |
| |
| block, _ := pem.Decode(key) |
| if block == nil { |
| return nil, ErrKeyMustBePEMEncoded |
| } |
| |
| parsedKey, err := x509.ParsePKIXPublicKey(block.Bytes) |
| if err != nil { |
| cert, err := x509.ParseCertificate(block.Bytes) |
| if err != nil { |
| return nil, err |
| } |
| parsedKey = cert.PublicKey |
| } |
| |
| pkey, ok := parsedKey.(*ecdsa.PublicKey) |
| if !ok { |
| return nil, ErrNotECPublicKey |
| } |
| return pkey, nil |
| } |