Blame vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go

Packit 63bb0d
package jwt
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"crypto/ecdsa"
Packit 63bb0d
	"crypto/x509"
Packit 63bb0d
	"encoding/pem"
Packit 63bb0d
	"errors"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
var (
Packit 63bb0d
	ErrNotECPublicKey  = errors.New("Key is not a valid ECDSA public key")
Packit 63bb0d
	ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key")
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Parse PEM encoded Elliptic Curve Private Key Structure
Packit 63bb0d
func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {
Packit 63bb0d
	var err error
Packit 63bb0d
Packit 63bb0d
	// Parse PEM block
Packit 63bb0d
	var block *pem.Block
Packit 63bb0d
	if block, _ = pem.Decode(key); block == nil {
Packit 63bb0d
		return nil, ErrKeyMustBePEMEncoded
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Parse the key
Packit 63bb0d
	var parsedKey interface{}
Packit 63bb0d
	if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil {
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var pkey *ecdsa.PrivateKey
Packit 63bb0d
	var ok bool
Packit 63bb0d
	if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok {
Packit 63bb0d
		return nil, ErrNotECPrivateKey
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return pkey, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Parse PEM encoded PKCS1 or PKCS8 public key
Packit 63bb0d
func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) {
Packit 63bb0d
	var err error
Packit 63bb0d
Packit 63bb0d
	// Parse PEM block
Packit 63bb0d
	var block *pem.Block
Packit 63bb0d
	if block, _ = pem.Decode(key); block == nil {
Packit 63bb0d
		return nil, ErrKeyMustBePEMEncoded
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	// Parse the key
Packit 63bb0d
	var parsedKey interface{}
Packit 63bb0d
	if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {
Packit 63bb0d
		if cert, err := x509.ParseCertificate(block.Bytes); err == nil {
Packit 63bb0d
			parsedKey = cert.PublicKey
Packit 63bb0d
		} else {
Packit 63bb0d
			return nil, err
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	var pkey *ecdsa.PublicKey
Packit 63bb0d
	var ok bool
Packit 63bb0d
	if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok {
Packit 63bb0d
		return nil, ErrNotECPublicKey
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return pkey, nil
Packit 63bb0d
}