GmSSL icon indicating copy to clipboard operation
GmSSL copied to clipboard

工业中使用GmSSL遇到的问题

Open yuesong-feng opened this issue 1 year ago • 2 comments

最近在集成GmSSL3.0到某国产商业数据库,以使用TLCP协议做加密通信。过程中发现两个问题:

  1. 项目需要在堆内存上分配TLS_CTX和TLS_CONNECT结构体的空间,目前没有类似的接口,只能手动malloc(sizeof(TLS_CTX)),就需要知道结构体的大小,需要引入GmSSL头文件。 但项目是以动态加载函数的方式来使用第三方库,其实没有必要引入第三方库头文件。 参考其他库的接口设计(如OpenSSL),基本为每个结构体提供了init/destroy接口,用于给结构体分配内存返回指针、销毁内存,这样只需要动态加载这个接口函数就可以分配空间,不需要手动malloc/free,也就不需要知道结构体的大小、不用引入头文件。而GmSSL库tls.h中的init不负责分配内存,只负责初始化。

  2. 由于产品中有国际加密算法,使用了OpenSSL,所以引入了OpenSSL头文件,发现与GmSSL有结构体重名冲突,同时使用时编译不通过,需要手动将GmSSL库头文件中的结构体及被使用到的地方改名,使编译通过(头文件中结构体改名不影响已经生成好的动态库,依然可以正常使用)。改动的结构体如下: AES_KEY -> AES_KEY_GM SHA256_CTX -> SHA256_CTX_GM SHA512_CTX -> SHA512_CTX_GM MD5_CTX -> MD5_CTX_GM

关于上述内存分配释放接口与重名冲突的问题,是工业上使用GmSSL3.0可能会遇到的,希望可以给作者提一下建议。

yuesong-feng avatar Mar 10 '23 01:03 yuesong-feng

感谢建议。

  1. GmSSL 3.x尽可能不在基础的C库中引入动态内存分配和释放,大概后续不会提供这类接口,应用需要自己写malloc/free的封装代码。
  2. MD5功能目前通过CMake可选不编译,AES、SHA2等后续会改为可选项,并且默认不编译到库中,避免和OpenSSL等冲突。

guanzhi avatar Mar 23 '23 06:03 guanzhi

请问如果同时使用了openssl库和gmssl动态库,除了您提到的结构体重名问题,是否还会出现其它的符号冲突

timipig avatar Oct 31 '23 07:10 timipig