78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# File 'lib/json/jwk.rb', line 78
def decode(jwk)
jwk = jwk.with_indifferent_access
case jwk[:kty].to_s
when 'RSA'
e = OpenSSL::BN.new UrlSafeBase64.decode64(jwk[:e]), 2
n = OpenSSL::BN.new UrlSafeBase64.decode64(jwk[:n]), 2
key = OpenSSL::PKey::RSA.new
key.e = e
key.n = n
key
when 'EC'
if RUBY_VERSION >= '2.0.0'
key = OpenSSL::PKey::EC.new ecdsa_curve_name_for(jwk[:crv])
x, y = [jwk[:x], jwk[:y]].collect do |decoded|
OpenSSL::BN.new UrlSafeBase64.decode64(decoded), 2
end
key.public_key = OpenSSL::PKey::EC::Point.new(key.group).mul(x, y)
key
else
raise UnknownAlgorithm.new('ECDSA JWK Decoding requires Ruby 2.0+')
end
else
raise UnknownAlgorithm.new('Unknown Algorithm')
end
end
|