diff options
author | Shigeki Ohtsu <ohtsu@ohtsu.org> | 2018-03-29 16:39:12 +0900 |
---|---|---|
committer | Shigeki Ohtsu <ohtsu@ohtsu.org> | 2018-04-10 06:45:42 +0900 |
commit | 66cb29e64621fdd1aa5e377a395ff107d21a613b (patch) | |
tree | f05243a51577e04b6f1c4a2f8a6b7b2f05786079 /deps/openssl/openssl/crypto/ppccap.c | |
parent | 38c97f5dc7ff3fbf83982d0268fc9e93cfc00c7d (diff) | |
download | android-node-v8-66cb29e64621fdd1aa5e377a395ff107d21a613b.tar.gz android-node-v8-66cb29e64621fdd1aa5e377a395ff107d21a613b.tar.bz2 android-node-v8-66cb29e64621fdd1aa5e377a395ff107d21a613b.zip |
deps: upgrade openssl sources to 1.1.0h
This updates all sources in deps/openssl/openssl with openssl-1.1.0h.
Fixes: https://github.com/nodejs/node/issues/4270
PR-URL: https://github.com/nodejs/node/pull/19794
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Diffstat (limited to 'deps/openssl/openssl/crypto/ppccap.c')
-rw-r--r-- | deps/openssl/openssl/crypto/ppccap.c | 202 |
1 files changed, 181 insertions, 21 deletions
diff --git a/deps/openssl/openssl/crypto/ppccap.c b/deps/openssl/openssl/crypto/ppccap.c index 60566b1a5f..3baf9f7b76 100644 --- a/deps/openssl/openssl/crypto/ppccap.c +++ b/deps/openssl/openssl/crypto/ppccap.c @@ -1,3 +1,12 @@ +/* + * 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 <stdio.h> #include <stdlib.h> #include <string.h> @@ -7,6 +16,12 @@ #if defined(__linux) || defined(_AIX) # include <sys/utsname.h> #endif +#if defined(_AIX53) /* defined even on post-5.3 */ +# include <sys/systemcfg.h> +# if !defined(__power_set) +# define __power_set(a) (_system_configuration.implementation & (a)) +# endif +#endif #if defined(__APPLE__) && defined(__MACH__) # include <sys/types.h> # include <sys/sysctl.h> @@ -77,16 +92,88 @@ void sha512_block_data_order(void *ctx, const void *inp, size_t 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 + static sigjmp_buf ill_jmp; static void ill_handler(int sig) { siglongjmp(ill_jmp, sig); } +void OPENSSL_fpu_probe(void); void OPENSSL_ppc64_probe(void); void OPENSSL_altivec_probe(void); void OPENSSL_crypto207_probe(void); +void OPENSSL_madd300_probe(void); + +/* + * Use a weak reference to getauxval() so we can use it if it is available + * but don't break the build if it is not. Note that this is *link-time* + * feature detection, not *run-time*. In other words if we link with + * symbol present, it's expected to be present even at run-time. + */ +#if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) +extern unsigned long getauxval(unsigned long type) __attribute__ ((weak)); +#else +static unsigned long (*getauxval) (unsigned long) = NULL; +#endif +/* I wish <sys/auxv.h> was universally available */ +#define HWCAP 16 /* AT_HWCAP */ +#define HWCAP_PPC64 (1U << 30) +#define HWCAP_ALTIVEC (1U << 28) +#define HWCAP_FPU (1U << 27) +#define HWCAP_POWER6_EXT (1U << 9) +#define HWCAP_VSX (1U << 7) + +#define HWCAP2 26 /* AT_HWCAP2 */ +#define HWCAP_VEC_CRYPTO (1U << 25) +#define HWCAP_ARCH_3_00 (1U << 23) + +# if defined(__GNUC__) && __GNUC__>=2 +__attribute__ ((constructor)) +# endif void OPENSSL_cpuid_setup(void) { char *e; @@ -98,16 +185,6 @@ void OPENSSL_cpuid_setup(void) return; trigger = 1; - sigfillset(&all_masked); - sigdelset(&all_masked, SIGILL); - sigdelset(&all_masked, SIGTRAP); -#ifdef SIGEMT - sigdelset(&all_masked, SIGEMT); -#endif - sigdelset(&all_masked, SIGFPE); - sigdelset(&all_masked, SIGBUS); - sigdelset(&all_masked, SIGSEGV); - if ((e = getenv("OPENSSL_ppccap"))) { OPENSSL_ppccap_P = strtoul(e, NULL, 0); return; @@ -116,6 +193,8 @@ void OPENSSL_cpuid_setup(void) OPENSSL_ppccap_P = 0; #if defined(_AIX) + OPENSSL_ppccap_P |= PPC_FPU; + if (sizeof(size_t) == 4) { struct utsname uts; # if defined(_SC_AIX_KERNEL_BITMODE) @@ -125,9 +204,39 @@ void OPENSSL_cpuid_setup(void) if (uname(&uts) != 0 || atoi(uts.version) < 6) return; } + +# if defined(__power_set) + /* + * Value used in __power_set is a single-bit 1<<n one denoting + * specific processor class. Incidentally 0xffffffff<<n can be + * used to denote specific processor and its successors. + */ + if (sizeof(size_t) == 4) { + /* In 32-bit case PPC_FPU64 is always fastest [if option] */ + if (__power_set(0xffffffffU<<13)) /* POWER5 and later */ + OPENSSL_ppccap_P |= PPC_FPU64; + } else { + /* In 64-bit case PPC_FPU64 is fastest only on POWER6 */ + if (__power_set(0x1U<<14)) /* POWER6 */ + OPENSSL_ppccap_P |= PPC_FPU64; + } + + if (__power_set(0xffffffffU<<14)) /* POWER6 and later */ + OPENSSL_ppccap_P |= PPC_ALTIVEC; + + if (__power_set(0xffffffffU<<16)) /* POWER8 and later */ + OPENSSL_ppccap_P |= PPC_CRYPTO207; + + if (__power_set(0xffffffffU<<17)) /* POWER9 and later */ + OPENSSL_ppccap_P |= PPC_MADD300; + + return; +# endif #endif #if defined(__APPLE__) && defined(__MACH__) + OPENSSL_ppccap_P |= PPC_FPU; + { int val; size_t len = sizeof(val); @@ -147,6 +256,47 @@ void OPENSSL_cpuid_setup(void) } #endif + if (getauxval != NULL) { + unsigned long hwcap = getauxval(HWCAP); + + if (hwcap & HWCAP_FPU) { + OPENSSL_ppccap_P |= PPC_FPU; + + if (sizeof(size_t) == 4) { + /* In 32-bit case PPC_FPU64 is always fastest [if option] */ + if (hwcap & HWCAP_PPC64) + OPENSSL_ppccap_P |= PPC_FPU64; + } else { + /* In 64-bit case PPC_FPU64 is fastest only on POWER6 */ + if (hwcap & HWCAP_POWER6_EXT) + OPENSSL_ppccap_P |= PPC_FPU64; + } + } + + if (hwcap & HWCAP_ALTIVEC) { + OPENSSL_ppccap_P |= PPC_ALTIVEC; + + if ((hwcap & HWCAP_VSX) && (getauxval(HWCAP2) & HWCAP_VEC_CRYPTO)) + OPENSSL_ppccap_P |= PPC_CRYPTO207; + } + + if (hwcap & HWCAP_ARCH_3_00) { + OPENSSL_ppccap_P |= PPC_MADD300; + } + + return; + } + + sigfillset(&all_masked); + sigdelset(&all_masked, SIGILL); + sigdelset(&all_masked, SIGTRAP); +#ifdef SIGEMT + sigdelset(&all_masked, SIGEMT); +#endif + sigdelset(&all_masked, SIGFPE); + sigdelset(&all_masked, SIGBUS); + sigdelset(&all_masked, SIGSEGV); + memset(&ill_act, 0, sizeof(ill_act)); ill_act.sa_handler = ill_handler; ill_act.sa_mask = all_masked; @@ -154,19 +304,24 @@ void OPENSSL_cpuid_setup(void) sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset); sigaction(SIGILL, &ill_act, &ill_oact); - if (sizeof(size_t) == 4) { + if (sigsetjmp(ill_jmp,1) == 0) { + OPENSSL_fpu_probe(); + OPENSSL_ppccap_P |= PPC_FPU; + + if (sizeof(size_t) == 4) { #ifdef __linux - struct utsname uts; - if (uname(&uts) == 0 && strcmp(uts.machine, "ppc64") == 0) + struct utsname uts; + if (uname(&uts) == 0 && strcmp(uts.machine, "ppc64") == 0) #endif - if (sigsetjmp(ill_jmp, 1) == 0) { - OPENSSL_ppc64_probe(); - OPENSSL_ppccap_P |= PPC_FPU64; - } - } else { - /* - * Wanted code detecting POWER6 CPU and setting PPC_FPU64 - */ + if (sigsetjmp(ill_jmp, 1) == 0) { + OPENSSL_ppc64_probe(); + OPENSSL_ppccap_P |= PPC_FPU64; + } + } else { + /* + * Wanted code detecting POWER6 CPU and setting PPC_FPU64 + */ + } } if (sigsetjmp(ill_jmp, 1) == 0) { @@ -178,6 +333,11 @@ void OPENSSL_cpuid_setup(void) } } + if (sigsetjmp(ill_jmp, 1) == 0) { + OPENSSL_madd300_probe(); + OPENSSL_ppccap_P |= PPC_MADD300; + } + sigaction(SIGILL, &ill_oact, NULL); sigprocmask(SIG_SETMASK, &oset, NULL); } |