class JWT::JWK::OKPRbNaCl

def check_jwk_params!(key_params, _given_params)

def check_jwk_params!(key_params, _given_params)
  raise JWT::JWKError, "Incorrect 'kty' value: #{key_params[:kty]}, expected #{KTY}" unless key_params[:kty] == KTY
end

def export(options = {})

def export(options = {})
  exported = parameters.clone
  exported.reject! { |k, _| OKP_PRIVATE_KEY_ELEMENTS.include?(k) } unless private? && options[:include_private] == true
  exported
end

def extract_key_params(key)

def extract_key_params(key)
  case key
  when JWT::JWK::KeyBase
    key.export(include_private: true)
  when RbNaCl::Signatures::Ed25519::SigningKey
    @signing_key = key
    @verify_key = key.verify_key
    parse_okp_key_params(@verify_key, @signing_key)
  when RbNaCl::Signatures::Ed25519::VerifyKey
    @signing_key = nil
    @verify_key = key
    parse_okp_key_params(@verify_key)
  when Hash
    key.transform_keys(&:to_sym)
  else
    raise ArgumentError, 'key must be of type RbNaCl::Signatures::Ed25519::SigningKey, RbNaCl::Signatures::Ed25519::VerifyKey or Hash with key parameters'
  end
end

def import(jwk_data)

def import(jwk_data)
  new(jwk_data)
end

def initialize(key, params = nil, options = {})

def initialize(key, params = nil, options = {})
  params ||= {}
  # For backwards compatibility when kid was a String
  params = { kid: params } if params.is_a?(String)
  key_params = extract_key_params(key)
  params = params.transform_keys(&:to_sym)
  check_jwk_params!(key_params, params)
  super(options, key_params.merge(params))
end

def key_digest

def key_digest
  Thumbprint.new(self).to_s
end

def members

def members
  OKP_PUBLIC_KEY_ELEMENTS.each_with_object({}) { |i, h| h[i] = self[i] }
end

def parse_okp_key_params(verify_key, signing_key = nil)

def parse_okp_key_params(verify_key, signing_key = nil)
  params = {
    kty: KTY,
    crv: 'Ed25519',
    x: ::JWT::Base64.url_encode(verify_key.to_bytes)
  }
  if signing_key
    params[:d] = ::JWT::Base64.url_encode(signing_key.to_bytes)
  end
  params
end

def private?

def private?
  !signing_key.nil?
end

def signing_key

def signing_key
  return @signing_key if defined?(@signing_key)
  @signing_key = signing_key_from_parameters
end

def signing_key_from_parameters

def signing_key_from_parameters
  return nil unless self[:d]
  RbNaCl::Signatures::Ed25519::SigningKey.new(::JWT::Base64.url_decode(self[:d]))
end

def verify_key

def verify_key
  return @verify_key if defined?(@verify_key)
  @verify_key = verify_key_from_parameters
end

def verify_key_from_parameters

def verify_key_from_parameters
  RbNaCl::Signatures::Ed25519::VerifyKey.new(::JWT::Base64.url_decode(self[:x]))
end