《基于LTE的车联网无线通信技术 安全证书管理系统技术要求》 SM2 验证过程

已知数据
签名证书对应的SM2私钥:

17 9e 18 ae e3 38 72 e1 60 5e 99 e8 bc 61 20 f7 
95 e7 c8 f8 a9 ce 60 7a 4a 71 78 68 23 53 a1 69

签名证书SM3哈希值:

e3 8c 7c b2 ec ed b9 28 9b 6e 71 ad 30 b6 26 2c 
4a 57 85 73 b9 a4 4d e8 ab 65 9a 6b cd 96 7d 77

ToBeSignedData待签名数据值:

40 03 80 20 34 34 34 34 34 34 34 34 34 34 34 34 
34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 
34 34 34 34 40 01 20 00 00 00 00 00 23 73 03 

过程数据
签名证书对应的公钥:

X:
1e 5f 89 a5 74 08 2c 8b 36 11 fb a8 d0 65 f3 08 
b4 8f 64 ee ef 71 30 3c 75 ba 8e 95 d5 be 89 42 
Y:
77 84 ef 22 09 41 de eb cf 5b 3e 34 65 98 0a 30 
91 67 34 6f fe 05 0a e1 00 7c 2d 2f 3f 10 57 74

ZA值:

ff 25 43 65 9c 0b 93 c3 9f e3 b4 00 73 98 df 9f 
b4 0c f4 5d e3 65 e7 c9 af 16 5d 42 68 35 0b b9 

Hash (ZA || Data input) 值:

7a b1 2a 19 b6 45 df c6 36 e2 0e a7 ae b0 e5 5e 
f3 f3 68 38 87 b2 e0 76 a8 eb 32 94 90 4e e5 d4

签名结果数据

R:
DD F9 07 5D D2 D9 47 05 A1 2F 42 5E 51 CB 27 4C 
B8 F4 AE 65 B3 1C 7C DD CD 31 C2 BC 3C 55 28 81
S:
20 86 11 DE 09 A7 CC 4E 48 76 E6 9E F2 E7 C0 6A 
85 39 A4 67 F2 0B 0E A7 FE EB 2A FE 9D 59 5C C4

附录
ZA值计算方法
SM2是一种椭圆曲线密码学算法, SM2只与单个特定的256位椭圆曲线相关联,因此在本标准中与SM2相关联的标识符不需要额外的曲线指示。
本标准中SM2的签名格式r用整数表示。SM2通过将身份字符串添加到要散列的消息前来命名散列函数, 这个身份字符串是:
𝑍𝐴 = 𝐻ASH(𝐸𝑁𝑇𝐿𝐴||𝐼𝐷𝐴||𝑎||𝑏||𝑥𝐺| |𝑦𝐺 ||𝑥𝐴||𝑦𝐴)
其中

1) ENTLA 是由IDA长度转换而成的两个字节字符,值为IDA的有效比特数;
2) IDA 是发送方的ID;
3) a 和b是SM2椭圆曲线的方程参数;
4) xG和yG 是SM2基点的 x和y坐标;
5) xA和yA是验签公钥的x和y坐标;

数字签名用H(ZA || Data input)计算,而不是只用M计算,此处的Data input为待签名的消息数据。
本标准约定IDA为发送方正在使用证书的32字节哈希值,也即IDA=HashedId32(Certificate)并按GB/T 32918进行比特串到字节串的转换,ENTLA 是0x0100。当签发的证书为自签名证书时,IDA为16进制整数31323334353637383132333435363738,并按GB/T 32918进行整数到字节串的转换,因此ENTLA 是0x0080。

AID为应用标识,应用标识分配如下:
AID 应用领域或其它描述
17: 在“四跨”活动前所有的应用标识均为17
111: 车车基本安全应用-普通车辆状态BSM,常规
112: 车车基本安全应用-普通车辆关键事件提醒 BSM,事件
113: 车车基本安全应用-紧急车辆状态 BSM,常规
114: 车车基本安全应用-紧急车辆关键时间提醒 BSM,事件
3617: 车车基本安全应用-后装车载终端 BSM
3618: 地图类应用 MAP
3619: 信号灯类应用 SPAT
3620~3623 道路类信息应用
3620: 道路信息-静态类应用 RSI
3621: 道路信息-半静态应用 RSI
3622: 道路信息-动态应用 RSI
3623: 道路提醒类应用 RSM
3627: 证书类应用
3628: 证书撤销列表
3629: 异常行为管理

AID相关介绍来源于《基于 LTE 的车联网无线通信技术 直连通信系统路侧单元技术要求》,如下图所示:
v2x-rsu-aid.png

《T_ITS 0110-2020 基于LTE的车联网无线通信技术 直连通信系统路侧单元技术要求.pdf》
标准文件如下:
T_ITS 0110-2020 基于LTE的车联网无线通信技术 直连通信系统路侧单元技术要求.pdf

1.编译zlib

wget http://zlib.net/zlib-1.2.11.tar.gz
tar -xzf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure --prefix=/home/const
make && make install

2.编译c-ares

wget https://c-ares.haxx.se/download/c-ares-1.15.0.tar.gz
tar xvf c-ares-1.15.0.tar.gz
cd c-ares-1.15.0
../configure --prefix=/home/const
make && make install

3.编译OpenSSL

wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar xvf openssl-1.1.1k.tar.gz
./Configure --prefix=/home/const no-asm -shared linux-x86_64
make && make install

4.编译cURL

wget https://curl.se/download/curl-7.76.1.tar.xz 
tar xvf curl-7.76.1.tar.xz 
cd curl-7.76.1
./configure --prefix=/home/const CPPFLAGS="-I/home/const/include" LDFLAGS="-L/home/const/lib" LIBS=" -lssl -lcrypto -lz -ldl -lpthread"  --disable-werror --enable-curldebug --with-ssl=/home/const --enable-zlib --enable-ares

Installing Visual Studio Code with apt

1.用管理员权限更新包与安装必要的文件

sudo apt update
sudo apt install software-properties-common apt-transport-https wget

2.导入Microsoft GPG Key

wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"

3.安装 VS Code

sudo apt install code

4.更新

sudo apt update
sudo apt upgrade

0、官方安装命令在这儿

https://golang.org/doc/install

1、下载安装包,当前(20210526)最新版本为https://golang.org/dl/go1.16.4.linux-amd64.tar.gz

本站缓存:https://const.net.cn/down/go1.16.4.linux-amd64.tar.gz

2、下载完成后,用root权限执行下面命令

rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.4.linux-amd64.tar.gz

3、将/usr/local/go/bin 目录添加到环境变量($HOME/.profile 或者 /etc/profile)

export PATH=$PATH:/usr/local/go/bin

4、验证安装是否正确

source /etc/profile
go version

输出类似:
go version go1.16.4 linux/amd64

5、Hello Go

cd
mkdir hello
cd hello
go mod init const.net.cn/hello

输出:

go: creating new go.mod: module const.net.cn/hello

将下面内容保存到hello.go文件中

package main

import "fmt"

func main() {
    fmt.Println("Hello, Go!")
}

运行程序:

go run .

输出:

Hello, Go!

PS:
go mod init packagename可以创建一个空的go.mod
go mod tidy也可以用来为go.mod增加丢失的依赖,删除不需要的依赖