keyconv.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package keyconv
  2. import (
  3. "crypto"
  4. "crypto/ecdsa"
  5. "crypto/rsa"
  6. "github.com/lestrrat-go/blackmagic"
  7. "github.com/lestrrat-go/jwx/jwk"
  8. "github.com/pkg/errors"
  9. "golang.org/x/crypto/ed25519"
  10. )
  11. // RSAPrivateKey assigns src to dst.
  12. // `dst` should be a pointer to a rsa.PrivateKey.
  13. // `src` may be rsa.PrivateKey, *rsa.PrivateKey, or a jwk.Key
  14. func RSAPrivateKey(dst, src interface{}) error {
  15. if jwkKey, ok := src.(jwk.Key); ok {
  16. var raw rsa.PrivateKey
  17. if err := jwkKey.Raw(&raw); err != nil {
  18. return errors.Wrapf(err, `failed to produce rsa.PrivateKey from %T`, src)
  19. }
  20. src = &raw
  21. }
  22. var ptr *rsa.PrivateKey
  23. switch src := src.(type) {
  24. case rsa.PrivateKey:
  25. ptr = &src
  26. case *rsa.PrivateKey:
  27. ptr = src
  28. default:
  29. return errors.Errorf(`expected rsa.PrivateKey or *rsa.PrivateKey, got %T`, src)
  30. }
  31. return blackmagic.AssignIfCompatible(dst, ptr)
  32. }
  33. // RSAPublicKey assigns src to dst
  34. // `dst` should be a pointer to a non-zero rsa.PublicKey.
  35. // `src` may be rsa.PublicKey, *rsa.PublicKey, or a jwk.Key
  36. func RSAPublicKey(dst, src interface{}) error {
  37. if jwkKey, ok := src.(jwk.Key); ok {
  38. var raw rsa.PublicKey
  39. if err := jwkKey.Raw(&raw); err != nil {
  40. return errors.Wrapf(err, `failed to produce rsa.PublicKey from %T`, src)
  41. }
  42. src = &raw
  43. }
  44. var ptr *rsa.PublicKey
  45. switch src := src.(type) {
  46. case rsa.PublicKey:
  47. ptr = &src
  48. case *rsa.PublicKey:
  49. ptr = src
  50. default:
  51. return errors.Errorf(`expected rsa.PublicKey or *rsa.PublicKey, got %T`, src)
  52. }
  53. return blackmagic.AssignIfCompatible(dst, ptr)
  54. }
  55. // ECDSAPrivateKey assigns src to dst, converting its type from a
  56. // non-pointer to a pointer
  57. func ECDSAPrivateKey(dst, src interface{}) error {
  58. if jwkKey, ok := src.(jwk.Key); ok {
  59. var raw ecdsa.PrivateKey
  60. if err := jwkKey.Raw(&raw); err != nil {
  61. return errors.Wrapf(err, `failed to produce ecdsa.PrivateKey from %T`, src)
  62. }
  63. src = &raw
  64. }
  65. var ptr *ecdsa.PrivateKey
  66. switch src := src.(type) {
  67. case ecdsa.PrivateKey:
  68. ptr = &src
  69. case *ecdsa.PrivateKey:
  70. ptr = src
  71. default:
  72. return errors.Errorf(`expected ecdsa.PrivateKey or *ecdsa.PrivateKey, got %T`, src)
  73. }
  74. return blackmagic.AssignIfCompatible(dst, ptr)
  75. }
  76. // ECDSAPublicKey assigns src to dst, converting its type from a
  77. // non-pointer to a pointer
  78. func ECDSAPublicKey(dst, src interface{}) error {
  79. if jwkKey, ok := src.(jwk.Key); ok {
  80. var raw ecdsa.PublicKey
  81. if err := jwkKey.Raw(&raw); err != nil {
  82. return errors.Wrapf(err, `failed to produce ecdsa.PublicKey from %T`, src)
  83. }
  84. src = &raw
  85. }
  86. var ptr *ecdsa.PublicKey
  87. switch src := src.(type) {
  88. case ecdsa.PublicKey:
  89. ptr = &src
  90. case *ecdsa.PublicKey:
  91. ptr = src
  92. default:
  93. return errors.Errorf(`expected ecdsa.PublicKey or *ecdsa.PublicKey, got %T`, src)
  94. }
  95. return blackmagic.AssignIfCompatible(dst, ptr)
  96. }
  97. func ByteSliceKey(dst, src interface{}) error {
  98. if jwkKey, ok := src.(jwk.Key); ok {
  99. var raw []byte
  100. if err := jwkKey.Raw(&raw); err != nil {
  101. return errors.Wrapf(err, `failed to produce []byte from %T`, src)
  102. }
  103. src = raw
  104. }
  105. if _, ok := src.([]byte); !ok {
  106. return errors.Errorf(`expected []byte, got %T`, src)
  107. }
  108. return blackmagic.AssignIfCompatible(dst, src)
  109. }
  110. func Ed25519PrivateKey(dst, src interface{}) error {
  111. if jwkKey, ok := src.(jwk.Key); ok {
  112. var raw ed25519.PrivateKey
  113. if err := jwkKey.Raw(&raw); err != nil {
  114. return errors.Wrapf(err, `failed to produce ed25519.PrivateKey from %T`, src)
  115. }
  116. src = &raw
  117. }
  118. var ptr *ed25519.PrivateKey
  119. switch src := src.(type) {
  120. case ed25519.PrivateKey:
  121. ptr = &src
  122. case *ed25519.PrivateKey:
  123. ptr = src
  124. default:
  125. return errors.Errorf(`expected ed25519.PrivateKey or *ed25519.PrivateKey, got %T`, src)
  126. }
  127. return blackmagic.AssignIfCompatible(dst, ptr)
  128. }
  129. func Ed25519PublicKey(dst, src interface{}) error {
  130. if jwkKey, ok := src.(jwk.Key); ok {
  131. var raw ed25519.PublicKey
  132. if err := jwkKey.Raw(&raw); err != nil {
  133. return errors.Wrapf(err, `failed to produce ed25519.PublicKey from %T`, src)
  134. }
  135. src = &raw
  136. }
  137. var ptr *ed25519.PublicKey
  138. switch src := src.(type) {
  139. case ed25519.PublicKey:
  140. ptr = &src
  141. case *ed25519.PublicKey:
  142. ptr = src
  143. case *crypto.PublicKey:
  144. tmp, ok := (*src).(ed25519.PublicKey)
  145. if !ok {
  146. return errors.New(`failed to retrieve ed25519.PublicKey out of *crypto.PublicKey`)
  147. }
  148. ptr = &tmp
  149. case crypto.PublicKey:
  150. tmp, ok := src.(ed25519.PublicKey)
  151. if !ok {
  152. return errors.New(`failed to retrieve ed25519.PublicKey out of crypto.PublicKey`)
  153. }
  154. ptr = &tmp
  155. default:
  156. return errors.Errorf(`expected ed25519.PublicKey or *ed25519.PublicKey, got %T`, src)
  157. }
  158. return blackmagic.AssignIfCompatible(dst, ptr)
  159. }