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 }