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