在OpenSSL的开源代码(Version1.1.0e)中,我看到一些函数定义是由文件夹中的perl文件生成的。在密码中每个文件夹中的build.info文件中,它们都编写了一些行,以便从相应的.pl生成.s。
例如,在aes_p8_set_encrypt_key
中生成crypto/aes/build.info
GENERATE[aesp8-ppc.s]=asm/aesp8-ppc.pl $(PERLASM_SCHEME)
用于在OPENSSL_madd300_probe
中生成crypto/build.info
:
GENERATE[ppccpuid.s]=ppccpuid.pl $(PERLASM_SCHEME)
在主Makefile(generated )中,还有如下几行:
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
其次是:
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错误。
发布于 2018-07-07 12:20:57
如何从OpenSSL中的Perl脚本生成程序集文件.
您正在使用密码实现 of AES在Power8上。密码是Andy为其他开发人员提供高速加密技术的项目。
汇编语言文件由xlat程序生成。对于Power8设备,文件是perlasm
目录中的ppc-xlate.pl
。它由aesp8-ppc.pl
在crypto/aes/asm
目录中使用。
这是你翻译它的方法。我在编译场上的GCC112工作,那是ppc64le。
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编译和组装源文件了。
gcc -mcpu=power8 -c aesp8-ppc.s
然后:
$ 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源代码来查看它们是如何使用的。
$ 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_key
、aes_p8_set_decrypt_key
、aes_p8_encrypt
和aes_p8_decrypt
感兴趣。您将使用您找到的签名为您的程序创建一个头文件。
我会帮你做第一个:aes_p8_set_encrypt_key
。
$ 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_KEY
,aes_p8_set_decrypt_key
,aes_p8_encrypt
和aes_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工程师的一篇博客文章,这篇文章严重缺失了细节。
https://stackoverflow.com/questions/46322246
复制相似问题