芯手艺 | 基于银娱优越会处置惩罚器的国密算法加速指令使用说明

宣布日期:

2020-08-21

泉源:

1.概述

信息手艺的快速生长为人类社会带来了深刻的厘革 。。。。随着盘算机手艺的快速生长,,,我国在电子银行、电子商务和电子政务等方面的普遍应用,,,使盘算机清静问题已经深入到国家的政治、经济、文化建设等各个领域,,,遍布现代信息化社会的事情和生涯的每个层面 。。。。银娱优越会天下从没有像今天这样关注知识产权、小我私家身份信息以及其他敏感信息的�;;;� 。。。。


国密算法是指由国家密码治理局制订的一系列密码标准,,,其应用领域十分普遍,,,可用于对具有敏感性的内部信息、行政事务信息、经济信息等举行加密�;;;� 。。。。好比:用于企业门禁治理、企业内部的种种敏感信息的传输加密、存储加密,,,避免不法第三方获守信息内容;;;也可用于种种清静认证、网上银行、数字署名等 。。。。


其中,,,SM3密码杂凑算法是为知足电子认证效劳系统等应用需求,,,国家密码治理局于2010年12月17日宣布 。。。。该标准适用于商用密码应用中的数字署名和验证、新闻认证码的天生与验证以及随机数的天生,,,可知足多种密码应用的清静需求 。。。。SM4分组密码算法,,,国家密码治理局于2012年3月21日宣布,,,该标准适用于密码应用中使用分组密码的需求 。。。。


现在常见的支持国密算法的装备好比芯片类的TPM/TCM,,,往往受限于其本钱而性能很低;;;性能较高的加密卡往往需要高性能的盘算机来配合,,,这就给用户带来了不小的本钱压力 。。。。而与此同时,,,经由几代产品的生长,,,银娱优越会CPU的性能有了大幅提升 。。。。在注重效能,,,强调性价比的今天,,,用户自然希望能够充分使用CPU的盘算能力,,,由此便爆发了使用CPU指令来实现国密算法的想法 。。。。这即是设计基于银娱优越会CPU的国密算法加速指令GMI(以下简称GMI)的初志 。。。。


GMI是银娱优越会依据国密算法标准而自主研发设计实现的一组硬件加速指令集 。。。。现在已经实现了两条国密算法指令:SM3和SM4 。。。。其中,,,SM4支持常见的ECB、CBC、CTR、OFB、CFB五种模式 。。。。通过对GMI的使用,,,我们不但能让密码学算法越发清静易用,,,并且还能获得比软件实现高得多的性能 。。。。


SM2指令,,,即将在下一代银娱优越会GMI里添加,,,届时,,,GMI除了支持上面提到的HASH算法SM3,,,对称算法SM4,,,还将支持非对称算法SM2的部分或所有功效,,,包括支持SM2署名和验证;;;SM2加密息争密;;;SM2密钥天生和密钥交流等功效 。。。。敬请期待 。。。。


图表 1. GMI支持的国密算法指令

指令

Opcode

说明

CCS_HASH

0xF3 0x0F 0xA6 0xE8

SM3指令

CCS_ENCRYPT

0xF3 0x0F 0xA7 0xF0

SM4指令

本文后面的章节会从GMI带给客户的价值,,,应用模子,,,指令先容和GMI软件解决计划等角度给出GMI指令在银娱优越会主流CPU上的性能评测要领和效果,,,以及GMI普遍的使用场景 。。。。并为利便客户使用GMI,,,本文还对银娱优越会GMI配套软件解决计划给出了较为详细的先容(更多适配事情也请随时联系银娱优越会) 。。。。


2.GMI带给客户的价值


2.1 易用性

古板的国密算法的使用方法中,,,较量常见的就是通过软件编程的方法来实现响应的密码算法,,,这通常都需要举行大宗、重大的编程 。。。。以OpenSSL为例,,, SM3、SM4的代码量或许在200~300行左右,,,可是在将这些密码算法举行硬件指令化后,,,原本需要使用数百行重大编码才可以实现的算法现在只需要简朴挪用一条硬件指令即可完成响应的操作 。。。。这毫无疑问大大简化了操作的重漂后,,,为用户带来了极大的便当性 。。。。


2.2 清静性

