spice auth过程分析

news2024/11/14 16:32:08

1、客户端选择认证方法

Client authentication method selection

抓包分析

{

Authentication selected by client: Spice (1)

}

代码分析

spice_channel_send_link(channel);

if (!spice_channel_recv_link_hdr(channel) ||

!spice_channel_recv_link_msg(channel) ||

!spice_channel_recv_auth(channel))

goto cleanup;

while (spice_channel_iterate(channel));

if (!spice_channel_test_common_capability(channel, SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION)) {

CHANNEL_DEBUG(channel, "Server supports spice ticket auth only");

if ((event = spice_channel_send_spice_ticket(channel)) != SPICE_CHANNEL_NONE)

goto error;

} else {

SpiceLinkAuthMechanism auth = { 0, };

if (spice_channel_test_common_capability(channel, SPICE_COMMON_CAP_AUTH_SPICE)) {

auth.auth_mechanism = GUINT32_TO_LE(SPICE_COMMON_CAP_AUTH_SPICE); //发送spice认证方式

spice_channel_write(channel, &auth, sizeof(auth));

if ((event = spice_channel_send_spice_ticket(channel)) != SPICE_CHANNEL_NONE) //发送client ticket

goto error;

} else {

g_warning("No compatible AUTH mechanism");

goto error;

}

}

2、Client ticket

抓包分析

{

Ticket - client: 542...

}

代码分析

if (!spice_channel_test_common_capability(channel, SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION)) {

CHANNEL_DEBUG(channel, "Server supports spice ticket auth only");

if ((event = spice_channel_send_spice_ticket(channel)) != SPICE_CHANNEL_NONE)

goto error;

} else {

SpiceLinkAuthMechanism auth = { 0, };

if (spice_channel_test_common_capability(channel, SPICE_COMMON_CAP_AUTH_SPICE)) {

auth.auth_mechanism = GUINT32_TO_LE(SPICE_COMMON_CAP_AUTH_SPICE); //发送spice认证方式

spice_channel_write(channel, &auth, sizeof(auth));

if ((event = spice_channel_send_spice_ticket(channel)) != SPICE_CHANNEL_NONE) //发送client ticket

goto error;

} else {

g_warning("No compatible AUTH mechanism");

goto error;

}

}

3、Server ticket

抓包分析

{

Link result: OK (0)

}

代码分析

static void reds_handle_read_link_done(void *opaque)

{

auto link = static_cast<RedLinkInfo *>(opaque);

RedsState *reds = link->reds;

SpiceLinkMess *link_mess = link->link_mess;

uint32_t num_caps;

uint32_t *caps;

int auth_selection;

unsigned int i;

link_mess->caps_offset = GUINT32_FROM_LE(link_mess->caps_offset);

link_mess->connection_id = GUINT32_FROM_LE(link_mess->connection_id);

link_mess->num_channel_caps = GUINT32_FROM_LE(link_mess->num_channel_caps);

link_mess->num_common_caps = GUINT32_FROM_LE(link_mess->num_common_caps);

/* Prevent DoS. Currently we defined only 13 capabilities,

* I expect 1024 to be valid for quite a lot time */

if (link_mess->num_channel_caps > 1024 || link_mess->num_common_caps > 1024) {

reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);

reds_link_free(link);

return;

}

num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;

caps = reinterpret_cast<uint32_t *>(reinterpret_cast<uint8_t *>(link_mess) +link_mess->caps_offset);

if (num_caps && (num_caps * sizeof(uint32_t) + link_mess->caps_offset > link->link_header.size || link_mess->caps_offset < sizeof(*link_mess))) {

reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);

reds_link_free(link);

return;

}

for(i = 0; i < num_caps;i++)

caps[i] = GUINT32_FROM_LE(caps[i]);

auth_selection = red_link_info_test_capability(link,SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);

if (!reds_security_check(link)) {

if (red_stream_is_ssl(link->stream)) {

spice_warning("spice channels %d should not be encrypted", link_mess->channel_type);

reds_send_link_error(link, SPICE_LINK_ERR_NEED_UNSECURED);

} else {

spice_warning("spice channels %d should be encrypted", link_mess->channel_type);

reds_send_link_error(link, SPICE_LINK_ERR_NEED_SECURED);

}

reds_link_free(link);

return;

}

if (!reds_send_link_ack(reds, link)) {

reds_link_free(link);

return;

}

