Sha256: b1216db596656fbab9f3fdcafa56fd525a2fbeb18bec5e3ff823f6df58b1b523

Contents?: true

Size: 1.17 KB

Versions: 4

Compression:

Stored size: 1.17 KB

Contents

# frozen_string_literal: true

module Decidim
  module BulletinBoard
    module JwkUtils
      JWK_PRIVATE_FIELDS = [:d, :p, :q, :dp, :dq, :qi].freeze

      def self.thumbprint(json)
        Base64.urlsafe_encode64(Digest::SHA256.digest(json.slice(:e, :kty, :n).to_json), padding: false)
      end

      def self.private_key?(json)
        (json.keys & JWK_PRIVATE_FIELDS).any?
      end

      def self.import_private_key(json)
        JWT::JWK.import(json)
      end

      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

      def self.encode_open_ssl_bn(key_part)
        ::Base64.urlsafe_encode64(key_part.to_s(2), padding: false)
      end

      def self.decode_open_ssl_bn(jwk_data)
        return nil unless jwk_data

        OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data), 2)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
decidim-bulletin_board-0.24.4 lib/decidim/bulletin_board/jwk_utils.rb
decidim-bulletin_board-0.24.3 lib/decidim/bulletin_board/jwk_utils.rb
decidim-bulletin_board-0.24.2 lib/decidim/bulletin_board/jwk_utils.rb
decidim-bulletin_board-0.24.1 lib/decidim/bulletin_board/jwk_utils.rb