众所周知,,,无论是在运行之前,,,照旧在运行的历程中, 软件最常遇到的攻击就是被不法改动 。。。。使用软件编程实现的密码算法也同样会受到这类威胁 。。。。然而硬件不保存被改动的危害, 因此在将密码算法硬件固化后, 也就消除了密码算法被不法改动的危害,,,留给攻击者的攻击面也响应减小 。。。。并且在密码算法实现硬件化后,,,不止用于实现算法的代码量会变少,,,响应的挪用、使用密码算法的代码量也会随着镌汰,,,这也就意味着在程序中引入bug的几率也会大大降低 。。。。这些无疑都大大增强了用户程序的清静性 。。。。


2.3 高效性

通过将密码算法硬件化后,,,使得密码算法获得极大的性能提升,,,这正是我们希望充分使用CPU的盘算能力的初志 。。。。我们通过将GMI以engine方法集成到OpenSSL后,,,借助于OpenSSL的speed benchmark下令,,,测试了软、硬件两种方法下的国密算法的性能(单线程),,,对好比下(KX-6000/KX-5000/ZX-C+划分是银娱优越会CPU三代产品的代号):


图表 2. SM3性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

从上面的评测效果可以看到,,,随着摘要数据量的增大,,,在主频相当的情形下,,,GMI的性能优势相关于i7 CPU愈发明显,,,在大数据量下性能可以是Intel i7的2倍以上,,,因此使用GMI来实现SM3加密产品可以实现在更短的时间内对更大数据量的摘要盘算 。。。。


图表 3. SM4-ECB性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明


图表 4. SM4-CBC性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明


图表 5. SM4-CTR性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明


图表 6. SM4-OFB性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明


图表 7. SM4-CFB性能较量

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明

基于银娱优越会处置惩罚器的国密算法加速指令  使用说明


SM4分组密码算法往往用在大数据加密的场景下,,,因此在现实应用中其数据量往往很是大 。。。。通过上面的性能剖析比照可以看到,,,在主频相当的情形下,,,使用GMI后的加密性能均优于i7性能 。。。。特殊是在处置惩罚大数据块时,,,提升尤其显着 。。。。?


3.GMI的应用模子


3.1 SM3的应用模子

完整性是信息清静中三大基本要素CIA(confidentiality神秘性,,,integrity完整性,,,availability可用性)之一 。。。。为了确保所使用的文件或者软件是没有被黑客改动过的,,,往往需要校验文件的完整性 。。。。现在较量常见的文件校验算法有奇偶校验和CRC校验,,,可是这两种校验并没有抗数据改动的能力 。。。。然而,,,由于哈希算法的特点,,,SM3则可以校验出恣意长度的改动 。。。。因此,,,用户只需要挪用GMI的SM3指令盘算所用到的文件/软件的摘要值,,,与文件/软件自带的校验值举行较量,,,就可以磨练出文件/软件是否被改动过,,,包管了所用文件/软件的完整性 。。。。


别的,,,由于在盘算信息摘要时, 用户所体贴的主要是新闻的完整性,,,而不是神秘性,,,因此,,,在使用性能较低的清静芯片或者加密卡时,,,可以将盘算摘要值的事情交给GMI的SM3指令来完成,,,以获取更高的系统性能 。。。。


3.2 SM4的应用模子

跟其他的对称加解密算法一样,,,SM4同样可以用在静态数据加密、传输数据加密以及应用层的数据加密 。。。。


1)静态数据加密

静态数据加密一个典范应用是全磁盘加密 。。。。随着信息的电子化,,,生涯在盘算机设惫亓小我私家信息,,,商业信息等敏感数据的清静性越来越受到人们的重视 。。。。关于小我私家客户来说,,,小我私家的密码,,,照片,,,视频等一样平常都属于敏感信息 。。。。一旦这些信息面临泄露,,,小我私家隐私受到重大威胁时,,,好比存储有这些信息的盘算机装备丧失或不得不请他人维修时,,,常使用全磁盘加密手艺来解决这些问题 。。。。关于企业客户或组织来说,,,许多主要的商业神秘文件或政策文件一旦泄露就会给企业和组织带来重大损失 。。。。从一些视察来看,,,企业或组织的盘算机装备一样平常不会被偷窃,,,而其数据泄露的时机主要保存于处置惩罚旧装备或对盘算机装备举行维修时 。。。。全磁盘加密手艺可以让企业或组织在处置惩罚旧装备时或对装备举行维修时,,,纵然面临敏感信息泄露的威胁也无后顾之忧 。。。。

