Class: H2C::M2C::SSWU

Inherits:
Object
  • Object
show all
Defined in:
lib/h2c/m2c/sswu.rb

Overview

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(curve, z) ⇒ SSWU

Constructor

Parameters:



12
13
14
15
16
17
18
# File 'lib/h2c/m2c/sswu.rb', line 12

def initialize(curve, z)
  @curve = curve
  @z = z
  f = curve.field
  @c1 = f.mod(-curve.param_b * f.inverse(curve.param_a))
  @c2 = f.mod(-f.inverse(z))
end

Instance Attribute Details

#c1Object (readonly)

Returns the value of attribute c1.



7
8
9
# File 'lib/h2c/m2c/sswu.rb', line 7

def c1
  @c1
end

#c2Object (readonly)

Returns the value of attribute c2.



7
8
9
# File 'lib/h2c/m2c/sswu.rb', line 7

def c2
  @c2
end

#curveObject (readonly)

Returns the value of attribute curve.



7
8
9
# File 'lib/h2c/m2c/sswu.rb', line 7

def curve
  @curve
end

#zObject (readonly)

Returns the value of attribute z.



7
8
9
# File 'lib/h2c/m2c/sswu.rb', line 7

def z
  @z
end

Instance Method Details

#map(u) ⇒ Array(Integer, Integer)

Outputs x and y are elements of the field F.

Parameters:

  • u (Integer)

Returns:

  • (Array(Integer, Integer))

    x and y



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/h2c/m2c/sswu.rb', line 23

def map(u)
  f = curve.field
  t1 = f.mod(f.power(u, 2) * f.mod(z))
  t2 = f.power(t1, 2)
  x1 = f.mod(t1 + t2)
  x1 = f.inverse(x1)
  e1 = x1.zero?
  x1 = f.mod(x1 + 1)
  x1 = e1 ? c2 : x1
  x1 = f.mod(x1 * c1)
  gx1 = f.power(x1, 2)
  gx1 = f.mod(gx1 + curve.param_a)
  gx1 = f.mod(gx1 * x1)
  gx1 = f.mod(gx1 + curve.param_b)
  x2 = f.mod(t1 * x1)
  t2 = f.mod(t1 * t2)
  gx2 = f.mod(gx1 * t2)
  e2 = square?(gx1)
  x = e2 ? x1 : x2
  y2 = e2 ? gx1 : gx2
  y = f.square_roots(y2)[0]
  e3 = sgn0(u) == sgn0(y)
  y = f.mod(e3 ? y : -y)
  curve.new_point([x, y])
end

#sgn0(x) ⇒ Object



54
55
56
57
# File 'lib/h2c/m2c/sswu.rb', line 54

def sgn0(x)
  res = x % 2
  curve.field.mod(1 - 2 * res)
end

#square?(x) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
52
# File 'lib/h2c/m2c/sswu.rb', line 49

def square?(x)
  test = curve.field.power(x, ((curve.field.prime - 1) / 2))
  [0, 1].include?(test)
end