certchain.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package jwk
  2. import (
  3. "crypto/x509"
  4. "encoding/base64"
  5. "github.com/pkg/errors"
  6. )
  7. func (c CertificateChain) Get() []*x509.Certificate {
  8. return c.certs
  9. }
  10. func (c *CertificateChain) Accept(v interface{}) error {
  11. switch x := v.(type) {
  12. case string:
  13. return c.Accept([]string{x})
  14. case []interface{}:
  15. l := make([]string, len(x))
  16. for i, e := range x {
  17. if es, ok := e.(string); ok {
  18. l[i] = es
  19. } else {
  20. return errors.Errorf(`invalid list element type: expected string, got %T`, v)
  21. }
  22. }
  23. return c.Accept(l)
  24. case []string:
  25. certs := make([]*x509.Certificate, len(x))
  26. for i, e := range x {
  27. buf, err := base64.StdEncoding.DecodeString(e)
  28. if err != nil {
  29. return errors.Wrap(err, `failed to base64 decode list element`)
  30. }
  31. cert, err := x509.ParseCertificate(buf)
  32. if err != nil {
  33. return errors.Wrap(err, `failed to parse certificate`)
  34. }
  35. certs[i] = cert
  36. }
  37. *c = CertificateChain{
  38. certs: certs,
  39. }
  40. return nil
  41. default:
  42. return errors.Errorf(`invalid value %T`, v)
  43. }
  44. }