curve.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package elgamal
  2. import (
  3. "context"
  4. "fmt"
  5. "math/big"
  6. "git.ali33.ru/fcg-xvii/curve/v2/tools"
  7. "git.ali33.ru/fcg-xvii/go-tools/json"
  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) Map() json.Map {
  20. return json.Map{
  21. "curve": s.Curve.Map(),
  22. "d-table": s.dTable,
  23. }
  24. }
  25. func (s *Curve) bytePoint(p *tools.Point) (byte, error) {
  26. for key, val := range s.dTable {
  27. if val.IsEqual(p) {
  28. return key, nil
  29. }
  30. }
  31. return 0, fmt.Errorf("Не найден символ, соответствующий точке %v", p)
  32. }
  33. // Заполнение таблицы байт -> точка на кривой
  34. func (s *Curve) setupDataTable(ctx context.Context) error {
  35. s.dTable = make(map[byte]*tools.Point)
  36. /*
  37. dx := big.NewInt(1)
  38. for i := byte(0); i <= 254; i++ {
  39. // поиск точки
  40. p, _, err := s.SearchClosePoints(dx, ctx)
  41. if err != nil {
  42. return err
  43. }
  44. // check already exists - todo
  45. dx = tools.Add64(p.X(), 2)
  46. s.dTable[i] = p
  47. log.Println(i, p)
  48. }
  49. */
  50. g := s.G()
  51. for i := int64(0); i <= 254; i++ {
  52. p, _ := g.Mul(big.NewInt(i + 1))
  53. s.dTable[byte(i)] = p
  54. }
  55. return nil
  56. }