diff options
author | Robert Relyea <rrelyea@redhat.com> | 2016-03-14 19:35:35 +0100 |
---|---|---|
committer | Robert Relyea <rrelyea@redhat.com> | 2016-03-14 19:35:35 +0100 |
commit | 9ee2593072fddf6dcf5b282ca11459d69178263f (patch) | |
tree | cbbad6badf9069b745c713ed7c175218165c7729 /lib/freebl/blname.c | |
parent | f92092976980b5b0194978b657f26ca5526ef71b (diff) | |
download | nss-hg-9ee2593072fddf6dcf5b282ca11459d69178263f.tar.gz |
Bug 1181814 - Pick up FIPS-140 certification work done by Red Hat, r=kaie, emaldona
Includes modifications submitted by kaie and emaldona, r=rrelyea
Diffstat (limited to 'lib/freebl/blname.c')
-rw-r--r-- | lib/freebl/blname.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/freebl/blname.c b/lib/freebl/blname.c new file mode 100644 index 000000000..db5fff58b --- /dev/null +++ b/lib/freebl/blname.c @@ -0,0 +1,98 @@ +/* + * * blname.c - determine the freebl library name. + * * + * * This Source Code Form is subject to the terms of the Mozilla Public + * * License, v. 2.0. If a copy of the MPL was not distributed with this + * * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#if defined(FREEBL_LOWHASH) +static const char* default_name = + SHLIB_PREFIX"freeblpriv"SHLIB_VERSION"."SHLIB_SUFFIX; +#else +static const char* default_name = + SHLIB_PREFIX"freebl"SHLIB_VERSION"."SHLIB_SUFFIX; +#endif + +/* getLibName() returns the name of the library to load. */ + +#if defined(SOLARIS) && defined(__sparc) +#include <stddef.h> +#include <strings.h> +#include <sys/systeminfo.h> + + +#if defined(NSS_USE_64) + +const static char fpu_hybrid_shared_lib[] = "libfreebl_64fpu_3.so"; +const static char int_hybrid_shared_lib[] = "libfreebl_64int_3.so"; +const static char non_hybrid_shared_lib[] = "libfreebl_64fpu_3.so"; + +const static char int_hybrid_isa[] = "sparcv9"; +const static char fpu_hybrid_isa[] = "sparcv9+vis"; + +#else + +const static char fpu_hybrid_shared_lib[] = "libfreebl_32fpu_3.so"; +const static char int_hybrid_shared_lib[] = "libfreebl_32int64_3.so"; +/* This was for SPARC V8, now obsolete. */ +const static char *const non_hybrid_shared_lib = NULL; + +const static char int_hybrid_isa[] = "sparcv8plus"; +const static char fpu_hybrid_isa[] = "sparcv8plus+vis"; + +#endif + +static const char * +getLibName(void) +{ + char * found_int_hybrid; + char * found_fpu_hybrid; + long buflen; + char buf[256]; + + buflen = sysinfo(SI_ISALIST, buf, sizeof buf); + if (buflen <= 0) + return NULL; + /* sysinfo output is always supposed to be NUL terminated, but ... */ + if (buflen < sizeof buf) + buf[buflen] = '\0'; + else + buf[(sizeof buf) - 1] = '\0'; + /* The ISA list is a space separated string of names of ISAs and + * ISA extensions, in order of decreasing performance. + * There are two different ISAs with which NSS's crypto code can be + * accelerated. If both are in the list, we take the first one. + * If one is in the list, we use it, and if neither then we use + * the base unaccelerated code. + */ + found_int_hybrid = strstr(buf, int_hybrid_isa); + found_fpu_hybrid = strstr(buf, fpu_hybrid_isa); + if (found_fpu_hybrid && + (!found_int_hybrid || + (found_int_hybrid - found_fpu_hybrid) >= 0)) { + return fpu_hybrid_shared_lib; + } + if (found_int_hybrid) { + return int_hybrid_shared_lib; + } + return non_hybrid_shared_lib; +} + +#elif defined(HPUX) && !defined(NSS_USE_64) && !defined(__ia64) +#include <unistd.h> + +/* This code tests to see if we're running on a PA2.x CPU. +** It returns true (1) if so, and false (0) otherwise. +*/ +static const char * +getLibName(void) +{ + long cpu = sysconf(_SC_CPU_VERSION); + return (cpu == CPU_PA_RISC2_0) + ? "libfreebl_32fpu_3.sl" + : "libfreebl_32int_3.sl" ; +} +#else +/* default case, for platforms/ABIs that have only one freebl shared lib. */ +static const char * getLibName(void) { return default_name; } +#endif |