size_t len = EC_POINT_point2oct(ec_group, ec_point2, (point_conversion_form_t)2, hdKey, 64, 0);
看字面上是 获取硬盘Key , EC_KEY_new_by_curve_name 这些的都是调用 openssl的 ec.h 文件
求解释这段代码的具体含义
CTF训练营-Web篇
ec_point2=NULL;
ec_key=EC_KEY_new_by_curve_name(708); ;创建了一个ec_key,具体参数在ec_key.c中会找到EC_KEY_new(),于此同时创建了ec_group的值
;708这个值是有意义的,决定 field_type = NID_X9_62_prime_field,及group的生成函数(共有两种)。 本题是选(group = EC_GROUP_new_curve_GFp(p, a, b, ctx)
if (ec_key)
ec_group=(EC_GROUP *)EC_KEY_get0_group(ec_key); ;相当于赋值语句,EC_KEY_get0_group(ec_key);中就一个rerun语句。
if (ec_group)
ec_point=EC_POINT_new(ec_group);
if (ec_point)
int ret=EC_KEY_generate_key(ec_key); ;根据上面函数所产生的部分之生成KEY,成功返回值是1,不成功返回值是0;(ec_key.c)
//printf("ret=%d\n",size);
if (ret==1)
ec_point2=(EC_POINT *)EC_KEY_get0_public_key(ec_key); ;也是个类似赋值的语句,该函数中只有一个return。
if (ec_point2)
size_t len = EC_POINT_point2oct(ec_group, ec_point2, (point_conversion_form_t)2, hdKey, 64, 0);
;此函数调用了group->meth->point2oct(group, point, form, buf, len, ctx);但是我找了大部分了openssl文件夹,没有找到point2oct()函数体,只看到其声明在ec_lcl.h中 size_t (*point2oct)(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,unsigned char *buf, size_t len, BN_CTX *);
楼主要是找到(*point2oct)函数体时告诉我下啊;
总结:我是用celerity和 Notepad+ 来打开所有的代码。(crpto/ec)。 celerity看代码结构不错。 notepad+可以在所有打开的文件中搜索关键字。个人感觉openssl的注释做的非常不好,读源代码基本看不到注释(也没有一本书可以介绍其源码,文档还不全)。
本段代码三个主要部分:EC_KEY_new_by_curve_name(708);EC_KEY_generate_key(ec_key); size_t len = EC_POINT_point2oct(ec_group, ec_point2, (point_conversion_form_t)2, hdKey, 64, 0); 应该算是:初始化, 生成key。 生成len。第三个函数在 ec_lib.c中,还没搞懂什么意思。 楼主自己在参详一下吧。
感觉这个代码hdkey这个参数没给啊!!!! EC_POINT_point2oct()函数应该决定了此函数的作用。
以上均是个人分析,仅供参考,还望高手指教。