Tre*_*saL 5 c openssl powerpc undefined-reference
在 OpenSSL(版本 1.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)
Run Code Online (Sandbox Code Playgroud)
用于OPENSSL_madd300_probe生成crypto/build.info:
GENERATE[ppccpuid.s]=ppccpuid.pl $(PERLASM_SCHEME)
Run Code Online (Sandbox Code Playgroud)
并且在主Makefile(生成的makefile)中,有如下几行:
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
Run Code Online (Sandbox Code Playgroud)
接下来是:
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) $@
Run Code Online (Sandbox Code Playgroud)
谁能解释一下 .s 是如何从 .pl 文件生成的?我需要将它们添加到项目内的 Makefile 中,以解决undefined reference由 .pl 文件生成定义的函数出现的错误。
如何从 OpenSSL 中的 Perl 脚本生成程序集文件...
您正在 Power8 上使用AES 的Cryptogams 实现。Cryptogams 是 Andy Polyakov 的项目,旨在为其他开发人员提供高速加密技术。
汇编语言文件是用 xlat 程序生成的。对于 Power8 设备,该文件位于ppc-xlate.pl该perlasm目录中。aesp8-ppc.pl它由目录中使用crypto/aes/asm。
这是你如何翻译它。我在编译场(ppc64le)上的 GCC112 上工作。
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
Run Code Online (Sandbox Code Playgroud)
aesp8-ppc.pl生成一个纯汇编语言源文件,因此将输出文件命名为小*.s. 有时翻译包括 C 预处理器语句,并且需要一个大的*.S(但在本例中不是)。
的第二个参数aesp8-ppc.pl称为flavor。它ppc64le在上面的命令中。味道有两个作用。首先,它选择 32 位或 64 位。其次,它选择小端字节序或大端字节序。一定要确保味道正确。
根据 Andy at ppc8 does not build on powerpc64 big-endian,big-endian PowerPC 应该使用linux64,而不是linux64be。然而,需要小尾数法linux64le。
完成后,您aesp8-ppc.s可以使用 GCC 编译和汇编源文件。
gcc -mcpu=power8 -c aesp8-ppc.s
Run Code Online (Sandbox Code Playgroud)
进而:
$ 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
...
Run Code Online (Sandbox Code Playgroud)
此时您已经有了一个目标文件,但您不知道 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
Run Code Online (Sandbox Code Playgroud)
您对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);
Run Code Online (Sandbox Code Playgroud)
起泡沫,冲洗,重复AES_KEY、aes_p8_set_decrypt_key、aes_p8_encrypt和aes_p8_decrypt。
最终你会得到像Cryptogams |中所示的标题。AES或Cryptogams | OpenSSL wiki 上的SHA 。密码游戏 | AES和加密货币 | SHA是为 ARMv4 编写的,但同样也适用于 Power8。
安迪为其作品授予双重许可。一种许可证是 OpenSSL 许可证,因为 Andy 为 OpenSSL 工作。第二个许可证是 BSD 样式许可证,没有 OpenSSL 的阻碍。
Andy 的公共源代码位于GitHub | 点汇编。不幸的是,Andy 的很多作品尚未上传,因此您必须从 OpenSSL 中提取它。而且很多内容都没有记录在案,因此您必须在 OpenSSL 源代码中进行大量的探索和探索。
据我所知,您可以在两个地方查找有关使用 Cryptogams 和 Power8 加密技术的文档。首先是 OpenSSL wiki 页面Cryptogams | AES和加密货币 | 沙。这些教程是 ARMv4,但也适用于 Power 8。我写了维基文章,所以错误和遗漏都是我的错误。
第二个要看的地方是 GitHub 和Noloader | POWER8 加密。我帮助维护 Crypto++,POWER8 加密书是我的知识库。POWER8 书在第 7 章中包括用于 PowerPC 的 Cryptogams SHA。
POWER8 加密书籍是由 Bill Schmidt 和我编写的,因为我们在 Power8 上使用 AES 和 SHA 时找不到文档。Bill Schmidt 在 IBM 工作,但他也无法获得这些文档。我们所能找到的只是一位 IBM 工程师的博客文章,其中严重缺少细节。
| 归档时间: |
|
| 查看次数: |
1932 次 |
| 最近记录: |