首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从OpenSSL中的perl脚本生成程序集文件

如何从OpenSSL中的perl脚本生成程序集文件
EN

Stack Overflow用户
提问于 2017-09-20 12:33:25
回答 1查看 1.6K关注 0票数 4

在OpenSSL的开源代码(Version1.1.0e)中,我看到一些函数定义是由文件夹中的perl文件生成的。在密码中每个文件夹中的build.info文件中,它们都编写了一些行,以便从相应的.pl生成.s。

例如,在aes_p8_set_encrypt_key中生成crypto/aes/build.info

代码语言:javascript
复制
GENERATE[aesp8-ppc.s]=asm/aesp8-ppc.pl $(PERLASM_SCHEME)

用于在OPENSSL_madd300_probe中生成crypto/build.info

代码语言:javascript
复制
GENERATE[ppccpuid.s]=ppccpuid.pl $(PERLASM_SCHEME)

在主Makefile(generated )中,还有如下几行:

代码语言:javascript
复制
crypto/aes/aes-x86_64.o: crypto/aes/aes-x86_64.s
$(CC)  -I. -Icrypto/include -Iinclude $(CFLAGS) $(LIB_CFLAGS) -MMD -MF crypto/aes/aes-x86_64.d.tmp -MT $@ -c -o $@ crypto/aes/aes-x86_64.s
@touch crypto/aes/aes-x86_64.d.tmp
@if cmp crypto/aes/aes-x86_64.d.tmp crypto/aes/aes-x86_64.d > /dev/null 2> /dev/null; then \
    rm -f crypto/aes/aes-x86_64.d.tmp; \
else \
    mv crypto/aes/aes-x86_64.d.tmp crypto/aes/aes-x86_64.d; \
fi

其次是:

代码语言:javascript
复制
crypto/aes/aes-x86_64.s: crypto/aes/asm/aes-x86_64.pl
CC="$(CC)" $(PERL) crypto/aes/asm/aes-x86_64.pl $(PERLASM_SCHEME) $@

有人能解释.s是如何从.pl文件中生成的吗?我需要将它们添加到项目中的Makefile中,以解决由undefined reference文件生成其定义的函数的.pl错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-07 12:20:57

如何从OpenSSL中的Perl脚本生成程序集文件.

您正在使用密码实现 of AES在Power8上。密码是Andy为其他开发人员提供高速加密技术的项目。

汇编语言文件由xlat程序生成。对于Power8设备,文件是perlasm目录中的ppc-xlate.pl。它由aesp8-ppc.plcrypto/aes/asm目录中使用。

这是你翻译它的方法。我在编译场上的GCC112工作,那是ppc64le。

代码语言:javascript
复制
git clone https://github.com/openssl/openssl.git
mkdir cryptogams

cp ./openssl/crypto/perlasm/ppc-xlate.pl cryptogams/
cp ./openssl/crypto/aes/asm/aesp8-ppc.pl cryptogams/

cd cryptogams/
chmod +x *.pl

./aesp8-ppc.pl ppc64le aesp8-ppc.s

aesp8-ppc.pl生成一个纯汇编语言源文件,因此将输出文件命名为小*.s。有时翻译包括C预处理语句,它需要一个大的*.S (但在本例中不是这样)。

aesp8-ppc.pl的第二个参数称为flavor。上面的命令是ppc64le。味道可以做两件事。首先,它选择32位或64位.第二,它选择小端点或大端。一定要把味道弄对。

ppc8不以powerpc64大端为基础。的安迪认为,大端PowerPC应该使用linux64,而不是linux64be。不过,小终端需要linux64le

一旦您拥有了aesp8-ppc.s,您就可以使用GCC编译和组装源文件了。

代码语言:javascript
复制
gcc -mcpu=power8 -c aesp8-ppc.s

然后:

代码语言:javascript
复制
$ objdump --disassemble aesp8-ppc.o
aesp8-ppc.o:     file format elf64-powerpcle
...

