diff --git a/src/post_modules/Nettle/configure.in b/src/post_modules/Nettle/configure.in index 3e1097e44b18d1d1a4fc6b817df3267fd89dd7a3..401bc735523a035766297fba066e911fe201eb8a 100644 --- a/src/post_modules/Nettle/configure.in +++ b/src/post_modules/Nettle/configure.in @@ -57,29 +57,37 @@ else # NB: Some versions of RedHat have censored the weaker curves # (secp_192r1 and secp_224r1 (cf [LysLysKOM 21863021])), and # there are no identifying macros, so we need to probe for them. - define(PIKE_CHECK_ECC_CURVE, [ - AC_MSG_CHECKING(if curve $1 is available) - AC_CACHE_VAL(pike_cv_have_curve_$1, [ - AC_TRY_LINK([#include <nettle/ecc-curve.h>], - [ struct ecc_curve *c = &$1; ], - [ pike_cv_have_curve_$1=yes ], - [ pike_cv_have_curve_$1=no ]) + define(PIKE_CHECK_NETTLE_ECC_CURVE, [ + AC_CHECK_FUNC(nettle_get_$1, [ + AC_DEFINE(translit(HAVE_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle has the nettle curve $1.]) + ], [ + AC_MSG_CHECKING(if legacy declaration of nettle curve $1 is available) + + AC_CACHE_VAL(pike_cv_have_curve_nettle_$1, [ + AC_TRY_LINK([#include <nettle/ecc-curve.h>], + [ struct ecc_curve *c = &nettle_$1; ], + [ pike_cv_have_curve_nettle_$1=yes ], + [ pike_cv_have_curve_nettle_$1=no ]) + ]) + AC_MSG_RESULT($pike_cv_have_curve_nettle_$1); + if test "x$pike_cv_have_curve_nettle_$1" = "xyes"; then + AC_DEFINE(translit(HAVE_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle has the nettle curve $1.]) + AC_DEFINE(translit(NEED_WRAPPER_FOR_CURVE_NETTLE_$1,[a-z],[A-Z]), 1, + [Define if your libnettle is missing the getter for the nettle curve $1.]) + fi ]) - AC_MSG_RESULT($pike_cv_have_curve_$1); - if test "x$pike_cv_have_curve_$1" = "xyes"; then - AC_DEFINE(translit(HAVE_CURVE_$1,[a-z],[A-Z]), 1, - [Define if your libnettle has the curve $1.]) - fi ]) AC_ARG_WITH(weak-curves, [ --with-weak-curves Include SECP192R1 and SECP224R1, frequently removed from Nettle binary dists ], [weak_curves=yes], []) if test "x$weak_curves" = "xyes" ; then - PIKE_CHECK_ECC_CURVE(nettle_secp_192r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_224r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_192r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_224r1) fi - PIKE_CHECK_ECC_CURVE(nettle_secp_256r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_384r1) - PIKE_CHECK_ECC_CURVE(nettle_secp_521r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_256r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_384r1) + PIKE_CHECK_NETTLE_ECC_CURVE(secp_521r1) AC_SUBST(IDEA_OBJ) diff --git a/src/post_modules/Nettle/hogweed.cmod b/src/post_modules/Nettle/hogweed.cmod index b4b7e183fba0c3a93d1d361f2f60f8a53fc2e7d5..63e374da2a884369699d9ec60a8c7435ce173d55 100644 --- a/src/post_modules/Nettle/hogweed.cmod +++ b/src/post_modules/Nettle/hogweed.cmod @@ -332,6 +332,32 @@ program_flags PROGRAM_CLEAR_STORAGE; #include <nettle/ecdsa.h> +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_192R1 +static const struct ecc_curve *nettle_get_secp_192r1(void) { + return &nettle_secp_192r1; +} +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_192R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_224R1 +static const struct ecc_curve *nettle_get_secp_224r1(void) { + return &nettle_secp_224r1; +} +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_224R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_256R1 +static const struct ecc_curve *nettle_get_secp_256r1(void) { + return &nettle_secp_256r1; +} +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_256R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_384R1 +static const struct ecc_curve *nettle_get_secp_384r1(void) { + return &nettle_secp_384r1; +} +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_384R1 */ +#ifdef NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_521R1 +static const struct ecc_curve *nettle_get_secp_521r1(void) { + return &nettle_secp_521r1; +} +#endif /* NEED_WRAPPER_FOR_CURVE_NETTLE_SECP_521R1 */ + /*! @class ECC_Curve *! *! Elliptic Curve Definition @@ -366,27 +392,27 @@ PIKECLASS ECC_Curve { case 192: #ifdef HAVE_CURVE_NETTLE_SECP_192R1 - THIS->curve = &nettle_secp_192r1; + THIS->curve = nettle_get_secp_192r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_192R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_224R1 case 224: - THIS->curve = &nettle_secp_224r1; + THIS->curve = nettle_get_secp_224r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_224R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_256R1 case 256: - THIS->curve = &nettle_secp_256r1; + THIS->curve = nettle_get_secp_256r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 case 384: - THIS->curve = &nettle_secp_384r1; + THIS->curve = nettle_get_secp_384r1; break; #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 case 521: - THIS->curve = &nettle_secp_521r1; + THIS->curve = nettle_get_secp_521r1(); break; #endif /* HAVE_CURVE_NETTLE_SECP_521R1 */ default: @@ -408,31 +434,31 @@ PIKECLASS ECC_Curve PIKEFUN string(7bit) name() { #ifdef HAVE_CURVE_NETTLE_SECP_192R1 - if (THIS->curve == &nettle_secp_192r1) { + if (THIS->curve == nettle_get_secp_192r1()) { ref_push_string(MK_STRING("SECP_192R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_192R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_224R1 - if (THIS->curve == &nettle_secp_224r1) { + if (THIS->curve == nettle_get_secp_224r1()) { ref_push_string(MK_STRING("SECP_224R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_224R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_256R1 - if (THIS->curve == &nettle_secp_256r1) { + if (THIS->curve == nettle_get_secp_256r1()) { ref_push_string(MK_STRING("SECP_256R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_256R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_384R1 - if (THIS->curve == &nettle_secp_384r1) { + if (THIS->curve == nettle_get_secp_384r1()) { ref_push_string(MK_STRING("SECP_384R1")); return; } #endif /* HAVE_CURVE_NETTLE_SECP_384R1 */ #ifdef HAVE_CURVE_NETTLE_SECP_521R1 - if (THIS->curve == &nettle_secp_521r1) { + if (THIS->curve == nettle_get_secp_521r1()) { ref_push_string(MK_STRING("SECP_521R1")); return; }