现在常见的全磁盘加密产品接纳的加密算法多为AES 算法,,,这在海内的一些现实应用中保存政策危害 。。。。为了知足这类现实应用的需求,,,海内的操作系统厂商或应用软件厂商会推出使用国密SM4 的全磁盘加密功效的操作系统或应用软件 。。。。而在在这些实现中,,,全磁盘加密功效一样平常都是实时的加解密数据,,,这对加解密历程的性能要求是很高的,,,此时可以使用GMI 实现国密SM4 以替换古板的纯软件实现,,,从而不但能避免算法被改动,,,还能提高运算速率 。。。。


2)云应用

构建可信云平台时,,,当云中有对数据做加密息争密需求的时间,,,可以使用GMI 实现国密SM4 替换古板的纯软件实现,,,从而不但能避免算法被改动,,,还能提高运算速率 。。。。


3)应用级加密

大部分企业和云应用将提供多种选项来对清静信息使用加密手艺 。。。。好比数据库,,,应用效劳器,,,中心件,,,邮件效劳器以及虚拟机治理程序等都会用到SM4 加密手艺 。。。。此时都可以通过GMI SM4 硬件实现来替换古板的软件实现 。。。。


4.GMI指令先容


4.1 GMI SM3

GMI SM3基本指令概况(以32位系统为例)如下表所示:

图表 8. GMI SM3基本指令概况(以32位系统为例)

指令

CCS_HASH

Opcode

0xF3 0x0F 0xA6 0xE8

Input Register

EAX

当EAX=0,,,则执行padding;

当EAX=-1,,,则不执行padding 。。。。

EBX

即是0x20,,,则以为SM3 Function被使能 。。。。

ECX

输入message的大� 。。。。�

当EAX=0,,,以byte为单位盘算;;;

当EAX=-1,,,以block( 64 bytes)为单位盘算 。。。。

RSI

指向输入的massage 。。。。

RDI

指向存放初始摘要值的内存空间 。。。。

Output Register

EAX

当EAX=0,,,则执行完指令后,,,EAX即是ECX;;;

当EAX=-1,,,则稳固化 。。。。

EBX

稳固化 。。。。

ECX

当EAX=0,,,则执行完指令后,,,ECX稳固化;;;

当EAX=-1,,,则ECX=0 。。。。

ESI

指向待执行的数据 。。。。

EDI

稳固化 。。。。最终盘算出来的摘要值存放于该地点指向的内存空间 。。。。


4.2 GMI SM4

GMI SM4基本指令概况(以32位系统为例)如下表所示:

图表 9. GMI SM4基本指令概况(以32位系统为例)

指令

CCS_ENCRYPT

Opcode

0xF3 0x0F 0xA7 0xF0

Input Register

EAX

当Bit[0]=0,,,做加密运算;;;当Bit[0]=1,,,做解密运算 。。。。

Bit[5:1]=10000,,,使能SM4功效 。。。。

Bit[10:6]:SM4模式选择

Bit 6: ECB mode

Bit 7: CBC mode

Bit 8: CFB mode

Bit 9: OFB mode

Bit 10: CTR mode

当Bit[11]=1,,,执行MAC操作;;;不然不执行 。。。。且仅针对CBC和CFB模式有用 。。。。

EBX

指向key 。。。。

ECX

要被加密或解密的数据长度 。。。。单位是128-bits的个数 。。。。

EDX

指向IV 。。。。

ESI

指向输入message 。。。。

EDI

指向加密/解密效果 。。。。

Output Register

EAX

稳固化 。。。。

EBX

稳固化 。。。。

ECX

0

ESI

指向目今待执行的数据 。。。。

EDI

指向目今加密/解密的效果 。。。。


5.GMI软件解决计划

现在,,,银娱优越会提供以下三种软件解决计划:

1)使用OpenSSL EVP接口使用GMI;;;

2)使用自力于OpenSSL架构的Linux开发库使用GMI;;;

3)使用GMI指令Sample Code自主编程使用GMI 。。。。


5.1 使用OpenSSL EVP接口使用GMI

