You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ed25519_utils.go 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package jwt
  2. import (
  3. "crypto"
  4. "crypto/ed25519"
  5. "crypto/x509"
  6. "encoding/pem"
  7. "errors"
  8. )
  9. var (
  10. ErrNotEdPrivateKey = errors.New("key is not a valid Ed25519 private key")
  11. ErrNotEdPublicKey = errors.New("key is not a valid Ed25519 public key")
  12. )
  13. // ParseEdPrivateKeyFromPEM parses a PEM-encoded Edwards curve private key
  14. func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
  15. var err error
  16. // Parse PEM block
  17. var block *pem.Block
  18. if block, _ = pem.Decode(key); block == nil {
  19. return nil, ErrKeyMustBePEMEncoded
  20. }
  21. // Parse the key
  22. var parsedKey interface{}
  23. if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil {
  24. return nil, err
  25. }
  26. var pkey ed25519.PrivateKey
  27. var ok bool
  28. if pkey, ok = parsedKey.(ed25519.PrivateKey); !ok {
  29. return nil, ErrNotEdPrivateKey
  30. }
  31. return pkey, nil
  32. }
  33. // ParseEdPublicKeyFromPEM parses a PEM-encoded Edwards curve public key
  34. func ParseEdPublicKeyFromPEM(key []byte) (crypto.PublicKey, error) {
  35. var err error
  36. // Parse PEM block
  37. var block *pem.Block
  38. if block, _ = pem.Decode(key); block == nil {
  39. return nil, ErrKeyMustBePEMEncoded
  40. }
  41. // Parse the key
  42. var parsedKey interface{}
  43. if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {
  44. return nil, err
  45. }
  46. var pkey ed25519.PublicKey
  47. var ok bool
  48. if pkey, ok = parsedKey.(ed25519.PublicKey); !ok {
  49. return nil, ErrNotEdPublicKey
  50. }
  51. return pkey, nil
  52. }