Module: JWT::Algos::Ecdsa

Defined in:
lib/jwt/algos/ecdsa.rb

Constant Summary collapse

SUPPORTED =
%w[ES256 ES384 ES512].freeze
NAMED_CURVES =
{
  'prime256v1' => 'ES256',
  'secp384r1' => 'ES384',
  'secp521r1' => 'ES512'
}.freeze

Class Method Summary collapse

Class Method Details

.sign(to_sign) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'lib/jwt/algos/ecdsa.rb', line 13

def sign(to_sign)
  algorithm, msg, key = to_sign.values
  key_algorithm = NAMED_CURVES[key.group.curve_name]
  if algorithm != key_algorithm
    raise IncorrectAlgorithm, "payload algorithm is #{algorithm} but #{key_algorithm} signing key was provided"
  end

  digest = OpenSSL::Digest.new(algorithm.sub('ES', 'sha'))
  SecurityUtils.asn1_to_raw(key.dsa_sign_asn1(digest.digest(msg)), key)
end

.verify(to_verify) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/jwt/algos/ecdsa.rb', line 24

def verify(to_verify)
  algorithm, public_key, signing_input, signature = to_verify.values
  key_algorithm = NAMED_CURVES[public_key.group.curve_name]
  if algorithm != key_algorithm
    raise IncorrectAlgorithm, "payload algorithm is #{algorithm} but #{key_algorithm} verification key was provided"
  end
  digest = OpenSSL::Digest.new(algorithm.sub('ES', 'sha'))
  public_key.dsa_verify_asn1(digest.digest(signing_input), SecurityUtils.raw_to_asn1(signature, public_key))
end