OpenSSL是信息清静领域使用最为普遍的密码学算法支持软件库,,,它为Linux、Windows、BSD、Mac、VMS等系统提供了富厚的密码学算法支持 。。。。OpenSSL险些可以作为信息清静领域的标准密码库 。。。。因此实现基于OpenSSL的GMI挪用意义重大 。。。。


5.1.1 For OpenSSL 1.0.x and 1.1.0x

基于1.0.x版本和1.1.0x版本OpenSSL,,,我们实现了将GMI以GMI Engine的方法添加到OpenSSL中 。。。。

GMI源码链接:https://github.com/ZXOpenSource/OpenSSL-ZX-GMI

GIT下载:git clone https://github.com/ZXOpenSource/OpenSSL-ZX-GMI.git

基于1.0.x版本OpenSSL,,,包括GMI Engine的最新代码为:openssl-1.0.2j-ZX-GMI-1.2.tar.gz 。。。。

基于1.1.0x版本OpenSSL,,,包括GMI Engine的最新代码为:openssl-1.1.0e-ZX-GMI-1.1.tar.gz 。。。。


5.1.2 For OpenSSL 1.1.1x

基于1.1.1x版本的OpenSSL,,,我们将GMI Engine合并进原本就保存于OpenSSL的Padlock Engine,,,GMI Engine不再以单独Engine保存,,,而是被包括进Padlock Engine里 。。。。现在这部分代码我们正在往OpenSSL社区提交 。。。。

基于OpenSSL 1.1.1f且包括了GMI的源码可以在这里找到:?

https://github.com/ZXOpenSource/OpenSSL-ZX-GMI

为了将Padlock Engine编译进libcrypto.a中,,,请在编译OpenSSL的时间显式地加上编译选项-DPADLOCK_ASM 。。。。


5.1.3第三方应用程序通过OpenSSL使用GMI的要领

我们是通过OpenSSL的EVP接口来实现对GMI指令挪用的 。。。。


5.1.3.1GMI SM3

第一步,,,注册GMI / Padlock Engine;;;

? ? ? ? 使用OpenSSL注册接口:

ENGINE_load_builtin_engines();

ENGINE_register_all_digests();?

第二步,,,挪用GMI 。。。。使用OpenSSL EVP HASH接口,,,好比以下四个接口:

SM3

int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);

int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count);

int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size);

int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl);


5.1.3.2GMI SM4

第一步,,,注册GMI / Padlock Engine;;;

? ? ? ? 使用OpenSSL注册接口:

ENGINE_load_builtin_engines();

ENGINE_register_all_ciphers();

第二步,,,挪用GMI 。。。。使用OpenSSL EVP Encrypt/Decrypt接口,,,好比以下接口:

SM4 Encrypt

int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv);

int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl);

int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad);

SM4 Decrypt

int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,?????????????????????? ENGINE *impl, const unsigned char *key, const unsigned char *iv);

int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl);

int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);

int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad);


5.2 使用自力于OpenSSL架构的Linux开发库使用GMI

只管OpenSSL 是业界最盛行的密码学算法库,,,但尚有许多的应用场景是OpenSSL无法知足或者不适合的 。。。。因此,,,实现基于主流操作系统Linux的响应开发库能够为用户另外提供一种使用支持GMI的选择 。。。。

通过研究国家/行业的相关标准,,,调研业界对加密机/加密卡的需讨情形,,,我们总结提炼了银娱优越会国密算法指令开发库的接口需求,,,设计了基于银娱优越会国密算法指令的Linux开发库的整体架构并基于该库给出了应用例程的demo,,,用以展示通过Linux开发库使用银娱优越会国密算法指令的要领 。。。。

银娱优越会Linux开发库现在所支持的运行情形是Linux 64位情形 。。。。其对外提供两个文件,,,划分是动态库libgmi.so和gmi.h(也可以凭证客户的需求定制成其他形式好比静态库libgmi.a形式) 。。。。

Linux开发库和挪用demo可以在银娱优越会官网http://www.zhaoxin.com/获取 。。。。


5.2.1 GMI SM3

与前面提到的算法库OpenSSL类似,,,我们通过Linux库的形式给SM3算法也主要提供了四个接口函数,,,划分是:

int gmi_sm3_init()

功效:初始化SM3,,,并判断该平台是否支持GMI指令 。。。。

输入:无

输出:无

返回值:1-体现初始化乐成

0-体现初始化失败

int gmi_sm3_update(const void *data_, size_t len)

