vsomeip之E2E

1、AUTOSAR_E2E

E2E的概念是在运行时对与安全相关的数据交互进行保护,以防止通信链路故障的影响。基本实现方式是在要保护的数据区添加额外的E2E Header。发送端负责添加E2E Header,接收端会对Header进行校验检查,保证数据的完整性。

参考 AUTOSAR_PRS_E2EProtocol Specification R20-11 ,规定了不同的E2E Profiles,如1,2,4,5,6,7,8,11,22等

以E2E Profile 4为例,规范中定义了Profile 4 包含的控制字段Length、Counter、CRC、DataID,以及Header的数据结构

1.1 E2E Profile 4 Header的数据结构

Length : 16位,为了支持可变长度引入此字段。

          Length = user data + E2E Header(CRC + Counter + Length + DataID)

Counter :16位, 取值 0 ~ 0xFFFF

DataID :32位,必须是全局唯一的,用户定义

CRC :32位,应该使用 Crc_CalculateCRC32P4() 函数 [SWS CRCLibrary],CRC32 0x1F4ACFB13多项式   ,确保高检测率和高汉明距离

在 E2E Profile 4, CRC计算包含 整个 E2E Header(CRC字段除外) 和 user data(RS_E2E_08531)

整个Header字段被编码为:

(1)大端:(最重要的字节在前面) - 由Profile规定,PS:高字节在前,低字节在后

(2)LSB(字节内的最低有效位)先传输 - 由TCP/IP总线强制

1.2 Creation of E2E-Header

1.2.1 E2E_P04Project

E2E_P04Project函数执行图表所示的步骤

E2E_P04Protect() 中 ”Verify inputs of the protect function”执行如下的步骤:

"Compute offset" 执行如下步骤

 

 “Write Length” 执行步骤

 “Write Counter”执行步骤:

“Wirte DataID” 执行步骤:

 “Compute CRC”步骤:

“Write CRC” 步骤:

“Increment Counter” 步骤:

 1.2.2 E2E_P04Forward

        E2E Profile 4的E2E_P04Forward()函数由SW-C调用,以保护其应用程序数据,并转发接收 到的E2E-Status,用于基于面向服务通信的信号转换等用例。 如果接收到的 E2E状态等于E2E_P_OK,那么函数的行为应该与E2E_P04Protect()相同。

1.3 Evaluation of the E2E-Header

目录

1、AUTOSAR_E2E

1.1 E2E Profile 4 Header的数据结构

1.2 Creation of E2E-Header

1.2.1 E2E_P04Project

 1.2.2 E2E_P04Forward

1.3 Evaluation of the E2E-Header

1.3.1 E2E_P04Check


        E2E_P04Check函数按照本节中的以下七个图和PRS_E2EProtocol_00367图指定的操作。

E2E_P04Check() 函数中 ”Verify inputs of the check function” 执行步骤

"Read Length" 步骤:

“Read Counter” 步骤:

 “Read DataID” 步骤:

“Read CRC” 步骤:

“Do Checks” 步骤:

 2、vsomeip E2E

 2.1 概要

vsomeip中也实现了E2E的相关机制,包括 Profile 1、Profile 4 和 Profile custom,整体是以插件的形式执行。

e2e源码文件路径: vsomeip-x.x.xx.x/implementation/e2e_protection/

2.2 实现流程

vsomeip E2E的发送 protecter 和 接收checker 都是在routing中完成的。以E2E Profile 4 为例分析。

2.2.1 Protect

implementation/routing/routing_manager_impl.cpp

挂载e2e插件

void routing_manager_impl::init() {
    ...
    ...
    ...
    if( configuration_->is_e2e_enabled()) {
        VSOMEIP_INFO << "E2E protection enabled.";

        const char *its_e2e_module = getenv(VSOMEIP_ENV_E2E_PROTECTION_MODULE);
        std::string plugin_name = its_e2e_module != nullptr ? its_e2e_module : VSOMEIP_E2E_LIBRARY;

        auto its_plugin = plugin_manager::get()->get_plugin(plugin_type_e::APPLICATION_PLUGIN, plugin_name);
        if (its_plugin) {
            VSOMEIP_INFO << "E2E module loaded.";
            e2e_provider_ = std::dynamic_pointer_cast<e2e::e2e_provider>(its_plugin);
        }
    }

    if(e2e_provider_) {
        std::map<e2exf::data_identifier_t, std::shared_ptr<cfg::e2e>> its_e2e_configuration = configuration_->get_e2e_configuration();
        for (auto &identifier : its_e2e_configuration) {
            if(!e2e_provider_->add_configuration(identifier.second)) {
                VSOMEIP_INFO << "Unknown E2E profile: " << identifier.second->profile << ", skipping ...";
            }
        }
    }
#endif
}

在usr data 发送的时候,给数据添加E2E Header,对消息进行保护

bool routing_manager_impl::send(client_t _client, const byte_t *_data,
        length_t _size, instance_t _instance, bool _reliable,
        client_t _bound_client,
        credentials_t _credentials,
        uint8_t _status_check, bool _sent_from_remote)
e2e_buffer its_buffer;

                if (e2e_provider_) {
                    if ( !is_service_discovery) {
                        service_t its_service = VSOMEIP_BYTES_TO_WORD(
                                _data[VSOMEIP_SERVICE_POS_MIN], _data[VSOMEIP_SERVICE_POS_MAX]);
                        method_t its_method = VSOMEIP_BYTES_TO_WORD(
                                _data[VSOMEIP_METHOD_POS_MIN], _data[VSOMEIP_METHOD_POS_MAX]);
#ifndef ANDROID
                        if (e2e_provider_->is_protected({its_service, its_method})) {
                            // Find out where the protected area starts 定位CRC计算起始位置
                            size_t its_base = e2e_provider_->get_protection_base({its_service, its_method});

                            // Build a corresponding buffer 将需要Protect的部分拷贝出来
                            its_buffer.assign(_data + its_base, _data + _size);

                            e2e_provider_->protect({ its_service, its_method }, its_buffer, _instance);

                    
### CAN总线端到端(E2E)加密或保护机制的实现方法 #### 1. **E2E保护的基本概念** 在CAN总线上,为了保障信号传输的安全性和可靠性,通常会采用端到端(End-to-End, E2E)保护机制。这种机制主要用于防止数据篡改、重放攻击以及非法访问等问题。E2E保护的核心目标是确保从发送方到接收方的数据完整性、新鲜度和真实性。 根据AUTOSAR标准[^1],E2E保护主要关注以下几个方面: - 数据完整性:通过CRC或其他校验算法检测数据是否被修改。 - 数据新鲜度:利用计数器或时间戳来防止重放攻击。 - 数据真实性:通过认证技术确认消息确实来自合法的发送者。 #### 2. **E2E保护的具体实现** ##### (1)**配置阶段** 在实际应用中,E2E保护的第一步是对通信路径上的各个组件进行配置。这包括定义哪些信号组需要受到保护,以及如何设置相应的参数。例如,在某些情况下,可能只需要对特定的关键信号启用E2E保护,而不是整个PDU。 具体来说,可以通过加载预设的配置文件来决定服务ID和服务方法是否需要E2E保护[^3]。如果某个服务的方法需要保护,则进一步指定其保护范围和策略。 ##### (2)**头部信息生成** 当确定某条消息需要E2E保护时,会在原始数据前附加一个专门用于验证的头部信息。这部分头部信息包含了用于后续验证所需的元数据,如计数器值、CRC值等。 以下是基于Vsomeip库的一个典型代码片段展示如何动态计算并插入这些头部信息: ```cpp if (e2e_provider_) { if (!is_service_discovery) { service_t its_service = VSOMEIP_BYTES_TO_WORD( _data[VSOMEIP_SERVICE_POS_MIN], _data[VSOMEIP_SERVICE_POS_MAX]); method_t its_method = VSOMEIP_BYTES_TO_WORD( _data[VSOMEIP_METHOD_POS_MIN], _data[VSOMEIP_METHOD_POS_MAX]); #ifndef ANDROID if (e2e_provider_->is_protected({its_service, its_method})) { // 获取受保护区域起始位置 size_t its_base = e2e_provider_->get_protection_base({ its_service, its_method}); // 构造缓冲区 its_buffer.assign(_data + its_base, _data + _size); // 计算并添加保护头 e2e_provider_->protect({ its_service, its_method}, its_buffer, _instance); // 插入头部至原数据前端 its_buffer.insert(its_buffer.begin(), _data, _data + its_base); _data = its_buffer.data(); } #endif } } ``` 此代码展示了如何依据预先设定的服务ID与方法ID判断该消息是否需执行额外的E2E保护逻辑,并据此调整最终发出的消息内容[^3]。 ##### (3)**消息验证** 接收到带有E2E保护的消息后,接收端同样需要按照既定规则解析出其中嵌套的有效负载及其关联的元数据。随后运用相同的算法重新计算预期的结果并与实际接收到的内容对比,以此判定消息的真实性及未受损状态。 #### 3. **与其他安全措施的区别** 值得注意的是,虽然E2E提供了较为全面的基础安全保障能力,但它并不完全替代其他高级别的安全性需求解决方案。例如,对于跨ECU间的高敏感度通讯而言,SecOC(Secure On-Chip Communication)则更适合处理这类场景下的加解密操作及相关密钥管理事务。 此外,尽管两者都能达到一定程度的功能安全等级ASILD级别支持,但在网络信息安全层面只有后者才真正符合ISO21434的要求[^1]。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值