OpenSSL和GmSSL在Windows下編譯過程
perl Configure -DDEBUG -D_DEBUG -DOPENSSL_DEBUG_KEYGEN -DSSL_DEBUG -DALG_DEBUG -DCIPHER_DEBUG -DTLS_DEBUG -DKSSL_DEBUG no-asm TASSL_DEBUG debug-VC-WIN64A
--prefix=C:\MyProgramFiles\OpenSSLv1.0.2h --openssldir=C:\MyProgramFiles\OpenSSLv1.0.2h\SSL
7,執行nmake
Windows 10 x64 專業版 編譯與測試【調試】Openssl【OpenSSL_1_0_2h】之 TLS
自建證書:https://blog.csdn.net/ljttianqin/article/details/73016014
查看程序或動態庫所依賴的動態庫 dumpbin /dependents abc.exe 查看動態庫的輸出函數 dumpbin /exports abc.dll 另一款查看動態庫依賴的小工具depends,官網http://www.dependencywalker.com/
#下載第三方的最新的PEM(privacy-enhanced mail)格式的可信證書庫 [root@localhost ~]# wget --no-check-certificate https://curl.haxx.se/ca/cacert.pem
gmssl s_client -CAfile cacert.pem -connect sm2test.ovssl.cn:443 -debug -showcerts -msg
openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -msg
返回響應后,輸入:
GET / HTTP/1.1
支持協議測試: openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -tls1_2 openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -tls1_1 查看協議 openssl ciphers -v openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -cipher ECDHE-ECDSA-AES128-SHA256 測試會話復用: openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -reconnect 2>/dev/null |grep -i 'new\|reused' 如果支持復用,第二次鏈接就不是 New, 而是 reused 。不支持的復用的話,每次再連接都是 New。 測試OCSP stapling [root@localhost ~]# openssl s_client -CAfile /root/cacert.pem -connect www.baidu.com:443 -status
服務端自測:
證書產生 ~/mykey
gmssl ecparam -genkey -name sm2p256v1 -text -out zhibin.key gmssl req -new -key zhibin.key -out zhibin.req gmssl x509 -req -days 36500 -in zhibin.req -signkey zhibin.key -out zhibin_cert.pem -extfile certext.ext gmssl x509 -text -in zhibin_cert.pem gmssl s_server -key zhibin.key -cert zhibin_cert.pem -accept 443 -www
ECDHE-SM4-SM3 套件,top1.1協議 下的雙向驗證測試方法。 ./openssl s_client -connect 127.0.0.1:443 -cert cert/sm2/sm21.cer -key cert/sm2/sm21.key -CAfile cert/sm2/sm2root.cer -dcert cert/sm2/sm22.cer -dkey cert/sm2/sm22.key -cipher ECDHE-SM4-SM3 -top1.1 ./openssl s_server -cert cert/sm2/sm22.cer -key cert/sm2/sm22.key -dcert cert/sm2/sm21.cer -dkey cert/sm2/sm21.key -Verify 1 -CAfile cert/sm2/sm2root.cer -port 443 -cipher ECDHE-SM4-SM3 -top1.1
本次實現的系統為 Linux環境,在Windows下的 gmssl 安裝應該也差不多,所以環境影響不大。
(openssl.cnf默認配置在C:\Program Files\Common Files\SSL/openssl.cnf,設置ca庫的主目錄:dir = ./ # Where everything is kept。這個當前目錄指運行gmssl的目錄。
下面的執行都在 demoCA目錄下。
用參數 -config ../ssl/openssl.cnf 重新指定配置位置。
創建過程中需要進行交互式填寫信息:()
1). 國家:CN 兩位國家代碼(可以在openssl.cnf設置默認值)
2). 省份:beijing
3). 市: beijing
4). 公司:Client.Co
5). 部門:RD
6). 名字:www.client.com #非常重要,一定要有一致。
7). 聯系:test@client.com #測試使用
8). 密碼:#將申請文件加密
#################################################################### [ ca ] default_ca = CA_default /*The default ca section*/ #################################################################### [ CA_default ] dir = /home/lt/demoCA /* Where everything is kept */ /* #### 這是第一個openssl目錄結構中的目錄 */ certs = $dir/certs /* Where the issued certs are kept(已頒發的證書路徑,即CA或自簽的) */ /* #### 這是第二個openssl目錄結構中的目錄,但非必須 */ crl_dir = $dir/crl /* Where the issued crl are kept(已頒發的crl存放目錄) */ /* #### 這是第三個openssl目錄結構中的目錄*/ database = $dir/index.txt /* database index file */ #unique_subject = no /* 設置為yes則database文件中的subject列不能出現重復值 */ /* 即不能為subject相同的證書或證書請求簽名*/ /* 建議設置為no,但為了保持老版本的兼容性默認是yes */ new_certs_dir = $dir/newcerts /* default place for new certs(將來頒發的證書存放路徑) */ /* #### 這是第四個openssl目錄結構中的目錄 */ certificate = $dir/cacert.pem /* The A certificate(CA自己的證書文件) */ serial = $dir/serial /* The current serial number(提供序列號的文件)*/ crlnumber = $dir/crlnumber /* the current crl number(當前crl序列號) */ crl = $dir/crl.pem /* The current CRL(當前CRL) */ private_key = $dir/private/cakey.pem /* The private key(簽名時需要的私鑰,即CA自己的私鑰) */ RANDFILE = $dir/private/.rand /* private random number file(提供隨機數種子的文件) */ x509_extensions = usr_cert /* The extentions to add to the cert(添加到證書中的擴展項) */ /* 以下兩行是關於證書展示格式的,雖非必須項,但推薦設置。一般就如下格式不用修改 */ name_opt = ca_default /* Subject Name options*/ cert_opt = ca_default /* Certificate field options */ /* 以下是copy_extensions擴展項,需謹慎使用 */ # copy_extensions = copy /* 生成證書時擴展項的copy行為,可設置為none/copy/copyall */ /* 不設置該name時默認為none */ /* 建議簡單使用時設置為none或不設置,且強烈建議不要設置為copyall */ # crl_extensions = crl_ext default_days = 365 /* how long to certify for(默認的證書有效期) */ default_crl_days= 30 /* how long before next CRL(CRL的有效期) */ default_md = default /* use public key default MD(默認摘要算法) */ preserve = no /* keep passed DN ordering(Distinguished Name順序,一般設置為no */ /* 設置為yes僅為了和老版本的IE兼容)*/ policy = policy_match /* 證書匹配策略,此處表示引用[ policy_match ]的策略 */ /* 證書匹配策略定義了證書請求的DN字段(field)被CA簽署時和CA證書的匹配規則 */ /* 對於CA證書請求,這些匹配規則必須要和父CA完全相同 */ [ policy_match ] countryName = match /* match表示請求中填寫的該字段信息要和CA證書中的匹配 */ stateOrProvinceName = match organizationName = match organizationalUnitName = optional /* optional表示該字段信息可提供可不提供 */ commonName = supplied /* supplied表示該字段信息必須提供 */ emailAddress = optional /* For the 'anything' policy*/ /* At this point in time, you must list all acceptable 'object' types. */ /* 以下是沒被引用的策略擴展,只要是沒被引用的都是被忽略的 */ [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional /* 以下是添加的擴展項usr_cert的內容*/ [ usr_cert ] basicConstraints=CA:FALSE /* 基本約束,CA:FALSE表示該證書不能作為CA證書,即不能給其他人頒發證書*/ /* keyUsage = critical,keyCertSign,cRLSign # 指定證書的目的,也就是限制證書的用法*/ /* 除了上面兩個擴展項可能會修改下,其余的擴展項別管了,如下面的 */ nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer ####################################################################
)
1.根CA的生成
系統建立CA時,需要先在離線狀態下建立一個根CA。根CA所需要的文件夾有certs(證書文件夾)、crl(吊銷數據文件夾)、newcerts(新生成的證書文件夾)、private(私有數據文件夾)。同時還需要在本地生成數據記錄文件index.txt, index.txt.attr,用以記錄對證書的操作,需要初始化設定序列號。
執行的初始化操作如下:
mkdir certs clr newcerts private
touch index.txt
touch index.txt.attr
echo “01” > serial
隨后,便可以生成根 CA 的 sm2 公私鑰對,使用命令如下,生成的密鑰文件為 root-cakey.pem
gmssl ecparam -genkey -name sm2p256v1 -text -out private/root-cakey.pem -config ../ssl/openssl.cnf #生成私鑰
然后,生成根 CA 的證書請求。使用的算法為 sm3 簽名算法,生成的證書請求為 root-cacsr.pem.
gmssl req -new -sm3 -key private/root-cakey.pem -out root-cacsr.pem #生成證書請求 cert sign request。
最后讓根 CA 對自己的證書請求進行自簽名生成證書文件,生成的證書有效期為365天,證書文件名稱為 root-cacert.pem。
gmssl req -x509 -sm3 -days 365 -key private/root-cakey.pem -out root-cacert.pem #生成自簽名證書文件。
生成的根CA證書信息如下,我們可以看到該證書的公私鑰為SM2算法生成,對證書的簽名算法采用SM3。證書的發布者和證書主體信息一致,說明該證書是由自簽名生成。
gmssl x509 -text -noout -in root-cacert.pem
到此,根CA建立完成,可為二級CA的證書進行簽發。
2. 二級 CA 的生成
二級CA生成SM2公私鑰的命令為,使用的算法為sm2。生成的密鑰文件為sub-cakey.pem。
gmssl ecparam -genkey -name sm2p256v1 -out private/sub-cakey.pem
生成證書請求的命令為,使用的簽名算法為sm3。生成的證書請求為sub-cacsr.pem。
gmssl req -new -sm3 -key private/sub-cakey.pem -out sub-cacsr.pem (-batch 會按照openssl.cnf的隱含值填入。小心和自己輸入的不一致。)
根CA生成二級CA證書命令如下,使用sm3算法。生成的二級CA證書名稱為sub-cacert.pem。
gmssl ca -md sm3 -extensions v3_ca -in sub-cacsr.pem -out newcerts/sub-cacert.pem -days 365 -cert root-cacert.pem -keyfile ./private/root-cakey.pem #生成由root ca簽名的二級證書。
生成的二級CA證書如下圖所示,可以看到證書的發布者信息與根CA信息一致,說明該證書由根CA簽發。同時該證書主體信息與我們管理界面輸入的信息一致。
自此,一個二級CA的初始化已經完成。
3.用戶證書的簽發
用戶私鑰對生成:
gmssl ecparam -genkey -name sm2p256v1 -out thirdkey.pem
用戶證書請求生成:
gmssl req -new -sm3 -key thirdkey.pem -out thirdcsr.pem
隨后二級CA簽發用戶證書請求:
gmssl ca -md sm3 -extensions v3_ca -in thirdcsr.pem -out thirdcert.pem -days 365 -cert newcerts/sub-cacert.pem -keyfile private/sub-cakey.pem
生成的用戶證書如下:
4. 證書吊銷
吊銷用戶證書如下,所示:
openssl ca -keyfile ./private/sub-cakey.pem -cert ./sub-cacert.pem -revoke thirdcert.pem
吊銷之后的index.txt的內容變化如下圖所示,可以看到證書的狀態從已經驗證狀態“V”轉換到已經吊銷狀態“R”。
5,驗證:
openssl verify -CAfile ca.crt server.crt
1.https://github.com/guanzhi/GmSSL下載源碼,解壓后到源碼目錄下執行以下命令: ./config make make install //必須安裝,否則后續執行gmssl會因為打開openssl.cnf出錯。gmssl內部處理問題 2.證書生成准備: cd apps/demoCA/ mkdir certs crl newcerts private touch index.txt echo "01" > serial 3.生成根證書: gmssl ecparam -genkey -name sm2p256v1 -text -out Root.key #生成私鑰 gmssl req -new -key Root.key -out Root.req #證書請求 gmssl x509 -req -days 3650 -sm3 -in Root.req -signkey Root.key -out RootCA.crt #生成根證書 4.生成服務端證書 gmssl ecparam -genkey -name sm2p256v1 -text -out Server.key #生成私鑰 gmssl req -new -key Server.key -out Server.req #證書請求 gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Server.req -out ServerCA.crt #簽發證書 mssl verify -CAfile RootCA.crt ServerCA.crt #證書驗證 gmssl x509 -in ServerCA.crt -text -noout #查看證書 5.生成客戶端證書 gmssl ecparam -genkey -name sm2p256v1 -text -out Client.key #生成私鑰 gmssl req -new -key Client.key -out Client.req #證書請求 gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey Root.key -CAcreateserial -in Client.req -out ClientCA.crt #簽發證書 gmssl verify -CAfile RootCA.crt ClientCA.crt #證書驗證 gmssl x509 -in ClientCA.crt -text -noout #查看證書 6.客戶端/服務端通信驗證 gmssl s_server -accept *:443 -key Server.key -cert ServerCA.crt -dkey Server.key -dcert ServerCA.crt -CAfile RootCA.crt -msg -debug -gmtls #服務端
gmssl s_client -connect localhost:443 -key Client.key -cert ClientCA.crt -CAfile RootCA.crt -msg -debug -gmtls#客戶端
-servername 雙證書:這個其實是有漏洞的,必須先設置簽名證書。。然后才是加密證書
測試不通(去掉 -gmtls可以通。可以加上參數: -cipher ECDHE-SM2-WITH-SMS4-GCM-SM3 )。參見:https://blog.csdn.net/tmaccs/article/details/103293957
1. error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher:ssl/statem/statem_srvr.c:1502: 2. 140616840058688:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl/record/rec_layer_s3.c:1385:SSL alert number 40 --- no peer certificate available --- No client certificate CA names sent ———————————————— 版權聲明:本文為CSDN博主「敬致知」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/tmaccs/article/details/103293957
下面是官方示例成功,socket通信:
gmssl s_server -port 443 -cipher SM2 -key Server.key -cert ServerCA.crt -www
gmssl s_server -port 443 -cipher ECDHE-SM2-WITH-SMS4-GCM-SM3 -key Server.key -cert ServerCA.crt -www
gmssl s_client -connect localhost:443 -CAfile ClientCA.crt
注:由於使用gmtls時,gmssl內部要求服務指定雙證書(簽名證書和加密證書),此處使用同一個證書ServerCA.crt ————————————————
gmssl對國標支持
gmssl ciphers -V |grep GMTLS
0xE0,0x17 - SM9-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM9 Au=SM9 Enc=SMS4(128) Mac=SM3
0xE0,0x15 - SM9DHE-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM9DHE Au=SM9 Enc=SMS4(128) Mac=SM3
0xE0,0x13 - SM2-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM2 Au=SM2 Enc=SMS4(128) Mac=SM3
0xE0,0x11 - SM2DHE-WITH-SMS4-SM3 GMTLSv1.1 Kx=SM2DHE Au=SM2 Enc=SMS4(128) Mac=SM3
0xE0,0x1A - RSA-WITH-SMS4-SHA1 GMTLSv1.1 Kx=RSA Au=RSA Enc=SMS4(128) Mac=SHA1
0xE0,0x19 - RSA-WITH-SMS4-SM3 GMTLSv1.1 Kx=RSA Au=RSA Enc=SMS4(128) Mac=SM3
OpenSSL命令---s_client
用途:
s_client為一個SSL/TLS客戶端程序,與s_server對應,它不僅能與s_server進行通信,也能與任何使用ssl協議的其他服務程序進行通信。
用法:
openssl s_client [-host host] [-port port] [-connect host:port] [-verify depth] [-cert filename]
[-certform DER|PEM] [-key filename] [-keyform DER|PEM] [-pass arg] [-CApath directory] [-CAfile filename]
[-reconnect][-pause] [-showcerts] [-debug] [-msg] [-state] [-nbio_test] [-nbio][-crlf] [-ign_eof] [-no_ign_eof]
[-quiet] [-ssl2] [-ssl3] [-tls1_1] [-tls1_2] [-tls1] [-dtls1] [-no_ssl2][-no_ssl3] [-no_tls1] [-no_tls1_1]
[-no_tls1_2] [-bugs] [-cipher cipherlist] [-starttls protocol] [-engine id] [-tlsextdebug] [-no_ticket]
[-sess_out filename] [-sess_in filename] [-rand file(s)]
選項說明:
-host host:設置服務地址。
-port port:設置服務端口,默認為4433。
-connect host:port:設置服務器地址和端口號。如果沒有設置,則默認為本地主機以及端口號4433。
-verify depth:設置證書的驗證深度。記得CA也是分層次的吧?如果對方的證書的簽名CA不是Root CA,那么你可以再去驗證給該CA的證書簽名的CA,一直到Root CA. 目前的驗證操作即使這條CA鏈上的某一個證書驗證有問題也不會影響對更深層的CA的身份的驗證。所以整個CA鏈上的問題都可以檢查出來。當然CA的驗證出問題並不會直接造成連接馬上斷開,好的應用程序可以讓你根據驗證結果決定下一步怎么走。
-cert filename:使用的證書文件。如果server不要求要證書,這個可以省略。
-certform DER|PEM:證書的格式,一般為DER和PEM。默認為PEM格式。
-key filename:使用的證書私鑰文件。
-keyform DER|PEM:證書私鑰文件的格式,一般為DER和PEM。默認為PEM格式。
-pass arg:私鑰保護口令來源,比如:-pass file:pwd.txt,將私鑰保護口令存放在一個文件中,通過此選項來指定,不需要用戶來輸入口令。
-CApath directory:設置信任CA文件所在路徑,此路徑中的ca文件名采用特殊的形式:xxx.0,其中xxx為CA證書持有者的哈希值,它通過x509 -hash命令獲得。
-CAfile filename:某文件,里面是所有你信任的CA的證書的內容。當你要建立client的證書鏈的時候也需要用到這個文件。
-reconnect:使用同樣的session-id連接同一個server五次,用來測試server的session緩沖功能是否有問題。
-pause:每當讀寫數據時,sleep 1秒。
-showcerts:顯示整條server的證書的CA的證書鏈。否則只顯示server的證書。
-debug:打印所有的調試信息。
-msg:用16進制顯示所有的協議數據。
-state:打印SSL session的狀態, ssl也是一個協議,當然有狀態。
-nbio_test:檢查非阻塞socket的I/O運行情況。
-nbio:使用非阻塞socket。
-crlf:把在終端輸入的換行回車轉化成/r/n送出去。
-ign_eof:當輸入文件到達文件尾的時候並不斷開連接。
-no_ign_eof:當輸入文件到達文件尾的時候斷開連接。
-quiet:不打印出session和證書的信息。同時會打開-ign_eof這個選項。
-ssl2、-ssl3、-tls1_1、-tls1_2、-tls1、-dtls1、-no_ssl2、-no_ssl3、-no_tls1、-no_tls1_1、-no_tls1_2:使用的協議狀態值。
-bugs:兼容老版本服務端的中的bug。
-cipher cipherlist:由我們自己來決定選用什么加密算法,盡管是由server來決定使用什么算法列表,但它一般都會采用我們送過去的cipher列表里的第一個cipher。
-starttls protocol:protocol可以為smtp或pop3,用於郵件安全傳輸。
-engine id:硬件引擎。
-tlsextdebug:打印TLS協議中服務器端接收到的額外信息值。
-no_ticket:不支持RFC4507bis會話類型。
-sess_out filename:輸出SSL會話信息值到filename中。
-sess_in filename:從filename中獲取SSL Session值。
-rand file(s):指定隨機數種子文件,多個文件間用分隔符分開,windows用“;”,OpenVMS用“,“,其他系統用“:”。
連接選項:
如果一個確認的連接到SSL服務器,並顯示了從服務器端接收到了的數據,任何操作都被發送到服務器。當交互(這意味着沒有給出B<-quiet> 、B<-ign_eof>這兩個選項)的時候,如果命令行B<R>,被設置則session有可能會被重啟。如果設置的是命令行B<Q>或到達了文件的結尾,連接將會被斷開。
注意:
S_client可用於調試SSL服務器端。為了連接一個SSL HTTP服務器,命令如下:
openssl s_client -connect servername:443
一旦和某個SSL server建立連接之后,所有從server得到的數據都會被打印出來,所有你在終端上輸入的東西也會被送給server. 這是人機交互式的。這時候不能設置-quiet和 -ign_eof這倆個選項。如果輸入的某行開頭字母是R,那么在這里session會重啟, 如果輸入的某行開頭是Q,那么連接會被斷開。你完成整個輸入之后連接也會被斷開。
如果連接成功,你可以用HTTP的指令,比如"GET /"什么的去獲得網頁了。
如果握手失敗,原因可能有以下幾種:
1. server需要驗證你的證書,但你沒有證書。
2. 如果肯定不是原因1,那么就慢慢一個一個set以下幾個選項:-bugs, -ssl2, -ssl3, -tls1,-no_ssl2,-no_ssl3, -no_dtls。
3. 這可能是因為對方的server處理SSL有bug。
有的時候,client會報錯:沒有證書可以使用,或者供選擇的證書列表是空的。這一般是因為Server沒有把給你簽名的CA的名字列進它自己認為可以信任的CA列表,你可以用檢查一下server的信任CA列表。有的http server只在 client給出了一個URL之后才驗證client的證書,這中情況下要設置 -prexit這個選項,並且送給server一個頁面請求。
即使使用-cert指明使用的證書,如果server不要求驗證client的證書,那么該證書也不會被驗證。所以不要以為在命令行里加了-cert 的參數又連接成功就代表你的證書沒有問題。
如果驗證server的證書有問題,就可以設置-showcerts來看看server的證書的CA鏈了。
自從SSLv23客戶端hello不能夠包含壓縮方法或擴展僅僅會被支持。
BUGs:
因為該項目有很多選項,好多用的是老的技術,c代碼的s_client很難去讀取為什么會被關閉。一個典型的SSL客戶端項目將會更加簡單的。
如果服務器驗證失敗,B<-verify>將會退出。
B<-prexit>選項是一個很小的空間。當一個session重啟后,我們必須報告。
————————————————
版權聲明:本文為CSDN博主「盧隊長」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/as3luyuan123/article/details/16812071
OpenSSL 1.1.1 國密SM2 SM3 SM4 SM9 ZUC EEA3 EIA3 SM2 +SM3簽名 源碼 Demo 下載 OpenSSL iOS端庫下載
最近因為需要研究國密,所以尋找加密庫,demo就很重要了,這里記錄下。
直接進入正文,附上OpenSSL GitHub官網的下載地址,最新的已經支持國密了。
https://github.com/openssl/openssl
進入GitHub 下載OpenSSL demo,你會發現移動端 安卓,iOS的庫呢?What F ?
網上找了很多,最新的基本沒有。基本需要自己編譯OpenSSL,這個過程很痛苦,你可以試試!
最后我用了一個大神的腳本,勝利解決打包成libcrypto.a libssl.a 文件,支持armv7,arm64,armv7s,i386,x86_64,附上大神GitHub鏈接
https://github.com/x2on/OpenSSL-for-iPhone
這里還有個插曲,以前用過支付寶里的OpenSSL,來進行RSA簽名,驗證簽名,加解密。最近下了SDK發現最新的阿里支付SDK沒找到SM2文件。於是又斷了一條路。(其實OpenSSL提供一些編譯指令,可以摒棄一些無用的算法,比如no sm2.這樣減少libssl,libcrypto包大小)
庫有了,查看SM2,SM3,SM4 加密OpenSSL的代碼,發現很好很強大
/*
SM2 signature generation. Assumes input is an SM3 digest
*/
int SM2_sign(int type, const unsigned char *dgst, int dgstlen,
unsigned char *sig, unsigned int *siglen, EC_KEY *eckey);
/*
*SM2 signature verification. Assumes input is an SM3 digest
*/
int SM2_verify(int type, const unsigned char *dgst, int dgstlen,
const unsigned char *sig, int siglen, EC_KEY *eckey);
int SM2_encrypt(const EC_KEY *key,
const EVP_MD *digest,
const uint8_t *msg,
size_t msg_len,
uint8_t *ciphertext_buf, size_t *ciphertext_len);
int SM2_decrypt(const EC_KEY *key,
const EVP_MD *digest,
const uint8_t *ciphertext,
size_t ciphertext_len, uint8_t *ptext_buf, size_t *ptext_len);
每個參數沒有備注,就問你怕不怕。API的話,你可以去
https://www.feistyduck.com/library/openssl-cookbook/
沒賬號的話,需要注冊登錄。注冊騰訊郵箱可以,新浪郵箱半天都沒收到確認鏈接。然后可以下載,或者在線查看相關英文Api。然后呢發現沒有SM2 Api的(可能我方法有誤,你可以找找,目前還在摸着石頭過河中)。
OpenSS庫,說完了。說說SM2,SM3,SM4 加解密。網上代碼層出不窮,可是能用的沒有幾個。好不容易能用了,然后各種加密解密不成功,或者簽名,驗證簽名失敗。只能自己慢慢摸索了,好不容易搞通了加解密,簽名和驗證簽名。這里附上demo的鏈接。
iOS demo SM2,SM4 加密算法,SM2+SM3簽名
https://download.csdn.net/download/asia_zhangqq/10835061
OpenSSl 支持國密 1.1.1版本 iOS打包最新版本,支持armv7,arm64,armv7s,i386,x86_64
https://download.csdn.net/download/asia_zhangqq/10835116
最后奉上最新研究國密大招,包含SM2加解密,SM2+SM3 簽名,驗證簽名,SM4加解密,ZUC包括EEA3 EIA3加密。同時兼容armv7,arm64,armv7s,i386,x86_64架構。以下鏈接是demo地址。
https://download.csdn.net/download/asia_zhangqq/10922992
奉上最新的SM9算法。代碼是基於GMSSL的國密SM9算法。包括簽名,密鑰交換,加密,解密。demo直接運行就可以,有相關測試數據。
https://download.csdn.net/download/asia_zhangqq/10925337
看到這里你可能納悶,OpenSSL的SM9國密算法呢,不好意思還沒有。所以采用GMSSL的SM9來代替。但是這個庫編譯armv7,arm64,armv7s,i386,x86_64架構也有一序列問題。
這里是官網http://gmssl.org。一直維護更新在。
然后issue的話你可以看GMSSL的git官網問題,目前遇到卡住問題就在issue里的。
https://github.com/guanzhi/GmSSL這是GMSSL的github鏈接
————————————————
版權聲明:本文為CSDN博主「Asia_ZhangQQ」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Asia_ZhangQQ/article/details/84876111
Yes, I mean a .gn file. Which .gn file depends on what you're adding and who needs to call it.