Linux實現樹莓派3B的國密SM9算法交叉編譯——(二)miracl庫的測試與靜態庫的生成


  先參考這篇文章 

  Linux實現樹莓派3B的國密SM9算法交叉編譯——(一)環境部署、簡單測試與eclipse工程項目測試 

  部署好環境,並簡單測試交叉編譯環境是否安裝成功,最后實現在Eclipse上進行交叉編譯。

  這篇文章主要介紹在Eclipse上進行miracl的交叉編譯測試與生成miracl靜態庫,方便后續實現國密SM9算法。

一、MIRACL庫介紹

  MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所開發的一套關於大數運算函數庫,用來設計與大數運算相關的密碼學之應用,包含了RSA 公開密碼學、Diffie-Hellman密鑰交換(Key Exchange)、AES、DSA數字簽名,還包含了較新的橢圓曲線密碼學(Elliptic CurveCryptography)等等。運算速度快,並提供源代碼。

  MIRACL用戶手冊(譯):https://wenku.baidu.com/view/d542f2ed0975f46527d3e1dc.html

  由於畢業論文涉及到國密SM9算法,所以需要在樹莓派中實現該SM9,查閱相關資料,有大神已經在windows平台上用miracl庫實現了(https://blog.csdn.net/yaoyuanyylyy/article/details/80871509),然后自己同樣在windows平台部署成功,但是需要和樹莓派做秘鑰協商,因此經過大量嘗試,最后找到一個可行的方法,由於樹莓派使用的是ARM處理器,所以需要通過交叉編譯部署我們的國密算法。

二、MIRACL下載並在Kali上進行編譯以及pk-demo測試

1、 從https://github.com/miracl/MIRACL/archive/master.zip下載github下的項目源碼。我下載的是.zip壓縮包,名字為MIRACL-master.zip。

2、 建立一個目錄miracl用來放置源碼

cd /root
mkdir miracl

3、 將下載成功的MIRACL-mater.zip放到上述創建的miracl目錄

cd miracl
cp ../MIRACL-master.zip ./MIRACL-master.zip

4、 解壓zip包,把所有獨立的文件都放在這個目錄,即將所有非目錄的文件解壓在當前目錄下

unzip -j -aa -L MIRACL-master.zip
rm MIRACL-master.zip

5、 用shell文件編譯。如果是64位系統用linux64,如果是32位系統用linux。由於我的系統為64位Kali Linux,因此執行如下命令

bash linux64

如果提示沒有安裝g++,請使用  sudo apt-get install g++ 進行安裝。

6、 運行源碼提供的示例代碼 pk-demo,測試一下是否編譯成功。

./pk-demo

這個程序是個簡單檢驗,迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)協議的正確性,如果輸出無錯誤則表示編譯完成 ,

編譯完成並成功運行!

 

linux64編譯代碼如下:

rm *.exe
rm miracl.a
cp mirdef.h64 mirdef.h
gcc -c -m64 -O2 mrcore.c
gcc -c -m64 -O2 mrarth0.c
gcc -c -m64 -O2 mrarth1.c
gcc -c -m64 -O2 mrarth2.c
gcc -c -m64 -O2 mralloc.c
gcc -c -m64 -O2 mrsmall.c
gcc -c -m64 -O2 mrio1.c
gcc -c -m64 -O2 mrio2.c
gcc -c -m64 -O2 mrgcd.c
gcc -c -m64 -O2 mrjack.c
gcc -c -m64 -O2 mrxgcd.c
gcc -c -m64 -O2 mrarth3.c
gcc -c -m64 -O2 mrbits.c
gcc -c -m64 -O2 mrrand.c
gcc -c -m64 -O2 mrprime.c
gcc -c -m64 -O2 mrcrt.c
gcc -c -m64 -O2 mrscrt.c
gcc -c -m64 -O2 mrmonty.c
gcc -c -m64 -O2 mrpower.c
gcc -c -m64 -O2 mrsroot.c
gcc -c -m64 -O2 mrcurve.c
gcc -c -m64 -O2 mrfast.c
gcc -c -m64 -O2 mrshs.c
gcc -c -m64 -O2 mrshs256.c
gcc -c -m64 -O2 mrshs512.c
gcc -c -m64 -O2 mrsha3.c
gcc -c -m64 -O2 mrfpe.c
gcc -c -m64 -O2 mraes.c
gcc -c -m64 -O2 mrgcm.c
gcc -c -m64 -O2 mrlucas.c
gcc -c -m64 -O2 mrzzn2.c
gcc -c -m64 -O2 mrzzn2b.c
gcc -c -m64 -O2 mrzzn3.c
gcc -c -m64 -O2 mrzzn4.c
gcc -c -m64 -O2 mrecn2.c
gcc -c -m64 -O2 mrstrong.c
gcc -c -m64 -O2 mrbrick.c
gcc -c -m64 -O2 mrebrick.c
gcc -c -m64 -O2 mrec2m.c
gcc -c -m64 -O2 mrgf2m.c
gcc -c -m64 -O2 mrflash.c
gcc -c -m64 -O2 mrfrnd.c
gcc -c -m64 -O2 mrdouble.c
gcc -c -m64 -O2 mrround.c
gcc -c -m64 -O2 mrbuild.c
gcc -c -m64 -O2 mrflsh1.c
gcc -c -m64 -O2 mrpi.c
gcc -c -m64 -O2 mrflsh2.c
gcc -c -m64 -O2 mrflsh3.c
gcc -c -m64 -O2 mrflsh4.c
cp mrmuldv.g64 mrmuldv.c
gcc -c -m64 -O2 mrmuldv.c
ar rc miracl.a mrcore.o mrarth0.o mrarth1.o mrarth2.o mralloc.o mrsmall.o mrzzn2.o mrzzn3.o
ar r miracl.a mrio1.o mrio2.o mrjack.o mrgcd.o mrxgcd.o mrarth3.o mrbits.o mrecn2.o mrzzn4.o
ar r miracl.a mrrand.o mrprime.o mrcrt.o mrscrt.o mrmonty.o mrcurve.o mrsroot.o mrzzn2b.o
ar r miracl.a mrpower.o mrfast.o mrshs.o mrshs256.o mraes.o mrlucas.o mrstrong.o mrgcm.o    
ar r miracl.a mrflash.o mrfrnd.o mrdouble.o mrround.o mrbuild.o
ar r miracl.a mrflsh1.o mrpi.o mrflsh2.o mrflsh3.o mrflsh4.o 
ar r miracl.a mrbrick.o mrebrick.o mrec2m.o mrgf2m.o mrmuldv.o mrshs512.o mrsha3.o mrfpe.o
rm mr*.o
gcc -m64 -O2 bmark.c miracl.a -o bmark
gcc -m64 -O2 fact.c miracl.a -o fact
g++ -c -m64 -O2 big.cpp
g++ -c -m64 -O2 zzn.cpp
g++ -c -m64 -O2 ecn.cpp
g++ -c -m64 -O2 ec2.cpp
g++ -c -m64 -O2 crt.cpp
g++ -m64 -O2 mersenne.cpp big.o miracl.a -o mersenne
g++ -m64 -O2 brent.cpp big.o zzn.o miracl.a -o brent
g++ -c -m64 -O2 flash.cpp
g++ -m64 -O2 sample.cpp flash.o miracl.a -o sample
g++ -m64 -O2 ecsgen.cpp ecn.o big.o miracl.a -o ecsgen
g++ -m64 -O2 ecsign.cpp ecn.o big.o miracl.a -o ecsign
g++ -m64 -O2 ecsver.cpp ecn.o big.o miracl.a -o ecsver
g++ -m64 -O2 pk-demo.cpp ecn.o big.o miracl.a -o pk-demo
g++ -c -m64 -O2 polymod.cpp
g++ -c -m64 -O2 poly.cpp
g++ -m64 -O2 schoof.cpp polymod.o poly.o ecn.o crt.o zzn.o big.o miracl.a -o schoof
View Code

三、使用Eclipse進行交叉編譯,並在樹莓派上運行pk-demo測試 

1、創建交叉應用工程
在 Eclipse 主界面點擊菜單 File > New > C/C++ Project > C++ Managed Build,在彈出的“C++ Project”對話框中,輸入項目名稱為 miracl_cross_pk_demo_cpp 。選擇一個項目類型(如Executable/Empty Project),在 Toolchains 中一定要選 Cross GCC,這是CDT對交叉環境的支持,提供了額外的功能,以方便嵌入式應用程序的開發。