if (!auth_selection) {

if (reds->config->sasl_enabled && !link->skip_auth) {

spice_warning("SASL enabled, but peer supports only spice authentication");

reds_send_link_error(link, SPICE_LINK_ERR_VERSION_MISMATCH);

return;

}

spice_warning("Peer doesn't support AUTH selection");

reds_get_spice_ticket(link);

} else {

red_stream_async_read(link->stream, reinterpret_cast<uint8_t *>(&link->auth_mechanism),

sizeof(SpiceLinkAuthMechanism), reds_handle_auth_mechanism, link);

}

}

发送ticket数据包

static void reds_handle_auth_mechanism(void *opaque)

{

auto link = static_cast<RedLinkInfo *>(opaque);

RedsState *reds = link->reds;

spice_debug("Auth method: %d", link->auth_mechanism.auth_mechanism);

link->auth_mechanism.auth_mechanism = GUINT32_FROM_LE(link->auth_mechanism.auth_mechanism);

if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SPICE&& !reds->config->sasl_enabled) {

reds_get_spice_ticket(link);

#if HAVE_SASL

} else if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SASL) {

spice_debug("Starting SASL");

reds_start_auth_sasl(link);

#endif

} else {

spice_warning("Unknown auth method, disconnecting");

if (reds->config->sasl_enabled) {

spice_warning("Your client doesn't handle SASL?");

}

reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);

reds_link_free(link);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何设计线圈操作指导

Allegro如何设计线圈操作指导 在做PCB设计的时候,在特殊场合时候需要设计线圈,Allegro支持快速设计出线圈,如下图 具体操作如下 选择File选择Change Editor

实现树莓派homeassistant OS远程控制内网穿透--ddnsto教程

一、两种穿透服务 1、molohub 一种是论坛提供的molohub&#xff0c;但是可能因为自己这边的网络原因在配置过程中一直无法连接到服务器&#xff0c;无法绑定github&#xff0c;因此放弃molohub的方法。如下图所示。molohub教程如下&#xff0c;不再赘述。 molohub的Github教程…

ejson4cpp——一个使用极致简单且性能可比rapidjson的C++json解析库

文章目录ejson4cpp快速开始要求安装与引入开始使用常见用法API介绍通过命名风格识别API宏定义FROM_JSON_FUNC&FROM_JSON_FRIEND_FUNCTO_JSON_FUNC&TO_JSON_FRIEND_FUNCAUTO_GEN_NON_INTRUSIVE&AUTO_GEN_INTRUSIVEENABLE_JSON_COUTFromJSON系列函数参数说明使用示例…

WireShark从入门到精通

一、什么是WireShark&#xff1f;Wireshark 是一个开源抓包工具或者叫网络嗅探器&#xff0c;用于分析网络流量和分析数据包。其实WireShark以前的名字不叫WireShark&#xff0c;以前都叫做Ethereal&#xff0c;于1998 年首次开发&#xff0c;直到 2006 年才改为 Wireshark。Wi…

powerdns 系列之二 PowerDNS Authoritative Server

PowerDNS Authoritative Server 权威服务器&#xff0c;直接查询数据库去尝试解析&#xff0c;数据库中若不存在此记录&#xff0c;则直接返回空结果。 os: centos 7.8.2003 pnds: 4.7.3 安装 pdns 安装 pdns auth yum install epel-release yum-plugin-priorities curl -o…

Alibaba微服务组件Nacos注册中心学习笔记

1. 什么是 Nacos 什么是 Nacos官方网站:什么是 Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服…

Vue前端项目【尚品汇】

Vue前端项目【尚品汇】1. 说明2. 对项目创建3.结构4. 项目运行起来时&#xff0c;浏览器自动打开5.关闭ESLint校验功能1. 说明 学习完了Vue后并没有一个整体的项目&#xff0c;让我明白前端的工程化开发。因此在B站找了一个开源的项目进行练手&#xff0c;并在这里进行记录。 …

深度学习理论介绍

在机器学习理论介绍中说过&#xff0c;深度学习是机器学习的一种技术&#xff0c;下面我们具体来看下。 1、 定义 深度学习首先是一种机器学习。深度学习的基础&#xff0c;叫做神经网络&#xff0c;这本身就是一种机器学习算法。 深度神经网络&#xff08;Deep Neural Netwo…

产品小白如何从模仿开始学习Axure

