Module: Decidim::BulletinBoard::JwkUtils
- Defined in:
- lib/decidim/bulletin_board/jwk_utils.rb
Constant Summary collapse
- JWK_PRIVATE_FIELDS =
[:d, :p, :q, :dp, :dq, :qi].freeze
Class Method Summary collapse
- .decode_open_ssl_bn(jwk_data) ⇒ Object
- .encode_open_ssl_bn(key_part) ⇒ Object
-
.import_private_key(json) ⇒ Object
TODO: remove everything below here when https://github.com/jwt/ruby-jwt/pull/375 is released.
- .private_export(jwk) ⇒ Object
- .private_key?(json) ⇒ Boolean
- .thumbprint(json) ⇒ Object
Class Method Details
.decode_open_ssl_bn(jwk_data) ⇒ Object
42 43 44 45 46 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 42 def self.decode_open_ssl_bn(jwk_data) return nil unless jwk_data OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data), 2) end |
.encode_open_ssl_bn(key_part) ⇒ Object
38 39 40 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 38 def self.encode_open_ssl_bn(key_part) ::Base64.urlsafe_encode64(key_part.to_s(2), padding: false) end |
.import_private_key(json) ⇒ Object
TODO: remove everything below here when https://github.com/jwt/ruby-jwt/pull/375 is released
17 18 19 20 21 22 23 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 17 def self.import_private_key(json) jwk = JWT::JWK.import(json) jwk.keypair.set_key(decode_open_ssl_bn(json[:n]), decode_open_ssl_bn(json[:e]), decode_open_ssl_bn(json[:d])) jwk.keypair.set_factors(decode_open_ssl_bn(json[:p]), decode_open_ssl_bn(json[:q])) jwk.keypair.set_crt_params(decode_open_ssl_bn(json[:dp]), decode_open_ssl_bn(json[:dq]), decode_open_ssl_bn(json[:qi])) jwk end |
.private_export(jwk) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 25 def self.private_export(jwk) raise "Not a private key" unless jwk.private? jwk.export.merge( d: encode_open_ssl_bn(jwk.keypair.d), p: encode_open_ssl_bn(jwk.keypair.p), q: encode_open_ssl_bn(jwk.keypair.q), dp: encode_open_ssl_bn(jwk.keypair.dmp1), dq: encode_open_ssl_bn(jwk.keypair.dmq1), qi: encode_open_ssl_bn(jwk.keypair.iqmp) ) end |
.private_key?(json) ⇒ Boolean
12 13 14 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 12 def self.private_key?(json) (json.keys & JWK_PRIVATE_FIELDS).any? end |
.thumbprint(json) ⇒ Object
8 9 10 |
# File 'lib/decidim/bulletin_board/jwk_utils.rb', line 8 def self.thumbprint(json) Base64.urlsafe_encode64(Digest::SHA256.digest(json.slice(:e, :kty, :n).to_json), padding: false) end |