openssl中OID标识的增加

背景:由于最近在国家密码管理局的GM/T系列标准,需要在openssl中基于PKCS7的格式实现GM/T0010标准的数字信封数据格式,需要在openssl中增加GM/T0010标准的各个消息的OID标识符。

方法1:

1. 把OID标识符转换为ASN1编码

    使用openssl中的asn1parse命令进行OID标识符转换为ASN1编码,命令示例如下:

    openssl asn1parse -genstr OBJECT:1.2.156.10197.6.1.4.2.1 -out /root/Desktop/OID.hex

其中-genstr为要把后面的字符串转换为ASN1格式,OBJECT为字符串的ASN1类型,1.2.156.10197.1.401为要转换的OID标识符号,-out /root/Desktop/OID.hex表示命令的转换结果输出到/root/Desktop/OID.hex文件。

    命令转换结果为:

    06 0A 2A 81 1C CF 55 06 01 04 02 01

注意:/root/Desktop/OID.hex需使用二进制查看。

2. 把ASN1编码加入openssl的编码表中

    此处以openssl 1.1.0d版本为例,把转换好的ASN1编码加入到crypto/objects/obj_dat.h的so数组最后,注意添加多少字节把数组大小增加多大。即把上述转换的结果中的第三个字节开始添加到数组中,即把2A 81 1C CF 55 06 01 04 02 01加入so数组。

3. 添加nid和objs对应表

    1.2.156.10197.6.1.4.2.1为GM/T0010中data数据类型的OID标识符,需要定义NID_gmt0010_data的宏,宏值根据现有的NID宏最大值+1开始定义;

    在nid_objs最后增加NID_gmt0010_data对应的结构体值,其中数据长度是刚才填入so表中的数据的长度,最后一个ASN1编码的数据地址为刚才填入的数据的起始位置,主要参考nid_objs数组中的原有内容进行添加;

注意:NID_gmt0010_data的定义在crypto/objects/obj_mac.h和crypto/objects/objects.h中都有,注意参照原有定义进行定义。

    增加后注意修改NUM_NID的大小。

4. 在obj_objs中添加NID_gmt0010_data值

把刚才定义的NID_gmt0010_data添加到obj_objs中,注意添加需要按照在1中填入的数据的长度和值按照相同长度的升序排序加入到obj_objs数组中,修改完成后注意修改NUM_OBJ的值。


至此,一个OID标识符就添加完成了,GM/T0010标准中的其他标识符添加方法类似。

    

方法2:

1. 直接在crypto/objects/objects.txt文件中增加自己要增加的对象标识符OID,具体如何添加参考此文件内容;

2. 回到openssl的根目录,重新配置openssl,即运行./config命令,此命令根据自己的实际情况添加参数;

3. make update

4. 查看修改前后是否都添加好。


总结:

方法1实在不熟悉openssl的情况下做的,在刚接触openssl的时候走的弯路,方法2是在对openssl稍微熟悉后了解到的,其实openssl里边自带了很多很方便的功能。




你可能感兴趣的:(嵌入式linux)