curve_key_pair.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package dhellman
  2. import (
  3. "errors"
  4. "git.ali33.ru/fcg-xvii/curve/v2"
  5. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  6. "git.ali33.ru/fcg-xvii/go-tools/json"
  7. )
  8. func randomCurveKeyPair(curve *tools.Curve) (*curveKeyPair, error) {
  9. pair := curveKeyPair{
  10. curve: curve,
  11. }
  12. var err error
  13. if pair.priv, err = randomCurveKeyPrivate(curve); err != nil {
  14. return nil, err
  15. }
  16. var pub *tools.Point
  17. if pub, err = curve.G().Mul(pair.priv.x); err != nil {
  18. return nil, err
  19. }
  20. pair.pub = &curveKeyPublic{
  21. p: pub,
  22. }
  23. return &pair, nil
  24. }
  25. type curveKeyPair struct {
  26. priv *curveKeyPrivate
  27. pub *curveKeyPublic
  28. curve *tools.Curve
  29. }
  30. func (s *curveKeyPair) Map() json.Map {
  31. return json.Map{
  32. "private": s.priv.Map(),
  33. "public": s.pub.Map(),
  34. }
  35. }
  36. func (s *curveKeyPair) MarshalJSON() ([]byte, error) {
  37. return s.Map().JSON(), nil
  38. }
  39. func (s *curveKeyPair) KeyPrivate() curve.KeyPrivate {
  40. return s.priv
  41. }
  42. func (s *curveKeyPair) KeyPublic() curve.KeyPublic {
  43. return s.pub
  44. }
  45. func (s *curveKeyPair) MessageEncode(data []byte, args ...any) (curve.Message, error) {
  46. if len(args) == 0 {
  47. return nil, errors.New("Не найден публичный ключ принимающей стороны")
  48. }
  49. pub, check := args[0].(*curveKeyPublic)
  50. if !check {
  51. return nil, errors.New("Неверный тип аргумента - публичный ключ принимающей стороны")
  52. }
  53. encoded, err := s.messageEncode(data, pub)
  54. if err != nil {
  55. return nil, err
  56. }
  57. mes := &message{
  58. encoded: encoded,
  59. }
  60. return mes, err
  61. }
  62. func (s *curveKeyPair) MessageDecode(mes curve.Message, args ...any) ([]byte, error) {
  63. if len(args) == 0 {
  64. return nil, errors.New("Не найден публичный ключ отправляющей стороны")
  65. }
  66. pub, check := args[0].(*curveKeyPublic)
  67. if !check {
  68. return nil, errors.New("Неверный тип аргумента - публичный ключ отправляющей стороны")
  69. }
  70. return s.messageDecode(mes.Encoded(), pub)
  71. }
  72. func (s *curveKeyPair) messageEncode(data []byte, pub *curveKeyPublic) ([]byte, error) {
  73. sec, err := s.priv.secret(pub, s.curve)
  74. if err != nil {
  75. return nil, err
  76. }
  77. return aesEncode(data, sec)
  78. }
  79. func (s *curveKeyPair) messageDecode(encoded []byte, pub *curveKeyPublic) ([]byte, error) {
  80. sec, err := s.priv.secret(pub, s.curve)
  81. if err != nil {
  82. return nil, err
  83. }
  84. return aesEncode(encoded, sec)
  85. }