bluedroid本地SMP public key的生成源码解释
时间: 2023-08-05 16:04:09 浏览: 94
Bluedroid是一个在Android操作系统中使用的蓝牙协议栈。在Bluedroid中,SMP(Secure Simple Pairing)是用于在两个设备之间建立安全连接的协议。其中,生成本地SMP public key是SMP协议中的一个重要步骤。
在Bluedroid中,生成本地SMP public key的源码位于`stack/smp/smp_crypto.c`文件中。具体实现如下:
```c
void smp_gen_p256_public_key(tSMP_CB* p_cb)
{
EC_KEY *p_eckey = NULL;
const EC_POINT *p_public_key;
const EC_GROUP *p_group;
uint8_t *p_point_buf = p_cb->local_publ_key.x;
if (!p_cb->local_ecc_keys)
{
p_cb->local_ecc_keys = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
}
p_eckey = p_cb->local_ecc_keys;
/* Generate the private and public key pair */
EC_KEY_generate_key(p_eckey);
p_group = EC_KEY_get0_group(p_eckey);
p_public_key = EC_KEY_get0_public_key(p_eckey);
/* Convert the public key to uncompressed format */
i2o_ECPublicKey(p_eckey, &p_point_buf);
/* Signal the BTM that the local public key is generated */
smp_send_pair_req(p_cb, SMP_OVER_BR | SMP_GEN_OOB_FLAG);
}
```
上述代码中,`p_cb`是一个指向SMP协议控制块的指针,记录了SMP协议的状态和参数信息。
首先,通过`EC_KEY_new_by_curve_name()`函数创建一个指向椭圆曲线对象的指针,该椭圆曲线对象采用了NID_X9_62_prime256v1(也称为P-256)曲线。然后,通过`EC_KEY_generate_key()`函数生成一个私钥和公钥对,其中私钥存储在`p_eckey`指向的对象中,而公钥则存储在`p_public_key`指向的对象中。
接下来,通过`i2o_ECPublicKey()`函数将公钥转换为未压缩格式,并将结果存储在`p_point_buf`指向的缓冲区中。最后,通过`smp_send_pair_req()`函数通知BTM(Baseband Manager)本地公钥已经生成,可以开始SMP协议的下一步操作。
总体来说,Bluedroid生成本地SMP public key的过程比较简单,使用了openssl库中的椭圆曲线函数库。
阅读全文