Engage POWER8 AES support.
authorAndy Polyakov <appro@openssl.org>
Sun, 1 Jun 2014 21:38:11 +0000 (23:38 +0200)
committerAndy Polyakov <appro@openssl.org>
Sun, 1 Jun 2014 21:38:11 +0000 (23:38 +0200)
Configure
TABLE
crypto/aes/Makefile
crypto/aes/asm/aesp8-ppc.pl
crypto/evp/e_aes.c
crypto/ppccap.c
crypto/ppccpuid.pl

index b997052377432e6664b5f0fb320b455f6aa4c9aa..5d2bb63ef169cace2c95ba9f16297d834010f221 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -140,7 +140,7 @@ my $armv4_asm="armcap.o armv4cpuid.o:bn_asm.o armv4-mont.o armv4-gf2m.o::aes_cbc
 my $aarch64_asm="armcap.o arm64cpuid.o mem_clr.o:::aes_core.o aes_cbc.o aesv8-armx.o:::sha1-armv8.o sha256-armv8.o sha512-armv8.o::::::::";
 my $parisc11_asm="pariscid.o:bn_asm.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::32";
 my $parisc20_asm="pariscid.o:pa-risc2W.o parisc-mont.o::aes_core.o aes_cbc.o aes-parisc.o:::sha1-parisc.o sha256-parisc.o sha512-parisc.o::rc4-parisc.o:::::ghash-parisc.o::64";
-my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::::";
+my $ppc64_asm="ppccpuid.o ppccap.o:bn-ppc.o ppc-mont.o ppc64-mont.o::aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::::";
 my $ppc32_asm=$ppc64_asm;
 my $no_asm=":::::::::::::::void";
 
diff --git a/TABLE b/TABLE
index 9a8df35deae3a0fc26fd70249defb1835654d7f5..519342a6d6dae93b501c6629e45189b1f60cd010 100644 (file)
--- a/TABLE
+++ b/TABLE
@@ -902,7 +902,7 @@ $bn_ops       = BN_LLONG RC4_CHAR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -935,7 +935,7 @@ $bn_ops       = BN_LLONG RC4_CHAR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -1001,7 +1001,7 @@ $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -1034,7 +1034,7 @@ $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -1463,7 +1463,7 @@ $bn_ops       = BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -1496,7 +1496,7 @@ $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -2189,7 +2189,7 @@ $bn_ops       = BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -4532,7 +4532,7 @@ $bn_ops       = BN_LLONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -4565,7 +4565,7 @@ $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
@@ -4598,7 +4598,7 @@ $bn_ops       = SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL
 $cpuid_obj    = ppccpuid.o ppccap.o
 $bn_obj       = bn-ppc.o ppc-mont.o ppc64-mont.o
 $des_obj      = 
-$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o
+$aes_obj      = aes_core.o aes_cbc.o aes-ppc.o vpaes-ppc.o aesp8-ppc.o
 $bf_obj       = 
 $md5_obj      = 
 $sha1_obj     = sha1-ppc.o sha256-ppc.o sha512-ppc.o
index 192464c9db1c92638fceb3a0e9890ded358f58bb..cd218c9d980b399da94b7446cc184c40990f84fb 100644 (file)
@@ -79,6 +79,8 @@ aes-ppc.s:    asm/aes-ppc.pl
        $(PERL) asm/aes-ppc.pl $(PERLASM_SCHEME) $@
 vpaes-ppc.s:   asm/vpaes-ppc.pl
        $(PERL) asm/vpaes-ppc.pl $(PERLASM_SCHEME) $@
+aesp8-ppc.s:   asm/aesp8-ppc.pl
+       $(PERL) asm/aesp8-ppc.pl $(PERLASM_SCHEME) $@
 
 aes-parisc.s:  asm/aes-parisc.pl
        $(PERL) asm/aes-parisc.pl $(PERLASM_SCHEME) $@
