docs: def generate_certificate(
          ctx, slot, management_key, pin, public_key, subject, valid_days):
      """
      Generate a self-signed X.509 certificate.
  
      A self-signed certificate is generated and written to one of the slots on
      the YubiKey. A private key need to exist in the slot.
  
      \b
      SLOT            PIV slot where private key is stored.
      PUBLIC-KEY      File containing a public key. Use '-' to use stdin.
      """
      controller = ctx.obj['controller']
      _ensure_authenticated(
          ctx, controller, pin, management_key, require_pin_and_key=True)
  
      data = public_key.read()
      public_key = serialization.load_pem_public_key(
          data, default_backend())
  
      now = datetime.datetime.now()
      valid_to = now + datetime.timedelta(days=valid_days)
  
      try:
          controller.generate_self_signed_certificate(
              slot, public_key, subject, now, valid_to,
              touch_callback=prompt_for_touch)
  
      except APDUError as e:
          logger.error('Failed to generate certificate for slot %s', slot,
                       exc_info=e)
          ctx.fail('Certificate generation failed.')