openssl: 兼容openssl1.1.0及舊版本

openssl: 兼容openssl1.1.0及舊版本

openssl 1.1.0+ 版本和低版本有很多接口不兼容問題,例如:

openssl 1.1.0+ 版本中,很多 struct 是不透明的,不能在棧中直接聲明變量,需要通過指定的函數來在堆中創建非透明的struct對象並返回指針。

	HMAC_CTX *ctx;
	ctx = HMAC_CTX_new();
	HMAC_Init_ex(ctx, key, keyLen, md, NULL);
	HMAC_Update(ctx, msg, msgLen);
	HMAC_Final(ctx, md_value, &md_len);
	HMAC_CTX_free(ctx);

而低版本的openssl(例如1.0.2)是可以直接在棧上聲明 struct 對象。

	HMAC_CTX ctx;
	HMAC_CTX_init(&ctx);
	HMAC_Init_ex(&ctx, key, keyLen, md, NULL);
	HMAC_Update(&ctx, msg, msgLen);
	HMAC_Final(&ctx, md_value, &md_len);
	HMAC_CTX_cleanup(&ctx);

但是,我的應用程序,應該具備一定的兼容性,既能兼容低版本openssl,也能兼容高版本openssl。

依據:https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes

Backward compatibility
Since some structures have become opaque you can’t directly access the member any more. You might need to create backward compatible macros or functions if you still want to support older versions of OpenSSL. A suggested way of doing that is:
#if OPENSSL_VERSION_NUMBER < 0x10100000L
#define OBJ_get0_data(o) ((o)->data)
#define OBJ_length(o) ((o)->length)
#endif

我們可以通過 OPENSSL_VERSION_NUMBER 宏來判斷當前使用的openssl版本,進行條件編譯:

#if !defined(OPENSSL_VERSION_NUMBER) || OPENSSL_VERSION_NUMBER < 0x10100000L
	HMAC_CTX ctx;
	HMAC_CTX_init(&ctx);
	HMAC_Init_ex(&ctx, key, keyLen, md, NULL);
	HMAC_Update(&ctx, msg, msgLen);
	HMAC_Final(&ctx, md_value, &md_len);
	HMAC_CTX_cleanup(&ctx);
#else
	HMAC_CTX *ctx;
	ctx = HMAC_CTX_new();
	HMAC_Init_ex(ctx, key, keyLen, md, NULL);
	HMAC_Update(ctx, msg, msgLen);
	HMAC_Final(ctx, md_value, &md_len);
	HMAC_CTX_free(ctx);
#endif

這樣,在編譯時自動依據使用的openssl庫版本,條件編譯選擇不同的代碼,保證向後兼容。

如果有更好的辦法,請大家隨時聯繫我~謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章