功效: 对len bytes of data at *data做SM3 update盘算 。。。。用于gmi_sm3_init()之后gmi_sm3_final()之前,,,可以多次挪用,,,以盘算疏散在差别buffer的数据 。。。。

输入:

const void *data_:要SM3的数据地点

size_t len:要SM3的数据的长度,,,单位byte

输出:无

返回值:1-体现执行乐成

0-体现执行失败

int gmi_sm3_final(unsigned char *md)

功效:SM3盘算的最后一步

输入:无

输出:

unsigned char *md:指向SM3的效果

返回值:1-体现执行乐成

0-体现执行失败

int gmi_sm3(uint8_t *InBuf, uint64_t len, uint8_t *OutBuf)

?

功效:从InBuf输入len bytes数据做SM3盘算,,,盘算效果放到OutBuf指向的存储区域 。。。。

输入:

uint8_t *InBuf:要SM3的数据地点

uint64_t len:要SM3的数据长度,,,单位byte

输出:

uint8_t *OutBuf:指向SM3的效果

返回值:1-体现执行乐成

0-体现执行失败


5.2.2 GMI SM4

与前面提到的算法库OpenSSL类似,,,我们通过Linux库的形式给SM4算法也主要提供了五个接口函数,,,划分是:

int SM4_Init(const unsigned int? cipher_mode, const unsigned char *key,const unsigned char *iv, int enc)

?

功效:初始化SM4盘算,,,并判断该平台是否支持GMI指令 。。。。

输入:

const unsigned int? cipher_mode:可输入值有:

#define SM4_ECB_MODE 0x1

#define SM4_CBC_MODE 0x2

#define SM4_CFB_MODE 0x3

#define SM4_OFB_MODE 0x4

#define SM4_CTR_MODE 0x5

const unsigned char *key:加入SM4盘算的key

const unsigned char *iv:加入SM4盘算的iv或者counter

int enc: enc =1,,,体现举行加密盘算;;; enc =0,,,体现举行解密盘算

输出:无

返回值:1-体现执行乐成

0-体现执行失败

int SM4_Update(unsigned char *out, int *outl, const unsigned char *in, int inl)

?

功效:对in输入的inl bytes数据做SM4 update盘算,,,效果为out,,,长度为outl

输入:

unsigned char *out:update盘算后的输出,,,

int *outl:update盘算后输出的长度

const unsigned char *in:update盘算的输入数据

int inl:update盘算输入数据的长度

输出:无

返回值:1-体现执行乐成

0-体现执行失败

int SM4_Final(unsigned char *out, int *outl)

?

功效:SM4盘算的最后一步

输入:无

输出:

unsigned char *out:指向final盘算的效果

int *outl:final盘算效果的长度

返回值:1-体现执行乐成

0-体现执行失败

int SM4_set_padding(int pad)

功效:设置是否padding的flag

输入:

int pad:pad=1,,,体现需要padding;;;pad=0,,,体现不需要padding 。。。。

输出:无

返回值:1-体现执行乐成

0-体现执行失败

int gmi_sm4(unsigned char *in_data, int inl, unsigned char *iv, int mode, unsigned char *key, int encrypt, unsigned char *out_data,? int *outl)

?

功效:使长度为inl的in_data数据,,,密钥为key,,,iv或者counter为iv,,,做SM4-mode encrypt/decrypt盘算,,,最终效果放在out_data 。。。。

输入:

unsigned char *in_data:指向输入数据

int inl:输入数据的长度

unsigned char *iv:输入iv或者counter

int mode:模式,,,可以从以下五种模式中选择:

#define SM4_ECB_MODE 0x1

#define SM4_CBC_MODE 0x2

#define SM4_CFB_MODE 0x3

#define SM4_OFB_MODE 0x4

#define SM4_CTR_MODE 0x5

unsigned char *key:key

int encrypt:encrypt =1,,,做加密盘算;;;encrypt=0,,,做解密盘算

输出:

unsigned char *out_data:指向SM4盘算的效果

int *outl:效果的长度 。。。。

返回值:1-体现执行乐成

0-体现执行失败


5.3使用GMI指令Sample Code自主编程使用GMI?

若是您不使用前面章节提到的银娱优越会GMI软件解决计划,,,希望能够自己编程来使用GMI,,,虽然也是可以的 。。。。下面附上GMI指令在32位和64位的sample code 。。。。


