Class: RbNaCl::GroupElements::Curve25519

Inherits:
Object
  • Object
show all
Extended by:
Sodium
Includes:
KeyComparator, Serializable
Defined in:
lib/rbnacl/group_elements/curve25519.rb

Overview

Points provide the interface to NaCl's Curve25519 high-speed elliptic curve cryptography, which can be used for implementing Diffie-Hellman and other forms of public key cryptography (e.g. RbNaCl::Box)

Objects of the Point class represent points on Edwards curves. NaCl defines a base point (the "standard group element") which we can multiply by an arbitrary integer. This is how NaCl computes public keys from private keys.

Constant Summary collapse

STANDARD_GROUP_ELEMENT =

NaCl's Curve25519 base point (a.k.a. standard group element), serialized as hex

["0900000000000000000000000000000000000000000000000000000000000000"].pack("H*").freeze
STANDARD_GROUP_ORDER =

Order of the standard group

2**252 + 27_742_317_777_372_353_535_851_937_790_883_648_493
SCALARBYTES =

Number of bytes in a scalar on this curve

32
BYTES =
32

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Sodium

primitive, sodium_constant, sodium_function, sodium_function_with_return_code, sodium_primitive, sodium_type

Methods included from Serializable

#inspect, #to_s, #to_str

Methods included from KeyComparator

#<=>, #==

Constructor Details

#initialize(point) ⇒ RbNaCl::Point

Creates a new Point from the given serialization

Parameters:

  • point (String)

    location of a group element (32-bytes)



44
45
46
47
48
49
50
# File 'lib/rbnacl/group_elements/curve25519.rb', line 44

def initialize(point)
  @point = point.to_str

  # FIXME: really should have a separate constant here for group element size
  # Group elements and scalars are both 32-bits, but that's for convenience
  Util.check_length(@point, SCALARBYTES, "group element")
end

Class Attribute Details

.base_pointObject (readonly)

Returns the value of attribute base_point.



85
86
87
# File 'lib/rbnacl/group_elements/curve25519.rb', line 85

def base_point
  @base_point
end

Class Method Details

.baseRbNaCl::Point

NaCl's standard base point for all Curve25519 public keys

Returns:

  • (RbNaCl::Point)

    standard base point (a.k.a. standard group element)



81
82
83
# File 'lib/rbnacl/group_elements/curve25519.rb', line 81

def self.base
  @base_point
end

Instance Method Details

#mult(integer) ⇒ RbNaCl::Point

Multiply the given integer by this point This ordering is a bit confusing because traditionally the point would be the right-hand operand.

Parameters:

  • integer (String)

    value to multiply with this Point (32-bytes)

Returns:

  • (RbNaCl::Point)

    result as a Point object



59
60
61
62
63
64
65
66
67
# File 'lib/rbnacl/group_elements/curve25519.rb', line 59

def mult(integer)
  integer = integer.to_str
  Util.check_length(integer, SCALARBYTES, "integer")

  result = Util.zeros(SCALARBYTES)
  self.class.scalarmult_curve25519(result, integer, @point)

  self.class.new(result)
end

#to_bytesString

Return the point serialized as bytes

Returns:

  • (String)

    32-byte string representing this point



72
73
74
# File 'lib/rbnacl/group_elements/curve25519.rb', line 72

def to_bytes
  @point
end