Method: ECDSA.sign

Defined in:
lib/ecdsa/ext/sign_verify.rb

.sign(group, private_key, digest, temporary_key) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/ecdsa/ext/sign_verify.rb', line 5

def self.sign(group, private_key, digest, temporary_key)
  # Second part of step 1: Select ephemeral elliptic curve key pair
  # temporary_key was already selected for us by the caller
  r_point = (group.generator.to_jacobian * temporary_key).to_affine

  # Steps 2 and 3
  point_field = PrimeField.new(group.order)
  r = point_field.mod(r_point.x)
  return nil if r.zero?

  # Step 4, calculating the hash, was already performed by the caller.

  # Step 5
  e = normalize_digest(digest, group.bit_length)

  # Step 6
  s =
    point_field.mod(
      point_field.inverse(temporary_key) * (e + r * private_key)
    )
  return nil if s.zero?

  Signature.new r, s
end