问题描述
我们尝试与外部设备服务器交换主控机密(匿名交换,不需要证书)。我们有外部设备(充当客户端)可以与外部服务器建立加密通道。
问题是-我们的设备客户端失败。
过程是IEEE 802.1X-2010中定义的MACSec密钥协议(MKA)协议。客户端使用C / C ++
- 服务器(外部设备)以TLS EAP(EAP-TLS)(13)请求开始处理。
- 客户端(我们的设备)继续使用ClientHello以获得TLS 1.1版本。 (外部设备不支持1.2。)
- 来自服务器的ServerKeyExchange和来自我们的ClientKeyExchange。
PCAP是由wirehark收集的,一些txt输出可在此处访问: https://pastiebin.com/5f8d4e1446406
服务器密钥交换字段八位字节带有RSA公钥:
0c 00 01 03 b1 3b <252 octets> da f8 01 00 01
0c - (12) Server Key Exchange
00 01 03 - length (259 octets)
b1 3b <252 octets> da f8 - is public modulus (256 octets)
01 00 01 - is public exponent (3 octets)
加密源代码(基于openssl 1.0.2):
RSA * rsa = RSA_new();
rsa->n = BN_bin2bn(public_key,256,NULL);//public_key is uint8_t * : b1 3b ... da f8
rsa->e = BN_bin2bn(public_exp,3,NULL);//public_exp is uint8_t * : 01 00 01
result.resize(RSA_size(rsa)); // resize to 256
int32_t len = RSA_public_encrypt(64,pms,result,rsa,rsa_padding_method);
// pms is uint8_t[48] (contains 03 02 at the beginning,and then 46 random octets)
// rsa_padding_method is RSA_PKCS1_PADDING (but we have tested others too,like
// RSA_PKCS1_OAEP_PADDING/RSA_SSLV23_PADDING/RSA_NO_PADDING(yes,even no padding)
结果包含[56,1c,,12,9f](当然,由于填充,每次都会随机化)
我们通过客户端密钥交换(与外部客户端相同的格式)的回复
10 00 01 02 01 00 56 1c <252 octets> 12 9f
10 - (16) Client Key Exchange
00 01 02 - length (258 octets)
01 00 - RSA encrypted PreMasterSecret is preceded by two length bytes (256 octets)
56 1c <252 octets> 12 9f - encrypted value
TLS握手通过Finished和Success成功完成。
然后,这两个设备都使用HMAC函数派生通用密钥(直接从主密钥之前的机密),并交换一个值以确认已推导出相同的密钥。 (在TLS 1.1完成之后)。我们的设备获得的价值不同于外部设备。
我们检查了测试向量的推导过程(来自802.1X-2010附录H)。在我们这边还可以。
但是,我们不确定是否要公开加密。 你注意到那里有什么错误吗?还有其他建议可能有什么问题吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)