ed25519.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package keys
  2. import (
  3. "crypto"
  4. "crypto/ed25519"
  5. "crypto/rand"
  6. "encoding/json"
  7. "errors"
  8. "github.com/DataDog/go-tuf/data"
  9. )
  10. func init() {
  11. SignerMap.Store(data.KeySchemeEd25519, NewP256Signer)
  12. VerifierMap.Store(data.KeySchemeEd25519, NewP256Verifier)
  13. }
  14. func NewP256Signer() Signer {
  15. return &ed25519Signer{}
  16. }
  17. func NewP256Verifier() Verifier {
  18. return &ed25519Verifier{}
  19. }
  20. type ed25519Verifier struct {
  21. PublicKey data.HexBytes `json:"public"`
  22. key *data.PublicKey
  23. }
  24. func (e *ed25519Verifier) Public() string {
  25. return string(e.PublicKey)
  26. }
  27. func (e *ed25519Verifier) Verify(msg, sig []byte) error {
  28. if !ed25519.Verify([]byte(e.PublicKey), msg, sig) {
  29. return errors.New("tuf: ed25519 signature verification failed")
  30. }
  31. return nil
  32. }
  33. func (e *ed25519Verifier) MarshalPublicKey() *data.PublicKey {
  34. return e.key
  35. }
  36. func (e *ed25519Verifier) UnmarshalPublicKey(key *data.PublicKey) error {
  37. e.key = key
  38. if err := json.Unmarshal(key.Value, e); err != nil {
  39. return err
  40. }
  41. if len(e.PublicKey) != ed25519.PublicKeySize {
  42. return errors.New("tuf: unexpected public key length for ed25519 key")
  43. }
  44. return nil
  45. }
  46. type Ed25519PrivateKeyValue struct {
  47. Public data.HexBytes `json:"public"`
  48. Private data.HexBytes `json:"private"`
  49. }
  50. type ed25519Signer struct {
  51. ed25519.PrivateKey
  52. keyType string
  53. keyScheme string
  54. keyAlgorithms []string
  55. }
  56. func GenerateEd25519Key() (*ed25519Signer, error) {
  57. _, private, err := ed25519.GenerateKey(rand.Reader)
  58. if err != nil {
  59. return nil, err
  60. }
  61. if err != nil {
  62. return nil, err
  63. }
  64. return &ed25519Signer{
  65. PrivateKey: ed25519.PrivateKey(data.HexBytes(private)),
  66. keyType: data.KeyTypeEd25519,
  67. keyScheme: data.KeySchemeEd25519,
  68. keyAlgorithms: data.HashAlgorithms,
  69. }, nil
  70. }
  71. func NewEd25519Signer(keyValue Ed25519PrivateKeyValue) *ed25519Signer {
  72. return &ed25519Signer{
  73. PrivateKey: ed25519.PrivateKey(data.HexBytes(keyValue.Private)),
  74. keyType: data.KeyTypeEd25519,
  75. keyScheme: data.KeySchemeEd25519,
  76. keyAlgorithms: data.HashAlgorithms,
  77. }
  78. }
  79. func (e *ed25519Signer) SignMessage(message []byte) ([]byte, error) {
  80. return e.Sign(rand.Reader, message, crypto.Hash(0))
  81. }
  82. func (e *ed25519Signer) MarshalPrivateKey() (*data.PrivateKey, error) {
  83. valueBytes, err := json.Marshal(Ed25519PrivateKeyValue{
  84. Public: data.HexBytes([]byte(e.PrivateKey.Public().(ed25519.PublicKey))),
  85. Private: data.HexBytes(e.PrivateKey),
  86. })
  87. if err != nil {
  88. return nil, err
  89. }
  90. return &data.PrivateKey{
  91. Type: e.keyType,
  92. Scheme: e.keyScheme,
  93. Algorithms: e.keyAlgorithms,
  94. Value: valueBytes,
  95. }, nil
  96. }
  97. func (e *ed25519Signer) UnmarshalPrivateKey(key *data.PrivateKey) error {
  98. keyValue := &Ed25519PrivateKeyValue{}
  99. if err := json.Unmarshal(key.Value, keyValue); err != nil {
  100. return err
  101. }
  102. *e = ed25519Signer{
  103. PrivateKey: ed25519.PrivateKey(data.HexBytes(keyValue.Private)),
  104. keyType: key.Type,
  105. keyScheme: key.Scheme,
  106. keyAlgorithms: key.Algorithms,
  107. }
  108. return nil
  109. }
  110. func (e *ed25519Signer) PublicData() *data.PublicKey {
  111. keyValBytes, _ := json.Marshal(ed25519Verifier{PublicKey: []byte(e.PrivateKey.Public().(ed25519.PublicKey))})
  112. return &data.PublicKey{
  113. Type: e.keyType,
  114. Scheme: e.keyScheme,
  115. Algorithms: e.keyAlgorithms,
  116. Value: keyValBytes,
  117. }
  118. }