5.3.1 GMI SM3

l? 32位系统:

.size??? gmi_sm3_oneshot,.-.L_gmi_sm3_oneshot_begin

.globl?? gmi_sm3_blocks

.type??? gmi_sm3_blocks,@function

.align?? 16

gmi_sm3_blocks:

.L_gmi_sm3_blocks_begin:

???? pushl??? %ebx

???? pushl??? %edi?

???? pushl??? %esi

???? movl 16(%esp),%edi

???? movl 20(%esp),%esi

???? movl 24(%esp),%ecx

???? movl %esp,%edx

???? addl $-128,%esp

???? movups?? (%edi),%xmm0

???? andl $-16,%esp

???? movups?? 16(%edi),%xmm1

???? movaps?? %xmm0,(%esp)

???? movl %esp,%edi

???? movaps?? %xmm1,16(%esp)

???? movl $32,%ebx

???? movl $-1,%eax

.byte??? 0xf3,0x0f,0xa6,0xe8

???? movaps?? (%esp),%xmm0

???? movaps?? 16(%esp),%xmm1

???? movl %edx,%esp

???? movl 16(%esp),%edi

???? movups?? %xmm0,(%edi)

???? movups?? %xmm1,16(%edi)

???? popl %esi

???? popl %edi

???? popl %ebx

???? ret

.size??? gmi_sm3_blocks,.-.L_gmi_sm3_blocks_begin

?

l? 64位系统

.globl?? gmi_sm3_blocks

.type??? gmi_sm3_blocks,@function

.align?? 16

gmi_sm3_blocks:

???? movq %rbx,%r11

???? movq %rdx,%rcx

???? movq %rdi,%rdx

???? movups?? (%rdi),%xmm0

???? subq $128+8,%rsp

???? movups?? 16(%rdi),%xmm1

???? movaps?? %xmm0,(%rsp)

???? movq %rsp,%rdi

???? movaps?? %xmm1,16(%rsp)

???? movq $32,%rbx

???? movq $-1,%rax

.byte??? 0xf3,0x0f,0xa6,0xe8

???? movaps?? (%rsp),%xmm0

???? movaps?? 16(%rsp),%xmm1

???? addq $128+8,%rsp

???? movups?? %xmm0,(%rdx)

???? movups?? %xmm1,16(%rdx)

???? movq %r11,%rbx

???? .byte??? 0xf3,0xc3

.size??? gmi_sm3_blocks,.-gmi_sm3_blocks


5.3.2 GMI SM4

l? 32位系统:

.globl?? gmi_gx6_sm4_encrypt

.type??? gmi_gx6_sm4_encrypt,@function

.align?? 16

gmi_gx6_sm4_encrypt:

.L_gmi_gx6_sm4_encrypt_begin:

???? pushl??? %ebx

???? pushl??? %edi

???? pushl??? %esi

???? movl 16(%esp),%edi

???? movl 20(%esp),%esi

???? movl 24(%esp),%edx

???? movl 28(%esp),%ecx

???? leal 32(%edx),%ebx

???? shrl $4,%ecx

???? movl 16(%edx),%eax

.byte??? 0xf3,0x0f,0xa7,0xf0

???? popl %esi

???? popl %edi

???? popl %ebx

???? ret

.size??? gmi_gx6_sm4_encrypt,.-.L_gmi_gx6_sm4_encrypt_begin


l? 64位系统:

.globl? gmi_gx6_sm4_encrypt

.type?? gmi_gx6_sm4_encrypt,@function

.align? 16

gmi_gx6_sm4_encrypt:

??? pushq?? %rbp

??? pushq?? %rbx

??? pushq?? %rdi

??? pushq?? %rsi

??? leaq 32(%rdx),%rbx

??? shrq $4,%rcx

??? movq 16(%rdx),%rax

.byte?? 0xf3,0x0f,0xa7,0xf0

??? popq %rsi

??? popq %rdi

??? popq %rbx

??? popq %rbp

??? .byte?? 0xf3,0xc3

.size?? gmi_gx6_sm4_encrypt,.-gmi_gx6_sm4_encrypt

推荐产品

研华IPC-610工业电脑
基于银娱优越会开先? KX-6000 系列处置惩罚器
研祥IPC-710工业电脑
基于银娱优越会开先? ZX-C+ 系列处置惩罚器