既然是要構造國密規范的訊息語法資料型別,那當然要用到gmssl庫咯,(GmSSL專案是OpenSSL專案的分支,并與OpenSSL保持介面兼容,因此GmSSL可以替代應用中的OpenSSL組件,并使應用自動具備基于國密的安全能力,)
1、引出問題
我們知道openssl中是已實作了RFC規范中的各種型別資料的定義,這些定義在gmssl中同樣存在,從之前的文章我們了解到國密規范的訊息語法型別與RFC規范中的基本一致(主要是某些欄位填入的資料存在差異),因此我們可以使用gmssl中的pkcs#7模塊的相關封裝介面來實作資料的封裝,
雖然可以使用但是若直接呼叫pkcs#7模塊去做的話,最后出來的資料肯定不符合國密規范,因為OID不對呀,gmssl庫不支持GM/T0010規范中定義的OID, 那怎么辦捏?
也許有童鞋會說“那把OID改成國密規范中的OID呀”, 是的,可以改,因為OID是型別識別符號,并不參與實際的密碼運算,但是改完后就會發現DER編碼(i2d_PKCS7(...))會失敗,[○・`Д′・ ○]
查看gmssl原始碼,可知pkcs7結構定義如下:

其內部有一個union(包含訊息語法規范中的各型別),通過ASN1_OBJECT *type來指明當前內容是哪種型別,在進行DER編解碼時會根據type來選擇對應的資料結構進行序列化,而如果type被修改為gmssl中不識別的值(例如國密規范的OID對應的值),就無法匹配到合適的型別,也就無法進行DER編解碼,
2、解決方案
目前解決方案有二(就小編目前的認知┐( ̄ヘ ̄)┌),
方案一:修改gmssl原始碼,添加對GM/T0010規范中OID的支持,(難度較高)
方案二:自定義asn1結構,然后通過gmssl的ASN庫對其進行編碼處理,
下面簡單介紹下方案二思路:(具體代碼就不太好帖出來了,因為是公司同事的代碼,你懂的ㄟ( ▔, ▔ )ㄏ )
該方案主要是運用gmssl庫中的ANS.1(是一套靈活的標記語言)允許定義多種資料型別的特性來實作,也就是不用gmssl中已有的pkcs7結構,而是自定義結構(包含型別type以及訊息資料型別data或PKCS7_ENVELOP或PKCS7_SIGN_ENVELPE等型別),
a、用ASN.1語法自定義內部資料結構,并通過DECLARE_ASN1_FUNCTIONS宣告函式;
b、然后通過ASN.1宏實作自定義結構的最基本的四個函式(new, free, i2d, d2i);
更詳細的ASN.1庫DER編解碼步驟以及示例請參考https://www.cnblogs.com/aixiaoxiaoyu/articles/8304070.html
------------*?????(?・ω・)???? 好好學習天天向上------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/248652.html
標籤:區塊鏈
上一篇:區塊鏈常識,避坑,避坑——第三期——2020.1.13
下一篇:webpack初體驗