index b1da5965fb35187bbf08fdd90153f512f29e6316..31a260fc3ccb62ce0a6b34227962fe09f62058a9 100755 (executable)
@@ -49,7 +49,7 @@ die "can't locate ppc-xlate.pl";
 open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
 
 $FRAME=8*$SIZE_T;
-$prefix="AES";
+$prefix="aes_p8";
 
 $sp="r1";
 $vrsave="r12";
index 6ba452593b3179f8babf2ec3194c9272519e80fb..51714a4a4f0f2aad3d943ff393e8bf2536313e00 100644 (file)
@@ -154,9 +154,17 @@ void AES_xts_decrypt(const char *inp,char *out,size_t len,
                        const unsigned char iv[16]);
 #endif
 
-#if    defined(VPAES_ASM) && (defined(__powerpc__) || defined(__ppc__) || defined(_ARCH_PPC))
+#if    defined(OPENSSL_CPUID_OBJ) && (defined(__powerpc__) || defined(__ppc__) || defined(_ARCH_PPC))
 extern unsigned int OPENSSL_ppccap_P;
-#define        VPAES_CAPABLE   (OPENSSL_ppccap_P&(1<<1))
+# ifdef VPAES_ASM
+#  define VPAES_CAPABLE        (OPENSSL_ppccap_P&(1<<1))
+# endif
+# define HWAES_CAPABLE (OPENSSL_ppccap_P&(1<<2))
+# define HWAES_set_encrypt_key aes_p8_set_encrypt_key
+# define HWAES_set_decrypt_key aes_p8_set_decrypt_key
+# define HWAES_encrypt aes_p8_encrypt
+# define HWAES_decrypt aes_p8_decrypt
+# define HWAES_cbc_encrypt aes_p8_cbc_encrypt
 #endif
 
 #if    defined(AES_ASM) && !defined(I386_ONLY) &&      (  \
index d78bfbcdbb88265e1906ba03fa1b92280dcc9f34..4c5e88d3a0c830b2da1bc9ffb616e4c16e223f8e 100644 (file)
@@ -12,6 +12,7 @@
 
 #define PPC_FPU64      (1<<0)
 #define PPC_ALTIVEC    (1<<1)
+#define PPC_CRYPTO207  (1<<2)
 
 unsigned int OPENSSL_ppccap_P = 0;
 
@@ -58,6 +59,7 @@ static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); }
 
 void OPENSSL_ppc64_probe(void);
 void OPENSSL_altivec_probe(void);
+void OPENSSL_crypto207_probe(void);
 
 void OPENSSL_cpuid_setup(void)
        {
@@ -128,6 +130,11 @@ void OPENSSL_cpuid_setup(void)
                {
                OPENSSL_altivec_probe();
                OPENSSL_ppccap_P |= PPC_ALTIVEC;
+               if (sigsetjmp(ill_jmp,1) == 0)
+                       {
+                       OPENSSL_crypto207_probe();
+                       OPENSSL_ppccap_P |= PPC_CRYPTO207;
+                       }
                }
 
        sigaction (SIGILL,&ill_oact,NULL);
index b4990ded85de9b44e69a94989a3a6661b228f84c..aeafb6c7b537540f60d1a623cbebf8e402cbc437 100755 (executable)
@@ -42,6 +42,16 @@ $code=<<___;
        .byte   0,12,0x14,0,0,0,0,0
 .size  .OPENSSL_altivec_probe,.-..OPENSSL_altivec_probe
 
+.globl .OPENSSL_crypto207_probe
+.align 4
+.OPENSSL_crypto207_probe
+       lvx_u   v0,0,r1
+       vcipher v0,v0,v0
+       blr
+       .long   0
+       .byte   0,12,0x14,0,0,0,0,0
+.size  .OPENSSL_crypto207_probe,.-.OPENSSL_crypto207_probe
+
 .globl .OPENSSL_wipe_cpu
 .align 4
 .OPENSSL_wipe_cpu: