Class: JOSE::JWA::EdwardsPoint
- Inherits:
-
Object
- Object
- JOSE::JWA::EdwardsPoint
- Includes:
- Comparable
- Defined in:
- lib/jose/jwa/edwards_point.rb
Overview
A point on (twisted) Edwards curve.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#x ⇒ Object
Returns the value of attribute x.
-
#y ⇒ Object
Returns the value of attribute y.
-
#z ⇒ Object
Returns the value of attribute z.
Instance Method Summary collapse
- #*(x) ⇒ Object
-
#<=>(y) ⇒ Object
Check two points are equal.
- #decode_base(s, b) ⇒ Object
- #encode_base(b) ⇒ Object
- #initpoint(x, y) ⇒ Object
Instance Attribute Details
#x ⇒ Object
Returns the value of attribute x.
5 6 7 |
# File 'lib/jose/jwa/edwards_point.rb', line 5 def x @x end |
#y ⇒ Object
Returns the value of attribute y.
5 6 7 |
# File 'lib/jose/jwa/edwards_point.rb', line 5 def y @y end |
#z ⇒ Object
Returns the value of attribute z.
5 6 7 |
# File 'lib/jose/jwa/edwards_point.rb', line 5 def z @z end |
Instance Method Details
#*(x) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/jose/jwa/edwards_point.rb', line 43 def *(x) r = zero_elem s = self while x > 0 if (x % 2) > 0 r = r + s end s = s.double x = x / 2 end return r end |
#<=>(y) ⇒ Object
Check two points are equal.
57 58 59 60 61 62 63 64 65 66 |
# File 'lib/jose/jwa/edwards_point.rb', line 57 def <=>(y) # Need to check x1/z1 == x2/z2 and similarly for y, so cross- # multiply to eliminate divisions. xn1 = @x * y.z xn2 = y.x * @z yn1 = @y * y.z yn2 = y.y * @z return yn1 <=> yn2 if xn1 == xn2 return xn1 <=> xn2 end |
#decode_base(s, b) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/jose/jwa/edwards_point.rb', line 13 def decode_base(s, b) # Check that point encoding is of correct length. raise ArgumentError, "s must be #{(b/8)} bytes" if s.bytesize != (b / 8) # Extract signbit. s = s.dup xs = s.getbyte((b-1)/8) >> ((b-1) & 7) s.setbyte((b-1)/8, s.getbyte((b-1)/8) & ~(1 << 7)) # Decode y. If this fails, fail. y = self.class::BASE_FIELD.from_bytes(s, b) # Try to recover x. If it does not exist, or is zero and xs is # wrong, fail. x = solve_x2(y).sqrt raise ArgumentError, "decode error" if x.nil? or (x.zero? and xs != x.sign) # If sign of x isn't correct, flip it. x = -x if x.sign != xs # Return the constructed point. return x, y end |
#encode_base(b) ⇒ Object
32 33 34 35 36 37 38 39 40 41 |
# File 'lib/jose/jwa/edwards_point.rb', line 32 def encode_base(b) xp, yp = @x / @z, @y / @z # Encode y. s = yp.to_bytes(b) # Add sign bit of x to encoding. if xp.sign != 0 s.setbyte((b-1)/8, s.getbyte((b-1)/8) | (1 << ((b-1) % 8))) end return s end |
#initpoint(x, y) ⇒ Object
7 8 9 10 11 |
# File 'lib/jose/jwa/edwards_point.rb', line 7 def initpoint(x, y) @x = x @y = y @z = self.class::BASE_FIELD.make(1) end |