class Rb25519::FField::EC

Attributes

field[R]

Public Class Methods

new(field, coeffs=nil) click to toggle source
# File lib/rb-pure25519.rb, line 332
def initialize(field, coeffs=nil)
  @coeffs = coeffs
  @field = field
end

Public Instance Methods

naive_points() click to toggle source
# File lib/rb-pure25519.rb, line 341
def naive_points
  points = [ECInfinity]
  @field.p.times do |x|
    @field.p.times do |y|
      points << [x,y] if on_curve(x,y)
    end
  end
  points
end
on_curve(x,y) click to toggle source
# File lib/rb-pure25519.rb, line 337
def on_curve(x,y)
  raise NotImplementedError.new
end
point_add(point_a, point_b) click to toggle source
# File lib/rb-pure25519.rb, line 351
def point_add(point_a, point_b)
  xa = point_a[0].kind_of?(FFieldValue) ? point_a[0] : @field[point_a[0]]
  xb = point_b[0].kind_of?(FFieldValue) ? point_b[0] : @field[point_b[0]]

  ya = point_a[1].kind_of?(FFieldValue) ? point_a[1] : @field[point_a[1]]
  yb = point_b[1].kind_of?(FFieldValue) ? point_b[1] : @field[point_b[1]]

  if xa == xb and ya == yb
    return double_point(point_a)
  end
  #puts "point_add: #{point_a.inspect}   + #{point_b.inspect}"

  # All the following operations are in F_p (eg, "mod p")
  
  s = (yb - ya) / (xb - xa)
  #puts "Slope: #{s}"

  xc = s**2 - xa - xb
  yc = (ya * -1) + (xa - xc) * s

  [xc, yc]
end
scale_double_add(k, point_a) click to toggle source
# File lib/rb-pure25519.rb, line 384
def scale_double_add(k, point_a)
  t = point_a

  bits = k.bit_length

  (bits-1).times.to_a.reverse.each do |bit|
    t = point_add( t, t )
    if (k >> bit) & 0x1 == 1
      t = point_add(t, point_a)
    end
  end
  t
end
scale_naive(k, point_a) click to toggle source
# File lib/rb-pure25519.rb, line 374
def scale_naive(k, point_a)
  point = point_a

  (k-1).times do
    point = point_add(point, point_a)
  end

  point
end