​有一些小伙伴有这样的疑问&#xff0c;如果想学习产品经理的知识&#xff0c;但是从来对产品经理完全没有认识&#xff0c;该怎样去开始学习呢&#xff1f; 对于这种情况的小伙伴&#xff0c;有个建议是可以先从axure的学习入手。 那么问题又来了&#xff0c;应该如何开始axu…

只靠石墨烯电池,撑不起两轮电动车的“高端梦”

文|智能相对论作者|陈明涛在两轮电动车上&#xff0c;“石墨烯”电池已经成为品牌标配。雅迪、爱玛、台铃等都有搭载石墨烯电池的车型&#xff0c;雅迪的TTFAR石墨烯电池已经迭代到第4代&#xff0c;而第3代Plus电池搭载在冠能3 E9 PRO上完成量产上市&#xff1b;爱玛、台铃都和…

(侯捷C++)1.1面向对象高级编程(上)

一.C编程简介 1.C历史 B语言 → C语言 → C语言&#xff08;new C → C with Class → C&#xff09; 面向对象的语言&#xff1a;C、Java、C# 2.C演化 C 98(1.0) → C 03 → C 11(2.0) → C 14 Class两个经典分类&#xff1a;有指针&#xff08;Complex类为例&#xff0…

python经典例题

目录标题1&#xff0c;计算数字的阶乘2&#xff0c;区间内的所有素数3&#xff0c;求前n个数字的平方和4&#xff0c;移除列表中的多个元素5&#xff0c;列表去重6&#xff0c;对简单列表元素排序7&#xff0c;对复杂列表元素排序8&#xff0c;读取成绩问卷并排序-读取文件&…

在MySQL5基础上安装MySQL8解压版安装服务指向MySQL5的问题

Windows10在MySQL5解压版基础上安装MySQL8解压版后服务启动失败 1. 遇到的问题&#xff1a; MySQL8目录下没有生成data文件夹启动服务失败&#xff0c;右键服务属性&#xff0c;可执行文件的路径竟然是MySQL目录下的日志文件在MySQL5目录下&#xff0c;日志内容会提示读取了M…

【C语言】动态内存实现通讯录(malloc,calloc,realloc)

目录 一、为什么要存在动态内存开辟 二、动态内存函数 2.1 malloc 2.1.1 函数介绍 2.1.2 函数的使用 2.1.3 free 2.2 calloc 2.2.1 函数介绍 2.2.2 函数的使用 2.3 realloc 2.3.1 函数的介绍 2.3.2 函数的使用 三、改进通讯录 3.1 初始化 3.2 增加信息 3.3 排序&am…

R语言贝叶斯方法在生态环境领域中的高阶技术应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域&#xff0c;其火爆程度已经跨越了学术圈&#xff0c;如促使其自成统计江湖一派的贝叶斯定理在热播美剧《The Big Bang Theory》中都要秀一把。贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于…

从正则表达式到NFA

一、正则表达式到NFA的基本结构 1. 我们先回顾一下 RE 的三个基本操作&#xff1a; 可选&#xff08;alternative&#xff09;&#xff1a;对于给定的两个正则表达式 M 和 N&#xff0c;选择操作符&#xff08; | &#xff09;形成一个新的正则表达式 M|N &#xff0c;如果一…

28.Isaac教程--使用Sight的远程操纵杆

使用Sight的远程操纵杆 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用Sight的远程操纵杆设置 Isaac 应用程序以使用虚拟游戏手柄小部件关于虚拟游戏手柄小部件使用虚拟游戏手柄小部件运作模式手柄模式鼠标模式键盘模式控制机器人运…

设计模式_行为型模式 -《责任链模式》

设计模式_行为型模式 -《责任链模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象…

windows最小化安装mysql8

第一步&#xff1a;下载 从官网下载&#xff0c;https://dev.mysql.com/downloads/mysql 第二步&#xff1a;安装 下载后解压到目录即可。 我这里解压到D:\MYSQL\mysql-8.0.32-winx64\mysql-8.0.32-winx64 第三步&#xff1a;初始化配置 1、添加系统变量 在系统变量PATH后…

【C++】从0到1入门C++编程学习笔记 - 基础入门篇:数组

文章目录一、概述二、一维数组2.1 一维数组定义方式2.2 一维数组数组名2.3 C 实现冒泡排序三、二维数组3.1 二维数组定义方式3.2 二维数组数组名3.3 二维数组应用案例一、概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a;数…