DK = Scrypt(pwd, s, Nscrypt, r, p, dkLen);
z0 = DK[0 : 320]
z1 = DK[320 : 320]
在计算DK的式子中,s(Salt)和pwd是车厂服务器产生的随机数,一个所谓盐值另一个作为配对密码,他们的长度分别是16字节和13字节;所有参数取值可以参考下图:
由上图参数计算出来得出的DK、z0和z1的具体数据值是:
在此得出z0和z1,从而可以派生出w0和w1:
w0 = (z0 mod(n-1))+1
w1 = (z1 mod(n-1))+1
式子中的n是NIST P-256椭圆曲线算法G点的阶数,是一个大数;其在此取值可以参考下图:
计算得出的w0和w1一定不能够相等。
以上,开头提到的三个参数就剩下L了,那么L可以通过一下公式计算得出:
L = w1 * G
式中w1在前面的计算中已经派生出来了,G是NIST P-256椭圆曲线算法G点,G是二维平面里的一个点,因此它拥有x和y两个数值,简称G.x和G.y,在此其取值为:
因此计算L是属于常数与二维坐标点相乘,从而得出的L必定是二维的。
到此,车厂服务器产生了对配对过程中起到作用的四个参数,分别是pwd、s(slat:以下简称s)、L和w0,随后车厂服务器通过web将pwd下发到设备端,以备配对时做SPAKE2+使用。将s和verifier(L、w0)通过安全的专用通道下发到车辆端做SPAKE2+使用。车厂服务器到这一步后暂时推出群聊,剩下的SPAKE2+认证就让设备端和车辆端离线协商并认证。
设备端:
设备端收到服务器的pwd后,当车辆端发送请求开始SPAKE2+命令时,车辆端会将s、Nscrypt、r、P这几个参数发送过来,与服务器一样的步骤生成属于设备端的z0、z1、w0和w1。
SPAKE2+ Flow中,设备端生成与车辆端交互的第一个数据X:
X = x × G + w0 × M
式子中的x是一个随机数,M是一个固定值,他们的取值参考下图:
计算得出的X应该是:
SPAKE2+ Flow中,车辆端端生成与设备端交互的Y:
Y = y × G + w0 × N
式子中的y是一个随机数,N是一个固定值,他们的取值参考下图:
计算得出的Y应该是:
在此,设备端已经派生出了X,设备端就可以将X发送给车辆端。
车辆端:
当车辆端接收到设备端发过来的X,车辆端就可以计算Z和V了:
Z = y × (X − w0 × M)
V = y × L
至此,车辆端已经从不同途径获得了 X、Y、Z、V和w0;那么就可以根据这几个数据使用SHA-256哈希出密钥K:
K = SHA-256(len(X) || X || len(Y) || Y || len(Z) || Z || len(V) || V || len(w0) || w0)
由K可以派生出系统密钥CK和SK:
CK = K [0:128]
SK = K [128:128]
接下来就需要生成出Y以外传输给设备端的参数M[1], M[1]是个密文,需要K1作为钥匙进行加解密;那么就需要先派生K1:
K1=HKDF(CK, “ConfirmationKeys” || TLV 5Bh || TLV 5Ch, [128:128])
M[1]=C-MAC(K1, X)
至此,车辆端已经将Y和M[1]派生完成,接下来就将这两个参数发送到设备端。设备端收到车辆端发送的两个参数后就会派生出设备端的Z、V、K和M[2]:
Z=x × (Y − w0 × N)
V=w1 × (Y − w0 × N)
K = SHA-256(len(X) || X || len(Y) || Y || len(Z) || Z || len(V) || V || len(w0) || w0)
由K可以派生出系统密钥CK和SK:
CK = K [0:128]
SK = K [128:128]
计算出K2和M[2]:
K2=HKDF(CK, “ConfirmationKeys” || TLV 5Bh || TLV 5Ch, [128:128])
M[2]=C-MAC(K2, Y)
那么设备端就需要将M[2]发送到车辆端。让车辆端验证M[2]的合法性和设备的合法性。
如果以上所有步骤都顺利通过,则SPAKE2+流程成功执行,安全通道成功建立。接下来就可以经行双端的证书交换了。