點擊下一步,來到“Select Configurations”頁面,我們采用默認,直接下一步,來到“Cross GCC Command”的設置。這里我們可以填寫交叉編譯工具鏈的交綴和路徑,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(別打錯!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

 

最后點擊完成,一個交叉項目就創建好了。關於交叉編譯前綴和路徑的設置,在項目創建后,可以在項目的屬性中改變它。

2、添加頭文件及源文件

在miracl_cross_pk_demo_cpp項目中添加  include、src文件夾,其中include用於存放miracl相關文件,src用於存放pk-demo.cpp源文件

拷貝文件之前,先將arm版的mirdef.arm文件替換 mirdef.h 文件(此步驟重要!!!),

cp mirdef.arm mirdef.h  #試用arm版的mirdef頭文件

然后再將以下文件從miracl文件夾中拷貝到 include 文件夾中(不需要拷貝mrmuldv.c,因為mrmuldv.c這個文件中的函數已經在mrcore.c文件中實現,否則會編譯出錯!!!)

big.cpp   mirdef.h   mrbuild.c   mrflash.c  mrgf2m.c   mrrand.c    mrstrong.c
big.h     mraes.c    mrcore.c    mrflsh1.c  mrio1.c    mrround.c   mrxgcd.c
crt.cpp   mralloc.c  mrcrt.c     mrflsh2.c  mrio2.c    mrscrt.c    mrzzn2b.c
crt.h     mrarth0.c  mrcurve.c   mrflsh3.c  mrjack.c   mrsha3.c    mrzzn2.c
ec2.cpp   mrarth1.c  mrdouble.c  mrflsh4.c  mrlucas.c  mrshs256.c  mrzzn3.c
ec2.h     mrarth2.c  mrebrick.c  mrfpe.c    mrmonty.c  mrshs512.c  mrzzn4.c
ecn.cpp   mrarth3.c  mrec2m.c    mrfrnd.c   mrpi.c     mrshs.c     zzn.cpp
ecn.h     mrbits.c   mrecn2.c    mrgcd.c    mrpower.c  mrsmall.c   zzn.h
miracl.h  mrbrick.c  mrfast.c    mrgcm.c    mrprime.c  mrsroot.c

 再將miracl中的 pk-demo.cpp 文件拷貝到 src 下,並改名為 main.cpp

3、設置工程屬性(頭文件包含位置)

右擊工程,選擇properties,在左側欄中選中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本項目的include文件夾:

 

 Apply and Close 應用並保存設置。

4、編譯項目:Project > Build Project

編譯成功,並產生一個 Debug 文件夾,再將 Debug下的 miracl_cross_pk_demo_cpp 可執行文件拷貝到樹莓派中,

 

5、樹莓派執行

將編譯好的二進制文件拷貝到樹莓派中執行

chmod 777 miracl_cross_pk_demo_cpp     #賦予可執行權限,否則執行不了
./miracl_cross_pk_demo_cpp             #執行

 

樹莓派成功執行 pk-demo 測試程序!!!

下一步將miracl編譯為靜態庫,給國密SM9算法調用。

 

四、將miracl庫交叉編譯為靜態庫libmiracl.a

1、創建C++靜態庫應用工程
在 Eclipse 主界面點擊菜單 File > New > C/C++ Project > C++ Managed Build,在彈出的“C++ Project”對話框中,輸入項目名稱為 miracl 。選擇一個靜態庫項目類型(如 Static Library / Empty Project),在 Toolchains 中一定要選 Cross GCC,這是CDT對交叉環境的支持,提供了額外的功能,以方便嵌入式應用程序的開發。

點擊下一步,來到“Select Configurations”頁面,我們采用默認,直接下一步,來到“Cross GCC Command”的設置。這里我們可以填寫交叉編譯工具鏈的交綴和路徑,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(別打錯!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

 

最后點擊完成,一個交叉靜態庫項目就創建好了。

2、添加頭文件及源文件

在 miracl_cross 項目中添加  include 文件夾,其中 include 用於存放 miracl 相關的頭文件,src 用於存放 miracl 相關的源文件

然后將 miracl_cross_pk_demo_cpp/include 中的 *.h 頭文件拷貝到 miracl/include 中,

big.h  crt.h  ec2.h  ecn.h  miracl.h  mirdef.h  zzn.h

 然后再將 miracl_cross_pk_demo_cpp/include 中的 *.c 和 *.cpp 源文件拷貝到 miracl/src 中,

big.cpp mrarth2.c mrdouble.c mrflsh3.c mrio2.c mrround.c mrstrong.c
crt.cpp mrarth3.c mrebrick.c mrflsh4.c mrjack.c mrscrt.c mrxgcd.c
ec2.cpp mrbits.c mrec2m.c mrfpe.c mrlucas.c mrsha3.c mrzzn2b.c
ecn.cpp mrbrick.c mrecn2.c mrfrnd.c mrmonty.c mrshs256.c mrzzn2.c
mraes.c mrbuild.c mrfast.c mrgcd.c mrpi.c mrshs512.c mrzzn3.c
mralloc.c mrcore.c mrflash.c mrgcm.c mrpower.c mrshs.c mrzzn4.c
mrarth0.c mrcrt.c mrflsh1.c mrgf2m.c mrprime.c mrsmall.c zzn.cpp
mrarth1.c mrcurve.c mrflsh2.c mrio1.c mrrand.c mrsroot.c

 

3、設置工程屬性(頭文件包含位置)

同樣,右擊工程,選擇properties,在左側欄中選中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本項目的include文件夾:

 

 

 

 Apply and Close 應用並保存設置。

4、編譯項目:Project > Build Project

 

 

 

編譯成功,並在 Debug 文件夾生成一個 libmiracl.a 靜態庫文件,

下一步將miracl編譯為靜態庫,給國密SM9算法調用。

 

五、調用第四步生成的靜態庫文件在樹莓派上測試

1、創建應用工程
在 Eclipse 主界面點擊菜單 File > New > C/C++ Project > C++ Managed Build,在彈出的“C++ Project”對話框中,輸入項目名稱為 miracl_cross_libtest 。選擇一個項目類型(如Executable/Empty Project),在 Toolchains 中一定要選 Cross GCC,這是CDT對交叉環境的支持,提供了額外的功能,以方便嵌入式應用程序的開發。

點擊下一步,來到“Select Configurations”頁面,我們采用默認,直接下一步,來到“Cross GCC Command”的設置。這里我們可以填寫交叉編譯工具鏈的交綴和路徑,如:

Cross compiler prefix: arm-linux-gnueabihf-  #(別打錯!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

 

最后點擊完成,一個應用項目就創建好了。

2、添加頭文件、源文件及庫文件

在 miracl_cross_libtest 項目中添加  include、src、lib文件夾,其中include用於存放miracl相關頭文件,src用於存放pk-demo.cpp源文件,lib用於存放libmiracl.a庫文件。

將 miracl_cross/include 中的 *.h 頭文件拷貝到 miracl_cross_libtest/include 中,

將 miracl_cross/Debug 中的 libmiracl.a 庫文件拷貝到 miracl_cross_libtest/lib 中,

 將 miracl中的 pk-demo.cpp 文件拷貝到 src 下,並改名為 main.cpp

 

 

 3、設置工程屬性(頭文件與庫文件包含位置)

右擊工程,選擇properties,在左側欄中選中C/C++ Build → Settings → Tool Settings,Cross GCC Compiler 中的 includes 和 Cross G++ Compiler 中的 includes 都要添加本項目的include文件夾:

頭文件不再截圖,配置庫文件 如下(Other options 不要添加內容!!!)

 Apply and Close 應用並保存設置。

4、編譯項目:Project > Build Project

 

 

編譯成功,並產生一個 Debug 文件夾,再將 Debug下的 miracl_cross_libtest 可執行文件拷貝到樹莓派中,

5、樹莓派執行

將編譯好的二進制文件拷貝到樹莓派中執行

chmod 777 miracl_cross_libtest     #賦予可執行權限,否則執行不了
./miracl_cross_libtest             #執行

樹莓派成功執行 pk-demo 測試程序!!!

下一步將miracl編譯為靜態庫,給國密SM9算法調用。

下一篇文章:

Linux實現樹莓派3B的國密SM9算法交叉編譯——(三)國密SM9算法實現

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=4oq6ozctttwy

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM