Python定义UDS诊断服务(8):SecurityAccess(0x27)
目录
1. 文档概述
2. 服务简介
2.1 服务定义
2.2 服务重要性
2.3 协议规范
3. 类结构设计
3.1 继承关系
3.2 类成员说明
3.2.1 SecurityAccess 类属性
3.2.2 Mode 枚举类
3.2.3 Seed_level 枚举类
3.2.4 Response_Interpret 嵌套类
4. 核心方法详解
4.1 validate_mode 方法
4.1.1 方法签名
4.1.2 功能说明
4.2 normalize_level 方法
4.2.1 方法签名
4.2.2 功能说明
4.2.3 转换规则
4.3 get_key 方法
4.3.1 方法签名
4.3.2 功能说明
4.4 make_request 方法
4.4.1 方法签名
4.4.2 参数说明
4.4.3 请求构建逻辑
4.4.4 请求格式示例
4.5 interpret_response 方法
4.5.1 方法签名
4.5.2 功能说明
4.5.3 响应格式示例
5. 协议细节
5.1 安全访问流程
5.1.1 完整安全访问流程
5.1.2 请求种子模式(奇数级别)
5.1.3 发送密钥模式(偶数级别)
5.2 否定响应处理
5.2.1 支持的否定响应码
5.2.2 常见错误场景
5.3 安全算法说明
5.3.1 AES-CMAC算法
6. 使用示例
6.1 基本使用
6.1.1 请求种子示例
6.1.2 发送密钥示例
6.2 多级别安全访问
6.3 批量安全访问
1. 文档概述
本文档详细说明基于ISO 14229-1标准的安全访问服务(SecurityAccess,Service ID 0x27)的Python实现。该服务是UDS协议中的关键安全服务,用于在访问受保护的ECU功能前进行身份验证。
2. 服务简介
2.1 服务定义
安全访问服务(0x27)提供了一种机制,允许客户端(诊断工具)通过密钥交换流程与服务器(ECU)建立安全会话。服务采用"请求种子-发送密钥"的挑战-响应模式来验证客户端身份。
2.2 服务重要性
- 安全保护:防止未授权访问ECU的敏感功能和数据
- 功能保护:保护关键ECU功能免受恶意操作
- 数据完整性:确保诊断通信的安全性
- 访问控制:实现不同安全级别的访问权限控制
2.3 协议规范
本实现遵循ISO 14229-1:2020标准中关于0x27服务的规范,支持多种安全级别和加密算法。
3. 类结构设计
3.1 继承关系
SecurityAccess(BaseService)├── Mode (Enum)├── Seed_level (Enum)└── Response_Interpret(Response)
3.2 类成员说明
3.2.1 SecurityAccess 类属性
属性 | 类型 | 值 | 描述 |
---|---|---|---|
_sid | int | 0x27 | 服务标识符 |
_use_sub_function | bool | True | 使用子功能参数 |
_has_response_data | bool | True | 有响应数据 |
supported_negative_response | List[ResponseCode] | [0x12, 0x13, 0x22, 0x24, 0x31, 0x35, 0x36, 0x37] | 支持的否定响应码 |
fixed_01 | list[int] | [0xFF, 0xFF, 0xFF, 0xFF, 0xFF] | 安全级别01的固定值 |
fixed_05 | list[int] | [0x12, 0x34, 0x56, 0x78, 0x9A] | 安全级别05的固定值 |
fixed_19 | list[int] | [0x00, 0x00, 0x00, 0x00, 0x00] | 安全级别19的固定值 |
3.2.2 Mode 枚举类
class Mode:RequestSeed = 0 # 请求种子模式SendKey = 1 # 发送密钥模式
3.2.3 Seed_level 枚举类
class Seed_level:Seed_01 = 0x01 # 安全级别01Seed_05 = 0x05 # 安全级别05 Seed_19 = 0x19 # 安全级别19
3.2.4 Response_Interpret 嵌套类
class Response_Interpret(Response):seed: Optional[list[int]]key: Optional[list[int]]mode: "SecurityAccess.Mode"
响应解析类包含:
seed
: 服务器返回的种子值key
: 计算出的密钥值mode
: 当前安全访问模式
4. 核心方法详解
4.1 validate_mode 方法
4.1.1 方法签名
@classmethod
def validate_mode(cls, mode: int)
4.1.2 功能说明
验证安全访问模式参数是否有效:
- 检查模式值是否为0(RequestSeed)或1(SendKey)
- 如果无效则抛出ValueError异常
4.2 normalize_level 方法
4.2.1 方法签名
@classmethod
def normalize_level(cls, mode: int, Seed_level: int) -> int | None
4.2.2 功能说明
根据模式和种子级别规范化安全级别:
- 请求种子模式:确保级别为奇数(1, 5, 19…)
- 发送密钥模式:确保级别为偶数(2, 6, 20…)
- 自动进行奇偶转换
4.2.3 转换规则
模式 | 输入级别 | 输出级别 |
---|---|---|
RequestSeed | 奇数 | 保持不变 |
RequestSeed | 偶数 | 级别-1 |
SendKey | 奇数 | 级别+1 |
SendKey | 偶数 | 保持不变 |
4.3 get_key 方法
4.3.1 方法签名
@classmethod
def get_key(cls, seed: bytes, security_constant: bytes) -> bytes | list[int]