Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从OpenSSL中的perl脚本生成程序集文件_C_Openssl_Undefined Reference_Powerpc - Fatal编程技术网

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

C 如何从OpenSSL中的perl脚本生成程序集文件,c,openssl,undefined-reference,powerpc,C,Openssl,Undefined Reference,Powerpc,在OpenSSL的开源代码(版本1.1.0e)中,我看到一些函数定义是由文件夹中的perl文件生成的。 在crypto内部每个文件夹中的build.info文件中,他们编写了一些行,以从相应的.pl生成.s 例如,在crypto/aes/build.info中生成aes\u p8\u set\u encrypt\u key: GENERATE[aesp8-ppc.s]=asm/aesp8-ppc.pl $(PERLASM_SCHEME) 用于在crypto/build.info中生成OPENS

在OpenSSL的开源代码(版本1.1.0e)中,我看到一些函数定义是由文件夹中的perl文件生成的。 在crypto内部每个文件夹中的build.info文件中,他们编写了一些行,以从相应的.pl生成.s

例如,在
crypto/aes/build.info
中生成
aes\u p8\u set\u encrypt\u key

GENERATE[aesp8-ppc.s]=asm/aesp8-ppc.pl $(PERLASM_SCHEME)
用于在
crypto/build.info
中生成
OPENSSL\u madd300\u probe

GENERATE[ppccpuid.s]=ppccpuid.pl $(PERLASM_SCHEME)
在主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
接着是:

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中,以解决由.pl文件生成定义的函数出现的
未定义引用
错误

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

您正在Power8上使用AES的。Cryptogams是Andy Polyakov的项目,旨在为其他开发人员提供高速加密

汇编语言文件由xlat程序生成。对于Power8齿轮,该文件位于
perlasm
目录中。它由
crypto/aes/asm
目录中的使用

下面是你如何翻译它的。我在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位。第二,它选择小端点或大端点。一定要弄对味道

根据Andy at的说法,big-endian PowerPC应该使用
linux64
,而不是
linux64be
。然而,Little endian需要
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
...
您对以下四个函数感兴趣:
aes\u p8\u set\u encrypt\u key
aes\u p8\u set\u decrypt\u key
aes\u p8\u encrypt
aes\u p8\u decrypt
。您将使用找到的签名为程序创建头文件

我将帮助您解决第一个问题:
aes\u p8\u set\u encrypt\u 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\u密钥
AES\u p8\u设置\u解密\u密钥
AES\u p8\u加密
AES\u p8\u解密

最终,您将得到一个标题,如OpenSSL wiki中或上所示。和是为ARMv4编写的,但Power8也是如此


安迪为他的作品颁发双重许可证。一个许可证是OpenSSL许可证,因为Andy为OpenSSL工作。第二个许可证是BSD风格的许可证,没有OpenSSL的产权负担

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

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

第二个地方是GitHub和。我帮助维护Crypto++并且POWER8加密书是我的知识库。POWER8手册在第7章中包括PowerPC的加密游戏SHA


POWER8加密书是由Bill Schmidt和我编写的,因为在POWER8上使用AES和SHA时,我们找不到文档。比尔·施密特(Bill Schmidt)为IBM工作,甚至他也无法获得这些文档。我们所能找到的只是一位IBM工程师的一篇博文,内容严重缺失。

@jww:xlat文件是什么?(有点澄清):我不需要开源代码中的所有文件。我只需要加密文件夹中的算法。根据客户的要求,我将向makefile添加所需的.c文件。因此,我需要知道是否有任何方法可以使perl文件中的函数定义对编译器可见。很抱歉,花了这么长时间才返回到此。除非您使用Microsoft Assembler(适用于Windows),否则不需要xlat文件。Xlat将Linux/UNIX/GNU汇编语言格式转换为Microsoft汇编语言格式。基本上,操作数是反向的。“mov-src,dest”(UNIX)变为“mov-dest,src”(MSFT)。感谢您花时间回答这个问题。但不幸的是,我不再在这方面工作了。但这给了我们一个很好的启示。
$ 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);