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 智能交通 數字證書應用接口規範文檔。