From e3fb4d3d52e188b83ccb8506aa2f16cb686f4d6c Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 8 Nov 2016 23:55:51 +0100 Subject: [PATCH] Move algorithm specific ppccap code from crypto/ppccap.c Having that code in one central object file turned out to cause trouble when building test/modes_internal_test. Reviewed-by: Rich Salz (Merged from https://github.com/openssl/openssl/pull/1883) --- Configurations/00-base-templates.conf | 10 +-- crypto/bn/bn_ppccap.c | 42 ++++++++++ crypto/chacha/chacha_ppccap.c | 31 +++++++ crypto/ec/ec_ppccap.c | 38 +++++++++ crypto/poly1305/poly1305_ppccap.c | 41 ++++++++++ crypto/ppccap.c | 111 -------------------------- crypto/sha/sha_ppccap.c | 29 +++++++ 7 files changed, 186 insertions(+), 116 deletions(-) create mode 100644 crypto/bn/bn_ppccap.c create mode 100644 crypto/chacha/chacha_ppccap.c create mode 100644 crypto/ec/ec_ppccap.c create mode 100644 crypto/poly1305/poly1305_ppccap.c create mode 100644 crypto/sha/sha_ppccap.c diff --git a/Configurations/00-base-templates.conf b/Configurations/00-base-templates.conf index 8c47e9e596..325d7bfbda 100644 --- a/Configurations/00-base-templates.conf +++ b/Configurations/00-base-templates.conf @@ -279,17 +279,17 @@ ppc32_asm => { template => 1, cpuid_asm_src => "ppccpuid.s ppccap.c", - bn_asm_src => "bn-ppc.s ppc-mont.s", + bn_asm_src => "bn-ppc.s ppc-mont.s bn_ppccap.c", aes_asm_src => "aes_core.c aes_cbc.c aes-ppc.s vpaes-ppc.s aesp8-ppc.s", - sha1_asm_src => "sha1-ppc.s sha256-ppc.s sha512-ppc.s sha256p8-ppc.s sha512p8-ppc.s", + sha1_asm_src => "sha1-ppc.s sha256-ppc.s sha512-ppc.s sha256p8-ppc.s sha512p8-ppc.s sha_ppccap.c", modes_asm_src => "ghashp8-ppc.s", - chacha_asm_src => "chacha-ppc.s", - poly1305_asm_src=> "poly1305-ppc.s poly1305-ppcfp.s", + chacha_asm_src => "chacha-ppc.s chacha_ppccap.c", + poly1305_asm_src=> "poly1305-ppc.s poly1305-ppcfp.s poly1305_ppccap.c", }, ppc64_asm => { inherit_from => [ "ppc32_asm" ], template => 1, - ec_asm_src => "ecp_nistz256.c ecp_nistz256-ppc64.s", + ec_asm_src => "ecp_nistz256.c ecp_nistz256-ppc64.s ec_ppccap.c", }, ); diff --git a/crypto/bn/bn_ppccap.c b/crypto/bn/bn_ppccap.c new file mode 100644 index 0000000000..ad8041a8e6 --- /dev/null +++ b/crypto/bn/bn_ppccap.c @@ -0,0 +1,42 @@ +/* + * Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "../ppc_arch.h" + +#ifndef OPENSSL_BN_ASM_MONT +NON_EMPTY_TRANSLATION_UNIT +#else +int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num) +{ + int bn_mul_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num); + int bn_mul4x_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, + const BN_ULONG *np, const BN_ULONG *n0, int num); + + if (num < 4) + return 0; + + if ((num & 3) == 0) + return bn_mul4x_mont_int(rp, ap, bp, np, n0, num); + + /* + * There used to be [optional] call to bn_mul_mont_fpu64 here, + * but above subroutine is faster on contemporary processors. + * Formulation means that there might be old processors where + * FPU code path would be faster, POWER6 perhaps, but there was + * no opportunity to figure it out... + */ + + return bn_mul_mont_int(rp, ap, bp, np, n0, num); +} +#endif + diff --git a/crypto/chacha/chacha_ppccap.c b/crypto/chacha/chacha_ppccap.c new file mode 100644 index 0000000000..10dd06ec57 --- /dev/null +++ b/crypto/chacha/chacha_ppccap.c @@ -0,0 +1,31 @@ +/* + * Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "../ppc_arch.h" + +#ifdef OPENSSL_NO_CHACHA +NON_EMPTY_TRANSLATION_UNIT +#else +void ChaCha20_ctr32_int(unsigned char *out, const unsigned char *inp, + size_t len, const unsigned int key[8], + const unsigned int counter[4]); +void ChaCha20_ctr32_vmx(unsigned char *out, const unsigned char *inp, + size_t len, const unsigned int key[8], + const unsigned int counter[4]); +void ChaCha20_ctr32(unsigned char *out, const unsigned char *inp, + size_t len, const unsigned int key[8], + const unsigned int counter[4]) +{ + OPENSSL_ppccap_P & PPC_ALTIVEC + ? ChaCha20_ctr32_vmx(out, inp, len, key, counter) + : ChaCha20_ctr32_int(out, inp, len, key, counter); +} +#endif diff --git a/crypto/ec/ec_ppccap.c b/crypto/ec/ec_ppccap.c new file mode 100644 index 0000000000..1ad8b9fc1b --- /dev/null +++ b/crypto/ec/ec_ppccap.c @@ -0,0 +1,38 @@ +/* + * Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include "../ppc_arch.h" + +#ifndef ECP_NISTZ256_ASM +NON_EMPTY_TRANSLATION_UNIT +#else +void ecp_nistz256_mul_mont(unsigned long res[4], const unsigned long a[4], + const unsigned long b[4]); + +void ecp_nistz256_to_mont(unsigned long res[4], const unsigned long in[4]); +void ecp_nistz256_to_mont(unsigned long res[4], const unsigned long in[4]) +{ + static const unsigned long RR[] = { 0x0000000000000003U, + 0xfffffffbffffffffU, + 0xfffffffffffffffeU, + 0x00000004fffffffdU }; + + ecp_nistz256_mul_mont(res, in, RR); +} + +void ecp_nistz256_from_mont(unsigned long res[4], const unsigned long in[4]); +void ecp_nistz256_from_mont(unsigned long res[4], const unsigned long in[4]) +{ + static const unsigned long one[] = { 1, 0, 0, 0 }; + + ecp_nistz256_mul_mont(res, in, one); +} +#endif + diff --git a/crypto/poly1305/poly1305_ppccap.c b/crypto/poly1305/poly1305_ppccap.c new file mode 100644 index 0000000000..21b0e98a26 --- /dev/null +++ b/crypto/poly1305/poly1305_ppccap.c @@ -0,0 +1,41 @@ +/* + * Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "../ppc_arch.h" + +#ifdef OPENSSL_NO_POLY1305 +NON_EMPTY_TRANSLATION_UNIT +#else +void poly1305_init_int(void *ctx, const unsigned char key[16]); +void poly1305_blocks(void *ctx, const unsigned char *inp, size_t len, + unsigned int padbit); +void poly1305_emit(void *ctx, unsigned char mac[16], + const unsigned int nonce[4]); +void poly1305_init_fpu(void *ctx, const unsigned char key[16]); +void poly1305_blocks_fpu(void *ctx, const unsigned char *inp, size_t len, + unsigned int padbit); +void poly1305_emit_fpu(void *ctx, unsigned char mac[16], + const unsigned int nonce[4]); +int poly1305_init(void *ctx, const unsigned char key[16], void *func[2]) +{ + if (sizeof(size_t) == 4 && (OPENSSL_ppccap_P & PPC_FPU)) { + poly1305_init_fpu(ctx, key); + func[0] = poly1305_blocks_fpu; + func[1] = poly1305_emit_fpu; + } else { + poly1305_init_int(ctx, key); + func[0] = poly1305_blocks; + func[1] = poly1305_emit; + } + return 1; +} +#endif + diff --git a/crypto/ppccap.c b/crypto/ppccap.c index b2b898e797..27e92bba6e 100644 --- a/crypto/ppccap.c +++ b/crypto/ppccap.c @@ -23,7 +23,6 @@ # endif #endif #include -#include #include "ppc_arch.h" @@ -31,116 +30,6 @@ unsigned int OPENSSL_ppccap_P = 0; static sigset_t all_masked; -#ifdef OPENSSL_BN_ASM_MONT -int bn_mul_mont(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - const BN_ULONG *np, const BN_ULONG *n0, int num) -{ - int bn_mul_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - const BN_ULONG *np, const BN_ULONG *n0, int num); - int bn_mul4x_mont_int(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp, - const BN_ULONG *np, const BN_ULONG *n0, int num); - - if (num < 4) - return 0; - - if ((num & 3) == 0) - return bn_mul4x_mont_int(rp, ap, bp, np, n0, num); - - /* - * There used to be [optional] call to bn_mul_mont_fpu64 here, - * but above subroutine is faster on contemporary processors. - * Formulation means that there might be old processors where - * FPU code path would be faster, POWER6 perhaps, but there was - * no opportunity to figure it out... - */ - - return bn_mul_mont_int(rp, ap, bp, np, n0, num); -} -#endif - -void sha256_block_p8(void *ctx, const void *inp, size_t len); -void sha256_block_ppc(void *ctx, const void *inp, size_t len); -void sha256_block_data_order(void *ctx, const void *inp, size_t len) -{ - OPENSSL_ppccap_P & PPC_CRYPTO207 ? sha256_block_p8(ctx, inp, len) : - sha256_block_ppc(ctx, inp, len); -} - -void sha512_block_p8(void *ctx, const void *inp, size_t len); -void sha512_block_ppc(void *ctx, const void *inp, size_t len); -void sha512_block_data_order(void *ctx, const void *inp, size_t len) -{ - OPENSSL_ppccap_P & PPC_CRYPTO207 ? sha512_block_p8(ctx, inp, len) : - sha512_block_ppc(ctx, inp, len); -} - -#ifndef OPENSSL_NO_CHACHA -void ChaCha20_ctr32_int(unsigned char *out, const unsigned char *inp, - size_t len, const unsigned int key[8], - const unsigned int counter[4]); -void ChaCha20_ctr32_vmx(unsigned char *out, const unsigned char *inp, - size_t len, const unsigned int key[8], - const unsigned int counter[4]); -void ChaCha20_ctr32(unsigned char *out, const unsigned char *inp, - size_t len, const unsigned int key[8], - const unsigned int counter[4]) -{ - OPENSSL_ppccap_P & PPC_ALTIVEC - ? ChaCha20_ctr32_vmx(out, inp, len, key, counter) - : ChaCha20_ctr32_int(out, inp, len, key, counter); -} -#endif - -#ifndef OPENSSL_NO_POLY1305 -void poly1305_init_int(void *ctx, const unsigned char key[16]); -void poly1305_blocks(void *ctx, const unsigned char *inp, size_t len, - unsigned int padbit); -void poly1305_emit(void *ctx, unsigned char mac[16], - const unsigned int nonce[4]); -void poly1305_init_fpu(void *ctx, const unsigned char key[16]); -void poly1305_blocks_fpu(void *ctx, const unsigned char *inp, size_t len, - unsigned int padbit); -void poly1305_emit_fpu(void *ctx, unsigned char mac[16], - const unsigned int nonce[4]); -int poly1305_init(void *ctx, const unsigned char key[16], void *func[2]) -{ - if (sizeof(size_t) == 4 && (OPENSSL_ppccap_P & PPC_FPU)) { - poly1305_init_fpu(ctx, key); - func[0] = poly1305_blocks_fpu; - func[1] = poly1305_emit_fpu; - } else { - poly1305_init_int(ctx, key); - func[0] = poly1305_blocks; - func[1] = poly1305_emit; - } - return 1; -} -#endif - -#ifdef ECP_NISTZ256_ASM -void ecp_nistz256_mul_mont(unsigned long res[4], const unsigned long a[4], - const unsigned long b[4]); - -void ecp_nistz256_to_mont(unsigned long res[4], const unsigned long in[4]); -void ecp_nistz256_to_mont(unsigned long res[4], const unsigned long in[4]) -{ - static const unsigned long RR[] = { 0x0000000000000003U, - 0xfffffffbffffffffU, - 0xfffffffffffffffeU, - 0x00000004fffffffdU }; - - ecp_nistz256_mul_mont(res, in, RR); -} - -void ecp_nistz256_from_mont(unsigned long res[4], const unsigned long in[4]); -void ecp_nistz256_from_mont(unsigned long res[4], const unsigned long in[4]) -{ - static const unsigned long one[] = { 1, 0, 0, 0 }; - - ecp_nistz256_mul_mont(res, in, one); -} -#endif - static sigjmp_buf ill_jmp; static void ill_handler(int sig) { diff --git a/crypto/sha/sha_ppccap.c b/crypto/sha/sha_ppccap.c new file mode 100644 index 0000000000..6e77369e3e --- /dev/null +++ b/crypto/sha/sha_ppccap.c @@ -0,0 +1,29 @@ +/* + * Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the OpenSSL license (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include +#include +#include "../ppc_arch.h" + +void sha256_block_p8(void *ctx, const void *inp, size_t len); +void sha256_block_ppc(void *ctx, const void *inp, size_t len); +void sha256_block_data_order(void *ctx, const void *inp, size_t len) +{ + OPENSSL_ppccap_P & PPC_CRYPTO207 ? sha256_block_p8(ctx, inp, len) : + sha256_block_ppc(ctx, inp, len); +} + +void sha512_block_p8(void *ctx, const void *inp, size_t len); +void sha512_block_ppc(void *ctx, const void *inp, size_t len); +void sha512_block_data_order(void *ctx, const void *inp, size_t len) +{ + OPENSSL_ppccap_P & PPC_CRYPTO207 ? sha512_block_p8(ctx, inp, len) : + sha512_block_ppc(ctx, inp, len); +} + -- 2.25.1