0000000000000420 <aes_p8_set_decrypt_key>:
     420:       c1 ff 21 f8     stdu    r1,-64(r1)
     424:       a6 02 48 7d     mflr    r10
     428:       50 00 41 f9     std     r10,80(r1)
     42c:       75 fc ff 4b     bl      a0 <aes_p8_set_encrypt_key>
     430:       a6 03 48 7d     mtlr    r10
     434:       00 00 03 2c     cmpwi   r3,0
     438:       68 00 c2 40     bne-    4a0 <Ldec_key_abort>
     43c:       36 20 07 55     rlwinm  r7,r8,4,0,27
     440:       10 ff 65 38     addi    r3,r5,-240
     444:       7e f8 08 55     rlwinm  r8,r8,31,1,31
     448:       14 3a a3 7c     add     r5,r3,r7
     44c:       a6 03 09 7d     mtctr   r8
...

此时您有一个对象文件,但您不知道API签名或如何使用它。要了解下一步要做什么,您必须先使用objdump,然后再使用grep OpenSSL源代码来查看它们是如何使用的。

代码语言:javascript
复制
$ nm aesp8-ppc.o | grep ' T '
00000000000006c0 T aes_p8_cbc_encrypt
0000000000001140 T aes_p8_ctr32_encrypt_blocks
00000000000005c0 T aes_p8_decrypt
00000000000004c0 T aes_p8_encrypt
0000000000000420 T aes_p8_set_decrypt_key
00000000000000a0 T aes_p8_set_encrypt_key
0000000000001d00 T aes_p8_xts_decrypt
0000000000001a60 T aes_p8_xts_encrypt

您对四个函数aes_p8_set_encrypt_keyaes_p8_set_decrypt_keyaes_p8_encryptaes_p8_decrypt感兴趣。您将使用您找到的签名为您的程序创建一个头文件。

我会帮你做第一个:aes_p8_set_encrypt_key

代码语言:javascript
复制
$ cd openssl

# Find aes_p8_set_encrypt_key
$ grep -nIR aes_p8_set_encrypt_key
crypto/evp/e_aes.c:153:# define HWAES_set_encrypt_key aes_p8_set_encrypt_key

# Now look for HWAES_set_encrypt_key
$ grep -nIR HWAES_set_encrypt_key
...
crypto/evp/e_aes.c:2515:int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
...

# Now find the complete HWAES_set_encrypt_key
$ cat -n crypto/evp/e_aes.c
...
  2515  int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
  2516                            AES_KEY *key);

AES_KEYaes_p8_set_decrypt_keyaes_p8_encryptaes_p8_decrypt重复使用。

最终,您将得到一个类似于密码学密码学在OpenSSL wiki上显示的标题。密码学密码学是为ARMv4编写的,但对于Power8也是如此。

安迪批准了他的工作。其中一个许可证是OpenSSL许可证,因为Andy为OpenSSL工作。第二个许可证是BSD风格的许可证,它没有OpenSSL的障碍。

安迪的公开消息来源是GitHub _dot。不幸的是,许多安迪的工作还没有上传,所以你必须从OpenSSL中提取它。而且很多文件都没有记录下来,所以您必须在OpenSSL源代码中进行大量的戳戳和刺激。

据我所知,有两个地方可以查找有关使用加密和Power8密码学的文档。首先是OpenSSL维基页面、密码学密码学。教程是ARMv4,但它也适用于Power 8。我写了维基文章,所以错误和遗漏是我的错误。

第二个地方是GitHub和Noloader \ POWER8密码。我帮助维护Crypto++,而POWER8密码书是我的知识转储。在第7章中,POWER8书中包含了用于PowerPC的加密算法SHA。

Power8密码书是由Bill和我写的,因为我们在POWER8上使用AES和SHA时找不到文档。比尔·施密特()在IBM工作,甚至连他都无法拿到博士学位。我们所能找到的只是一位IBM工程师的一篇博客文章,这篇文章严重缺失了细节。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46322246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档