Method: JSON::JWK.decode

Defined in:
lib/json/jwk.rb

.decode(jwk) ⇒ Object



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