diff --git a/lib/jwt/jwk/key_abstract.rb b/lib/jwt/jwk/key_abstract.rb index b9271469..1251e2bc 100644 --- a/lib/jwt/jwk/key_abstract.rb +++ b/lib/jwt/jwk/key_abstract.rb @@ -22,6 +22,10 @@ def export(_options = {}) raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" end + protected + + attr_writer :kid + class << self def import(_jwk_data) raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'" diff --git a/lib/jwt/jwk/rsa.rb b/lib/jwt/jwk/rsa.rb index 431a809a..9cf95df3 100644 --- a/lib/jwt/jwk/rsa.rb +++ b/lib/jwt/jwk/rsa.rb @@ -9,7 +9,8 @@ class RSA < KeyAbstract def initialize(keypair, kid = nil) raise ArgumentError, 'keypair must be of type OpenSSL::PKey::RSA' unless keypair.is_a?(OpenSSL::PKey::RSA) - super(keypair, kid || self.class.generate_kid(keypair.public_key)) + super(keypair, kid) + self.kid ||= generate_kid end def private? @@ -35,6 +36,12 @@ def export(options = {}) private + def generate_kid + sequence = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(public_key.n), + OpenSSL::ASN1::Integer.new(public_key.e)]) + OpenSSL::Digest::SHA256.hexdigest(sequence.to_der) + end + def append_private_parts(the_hash) the_hash.merge( d: encode_open_ssl_bn(keypair.d), @@ -59,12 +66,6 @@ def import(jwk_data) self.new(rsa_pkey(pkey_params), kid) end - def generate_kid(public_key) - sequence = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(public_key.n), - OpenSSL::ASN1::Integer.new(public_key.e)]) - OpenSSL::Digest::SHA256.hexdigest(sequence.to_der) - end - private def jwk_attributes(jwk_data, *attributes)