烦恼的紫菜汤 · FontAwesome图标未显示为什么?_谷 ...· 6 月前 · |
玩篮球的火锅 · 如何在PySparkDataFrame中进行 ...· 10 月前 · |
彷徨的铁链 · mysql字符串排序_mysql字符串排序原 ...· 1 年前 · |
有情有义的卤蛋 · SourceTree的基本使用 - 掘金· 1 年前 · |
玉树临风的楼梯 · idea、vscode快捷键_51CTO博客 ...· 1 年前 · |
在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,