1.SPDU简介
SPDU即Secure Protocol Data Unit, 是在V2X设备之间进行传输的消息结构。结构如下:
SecuredMessage ::= SEQUENCE {
version Uint8, // 版本号,当前为2
payload Payload // 消息载荷
}
消息载荷又分为3类消息:
Payload ::=CHOICE {
unSecuredData Opaque, // 未签名、未加密的负载
signedData SignedData, // 签名负载
encData EncryptedData // 加密负载
}
以下主要对签名的SPDU进行解读。
2. Signed SPDU
下图为payload为签名负载的SPDU的主要结构:
签名负载主要包括3部分
SignedData ::= SEQUENCE {
signer SignedInfo, // 签名者的信息,证书、证书链或者证书的hash值,
tbs TBSData, // To Be Signed Data 被签名的数据
sign Signature // 签名
}
signer包含证书,用于验证证书的合法性,其中的公钥用于验证签名的有效性。
SignedInfo ::= CHOICE {
self NULL, // 自签为空,用于申请注册证书
certificate SequenceOfCertificate, // 证书或证书链
certificateDigest CertificateDigest, // 证书的hash值,
...
}
被签名的数据包括三部分,其结构如下:
TBSData ::= SEQUENCE {
headerInfo HeaderInfo, // 消息头
data OCTET STRING (SIZE(0..MAX)) Optional, // BSM,RSM,MAP等消息
extHash OCTET STRING (SIZE(32)) Optional // data已发送或较大,不在发送data,发送摘要
}
消息头结构如下:
HeaderInfo ::= SEQUENCE {
itsAid INTEGER, // 智能交通应用标志
hashAlg HashAlgorithm Optional, // digest和ext所使用的摘要算法,SM3 or sha-256等
genTime TIME64 Optional, // 消息产生时间
expiryTime TIME64 Optional, // 消息失效时间
location ThreeDLocation, // 消息产生地理坐标
digest HashedId3 Optional, // 证书标识
encKey PublicEncryptionKey Optional // 响应数据需要使用encKey指定的对称加密算法加密,并用指定的公钥对对称密钥加密
}
签名结构如下:
Signature ::= SEQUENCE {
curve EccCurve,
r ECCPoint,
s OCTET STRING (SIZE(32))
}
3.总结
本文对签名的SPDU消息进行了简单的解读,主要参考了GB/T 37374-2019 智能交通 数字证书应用接口规范文档。