/
algos.rb
66 lines (57 loc) · 1.49 KB
/
algos.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# frozen_string_literal: true
begin
require 'rbnacl'
rescue LoadError
raise if defined?(RbNaCl)
end
require 'openssl'
require 'jwt/algos/hmac'
require 'jwt/algos/eddsa'
require 'jwt/algos/ecdsa'
require 'jwt/algos/rsa'
require 'jwt/algos/ps'
require 'jwt/algos/none'
require 'jwt/algos/unsupported'
require 'jwt/algos/algo_wrapper'
module JWT
module Algos
extend self
ALGOS = [Algos::Ecdsa,
Algos::Rsa,
Algos::Eddsa,
Algos::Ps,
Algos::None,
Algos::Unsupported].tap do |l|
if ::JWT.rbnacl_6_or_greater?
require_relative 'algos/hmac_rbnacl'
l.unshift(Algos::HmacRbNaCl)
elsif ::JWT.rbnacl?
require_relative 'algos/hmac_rbnacl_fixed'
l.unshift(Algos::HmacRbNaClFixed)
else
l.unshift(Algos::Hmac)
end
end.freeze
def find(algorithm)
indexed[algorithm && algorithm.downcase]
end
def create(algorithm)
Algos::AlgoWrapper.new(*find(algorithm))
end
def implementation?(algorithm)
(algorithm.respond_to?(:valid_alg?) && algorithm.respond_to?(:verify)) ||
(algorithm.respond_to?(:alg) && algorithm.respond_to?(:sign))
end
private
def indexed
@indexed ||= begin
fallback = [nil, Algos::Unsupported]
ALGOS.each_with_object(Hash.new(fallback)) do |cls, hash|
cls.const_get(:SUPPORTED).each do |alg|
hash[alg.downcase] = [alg, cls]
end
end
end
end
end
end