curve.go 1019 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package elgamal
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "math/big"
  7. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  8. )
  9. func NewCurve(c *tools.Curve, ctx context.Context) (*Curve, error) {
  10. cc := &Curve{
  11. Curve: c,
  12. }
  13. return cc, cc.setupDataTable(ctx)
  14. }
  15. type Curve struct {
  16. *tools.Curve
  17. dTable map[byte]*tools.Point
  18. }
  19. func (s *Curve) bytePoint(p *tools.Point) (byte, error) {
  20. for key, val := range s.dTable {
  21. if val.IsEqual(p) {
  22. return key, nil
  23. }
  24. }
  25. return 0, fmt.Errorf("Не найден символ, соответствующий точке %v", p)
  26. }
  27. // Заполнение таблицы байт -> точка на кривой
  28. func (s *Curve) setupDataTable(ctx context.Context) error {
  29. s.dTable = make(map[byte]*tools.Point)
  30. dx := big.NewInt(1)
  31. for i := byte(0); i <= 254; i++ {
  32. // поиск точки
  33. p, _, err := s.SearchClosePoints(dx, ctx)
  34. if err != nil {
  35. return err
  36. }
  37. // check already exists - todo
  38. dx = tools.Add64(p.X(), 2)
  39. s.dTable[i] = p
  40. log.Println(i, p)
  41. }
  42. return nil
  43. }